OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
5 * 2000 Dirk Mueller <mueller@kde.org> | 5 * 2000 Dirk Mueller <mueller@kde.org> |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
9 * Copyright (C) 2009 Google Inc. All rights reserved. | 9 * Copyright (C) 2009 Google Inc. All rights reserved. |
10 * | 10 * |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 , m_canHaveScrollbars(true) | 167 , m_canHaveScrollbars(true) |
168 , m_slowRepaintObjectCount(0) | 168 , m_slowRepaintObjectCount(0) |
169 , m_layoutTimer(this, &FrameView::layoutTimerFired) | 169 , m_layoutTimer(this, &FrameView::layoutTimerFired) |
170 , m_layoutRoot(0) | 170 , m_layoutRoot(0) |
171 , m_inSynchronousPostLayout(false) | 171 , m_inSynchronousPostLayout(false) |
172 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) | 172 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) |
173 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) | 173 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) |
174 , m_isTransparent(false) | 174 , m_isTransparent(false) |
175 , m_baseBackgroundColor(Color::white) | 175 , m_baseBackgroundColor(Color::white) |
176 , m_mediaType("screen") | 176 , m_mediaType("screen") |
177 , m_overflowEventSuspendCount(0) | |
178 , m_overflowStatusDirty(true) | 177 , m_overflowStatusDirty(true) |
179 , m_viewportRenderer(0) | 178 , m_viewportRenderer(0) |
180 , m_wasScrolledByUser(false) | 179 , m_wasScrolledByUser(false) |
181 , m_inProgrammaticScroll(false) | 180 , m_inProgrammaticScroll(false) |
182 , m_safeToPropagateScrollToParent(true) | 181 , m_safeToPropagateScrollToParent(true) |
183 , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired) | 182 , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired) |
184 , m_isTrackingRepaints(false) | 183 , m_isTrackingRepaints(false) |
185 , m_shouldUpdateWhileOffscreen(true) | 184 , m_shouldUpdateWhileOffscreen(true) |
186 , m_deferSetNeedsLayouts(0) | 185 , m_deferSetNeedsLayouts(0) |
187 , m_setNeedsLayoutWasDeferred(false) | 186 , m_setNeedsLayoutWasDeferred(false) |
(...skipping 29 matching lines...) Expand all Loading... |
217 RefPtr<FrameView> view = adoptRef(new FrameView(frame)); | 216 RefPtr<FrameView> view = adoptRef(new FrameView(frame)); |
218 view->Widget::setFrameRect(IntRect(view->location(), initialSize)); | 217 view->Widget::setFrameRect(IntRect(view->location(), initialSize)); |
219 view->setLayoutSizeInternal(initialSize); | 218 view->setLayoutSizeInternal(initialSize); |
220 | 219 |
221 view->show(); | 220 view->show(); |
222 return view.release(); | 221 return view.release(); |
223 } | 222 } |
224 | 223 |
225 FrameView::~FrameView() | 224 FrameView::~FrameView() |
226 { | 225 { |
227 if (m_postLayoutTasksTimer.isActive()) { | 226 if (m_postLayoutTasksTimer.isActive()) |
228 m_postLayoutTasksTimer.stop(); | 227 m_postLayoutTasksTimer.stop(); |
229 m_overflowEventQueue.clear(); | |
230 } | |
231 | 228 |
232 removeFromAXObjectCache(); | 229 removeFromAXObjectCache(); |
233 resetScrollbars(); | 230 resetScrollbars(); |
234 | 231 |
235 // Custom scrollbars should already be destroyed at this point | 232 // Custom scrollbars should already be destroyed at this point |
236 ASSERT(!horizontalScrollbar() || !horizontalScrollbar()->isCustomScrollbar()
); | 233 ASSERT(!horizontalScrollbar() || !horizontalScrollbar()->isCustomScrollbar()
); |
237 ASSERT(!verticalScrollbar() || !verticalScrollbar()->isCustomScrollbar()); | 234 ASSERT(!verticalScrollbar() || !verticalScrollbar()->isCustomScrollbar()); |
238 | 235 |
239 setHasHorizontalScrollbar(false); // Remove native scrollbars now before we
lose the connection to the HostWindow. | 236 setHasHorizontalScrollbar(false); // Remove native scrollbars now before we
lose the connection to the HostWindow. |
240 setHasVerticalScrollbar(false); | 237 setHasVerticalScrollbar(false); |
241 | 238 |
242 ASSERT(!m_scrollCorner); | 239 ASSERT(!m_scrollCorner); |
243 ASSERT(m_overflowEventQueue.isEmpty()); | |
244 | 240 |
245 ASSERT(m_frame); | 241 ASSERT(m_frame); |
246 ASSERT(m_frame->view() != this || !m_frame->contentRenderer()); | 242 ASSERT(m_frame->view() != this || !m_frame->contentRenderer()); |
247 RenderPart* renderer = m_frame->ownerRenderer(); | 243 RenderPart* renderer = m_frame->ownerRenderer(); |
248 if (renderer && renderer->widget() == this) | 244 if (renderer && renderer->widget() == this) |
249 renderer->setWidget(0); | 245 renderer->setWidget(0); |
250 } | 246 } |
251 | 247 |
252 void FrameView::reset() | 248 void FrameView::reset() |
253 { | 249 { |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 } | 914 } |
919 | 915 |
920 m_inLayout = false; | 916 m_inLayout = false; |
921 | 917 |
922 if (inSubtreeLayout) | 918 if (inSubtreeLayout) |
923 rootForThisLayout->view()->popLayoutState(rootForThisLayout); | 919 rootForThisLayout->view()->popLayoutState(rootForThisLayout); |
924 } | 920 } |
925 | 921 |
926 void FrameView::scheduleOrPerformPostLayoutTasks() | 922 void FrameView::scheduleOrPerformPostLayoutTasks() |
927 { | 923 { |
928 if (m_postLayoutTasksTimer.isActive()) { | 924 if (m_postLayoutTasksTimer.isActive()) |
929 resumeOverflowEvents(); | |
930 return; | 925 return; |
931 } | |
932 | 926 |
933 // Partial layouts should not happen with synchronous post layouts. | 927 // Partial layouts should not happen with synchronous post layouts. |
934 ASSERT(!(m_inSynchronousPostLayout && partialLayout().isStopping())); | 928 ASSERT(!(m_inSynchronousPostLayout && partialLayout().isStopping())); |
935 | 929 |
936 if (!m_inSynchronousPostLayout) { | 930 if (!m_inSynchronousPostLayout) { |
937 if (frame().document()->shouldDisplaySeamlesslyWithParent()) { | 931 if (frame().document()->shouldDisplaySeamlesslyWithParent()) { |
938 if (RenderView* renderView = this->renderView()) | 932 if (RenderView* renderView = this->renderView()) |
939 renderView->updateWidgetPositions(); | 933 renderView->updateWidgetPositions(); |
940 } else { | 934 } else { |
941 m_inSynchronousPostLayout = true; | 935 m_inSynchronousPostLayout = true; |
942 // Calls resumeScheduledEvents() | 936 // Calls resumeScheduledEvents() |
943 performPostLayoutTasks(); | 937 performPostLayoutTasks(); |
944 m_inSynchronousPostLayout = false; | 938 m_inSynchronousPostLayout = false; |
945 } | 939 } |
946 } | 940 } |
947 | 941 |
948 if (!m_postLayoutTasksTimer.isActive() && (needsLayout() || m_inSynchronousP
ostLayout || frame().document()->shouldDisplaySeamlesslyWithParent())) { | 942 if (!m_postLayoutTasksTimer.isActive() && (needsLayout() || m_inSynchronousP
ostLayout || frame().document()->shouldDisplaySeamlesslyWithParent())) { |
949 // If we need layout or are already in a synchronous call to postLayoutT
asks(), | 943 // If we need layout or are already in a synchronous call to postLayoutT
asks(), |
950 // defer widget updates and event dispatch until after we return. postLa
youtTasks() | 944 // defer widget updates and event dispatch until after we return. postLa
youtTasks() |
951 // can make us need to update again, and we can get stuck in a nasty cyc
le unless | 945 // can make us need to update again, and we can get stuck in a nasty cyc
le unless |
952 // we call it through the timer here. | 946 // we call it through the timer here. |
953 m_postLayoutTasksTimer.startOneShot(0); | 947 m_postLayoutTasksTimer.startOneShot(0); |
954 if (!partialLayout().isStopping() && needsLayout()) { | 948 if (!partialLayout().isStopping() && needsLayout()) |
955 suspendOverflowEvents(); | |
956 layout(); | 949 layout(); |
957 } | |
958 } | 950 } |
959 } | 951 } |
960 | 952 |
961 void FrameView::layout(bool allowSubtree) | 953 void FrameView::layout(bool allowSubtree) |
962 { | 954 { |
963 // We should never layout a Document which is not in a Frame. | 955 // We should never layout a Document which is not in a Frame. |
964 ASSERT(m_frame); | 956 ASSERT(m_frame); |
965 ASSERT(m_frame->view() == this); | 957 ASSERT(m_frame->view() == this); |
966 ASSERT(m_frame->page()); | 958 ASSERT(m_frame->page()); |
967 | 959 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 if (bodyRenderer && bodyRenderer->stretchesToViewport()) | 1071 if (bodyRenderer && bodyRenderer->stretchesToViewport()) |
1080 bodyRenderer->setChildNeedsLayout(); | 1072 bodyRenderer->setChildNeedsLayout(); |
1081 else if (rootRenderer && rootRenderer->stretchesToViewport()
) | 1073 else if (rootRenderer && rootRenderer->stretchesToViewport()
) |
1082 rootRenderer->setChildNeedsLayout(); | 1074 rootRenderer->setChildNeedsLayout(); |
1083 } | 1075 } |
1084 } | 1076 } |
1085 } | 1077 } |
1086 | 1078 |
1087 layer = rootForThisLayout->enclosingLayer(); | 1079 layer = rootForThisLayout->enclosingLayer(); |
1088 | 1080 |
1089 suspendOverflowEvents(); | |
1090 | |
1091 performLayout(rootForThisLayout, inSubtreeLayout); | 1081 performLayout(rootForThisLayout, inSubtreeLayout); |
1092 | 1082 |
1093 m_layoutRoot = 0; | 1083 m_layoutRoot = 0; |
1094 } // Reset m_layoutSchedulingEnabled to its previous value. | 1084 } // Reset m_layoutSchedulingEnabled to its previous value. |
1095 | 1085 |
1096 bool neededFullRepaint = m_doFullRepaint; | 1086 bool neededFullRepaint = m_doFullRepaint; |
1097 | 1087 |
1098 if (!inSubtreeLayout && !isPartialLayout && !toRenderView(rootForThisLayout)
->document().printing()) | 1088 if (!inSubtreeLayout && !isPartialLayout && !toRenderView(rootForThisLayout)
->document().printing()) |
1099 adjustViewSize(); | 1089 adjustViewSize(); |
1100 | 1090 |
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2120 m_shouldUpdateWhileOffscreen = shouldUpdateWhileOffscreen; | 2110 m_shouldUpdateWhileOffscreen = shouldUpdateWhileOffscreen; |
2121 } | 2111 } |
2122 | 2112 |
2123 bool FrameView::shouldUpdate() const | 2113 bool FrameView::shouldUpdate() const |
2124 { | 2114 { |
2125 if (isOffscreen() && !shouldUpdateWhileOffscreen()) | 2115 if (isOffscreen() && !shouldUpdateWhileOffscreen()) |
2126 return false; | 2116 return false; |
2127 return true; | 2117 return true; |
2128 } | 2118 } |
2129 | 2119 |
2130 void FrameView::suspendOverflowEvents() | |
2131 { | |
2132 ++m_overflowEventSuspendCount; | |
2133 } | |
2134 | |
2135 void FrameView::resumeOverflowEvents() | |
2136 { | |
2137 // FIXME: We should assert here but it makes several tests fail. See http://
crbug.com/299788 | |
2138 // ASSERT(m_overflowEventSuspendCount > 0); | |
2139 | |
2140 if (--m_overflowEventSuspendCount) | |
2141 return; | |
2142 | |
2143 Vector<RefPtr<OverflowEvent> > events; | |
2144 m_overflowEventQueue.swap(events); | |
2145 | |
2146 for (Vector<RefPtr<OverflowEvent> >::iterator it = events.begin(); it != eve
nts.end(); ++it) { | |
2147 Node* target = (*it)->target()->toNode(); | |
2148 if (target->inDocument()) | |
2149 target->dispatchEvent(*it, IGNORE_EXCEPTION); | |
2150 } | |
2151 } | |
2152 | |
2153 void FrameView::scheduleOverflowEvent(PassRefPtr<OverflowEvent> event) | |
2154 { | |
2155 m_overflowEventQueue.append(event); | |
2156 } | |
2157 | |
2158 void FrameView::scrollToAnchor() | 2120 void FrameView::scrollToAnchor() |
2159 { | 2121 { |
2160 RefPtr<Node> anchorNode = m_maintainScrollPositionAnchor; | 2122 RefPtr<Node> anchorNode = m_maintainScrollPositionAnchor; |
2161 if (!anchorNode) | 2123 if (!anchorNode) |
2162 return; | 2124 return; |
2163 | 2125 |
2164 if (!anchorNode->renderer()) | 2126 if (!anchorNode->renderer()) |
2165 return; | 2127 return; |
2166 | 2128 |
2167 LayoutRect rect; | 2129 LayoutRect rect; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2262 { | 2224 { |
2263 if (m_postLayoutTasksTimer.isActive()) | 2225 if (m_postLayoutTasksTimer.isActive()) |
2264 performPostLayoutTasks(); | 2226 performPostLayoutTasks(); |
2265 if (m_updateWidgetsTimer.isActive()) | 2227 if (m_updateWidgetsTimer.isActive()) |
2266 updateWidgetsTimerFired(0); | 2228 updateWidgetsTimerFired(0); |
2267 } | 2229 } |
2268 | 2230 |
2269 void FrameView::performPostLayoutTasks() | 2231 void FrameView::performPostLayoutTasks() |
2270 { | 2232 { |
2271 TRACE_EVENT0("webkit", "FrameView::performPostLayoutTasks"); | 2233 TRACE_EVENT0("webkit", "FrameView::performPostLayoutTasks"); |
2272 // FontFaceSet::didLayout() and resumeOverflowEvents() calls below can blow | 2234 // FontFaceSet::didLayout() calls below can blow us away from underneath. |
2273 // us away from underneath. | |
2274 // FIXME: We should not run any JavaScript code in this function. | 2235 // FIXME: We should not run any JavaScript code in this function. |
2275 RefPtr<FrameView> protect(this); | 2236 RefPtr<FrameView> protect(this); |
2276 | 2237 |
2277 m_postLayoutTasksTimer.stop(); | 2238 m_postLayoutTasksTimer.stop(); |
2278 | 2239 |
2279 m_frame->selection().setCaretRectNeedsUpdate(); | 2240 m_frame->selection().setCaretRectNeedsUpdate(); |
2280 m_frame->selection().updateAppearance(); | 2241 m_frame->selection().updateAppearance(); |
2281 | 2242 |
2282 if (m_nestedLayoutCount <= 1) { | 2243 if (m_nestedLayoutCount <= 1) { |
2283 if (m_firstLayoutCallbackPending) { | 2244 if (m_firstLayoutCallbackPending) { |
(...skipping 22 matching lines...) Expand all Loading... |
2306 | 2267 |
2307 m_updateWidgetsTimer.startOneShot(0); | 2268 m_updateWidgetsTimer.startOneShot(0); |
2308 | 2269 |
2309 if (Page* page = m_frame->page()) { | 2270 if (Page* page = m_frame->page()) { |
2310 if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordina
tor()) | 2271 if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordina
tor()) |
2311 scrollingCoordinator->notifyLayoutUpdated(); | 2272 scrollingCoordinator->notifyLayoutUpdated(); |
2312 } | 2273 } |
2313 | 2274 |
2314 scrollToAnchor(); | 2275 scrollToAnchor(); |
2315 | 2276 |
2316 resumeOverflowEvents(); | |
2317 | |
2318 sendResizeEventIfNeeded(); | 2277 sendResizeEventIfNeeded(); |
2319 } | 2278 } |
2320 | 2279 |
2321 void FrameView::sendResizeEventIfNeeded() | 2280 void FrameView::sendResizeEventIfNeeded() |
2322 { | 2281 { |
2323 ASSERT(m_frame); | 2282 ASSERT(m_frame); |
2324 | 2283 |
2325 RenderView* renderView = this->renderView(); | 2284 RenderView* renderView = this->renderView(); |
2326 if (!renderView || renderView->document().printing()) | 2285 if (!renderView || renderView->document().printing()) |
2327 return; | 2286 return; |
2328 | 2287 |
2329 IntSize currentSize = layoutSize(IncludeScrollbars); | 2288 IntSize currentSize = layoutSize(IncludeScrollbars); |
2330 float currentZoomFactor = renderView->style()->zoom(); | 2289 float currentZoomFactor = renderView->style()->zoom(); |
2331 | 2290 |
2332 bool shouldSendResizeEvent = currentSize != m_lastViewportSize || currentZoo
mFactor != m_lastZoomFactor; | 2291 bool shouldSendResizeEvent = currentSize != m_lastViewportSize || currentZoo
mFactor != m_lastZoomFactor; |
2333 | 2292 |
2334 m_lastViewportSize = currentSize; | 2293 m_lastViewportSize = currentSize; |
2335 m_lastZoomFactor = currentZoomFactor; | 2294 m_lastZoomFactor = currentZoomFactor; |
2336 | 2295 |
2337 if (!shouldSendResizeEvent) | 2296 if (!shouldSendResizeEvent) |
2338 return; | 2297 return; |
2339 | 2298 |
2340 m_frame->eventHandler().sendResizeEvent(); | 2299 m_frame->document()->enqueueResizeEvent(); |
2341 | 2300 |
2342 if (isMainFrame()) | 2301 if (isMainFrame()) |
2343 InspectorInstrumentation::didResizeMainFrame(m_frame->page()); | 2302 InspectorInstrumentation::didResizeMainFrame(m_frame->page()); |
2344 } | 2303 } |
2345 | 2304 |
2346 void FrameView::postLayoutTimerFired(Timer<FrameView>*) | 2305 void FrameView::postLayoutTimerFired(Timer<FrameView>*) |
2347 { | 2306 { |
2348 performPostLayoutTasks(); | 2307 performPostLayoutTasks(); |
2349 } | 2308 } |
2350 | 2309 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2473 | 2432 |
2474 bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow
); | 2433 bool horizontalOverflowChanged = (m_horizontalOverflow != horizontalOverflow
); |
2475 bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow); | 2434 bool verticalOverflowChanged = (m_verticalOverflow != verticalOverflow); |
2476 | 2435 |
2477 if (horizontalOverflowChanged || verticalOverflowChanged) { | 2436 if (horizontalOverflowChanged || verticalOverflowChanged) { |
2478 m_horizontalOverflow = horizontalOverflow; | 2437 m_horizontalOverflow = horizontalOverflow; |
2479 m_verticalOverflow = verticalOverflow; | 2438 m_verticalOverflow = verticalOverflow; |
2480 | 2439 |
2481 RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowCh
anged, horizontalOverflow, verticalOverflowChanged, verticalOverflow); | 2440 RefPtr<OverflowEvent> event = OverflowEvent::create(horizontalOverflowCh
anged, horizontalOverflow, verticalOverflowChanged, verticalOverflow); |
2482 event->setTarget(m_viewportRenderer->node()); | 2441 event->setTarget(m_viewportRenderer->node()); |
2483 scheduleOverflowEvent(event); | 2442 m_frame->document()->enqueueAnimationFrameEvent(event.release()); |
2484 } | 2443 } |
2485 | 2444 |
2486 } | 2445 } |
2487 | 2446 |
2488 const Pagination& FrameView::pagination() const | 2447 const Pagination& FrameView::pagination() const |
2489 { | 2448 { |
2490 if (m_pagination != Pagination()) | 2449 if (m_pagination != Pagination()) |
2491 return m_pagination; | 2450 return m_pagination; |
2492 | 2451 |
2493 if (isMainFrame()) | 2452 if (isMainFrame()) |
(...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3511 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) | 3470 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) |
3512 { | 3471 { |
3513 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3472 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
3514 if (AXObjectCache* cache = axObjectCache()) { | 3473 if (AXObjectCache* cache = axObjectCache()) { |
3515 cache->remove(scrollbar); | 3474 cache->remove(scrollbar); |
3516 cache->handleScrollbarUpdate(this); | 3475 cache->handleScrollbarUpdate(this); |
3517 } | 3476 } |
3518 } | 3477 } |
3519 | 3478 |
3520 } // namespace WebCore | 3479 } // namespace WebCore |
OLD | NEW |