[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andersca at apple.com andersca at apple.com
Wed Dec 22 16:14:01 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 30168266f065b662a62bd526ee2290c94665378d
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Nov 19 22:15:14 2010 +0000

    Implement support for loading local files
    https://bugs.webkit.org/show_bug.cgi?id=49828
    <rdar://problem/8447121>
    
    Reviewed by Sam Weinig.
    
    * UIProcess/WebPageProxy.cpp:
    (WebKit::initializeSandboxExtensionHandle):
    Given an URL, create a sandbox extension if it's a local file URL.
    
    (WebKit::WebPageProxy::loadURL):
    (WebKit::WebPageProxy::loadURLRequest):
    Pass along sandbox extension handles to the LoadURL and LoadURLRequest messages.
    
    * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
    (WebKit::WebFrameLoaderClient::dispatchDidStartProvisionalLoad):
    Call SandboxExtensionTracker::didStartProvisionalLoad.
    
    (WebKit::WebFrameLoaderClient::dispatchDidCommitLoad):
    Call SandboxExtensionTracker::didCommitProvisionalLoad.
    
    (WebKit::WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
    Call SandboxExtensionTracker::didFailProvisionalLoad.
    
    * WebProcess/WebPage/WebPage.cpp:
    (WebKit::WebPage::~WebPage):
    Invalidate the sandbox extension tracker.
    
    (WebKit::WebPage::close):
    Invalidate the sandbox extension tracker.
    
    (WebKit::WebPage::loadURL):
    (WebKit::WebPage::loadURLRequest):
    Pass the sandbox extension handle to the sandbox extension tracker.
    
    (WebKit::WebPage::SandboxExtensionTracker::~SandboxExtensionTracker):
    Invalidate the sandbox extension tracker.
    
    (WebKit::WebPage::SandboxExtensionTracker::invalidate):
    invalidate ell the sandbox extensions.
    
    (WebKit::WebPage::SandboxExtensionTracker::beginLoad):
    Create a sandbox extension and store it as the "pending provisional extension".
    
    (WebKit::WebPage::SandboxExtensionTracker::didStartProvisionalLoad):
    Consume the pending provisional extension and make it the provisional extension.
    
    (WebKit::WebPage::SandboxExtensionTracker::didCommitProvisionalLoad):
    Invalidate the committed extension and make the provisional extension the committed extension.
    
    (WebKit::WebPage::SandboxExtensionTracker::didFailProvisionalLoad):
    Invalidate the provisional extension.
    
    * WebProcess/WebPage/WebPage.messages.in:
    Add SandboxExtension::Handle parameters to LoadURL and LoadURLRequest.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72438 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 21a8652..2030b05 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,5 +1,63 @@
 2010-11-19  Anders Carlsson  <andersca at apple.com>
 
+        Reviewed by Sam Weinig.
+
+        Implement support for loading local files
+        https://bugs.webkit.org/show_bug.cgi?id=49828
+        <rdar://problem/8447121>
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::initializeSandboxExtensionHandle):
+        Given an URL, create a sandbox extension if it's a local file URL.
+
+        (WebKit::WebPageProxy::loadURL):
+        (WebKit::WebPageProxy::loadURLRequest):
+        Pass along sandbox extension handles to the LoadURL and LoadURLRequest messages.
+        
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::dispatchDidStartProvisionalLoad):
+        Call SandboxExtensionTracker::didStartProvisionalLoad.
+
+        (WebKit::WebFrameLoaderClient::dispatchDidCommitLoad):
+        Call SandboxExtensionTracker::didCommitProvisionalLoad.
+
+        (WebKit::WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
+        Call SandboxExtensionTracker::didFailProvisionalLoad.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::~WebPage):
+        Invalidate the sandbox extension tracker.
+
+        (WebKit::WebPage::close):
+        Invalidate the sandbox extension tracker.
+
+        (WebKit::WebPage::loadURL):
+        (WebKit::WebPage::loadURLRequest):
+        Pass the sandbox extension handle to the sandbox extension tracker.
+
+        (WebKit::WebPage::SandboxExtensionTracker::~SandboxExtensionTracker):
+        Invalidate the sandbox extension tracker.
+
+        (WebKit::WebPage::SandboxExtensionTracker::invalidate):
+        invalidate ell the sandbox extensions.
+        
+        (WebKit::WebPage::SandboxExtensionTracker::beginLoad):
+        Create a sandbox extension and store it as the "pending provisional extension".
+
+        (WebKit::WebPage::SandboxExtensionTracker::didStartProvisionalLoad):
+        Consume the pending provisional extension and make it the provisional extension.
+
+        (WebKit::WebPage::SandboxExtensionTracker::didCommitProvisionalLoad):
+        Invalidate the committed extension and make the provisional extension the committed extension.
+
+        (WebKit::WebPage::SandboxExtensionTracker::didFailProvisionalLoad):
+        Invalidate the provisional extension.
+
+        * WebProcess/WebPage/WebPage.messages.in:
+        Add SandboxExtension::Handle parameters to LoadURL and LoadURLRequest.
+
+2010-11-19  Anders Carlsson  <andersca at apple.com>
+
         Reviewed by Darin Adler.
 
         Make it possible to encode null SandboxExtension handles
diff --git a/WebKit2/UIProcess/WebPageProxy.cpp b/WebKit2/UIProcess/WebPageProxy.cpp
index d952400..68f0192 100644
--- a/WebKit2/UIProcess/WebPageProxy.cpp
+++ b/WebKit2/UIProcess/WebPageProxy.cpp
@@ -257,12 +257,22 @@ bool WebPageProxy::tryClose()
     return false;
 }
 
+static void initializeSandboxExtensionHandle(const KURL& url, SandboxExtension::Handle& sandboxExtensionHandle)
+{
+    if (!url.isLocalFile())
+        return;
+
+    SandboxExtension::createHandle("/", SandboxExtension::ReadOnly, sandboxExtensionHandle);
+}
+
 void WebPageProxy::loadURL(const String& url)
 {
     if (!isValid())
         relaunch();
 
-    process()->send(Messages::WebPage::LoadURL(url), m_pageID);
+    SandboxExtension::Handle sandboxExtensionHandle;
+    initializeSandboxExtensionHandle(KURL(KURL(), url), sandboxExtensionHandle);
+    process()->send(Messages::WebPage::LoadURL(url, sandboxExtensionHandle), m_pageID);
 }
 
 void WebPageProxy::loadURLRequest(WebURLRequest* urlRequest)
@@ -270,7 +280,9 @@ void WebPageProxy::loadURLRequest(WebURLRequest* urlRequest)
     if (!isValid())
         relaunch();
 
-    process()->send(Messages::WebPage::LoadURLRequest(urlRequest->resourceRequest()), m_pageID);
+    SandboxExtension::Handle sandboxExtensionHandle;
+    initializeSandboxExtensionHandle(urlRequest->resourceRequest().url(), sandboxExtensionHandle);
+    process()->send(Messages::WebPage::LoadURLRequest(urlRequest->resourceRequest(), sandboxExtensionHandle), m_pageID);
 }
 
 void WebPageProxy::loadHTMLString(const String& htmlString, const String& baseURL)
diff --git a/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp b/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
index 03231f4..dae0ea3 100644
--- a/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
+++ b/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
@@ -291,7 +291,6 @@ void WebFrameLoaderClient::dispatchDidStartProvisionalLoad()
     WebPage* webPage = m_frame->page();
     if (!webPage)
         return;
-
     webPage->findController().hideFindUI();
     
     DocumentLoader* provisionalLoader = m_frame->coreFrame()->loader()->provisionalDocumentLoader();
@@ -301,9 +300,10 @@ void WebFrameLoaderClient::dispatchDidStartProvisionalLoad()
     // Notify the bundle client.
     webPage->injectedBundleLoaderClient().didStartProvisionalLoadForFrame(webPage, m_frame, userData);
 
-
     bool loadingSubstituteDataForUnreachableURL = !provisionalLoader->unreachableURL().isNull();
 
+    webPage->sandboxExtensionTracker().didStartProvisionalLoad(m_frame);
+
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidStartProvisionalLoadForFrame(m_frame->frameID(), url, loadingSubstituteDataForUnreachableURL, InjectedBundleUserMessageEncoder(userData.get())));
 }
@@ -340,6 +340,8 @@ void WebFrameLoaderClient::dispatchDidCommitLoad()
     // Notify the bundle client.
     webPage->injectedBundleLoaderClient().didCommitLoadForFrame(webPage, m_frame, userData);
 
+    webPage->sandboxExtensionTracker().didCommitProvisionalLoad(m_frame);
+
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidCommitLoadForFrame(m_frame->frameID(), response.mimeType(), PlatformCertificateInfo(response), InjectedBundleUserMessageEncoder(userData.get())));
 }
@@ -355,6 +357,8 @@ void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& e
     // Notify the bundle client.
     webPage->injectedBundleLoaderClient().didFailProvisionalLoadWithErrorForFrame(webPage, m_frame, error, userData);
 
+    webPage->sandboxExtensionTracker().didFailProvisionalLoad(m_frame);
+
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidFailProvisionalLoadForFrame(m_frame->frameID(), error, InjectedBundleUserMessageEncoder(userData.get())));
     
diff --git a/WebKit2/WebProcess/WebPage/WebPage.cpp b/WebKit2/WebProcess/WebPage/WebPage.cpp
index 146df97..6159ca7 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -162,6 +162,8 @@ WebPage::~WebPage()
 
     ASSERT(!m_page);
 
+    m_sandboxExtensionTracker.invalidate();
+
 #if PLATFORM(MAC)
     ASSERT(m_pluginViews.isEmpty());
 #endif
@@ -311,6 +313,8 @@ void WebPage::close()
         m_activePopupMenu = 0;
     }
 
+    m_sandboxExtensionTracker.invalidate();
+
     m_mainFrame->coreFrame()->loader()->detachFromParent();
     m_page.clear();
 
@@ -330,13 +334,14 @@ void WebPage::sendClose()
     send(Messages::WebPageProxy::ClosePage());
 }
 
-void WebPage::loadURL(const String& url)
+void WebPage::loadURL(const String& url, const SandboxExtension::Handle& sandboxExtensionHandle)
 {
-    loadURLRequest(ResourceRequest(KURL(KURL(), url)));
+    loadURLRequest(ResourceRequest(KURL(KURL(), url)), sandboxExtensionHandle);
 }
 
-void WebPage::loadURLRequest(const ResourceRequest& request)
+void WebPage::loadURLRequest(const ResourceRequest& request, const SandboxExtension::Handle& sandboxExtensionHandle)
 {
+    m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), sandboxExtensionHandle);
     m_mainFrame->coreFrame()->loader()->load(request, false);
 }
 
@@ -1099,7 +1104,79 @@ void WebPage::findZoomableAreaForPoint(const WebCore::IntPoint& point)
         zoomableArea = node->getRect();
     send(Messages::WebPageProxy::DidFindZoomableArea(zoomableArea));
 }
-
 #endif
 
+WebPage::SandboxExtensionTracker::~SandboxExtensionTracker()
+{
+    invalidate();
+}
+
+void WebPage::SandboxExtensionTracker::invalidate()
+{
+    if (m_pendingProvisionalSandboxExtension) {
+        m_pendingProvisionalSandboxExtension->invalidate();
+        m_pendingProvisionalSandboxExtension = 0;
+    }
+
+    if (m_provisionalSandboxExtension) {
+        m_provisionalSandboxExtension->invalidate();
+        m_provisionalSandboxExtension = 0;
+    }
+
+    if (m_committedSandboxExtension) {
+        m_committedSandboxExtension->invalidate();
+        m_committedSandboxExtension = 0;
+    }
+}
+
+void WebPage::SandboxExtensionTracker::beginLoad(WebFrame* frame, const SandboxExtension::Handle& handle)
+{
+    ASSERT(frame->isMainFrame());
+
+    ASSERT(!m_pendingProvisionalSandboxExtension);
+    m_pendingProvisionalSandboxExtension = SandboxExtension::create(handle);
+}
+
+void WebPage::SandboxExtensionTracker::didStartProvisionalLoad(WebFrame* frame)
+{
+    if (!frame->isMainFrame())
+        return;
+
+    ASSERT(!m_provisionalSandboxExtension);
+
+    m_provisionalSandboxExtension = m_pendingProvisionalSandboxExtension.release();
+    if (!m_provisionalSandboxExtension)
+        return;
+
+    m_provisionalSandboxExtension->consume();
+}
+
+void WebPage::SandboxExtensionTracker::didCommitProvisionalLoad(WebFrame* frame)
+{
+    if (!frame->isMainFrame())
+        return;
+    
+    ASSERT(!m_pendingProvisionalSandboxExtension);
+
+    // The provisional load has been committed. Invalidate the currently committed sandbox
+    // extension and make the provisional sandbox extension the committed sandbox extension.
+    if (m_committedSandboxExtension)
+        m_committedSandboxExtension->invalidate();
+
+    m_committedSandboxExtension = m_provisionalSandboxExtension.release();
+}
+
+void WebPage::SandboxExtensionTracker::didFailProvisionalLoad(WebFrame* frame)
+{
+    if (!frame->isMainFrame())
+        return;
+
+    ASSERT(!m_pendingProvisionalSandboxExtension);
+    if (!m_provisionalSandboxExtension)
+        return;
+
+    m_provisionalSandboxExtension->invalidate();
+    m_provisionalSandboxExtension = 0;
+}
+
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/WebPage/WebPage.h b/WebKit2/WebProcess/WebPage/WebPage.h
index 6c3057c..fb05ebf 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.h
+++ b/WebKit2/WebProcess/WebPage/WebPage.h
@@ -36,6 +36,7 @@
 #include "InjectedBundlePageUIClient.h"
 #include "MessageSender.h"
 #include "Plugin.h"
+#include "SandboxExtension.h"
 #include "WebEditCommand.h"
 #include <WebCore/FrameLoaderTypes.h>
 #include <WebCore/IntRect.h>
@@ -203,6 +204,24 @@ public:
 
     WebContextMenu* contextMenu();
 
+    class SandboxExtensionTracker {
+    public:
+        ~SandboxExtensionTracker();
+
+        void invalidate();
+
+        void beginLoad(WebFrame*, const SandboxExtension::Handle& handle);
+        void didStartProvisionalLoad(WebFrame*);
+        void didCommitProvisionalLoad(WebFrame*);
+        void didFailProvisionalLoad(WebFrame*);
+    private:
+        RefPtr<SandboxExtension> m_pendingProvisionalSandboxExtension;
+        RefPtr<SandboxExtension> m_provisionalSandboxExtension;
+        RefPtr<SandboxExtension> m_committedSandboxExtension;
+    };
+
+    SandboxExtensionTracker& sandboxExtensionTracker() { return m_sandboxExtensionTracker; }
+
 private:
     WebPage(uint64_t pageID, const WebPageCreationParameters&);
 
@@ -221,8 +240,8 @@ private:
 
     // Actions
     void tryClose();
-    void loadURL(const String&);
-    void loadURLRequest(const WebCore::ResourceRequest&);
+    void loadURL(const String&, const SandboxExtension::Handle& sandboxExtensionHandle);
+    void loadURLRequest(const WebCore::ResourceRequest&, const SandboxExtension::Handle& sandboxExtensionHandle);
     void loadHTMLString(const String& htmlString, const String& baseURL);
     void loadAlternateHTMLString(const String& htmlString, const String& baseURL, const String& unreachableURL);
     void loadPlainTextString(const String&);
@@ -323,11 +342,10 @@ private:
     RefPtr<PageOverlay> m_pageOverlay;
 
     OwnPtr<WebInspector> m_inspector;
-
     RefPtr<WebPopupMenu> m_activePopupMenu;
-
     RefPtr<WebContextMenu> m_contextMenu;
 
+    SandboxExtensionTracker m_sandboxExtensionTracker;
     uint64_t m_pageID;
 };
 
diff --git a/WebKit2/WebProcess/WebPage/WebPage.messages.in b/WebKit2/WebProcess/WebPage/WebPage.messages.in
index 445a4e7..3f39487 100644
--- a/WebKit2/WebProcess/WebPage/WebPage.messages.in
+++ b/WebKit2/WebProcess/WebPage/WebPage.messages.in
@@ -38,8 +38,8 @@ messages -> WebPage {
     LoadHTMLString(WTF::String htmlString, WTF::String baseURL)
     LoadAlternateHTMLString(WTF::String htmlString, WTF::String baseURL, WTF::String unreachableURL); 
     LoadPlainTextString(WTF::String string)
-    LoadURL(WTF::String url)
-    LoadURLRequest(WebCore::ResourceRequest request)
+    LoadURL(WTF::String url, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
+    LoadURLRequest(WebCore::ResourceRequest request, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
     Reload(bool reloadFromOrigin)
     StopLoading()
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list