Title: [149287] trunk/Source/WebCore
Revision
149287
Author
[email protected]
Date
2013-04-29 08:33:31 -0700 (Mon, 29 Apr 2013)

Log Message

When updating geometry, send _javascript_ resize before before layout/paint.
<http://webkit.org/b/115199>
<rdar://problem/13735535>

Reviewed by Geoffrey Garen.

Make the "resize" event synchronous and dispatch it before doing any automatic
resize-induced layout. This avoids unnecessary work in cases where an event handler
does something that dirties style.

It also avoids a kind of JS-side FOUC that happens if we drop out to the runloop
and paint before the resize event handler runs; for example, when viewing a popup
on <http://lokeshdhakar.com/projects/lightbox2/> and resizing the window, the dark
overlay sometimes resizes out of sync with the web view, since a paint may happen
between automatic layout and the resize event.

* page/EventHandler.h:
* page/EventHandler.cpp:
(WebCore::EventHandler::dispatchResizeEvent):
* page/FrameView.h:
* page/FrameView.cpp:
(WebCore::FrameView::dispatchResizeEvent):

    Renamed sendResizeEvent() to dispatchResizeEvent() and made it dispatch the event
    synchronously instead of adding it to the DocumentEventQueue.

(WebCore::FrameView::performPostLayoutTasks):
(WebCore::FrameView::setFrameRect):

    Dispatch the "resize" event right when the new frame rect is set.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (149286 => 149287)


--- trunk/Source/WebCore/ChangeLog	2013-04-29 15:30:19 UTC (rev 149286)
+++ trunk/Source/WebCore/ChangeLog	2013-04-29 15:33:31 UTC (rev 149287)
@@ -1,3 +1,36 @@
+2013-04-29  Andreas Kling  <[email protected]>
+
+        When updating geometry, send _javascript_ resize before before layout/paint.
+        <http://webkit.org/b/115199>
+        <rdar://problem/13735535>
+
+        Reviewed by Geoffrey Garen.
+
+        Make the "resize" event synchronous and dispatch it before doing any automatic
+        resize-induced layout. This avoids unnecessary work in cases where an event handler
+        does something that dirties style.
+
+        It also avoids a kind of JS-side FOUC that happens if we drop out to the runloop
+        and paint before the resize event handler runs; for example, when viewing a popup
+        on <http://lokeshdhakar.com/projects/lightbox2/> and resizing the window, the dark
+        overlay sometimes resizes out of sync with the web view, since a paint may happen
+        between automatic layout and the resize event.
+
+        * page/EventHandler.h:
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::dispatchResizeEvent):
+        * page/FrameView.h:
+        * page/FrameView.cpp:
+        (WebCore::FrameView::dispatchResizeEvent):
+
+            Renamed sendResizeEvent() to dispatchResizeEvent() and made it dispatch the event
+            synchronously instead of adding it to the DocumentEventQueue.
+
+        (WebCore::FrameView::performPostLayoutTasks):
+        (WebCore::FrameView::setFrameRect):
+
+            Dispatch the "resize" event right when the new frame rect is set.
+
 2013-04-29  Patrick Gansterer  <[email protected]>
 
         Remove OS(WINCE) from (Render|Scrollbar)ThemeWin.cpp

Modified: trunk/Source/WebCore/page/EventHandler.cpp (149286 => 149287)


--- trunk/Source/WebCore/page/EventHandler.cpp	2013-04-29 15:30:19 UTC (rev 149286)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2013-04-29 15:33:31 UTC (rev 149287)
@@ -3784,9 +3784,10 @@
     }
 }
 
-void EventHandler::sendResizeEvent()
+void EventHandler::dispatchResizeEvent()
 {
-    m_frame->document()->enqueueWindowEvent(Event::create(eventNames().resizeEvent, false, false));
+    RefPtr<Event> resizeEvent = Event::create(eventNames().resizeEvent, false, false);
+    m_frame->document()->dispatchWindowEvent(resizeEvent.release(), m_frame->document()->domWindow());
 }
 
 void EventHandler::sendScrollEvent()

Modified: trunk/Source/WebCore/page/EventHandler.h (149286 => 149287)


--- trunk/Source/WebCore/page/EventHandler.h	2013-04-29 15:30:19 UTC (rev 149286)
+++ trunk/Source/WebCore/page/EventHandler.h	2013-04-29 15:33:31 UTC (rev 149287)
@@ -230,7 +230,7 @@
 
     void capsLockStateMayHaveChanged(); // Only called by FrameSelection
     
-    void sendResizeEvent(); // Only called in FrameView
+    void dispatchResizeEvent(); // Only called in FrameView
     void sendScrollEvent(); // Ditto
 
 #if PLATFORM(MAC) && defined(__OBJC__)

Modified: trunk/Source/WebCore/page/FrameView.cpp (149286 => 149287)


--- trunk/Source/WebCore/page/FrameView.cpp	2013-04-29 15:30:19 UTC (rev 149286)
+++ trunk/Source/WebCore/page/FrameView.cpp	2013-04-29 15:33:31 UTC (rev 149287)
@@ -467,12 +467,29 @@
 
     updateScrollableAreaSet();
 
+    RenderView* renderView = this->renderView();
+
 #if USE(ACCELERATED_COMPOSITING)
-    if (RenderView* renderView = this->renderView()) {
+    if (renderView) {
         if (renderView->usesCompositing())
             renderView->compositor()->frameViewDidChangeSize();
     }
 #endif
+
+    if (renderView && !renderView->printing()) {
+        IntSize currentSize;
+        if (useFixedLayout() && !fixedLayoutSize().isEmpty() && delegatesScrolling())
+            currentSize = fixedLayoutSize();
+        else
+            currentSize = visibleContentRect(IncludeScrollbars).size();
+        float currentZoomFactor = renderView->style()->zoom();
+        bool resized = !m_firstLayout && (currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor);
+        m_lastViewportSize = currentSize;
+        m_lastZoomFactor = currentZoomFactor;
+        if (resized)
+            dispatchResizeEvent();
+    }
+
 }
 
 #if ENABLE(REQUEST_ANIMATION_FRAME)
@@ -2761,27 +2778,13 @@
     scrollToAnchor();
 
     m_actionScheduler->resume();
-
-    if (renderView && !renderView->printing()) {
-        IntSize currentSize;
-        if (useFixedLayout() && !fixedLayoutSize().isEmpty() && delegatesScrolling())
-            currentSize = fixedLayoutSize();
-        else
-            currentSize = visibleContentRect(IncludeScrollbars).size();
-        float currentZoomFactor = renderView->style()->zoom();
-        bool resized = !m_firstLayout && (currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor);
-        m_lastViewportSize = currentSize;
-        m_lastZoomFactor = currentZoomFactor;
-        if (resized)
-            sendResizeEvent();
-    }
 }
 
-void FrameView::sendResizeEvent()
+void FrameView::dispatchResizeEvent()
 {
     ASSERT(m_frame);
 
-    m_frame->eventHandler()->sendResizeEvent();
+    m_frame->eventHandler()->dispatchResizeEvent();
 
 #if ENABLE(INSPECTOR)
     if (InspectorInstrumentation::hasFrontends()) {

Modified: trunk/Source/WebCore/page/FrameView.h (149286 => 149287)


--- trunk/Source/WebCore/page/FrameView.h	2013-04-29 15:30:19 UTC (rev 149286)
+++ trunk/Source/WebCore/page/FrameView.h	2013-04-29 15:33:31 UTC (rev 149287)
@@ -491,9 +491,7 @@
     virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
     virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
 
-    void scheduleResizeEvent();
-    void sendResizeEvent();
-    void delayedResizeEventTimerFired(Timer<FrameView>*);
+    void dispatchResizeEvent();
 
     void updateScrollableAreaSet();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to