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