Title: [248561] branches/safari-608-branch
Revision
248561
Author
[email protected]
Date
2019-08-12 16:41:55 -0700 (Mon, 12 Aug 2019)

Log Message

Cherry-pick r248148. rdar://problem/54017840

    Pages using MessagePorts should be PageCacheable
    https://bugs.webkit.org/show_bug.cgi?id=200366
    <rdar://problem/53837882>

    Reviewed by Geoffrey Garen.

    Source/WebCore:

    Allow a page to enter PageCache, even if it has MessagePorts (potentially with
    pending messages). If there are pending messages on the MessagePorts when
    entering PageCache, those will get dispatched upon restoring from PageCache.

    Test: fast/history/page-cache-MessagePort-pending-message.html

    * dom/MessagePort.cpp:
    (WebCore::MessagePort::messageAvailable):
    (WebCore::MessagePort::dispatchMessages):
    Do not dispatch messages while in PageCache.

    (WebCore::MessagePort::canSuspendForDocumentSuspension const):
    Allow pages with MessagePort objects to enter PageCache.

    * dom/ScriptExecutionContext.cpp:
    (WebCore::ScriptExecutionContext::resumeActiveDOMObjects):
    Make sure pending messages on MessagePorts get dispatched asynchronously after restoring
    from PageCache.

    * loader/DocumentLoader.cpp:
    (WebCore::areAllLoadersPageCacheAcceptable):
    Make sure only CachedResources that are still loading upon load cancelation prevent
    entering PageCache.

    LayoutTests:

    Add layout test coverage.

    * fast/history/page-cache-MessagePort-pending-message-expected.txt: Added.
    * fast/history/page-cache-MessagePort-pending-message.html: Added.

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

Modified Paths

Added Paths

Diff

Modified: branches/safari-608-branch/LayoutTests/ChangeLog (248560 => 248561)


--- branches/safari-608-branch/LayoutTests/ChangeLog	2019-08-12 23:41:52 UTC (rev 248560)
+++ branches/safari-608-branch/LayoutTests/ChangeLog	2019-08-12 23:41:55 UTC (rev 248561)
@@ -1,5 +1,64 @@
 2019-08-12  Alan Coon  <[email protected]>
 
+        Cherry-pick r248148. rdar://problem/54017840
+
+    Pages using MessagePorts should be PageCacheable
+    https://bugs.webkit.org/show_bug.cgi?id=200366
+    <rdar://problem/53837882>
+    
+    Reviewed by Geoffrey Garen.
+    
+    Source/WebCore:
+    
+    Allow a page to enter PageCache, even if it has MessagePorts (potentially with
+    pending messages). If there are pending messages on the MessagePorts when
+    entering PageCache, those will get dispatched upon restoring from PageCache.
+    
+    Test: fast/history/page-cache-MessagePort-pending-message.html
+    
+    * dom/MessagePort.cpp:
+    (WebCore::MessagePort::messageAvailable):
+    (WebCore::MessagePort::dispatchMessages):
+    Do not dispatch messages while in PageCache.
+    
+    (WebCore::MessagePort::canSuspendForDocumentSuspension const):
+    Allow pages with MessagePort objects to enter PageCache.
+    
+    * dom/ScriptExecutionContext.cpp:
+    (WebCore::ScriptExecutionContext::resumeActiveDOMObjects):
+    Make sure pending messages on MessagePorts get dispatched asynchronously after restoring
+    from PageCache.
+    
+    * loader/DocumentLoader.cpp:
+    (WebCore::areAllLoadersPageCacheAcceptable):
+    Make sure only CachedResources that are still loading upon load cancelation prevent
+    entering PageCache.
+    
+    LayoutTests:
+    
+    Add layout test coverage.
+    
+    * fast/history/page-cache-MessagePort-pending-message-expected.txt: Added.
+    * fast/history/page-cache-MessagePort-pending-message.html: Added.
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248148 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-08-01  Chris Dumez  <[email protected]>
+
+            Pages using MessagePorts should be PageCacheable
+            https://bugs.webkit.org/show_bug.cgi?id=200366
+            <rdar://problem/53837882>
+
+            Reviewed by Geoffrey Garen.
+
+            Add layout test coverage.
+
+            * fast/history/page-cache-MessagePort-pending-message-expected.txt: Added.
+            * fast/history/page-cache-MessagePort-pending-message.html: Added.
+
+2019-08-12  Alan Coon  <[email protected]>
+
         Cherry-pick r248112. rdar://problem/53836593
 
     [Text autosizing] [iPadOS] Add targeted hacks to address some remaining text autosizing issues

Added: branches/safari-608-branch/LayoutTests/fast/history/page-cache-MessagePort-pending-message-expected.txt (0 => 248561)


--- branches/safari-608-branch/LayoutTests/fast/history/page-cache-MessagePort-pending-message-expected.txt	                        (rev 0)
+++ branches/safari-608-branch/LayoutTests/fast/history/page-cache-MessagePort-pending-message-expected.txt	2019-08-12 23:41:55 UTC (rev 248561)
@@ -0,0 +1,15 @@
+Tests that a page that has a MessagePort with a pending message can enter PageCache.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+pageshow - not from cache
+pagehide - entering cache
+pageshow - from cache
+PASS Page did enter and was restored from the page cache
+PASS e.data is "foo"
+PASS afterPageCacheRestore is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: branches/safari-608-branch/LayoutTests/fast/history/page-cache-MessagePort-pending-message.html (0 => 248561)


--- branches/safari-608-branch/LayoutTests/fast/history/page-cache-MessagePort-pending-message.html	                        (rev 0)
+++ branches/safari-608-branch/LayoutTests/fast/history/page-cache-MessagePort-pending-message.html	2019-08-12 23:41:55 UTC (rev 248561)
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src=""
+<script>
+description('Tests that a page that has a MessagePort with a pending message can enter PageCache.');
+window.jsTestIsAsync = true;
+
+if (window.testRunner)
+    testRunner.overridePreference("WebKitUsesPageCachePreferenceKey", 1);
+
+let afterPageCacheRestore = false;
+
+window.addEventListener("pageshow", function(event) {
+    debug("pageshow - " + (event.persisted ? "" : "not ") + "from cache");
+
+    if (event.persisted) {
+        testPassed("Page did enter and was restored from the page cache");
+        afterPageCacheRestore = true;
+    }
+}, false);
+
+window.addEventListener("pagehide", function(event) {
+    debug("pagehide - " + (event.persisted ? "" : "not ") + "entering cache");
+    if (!event.persisted) {
+        testFailed("Page did not enter the page cache.");
+        finishJSTest();
+    }
+    port2.postMessage("foo");
+}, false);
+
+window.addEventListener('load', function() {
+    channel = new MessageChannel();
+    port1 = channel.port1;
+    port1._onmessage_ = (_e) => {
+        e = _e;
+        shouldBeEqualToString("e.data", "foo");
+        shouldBeTrue("afterPageCacheRestore");
+        finishJSTest();
+    };
+    port2 = channel.port2;
+
+    // This needs to happen outside the onload handler so that a history
+    // item is created.
+    setTimeout(function() {
+        // Force a back navigation back to this page.
+        window.location = "resources/page-cache-helper.html";
+    }, 0);
+}, false);
+
+</script>
+<script src=""
+</body>
+</html>

Modified: branches/safari-608-branch/Source/WebCore/ChangeLog (248560 => 248561)


--- branches/safari-608-branch/Source/WebCore/ChangeLog	2019-08-12 23:41:52 UTC (rev 248560)
+++ branches/safari-608-branch/Source/WebCore/ChangeLog	2019-08-12 23:41:55 UTC (rev 248561)
@@ -1,5 +1,83 @@
 2019-08-12  Alan Coon  <[email protected]>
 
+        Cherry-pick r248148. rdar://problem/54017840
+
+    Pages using MessagePorts should be PageCacheable
+    https://bugs.webkit.org/show_bug.cgi?id=200366
+    <rdar://problem/53837882>
+    
+    Reviewed by Geoffrey Garen.
+    
+    Source/WebCore:
+    
+    Allow a page to enter PageCache, even if it has MessagePorts (potentially with
+    pending messages). If there are pending messages on the MessagePorts when
+    entering PageCache, those will get dispatched upon restoring from PageCache.
+    
+    Test: fast/history/page-cache-MessagePort-pending-message.html
+    
+    * dom/MessagePort.cpp:
+    (WebCore::MessagePort::messageAvailable):
+    (WebCore::MessagePort::dispatchMessages):
+    Do not dispatch messages while in PageCache.
+    
+    (WebCore::MessagePort::canSuspendForDocumentSuspension const):
+    Allow pages with MessagePort objects to enter PageCache.
+    
+    * dom/ScriptExecutionContext.cpp:
+    (WebCore::ScriptExecutionContext::resumeActiveDOMObjects):
+    Make sure pending messages on MessagePorts get dispatched asynchronously after restoring
+    from PageCache.
+    
+    * loader/DocumentLoader.cpp:
+    (WebCore::areAllLoadersPageCacheAcceptable):
+    Make sure only CachedResources that are still loading upon load cancelation prevent
+    entering PageCache.
+    
+    LayoutTests:
+    
+    Add layout test coverage.
+    
+    * fast/history/page-cache-MessagePort-pending-message-expected.txt: Added.
+    * fast/history/page-cache-MessagePort-pending-message.html: Added.
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248148 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2019-08-01  Chris Dumez  <[email protected]>
+
+            Pages using MessagePorts should be PageCacheable
+            https://bugs.webkit.org/show_bug.cgi?id=200366
+            <rdar://problem/53837882>
+
+            Reviewed by Geoffrey Garen.
+
+            Allow a page to enter PageCache, even if it has MessagePorts (potentially with
+            pending messages). If there are pending messages on the MessagePorts when
+            entering PageCache, those will get dispatched upon restoring from PageCache.
+
+            Test: fast/history/page-cache-MessagePort-pending-message.html
+
+            * dom/MessagePort.cpp:
+            (WebCore::MessagePort::messageAvailable):
+            (WebCore::MessagePort::dispatchMessages):
+            Do not dispatch messages while in PageCache.
+
+            (WebCore::MessagePort::canSuspendForDocumentSuspension const):
+            Allow pages with MessagePort objects to enter PageCache.
+
+            * dom/ScriptExecutionContext.cpp:
+            (WebCore::ScriptExecutionContext::resumeActiveDOMObjects):
+            Make sure pending messages on MessagePorts get dispatched asynchronously after restoring
+            from PageCache.
+
+            * loader/DocumentLoader.cpp:
+            (WebCore::areAllLoadersPageCacheAcceptable):
+            Make sure only CachedResources that are still loading upon load cancelation prevent
+            entering PageCache.
+
+2019-08-12  Alan Coon  <[email protected]>
+
         Cherry-pick r248112. rdar://problem/53836593
 
     [Text autosizing] [iPadOS] Add targeted hacks to address some remaining text autosizing issues

Modified: branches/safari-608-branch/Source/WebCore/dom/MessagePort.cpp (248560 => 248561)


--- branches/safari-608-branch/Source/WebCore/dom/MessagePort.cpp	2019-08-12 23:41:52 UTC (rev 248560)
+++ branches/safari-608-branch/Source/WebCore/dom/MessagePort.cpp	2019-08-12 23:41:55 UTC (rev 248561)
@@ -195,7 +195,7 @@
 {
     // This MessagePort object might be disentangled because the port is being transferred,
     // in which case we'll notify it that messages are available once a new end point is created.
-    if (!m_scriptExecutionContext)
+    if (!m_scriptExecutionContext || m_scriptExecutionContext->activeDOMObjectsAreSuspended())
         return;
 
     m_scriptExecutionContext->processMessageWithMessagePortsSoon();
@@ -243,7 +243,7 @@
     // The HTML5 spec specifies that any messages sent to a document that is not fully active should be dropped, so this behavior is OK.
     ASSERT(started());
 
-    if (!isEntangled())
+    if (!m_scriptExecutionContext || m_scriptExecutionContext->activeDOMObjectsAreSuspended() || !isEntangled())
         return;
 
     RefPtr<WorkerThread> workerThread;
@@ -430,7 +430,7 @@
 
 bool MessagePort::canSuspendForDocumentSuspension() const
 {
-    return !hasPendingActivity() || (!m_started || m_closed);
+    return true;
 }
 
 } // namespace WebCore

Modified: branches/safari-608-branch/Source/WebCore/dom/ScriptExecutionContext.cpp (248560 => 248561)


--- branches/safari-608-branch/Source/WebCore/dom/ScriptExecutionContext.cpp	2019-08-12 23:41:52 UTC (rev 248560)
+++ branches/safari-608-branch/Source/WebCore/dom/ScriptExecutionContext.cpp	2019-08-12 23:41:55 UTC (rev 248561)
@@ -307,6 +307,10 @@
         activeDOMObject.resume();
         return ShouldContinue::Yes;
     });
+
+    // In case there were pending messages at the time the script execution context entered PageCache,
+    // make sure those get dispatched shortly after restoring from PageCache.
+    processMessageWithMessagePortsSoon();
 }
 
 void ScriptExecutionContext::stopActiveDOMObjects()

Modified: branches/safari-608-branch/Source/WebCore/loader/DocumentLoader.cpp (248560 => 248561)


--- branches/safari-608-branch/Source/WebCore/loader/DocumentLoader.cpp	2019-08-12 23:41:52 UTC (rev 248560)
+++ branches/safari-608-branch/Source/WebCore/loader/DocumentLoader.cpp	2019-08-12 23:41:55 UTC (rev 248561)
@@ -135,9 +135,9 @@
         if (!cachedResource)
             return false;
 
-        // Only image and XHR loads do prevent the page from entering the PageCache.
+        // Only image and XHR loads do not prevent the page from entering the PageCache.
         // All non-image loads will prevent the page from entering the PageCache.
-        if (!cachedResource->isImage() && !cachedResource->areAllClientsXMLHttpRequests())
+        if (cachedResource->isLoading() && !cachedResource->isImage() && !cachedResource->areAllClientsXMLHttpRequests())
             return false;
     }
     return true;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to