[haiku-webkit-commits] r517 - webkit/trunk/WebKit/haiku/WebPositive

  • From: webkit@xxxxxxxxxxxxxxx
  • To: haiku-webkit-commits@xxxxxxxxxxxxx
  • Date: Sat, 22 May 2010 19:04:46 +0000

Author: stippi
Date: Sat May 22 19:04:46 2010
New Revision: 517
URL: http://mmlr.dyndns.org/changeset/517

Log:
Added "View->Page source" feature. For local files, it will open the file in the
preferred app for text/x-source-code. For remote pages, it will save a temporary
file and open the editor with that.

Modified:
   webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp
   webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h

Modified: webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp     Sat May 22 
19:03:24 2010        (r516)
+++ webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp     Sat May 22 
19:04:46 2010        (r517)
@@ -100,6 +100,8 @@
        TOGGLE_AUTO_HIDE_INTERFACE_IN_FULLSCREEN        = 'tgah',
        CHECK_AUTO_HIDE_INTERFACE                                       = 
'cahi',
 
+       SHOW_PAGE_SOURCE                                                        
= 'spgs',
+
        EDIT_SHOW_FIND_GROUP                                            = 
'sfnd',
        EDIT_HIDE_FIND_GROUP                                            = 
'hfnd',
        EDIT_FIND_NEXT                                                          
= 'fndn',
@@ -315,9 +317,12 @@
        menu = new BMenu("View");
        menu->AddItem(new BMenuItem("Reload", new BMessage(RELOAD), 'R'));
        menu->AddSeparatorItem();
-       menu->AddItem(new BMenuItem("Increase size", new 
BMessage(ZOOM_FACTOR_INCREASE), '+'));
-       menu->AddItem(new BMenuItem("Decrease size", new 
BMessage(ZOOM_FACTOR_DECREASE), '-'));
-       menu->AddItem(new BMenuItem("Reset size", new 
BMessage(ZOOM_FACTOR_RESET), '0'));
+       menu->AddItem(new BMenuItem("Increase size",
+               new BMessage(ZOOM_FACTOR_INCREASE), '+'));
+       menu->AddItem(new BMenuItem("Decrease size",
+               new BMessage(ZOOM_FACTOR_DECREASE), '-'));
+       menu->AddItem(new BMenuItem("Reset size",
+               new BMessage(ZOOM_FACTOR_RESET), '0'));
        fZoomTextOnlyMenuItem = new BMenuItem("Zoom text only",
                new BMessage(ZOOM_TEXT_ONLY));
        fZoomTextOnlyMenuItem->SetMarked(fZoomTextOnly);
@@ -327,6 +332,8 @@
        fFullscreenItem = new BMenuItem("Fullscreen",
                new BMessage(TOGGLE_FULLSCREEN), B_RETURN);
        menu->AddItem(fFullscreenItem);
+       menu->AddItem(new BMenuItem("Page source",
+               new BMessage(SHOW_PAGE_SOURCE), 'U'));
        mainMenu->AddItem(menu);
 
        fHistoryMenu = new BMenu("History");
@@ -347,7 +354,7 @@
                mainMenu->AddItem(bookmarkMenu);
        }
 
-       // Back, Forward & Stop
+       // Back, Forward, Stop & Home buttons
        fBackButton = new IconButton("Back", 0, NULL, new BMessage(GO_BACK));
        fBackButton->SetIcon(201);
        fBackButton->TrimIcon();
@@ -727,6 +734,13 @@
                        _CheckAutoHideInterface();
                        break;
 
+               case SHOW_PAGE_SOURCE:
+                       CurrentWebView()->WebPage()->SendPageSource();
+                       break;
+               case B_PAGE_SOURCE_RESULT:
+                       _HandlePageSourceResult(message);
+                       break;
+
                case EDIT_FIND_NEXT:
                        CurrentWebView()->FindString(fFindTextControl->Text(), 
true,
                                fFindCaseSensitiveCheckBox->Value());
@@ -2025,3 +2039,78 @@
        }
        return url;
 }
+
+
+void
+BrowserWindow::_HandlePageSourceResult(const BMessage* message)
+{
+       // TODO: This should be done in an extra thread perhaps. Doing it in
+       // the application thread is not much better, since it actually draws
+       // the pages...
+
+       BPath pathToPageSource;
+
+       BString url;
+       status_t ret = message->FindString("url", &url);
+       if (ret == B_OK && url.FindFirst("file://") == 0) {
+               // Local file
+               url.Remove(0, strlen("file://"));
+               pathToPageSource.SetTo(url.String());
+       } else {
+               // Something else, store it.
+               // TODO: What if it isn't HTML, but for example SVG?
+               BString source;
+               ret = message->FindString("source", &source);
+       
+               if (ret == B_OK)
+                       ret = find_directory(B_COMMON_TEMP_DIRECTORY, 
&pathToPageSource);
+       
+               BString tmpFileName("PageSource_");
+               tmpFileName << system_time() << ".html";
+               if (ret == B_OK)
+                       ret = pathToPageSource.Append(tmpFileName.String());
+       
+               BFile pageSourceFile(pathToPageSource.Path(),
+                       B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY);
+               if (ret == B_OK)
+                       ret = pageSourceFile.InitCheck();
+       
+               if (ret == B_OK) {
+                       ssize_t written = pageSourceFile.Write(source.String(),
+                               source.Length());
+                       if (written != source.Length())
+                               ret = (status_t)written;
+               }
+       
+               if (ret == B_OK) {
+                       const char* type = "text/html";
+                       size_t size = strlen(type);
+                       pageSourceFile.WriteAttr("BEOS:TYPE", B_STRING_TYPE, 0, 
type, size);
+                               // If it fails we don't care.
+               }
+       }
+
+       entry_ref ref;
+       if (ret == B_OK)
+               ret = get_ref_for_path(pathToPageSource.Path(), &ref);
+
+       if (ret == B_OK) {
+               BMessage refsMessage(B_REFS_RECEIVED);
+               ret = refsMessage.AddRef("refs", &ref);
+               if (ret == B_OK) {
+                       ret = be_roster->Launch("text/x-source-code", 
&refsMessage);
+                       if (ret == B_ALREADY_RUNNING)
+                               ret = B_OK;
+               }
+       }
+
+       if (ret != B_OK) {
+               char buffer[1024];
+               snprintf(buffer, sizeof(buffer), "Failed to show the "
+                       "page source: %s\n", strerror(ret));
+               BAlert* alert = new BAlert("Page source error", buffer, "OK");
+               alert->Go(NULL);
+       }
+}
+
+

Modified: webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h       Sat May 22 
19:03:24 2010        (r516)
+++ webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h       Sat May 22 
19:04:46 2010        (r517)
@@ -191,6 +191,9 @@
 
                        BString                         _NewTabURL(bool 
isNewWindow) const;
 
+                       void                            _HandlePageSourceResult(
+                                                                       const 
BMessage* message);
+
 private:
                        BMenu*                          fHistoryMenu;
                        int32                           
fHistoryMenuFixedItemCount;

Other related posts:

  • » [haiku-webkit-commits] r517 - webkit/trunk/WebKit/haiku/WebPositive - webkit