Unreviewed, reverting r258339.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Mar 2020 15:36:37 +0000 (15:36 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 17 Mar 2020 15:36:37 +0000 (15:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=209179

"Is it sometimes breaking rendering" (Requested by youenn on
#webkit).

Reverted changeset:

"FrameLoader should own its FrameLoaderClient"
https://bugs.webkit.org/show_bug.cgi?id=208918
https://trac.webkit.org/changeset/258339

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@258549 268f45cc-cd09-0410-ab3c-d52691b4dbfc

32 files changed:
Source/WebCore/ChangeLog
Source/WebCore/loader/EmptyClients.cpp
Source/WebCore/loader/EmptyFrameLoaderClient.h
Source/WebCore/loader/FrameLoader.cpp
Source/WebCore/loader/FrameLoader.h
Source/WebCore/loader/FrameLoaderClient.h
Source/WebCore/page/Frame.cpp
Source/WebCore/page/Frame.h
Source/WebCore/page/Page.cpp
Source/WebCore/page/PageConfiguration.cpp
Source/WebCore/page/PageConfiguration.h
Source/WebCore/workers/service/context/SWContextManager.cpp
Source/WebCore/workers/service/context/SWContextManager.h
Source/WebKit/ChangeLog
Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp
Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h
Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKit/WebProcess/WebPage/WebFrame.cpp
Source/WebKit/WebProcess/WebPage/WebFrame.h
Source/WebKit/WebProcess/WebPage/WebPage.cpp
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm
Source/WebKitLegacy/mac/WebView/WebFrame.mm
Source/WebKitLegacy/mac/WebView/WebView.mm
Source/WebKitLegacy/win/ChangeLog
Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKitLegacy/win/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKitLegacy/win/WebFrame.cpp
Source/WebKitLegacy/win/WebView.cpp

index 5cf6d6a..38220a6 100644 (file)
@@ -1,3 +1,17 @@
+2020-03-17  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, reverting r258339.
+        https://bugs.webkit.org/show_bug.cgi?id=209179
+
+        "Is it sometimes breaking rendering" (Requested by youenn on
+        #webkit).
+
+        Reverted changeset:
+
+        "FrameLoader should own its FrameLoaderClient"
+        https://bugs.webkit.org/show_bug.cgi?id=208918
+        https://trac.webkit.org/changeset/258339
+
 2020-03-17  Philippe Normand  <pnormand@igalia.com>
 
         RELEASE_LOG should not be Cocoa specific
index 01ff208..12d52bd 100644 (file)
@@ -597,7 +597,6 @@ PageConfiguration pageConfigurationWithEmptyClients(PAL::SessionID sessionID)
         adoptRef(*new EmptyBackForwardClient),
         CookieJar::create(adoptRef(*new EmptyStorageSessionProvider)),
         makeUniqueRef<EmptyProgressTrackerClient>(),
-        makeUniqueRef<EmptyFrameLoaderClient>(),
         makeUniqueRef<EmptyMediaRecorderProvider>()
     };
 
@@ -621,6 +620,9 @@ PageConfiguration pageConfigurationWithEmptyClients(PAL::SessionID sessionID)
     static NeverDestroyed<EmptyInspectorClient> dummyInspectorClient;
     pageConfiguration.inspectorClient = &dummyInspectorClient.get();
 
+    static NeverDestroyed<EmptyFrameLoaderClient> dummyFrameLoaderClient;
+    pageConfiguration.loaderClientForMainFrame = &dummyFrameLoaderClient.get();
+
     pageConfiguration.diagnosticLoggingClient = makeUnique<EmptyDiagnosticLoggingClient>();
 
     pageConfiguration.applicationCacheStorage = ApplicationCacheStorage::create({ }, { });
index aee77e3..1d9f113 100644 (file)
@@ -37,6 +37,8 @@ namespace WebCore {
 class WEBCORE_EXPORT EmptyFrameLoaderClient : public FrameLoaderClient {
     Ref<DocumentLoader> createDocumentLoader(const ResourceRequest&, const SubstituteData&) override;
 
+    void frameLoaderDestroyed() override { }
+
     Optional<FrameIdentifier> frameID() const override { return WTF::nullopt; }
     Optional<PageIdentifier> pageID() const override { return WTF::nullopt; }
 
@@ -124,20 +126,20 @@ class WEBCORE_EXPORT EmptyFrameLoaderClient : public FrameLoaderClient {
     void committedLoad(DocumentLoader*, const char*, int) final { }
     void finishedLoading(DocumentLoader*) final { }
 
-    ResourceError cancelledError(const ResourceRequest&) const final { return { ResourceError::Type::Cancellation }; }
-    ResourceError blockedError(const ResourceRequest&) const final { return { }; }
-    ResourceError blockedByContentBlockerError(const ResourceRequest&) const final { return { }; }
-    ResourceError cannotShowURLError(const ResourceRequest&) const final { return { }; }
-    ResourceError interruptedForPolicyChangeError(const ResourceRequest&) const final { return { }; }
+    ResourceError cancelledError(const ResourceRequest&) final { return { ResourceError::Type::Cancellation }; }
+    ResourceError blockedError(const ResourceRequest&) final { return { }; }
+    ResourceError blockedByContentBlockerError(const ResourceRequest&) final { return { }; }
+    ResourceError cannotShowURLError(const ResourceRequest&) final { return { }; }
+    ResourceError interruptedForPolicyChangeError(const ResourceRequest&) final { return { }; }
 #if ENABLE(CONTENT_FILTERING)
-    ResourceError blockedByContentFilterError(const ResourceRequest&) const final { return { }; }
+    ResourceError blockedByContentFilterError(const ResourceRequest&) final { return { }; }
 #endif
 
-    ResourceError cannotShowMIMETypeError(const ResourceResponse&) const final { return { }; }
-    ResourceError fileDoesNotExistError(const ResourceResponse&) const final { return { }; }
-    ResourceError pluginWillHandleLoadError(const ResourceResponse&) const final { return { }; }
+    ResourceError cannotShowMIMETypeError(const ResourceResponse&) final { return { }; }
+    ResourceError fileDoesNotExistError(const ResourceResponse&) final { return { }; }
+    ResourceError pluginWillHandleLoadError(const ResourceResponse&) final { return { }; }
 
-    bool shouldFallBack(const ResourceError&) const final { return false; }
+    bool shouldFallBack(const ResourceError&) final { return false; }
 
     bool canHandleRequest(const ResourceRequest&) const final { return false; }
     bool canShowMIMEType(const String&) const final { return false; }
@@ -154,7 +156,7 @@ class WEBCORE_EXPORT EmptyFrameLoaderClient : public FrameLoaderClient {
     void updateCachedDocumentLoader(DocumentLoader&) final { }
     void setTitle(const StringWithDirection&, const URL&) final { }
 
-    String userAgent(const URL&) const override { return emptyString(); }
+    String userAgent(const URL&) override { return emptyString(); }
 
     void savePlatformDataToCachedFrame(CachedFrame*) final { }
     void transitionToCommittedFromCachedFrame(CachedFrame*) final { }
index d583ede..43c0e80 100644 (file)
@@ -291,9 +291,9 @@ private:
     bool m_inProgress;
 };
 
-FrameLoader::FrameLoader(Frame& frame, UniqueRef<FrameLoaderClient>&& client)
+FrameLoader::FrameLoader(Frame& frame, FrameLoaderClient& client)
     : m_frame(frame)
-    , m_client(WTFMove(client))
+    , m_client(client)
     , m_policyChecker(makeUnique<PolicyChecker>(frame))
     , m_history(makeUnique<HistoryController>(frame))
     , m_notifier(frame)
@@ -325,6 +325,8 @@ FrameLoader::~FrameLoader()
     setOpener(nullptr);
     detachFromAllOpenedFrames();
 
+    m_client.frameLoaderDestroyed();
+
     if (m_networkingContext)
         m_networkingContext->invalidate();
 }
@@ -339,7 +341,7 @@ void FrameLoader::detachFromAllOpenedFrames()
 void FrameLoader::init()
 {
     // This somewhat odd set of steps gives the frame an initial empty document.
-    setPolicyDocumentLoader(m_client->createDocumentLoader(ResourceRequest(URL({ }, emptyString())), SubstituteData()).ptr());
+    setPolicyDocumentLoader(m_client.createDocumentLoader(ResourceRequest(URL({ }, emptyString())), SubstituteData()).ptr());
     setProvisionalDocumentLoader(m_policyDocumentLoader.get());
     m_provisionalDocumentLoader->startLoadingMainResource();
 
@@ -347,7 +349,7 @@ void FrameLoader::init()
     m_frame.document()->cancelParsing();
     m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument);
 
-    m_networkingContext = m_client->createNetworkingContext();
+    m_networkingContext = m_client.createNetworkingContext();
     m_progressTracker = makeUnique<FrameProgressTracker>(m_frame);
 }
 
@@ -356,7 +358,7 @@ void FrameLoader::initForSynthesizedDocument(const URL&)
     // FIXME: We need to initialize the document URL to the specified URL. Currently the URL is empty and hence
     // FrameLoader::checkCompleted() will overwrite the URL of the document to be activeDocumentLoader()->documentURL().
 
-    auto loader = m_client->createDocumentLoader(ResourceRequest(URL({ }, emptyString())), SubstituteData());
+    auto loader = m_client.createDocumentLoader(ResourceRequest(URL({ }, emptyString())), SubstituteData());
     loader->attachToFrame(m_frame);
     loader->setResponse(ResourceResponse(URL(), "text/html"_s, 0, String()));
     loader->setCommitted(true);
@@ -365,14 +367,14 @@ void FrameLoader::initForSynthesizedDocument(const URL&)
     m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocument);
     m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit);
     m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad);
-    m_client->transitionToCommittedForNewPage();
+    m_client.transitionToCommittedForNewPage();
 
     m_didCallImplicitClose = true;
     m_isComplete = true;
     m_state = FrameStateComplete;
     m_needsClear = true;
 
-    m_networkingContext = m_client->createNetworkingContext();
+    m_networkingContext = m_client.createNetworkingContext();
     m_progressTracker = makeUnique<FrameProgressTracker>(m_frame);
 }
 
@@ -610,7 +612,7 @@ void FrameLoader::didExplicitOpen()
         m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit);
 
     if (auto* document = m_frame.document())
-        m_client->dispatchDidExplicitOpen(document->url(), document->contentType());
+        m_client.dispatchDidExplicitOpen(document->url(), document->contentType());
     
     // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results
     // from a subsequent window.document.open / window.document.write call. 
@@ -716,7 +718,7 @@ void FrameLoader::receivedFirstData()
     auto& documentLoader = *m_documentLoader;
     auto& title = documentLoader.title();
     if (!title.string.isNull())
-        m_client->dispatchDidReceiveTitle(title);
+        m_client.dispatchDidReceiveTitle(title);
 
     ASSERT(m_frame.document());
     auto& document = *m_frame.document();
@@ -801,7 +803,7 @@ void FrameLoader::finishedParsing()
     // Null-checking the FrameView indicates whether or not we're in the destructor.
     RefPtr<Frame> protector = m_frame.view() ? &m_frame : 0;
 
-    m_client->dispatchDidFinishDocumentLoad();
+    m_client.dispatchDidFinishDocumentLoad();
 
     scrollToFragmentWithParentBoundary(m_frame.document()->url());
 
@@ -1006,7 +1008,7 @@ void FrameLoader::loadArchive(Ref<Archive>&& archive)
     
     ResourceRequest request(mainResource->url());
 
-    auto documentLoader = m_client->createDocumentLoader(request, substituteData);
+    auto documentLoader = m_client.createDocumentLoader(request, substituteData);
     documentLoader->setArchive(WTFMove(archive));
     load(documentLoader.get());
 }
@@ -1051,7 +1053,7 @@ Frame* FrameLoader::opener()
 void FrameLoader::setOpener(Frame* opener)
 {
     if (m_opener && !opener)
-        m_client->didDisownOpener();
+        m_client.didDisownOpener();
 
     if (m_opener) {
         // When setOpener is called in ~FrameLoader, opener's m_frameLoader is already cleared.
@@ -1083,7 +1085,7 @@ void FrameLoader::provisionalLoadStarted()
     if (m_stateMachine.firstLayoutDone())
         m_stateMachine.advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad);
     m_frame.navigationScheduler().cancel(NewLoadInProgress::Yes);
-    m_client->provisionalLoadStarted();
+    m_client.provisionalLoadStarted();
 
     if (m_frame.isMainFrame()) {
         tracePoint(MainResourceLoadDidStartProvisional);
@@ -1180,18 +1182,18 @@ void FrameLoader::loadInSameDocument(const URL& url, SerializedScriptValue* stat
         checkLoadComplete();
     }
 
-    m_client->dispatchDidNavigateWithinPage();
+    m_client.dispatchDidNavigateWithinPage();
 
     m_frame.document()->statePopped(stateObject ? Ref<SerializedScriptValue> { *stateObject } : SerializedScriptValue::nullValue());
-    m_client->dispatchDidPopStateWithinPage();
+    m_client.dispatchDidPopStateWithinPage();
     
     if (hashChange) {
         m_frame.document()->enqueueHashchangeEvent(oldURL, url);
-        m_client->dispatchDidChangeLocationWithinPage();
+        m_client.dispatchDidChangeLocationWithinPage();
     }
     
     // FrameLoaderClient::didFinishLoad() tells the internal load delegate the load finished with no error
-    m_client->didFinishLoad();
+    m_client.didFinishLoad();
 }
 
 bool FrameLoader::isComplete() const
@@ -1224,7 +1226,7 @@ void FrameLoader::prepareForLoadStart()
     FRAMELOADER_RELEASE_LOG_IF_ALLOWED(ResourceLoading, "prepareForLoadStart: Starting frame load");
 
     m_progressTracker->progressStarted();
-    m_client->dispatchDidStartProvisionalLoad();
+    m_client.dispatchDidStartProvisionalLoad();
 
     if (AXObjectCache::accessibilityEnabled()) {
         if (AXObjectCache* cache = m_frame.document()->existingAXObjectCache()) {
@@ -1236,7 +1238,7 @@ void FrameLoader::prepareForLoadStart()
 
 void FrameLoader::setupForReplace()
 {
-    m_client->revertToProvisionalState(m_documentLoader.get());
+    m_client.revertToProvisionalState(m_documentLoader.get());
     setState(FrameStateProvisional);
     m_provisionalDocumentLoader = m_documentLoader;
     FRAMELOADER_RELEASE_LOG_IF_ALLOWED(ResourceLoading, "setupForReplace: Setting provisional document loader (m_provisionalDocumentLoader=%p)", m_provisionalDocumentLoader.get());
@@ -1479,7 +1481,7 @@ void FrameLoader::load(FrameLoadRequest&& request)
     if (!request.hasSubstituteData())
         request.setSubstituteData(defaultSubstituteDataForURL(request.resourceRequest().url()));
 
-    Ref<DocumentLoader> loader = m_client->createDocumentLoader(request.resourceRequest(), request.substituteData());
+    Ref<DocumentLoader> loader = m_client.createDocumentLoader(request.resourceRequest(), request.substituteData());
     loader->setAllowsWebArchiveForMainFrame(request.isRequestFromClientOrUserInput());
     loader->setAllowsDataURLsForMainFrame(request.isRequestFromClientOrUserInput());
     addSameSiteInfoToRequestIfNeeded(loader->request());
@@ -1501,7 +1503,7 @@ void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, Navig
 {
     FRAMELOADER_RELEASE_LOG_IF_ALLOWED(ResourceLoading, "loadWithNavigationAction: frame load started");
 
-    Ref<DocumentLoader> loader = m_client->createDocumentLoader(request, defaultSubstituteDataForURL(request.url()));
+    Ref<DocumentLoader> loader = m_client.createDocumentLoader(request, defaultSubstituteDataForURL(request.url()));
     loader->setDownloadAttribute(downloadAttribute);
     applyShouldOpenExternalURLsPolicyToNewDocumentLoader(m_frame, loader, action.initiatedByMainFrame(), action.shouldOpenExternalURLsPolicy());
 
@@ -1565,7 +1567,7 @@ void FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType t
 
     CompletionHandlerCallingScope completionHandlerCaller(WTFMove(completionHandler));
 
-    ASSERT(m_client->hasWebView());
+    ASSERT(m_client.hasWebView());
 
     // Unfortunately the view must be non-nil, this is ultimately due
     // to parser requiring a FrameView.  We should fix this dependency.
@@ -1697,7 +1699,7 @@ bool FrameLoader::willLoadMediaElementURL(URL& url, Node& initiatorNode)
     // MobileStore depends on the iOS 4.0 era client delegate method because webView:resource:willSendRequest:redirectResponse:fromDataSource
     // doesn't let them tell when a load request is coming from a media element. See <rdar://problem/8266916> for more details.
     if (IOSApplication::isMobileStore())
-        return m_client->shouldLoadMediaElementURL(url);
+        return m_client.shouldLoadMediaElementURL(url);
 #endif
 
     ResourceRequest request(url);
@@ -1750,7 +1752,7 @@ void FrameLoader::reloadWithOverrideEncoding(const String& encoding)
     // We should ask the user for confirmation in this case.
     request.setCachePolicy(ResourceRequestCachePolicy::ReturnCacheDataElseLoad);
 
-    Ref<DocumentLoader> loader = m_client->createDocumentLoader(request, defaultSubstituteDataForURL(request.url()));
+    Ref<DocumentLoader> loader = m_client.createDocumentLoader(request, defaultSubstituteDataForURL(request.url()));
     applyShouldOpenExternalURLsPolicyToNewDocumentLoader(m_frame, loader, InitiatedByMainFrame::Unknown, m_documentLoader->shouldOpenExternalURLsPolicyToPropagate());
 
     setPolicyDocumentLoader(loader.ptr());
@@ -1780,7 +1782,7 @@ void FrameLoader::reload(OptionSet<ReloadOption> options)
 
     // Create a new document loader for the reload, this will become m_documentLoader eventually,
     // but first it has to be the "policy" document loader, and then the "provisional" document loader.
-    Ref<DocumentLoader> loader = m_client->createDocumentLoader(initialRequest, defaultSubstituteDataForURL(initialRequest.url()));
+    Ref<DocumentLoader> loader = m_client.createDocumentLoader(initialRequest, defaultSubstituteDataForURL(initialRequest.url()));
     loader->setAllowsWebArchiveForMainFrame(m_documentLoader->allowsWebArchiveForMainFrame());
     loader->setAllowsDataURLsForMainFrame(m_documentLoader->allowsDataURLsForMainFrame());
     applyShouldOpenExternalURLsPolicyToNewDocumentLoader(m_frame, loader, InitiatedByMainFrame::Unknown, m_documentLoader->shouldOpenExternalURLsPolicyToPropagate());
@@ -1942,7 +1944,7 @@ void FrameLoader::setDocumentLoader(DocumentLoader* loader)
     ASSERT(loader != m_documentLoader);
     ASSERT(!loader || loader->frameLoader() == this);
 
-    m_client->prepareForDataSourceReplacement();
+    m_client.prepareForDataSourceReplacement();
     detachChildren();
 
     // detachChildren() can trigger this frame's unload event, and therefore
@@ -2042,7 +2044,7 @@ void FrameLoader::commitProvisionalLoad()
         closeOldDataSources();
 
     if (!cachedPage && !m_stateMachine.creatingInitialEmptyDocument())
-        m_client->makeRepresentation(pdl.get());
+        m_client.makeRepresentation(pdl.get());
 
     transitionToCommitted(cachedPage.get());
 
@@ -2091,7 +2093,7 @@ void FrameLoader::commitProvisionalLoad()
 
         auto& title = m_documentLoader->title();
         if (!title.string.isNull())
-            m_client->dispatchDidReceiveTitle(title);
+            m_client.dispatchDidReceiveTitle(title);
 
         // Send remaining notifications for the main resource.
         notifier().sendRemainingDelegateMessages(m_documentLoader.get(), mainResourceIdentifier, mainResourceRequest, ResourceResponse(),
@@ -2115,7 +2117,7 @@ void FrameLoader::commitProvisionalLoad()
 
         // Force a layout to update view size and thereby update scrollbars.
 #if PLATFORM(IOS_FAMILY)
-        if (!m_client->forceLayoutOnRestoreFromBackForwardCache())
+        if (!m_client.forceLayoutOnRestoreFromBackForwardCache())
             m_frame.view()->forceLayout();
 #else
         m_frame.view()->forceLayout();
@@ -2142,7 +2144,7 @@ void FrameLoader::commitProvisionalLoad()
 
 void FrameLoader::transitionToCommitted(CachedPage* cachedPage)
 {
-    ASSERT(m_client->hasWebView());
+    ASSERT(m_client.hasWebView());
     ASSERT(m_state == FrameStateProvisional);
 
     if (m_state != FrameStateProvisional)
@@ -2153,7 +2155,7 @@ void FrameLoader::transitionToCommitted(CachedPage* cachedPage)
             scrollAnimator->cancelAnimations();
     }
 
-    m_client->setCopiesOnScroll();
+    m_client.setCopiesOnScroll();
     history().updateForCommit();
 
     // The call to closeURL() invokes the unload event handler, which can execute arbitrary
@@ -2207,9 +2209,9 @@ void FrameLoader::transitionToCommitted(CachedPage* cachedPage)
                 DocumentLoader* cachedDocumentLoader = cachedPage->documentLoader();
                 ASSERT(cachedDocumentLoader);
                 cachedDocumentLoader->attachToFrame(m_frame);
-                m_client->transitionToCommittedFromCachedFrame(cachedPage->cachedMainFrame());
+                m_client.transitionToCommittedFromCachedFrame(cachedPage->cachedMainFrame());
             } else
-                m_client->transitionToCommittedForNewPage();
+                m_client.transitionToCommittedForNewPage();
         }
         break;
 
@@ -2219,19 +2221,19 @@ void FrameLoader::transitionToCommitted(CachedPage* cachedPage)
     case FrameLoadType::Same:
     case FrameLoadType::Replace:
         history().updateForReload();
-        m_client->transitionToCommittedForNewPage();
+        m_client.transitionToCommittedForNewPage();
         break;
 
     case FrameLoadType::Standard:
         history().updateForStandardLoad();
         if (m_frame.view())
             m_frame.view()->setScrollbarsSuppressed(true);
-        m_client->transitionToCommittedForNewPage();
+        m_client.transitionToCommittedForNewPage();
         break;
 
     case FrameLoadType::RedirectWithLockedBackForwardList:
         history().updateForRedirectWithLockedBackForwardList();
-        m_client->transitionToCommittedForNewPage();
+        m_client.transitionToCommittedForNewPage();
         break;
     }
 
@@ -2252,7 +2254,7 @@ void FrameLoader::clientRedirectCancelledOrFinished(NewLoadInProgress newLoadInP
     // Note that -webView:didCancelClientRedirectForFrame: is called on the frame load delegate even if
     // the redirect succeeded.  We should either rename this API, or add a new method, like
     // -webView:didFinishClientRedirectForFrame:
-    m_client->dispatchDidCancelClientRedirect();
+    m_client.dispatchDidCancelClientRedirect();
 
     if (newLoadInProgress == NewLoadInProgress::No)
         m_quickRedirectComing = false;
@@ -2262,7 +2264,7 @@ void FrameLoader::clientRedirectCancelledOrFinished(NewLoadInProgress newLoadInP
 
 void FrameLoader::clientRedirected(const URL& url, double seconds, WallTime fireDate, LockBackForwardList lockBackForwardList)
 {
-    m_client->dispatchWillPerformClientRedirect(url, seconds, fireDate, lockBackForwardList);
+    m_client.dispatchWillPerformClientRedirect(url, seconds, fireDate, lockBackForwardList);
     
     // Remember that we sent a redirect notification to the frame load delegate so that when we commit
     // the next provisional load, we can send a corresponding -webView:didCancelClientRedirectForFrame:
@@ -2294,9 +2296,9 @@ void FrameLoader::closeOldDataSources()
         child->loader().closeOldDataSources();
     
     if (m_documentLoader)
-        m_client->dispatchWillClose();
+        m_client.dispatchWillClose();
 
-    m_client->setMainFrameDocumentReady(false); // stop giving out the actual DOMDocument to observers
+    m_client.setMainFrameDocumentReady(false); // stop giving out the actual DOMDocument to observers
 }
 
 void FrameLoader::willRestoreFromCachedPage()
@@ -2411,7 +2413,7 @@ bool FrameLoader::subframeIsLoading() const
 
 void FrameLoader::willChangeTitle(DocumentLoader* loader)
 {
-    m_client->willChangeTitle(loader);
+    m_client.willChangeTitle(loader);
 }
 
 FrameLoadType FrameLoader::loadType() const
@@ -2483,7 +2485,7 @@ void FrameLoader::dispatchDidFailProvisionalLoad(DocumentLoader& provisionalDocu
     }
 #endif
 
-    m_client->dispatchDidFailProvisionalLoad(error, willContinueLoading);
+    m_client.dispatchDidFailProvisionalLoad(error, willContinueLoading);
 
 #if ENABLE(CONTENT_FILTERING)
     if (contentFilterWillContinueLoading)
@@ -2495,7 +2497,7 @@ void FrameLoader::dispatchDidFailProvisionalLoad(DocumentLoader& provisionalDocu
 
 void FrameLoader::checkLoadCompleteForThisFrame()
 {
-    ASSERT(m_client->hasWebView());
+    ASSERT(m_client.hasWebView());
 
     // FIXME: Should this check be done in checkLoadComplete instead of here?
     // FIXME: Why does this one check need to be repeated here, and not the many others from checkCompleted?
@@ -2568,7 +2570,7 @@ void FrameLoader::checkLoadCompleteForThisFrame()
             // Maybe there are bugs because of that, or extra work we can skip because
             // the new page is ready.
 
-            m_client->forceLayoutForNonHTML();
+            m_client.forceLayoutForNonHTML();
              
             // If the user had a scroll point, scroll to it, overriding the anchor point if any.
             if (m_frame.page()) {
@@ -2593,7 +2595,7 @@ void FrameLoader::checkLoadCompleteForThisFrame()
             AXObjectCache::AXLoadingEvent loadingEvent;
             if (!error.isNull()) {
                 FRAMELOADER_RELEASE_LOG_IF_ALLOWED(ResourceLoading, "checkLoadCompleteForThisFrame: Finished frame load with error (isTimeout = %d, isCancellation = %d, errorCode = %d)", error.isTimeout(), error.isCancellation(), error.errorCode());
-                m_client->dispatchDidFailLoad(error);
+                m_client.dispatchDidFailLoad(error);
                 loadingEvent = AXObjectCache::AXLoadingFailed;
             } else {
                 FRAMELOADER_RELEASE_LOG_IF_ALLOWED(ResourceLoading, "checkLoadCompleteForThisFrame: Finished frame load");
@@ -2602,13 +2604,13 @@ void FrameLoader::checkLoadCompleteForThisFrame()
                 if (m_frame.settings().dataDetectorTypes() != DataDetectorTypeNone && document) {
                     if (auto* documentElement = document->documentElement()) {
                         RefPtr<Range> documentRange = makeRange(firstPositionInNode(documentElement), lastPositionInNode(documentElement));
-                        m_frame.setDataDetectionResults(DataDetection::detectContentInRange(documentRange, m_frame.settings().dataDetectorTypes(), m_client->dataDetectionContext()));
+                        m_frame.setDataDetectionResults(DataDetection::detectContentInRange(documentRange, m_frame.settings().dataDetectorTypes(), m_client.dataDetectionContext()));
                         if (m_frame.isMainFrame())
-                            m_client->dispatchDidFinishDataDetection(m_frame.dataDetectionResults());
+                            m_client.dispatchDidFinishDataDetection(m_frame.dataDetectionResults());
                     }
                 }
 #endif
-                m_client->dispatchDidFinishLoad();
+                m_client.dispatchDidFinishLoad();
                 loadingEvent = AXObjectCache::AXLoadingFinished;
             }
 
@@ -2666,7 +2668,7 @@ void FrameLoader::didReachLayoutMilestone(OptionSet<LayoutMilestone> milestones)
 {
     ASSERT(m_frame.isMainFrame());
 
-    m_client->dispatchDidReachLayoutMilestone(milestones);
+    m_client.dispatchDidReachLayoutMilestone(milestones);
 }
 
 void FrameLoader::didFirstLayout()
@@ -2688,14 +2690,14 @@ void FrameLoader::didFirstLayout()
 void FrameLoader::didReachVisuallyNonEmptyState()
 {
     ASSERT(m_frame.isMainFrame());
-    m_client->dispatchDidReachVisuallyNonEmptyState();
+    m_client.dispatchDidReachVisuallyNonEmptyState();
 }
 
 void FrameLoader::frameLoadCompleted()
 {
     // Note: Can be called multiple times.
 
-    m_client->frameLoadCompleted();
+    m_client.frameLoadCompleted();
 
     history().updateForFrameLoadCompleted();
 
@@ -2754,7 +2756,7 @@ void FrameLoader::checkLoadComplete()
     if (!m_frame.page())
         return;
 
-    ASSERT(m_client->hasWebView());
+    ASSERT(m_client.hasWebView());
     
     // FIXME: Always traversing the entire frame tree is a bit inefficient, but 
     // is currently needed in order to null out the previous history item for all frames.
@@ -2796,7 +2798,7 @@ String FrameLoader::userAgent(const URL& url) const
     if (!userAgent.isEmpty())
         return userAgent;
 
-    return m_client->userAgent(url);
+    return m_client.userAgent(url);
 }
 
 String FrameLoader::navigatorPlatform() const
@@ -2811,7 +2813,7 @@ String FrameLoader::navigatorPlatform() const
 
 void FrameLoader::dispatchOnloadEvents()
 {
-    m_client->dispatchDidDispatchOnloadEvents();
+    m_client.dispatchDidDispatchOnloadEvents();
 
     if (documentLoader())
         documentLoader()->dispatchOnloadEvents();
@@ -2869,9 +2871,9 @@ void FrameLoader::detachFromParent()
 
 void FrameLoader::detachViewsAndDocumentLoader()
 {
-    m_client->detachedFromParent2();
+    m_client.detachedFromParent2();
     setDocumentLoader(nullptr);
-    m_client->detachedFromParent3();
+    m_client.detachedFromParent3();
 }
     
 void FrameLoader::addExtraFieldsToSubresourceRequest(ResourceRequest& request)
@@ -3173,7 +3175,7 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error)
     // FIXME: Don't want to do this if an entirely new load is going, so should check
     // that both data sources on the frame are either this or nil.
     stop();
-    if (m_client->shouldFallBack(error))
+    if (m_client.shouldFallBack(error))
         handleFallbackContent();
 
     if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) {
@@ -3552,7 +3554,7 @@ void FrameLoader::continueLoadAfterNavigationPolicy(const ResourceRequest& reque
         return;
     }
 
-    m_client->dispatchWillSubmitForm(*formState, WTFMove(completionHandler));
+    m_client.dispatchWillSubmitForm(*formState, WTFMove(completionHandler));
 }
 
 void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& request,
@@ -3562,7 +3564,7 @@ void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& reques
         return;
 
     Ref<Frame> frame(m_frame);
-    RefPtr<Frame> mainFrame = m_client->dispatchCreatePage(action);
+    RefPtr<Frame> mainFrame = m_client.dispatchCreatePage(action);
     if (!mainFrame)
         return;
 
@@ -3574,7 +3576,7 @@ void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& reques
         mainFrame->tree().setName(frameName);
 
     mainFrame->page()->setOpenedByDOM();
-    mainFrame->loader().m_client->dispatchShow();
+    mainFrame->loader().m_client.dispatchShow();
     if (openerPolicy == NewFrameOpenerPolicy::Allow) {
         mainFrame->loader().setOpener(frame.ptr());
         mainFrame->document()->setReferrerPolicy(frame->document()->referrerPolicy());
@@ -3625,7 +3627,7 @@ void FrameLoader::loadedResourceFromMemoryCache(CachedResource& resource, Resour
         return;
     }
 
-    if (m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), newRequest, resource.response(), resource.encodedSize())) {
+    if (m_client.dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), newRequest, resource.response(), resource.encodedSize())) {
         InspectorInstrumentation::didLoadResourceFromMemoryCache(*page, m_documentLoader.get(), &resource);
         m_documentLoader->didTellClientAboutLoad(resource.url());
         return;
@@ -3777,7 +3779,7 @@ void FrameLoader::loadDifferentDocumentItem(HistoryItem& item, HistoryItem* from
 
     if (CachedPage* cachedPage = BackForwardCache::singleton().get(item, m_frame.page())) {
         auto documentLoader = cachedPage->documentLoader();
-        m_client->updateCachedDocumentLoader(*documentLoader);
+        m_client.updateCachedDocumentLoader(*documentLoader);
 
         auto action = NavigationAction { *m_frame.document(), documentLoader->request(), initiatedByMainFrame, loadType, false };
         action.setTargetBackForwardItem(item);
@@ -3910,19 +3912,19 @@ void FrameLoader::retryAfterFailedCacheOnlyMainResourceLoad()
 
 ResourceError FrameLoader::cancelledError(const ResourceRequest& request) const
 {
-    ResourceError error = m_client->cancelledError(request);
+    ResourceError error = m_client.cancelledError(request);
     error.setType(ResourceError::Type::Cancellation);
     return error;
 }
 
 ResourceError FrameLoader::blockedByContentBlockerError(const ResourceRequest& request) const
 {
-    return m_client->blockedByContentBlockerError(request);
+    return m_client.blockedByContentBlockerError(request);
 }
 
 ResourceError FrameLoader::blockedError(const ResourceRequest& request) const
 {
-    ResourceError error = m_client->blockedError(request);
+    ResourceError error = m_client.blockedError(request);
     error.setType(ResourceError::Type::Cancellation);
     return error;
 }
@@ -3930,7 +3932,7 @@ ResourceError FrameLoader::blockedError(const ResourceRequest& request) const
 #if ENABLE(CONTENT_FILTERING)
 ResourceError FrameLoader::blockedByContentFilterError(const ResourceRequest& request) const
 {
-    ResourceError error = m_client->blockedByContentFilterError(request);
+    ResourceError error = m_client.blockedByContentFilterError(request);
     error.setType(ResourceError::Type::General);
     return error;
 }
@@ -3939,7 +3941,7 @@ ResourceError FrameLoader::blockedByContentFilterError(const ResourceRequest& re
 #if PLATFORM(IOS_FAMILY)
 RetainPtr<CFDictionaryRef> FrameLoader::connectionProperties(ResourceLoader* loader)
 {
-    return m_client->connectionProperties(loader->documentLoader(), loader->identifier());
+    return m_client.connectionProperties(loader->documentLoader(), loader->identifier());
 }
 #endif
 
@@ -3973,7 +3975,7 @@ void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world)
     if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript) || !m_frame.windowProxy().existingJSWindowProxy(world))
         return;
 
-    m_client->dispatchDidClearWindowObjectInWorld(world);
+    m_client.dispatchDidClearWindowObjectInWorld(world);
 
     if (Page* page = m_frame.page())
         page->inspectorController().didClearWindowObjectInWorld(m_frame, world);
@@ -3986,7 +3988,7 @@ void FrameLoader::dispatchGlobalObjectAvailableInAllWorlds()
     Vector<Ref<DOMWrapperWorld>> worlds;
     ScriptController::getAllWorlds(worlds);
     for (auto& world : worlds)
-        m_client->dispatchGlobalObjectAvailable(world);
+        m_client.dispatchGlobalObjectAvailable(world);
 }
 
 SandboxFlags FrameLoader::effectiveSandboxFlags() const
@@ -4001,15 +4003,15 @@ SandboxFlags FrameLoader::effectiveSandboxFlags() const
 
 void FrameLoader::didChangeTitle(DocumentLoader* loader)
 {
-    m_client->didChangeTitle(loader);
+    m_client.didChangeTitle(loader);
 
     if (loader == m_documentLoader) {
         // Must update the entries in the back-forward list too.
         history().setCurrentItemTitle(loader->title());
         // This must go through the WebFrame because it has the right notion of the current b/f item.
-        m_client->setTitle(loader->title(), loader->urlForHistory());
-        m_client->setMainFrameDocumentReady(true); // update observers with new DOMDocument
-        m_client->dispatchDidReceiveTitle(loader->title());
+        m_client.setTitle(loader->title(), loader->urlForHistory());
+        m_client.setMainFrameDocumentReady(true); // update observers with new DOMDocument
+        m_client.dispatchDidReceiveTitle(loader->title());
     }
 
 #if ENABLE(REMOTE_INSPECTOR)
@@ -4023,7 +4025,7 @@ void FrameLoader::dispatchDidCommitLoad(Optional<HasInsecureContent> initialHasI
     if (m_stateMachine.creatingInitialEmptyDocument())
         return;
 
-    m_client->dispatchDidCommitLoad(initialHasInsecureContent, initialUsedLegacyTLS);
+    m_client.dispatchDidCommitLoad(initialHasInsecureContent, initialUsedLegacyTLS);
 
     if (m_frame.isMainFrame()) {
         m_frame.page()->resetSeenPlugins();
@@ -4060,7 +4062,7 @@ void FrameLoader::tellClientAboutPastMemoryCacheLoads()
             continue;
 
         ResourceRequest request(resource->url());
-        m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize());
+        m_client.dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, resource->response(), resource->encodedSize());
     }
 }
 
@@ -4077,7 +4079,7 @@ void FrameLoader::loadProgressingStatusChanged()
 
 void FrameLoader::completePageTransitionIfNeeded()
 {
-    m_client->completePageTransitionIfNeeded();
+    m_client.completePageTransitionIfNeeded();
 }
 
 void FrameLoader::clearTestingOverrides()
index 4301bb2..6a16766 100644 (file)
@@ -52,7 +52,6 @@
 #include <wtf/HashSet.h>
 #include <wtf/OptionSet.h>
 #include <wtf/Optional.h>
-#include <wtf/UniqueRef.h>
 #include <wtf/WallTime.h>
 
 namespace WebCore {
@@ -103,7 +102,7 @@ class FrameLoader final {
     WTF_MAKE_FAST_ALLOCATED;
     WTF_MAKE_NONCOPYABLE(FrameLoader);
 public:
-    FrameLoader(Frame&, UniqueRef<FrameLoaderClient>&&);
+    FrameLoader(Frame&, FrameLoaderClient&);
     ~FrameLoader();
 
     WEBCORE_EXPORT void init();
@@ -228,8 +227,7 @@ public:
     static void addHTTPUpgradeInsecureRequestsIfNeeded(ResourceRequest&);
     static void addSameSiteInfoToRequestIfNeeded(ResourceRequest&, const Document* initiator = nullptr);
 
-    const FrameLoaderClient& client() const { return m_client.get(); }
-    FrameLoaderClient& client() { return m_client.get(); }
+    FrameLoaderClient& client() const { return m_client; }
 
     WEBCORE_EXPORT Optional<PageIdentifier> pageID() const;
     WEBCORE_EXPORT Optional<FrameIdentifier> frameID() const;
@@ -426,7 +424,7 @@ private:
     bool shouldTreatCurrentLoadAsContinuingLoad() const { return m_currentLoadContinuingState != LoadContinuingState::NotContinuing; }
 
     Frame& m_frame;
-    UniqueRef<FrameLoaderClient> m_client;
+    FrameLoaderClient& m_client;
 
     const std::unique_ptr<PolicyChecker> m_policyChecker;
     const std::unique_ptr<HistoryController> m_history;
index b6253e7..cb96c24 100644 (file)
@@ -120,6 +120,8 @@ public:
 
     virtual ~FrameLoaderClient() = default;
 
+    virtual void frameLoaderDestroyed() = 0;
+
     virtual bool hasWebView() const = 0; // mainly for assertions
 
     virtual void makeRepresentation(DocumentLoader*) = 0;
@@ -236,20 +238,20 @@ public:
     virtual void didRunInsecureContent(SecurityOrigin&, const URL&) = 0;
     virtual void didDetectXSS(const URL&, bool didBlockEntirePage) = 0;
 
-    virtual ResourceError cancelledError(const ResourceRequest&) const = 0;
-    virtual ResourceError blockedError(const ResourceRequest&) const = 0;
-    virtual ResourceError blockedByContentBlockerError(const ResourceRequest&) const = 0;
-    virtual ResourceError cannotShowURLError(const ResourceRequest&) const = 0;
-    virtual ResourceError interruptedForPolicyChangeError(const ResourceRequest&) const = 0;
+    virtual ResourceError cancelledError(const ResourceRequest&) = 0;
+    virtual ResourceError blockedError(const ResourceRequest&) = 0;
+    virtual ResourceError blockedByContentBlockerError(const ResourceRequest&) = 0;
+    virtual ResourceError cannotShowURLError(const ResourceRequest&) = 0;
+    virtual ResourceError interruptedForPolicyChangeError(const ResourceRequest&) = 0;
 #if ENABLE(CONTENT_FILTERING)
-    virtual ResourceError blockedByContentFilterError(const ResourceRequest&) const = 0;
+    virtual ResourceError blockedByContentFilterError(const ResourceRequest&) = 0;
 #endif
 
-    virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&) const = 0;
-    virtual ResourceError fileDoesNotExistError(const ResourceResponse&) const = 0;
-    virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&) const = 0;
+    virtual ResourceError cannotShowMIMETypeError(const ResourceResponse&) = 0;
+    virtual ResourceError fileDoesNotExistError(const ResourceResponse&) = 0;
+    virtual ResourceError pluginWillHandleLoadError(const ResourceResponse&) = 0;
 
-    virtual bool shouldFallBack(const ResourceError&) const = 0;
+    virtual bool shouldFallBack(const ResourceError&) = 0;
 
     virtual bool canHandleRequest(const ResourceRequest&) const = 0;
     virtual bool canShowMIMEType(const String& MIMEType) const = 0;
@@ -268,7 +270,7 @@ public:
     virtual void updateCachedDocumentLoader(DocumentLoader&) = 0;
     virtual void setTitle(const StringWithDirection&, const URL&) = 0;
 
-    virtual String userAgent(const URL&) const = 0;
+    virtual String userAgent(const URL&) = 0;
 
     virtual String overrideContentSecurityPolicy() const { return String(); }
     
index eca5141..cd218b6 100644 (file)
@@ -143,12 +143,12 @@ static inline float parentTextZoomFactor(Frame* frame)
     return parent->textZoomFactor();
 }
 
-Frame::Frame(Page& page, HTMLFrameOwnerElement* ownerElement, UniqueRef<FrameLoaderClient>&& frameLoaderClient)
+Frame::Frame(Page& page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient& frameLoaderClient)
     : m_mainFrame(ownerElement ? page.mainFrame() : *this)
     , m_page(&page)
     , m_settings(&page.settings())
     , m_treeNode(*this, parentFromOwnerElement(ownerElement))
-    , m_loader(makeUniqueRef<FrameLoader>(*this, WTFMove(frameLoaderClient)))
+    , m_loader(makeUniqueRef<FrameLoader>(*this, frameLoaderClient))
     , m_navigationScheduler(makeUniqueRef<NavigationScheduler>(*this))
     , m_ownerElement(ownerElement)
     , m_script(makeUniqueRef<ScriptController>(*this))
@@ -182,10 +182,11 @@ void Frame::init()
     m_loader->init();
 }
 
-Ref<Frame> Frame::create(Page* page, HTMLFrameOwnerElement* ownerElement, UniqueRef<FrameLoaderClient>&& client)
+Ref<Frame> Frame::create(Page* page, HTMLFrameOwnerElement* ownerElement, FrameLoaderClient* client)
 {
     ASSERT(page);
-    return adoptRef(*new Frame(*page, ownerElement, WTFMove(client)));
+    ASSERT(client);
+    return adoptRef(*new Frame(*page, ownerElement, *client));
 }
 
 Frame::~Frame()
index 6fdfa68..9a4cfd9 100644 (file)
@@ -126,7 +126,7 @@ typedef unsigned LayerTreeFlags;
 // FIXME: Rename Frame to LocalFrame and AbstractFrame to Frame.
 class Frame final : public AbstractFrame {
 public:
-    WEBCORE_EXPORT static Ref<Frame> create(Page*, HTMLFrameOwnerElement*, UniqueRef<FrameLoaderClient>&&);
+    WEBCORE_EXPORT static Ref<Frame> create(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
 
     WEBCORE_EXPORT void init();
 #if PLATFORM(IOS_FAMILY)
@@ -307,7 +307,7 @@ public:
 private:
     friend class NavigationDisabler;
 
-    Frame(Page&, HTMLFrameOwnerElement*, UniqueRef<FrameLoaderClient>&&);
+    Frame(Page&, HTMLFrameOwnerElement*, FrameLoaderClient&);
 
     void dropChildren();
 
index 8088788..8310d33 100644 (file)
@@ -231,7 +231,7 @@ Page::Page(PageConfiguration&& pageConfiguration)
     , m_settings(Settings::create(this))
     , m_progress(makeUnique<ProgressTracker>(WTFMove(pageConfiguration.progressTrackerClient)))
     , m_backForwardController(makeUnique<BackForwardController>(*this, WTFMove(pageConfiguration.backForwardClient)))
-    , m_mainFrame(Frame::create(this, nullptr, WTFMove(pageConfiguration.loaderClientForMainFrame)))
+    , m_mainFrame(Frame::create(this, nullptr, pageConfiguration.loaderClientForMainFrame))
     , m_editorClient(WTFMove(pageConfiguration.editorClient))
     , m_plugInClient(WTFMove(pageConfiguration.plugInClient))
     , m_validationMessageClient(WTFMove(pageConfiguration.validationMessageClient))
index c971765..338f4e7 100644 (file)
@@ -56,7 +56,7 @@
 
 namespace WebCore {
 
-PageConfiguration::PageConfiguration(PAL::SessionID sessionID, UniqueRef<EditorClient>&& editorClient, Ref<SocketProvider>&& socketProvider, UniqueRef<LibWebRTCProvider>&& libWebRTCProvider, Ref<CacheStorageProvider>&& cacheStorageProvider, Ref<BackForwardClient>&& backForwardClient, Ref<CookieJar>&& cookieJar, UniqueRef<ProgressTrackerClient>&& progressTrackerClient, UniqueRef<FrameLoaderClient>&& loaderClientForMainFrame, UniqueRef<MediaRecorderProvider>&& mediaRecorderProvider)
+PageConfiguration::PageConfiguration(PAL::SessionID sessionID, UniqueRef<EditorClient>&& editorClient, Ref<SocketProvider>&& socketProvider, UniqueRef<LibWebRTCProvider>&& libWebRTCProvider, Ref<CacheStorageProvider>&& cacheStorageProvider, Ref<BackForwardClient>&& backForwardClient, Ref<CookieJar>&& cookieJar, UniqueRef<ProgressTrackerClient>&& progressTrackerClient, UniqueRef<MediaRecorderProvider>&& mediaRecorderProvider)
     : sessionID(sessionID)
     , editorClient(WTFMove(editorClient))
     , socketProvider(WTFMove(socketProvider))
@@ -64,7 +64,6 @@ PageConfiguration::PageConfiguration(PAL::SessionID sessionID, UniqueRef<EditorC
     , progressTrackerClient(WTFMove(progressTrackerClient))
     , backForwardClient(WTFMove(backForwardClient))
     , cookieJar(WTFMove(cookieJar))
-    , loaderClientForMainFrame(WTFMove(loaderClientForMainFrame))
     , cacheStorageProvider(WTFMove(cacheStorageProvider))
     , mediaRecorderProvider(WTFMove(mediaRecorderProvider))
 {
index 369f063..abd85a1 100644 (file)
@@ -71,7 +71,7 @@ class SpeechSynthesisClient;
 class PageConfiguration {
     WTF_MAKE_NONCOPYABLE(PageConfiguration); WTF_MAKE_FAST_ALLOCATED;
 public:
-    WEBCORE_EXPORT PageConfiguration(PAL::SessionID, UniqueRef<EditorClient>&&, Ref<SocketProvider>&&, UniqueRef<LibWebRTCProvider>&&, Ref<CacheStorageProvider>&&, Ref<BackForwardClient>&&, Ref<CookieJar>&&, UniqueRef<ProgressTrackerClient>&&, UniqueRef<FrameLoaderClient>&&, UniqueRef<MediaRecorderProvider>&&);
+    WEBCORE_EXPORT PageConfiguration(PAL::SessionID, UniqueRef<EditorClient>&&, Ref<SocketProvider>&&, UniqueRef<LibWebRTCProvider>&&, Ref<CacheStorageProvider>&&, Ref<BackForwardClient>&&, Ref<CookieJar>&&, UniqueRef<ProgressTrackerClient>&&, UniqueRef<MediaRecorderProvider>&&);
     WEBCORE_EXPORT ~PageConfiguration();
     PageConfiguration(PageConfiguration&&);
 
@@ -104,7 +104,7 @@ public:
     Ref<BackForwardClient> backForwardClient;
     Ref<CookieJar> cookieJar;
     std::unique_ptr<ValidationMessageClient> validationMessageClient;
-    UniqueRef<FrameLoaderClient> loaderClientForMainFrame;
+    FrameLoaderClient* loaderClientForMainFrame { nullptr };
     std::unique_ptr<DiagnosticLoggingClient> diagnosticLoggingClient;
     std::unique_ptr<PerformanceLoggingClient> performanceLoggingClient;
 #if ENABLE(WEBGL)
index 19eedea..19132da 100644 (file)
@@ -182,6 +182,17 @@ void SWContextManager::stopAllServiceWorkers()
         stopWorker(serviceWorker, workerTerminationTimeout, [] { });
 }
 
+void SWContextManager::addServiceWorkerFrameLoaderClient(std::unique_ptr<FrameLoaderClient>&& client)
+{
+    m_serviceWorkerFrameLoaderClients.add(WTFMove(client));
+}
+
+void SWContextManager::removeServiceWorkerFrameLoaderClient(FrameLoaderClient& client)
+{
+    ASSERT(m_serviceWorkerFrameLoaderClients.contains(&client));
+    m_serviceWorkerFrameLoaderClients.remove(&client);
+}
+
 } // namespace WebCore
 
 #endif
index 829b9e4..c6f2b0a 100644 (file)
@@ -37,6 +37,7 @@
 
 namespace WebCore {
 
+class FrameLoaderClient;
 class SerializedScriptValue;
 class ServiceWorkerGlobalScope;
 
@@ -102,6 +103,9 @@ public:
 
     WEBCORE_EXPORT void stopAllServiceWorkers();
 
+    WEBCORE_EXPORT void addServiceWorkerFrameLoaderClient(std::unique_ptr<FrameLoaderClient>&&);
+    WEBCORE_EXPORT void removeServiceWorkerFrameLoaderClient(FrameLoaderClient&);
+
     static constexpr Seconds workerTerminationTimeout { 10_s };
     static constexpr Seconds syncWorkerTerminationTimeout { 100_ms }; // Only used by layout tests.
 
@@ -126,6 +130,7 @@ private:
         Timer m_timeoutTimer;
     };
     HashMap<ServiceWorkerIdentifier, std::unique_ptr<ServiceWorkerTerminationRequest>> m_pendingServiceWorkerTerminationRequests;
+    HashSet<std::unique_ptr<FrameLoaderClient>> m_serviceWorkerFrameLoaderClients;
 };
 
 } // namespace WebCore
index 417f690..7ca1150 100644 (file)
@@ -1,3 +1,17 @@
+2020-03-17  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, reverting r258339.
+        https://bugs.webkit.org/show_bug.cgi?id=209179
+
+        "Is it sometimes breaking rendering" (Requested by youenn on
+        #webkit).
+
+        Reverted changeset:
+
+        "FrameLoader should own its FrameLoaderClient"
+        https://bugs.webkit.org/show_bug.cgi?id=208918
+        https://trac.webkit.org/changeset/258339
+
 2020-03-16  Simon Fraser  <simon.fraser@apple.com>
 
         Add a bit more UIHitTesting logging, and make it possible to dump EventRegions from WebKit
index 5a369f5..446eb53 100644 (file)
@@ -243,8 +243,11 @@ bool WebLoaderStrategy::tryLoadingUsingURLSchemeHandler(ResourceLoader& resource
     if (!webFrameLoaderClient)
         return false;
 
-    auto& webFrame = webFrameLoaderClient->webFrame();
-    auto* webPage = webFrame.page();
+    auto* webFrame = webFrameLoaderClient->webFrame();
+    if (!webFrame)
+        return false;
+
+    auto* webPage = webFrame->page();
     if (!webPage)
         return false;
 
@@ -255,7 +258,7 @@ bool WebLoaderStrategy::tryLoadingUsingURLSchemeHandler(ResourceLoader& resource
     LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, URL '%s' will be handled by a UIProcess URL scheme handler.", resourceLoader.url().string().utf8().data());
     WEBLOADERSTRATEGY_RELEASE_LOG_IF_ALLOWED("tryLoadingUsingURLSchemeHandler: URL will be handled by a UIProcess URL scheme handler");
 
-    handler->startNewTask(resourceLoader, webFrame);
+    handler->startNewTask(resourceLoader, *webFrame);
     return true;
 }
 
@@ -327,7 +330,7 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL
     }
     
     auto* webFrameLoaderClient = frame ? toWebFrameLoaderClient(frame->loader().client()) : nullptr;
-    auto* webFrame = webFrameLoaderClient ? &webFrameLoaderClient->webFrame() : nullptr;
+    auto* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
     auto* webPage = webFrame ? webFrame->page() : nullptr;
     if (webPage)
         loadParameters.isNavigatingToAppBoundDomain = webPage->isNavigatingToAppBoundDomain();
@@ -530,7 +533,7 @@ static bool shouldClearReferrerOnHTTPSToHTTPRedirect(Frame* frame)
 Optional<WebLoaderStrategy::SyncLoadResult> WebLoaderStrategy::tryLoadingSynchronouslyUsingURLSchemeHandler(FrameLoader& frameLoader, ResourceLoadIdentifier identifier, const ResourceRequest& request)
 {
     auto* webFrameLoaderClient = toWebFrameLoaderClient(frameLoader.client());
-    auto* webFrame = webFrameLoaderClient ? &webFrameLoaderClient->webFrame() : nullptr;
+    auto* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
     auto* webPage = webFrame ? webFrame->page() : nullptr;
     if (!webPage)
         return WTF::nullopt;
@@ -550,7 +553,7 @@ Optional<WebLoaderStrategy::SyncLoadResult> WebLoaderStrategy::tryLoadingSynchro
 void WebLoaderStrategy::loadResourceSynchronously(FrameLoader& frameLoader, unsigned long resourceLoadIdentifier, const ResourceRequest& request, ClientCredentialPolicy clientCredentialPolicy,  const FetchOptions& options, const HTTPHeaderMap& originalRequestHeaders, ResourceError& error, ResourceResponse& response, Vector<char>& data)
 {
     auto* webFrameLoaderClient = toWebFrameLoaderClient(frameLoader.client());
-    auto* webFrame = webFrameLoaderClient ? &webFrameLoaderClient->webFrame() : nullptr;
+    auto* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
     auto* webPage = webFrame ? webFrame->page() : nullptr;
     auto* page = webPage ? webPage->corePage() : nullptr;
 
@@ -683,7 +686,7 @@ void WebLoaderStrategy::startPingLoad(Frame& frame, ResourceRequest& request, co
     addParametersShared(&frame, loadParameters);
     
     auto* webFrameLoaderClient = toWebFrameLoaderClient(frame.loader().client());
-    auto* webFrame = webFrameLoaderClient ? &webFrameLoaderClient->webFrame() : nullptr;
+    auto* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
     auto* webPage = webFrame ? webFrame->page() : nullptr;
     if (webPage)
         loadParameters.isNavigatingToAppBoundDomain = webPage->isNavigatingToAppBoundDomain();
@@ -715,14 +718,18 @@ void WebLoaderStrategy::preconnectTo(FrameLoader& frameLoader, const URL& url, S
         completionHandler(internalError(url));
         return;
     }
-    auto& webFrame = webFrameLoaderClient->webFrame();
-    auto* webPage = webFrame.page();
+    auto* webFrame = webFrameLoaderClient->webFrame();
+    if (!webFrame) {
+        completionHandler(internalError(url));
+        return;
+    }
+    auto* webPage = webFrame->page();
     if (!webPage) {
         completionHandler(internalError(url));
         return;
     }
 
-    preconnectTo(ResourceRequest { url }, *webPage, webFrame, storedCredentialsPolicy, WTFMove(completionHandler));
+    preconnectTo(ResourceRequest { url }, *webPage, *webFrame, storedCredentialsPolicy, WTFMove(completionHandler));
 }
 
 void WebLoaderStrategy::preconnectTo(WebCore::ResourceRequest&& request, WebPage& webPage, WebFrame& webFrame, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, PreconnectCompletionHandler&& completionHandler)
index 9c0b569..bd44fc5 100644 (file)
@@ -73,6 +73,14 @@ using namespace PAL;
 using namespace WebCore;
 
 
+ServiceWorkerFrameLoaderClient& ServiceWorkerFrameLoaderClient::create(WebPageProxyIdentifier webPageProxyID, PageIdentifier pageID, FrameIdentifier frameID, const String& userAgent)
+{
+    auto frameLoaderClient = std::unique_ptr<ServiceWorkerFrameLoaderClient>(new ServiceWorkerFrameLoaderClient(webPageProxyID, pageID, frameID, userAgent));
+    auto& client = *frameLoaderClient;
+    SWContextManager::singleton().addServiceWorkerFrameLoaderClient(WTFMove(frameLoaderClient));
+    return client;
+}
+
 ServiceWorkerFrameLoaderClient::ServiceWorkerFrameLoaderClient(WebPageProxyIdentifier webPageProxyID, PageIdentifier pageID, FrameIdentifier frameID, const String& userAgent)
     : m_webPageProxyID(webPageProxyID)
     , m_pageID(pageID)
@@ -81,6 +89,11 @@ ServiceWorkerFrameLoaderClient::ServiceWorkerFrameLoaderClient(WebPageProxyIdent
 {
 }
 
+void ServiceWorkerFrameLoaderClient::frameLoaderDestroyed()
+{
+    SWContextManager::singleton().removeServiceWorkerFrameLoaderClient(*this);
+}
+
 Ref<DocumentLoader> ServiceWorkerFrameLoaderClient::createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData)
 {
     return WebDocumentLoader::create(request, substituteData);
@@ -149,7 +162,7 @@ void WebSWContextManagerConnection::installServiceWorker(const ServiceWorkerCont
     if (effectiveUserAgent.isNull())
         effectiveUserAgent = m_userAgent;
 
-    pageConfiguration.loaderClientForMainFrame = makeUniqueRef<ServiceWorkerFrameLoaderClient>(m_webPageProxyID, m_pageID, FrameIdentifier::generate(), effectiveUserAgent);
+    pageConfiguration.loaderClientForMainFrame = &ServiceWorkerFrameLoaderClient::create(m_webPageProxyID, m_pageID, FrameIdentifier::generate(), effectiveUserAgent);
 
     auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, WTFMove(effectiveUserAgent), WebProcess::singleton().cacheStorageProvider(), m_storageBlockingPolicy);
     SWContextManager::singleton().registerServiceWorkerThreadForInstall(WTFMove(serviceWorkerThreadProxy));
index 6d8c876..ec1e83a 100644 (file)
@@ -117,22 +117,26 @@ private:
 
 class ServiceWorkerFrameLoaderClient final : public WebCore::EmptyFrameLoaderClient {
 public:
-    ServiceWorkerFrameLoaderClient(WebPageProxyIdentifier, WebCore::PageIdentifier, WebCore::FrameIdentifier, const String& userAgent);
+    static ServiceWorkerFrameLoaderClient& create(WebPageProxyIdentifier, WebCore::PageIdentifier, WebCore::FrameIdentifier, const String& userAgent);
 
     WebPageProxyIdentifier webPageProxyID() const { return m_webPageProxyID; }
 
     void setUserAgent(String&& userAgent) { m_userAgent = WTFMove(userAgent); }
 
 private:
+    ServiceWorkerFrameLoaderClient(WebPageProxyIdentifier, WebCore::PageIdentifier, WebCore::FrameIdentifier, const String& userAgent);
+
     Ref<WebCore::DocumentLoader> createDocumentLoader(const WebCore::ResourceRequest&, const WebCore::SubstituteData&) final;
 
+    void frameLoaderDestroyed() final;
+
     Optional<WebCore::PageIdentifier> pageID() const final { return m_pageID; }
     Optional<WebCore::FrameIdentifier> frameID() const final { return m_frameID; }
 
     bool shouldUseCredentialStorage(WebCore::DocumentLoader*, unsigned long) final { return true; }
     bool isServiceWorkerFrameLoaderClient() const final { return true; }
 
-    String userAgent(const URL&) const final { return m_userAgent; }
+    String userAgent(const URL&) final { return m_userAgent; }
 
     WebPageProxyIdentifier m_webPageProxyID;
     WebCore::PageIdentifier m_pageID;
index 0e87561..7c97c0f 100644 (file)
@@ -96,9 +96,9 @@
 #include <wtf/ProcessPrivilege.h>
 
 #define PREFIX_PARAMETERS "%p - [webFrame=%p, webFrameID=%" PRIu64 ", webPage=%p, webPageID=%" PRIu64 "] WebFrameLoaderClient::"
-#define WEBFRAME (&webFrame())
-#define WEBFRAMEID (webFrame().frameID().toUInt64())
-#define WEBPAGE (webFrame().page())
+#define WEBFRAME (webFrame())
+#define WEBFRAMEID (WEBFRAME ? WEBFRAME->frameID().toUInt64() : 0)
+#define WEBPAGE (WEBFRAME ? WEBFRAME->page() : nullptr)
 #define WEBPAGEID (WEBPAGE ? WEBPAGE->identifier().toUInt64() : 0)
 
 #define WEBFRAMELOADERCLIENT_RELEASE_LOG(channel, fmt, ...) RELEASE_LOG(channel, PREFIX_PARAMETERS fmt, this, WEBFRAME, WEBFRAMEID, WEBPAGE, WEBPAGEID, ##__VA_ARGS__)
 namespace WebKit {
 using namespace WebCore;
 
-WebFrameLoaderClient::WebFrameLoaderClient(Ref<WebFrame>&& frame)
-    : m_frame(WTFMove(frame))
+WebFrameLoaderClient::WebFrameLoaderClient()
+    : m_frame(0)
+    , m_hasSentResponseToPluginView(false)
+    , m_didCompletePageTransition(false)
+    , m_frameHasCustomContentProvider(false)
+    , m_frameCameFromBackForwardCache(false)
 {
 }
 
 WebFrameLoaderClient::~WebFrameLoaderClient()
 {
-    m_frame->invalidate();
 }
 
 Optional<WebPageProxyIdentifier> WebFrameLoaderClient::webPageProxyID() const
 {
-    if (m_frame->page())
+    if (m_frame && m_frame->page())
         return m_frame->page()->webPageProxyIdentifier();
 
     return WTF::nullopt;
@@ -128,7 +131,7 @@ Optional<WebPageProxyIdentifier> WebFrameLoaderClient::webPageProxyID() const
 
 Optional<PageIdentifier> WebFrameLoaderClient::pageID() const
 {
-    if (m_frame->page())
+    if (m_frame && m_frame->page())
         return m_frame->page()->identifier();
 
     return WTF::nullopt;
@@ -136,7 +139,10 @@ Optional<PageIdentifier> WebFrameLoaderClient::pageID() const
 
 Optional<FrameIdentifier> WebFrameLoaderClient::frameID() const
 {
-    return m_frame->frameID();
+    if (m_frame)
+        return m_frame->frameID();
+
+    return WTF::nullopt;
 }
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -158,6 +164,14 @@ void WebFrameLoaderClient::didLoadFromRegistrableDomain(RegistrableDomain&& doma
 
 #endif
 
+void WebFrameLoaderClient::frameLoaderDestroyed()
+{
+    m_frame->invalidate();
+
+    // Balances explicit ref() in WebFrame::create().
+    m_frame->deref();
+}
+
 bool WebFrameLoaderClient::hasHTMLView() const
 {
     return !m_frameHasCustomContentProvider;
@@ -200,7 +214,7 @@ void WebFrameLoaderClient::detachedFromParent2()
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didRemoveFrameFromHierarchy(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didRemoveFrameFromHierarchy(*webPage, *m_frame, userData);
 }
 
 void WebFrameLoaderClient::detachedFromParent3()
@@ -218,7 +232,7 @@ void WebFrameLoaderClient::assignIdentifierToInitialRequest(unsigned long identi
     if (FrameLoader* frameLoader = loader ? loader->frameLoader() : nullptr)
         pageIsProvisionallyLoading = frameLoader->provisionalDocumentLoader() == loader;
 
-    webPage->injectedBundleResourceLoadClient().didInitiateLoadForResource(*webPage, m_frame, identifier, request, pageIsProvisionallyLoading);
+    webPage->injectedBundleResourceLoadClient().didInitiateLoadForResource(*webPage, *m_frame, identifier, request, pageIsProvisionallyLoading);
     webPage->addResourceRequest(identifier, request);
 }
 
@@ -231,7 +245,7 @@ void WebFrameLoaderClient::dispatchWillSendRequest(DocumentLoader*, unsigned lon
     // The API can return a completely new request. We should ensure that at least the requester
     // is kept, so that if this is a main resource load it's still considered as such.
     auto requester = request.requester();
-    webPage->injectedBundleResourceLoadClient().willSendRequestForFrame(*webPage, m_frame, identifier, request, redirectResponse);
+    webPage->injectedBundleResourceLoadClient().willSendRequestForFrame(*webPage, *m_frame, identifier, request, redirectResponse);
     if (!request.isNull())
         request.setRequester(requester);
 }
@@ -242,7 +256,7 @@ bool WebFrameLoaderClient::shouldUseCredentialStorage(DocumentLoader*, unsigned
     if (!webPage)
         return true;
 
-    return webPage->injectedBundleResourceLoadClient().shouldUseCredentialStorage(*webPage, m_frame, identifier);
+    return webPage->injectedBundleResourceLoadClient().shouldUseCredentialStorage(*webPage, *m_frame, identifier);
 }
 
 void WebFrameLoaderClient::dispatchDidReceiveAuthenticationChallenge(DocumentLoader*, unsigned long, const AuthenticationChallenge&)
@@ -265,7 +279,7 @@ void WebFrameLoaderClient::dispatchDidReceiveResponse(DocumentLoader*, unsigned
     if (!webPage)
         return;
 
-    webPage->injectedBundleResourceLoadClient().didReceiveResponseForResource(*webPage, m_frame, identifier, response);
+    webPage->injectedBundleResourceLoadClient().didReceiveResponseForResource(*webPage, *m_frame, identifier, response);
 }
 
 void WebFrameLoaderClient::dispatchDidReceiveContentLength(DocumentLoader*, unsigned long identifier, int dataLength)
@@ -274,7 +288,7 @@ void WebFrameLoaderClient::dispatchDidReceiveContentLength(DocumentLoader*, unsi
     if (!webPage)
         return;
 
-    webPage->injectedBundleResourceLoadClient().didReceiveContentLengthForResource(*webPage, m_frame, identifier, dataLength);
+    webPage->injectedBundleResourceLoadClient().didReceiveContentLengthForResource(*webPage, *m_frame, identifier, dataLength);
 }
 
 #if ENABLE(DATA_DETECTION)
@@ -293,7 +307,7 @@ void WebFrameLoaderClient::dispatchDidFinishLoading(DocumentLoader*, unsigned lo
     if (!webPage)
         return;
 
-    webPage->injectedBundleResourceLoadClient().didFinishLoadForResource(*webPage, m_frame, identifier);
+    webPage->injectedBundleResourceLoadClient().didFinishLoadForResource(*webPage, *m_frame, identifier);
     webPage->removeResourceRequest(identifier);
 }
 
@@ -303,7 +317,7 @@ void WebFrameLoaderClient::dispatchDidFailLoading(DocumentLoader*, unsigned long
     if (!webPage)
         return;
 
-    webPage->injectedBundleResourceLoadClient().didFailLoadForResource(*webPage, m_frame, identifier, error);
+    webPage->injectedBundleResourceLoadClient().didFailLoadForResource(*webPage, *m_frame, identifier, error);
     webPage->removeResourceRequest(identifier);
 }
 
@@ -320,7 +334,7 @@ void WebFrameLoaderClient::dispatchDidDispatchOnloadEvents()
         return;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didHandleOnloadEventsForFrame(*webPage, m_frame);
+    webPage->injectedBundleLoaderClient().didHandleOnloadEventsForFrame(*webPage, *m_frame);
 }
 
 void WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad()
@@ -340,7 +354,7 @@ void WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad()
     LOG(Loading, "WebProcess %i - dispatchDidReceiveServerRedirectForProvisionalLoad to request url %s", getCurrentProcessID(), documentLoader->request().url().string().utf8().data());
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didReceiveServerRedirectForProvisionalLoadForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didReceiveServerRedirectForProvisionalLoadForFrame(*webPage, *m_frame, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidReceiveServerRedirectForProvisionalLoadForFrame(m_frame->frameID(), documentLoader->navigationID(), documentLoader->request(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -363,7 +377,7 @@ void WebFrameLoaderClient::dispatchDidCancelClientRedirect()
         return;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didCancelClientRedirectForFrame(*webPage, m_frame);
+    webPage->injectedBundleLoaderClient().didCancelClientRedirectForFrame(*webPage, *m_frame);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidCancelClientRedirectForFrame(m_frame->frameID()));
@@ -376,7 +390,7 @@ void WebFrameLoaderClient::dispatchWillPerformClientRedirect(const URL& url, dou
         return;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().willPerformClientRedirectForFrame(*webPage, m_frame, url, interval, fireDate);
+    webPage->injectedBundleLoaderClient().willPerformClientRedirectForFrame(*webPage, *m_frame, url, interval, fireDate);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::WillPerformClientRedirectForFrame(m_frame->frameID(), url.string(), interval, lockBackForwardList));
@@ -393,7 +407,7 @@ void WebFrameLoaderClient::dispatchDidChangeLocationWithinPage()
     auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, m_frame, SameDocumentNavigationAnchorNavigation, userData);
+    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, *m_frame, SameDocumentNavigationAnchorNavigation, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -437,7 +451,7 @@ void WebFrameLoaderClient::dispatchDidPushStateWithinPage()
     auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, m_frame, SameDocumentNavigationSessionStatePush, userData);
+    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, *m_frame, SameDocumentNavigationSessionStatePush, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -454,7 +468,7 @@ void WebFrameLoaderClient::dispatchDidReplaceStateWithinPage()
     auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, m_frame, SameDocumentNavigationSessionStateReplace, userData);
+    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, *m_frame, SameDocumentNavigationSessionStateReplace, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -471,7 +485,7 @@ void WebFrameLoaderClient::dispatchDidPopStateWithinPage()
     auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, m_frame, SameDocumentNavigationSessionStatePop, userData);
+    webPage->injectedBundleLoaderClient().didSameDocumentNavigationForFrame(*webPage, *m_frame, SameDocumentNavigationSessionStatePop, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), navigationID, SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -505,14 +519,14 @@ void WebFrameLoaderClient::dispatchDidStartProvisionalLoad()
 #endif
 
     webPage->findController().hideFindUI();
-    webPage->sandboxExtensionTracker().didStartProvisionalLoad(m_frame.ptr());
+    webPage->sandboxExtensionTracker().didStartProvisionalLoad(m_frame);
 
     WebDocumentLoader& provisionalLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().provisionalDocumentLoader());
     auto& url = provisionalLoader.url();
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didStartProvisionalLoadForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didStartProvisionalLoadForFrame(*webPage, *m_frame, userData);
 
     auto& unreachableURL = provisionalLoader.unreachableURL();
 
@@ -534,7 +548,7 @@ void WebFrameLoaderClient::dispatchDidReceiveTitle(const StringWithDirection& ti
 
     // Notify the bundle client.
     // FIXME: Use direction of title.
-    webPage->injectedBundleLoaderClient().didReceiveTitleForFrame(*webPage, truncatedTitle.string, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didReceiveTitleForFrame(*webPage, truncatedTitle.string, *m_frame, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidReceiveTitleForFrame(m_frame->frameID(), truncatedTitle.string, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -550,9 +564,9 @@ void WebFrameLoaderClient::dispatchDidCommitLoad(Optional<HasInsecureContent> ha
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didCommitLoadForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didCommitLoadForFrame(*webPage, *m_frame, userData);
 
-    webPage->sandboxExtensionTracker().didCommitProvisionalLoad(m_frame.ptr());
+    webPage->sandboxExtensionTracker().didCommitProvisionalLoad(m_frame);
 
     bool usedLegacyTLS = documentLoader.response().usedLegacyTLS();
     if (!usedLegacyTLS && usedLegacyTLSFromPageCache)
@@ -560,7 +574,7 @@ void WebFrameLoaderClient::dispatchDidCommitLoad(Optional<HasInsecureContent> ha
     
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidCommitLoadForFrame(m_frame->frameID(), m_frame->info(), documentLoader.request(), documentLoader.navigationID(), documentLoader.response().mimeType(), m_frameHasCustomContentProvider, static_cast<uint32_t>(m_frame->coreFrame()->loader().loadType()), valueOrCompute(documentLoader.response().certificateInfo(), [] { return CertificateInfo(); }), usedLegacyTLS, m_frame->coreFrame()->document()->isPluginDocument(), hasInsecureContent, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
-    webPage->didCommitLoad(m_frame.ptr());
+    webPage->didCommitLoad(m_frame);
 }
 
 void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& error, WillContinueLoading willContinueLoading)
@@ -574,9 +588,9 @@ void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& e
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didFailProvisionalLoadWithErrorForFrame(*webPage, m_frame, error, userData);
+    webPage->injectedBundleLoaderClient().didFailProvisionalLoadWithErrorForFrame(*webPage, *m_frame, error, userData);
 
-    webPage->sandboxExtensionTracker().didFailProvisionalLoad(m_frame.ptr());
+    webPage->sandboxExtensionTracker().didFailProvisionalLoad(m_frame);
 
     // FIXME: This is gross. This is necessary because if the client calls WKBundlePageStopLoading() from within the didFailProvisionalLoadWithErrorForFrame
     // injected bundle client call, that will cause the provisional DocumentLoader to be disconnected from the Frame, and didDistroyNavigation message
@@ -599,7 +613,7 @@ void WebFrameLoaderClient::dispatchDidFailProvisionalLoad(const ResourceError& e
 
     // If we have a load listener, notify it.
     if (WebFrame::LoadListener* loadListener = m_frame->loadListener())
-        loadListener->didFailLoad(m_frame.ptr(), error.isCancellation());
+        loadListener->didFailLoad(m_frame, error.isCancellation());
 }
 
 void WebFrameLoaderClient::dispatchDidFailLoad(const ResourceError& error)
@@ -616,14 +630,14 @@ void WebFrameLoaderClient::dispatchDidFailLoad(const ResourceError& error)
     auto navigationID = documentLoader.navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didFailLoadWithErrorForFrame(*webPage, m_frame, error, userData);
+    webPage->injectedBundleLoaderClient().didFailLoadWithErrorForFrame(*webPage, *m_frame, error, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidFailLoadForFrame(m_frame->frameID(), m_frame->info(), documentLoader.request(), navigationID, error, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 
     // If we have a load listener, notify it.
     if (WebFrame::LoadListener* loadListener = m_frame->loadListener())
-        loadListener->didFailLoad(m_frame.ptr(), error.isCancellation());
+        loadListener->didFailLoad(m_frame, error.isCancellation());
 }
 
 void WebFrameLoaderClient::dispatchDidFinishDocumentLoad()
@@ -637,12 +651,12 @@ void WebFrameLoaderClient::dispatchDidFinishDocumentLoad()
     auto navigationID = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader()).navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didFinishDocumentLoadForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didFinishDocumentLoadForFrame(*webPage, *m_frame, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidFinishDocumentLoadForFrame(m_frame->frameID(), navigationID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 
-    webPage->didFinishDocumentLoad(m_frame);
+    webPage->didFinishDocumentLoad(*m_frame);
 }
 
 void WebFrameLoaderClient::dispatchDidFinishLoad()
@@ -657,16 +671,16 @@ void WebFrameLoaderClient::dispatchDidFinishLoad()
     auto navigationID = documentLoader.navigationID();
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didFinishLoadForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didFinishLoadForFrame(*webPage, *m_frame, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::DidFinishLoadForFrame(m_frame->frameID(), m_frame->info(), documentLoader.request(), navigationID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 
     // If we have a load listener, notify it.
     if (WebFrame::LoadListener* loadListener = m_frame->loadListener())
-        loadListener->didFinishLoad(m_frame.ptr());
+        loadListener->didFinishLoad(m_frame);
 
-    webPage->didFinishLoad(m_frame);
+    webPage->didFinishLoad(*m_frame);
 }
 
 void WebFrameLoaderClient::completePageTransitionIfNeeded()
@@ -696,12 +710,12 @@ void WebFrameLoaderClient::dispatchDidReachLayoutMilestone(OptionSet<WebCore::La
 
         // FIXME: We should consider removing the old didFirstLayout API since this is doing double duty with the
         // new didLayout API.
-        webPage->injectedBundleLoaderClient().didFirstLayoutForFrame(*webPage, m_frame, userData);
+        webPage->injectedBundleLoaderClient().didFirstLayoutForFrame(*webPage, *m_frame, userData);
         webPage->send(Messages::WebPageProxy::DidFirstLayoutForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 
 #if USE(COORDINATED_GRAPHICS)
         // Make sure viewport properties are dispatched on the main frame by the time the first layout happens.
-        ASSERT(!webPage->useFixedLayout() || m_frame.ptr() != m_frame->page()->mainWebFrame() || m_frame->coreFrame()->document()->didDispatchViewportPropertiesChanged());
+        ASSERT(!webPage->useFixedLayout() || m_frame != m_frame->page()->mainWebFrame() || m_frame->coreFrame()->document()->didDispatchViewportPropertiesChanged());
 #endif
     }
 
@@ -735,7 +749,7 @@ void WebFrameLoaderClient::dispatchDidReachLayoutMilestone(OptionSet<WebCore::La
         ASSERT(!m_frame->isMainFrame() || webPage->corePage()->settings().suppressesIncrementalRendering() || m_didCompletePageTransition);
         // FIXME: We should consider removing the old didFirstVisuallyNonEmptyLayoutForFrame API since this is doing double duty with the new didLayout API.
         WEBFRAMELOADERCLIENT_RELEASE_LOG(Layout, "dispatchDidReachLayoutMilestone: dispatching DidFirstVisuallyNonEmptyLayoutForFrame");
-        webPage->injectedBundleLoaderClient().didFirstVisuallyNonEmptyLayoutForFrame(*webPage, m_frame, userData);
+        webPage->injectedBundleLoaderClient().didFirstVisuallyNonEmptyLayoutForFrame(*webPage, *m_frame, userData);
         webPage->send(Messages::WebPageProxy::DidFirstVisuallyNonEmptyLayoutForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
     }
 }
@@ -755,7 +769,7 @@ void WebFrameLoaderClient::dispatchDidLayout()
         return;
 
     // Notify the bundle client.
-    webPage->injectedBundleLoaderClient().didLayoutForFrame(*webPage, m_frame);
+    webPage->injectedBundleLoaderClient().didLayoutForFrame(*webPage, *m_frame);
 
     webPage->recomputeShortCircuitHorizontalWheelEventsState();
 
@@ -766,7 +780,7 @@ void WebFrameLoaderClient::dispatchDidLayout()
     // NOTE: Unlike the other layout notifications, this does not notify the
     // the UIProcess for every call.
 
-    if (m_frame.ptr() == m_frame->page()->mainWebFrame()) {
+    if (m_frame == m_frame->page()->mainWebFrame()) {
         // FIXME: Remove at the soonest possible time.
         webPage->send(Messages::WebPageProxy::SetRenderTreeSize(webPage->renderTreeSize()));
         webPage->mainFrameDidLayout();
@@ -789,7 +803,7 @@ Frame* WebFrameLoaderClient::dispatchCreatePage(const NavigationAction& navigati
 
 void WebFrameLoaderClient::dispatchShow()
 {
-    auto* webPage = m_frame->page();
+    WebPage* webPage = m_frame->page();
     if (!webPage)
         return;
 
@@ -798,7 +812,7 @@ void WebFrameLoaderClient::dispatchShow()
 
 void WebFrameLoaderClient::dispatchDecidePolicyForResponse(const ResourceResponse& response, const ResourceRequest& request, WebCore::PolicyCheckIdentifier identifier, const String& downloadAttribute, FramePolicyFunction&& function)
 {
-    auto* webPage = m_frame->page();
+    WebPage* webPage = m_frame ? m_frame->page() : nullptr;
     if (!webPage) {
         WEBFRAMELOADERCLIENT_RELEASE_LOG(Network, "dispatchDecidePolicyForResponse: ignoring because there's no web page");
         function(PolicyAction::Ignore, identifier);
@@ -814,7 +828,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForResponse(const ResourceRespons
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForResponse(webPage, m_frame.ptr(), response, request, userData);
+    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForResponse(webPage, m_frame, response, request, userData);
     if (policy == WKBundlePagePolicyActionUse) {
         WEBFRAMELOADERCLIENT_RELEASE_LOG(Network, "dispatchDecidePolicyForResponse: continuing because injected bundle says so");
         function(PolicyAction::Use, identifier);
@@ -823,11 +837,11 @@ void WebFrameLoaderClient::dispatchDecidePolicyForResponse(const ResourceRespons
 
     bool canShowResponse = webPage->canShowResponse(response);
 
-    auto* coreFrame = m_frame->coreFrame();
+    WebCore::Frame* coreFrame = m_frame->coreFrame();
     auto* policyDocumentLoader = coreFrame ? coreFrame->loader().provisionalDocumentLoader() : nullptr;
     auto navigationID = policyDocumentLoader ? static_cast<WebDocumentLoader&>(*policyDocumentLoader).navigationID() : 0;
-
-    auto protector = m_frame.copyRef();
+    
+    Ref<WebFrame> protector(*m_frame);
     uint64_t listenerID = m_frame->setUpPolicyListener(identifier, WTFMove(function), WebFrame::ForNavigationAction::No);
     if (!webPage->send(Messages::WebPageProxy::DecidePolicyForResponse(m_frame->frameID(), m_frame->info(), identifier, navigationID, response, request, canShowResponse, downloadAttribute, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())))) {
         WEBFRAMELOADERCLIENT_RELEASE_LOG(Network, "dispatchDecidePolicyForResponse: ignoring because WebPageProxy::DecidePolicyForResponse failed");
@@ -838,7 +852,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForResponse(const ResourceRespons
 void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const NavigationAction& navigationAction, const ResourceRequest& request,
     FormState* formState, const String& frameName, WebCore::PolicyCheckIdentifier identifier, FramePolicyFunction&& function)
 {
-    auto* webPage = m_frame->page();
+    WebPage* webPage = m_frame ? m_frame->page() : nullptr;
     if (!webPage) {
         function(PolicyAction::Ignore, identifier);
         return;
@@ -846,10 +860,10 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const Navigati
 
     RefPtr<API::Object> userData;
 
-    auto action = InjectedBundleNavigationAction::create(m_frame.ptr(), navigationAction, formState);
+    auto action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState);
 
     // Notify the bundle client.
-    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNewWindowAction(webPage, m_frame.ptr(), action.ptr(), request, frameName, userData);
+    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNewWindowAction(webPage, m_frame, action.ptr(), request, frameName, userData);
     if (policy == WKBundlePagePolicyActionUse) {
         function(PolicyAction::Use, identifier);
         return;
@@ -874,6 +888,8 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const Navigati
 
 void WebFrameLoaderClient::applyToDocumentLoader(WebsitePoliciesData&& websitePolicies)
 {
+    if (!m_frame)
+        return;
     auto* coreFrame = m_frame->coreFrame();
     if (!coreFrame)
         return;
@@ -890,14 +906,14 @@ void WebFrameLoaderClient::applyToDocumentLoader(WebsitePoliciesData&& websitePo
 
 WebCore::AllowsContentJavaScript WebFrameLoaderClient::allowsContentJavaScriptFromMostRecentNavigation() const
 {
-    auto* webPage = m_frame->page();
+    WebPage* webPage = m_frame ? m_frame->page() : nullptr;
     return webPage ? webPage->allowsContentJavaScriptFromMostRecentNavigation() : WebCore::AllowsContentJavaScript::No;
 }
 
 void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, const ResourceResponse& redirectResponse,
     FormState* formState, PolicyDecisionMode policyDecisionMode, WebCore::PolicyCheckIdentifier requestIdentifier, FramePolicyFunction&& function)
 {
-    auto* webPage = m_frame->page();
+    WebPage* webPage = m_frame ? m_frame->page() : nullptr;
     if (!webPage) {
         function(PolicyAction::Ignore, requestIdentifier);
         return;
@@ -913,10 +929,10 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const Navigat
 
     RefPtr<API::Object> userData;
 
-    Ref<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame.ptr(), navigationAction, formState);
+    Ref<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState);
 
     // Notify the bundle client.
-    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNavigationAction(webPage, m_frame.ptr(), action.ptr(), request, userData);
+    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNavigationAction(webPage, m_frame, action.ptr(), request, userData);
     if (policy == WKBundlePagePolicyActionUse) {
         function(PolicyAction::Use, requestIdentifier);
         return;
@@ -972,7 +988,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const Navigat
     navigationActionData.lockBackForwardList = navigationAction.lockBackForwardList();
     navigationActionData.adClickAttribution = navigationAction.adClickAttribution();
 
-    auto* coreFrame = m_frame->coreFrame();
+    WebCore::Frame* coreFrame = m_frame->coreFrame();
     if (!coreFrame)
         return function(PolicyAction::Ignore, requestIdentifier);
     WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().policyDocumentLoader());
@@ -987,7 +1003,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const Navigat
     navigationActionData.clientRedirectSourceForHistory = documentLoader->clientRedirectSourceForHistory();
 
     // Notify the UIProcess.
-    auto protector = makeRef(*coreFrame);
+    Ref<WebFrame> protect(*m_frame);
 
     if (policyDecisionMode == PolicyDecisionMode::Synchronous) {
         PolicyDecision policyDecision;
@@ -1020,7 +1036,7 @@ void WebFrameLoaderClient::dispatchUnableToImplementPolicy(const ResourceError&
     RefPtr<API::Object> userData;
 
     // Notify the bundle client.
-    webPage->injectedBundlePolicyClient().unableToImplementPolicy(webPage, m_frame.ptr(), error, userData);
+    webPage->injectedBundlePolicyClient().unableToImplementPolicy(webPage, m_frame, error, userData);
 
     // Notify the UIProcess.
     webPage->send(Messages::WebPageProxy::UnableToImplementPolicy(m_frame->frameID(), error, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
@@ -1038,7 +1054,7 @@ void WebFrameLoaderClient::dispatchWillSendSubmitEvent(Ref<FormState>&& formStat
     auto* sourceFrame = WebFrame::fromCoreFrame(*formState->sourceDocument().frame());
     ASSERT(sourceFrame);
 
-    webPage->injectedBundleFormClient().willSendSubmitEvent(webPage, &form, m_frame.ptr(), sourceFrame, formState->textFieldValues());
+    webPage->injectedBundleFormClient().willSendSubmitEvent(webPage, &form, m_frame, sourceFrame, formState->textFieldValues());
 }
 
 void WebFrameLoaderClient::dispatchWillSubmitForm(FormState& formState, CompletionHandler<void()>&& completionHandler)
@@ -1061,7 +1077,7 @@ void WebFrameLoaderClient::dispatchWillSubmitForm(FormState& formState, Completi
     auto& values = formState.textFieldValues();
 
     RefPtr<API::Object> userData;
-    webPage->injectedBundleFormClient().willSubmitForm(webPage, &form, m_frame.ptr(), sourceFrame, values, userData);
+    webPage->injectedBundleFormClient().willSubmitForm(webPage, &form, m_frame, sourceFrame, values, userData);
 
     uint64_t listenerID = m_frame->setUpWillSubmitFormListener(WTFMove(completionHandler));
 
@@ -1108,7 +1124,7 @@ void WebFrameLoaderClient::willReplaceMultipartContent()
     WebPage* webPage = m_frame->page();
     if (!webPage)
         return;
-    webPage->willReplaceMultipartContent(m_frame);
+    webPage->willReplaceMultipartContent(*m_frame);
 }
 
 void WebFrameLoaderClient::didReplaceMultipartContent()
@@ -1116,7 +1132,7 @@ void WebFrameLoaderClient::didReplaceMultipartContent()
     WebPage* webPage = m_frame->page();
     if (!webPage)
         return;
-    webPage->didReplaceMultipartContent(m_frame);
+    webPage->didReplaceMultipartContent(*m_frame);
 }
 
 void WebFrameLoaderClient::committedLoad(DocumentLoader* loader, const char* data, int length)
@@ -1233,7 +1249,7 @@ void WebFrameLoaderClient::didDisplayInsecureContent()
 
     RefPtr<API::Object> userData;
 
-    webPage->injectedBundleLoaderClient().didDisplayInsecureContentForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didDisplayInsecureContentForFrame(*webPage, *m_frame, userData);
 
     webPage->send(Messages::WebPageProxy::DidDisplayInsecureContentForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 }
@@ -1246,7 +1262,7 @@ void WebFrameLoaderClient::didRunInsecureContent(SecurityOrigin&, const URL&)
 
     RefPtr<API::Object> userData;
 
-    webPage->injectedBundleLoaderClient().didRunInsecureContentForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didRunInsecureContentForFrame(*webPage, *m_frame, userData);
 
     webPage->send(Messages::WebPageProxy::DidRunInsecureContentForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 }
@@ -1259,59 +1275,59 @@ void WebFrameLoaderClient::didDetectXSS(const URL&, bool)
 
     RefPtr<API::Object> userData;
 
-    webPage->injectedBundleLoaderClient().didDetectXSSForFrame(*webPage, m_frame, userData);
+    webPage->injectedBundleLoaderClient().didDetectXSSForFrame(*webPage, *m_frame, userData);
 
     webPage->send(Messages::WebPageProxy::DidDetectXSSForFrame(m_frame->frameID(), UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 }
 
-ResourceError WebFrameLoaderClient::cancelledError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::cancelledError(const ResourceRequest& request)
 {
     return WebKit::cancelledError(request);
 }
 
-ResourceError WebFrameLoaderClient::blockedError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::blockedError(const ResourceRequest& request)
 {
     return WebKit::blockedError(request);
 }
 
-ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const ResourceRequest& request)
 {
     return WebKit::blockedByContentBlockerError(request);
 }
 
-ResourceError WebFrameLoaderClient::cannotShowURLError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::cannotShowURLError(const ResourceRequest& request)
 {
     return WebKit::cannotShowURLError(request);
 }
 
-ResourceError WebFrameLoaderClient::interruptedForPolicyChangeError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::interruptedForPolicyChangeError(const ResourceRequest& request)
 {
     return WebKit::interruptedForPolicyChangeError(request);
 }
 
 #if ENABLE(CONTENT_FILTERING)
-ResourceError WebFrameLoaderClient::blockedByContentFilterError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::blockedByContentFilterError(const ResourceRequest& request)
 {
     return WebKit::blockedByContentFilterError(request);
 }
 #endif
 
-ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const ResourceResponse& response) const
+ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const ResourceResponse& response)
 {
     return WebKit::cannotShowMIMETypeError(response);
 }
 
-ResourceError WebFrameLoaderClient::fileDoesNotExistError(const ResourceResponse& response) const
+ResourceError WebFrameLoaderClient::fileDoesNotExistError(const ResourceResponse& response)
 {
     return WebKit::fileDoesNotExistError(response);
 }
 
-ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const ResourceResponse& response) const
+ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const ResourceResponse& response)
 {
     return WebKit::pluginWillHandleLoadError(response);
 }
 
-bool WebFrameLoaderClient::shouldFallBack(const ResourceError& error) const
+bool WebFrameLoaderClient::shouldFallBack(const ResourceError& error)
 {
     static NeverDestroyed<const ResourceError> cancelledError(this->cancelledError(ResourceRequest()));
     static NeverDestroyed<const ResourceError> pluginWillHandleLoadError(this->pluginWillHandleLoadError(ResourceResponse()));
@@ -1393,7 +1409,7 @@ void WebFrameLoaderClient::restoreViewState()
 
     // FIXME: This should not be necessary. WebCore should be correctly invalidating
     // the view on restores from the back/forward cache.
-    if (m_frame->page() && m_frame.ptr() == m_frame->page()->mainWebFrame())
+    if (m_frame->page() && m_frame == m_frame->page()->mainWebFrame())
         m_frame->page()->drawingArea()->setNeedsDisplay();
 #endif
 }
@@ -1414,7 +1430,7 @@ void WebFrameLoaderClient::didFinishLoad()
 {
     // If we have a load listener, notify it.
     if (WebFrame::LoadListener* loadListener = m_frame->loadListener())
-        loadListener->didFinishLoad(m_frame.ptr());
+        loadListener->didFinishLoad(m_frame);
 }
 
 void WebFrameLoaderClient::prepareForDataSourceReplacement()
@@ -1442,7 +1458,7 @@ void WebFrameLoaderClient::setTitle(const StringWithDirection& title, const URL&
     webPage->send(Messages::WebPageProxy::DidUpdateHistoryTitle(title.string, url.string(), m_frame->frameID()));
 }
 
-String WebFrameLoaderClient::userAgent(const URL& url) const
+String WebFrameLoaderClient::userAgent(const URL& url)
 {
     auto* webPage = m_frame->page();
     if (!webPage)
@@ -1607,7 +1623,7 @@ RefPtr<Widget> WebFrameLoaderClient::createPlugin(const IntSize&, HTMLPlugInElem
 #endif
 
 #if ENABLE(NETSCAPE_PLUGIN_API)
-    auto plugin = m_frame->page()->createPlugin(m_frame.ptr(), &pluginElement, parameters, parameters.mimeType);
+    auto plugin = m_frame->page()->createPlugin(m_frame, &pluginElement, parameters, parameters.mimeType);
     if (!plugin)
         return nullptr;
 
@@ -1628,7 +1644,7 @@ void WebFrameLoaderClient::redirectDataToPlugin(Widget& pluginWidget)
 WebCore::WebGLLoadPolicy WebFrameLoaderClient::webGLPolicyForURL(const URL& url) const
 {
     if (auto* webPage = m_frame->page())
-        return webPage->webGLPolicyForURL(m_frame.ptr(), url);
+        return webPage->webGLPolicyForURL(m_frame, url);
 
     return WebGLAllowCreation;
 }
@@ -1636,7 +1652,7 @@ WebCore::WebGLLoadPolicy WebFrameLoaderClient::webGLPolicyForURL(const URL& url)
 WebCore::WebGLLoadPolicy WebFrameLoaderClient::resolveWebGLPolicyForURL(const URL& url) const
 {
     if (auto* webPage = m_frame->page())
-        return webPage->resolveWebGLPolicyForURL(m_frame.ptr(), url);
+        return webPage->resolveWebGLPolicyForURL(m_frame, url);
 
     return WebGLAllowCreation;
 }
@@ -1705,7 +1721,7 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
         return ObjectContentType::Image;
 
     if (WebPage* webPage = m_frame->page()) {
-        auto allowedPluginTypes = webFrame().coreFrame()->loader().subframeLoader().allowPlugins()
+        auto allowedPluginTypes = webFrame()->coreFrame()->loader().subframeLoader().allowPlugins()
             ? PluginData::AllPlugins : PluginData::OnlyApplicationPlugins;
         if (webPage->corePage()->pluginData().supportsMimeType(mimeType, allowedPluginTypes))
             return ObjectContentType::PlugIn;
@@ -1725,8 +1741,10 @@ ObjectContentType WebFrameLoaderClient::objectContentType(const URL& url, const
 
 String WebFrameLoaderClient::overrideMediaType() const
 {
-    if (auto* page = m_frame->page())
-        return page->overriddenMediaType();
+    if (m_frame) {
+        if (auto* page = m_frame->page())
+            return page->overriddenMediaType();
+    }
 
     return String();
 }
@@ -1737,11 +1755,11 @@ void WebFrameLoaderClient::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld&
     if (!webPage)
         return;
 
-    webPage->injectedBundleLoaderClient().didClearWindowObjectForFrame(*webPage, m_frame, world);
+    webPage->injectedBundleLoaderClient().didClearWindowObjectForFrame(*webPage, *m_frame, world);
 
     WebAutomationSessionProxy* automationSessionProxy = WebProcess::singleton().automationSessionProxy();
     if (automationSessionProxy && world.isNormal())
-        automationSessionProxy->didClearWindowObjectForFrame(m_frame);
+        automationSessionProxy->didClearWindowObjectForFrame(*m_frame);
 }
 
 void WebFrameLoaderClient::dispatchGlobalObjectAvailable(DOMWrapperWorld& world)
@@ -1750,7 +1768,7 @@ void WebFrameLoaderClient::dispatchGlobalObjectAvailable(DOMWrapperWorld& world)
     if (!webPage)
         return;
     
-    webPage->injectedBundleLoaderClient().globalObjectIsAvailableForFrame(*webPage, m_frame, world);
+    webPage->injectedBundleLoaderClient().globalObjectIsAvailableForFrame(*webPage, *m_frame, world);
 }
 
 void WebFrameLoaderClient::willInjectUserScript(DOMWrapperWorld& world)
@@ -1759,7 +1777,7 @@ void WebFrameLoaderClient::willInjectUserScript(DOMWrapperWorld& world)
     if (!webPage)
         return;
 
-    webPage->injectedBundleLoaderClient().willInjectUserScriptForFrame(*webPage, m_frame, world);
+    webPage->injectedBundleLoaderClient().willInjectUserScriptForFrame(*webPage, *m_frame, world);
 }
 
 void WebFrameLoaderClient::dispatchWillDisconnectDOMWindowExtensionFromGlobalObject(WebCore::DOMWindowExtension* extension)
@@ -1806,7 +1824,7 @@ void WebFrameLoaderClient::willCacheResponse(DocumentLoader*, unsigned long iden
     if (!webPage)
         return completionHandler(response);
 
-    return completionHandler(webPage->injectedBundleResourceLoadClient().shouldCacheResponse(*webPage, m_frame, identifier) ? response : nil);
+    return completionHandler(webPage->injectedBundleResourceLoadClient().shouldCacheResponse(*webPage, *m_frame, identifier) ? response : nil);
 }
 
 NSDictionary *WebFrameLoaderClient::dataDetectionContext()
@@ -1850,7 +1868,7 @@ bool WebFrameLoaderClient::shouldForceUniversalAccessFromLocalURL(const URL& url
 Ref<FrameNetworkingContext> WebFrameLoaderClient::createNetworkingContext()
 {
     ASSERT(!hasProcessPrivilege(ProcessPrivilege::CanAccessRawCookies));
-    return WebFrameNetworkingContext::create(m_frame.ptr());
+    return WebFrameNetworkingContext::create(m_frame);
 }
 
 #if ENABLE(CONTENT_FILTERING)
index db27b77..b20d992 100644 (file)
@@ -37,10 +37,11 @@ struct WebsitePoliciesData;
     
 class WebFrameLoaderClient final : public WebCore::FrameLoaderClient {
 public:
-    explicit WebFrameLoaderClient(Ref<WebFrame>&&);
+    WebFrameLoaderClient();
     ~WebFrameLoaderClient();
 
-    WebFrame& webFrame() const { return m_frame.get(); }
+    void setWebFrame(WebFrame* webFrame) { m_frame = webFrame; }
+    WebFrame* webFrame() const { return m_frame; }
 
     bool frameHasCustomContentProvider() const { return m_frameHasCustomContentProvider; }
 
@@ -66,6 +67,8 @@ public:
     WebCore::AllowsContentJavaScript allowsContentJavaScriptFromMostRecentNavigation() const final;
 
 private:
+    void frameLoaderDestroyed() final;
+
     bool hasHTMLView() const final;
     bool hasWebView() const final;
     
@@ -163,20 +166,20 @@ private:
     void didRunInsecureContent(WebCore::SecurityOrigin&, const URL&) final;
     void didDetectXSS(const URL&, bool didBlockEntirePage) final;
 
-    WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError blockedError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&) const final;
+    WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError blockedError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&) final;
 #if ENABLE(CONTENT_FILTERING)
-    WebCore::ResourceError blockedByContentFilterError(const WebCore::ResourceRequest&) const final;
+    WebCore::ResourceError blockedByContentFilterError(const WebCore::ResourceRequest&) final;
 #endif
     
-    WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&) const final;
-    WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&) const final;
-    WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&) const final;
+    WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&) final;
+    WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&) final;
+    WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&) final;
     
-    bool shouldFallBack(const WebCore::ResourceError&) const final;
+    bool shouldFallBack(const WebCore::ResourceError&) final;
     
     bool canHandleRequest(const WebCore::ResourceRequest&) const final;
     bool canShowMIMEType(const String& MIMEType) const final;
@@ -196,7 +199,7 @@ private:
 
     void setTitle(const WebCore::StringWithDirection&, const URL&) final;
     
-    String userAgent(const URL&) const final;
+    String userAgent(const URL&) final;
 
     String overrideContentSecurityPolicy() const final;
 
@@ -277,12 +280,12 @@ private:
     void finishedLoadingApplicationManifest(uint64_t, const Optional<WebCore::ApplicationManifest>&) final;
 #endif
 
-    Ref<WebFrame> m_frame;
+    WebFrame* m_frame;
     RefPtr<PluginView> m_pluginView;
-    bool m_hasSentResponseToPluginView { false };
-    bool m_didCompletePageTransition { false };
-    bool m_frameHasCustomContentProvider { false };
-    bool m_frameCameFromBackForwardCache { false };
+    bool m_hasSentResponseToPluginView;
+    bool m_didCompletePageTransition;
+    bool m_frameHasCustomContentProvider;
+    bool m_frameCameFromBackForwardCache;
     bool m_useIconLoadingClient { false };
 #if ENABLE(RESOURCE_LOAD_STATISTICS)
     Optional<FrameSpecificStorageAccessIdentifier> m_frameSpecificStorageAccessIdentifier;
index 21bd375..cf678fa 100644 (file)
@@ -102,21 +102,23 @@ static uint64_t generateListenerID()
     return uniqueListenerID++;
 }
 
-void WebFrame::initWithCoreMainFrame(WebPage& page, Frame& coreFrame)
+Ref<WebFrame> WebFrame::createWithCoreMainFrame(WebPage* page, WebCore::Frame* coreFrame)
 {
-    page.send(Messages::WebPageProxy::DidCreateMainFrame(frameID()));
+    auto frame = create(std::unique_ptr<WebFrameLoaderClient>(static_cast<WebFrameLoaderClient*>(&coreFrame->loader().client())));
+    page->send(Messages::WebPageProxy::DidCreateMainFrame(frame->frameID()));
 
-    m_coreFrame = &coreFrame;
-    m_coreFrame->tree().setName(String());
-    m_coreFrame->init();
+    frame->m_coreFrame = coreFrame;
+    frame->m_coreFrame->tree().setName(String());
+    frame->m_coreFrame->init();
+    return frame;
 }
 
 Ref<WebFrame> WebFrame::createSubframe(WebPage* page, const String& frameName, HTMLFrameOwnerElement* ownerElement)
 {
-    auto frame = create();
+    auto frame = create(makeUnique<WebFrameLoaderClient>());
     page->send(Messages::WebPageProxy::DidCreateSubframe(frame->frameID()));
 
-    auto coreFrame = Frame::create(page->corePage(), ownerElement, makeUniqueRef<WebFrameLoaderClient>(frame.get()));
+    auto coreFrame = Frame::create(page->corePage(), ownerElement, frame->m_frameLoaderClient.get());
     frame->m_coreFrame = coreFrame.ptr();
 
     coreFrame->tree().setName(frameName);
@@ -129,9 +131,21 @@ Ref<WebFrame> WebFrame::createSubframe(WebPage* page, const String& frameName, H
     return frame;
 }
 
-WebFrame::WebFrame()
-    : m_frameID(FrameIdentifier::generate())
+Ref<WebFrame> WebFrame::create(std::unique_ptr<WebFrameLoaderClient> frameLoaderClient)
+{
+    auto frame = adoptRef(*new WebFrame(WTFMove(frameLoaderClient)));
+
+    // Add explict ref() that will be balanced in WebFrameLoaderClient::frameLoaderDestroyed().
+    frame->ref();
+
+    return frame;
+}
+
+WebFrame::WebFrame(std::unique_ptr<WebFrameLoaderClient> frameLoaderClient)
+    : m_frameLoaderClient(WTFMove(frameLoaderClient))
+    , m_frameID(FrameIdentifier::generate())
 {
+    m_frameLoaderClient->setWebFrame(this);
     WebProcess::singleton().addWebFrame(m_frameID, this);
 
 #ifndef NDEBUG
@@ -139,11 +153,6 @@ WebFrame::WebFrame()
 #endif
 }
 
-WebFrameLoaderClient* WebFrame::frameLoaderClient() const
-{
-    return m_coreFrame ? static_cast<WebFrameLoaderClient*>(&m_coreFrame->loader().client()) : nullptr;
-}
-
 WebFrame::~WebFrame()
 {
     ASSERT(!m_coreFrame);
@@ -174,7 +183,7 @@ WebFrame* WebFrame::fromCoreFrame(const Frame& frame)
     if (!webFrameLoaderClient)
         return nullptr;
 
-    return &webFrameLoaderClient->webFrame();
+    return webFrameLoaderClient->webFrame();
 }
 
 FrameInfoData WebFrame::info() const
@@ -259,11 +268,11 @@ void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyDecision&& po
 
     invalidatePolicyListener();
 
-    if (forNavigationAction && frameLoaderClient() && policyDecision.websitePoliciesData) {
+    if (forNavigationAction && m_frameLoaderClient && policyDecision.websitePoliciesData) {
         ASSERT(page());
         if (page())
             page()->setAllowsContentJavaScriptFromMostRecentNavigation(policyDecision.websitePoliciesData->allowsContentJavaScript);
-        frameLoaderClient()->applyToDocumentLoader(WTFMove(*policyDecision.websitePoliciesData));
+        m_frameLoaderClient->applyToDocumentLoader(WTFMove(*policyDecision.websitePoliciesData));
     }
 
     m_policyDownloadID = policyDecision.downloadID;
index da02921..363cbbc 100644 (file)
@@ -65,12 +65,10 @@ struct WebsitePoliciesData;
 
 class WebFrame : public API::ObjectImpl<API::Object::Type::BundleFrame> {
 public:
-    static Ref<WebFrame> create() { return adoptRef(*new WebFrame); }
+    static Ref<WebFrame> createWithCoreMainFrame(WebPage*, WebCore::Frame*);
     static Ref<WebFrame> createSubframe(WebPage*, const String& frameName, WebCore::HTMLFrameOwnerElement*);
     ~WebFrame();
 
-    void initWithCoreMainFrame(WebPage&, WebCore::Frame&);
-
     // Called when the FrameLoaderClient (and therefore the WebCore::Frame) is being torn down.
     void invalidate();
 
@@ -171,10 +169,11 @@ public:
     void setFirstLayerTreeTransactionIDAfterDidCommitLoad(TransactionID transactionID) { m_firstLayerTreeTransactionIDAfterDidCommitLoad = transactionID; }
 #endif
 
-    WebFrameLoaderClient* frameLoaderClient() const;
+    WebFrameLoaderClient* frameLoaderClient() const { return m_frameLoaderClient.get(); }
 
 private:
-    WebFrame();
+    static Ref<WebFrame> create(std::unique_ptr<WebFrameLoaderClient>);
+    explicit WebFrame(std::unique_ptr<WebFrameLoaderClient>);
 
     WebCore::Frame* m_coreFrame { nullptr };
 
@@ -185,6 +184,7 @@ private:
     HashMap<uint64_t, CompletionHandler<void()>> m_willSubmitFormCompletionHandlers;
     DownloadID m_policyDownloadID { 0 };
 
+    std::unique_ptr<WebFrameLoaderClient> m_frameLoaderClient;
     LoadListener* m_loadListener { nullptr };
     
     WebCore::FrameIdentifier m_frameID;
index d8d58e7..182f748 100644 (file)
@@ -466,8 +466,7 @@ WebPage::WebPage(PageIdentifier pageID, WebPageCreationParameters&& parameters)
     ASSERT(m_identifier);
 
     m_pageGroup = WebProcess::singleton().webPageGroup(parameters.pageGroupData);
-    m_mainFrame = WebFrame::create();
-    
+
     PageConfiguration pageConfiguration(
         WebProcess::singleton().sessionID(),
         makeUniqueRef<WebEditorClient>(this),
@@ -477,7 +476,6 @@ WebPage::WebPage(PageIdentifier pageID, WebPageCreationParameters&& parameters)
         WebBackForwardListProxy::create(*this),
         WebProcess::singleton().cookieJar(),
         makeUniqueRef<WebProgressTrackerClient>(*this),
-        makeUniqueRef<WebFrameLoaderClient>(*m_mainFrame),
         makeUniqueRef<MediaRecorderProvider>()
     );
     pageConfiguration.chromeClient = new WebChromeClient(*this);
@@ -493,6 +491,7 @@ WebPage::WebPage(PageIdentifier pageID, WebPageCreationParameters&& parameters)
 #endif
 
     pageConfiguration.plugInClient = makeUnique<WebPlugInClient>(*this);
+    pageConfiguration.loaderClientForMainFrame = new WebFrameLoaderClient;
     pageConfiguration.diagnosticLoggingClient = makeUnique<WebDiagnosticLoggingClient>(*this);
     pageConfiguration.performanceLoggingClient = makeUnique<WebPerformanceLoggingClient>(*this);
 
@@ -572,9 +571,7 @@ WebPage::WebPage(PageIdentifier pageID, WebPageCreationParameters&& parameters)
     // in modern WebKit.
     m_page->settings().setBackForwardCacheExpirationInterval(Seconds::infinity());
 
-    m_mainFrame->initWithCoreMainFrame(*this, m_page->mainFrame());
-
-
+    m_mainFrame = WebFrame::createWithCoreMainFrame(this, &m_page->mainFrame());
     m_drawingArea->updatePreferences(parameters.store);
 
     setBackgroundExtendsBeyondPage(parameters.backgroundExtendsBeyondPage);
index 409f944..2f3179a 100644 (file)
@@ -1,3 +1,17 @@
+2020-03-17  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, reverting r258339.
+        https://bugs.webkit.org/show_bug.cgi?id=209179
+
+        "Is it sometimes breaking rendering" (Requested by youenn on
+        #webkit).
+
+        Reverted changeset:
+
+        "FrameLoader should own its FrameLoaderClient"
+        https://bugs.webkit.org/show_bug.cgi?id=208918
+        https://trac.webkit.org/changeset/258339
+
 2020-03-15  Darin Adler  <darin@apple.com>
 
         Move most of TextIterator off of live ranges
index 7190b8c..aeb2b5d 100644 (file)
@@ -54,13 +54,13 @@ class ResourceRequest;
 
 class WebFrameLoaderClient : public WebCore::FrameLoaderClient {
 public:
-    explicit WebFrameLoaderClient(WebFrame* = nullptr);
-    ~WebFrameLoaderClient();
+    WebFrameLoaderClient(WebFrame* = 0);
 
-    void setWebFrame(WebFrame& webFrame) { m_webFrame = &webFrame; }
+    void setWebFrame(WebFrame* webFrame) { m_webFrame = webFrame; }
     WebFrame* webFrame() const { return m_webFrame.get(); }
 
 private:
+    void frameLoaderDestroyed() final;
     bool hasWebView() const final; // mainly for assertions
 
     Optional<WebCore::PageIdentifier> pageID() const final;
@@ -160,22 +160,22 @@ private:
     void didRunInsecureContent(WebCore::SecurityOrigin&, const URL&) final;
     void didDetectXSS(const URL&, bool didBlockEntirePage) final;
 
-    WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError blockedError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&) const final;
-    WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&) const final;
+    WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError blockedError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&) final;
+    WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&) final;
 #if ENABLE(CONTENT_FILTERING)
-    WebCore::ResourceError blockedByContentFilterError(const WebCore::ResourceRequest&) const final;
+    WebCore::ResourceError blockedByContentFilterError(const WebCore::ResourceRequest&) final;
 #endif
 
-    WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&) const final;
-    WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&) const final;
-    WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&) const final;
+    WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&) final;
+    WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&) final;
+    WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&) final;
 
-    bool shouldFallBack(const WebCore::ResourceError&) const final;
+    bool shouldFallBack(const WebCore::ResourceError&) final;
 
-    WTF::String userAgent(const URL&) const final;
+    WTF::String userAgent(const URL&) final;
     
     void savePlatformDataToCachedFrame(WebCore::CachedFrame*) final;
     void transitionToCommittedFromCachedFrame(WebCore::CachedFrame*) final;
index 43d7050..43c6a79 100644 (file)
@@ -217,9 +217,10 @@ Optional<WebCore::FrameIdentifier> WebFrameLoaderClient::frameID() const
     return WTF::nullopt;
 }
 
-WebFrameLoaderClient::~WebFrameLoaderClient()
+void WebFrameLoaderClient::frameLoaderDestroyed()
 {
     [m_webFrame.get() _clearCoreFrame];
+    delete this;
 }
 
 bool WebFrameLoaderClient::hasWebView() const
@@ -1132,49 +1133,49 @@ void WebFrameLoaderClient::didDetectXSS(const URL& insecureURL, bool didBlockEnt
     }
 }
 
-WebCore::ResourceError WebFrameLoaderClient::cancelledError(const WebCore::ResourceRequest& request) const
+WebCore::ResourceError WebFrameLoaderClient::cancelledError(const WebCore::ResourceRequest& request)
 {
     return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled URL:request.url()];
 }
     
-WebCore::ResourceError WebFrameLoaderClient::blockedError(const WebCore::ResourceRequest& request) const
+WebCore::ResourceError WebFrameLoaderClient::blockedError(const WebCore::ResourceRequest& request)
 {
     return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorCannotUseRestrictedPort URL:request.url()];
 }
 
-WebCore::ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const WebCore::ResourceRequest& request) const
+WebCore::ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const WebCore::ResourceRequest& request)
 {
     RELEASE_ASSERT_NOT_REACHED(); // Content blockers are not enabled in WebKit1.
 }
 
-WebCore::ResourceError WebFrameLoaderClient::cannotShowURLError(const WebCore::ResourceRequest& request) const
+WebCore::ResourceError WebFrameLoaderClient::cannotShowURLError(const WebCore::ResourceRequest& request)
 {
     return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorCannotShowURL URL:request.url()];
 }
 
-WebCore::ResourceError WebFrameLoaderClient::interruptedForPolicyChangeError(const WebCore::ResourceRequest& request) const
+WebCore::ResourceError WebFrameLoaderClient::interruptedForPolicyChangeError(const WebCore::ResourceRequest& request)
 {
     return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorFrameLoadInterruptedByPolicyChange URL:request.url()];
 }
 
 #if ENABLE(CONTENT_FILTERING)
-WebCore::ResourceError WebFrameLoaderClient::blockedByContentFilterError(const WebCore::ResourceRequest& request) const
+WebCore::ResourceError WebFrameLoaderClient::blockedByContentFilterError(const WebCore::ResourceRequest& request)
 {
     return [NSError _webKitErrorWithDomain:WebKitErrorDomain code:WebKitErrorFrameLoadBlockedByContentFilter URL:request.url()];
 }
 #endif
 
-WebCore::ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const WebCore::ResourceResponse& response) const
+WebCore::ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const WebCore::ResourceResponse& response)
 {
     return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:WebKitErrorCannotShowMIMEType URL:response.url()];
 }
 
-WebCore::ResourceError WebFrameLoaderClient::fileDoesNotExistError(const WebCore::ResourceResponse& response) const
+WebCore::ResourceError WebFrameLoaderClient::fileDoesNotExistError(const WebCore::ResourceResponse& response)
 {
     return [NSError _webKitErrorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist URL:response.url()];    
 }
 
-WebCore::ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const WebCore::ResourceResponse& response) const
+WebCore::ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const WebCore::ResourceResponse& response)
 {
     NSError *error = [[NSError alloc] _initWithPluginErrorCode:WebKitErrorPlugInWillHandleLoad
                                                     contentURL:response.url()
@@ -1184,7 +1185,7 @@ WebCore::ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const Web
     return [error autorelease];
 }
 
-bool WebFrameLoaderClient::shouldFallBack(const WebCore::ResourceError& error) const
+bool WebFrameLoaderClient::shouldFallBack(const WebCore::ResourceError& error)
 {
     // FIXME: Needs to check domain.
     // FIXME: WebKitErrorPlugInWillHandleLoad is a workaround for the cancel we do to prevent
@@ -1532,7 +1533,7 @@ RetainPtr<WebFramePolicyListener> WebFrameLoaderClient::setUpPolicyListener(WebC
     return policyListener;
 }
 
-String WebFrameLoaderClient::userAgent(const URL& url) const
+String WebFrameLoaderClient::userAgent(const URL& url)
 {
     WebView *webView = getWebView(m_webFrame.get());
     ASSERT(webView);
index bc3bebd..e418106 100644 (file)
@@ -304,7 +304,7 @@ WebView *getWebView(WebFrame *webFrame)
     WebView *webView = kit(page);
 
     WebFrame *frame = [[self alloc] _initWithWebFrameView:frameView webView:webView];
-    auto coreFrame = WebCore::Frame::create(page, ownerElement, makeUniqueRef<WebFrameLoaderClient>(frame));
+    auto coreFrame = WebCore::Frame::create(page, ownerElement, new WebFrameLoaderClient(frame));
     [frame release];
     frame->_private->coreFrame = coreFrame.ptr();
 
@@ -327,7 +327,7 @@ WebView *getWebView(WebFrame *webFrame)
 
     WebFrame *frame = [[self alloc] _initWithWebFrameView:frameView webView:webView];
     frame->_private->coreFrame = &page->mainFrame();
-    static_cast<WebFrameLoaderClient&>(page->mainFrame().loader().client()).setWebFrame(*frame);
+    static_cast<WebFrameLoaderClient&>(page->mainFrame().loader().client()).setWebFrame(frame);
     [frame release];
 
     page->mainFrame().tree().setName(name);
@@ -355,7 +355,7 @@ static NSURL *createUniqueWebDataURL();
     
     WebFrame *frame = [[self alloc] _initWithWebFrameView:frameView webView:webView];
     frame->_private->coreFrame = &page->mainFrame();
-    static_cast<WebFrameLoaderClient&>(page->mainFrame().loader().client()).setWebFrame(*frame);
+    static_cast<WebFrameLoaderClient&>(page->mainFrame().loader().client()).setWebFrame(frame);
     [frame release];
 
     frame->_private->coreFrame->initWithSimpleHTMLDocument(style, createUniqueWebDataURL());
index 4d89d36..35d677f 100644 (file)
@@ -1443,7 +1443,6 @@ static void WebKitInitializeGamepadProviderIfNecessary()
         BackForwardList::create(self),
         WebCore::CookieJar::create(storageProvider.copyRef()),
         makeUniqueRef<WebProgressTrackerClient>(self),
-        makeUniqueRef<WebFrameLoaderClient>(),
         makeUniqueRef<WebCore::MediaRecorderProvider>()
     );
 #if !PLATFORM(IOS_FAMILY)
@@ -1466,6 +1465,7 @@ static void WebKitInitializeGamepadProviderIfNecessary()
 #endif
 
     pageConfiguration.alternativeTextClient = makeUnique<WebAlternativeTextClient>(self);
+    pageConfiguration.loaderClientForMainFrame = new WebFrameLoaderClient;
     pageConfiguration.applicationCacheStorage = &webApplicationCacheStorage();
     pageConfiguration.databaseProvider = &WebDatabaseProvider::singleton();
     pageConfiguration.pluginInfoProvider = &WebPluginInfoProvider::singleton();
@@ -1714,7 +1714,6 @@ static void WebKitInitializeGamepadProviderIfNecessary()
         BackForwardList::create(self),
         WebCore::CookieJar::create(storageProvider.copyRef()),
         makeUniqueRef<WebProgressTrackerClient>(self),
-        makeUniqueRef<WebFrameLoaderClient>(),
         makeUniqueRef<WebCore::MediaRecorderProvider>()
     );
     pageConfiguration.chromeClient = new WebChromeClientIOS(self);
@@ -1727,6 +1726,7 @@ static void WebKitInitializeGamepadProviderIfNecessary()
 #endif
 
     pageConfiguration.inspectorClient = new WebInspectorClient(self);
+    pageConfiguration.loaderClientForMainFrame = new WebFrameLoaderClient;
     pageConfiguration.applicationCacheStorage = &webApplicationCacheStorage();
     pageConfiguration.databaseProvider = &WebDatabaseProvider::singleton();
     pageConfiguration.storageNamespaceProvider = &_private->group->storageNamespaceProvider();
index f989806..b76bd2e 100644 (file)
@@ -1,3 +1,17 @@
+2020-03-17  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, reverting r258339.
+        https://bugs.webkit.org/show_bug.cgi?id=209179
+
+        "Is it sometimes breaking rendering" (Requested by youenn on
+        #webkit).
+
+        Reverted changeset:
+
+        "FrameLoader should own its FrameLoaderClient"
+        https://bugs.webkit.org/show_bug.cgi?id=208918
+        https://trac.webkit.org/changeset/258339
+
 2020-03-12  youenn fablet  <youenn@apple.com>
 
         Make sure a preflight fails if response headers are invalid
index 6222820..9de3268 100644 (file)
@@ -119,6 +119,10 @@ WebFrameLoaderClient::~WebFrameLoaderClient()
 {
 }
 
+void WebFrameLoaderClient::frameLoaderDestroyed()
+{
+}
+
 Optional<WebCore::PageIdentifier> WebFrameLoaderClient::pageID() const
 {
     return WTF::nullopt;
@@ -781,49 +785,49 @@ void WebFrameLoaderClient::didDetectXSS(const URL&, bool)
     // FIXME: propogate call into the private delegate.
 }
 
-ResourceError WebFrameLoaderClient::cancelledError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::cancelledError(const ResourceRequest& request)
 {
     // FIXME: Need ChickenCat to include CFNetwork/CFURLError.h to get these values
     // Alternatively, we could create our own error domain/codes.
     return ResourceError(String(WebURLErrorDomain), -999, request.url(), String("Cancelled"));
 }
 
-ResourceError WebFrameLoaderClient::blockedError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::blockedError(const ResourceRequest& request)
 {
     return ResourceError(String(WebKitErrorDomain), WebKitErrorCannotUseRestrictedPort, request.url(), WEB_UI_STRING("Not allowed to use restricted network port", "WebKitErrorCannotUseRestrictedPort description"));
 }
 
-ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::blockedByContentBlockerError(const ResourceRequest& request)
 {
     RELEASE_ASSERT_NOT_REACHED(); // Content Blockers are not enabled for WK1.
 }
 
-ResourceError WebFrameLoaderClient::cannotShowURLError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::cannotShowURLError(const ResourceRequest& request)
 {
     return ResourceError(String(WebKitErrorDomain), WebKitErrorCannotShowURL, request.url(), WEB_UI_STRING("The URL can\xE2\x80\x99t be shown", "WebKitErrorCannotShowURL description"));
 }
 
-ResourceError WebFrameLoaderClient::interruptedForPolicyChangeError(const ResourceRequest& request) const
+ResourceError WebFrameLoaderClient::interruptedForPolicyChangeError(const ResourceRequest& request)
 {
     return ResourceError(String(WebKitErrorDomain), WebKitErrorFrameLoadInterruptedByPolicyChange, request.url(), WEB_UI_STRING("Frame load interrupted", "WebKitErrorFrameLoadInterruptedByPolicyChange description"));
 }
 
-ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const ResourceResponse& response) const
+ResourceError WebFrameLoaderClient::cannotShowMIMETypeError(const ResourceResponse& response)
 {
     return ResourceError(String(), WebKitErrorCannotShowMIMEType, response.url(), WEB_UI_STRING("Content with specified MIME type can\xE2\x80\x99t be shown", "WebKitErrorCannotShowMIMEType description"));
 }
 
-ResourceError WebFrameLoaderClient::fileDoesNotExistError(const ResourceResponse& response) const
+ResourceError WebFrameLoaderClient::fileDoesNotExistError(const ResourceResponse& response)
 {
     return ResourceError(String(WebURLErrorDomain), -1100, response.url(), String("File does not exist."));
 }
 
-ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const ResourceResponse& response) const
+ResourceError WebFrameLoaderClient::pluginWillHandleLoadError(const ResourceResponse& response)
 {
     return ResourceError(String(WebKitErrorDomain), WebKitErrorPlugInWillHandleLoad, response.url(), WEB_UI_STRING("Plug-in handled load", "WebKitErrorPlugInWillHandleLoad description"));
 }
 
-bool WebFrameLoaderClient::shouldFallBack(const ResourceError& error) const
+bool WebFrameLoaderClient::shouldFallBack(const ResourceError& error)
 {
     if (error.errorCode() == WebURLErrorCancelled && error.domain() == String(WebURLErrorDomain))
         return false;
@@ -975,7 +979,7 @@ void WebFrameLoaderClient::dispatchDidBecomeFrameset(bool)
 {
 }
 
-String WebFrameLoaderClient::userAgent(const URL& url) const
+String WebFrameLoaderClient::userAgent(const URL& url)
 {
     return m_webFrame->webView()->userAgentForKURL(url);
 }
index d3a73a5..7a2ace3 100644 (file)
@@ -58,6 +58,7 @@ public:
 
     Ref<WebCore::FrameNetworkingContext> createNetworkingContext() override;
 
+    void frameLoaderDestroyed() override;
     void makeRepresentation(WebCore::DocumentLoader*) override;
     void forceLayoutForNonHTML() override;
 
@@ -136,18 +137,18 @@ public:
     void didRunInsecureContent(WebCore::SecurityOrigin&, const URL&) override;
     void didDetectXSS(const URL&, bool didBlockEntirePage) override;
 
-    WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&) const override;
-    WebCore::ResourceError blockedError(const WebCore::ResourceRequest&) const override;
-    WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&) const override;
-    WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&) const override;
-    WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&) const override;
-    WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&) const override;
-    WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&) const override;
-    WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&) const override;
+    WebCore::ResourceError cancelledError(const WebCore::ResourceRequest&) override;
+    WebCore::ResourceError blockedError(const WebCore::ResourceRequest&) override;
+    WebCore::ResourceError blockedByContentBlockerError(const WebCore::ResourceRequest&) override;
+    WebCore::ResourceError cannotShowURLError(const WebCore::ResourceRequest&) override;
+    WebCore::ResourceError interruptedForPolicyChangeError(const WebCore::ResourceRequest&) override;
+    WebCore::ResourceError cannotShowMIMETypeError(const WebCore::ResourceResponse&) override;
+    WebCore::ResourceError fileDoesNotExistError(const WebCore::ResourceResponse&) override;
+    WebCore::ResourceError pluginWillHandleLoadError(const WebCore::ResourceResponse&) override;
 
-    bool shouldFallBack(const WebCore::ResourceError&) const override;
+    bool shouldFallBack(const WebCore::ResourceError&) override;
 
-    WTF::String userAgent(const URL&) const override;
+    WTF::String userAgent(const URL&) override;
 
     Ref<WebCore::DocumentLoader> createDocumentLoader(const WebCore::ResourceRequest&, const WebCore::SubstituteData&) override;
     void updateCachedDocumentLoader(WebCore::DocumentLoader&) override { }
index 368d7ce..c778e22 100644 (file)
@@ -1082,7 +1082,7 @@ Ref<Frame> WebFrame::createSubframeWithOwnerElement(IWebView* webView, Page* pag
     d->webView->viewWindow(&viewWindow);
 
     this->AddRef(); // We release this ref in frameLoaderDestroyed()
-    auto frame = Frame::create(page, ownerElement, makeUniqueRef<WebFrameLoaderClient>(this));
+    auto frame = Frame::create(page, ownerElement, new WebFrameLoaderClient(this));
     d->frame = frame.ptr();
     return frame;
 }
index d7053ec..4fd175b 100644 (file)
@@ -3116,8 +3116,6 @@ HRESULT WebView::initWithFrame(RECT frame, _In_ BSTR frameName, _In_ BSTR groupN
     m_inspectorClient = new WebInspectorClient(this);
 
     auto storageProvider = PageStorageSessionProvider::create();
-
-    WebFrame* webFrame = WebFrame::createInstance();
     PageConfiguration configuration(
         PAL::SessionID::defaultSessionID(),
         makeUniqueRef<WebEditorClient>(this),
@@ -3127,13 +3125,13 @@ HRESULT WebView::initWithFrame(RECT frame, _In_ BSTR frameName, _In_ BSTR groupN
         BackForwardList::create(),
         CookieJar::create(storageProvider.copyRef()),
         makeUniqueRef<WebProgressTrackerClient>(),
-        makeUniqueRef<WebFrameLoaderClient>(webFrame),
         makeUniqueRef<MediaRecorderProvider>()
     );
     configuration.chromeClient = new WebChromeClient(this);
     configuration.contextMenuClient = new WebContextMenuClient(this);
     configuration.dragClient = makeUnique<WebDragClient>(this);
     configuration.inspectorClient = m_inspectorClient;
+    configuration.loaderClientForMainFrame = new WebFrameLoaderClient;
     configuration.applicationCacheStorage = &WebApplicationCache::storage();
     configuration.databaseProvider = &WebDatabaseProvider::singleton();
     configuration.storageNamespaceProvider = &m_webViewGroup->storageNamespaceProvider();
@@ -3153,6 +3151,7 @@ HRESULT WebView::initWithFrame(RECT frame, _In_ BSTR frameName, _In_ BSTR groupN
             m_page->settings().setFTPDirectoryTemplatePath(toString(path));
     }
 
+    WebFrame* webFrame = WebFrame::createInstance();
     webFrame->initWithWebView(this, m_page);
     static_cast<WebFrameLoaderClient&>(m_page->mainFrame().loader().client()).setWebFrame(webFrame);
     static_cast<WebProgressTrackerClient&>(m_page->progress().client()).setWebFrame(webFrame);