Title: [233623] trunk
Revision
233623
Author
wenson_hs...@apple.com
Date
2018-07-07 14:05:45 -0700 (Sat, 07 Jul 2018)

Log Message

Introduce a layout milestone to track when the document contains a large number of rendered characters
https://bugs.webkit.org/show_bug.cgi?id=187412
<rdar://problem/41744338>

Reviewed by Ryosuke Niwa.

Source/WebCore:

Implements a new layout milestone: `DidRenderSignificantAmountOfText`. This is similar to the existing
`DidFirstVisuallyNonEmptyLayout` milestone, but with a few important additional constraints:

• The minimum threshold of rendered characters is much larger (3000 instead of 200).
• The mean length of a text node must be large (at least 50).

This is a (computationally) lightweight heuristic intended to estimate the likelihood that a page is capable of
being presented in Reader mode. In many article-like pages, the average length of a text node is significantly
longer than other types of pages; thus, on pages where the average length of a text node is very large *and*
there is a large quantity of text, we can use this as a cue to opportunistically detect and enter Safari reader
mode on watchOS.

Test: RenderingProgressTests.DidRenderSignificantAmountOfText

* page/FrameView.cpp:
(WebCore::FrameView::reset):

Clear out new state members that keep track of whether the significant rendered text milestone has been met.

(WebCore::elementOverflowRectIsLargerThanThreshold):

Factor out logic to grab the overflow height of an element into a separate helper function.

(WebCore::FrameView::qualifiesAsVisuallyNonEmpty const):
(WebCore::FrameView::updateSignificantRenderedTextMilestoneIfNeeded):

Determines whether to fire this new milestone after the next layout pass is finished. The logic here is similar
to the logic in qualifiesAsVisuallyNonEmpty, requiring that there are not still pending stylesheets in the head
and that the document height is at least a minimum threshold. However, unlike the first visually non-empty
layout, this milestone is never guaranteed to fire.

(WebCore::FrameView::fireLayoutRelatedMilestonesIfNeeded):
* page/FrameView.h:
(WebCore::FrameView::incrementVisuallyNonEmptyCharacterCount):
* page/LayoutMilestones.h:

Source/WebKit:

Add plumbing for the new significant rendered text layout milestone in the modern WebKit client layer. See
WebCore/ChangeLog for more details.

* Shared/API/Cocoa/_WKRenderingProgressEvents.h:
* Shared/API/Cocoa/_WKRenderingProgressEventsInternal.h:
(renderingProgressEvents):
* Shared/API/c/WKPageLoadTypes.h:
* Shared/API/c/WKSharedAPICast.h:
(WebKit::toWKLayoutMilestones):
(WebKit::toLayoutMilestones):
* UIProcess/API/Cocoa/WKWebView.mm:
(layoutMilestones):

Tools:

Add a new API test to check that we observe the new rendering milestone in an article-like document.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/significant-text-milestone.html: Added.
* TestWebKitAPI/Tests/ios/RenderingProgressTests.mm:
(TEST):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (233622 => 233623)


--- trunk/Source/WebCore/ChangeLog	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebCore/ChangeLog	2018-07-07 21:05:45 UTC (rev 233623)
@@ -1,3 +1,47 @@
+2018-07-07  Wenson Hsieh  <wenson_hs...@apple.com>
+
+        Introduce a layout milestone to track when the document contains a large number of rendered characters
+        https://bugs.webkit.org/show_bug.cgi?id=187412
+        <rdar://problem/41744338>
+
+        Reviewed by Ryosuke Niwa.
+
+        Implements a new layout milestone: `DidRenderSignificantAmountOfText`. This is similar to the existing
+        `DidFirstVisuallyNonEmptyLayout` milestone, but with a few important additional constraints:
+
+        • The minimum threshold of rendered characters is much larger (3000 instead of 200).
+        • The mean length of a text node must be large (at least 50).
+
+        This is a (computationally) lightweight heuristic intended to estimate the likelihood that a page is capable of
+        being presented in Reader mode. In many article-like pages, the average length of a text node is significantly
+        longer than other types of pages; thus, on pages where the average length of a text node is very large *and*
+        there is a large quantity of text, we can use this as a cue to opportunistically detect and enter Safari reader
+        mode on watchOS.
+
+        Test: RenderingProgressTests.DidRenderSignificantAmountOfText
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::reset):
+
+        Clear out new state members that keep track of whether the significant rendered text milestone has been met.
+
+        (WebCore::elementOverflowRectIsLargerThanThreshold):
+
+        Factor out logic to grab the overflow height of an element into a separate helper function.
+
+        (WebCore::FrameView::qualifiesAsVisuallyNonEmpty const):
+        (WebCore::FrameView::updateSignificantRenderedTextMilestoneIfNeeded):
+
+        Determines whether to fire this new milestone after the next layout pass is finished. The logic here is similar
+        to the logic in qualifiesAsVisuallyNonEmpty, requiring that there are not still pending stylesheets in the head
+        and that the document height is at least a minimum threshold. However, unlike the first visually non-empty
+        layout, this milestone is never guaranteed to fire.
+
+        (WebCore::FrameView::fireLayoutRelatedMilestonesIfNeeded):
+        * page/FrameView.h:
+        (WebCore::FrameView::incrementVisuallyNonEmptyCharacterCount):
+        * page/LayoutMilestones.h:
+
 2018-07-06  Timothy Hatcher  <timo...@apple.com>
 
         Semantic colors don't update when accessibility Increase Contrast mode is enabled.

Modified: trunk/Source/WebCore/page/FrameView.cpp (233622 => 233623)


--- trunk/Source/WebCore/page/FrameView.cpp	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebCore/page/FrameView.cpp	2018-07-07 21:05:45 UTC (rev 233623)
@@ -129,6 +129,9 @@
 // The maximum number of updateEmbeddedObjects iterations that should be done before returning.
 static const unsigned maxUpdateEmbeddedObjectsIterations = 2;
 
+static constexpr unsigned significantRenderedTextCharacterThreshold = 3000;
+static constexpr float significantRenderedTextMeanLength = 50;
+
 static RenderLayer::UpdateLayerPositionsFlags updateLayerPositionFlags(RenderLayer* layer, bool isRelayoutingSubtree, bool didFullRepaint)
 {
     RenderLayer::UpdateLayerPositionsFlags flags = RenderLayer::defaultFlags;
@@ -276,6 +279,9 @@
     m_visuallyNonEmptyPixelCount = 0;
     m_isVisuallyNonEmpty = false;
     m_firstVisuallyNonEmptyLayoutCallbackPending = true;
+    m_renderTextCountForVisuallyNonEmptyCharacters = 0;
+    m_renderedSignificantAmountOfText = false;
+    m_significantRenderedTextMilestonePending = true;
     m_needsDeferredScrollbarsUpdate = false;
     m_maintainScrollPositionAnchor = nullptr;
     layoutContext().reset();
@@ -4301,6 +4307,17 @@
     ASSERT(!needsLayout());
 }
 
+static bool elementOverflowRectIsLargerThanThreshold(const Element& element)
+{
+    // Require the document to grow a bit.
+    // Using a value of 48 allows the header on Google's search page to render immediately before search results populate later.
+    static const int documentHeightThreshold = 48;
+    if (auto* elementRenderBox = element.renderBox())
+        return snappedIntRect(elementRenderBox->layoutOverflowRect()).height() >= documentHeightThreshold;
+
+    return false;
+}
+
 bool FrameView::qualifiesAsVisuallyNonEmpty() const
 {
     // No content yet.
@@ -4316,11 +4333,7 @@
     if (frame().document()->styleScope().hasPendingSheetsBeforeBody())
         return false;
 
-    // Require the document to grow a bit.
-    // Using a value of 48 allows the header on Google's search page to render immediately before search results populate later.
-    static const int documentHeightThreshold = 48;
-    LayoutRect overflowRect = documentElement->renderBox()->layoutOverflowRect();
-    if (snappedIntRect(overflowRect).height() < documentHeightThreshold)
+    if (!elementOverflowRectIsLargerThanThreshold(*documentElement))
         return false;
 
     // The first few hundred characters rarely contain the interesting content of the page.
@@ -4332,6 +4345,28 @@
     return false;
 }
 
+void FrameView::updateSignificantRenderedTextMilestoneIfNeeded()
+{
+    if (m_renderedSignificantAmountOfText)
+        return;
+
+    auto* document = frame().document();
+    if (!document || document->styleScope().hasPendingSheetsBeforeBody())
+        return;
+
+    auto* documentElement = document->documentElement();
+    if (!documentElement || !elementOverflowRectIsLargerThanThreshold(*documentElement))
+        return;
+
+    if (m_visuallyNonEmptyCharacterCount < significantRenderedTextCharacterThreshold)
+        return;
+
+    if (!m_renderTextCountForVisuallyNonEmptyCharacters || m_visuallyNonEmptyCharacterCount / static_cast<float>(m_renderTextCountForVisuallyNonEmptyCharacters) < significantRenderedTextMeanLength)
+        return;
+
+    m_renderedSignificantAmountOfText = true;
+}
+
 void FrameView::updateIsVisuallyNonEmpty()
 {
     if (m_isVisuallyNonEmpty)
@@ -4929,14 +4964,21 @@
             page->startCountingRelevantRepaintedObjects();
     }
     updateIsVisuallyNonEmpty();
+    updateSignificantRenderedTextMilestoneIfNeeded();
 
     // If the layout was done with pending sheets, we are not in fact visually non-empty yet.
-    if (m_isVisuallyNonEmpty &&m_firstVisuallyNonEmptyLayoutCallbackPending) {
+    if (m_isVisuallyNonEmpty && m_firstVisuallyNonEmptyLayoutCallbackPending) {
         m_firstVisuallyNonEmptyLayoutCallbackPending = false;
         if (requestedMilestones & DidFirstVisuallyNonEmptyLayout)
             milestonesAchieved |= DidFirstVisuallyNonEmptyLayout;
     }
 
+    if (m_renderedSignificantAmountOfText && m_significantRenderedTextMilestonePending) {
+        m_significantRenderedTextMilestonePending = false;
+        if (requestedMilestones & DidRenderSignificantAmountOfText)
+            milestonesAchieved |= DidRenderSignificantAmountOfText;
+    }
+
     if (milestonesAchieved && frame().isMainFrame())
         frame().loader().didReachLayoutMilestone(milestonesAchieved);
 }

Modified: trunk/Source/WebCore/page/FrameView.h (233622 => 233623)


--- trunk/Source/WebCore/page/FrameView.h	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebCore/page/FrameView.h	2018-07-07 21:05:45 UTC (rev 233623)
@@ -393,6 +393,7 @@
     void incrementVisuallyNonEmptyCharacterCount(unsigned);
     void incrementVisuallyNonEmptyPixelCount(const IntSize&);
     void updateIsVisuallyNonEmpty();
+    void updateSignificantRenderedTextMilestoneIfNeeded();
     bool isVisuallyNonEmpty() const { return m_isVisuallyNonEmpty; }
     WEBCORE_EXPORT void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize);
     WEBCORE_EXPORT void setAutoSizeFixedMinimumHeight(int);
@@ -858,6 +859,10 @@
     bool m_isVisuallyNonEmpty;
     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
 
+    unsigned m_renderTextCountForVisuallyNonEmptyCharacters;
+    bool m_renderedSignificantAmountOfText;
+    bool m_significantRenderedTextMilestonePending;
+
     bool m_needsDeferredScrollbarsUpdate { false };
 
     RefPtr<ContainerNode> m_maintainScrollPositionAnchor;
@@ -923,12 +928,14 @@
 
 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)
 {
-    if (m_isVisuallyNonEmpty)
+    if (m_isVisuallyNonEmpty && m_renderedSignificantAmountOfText)
         return;
     m_visuallyNonEmptyCharacterCount += count;
-    if (m_visuallyNonEmptyCharacterCount <= visualCharacterThreshold)
-        return;
-    updateIsVisuallyNonEmpty();
+    ++m_renderTextCountForVisuallyNonEmptyCharacters;
+    if (!m_isVisuallyNonEmpty && m_visuallyNonEmptyCharacterCount > visualCharacterThreshold)
+        updateIsVisuallyNonEmpty();
+    if (!m_renderedSignificantAmountOfText)
+        updateSignificantRenderedTextMilestoneIfNeeded();
 }
 
 inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size)

Modified: trunk/Source/WebCore/page/LayoutMilestones.h (233622 => 233623)


--- trunk/Source/WebCore/page/LayoutMilestones.h	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebCore/page/LayoutMilestones.h	2018-07-07 21:05:45 UTC (rev 233623)
@@ -37,7 +37,8 @@
     DidFirstFlushForHeaderLayer                         = 1 << 3,
     DidFirstLayoutAfterSuppressedIncrementalRendering   = 1 << 4,
     DidFirstPaintAfterSuppressedIncrementalRendering    = 1 << 5,
-    ReachedSessionRestorationRenderTreeSizeThreshold    = 1 << 6 // FIXME: only implemented by WK2 currently.
+    ReachedSessionRestorationRenderTreeSizeThreshold    = 1 << 6, // FIXME: only implemented by WK2 currently.
+    DidRenderSignificantAmountOfText            = 1 << 7,
 };
 
 typedef unsigned LayoutMilestones;

Modified: trunk/Source/WebKit/ChangeLog (233622 => 233623)


--- trunk/Source/WebKit/ChangeLog	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebKit/ChangeLog	2018-07-07 21:05:45 UTC (rev 233623)
@@ -1,3 +1,24 @@
+2018-07-07  Wenson Hsieh  <wenson_hs...@apple.com>
+
+        Introduce a layout milestone to track when the document contains a large number of rendered characters
+        https://bugs.webkit.org/show_bug.cgi?id=187412
+        <rdar://problem/41744338>
+
+        Reviewed by Ryosuke Niwa.
+
+        Add plumbing for the new significant rendered text layout milestone in the modern WebKit client layer. See
+        WebCore/ChangeLog for more details.
+
+        * Shared/API/Cocoa/_WKRenderingProgressEvents.h:
+        * Shared/API/Cocoa/_WKRenderingProgressEventsInternal.h:
+        (renderingProgressEvents):
+        * Shared/API/c/WKPageLoadTypes.h:
+        * Shared/API/c/WKSharedAPICast.h:
+        (WebKit::toWKLayoutMilestones):
+        (WebKit::toLayoutMilestones):
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (layoutMilestones):
+
 2018-07-07  Simon Fraser  <simon.fra...@apple.com>
 
         REGRESSION (r233561): MobileMail crashes when replying to an email

Modified: trunk/Source/WebKit/Shared/API/Cocoa/_WKRenderingProgressEvents.h (233622 => 233623)


--- trunk/Source/WebKit/Shared/API/Cocoa/_WKRenderingProgressEvents.h	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebKit/Shared/API/Cocoa/_WKRenderingProgressEvents.h	2018-07-07 21:05:45 UTC (rev 233623)
@@ -35,6 +35,7 @@
     _WKRenderingProgressEventFirstLayoutAfterSuppressedIncrementalRendering WK_API_AVAILABLE(macosx(10.11), ios(9.0)) = 1 << 4,
     _WKRenderingProgressEventFirstPaintAfterSuppressedIncrementalRendering WK_API_AVAILABLE(macosx(10.11), ios(9.0)) = 1 << 5,
     _WKRenderingProgressEventFirstPaint WK_API_AVAILABLE(macosx(10.11), ios(9.0)) = 1 << 6,
+    _WKRenderingProgressEventDidRenderSignificantAmountOfText WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)) = 1 << 7,
 } WK_API_AVAILABLE(macosx(10.10), ios(8.0));
 
 #endif

Modified: trunk/Source/WebKit/Shared/API/Cocoa/_WKRenderingProgressEventsInternal.h (233622 => 233623)


--- trunk/Source/WebKit/Shared/API/Cocoa/_WKRenderingProgressEventsInternal.h	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebKit/Shared/API/Cocoa/_WKRenderingProgressEventsInternal.h	2018-07-07 21:05:45 UTC (rev 233623)
@@ -51,6 +51,9 @@
     if (milestones & WebCore::DidFirstPaintAfterSuppressedIncrementalRendering)
         events |= _WKRenderingProgressEventFirstPaintAfterSuppressedIncrementalRendering;
 
+    if (milestones & WebCore::DidRenderSignificantAmountOfText)
+        events |= _WKRenderingProgressEventDidRenderSignificantAmountOfText;
+
     return events;
 }
 

Modified: trunk/Source/WebKit/Shared/API/c/WKPageLoadTypes.h (233622 => 233623)


--- trunk/Source/WebKit/Shared/API/c/WKPageLoadTypes.h	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebKit/Shared/API/c/WKPageLoadTypes.h	2018-07-07 21:05:45 UTC (rev 233623)
@@ -56,7 +56,8 @@
     kWKDidHitRelevantRepaintedObjectsAreaThreshold = 1 << 2,
     kWKReserved = 1 << 3, // Note that the fourth member of this enum is actually private and defined in WKPageLoadTypesPrivate.h
     kWKDidFirstLayoutAfterSuppressedIncrementalRendering = 1 << 4,
-    kWKDidFirstPaintAfterSuppressedIncrementalRendering = 1 << 5
+    kWKDidFirstPaintAfterSuppressedIncrementalRendering = 1 << 5,
+    kWKDidRenderSignificantAmountOfText = 1 << 7
 };
 typedef uint32_t WKLayoutMilestones;
 

Modified: trunk/Source/WebKit/Shared/API/c/WKSharedAPICast.h (233622 => 233623)


--- trunk/Source/WebKit/Shared/API/c/WKSharedAPICast.h	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebKit/Shared/API/c/WKSharedAPICast.h	2018-07-07 21:05:45 UTC (rev 233623)
@@ -875,6 +875,8 @@
         wkMilestones |= kWKDidFirstLayoutAfterSuppressedIncrementalRendering;
     if (milestones & WebCore::DidFirstPaintAfterSuppressedIncrementalRendering)
         wkMilestones |= kWKDidFirstPaintAfterSuppressedIncrementalRendering;
+    if (milestones & WebCore::DidRenderSignificantAmountOfText)
+        wkMilestones |= kWKDidRenderSignificantAmountOfText;
     
     return wkMilestones;
 }
@@ -895,6 +897,8 @@
         milestones |= WebCore::DidFirstLayoutAfterSuppressedIncrementalRendering;
     if (wkMilestones & kWKDidFirstPaintAfterSuppressedIncrementalRendering)
         milestones |= WebCore::DidFirstPaintAfterSuppressedIncrementalRendering;
+    if (wkMilestones & kWKDidRenderSignificantAmountOfText)
+        milestones |= WebCore::DidRenderSignificantAmountOfText;
     
     return milestones;
 }

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (233622 => 233623)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm	2018-07-07 21:05:45 UTC (rev 233623)
@@ -4547,6 +4547,9 @@
     if (events & _WKRenderingProgressEventFirstPaintAfterSuppressedIncrementalRendering)
         milestones |= WebCore::DidFirstPaintAfterSuppressedIncrementalRendering;
 
+    if (events & _WKRenderingProgressEventDidRenderSignificantAmountOfText)
+        milestones |= WebCore::DidRenderSignificantAmountOfText;
+
     return milestones;
 }
 

Modified: trunk/Tools/ChangeLog (233622 => 233623)


--- trunk/Tools/ChangeLog	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Tools/ChangeLog	2018-07-07 21:05:45 UTC (rev 233623)
@@ -1,3 +1,18 @@
+2018-07-07  Wenson Hsieh  <wenson_hs...@apple.com>
+
+        Introduce a layout milestone to track when the document contains a large number of rendered characters
+        https://bugs.webkit.org/show_bug.cgi?id=187412
+        <rdar://problem/41744338>
+
+        Reviewed by Ryosuke Niwa.
+
+        Add a new API test to check that we observe the new rendering milestone in an article-like document.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKitCocoa/significant-text-milestone.html: Added.
+        * TestWebKitAPI/Tests/ios/RenderingProgressTests.mm:
+        (TEST):
+
 2018-06-30  Simon Fraser  <simon.fra...@apple.com>
 
         dump-class-layout reports wrong padding in many cases

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (233622 => 233623)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-07-07 21:05:45 UTC (rev 233623)
@@ -820,6 +820,7 @@
 		F4F405BD1D4C0D1C007A9707 /* skinny-autoplaying-video-with-audio.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4F405BB1D4C0CF8007A9707 /* skinny-autoplaying-video-with-audio.html */; };
 		F4FA91811E61849B007B8C1D /* WKWebViewMacEditingTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F4FA917F1E61849B007B8C1D /* WKWebViewMacEditingTests.mm */; };
 		F4FA91831E61857B007B8C1D /* double-click-does-not-select-trailing-space.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4FA91821E618566007B8C1D /* double-click-does-not-select-trailing-space.html */; };
+		F4FC077720F013B600CA043C /* significant-text-milestone.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = F4FC077620F0108100CA043C /* significant-text-milestone.html */; };
 		F660AA1115A5F631003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F660AA0F15A5F624003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp */; };
 		F660AA1515A61ABF003A1243 /* InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F660AA1415A61ABF003A1243 /* InjectedBundleInitializationUserDataCallbackWins_Bundle.cpp */; };
 		F6B7BE9517469212008A3445 /* DidAssociateFormControls_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F6B7BE92174691EF008A3445 /* DidAssociateFormControls_Bundle.cpp */; };
@@ -1108,6 +1109,7 @@
 				CE6E81A420A933D500E2C80F /* set-timeout-function.html in Copy Resources */,
 				52B8CF9815868D9100281053 /* SetDocumentURI.html in Copy Resources */,
 				CEBABD491B71687C0051210A /* should-open-external-schemes.html in Copy Resources */,
+				F4FC077720F013B600CA043C /* significant-text-milestone.html in Copy Resources */,
 				C9B4AD2A1ECA6EBE00F5FEA0 /* silence-long.m4a in Copy Resources */,
 				1ADBEFE3130C6AA100D61D19 /* simple-accelerated-compositing.html in Copy Resources */,
 				C0ADBE9612FCA79B00D2C129 /* simple-form.html in Copy Resources */,
@@ -2014,6 +2016,7 @@
 		F4F405BB1D4C0CF8007A9707 /* skinny-autoplaying-video-with-audio.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "skinny-autoplaying-video-with-audio.html"; sourceTree = "<group>"; };
 		F4FA917F1E61849B007B8C1D /* WKWebViewMacEditingTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewMacEditingTests.mm; sourceTree = "<group>"; };
 		F4FA91821E618566007B8C1D /* double-click-does-not-select-trailing-space.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = "double-click-does-not-select-trailing-space.html"; path = "Tests/WebKitCocoa/double-click-does-not-select-trailing-space.html"; sourceTree = SOURCE_ROOT; };
+		F4FC077620F0108100CA043C /* significant-text-milestone.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "significant-text-milestone.html"; sourceTree = "<group>"; };
 		F660AA0C15A5F061003A1243 /* GetInjectedBundleInitializationUserDataCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetInjectedBundleInitializationUserDataCallback.cpp; sourceTree = "<group>"; };
 		F660AA0F15A5F624003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetInjectedBundleInitializationUserDataCallback_Bundle.cpp; sourceTree = "<group>"; };
 		F660AA1215A619C8003A1243 /* InjectedBundleInitializationUserDataCallbackWins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleInitializationUserDataCallbackWins.cpp; sourceTree = "<group>"; };
@@ -2620,6 +2623,7 @@
 				A12DDBFF1E8373C100CF6CAE /* rendered-image-excluding-overflow.html */,
 				F46849BF1EEF5EDC00B937FE /* rich-and-plain-text.html */,
 				F4D65DA71F5E46C0009D8C27 /* selected-text-image-link-and-editable.html */,
+				F4FC077620F0108100CA043C /* significant-text-milestone.html */,
 				C9B4AD291ECA6EA500F5FEA0 /* silence-long.m4a */,
 				51460E0F20D4216E005345F2 /* SimpleServiceWorkerRegistrations-2.sqlite3 */,
 				51460E1020D4216E005345F2 /* SimpleServiceWorkerRegistrations-2.sqlite3-shm */,
@@ -3696,7 +3700,6 @@
 				7CCE7F061A411AE600447C4C /* LayoutMilestonesWithAllContentInFrame.cpp in Sources */,
 				7CCE7EDF1A411A9200447C4C /* LayoutUnit.cpp in Sources */,
 				7A66BDB61EAF14EF00CCC924 /* LimitTitleSize.cpp in Sources */,
-				512C4C9E20EAA40D004945EA /* ResponsivenessTimerCrash.mm in Sources */,
 				7A7B0E7F1EAFE4C3006AB8AE /* LimitTitleSize.mm in Sources */,
 				C25CCA061E51380B0026CB8A /* LineBreaking.mm in Sources */,
 				37D36ED71AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm in Sources */,
@@ -3783,6 +3786,7 @@
 				7CCE7F0F1A411AE600447C4C /* ResizeWindowAfterCrash.cpp in Sources */,
 				51C8E1A51F26AF4C00BF731B /* ResourceLoadStatistics.mm in Sources */,
 				83DE134D1EF1C50800C1B355 /* ResponsivenessTimer.cpp in Sources */,
+				512C4C9E20EAA40D004945EA /* ResponsivenessTimerCrash.mm in Sources */,
 				7CCE7F101A411AE600447C4C /* ResponsivenessTimerDoesntFireEarly.cpp in Sources */,
 				83B6DE6F1EE75221001E792F /* RestoreSessionState.cpp in Sources */,
 				7CCE7F111A411AE600447C4C /* RestoreSessionStateContainingFormData.cpp in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/significant-text-milestone.html (0 => 233623)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/significant-text-milestone.html	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/significant-text-milestone.html	2018-07-07 21:05:45 UTC (rev 233623)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+    <article>
+        <h1 itemprop="title">A long sample article</h1>
+        <h2 itemprop="subheading">Containing lots of placeholder text</h2>
+        <h3 itemprop="author">Johnny Appleseed</h3>
+        <time itemprop="pubdate" datetime="2018-07-06">July 6, 2018</time>
+        <p>Lorem ipsum dolor sit amet, <a href="" adipiscing elit</a>, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. <a href="" id eu nisl nunc mi ipsum faucibus vitae.</a> Sed tempus urna et pharetra pharetra massa massa. Vitae tortor condimentum lacinia quis vel eros donec ac. <a href="" velit sed ullamcorper morbi</a> tincidunt ornare massa eget. Sit amet cursus sit amet dictum. Id eu nisl nunc mi ipsum faucibus vitae aliquet nec. Suscipit tellus mauris a diam maecenas sed. Consequat nisl vel pretium lectus quam id leo. <a href="" et malesuada fames ac turpis egestas integer.</a> Quam lacus suspendisse faucibus interdum posuere lorem ipsum. Sem integer vitae justo eget magna fermentum iaculis. A condimentum vitae sapien pellentesque habitant morbi tristique. V
 arius duis at consectetur lorem. Ipsum faucibus vitae aliquet nec ullamcorper sit.</p>
+        <p>Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. <a href="" lacus suspendisse</a> faucibus interdum posuere lorem. Sagittis vitae et leo duis ut diam. Turpis massa sed elementum tempus. Aliquam sem fringilla ut morbi. <a href="" est ullamcorper</a> eget nulla facilisi etiam dignissim. Id velit ut tortor pretium. Bibendum at varius vel pharetra vel turpis nunc. Sit amet aliquam id diam maecenas. Lobortis feugiat vivamus at augue <a href="" arcu dictum</a> varius duis. Libero justo laoreet sit amet. Egestas tellus rutrum tellus pellentesque eu tincidunt tortor aliquam.</p>
+        <blockquote><p>Sed faucibus <a href="" in eu mi bibendum</a>. Donec enim diam vulputate ut pharetra sit amet aliquam. <img src="" Consequat id porta nibh venenatis cras sed felis eget velit. At lectus urna duis convallis convallis tellus id interdum velit. Id consectetur purus ut faucibus pulvinar elementum integer enim. Ipsum dolor sit amet consectetur adipiscing elit ut aliquam. At tellus at urna condimentum mattis. Faucibus pulvinar elementum integer enim. At elementum eu facilisis sed odio morbi. Fames ac turpis egestas integer eget aliquet. Consequat interdum varius sit amet mattis vulputate enim nulla. Lectus sit amet est placerat in egestas. Dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Urna et pharetra pharetra massa massa ultricies mi. Sagittis eu volutpat odio facilisis mauris sit amet massa. Nec ullamcorper sit amet risus. Quis enim lobortis s
 celerisque fermentum dui faucibus in ornare. In metus vulputate eu scelerisque felis.</p></blockquote>
+        <p>Non sodales neque sodales ut etiam sit amet nisl purus. Lacus luctus accumsan tortor posuere ac ut. Pulvinar neque laoreet suspendisse interdum consectetur libero id. Porta non pulvinar neque laoreet suspendisse interdum consectetur libero. Mattis molestie a iaculis at. Sit amet consectetur adipiscing elit duis tristique sollicitudin. Posuere morbi leo urna molestie at elementum eu facilisis sed. Id volutpat lacus laoreet non. Tempus iaculis urna id volutpat lacus laoreet. Ullamcorper velit sed ullamcorper morbi tincidunt ornare.</p>
+        <p>Sit amet massa vitae tortor condimentum lacinia quis. <img src="" Vitae turpis massa sed elementum tempus egestas. Faucibus in ornare quam viverra orci <a href="" eu. Scelerisque fermentum dui faucibus in ornare quam viverra orci sagittis. In egestas erat imperdiet sed euismod nisi porta lorem. Varius vel pharetra vel turpis. Nec ullamcorper sit amet risus nullam eget felis eget nunc. Dignissim diam quis enim lobortis scelerisque fermentum dui faucibus in. Sagittis eu volutpat odio facilisis mauris sit amet. Ipsum a arcu cursus vitae congue mauris rhoncus aenean vel. Ornare lectus sit amet est placerat in. Malesuada pellentesque elit eget gravida cum sociis natoque penatibus et. Vitae purus faucibus ornare suspendisse sed nisi lacus sed viverra.</p>
+        <p>Cursus vitae congue mauris rhoncus aenean vel elit. Donec ac odio tempor orci dapibus. Cursus in hac habitasse platea dictumst quisque. Mi sit amet mauris commodo quis. Morbi enim nunc faucibus a. Duis convallis convallis tellus id. <a href="" quisque non tellus</a> orci ac auctor augue mauris augue. A condimentum vitae sapien pellentesque habitant morbi. Ornare arcu odio ut sem nulla pharetra diam sit. Placerat in egestas erat imperdiet sed euismod nisi porta. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et netus et. <a href="" diam quam nulla</a> porttitor massa id neque aliquam vestibulum. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum odio. Libero justo laoreet sit amet. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae nunc.</p>
+    </article>
+</body>
+</html>

Modified: trunk/Tools/TestWebKitAPI/Tests/ios/RenderingProgressTests.mm (233622 => 233623)


--- trunk/Tools/TestWebKitAPI/Tests/ios/RenderingProgressTests.mm	2018-07-07 20:46:28 UTC (rev 233622)
+++ trunk/Tools/TestWebKitAPI/Tests/ios/RenderingProgressTests.mm	2018-07-07 21:05:45 UTC (rev 233623)
@@ -48,6 +48,27 @@
 
 @end
 
+#if PLATFORM(IOS)
+
+TEST(RenderingProgressTests, DidRenderSignificantAmountOfText)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 156, 195)]);
+    [webView _setObservedRenderingProgressEvents:_WKRenderingProgressEventDidRenderSignificantAmountOfText];
+
+    bool observedSignificantRenderedText = false;
+    auto navigationDelegate = adoptNS([[TestNavigationDelegate alloc] init]);
+    [navigationDelegate setRenderingProgressDidChange:[&] (WKWebView *, _WKRenderingProgressEvents events) {
+        if (events & _WKRenderingProgressEventDidRenderSignificantAmountOfText)
+            observedSignificantRenderedText = true;
+    }];
+
+    [webView setNavigationDelegate:navigationDelegate.get()];
+    [webView loadTestPageNamed:@"significant-text-milestone"];
+    TestWebKitAPI::Util::run(&observedSignificantRenderedText);
+}
+
+#endif // PLATFORM(IOS)
+
 #if PLATFORM(WATCHOS)
 
 TEST(RenderingProgressTests, FirstPaintWithSignificantArea)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to