Changeset 243752 in webkit
- Timestamp:
- Apr 2, 2019, 12:43:51 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 5 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/fast/events/touch/ios/content-observation/non-visible-becomes-visible-and-gains-new-renderer-expected.txt (added)
-
LayoutTests/fast/events/touch/ios/content-observation/non-visible-becomes-visible-and-gains-new-renderer.html (added)
-
LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-gains-new-renderer-expected.txt (added)
-
LayoutTests/fast/events/touch/ios/content-observation/non-visible-content-gains-new-renderer.html (added)
-
LayoutTests/fast/events/touch/ios/content-observation/visible-content-gains-new-renderer-expected.txt (added)
-
LayoutTests/fast/events/touch/ios/content-observation/visible-content-gains-new-renderer.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/page/ios/ContentChangeObserver.cpp (modified) (6 diffs)
-
Source/WebCore/page/ios/ContentChangeObserver.h (modified) (5 diffs)
-
Source/WebCore/rendering/updating/RenderTreeUpdater.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r243750 r243752 1 2019-04-02 Zalan Bujtas <zalan@apple.com> 2 3 [ContentChangeObserver] Ignore reconstructed renderers when checking for visibility change 4 https://bugs.webkit.org/show_bug.cgi?id=196483 5 <rdar://problem/49288174> 6 7 Reviewed by Simon Fraser. 8 9 * fast/events/touch/ios/content-observation/visible-content-gains-new-renderer-expected.txt: Added. 10 * fast/events/touch/ios/content-observation/visible-content-gains-new-renderer.html: Added. 11 1 12 2019-04-02 Shawn Roberts <sroberts@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r243746 r243752 1 2019-04-02 Zalan Bujtas <zalan@apple.com> 2 3 [ContentChangeObserver] Ignore reconstructed renderers when checking for visibility change 4 https://bugs.webkit.org/show_bug.cgi?id=196483 5 <rdar://problem/49288174> 6 7 Reviewed by Simon Fraser. 8 9 This patch fixes the cases when the content gets reconstructed in a way that existing and visible elements gain 10 new renderers within one style recalc. We failed to recognize such cases and ended up detecting the newly constructed renderers 11 as "visible change" thereby triggering hover. 12 13 Test: fast/events/touch/ios/content-observation/visible-content-gains-new-renderer.html 14 15 * page/ios/ContentChangeObserver.cpp: 16 (WebCore::ContentChangeObserver::renderTreeUpdateDidStart): 17 (WebCore::ContentChangeObserver::renderTreeUpdateDidFinish): 18 (WebCore::ContentChangeObserver::reset): 19 (WebCore::ContentChangeObserver::willDestroyRenderer): 20 (WebCore::ContentChangeObserver::StyleChangeScope::StyleChangeScope): 21 (WebCore::ContentChangeObserver::RenderTreeUpdateScope::RenderTreeUpdateScope): 22 (WebCore::ContentChangeObserver::RenderTreeUpdateScope::~RenderTreeUpdateScope): 23 * page/ios/ContentChangeObserver.h: 24 (WebCore::ContentChangeObserver::visibleRendererWasDestroyed const): 25 * rendering/updating/RenderTreeUpdater.cpp: 26 (WebCore::RenderTreeUpdater::updateRenderTree): 27 (WebCore::RenderTreeUpdater::tearDownRenderers): 28 1 29 2019-04-02 Fujii Hironori <Hironori.Fujii@sony.com> 2 30 -
trunk/Source/WebCore/page/ios/ContentChangeObserver.cpp
r243678 r243752 249 249 } 250 250 251 void ContentChangeObserver::renderTreeUpdateDidStart() 252 { 253 if (!m_document.settings().contentChangeObserverEnabled()) 254 return; 255 if (!isObservingContentChanges()) 256 return; 257 258 LOG(ContentObservation, "renderTreeUpdateDidStart: RenderTree update started"); 259 m_isInObservedRenderTreeUpdate = true; 260 m_elementsWithDestroyedVisibleRenderer.clear(); 261 } 262 263 void ContentChangeObserver::renderTreeUpdateDidFinish() 264 { 265 if (!m_isInObservedRenderTreeUpdate) 266 return; 267 268 LOG(ContentObservation, "renderTreeUpdateDidStart: RenderTree update finished"); 269 m_isInObservedRenderTreeUpdate = false; 270 m_elementsWithDestroyedVisibleRenderer.clear(); 271 } 272 251 273 void ContentChangeObserver::stopObservingPendingActivities() 252 274 { … … 266 288 m_touchEventIsBeingDispatched = false; 267 289 m_isInObservedStyleRecalc = false; 290 m_isInObservedRenderTreeUpdate = false; 268 291 m_observedDomTimerIsBeingExecuted = false; 269 292 m_mouseMovedEventIsBeingDispatched = false; 270 293 271 294 m_contentObservationTimer.stop(); 295 m_elementsWithDestroyedVisibleRenderer.clear(); 272 296 } 273 297 … … 282 306 LOG(ContentObservation, "willDetachPage"); 283 307 reset(); 308 } 309 310 void ContentChangeObserver::willDestroyRenderer(const Element& element) 311 { 312 if (!m_document.settings().contentChangeObserverEnabled()) 313 return; 314 if (!m_isInObservedRenderTreeUpdate) 315 return; 316 if (hasVisibleChangeState()) 317 return; 318 LOG_WITH_STREAM(ContentObservation, stream << "willDestroyRenderer element: " << &element); 319 320 if (!isConsideredHidden(element)) 321 m_elementsWithDestroyedVisibleRenderer.add(&element); 284 322 } 285 323 … … 463 501 } 464 502 503 bool ContentChangeObserver::shouldObserveVisibilityChangeForElement(const Element& element) 504 { 505 return isObservingContentChanges() && !hasVisibleChangeState() && !visibleRendererWasDestroyed(element); 506 } 507 465 508 ContentChangeObserver::StyleChangeScope::StyleChangeScope(Document& document, const Element& element) 466 509 : m_contentChangeObserver(document.contentChangeObserver()) … … 468 511 , m_hadRenderer(element.renderer()) 469 512 { 470 if (m_contentChangeObserver. isObservingContentChanges() && !m_contentChangeObserver.hasVisibleChangeState())513 if (m_contentChangeObserver.shouldObserveVisibilityChangeForElement(element)) 471 514 m_wasHidden = isConsideredHidden(m_element); 472 515 } … … 559 602 } 560 603 604 ContentChangeObserver::RenderTreeUpdateScope::RenderTreeUpdateScope(Document& document) 605 : m_contentChangeObserver(document.contentChangeObserver()) 606 { 607 m_contentChangeObserver.renderTreeUpdateDidStart(); 608 } 609 610 ContentChangeObserver::RenderTreeUpdateScope::~RenderTreeUpdateScope() 611 { 612 m_contentChangeObserver.renderTreeUpdateDidFinish(); 613 } 614 561 615 } 562 616 -
trunk/Source/WebCore/page/ios/ContentChangeObserver.h
r243556 r243752 62 62 void willDetachPage(); 63 63 64 void willDestroyRenderer(const Element&); 65 64 66 class StyleChangeScope { 65 67 public: … … 88 90 WEBCORE_EXPORT MouseMovedScope(Document&); 89 91 WEBCORE_EXPORT ~MouseMovedScope(); 92 private: 93 ContentChangeObserver& m_contentChangeObserver; 94 }; 95 96 class RenderTreeUpdateScope { 97 public: 98 RenderTreeUpdateScope(Document&); 99 ~RenderTreeUpdateScope(); 90 100 private: 91 101 ContentChangeObserver& m_contentChangeObserver; … … 160 170 void completeDurationBasedContentObservation(); 161 171 void setObservedContentState(WKContentChange); 172 173 void renderTreeUpdateDidStart(); 174 void renderTreeUpdateDidFinish(); 175 bool visibleRendererWasDestroyed(const Element& element) const { return m_elementsWithDestroyedVisibleRenderer.contains(&element); } 176 bool shouldObserveVisibilityChangeForElement(const Element&); 162 177 163 178 enum class Event { … … 188 203 // FIXME: Move over to WeakHashSet when it starts supporting const. 189 204 HashSet<const Element*> m_elementsWithTransition; 205 HashSet<const Element*> m_elementsWithDestroyedVisibleRenderer; 190 206 WKContentChange m_observedContentState { WKContentNoChange }; 191 207 bool m_touchEventIsBeingDispatched { false }; … … 197 213 bool m_isBetweenTouchEndAndMouseMoved { false }; 198 214 bool m_isObservingTransitions { false }; 215 bool m_isInObservedRenderTreeUpdate { false }; 199 216 }; 200 217 -
trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp
r242340 r243752 137 137 void RenderTreeUpdater::updateRenderTree(ContainerNode& root) 138 138 { 139 #if PLATFORM(IOS_FAMILY) 140 ContentChangeObserver::RenderTreeUpdateScope observingScope(m_document); 141 #endif 142 139 143 ASSERT(root.renderer()); 140 144 ASSERT(m_parentStack.isEmpty()); … … 557 561 558 562 if (auto* renderer = element.renderer()) { 563 #if PLATFORM(IOS_FAMILY) 564 document.contentChangeObserver().willDestroyRenderer(element); 565 #endif 559 566 builder.destroyAndCleanUpAnonymousWrappers(*renderer); 560 567 element.setRenderer(nullptr);
Note:
See TracChangeset
for help on using the changeset viewer.