| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "core/inspector/InspectorTraceEvents.h" | 48 #include "core/inspector/InspectorTraceEvents.h" |
| 49 #include "core/loader/FrameLoader.h" | 49 #include "core/loader/FrameLoader.h" |
| 50 #include "core/loader/FrameLoaderClient.h" | 50 #include "core/loader/FrameLoaderClient.h" |
| 51 #include "core/page/Chrome.h" | 51 #include "core/page/Chrome.h" |
| 52 #include "core/page/ChromeClient.h" | 52 #include "core/page/ChromeClient.h" |
| 53 #include "core/page/EventHandler.h" | 53 #include "core/page/EventHandler.h" |
| 54 #include "core/page/FocusController.h" | 54 #include "core/page/FocusController.h" |
| 55 #include "core/page/FrameTree.h" | 55 #include "core/page/FrameTree.h" |
| 56 #include "core/page/Page.h" | 56 #include "core/page/Page.h" |
| 57 #include "core/page/scrolling/ScrollingCoordinator.h" | 57 #include "core/page/scrolling/ScrollingCoordinator.h" |
| 58 #include "core/paint/LayerPainter.h" | 58 #include "core/paint/FramePainter.h" |
| 59 #include "core/paint/ScrollbarPainter.h" | |
| 60 #include "core/rendering/RenderCounter.h" | 59 #include "core/rendering/RenderCounter.h" |
| 61 #include "core/rendering/RenderEmbeddedObject.h" | 60 #include "core/rendering/RenderEmbeddedObject.h" |
| 62 #include "core/rendering/RenderLayer.h" | 61 #include "core/rendering/RenderLayer.h" |
| 63 #include "core/rendering/RenderListBox.h" | 62 #include "core/rendering/RenderListBox.h" |
| 64 #include "core/rendering/RenderPart.h" | 63 #include "core/rendering/RenderPart.h" |
| 65 #include "core/rendering/RenderScrollbar.h" | 64 #include "core/rendering/RenderScrollbar.h" |
| 66 #include "core/rendering/RenderScrollbarPart.h" | 65 #include "core/rendering/RenderScrollbarPart.h" |
| 67 #include "core/rendering/RenderTheme.h" | 66 #include "core/rendering/RenderTheme.h" |
| 68 #include "core/rendering/RenderView.h" | 67 #include "core/rendering/RenderView.h" |
| 69 #include "core/rendering/TextAutosizer.h" | 68 #include "core/rendering/TextAutosizer.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 89 #include "platform/text/TextStream.h" | 88 #include "platform/text/TextStream.h" |
| 90 #include "wtf/CurrentTime.h" | 89 #include "wtf/CurrentTime.h" |
| 91 #include "wtf/StdLibExtras.h" | 90 #include "wtf/StdLibExtras.h" |
| 92 #include "wtf/TemporaryChange.h" | 91 #include "wtf/TemporaryChange.h" |
| 93 | 92 |
| 94 namespace blink { | 93 namespace blink { |
| 95 | 94 |
| 96 using namespace HTMLNames; | 95 using namespace HTMLNames; |
| 97 | 96 |
| 98 double FrameView::s_currentFrameTimeStamp = 0.0; | 97 double FrameView::s_currentFrameTimeStamp = 0.0; |
| 99 bool FrameView::s_inPaintContents = false; | |
| 100 | 98 |
| 101 // The maximum number of updateWidgets iterations that should be done before ret
urning. | 99 // The maximum number of updateWidgets iterations that should be done before ret
urning. |
| 102 static const unsigned maxUpdateWidgetsIterations = 2; | 100 static const unsigned maxUpdateWidgetsIterations = 2; |
| 103 static const double resourcePriorityUpdateDelayAfterScroll = 0.250; | 101 static const double resourcePriorityUpdateDelayAfterScroll = 0.250; |
| 104 | 102 |
| 105 FrameView::FrameView(LocalFrame* frame) | 103 FrameView::FrameView(LocalFrame* frame) |
| 106 : m_frame(frame) | 104 : m_frame(frame) |
| 107 , m_canHaveScrollbars(true) | 105 , m_canHaveScrollbars(true) |
| 108 , m_slowRepaintObjectCount(0) | 106 , m_slowRepaintObjectCount(0) |
| 109 , m_hasPendingLayout(false) | 107 , m_hasPendingLayout(false) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 130 #if ENABLE(OILPAN) && ENABLE(ASSERT) | 128 #if ENABLE(OILPAN) && ENABLE(ASSERT) |
| 131 , m_hasBeenDisposed(false) | 129 , m_hasBeenDisposed(false) |
| 132 #endif | 130 #endif |
| 133 , m_horizontalScrollbarMode(ScrollbarAuto) | 131 , m_horizontalScrollbarMode(ScrollbarAuto) |
| 134 , m_verticalScrollbarMode(ScrollbarAuto) | 132 , m_verticalScrollbarMode(ScrollbarAuto) |
| 135 , m_horizontalScrollbarLock(false) | 133 , m_horizontalScrollbarLock(false) |
| 136 , m_verticalScrollbarLock(false) | 134 , m_verticalScrollbarLock(false) |
| 137 , m_scrollbarsAvoidingResizer(0) | 135 , m_scrollbarsAvoidingResizer(0) |
| 138 , m_scrollbarsSuppressed(false) | 136 , m_scrollbarsSuppressed(false) |
| 139 , m_inUpdateScrollbars(false) | 137 , m_inUpdateScrollbars(false) |
| 140 , m_drawPanScrollIcon(false) | 138 , m_shouldDrawPanScrollIcon(false) |
| 141 , m_clipsRepaints(true) | 139 , m_clipsRepaints(true) |
| 142 { | 140 { |
| 143 ASSERT(m_frame); | 141 ASSERT(m_frame); |
| 144 init(); | 142 init(); |
| 145 | 143 |
| 146 if (!m_frame->isMainFrame()) | 144 if (!m_frame->isMainFrame()) |
| 147 return; | 145 return; |
| 148 | 146 |
| 149 ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed); | 147 ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed); |
| 150 ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed); | 148 ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed); |
| (...skipping 2205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2356 m_scrollCorner->setStyle(cornerStyle.release()); | 2354 m_scrollCorner->setStyle(cornerStyle.release()); |
| 2357 invalidateScrollCorner(cornerRect); | 2355 invalidateScrollCorner(cornerRect); |
| 2358 } else if (m_scrollCorner) { | 2356 } else if (m_scrollCorner) { |
| 2359 m_scrollCorner->destroy(); | 2357 m_scrollCorner->destroy(); |
| 2360 m_scrollCorner = nullptr; | 2358 m_scrollCorner = nullptr; |
| 2361 } | 2359 } |
| 2362 | 2360 |
| 2363 updateScrollCornerInternal(); | 2361 updateScrollCornerInternal(); |
| 2364 } | 2362 } |
| 2365 | 2363 |
| 2366 void FrameView::paintScrollCorner(GraphicsContext* context, const IntRect& corne
rRect) | |
| 2367 { | |
| 2368 if (m_scrollCorner) { | |
| 2369 bool needsBackgorund = m_frame->isMainFrame(); | |
| 2370 if (needsBackgorund) | |
| 2371 context->fillRect(cornerRect, baseBackgroundColor()); | |
| 2372 ScrollbarPainter::paintIntoRect(m_scrollCorner, context, cornerRect.loca
tion(), cornerRect); | |
| 2373 return; | |
| 2374 } | |
| 2375 | |
| 2376 paintScrollCornerInternal(context, cornerRect); | |
| 2377 } | |
| 2378 | |
| 2379 void FrameView::paintScrollbar(GraphicsContext* context, Scrollbar* bar, const I
ntRect& rect) | |
| 2380 { | |
| 2381 bool needsBackgorund = bar->isCustomScrollbar() && m_frame->isMainFrame(); | |
| 2382 if (needsBackgorund) { | |
| 2383 IntRect toFill = bar->frameRect(); | |
| 2384 toFill.intersect(rect); | |
| 2385 context->fillRect(toFill, baseBackgroundColor()); | |
| 2386 } | |
| 2387 | |
| 2388 paintScrollbarInternal(context, bar, rect); | |
| 2389 } | |
| 2390 | |
| 2391 Color FrameView::documentBackgroundColor() const | 2364 Color FrameView::documentBackgroundColor() const |
| 2392 { | 2365 { |
| 2393 // <https://bugs.webkit.org/show_bug.cgi?id=59540> We blend the background c
olor of | 2366 // <https://bugs.webkit.org/show_bug.cgi?id=59540> We blend the background c
olor of |
| 2394 // the document and the body against the base background color of the frame
view. | 2367 // the document and the body against the base background color of the frame
view. |
| 2395 // Background images are unfortunately impractical to include. | 2368 // Background images are unfortunately impractical to include. |
| 2396 | 2369 |
| 2397 Color result = baseBackgroundColor(); | 2370 Color result = baseBackgroundColor(); |
| 2398 if (!frame().document()) | 2371 if (!frame().document()) |
| 2399 return result; | 2372 return result; |
| 2400 | 2373 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2453 } | 2426 } |
| 2454 | 2427 |
| 2455 void FrameView::setWasScrolledByUser(bool wasScrolledByUser) | 2428 void FrameView::setWasScrolledByUser(bool wasScrolledByUser) |
| 2456 { | 2429 { |
| 2457 if (m_inProgrammaticScroll) | 2430 if (m_inProgrammaticScroll) |
| 2458 return; | 2431 return; |
| 2459 m_maintainScrollPositionAnchor = nullptr; | 2432 m_maintainScrollPositionAnchor = nullptr; |
| 2460 m_wasScrolledByUser = wasScrolledByUser; | 2433 m_wasScrolledByUser = wasScrolledByUser; |
| 2461 } | 2434 } |
| 2462 | 2435 |
| 2463 void FrameView::paintContents(GraphicsContext* p, const IntRect& rect) | |
| 2464 { | |
| 2465 Document* document = m_frame->document(); | |
| 2466 | |
| 2467 #ifndef NDEBUG | |
| 2468 bool fillWithRed; | |
| 2469 if (document->printing()) | |
| 2470 fillWithRed = false; // Printing, don't fill with red (can't remember wh
y). | |
| 2471 else if (m_frame->owner()) | |
| 2472 fillWithRed = false; // Subframe, don't fill with red. | |
| 2473 else if (isTransparent()) | |
| 2474 fillWithRed = false; // Transparent, don't fill with red. | |
| 2475 else if (m_paintBehavior & PaintBehaviorSelectionOnly) | |
| 2476 fillWithRed = false; // Selections are transparent, don't fill with red. | |
| 2477 else if (m_nodeToDraw) | |
| 2478 fillWithRed = false; // Element images are transparent, don't fill with
red. | |
| 2479 else | |
| 2480 fillWithRed = true; | |
| 2481 | |
| 2482 if (fillWithRed) | |
| 2483 p->fillRect(rect, Color(0xFF, 0, 0)); | |
| 2484 #endif | |
| 2485 | |
| 2486 RenderView* renderView = this->renderView(); | |
| 2487 if (!renderView) { | |
| 2488 WTF_LOG_ERROR("called FrameView::paint with nil renderer"); | |
| 2489 return; | |
| 2490 } | |
| 2491 | |
| 2492 RELEASE_ASSERT(!needsLayout()); | |
| 2493 ASSERT(document->lifecycle().state() >= DocumentLifecycle::CompositingClean)
; | |
| 2494 | |
| 2495 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Paint", "data"
, InspectorPaintEvent::data(renderView, rect, 0)); | |
| 2496 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.stack"), "
CallStack", "stack", InspectorCallStackEvent::currentCallStack()); | |
| 2497 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli
ne migrates to tracing. | |
| 2498 InspectorInstrumentation::willPaint(renderView, 0); | |
| 2499 | |
| 2500 bool isTopLevelPainter = !s_inPaintContents; | |
| 2501 s_inPaintContents = true; | |
| 2502 | |
| 2503 FontCachePurgePreventer fontCachePurgePreventer; | |
| 2504 | |
| 2505 PaintBehavior oldPaintBehavior = m_paintBehavior; | |
| 2506 | |
| 2507 if (FrameView* parentView = parentFrameView()) { | |
| 2508 if (parentView->paintBehavior() & PaintBehaviorFlattenCompositingLayers) | |
| 2509 m_paintBehavior |= PaintBehaviorFlattenCompositingLayers; | |
| 2510 } | |
| 2511 | |
| 2512 if (m_paintBehavior == PaintBehaviorNormal) | |
| 2513 document->markers().invalidateRenderedRectsForMarkersInRect(rect); | |
| 2514 | |
| 2515 if (document->printing()) | |
| 2516 m_paintBehavior |= PaintBehaviorFlattenCompositingLayers; | |
| 2517 | |
| 2518 ASSERT(!m_isPainting); | |
| 2519 m_isPainting = true; | |
| 2520 | |
| 2521 // m_nodeToDraw is used to draw only one element (and its descendants) | |
| 2522 RenderObject* renderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0; | |
| 2523 RenderLayer* rootLayer = renderView->layer(); | |
| 2524 | |
| 2525 #if ENABLE(ASSERT) | |
| 2526 renderView->assertSubtreeIsLaidOut(); | |
| 2527 RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(*rootLayer-
>renderer()); | |
| 2528 #endif | |
| 2529 | |
| 2530 LayerPainter layerPainter(*rootLayer); | |
| 2531 | |
| 2532 layerPainter.paint(p, rect, m_paintBehavior, renderer); | |
| 2533 | |
| 2534 if (rootLayer->containsDirtyOverlayScrollbars()) | |
| 2535 layerPainter.paintOverlayScrollbars(p, rect, m_paintBehavior, renderer); | |
| 2536 | |
| 2537 m_isPainting = false; | |
| 2538 | |
| 2539 m_paintBehavior = oldPaintBehavior; | |
| 2540 m_lastPaintTime = currentTime(); | |
| 2541 | |
| 2542 // Regions may have changed as a result of the visibility/z-index of element
changing. | |
| 2543 if (document->annotatedRegionsDirty()) | |
| 2544 updateAnnotatedRegions(); | |
| 2545 | |
| 2546 if (isTopLevelPainter) { | |
| 2547 // Everything that happens after paintContents completions is considered | |
| 2548 // to be part of the next frame. | |
| 2549 s_currentFrameTimeStamp = currentTime(); | |
| 2550 s_inPaintContents = false; | |
| 2551 } | |
| 2552 | |
| 2553 InspectorInstrumentation::didPaint(renderView, 0, p, rect); | |
| 2554 } | |
| 2555 | |
| 2556 void FrameView::setPaintBehavior(PaintBehavior behavior) | 2436 void FrameView::setPaintBehavior(PaintBehavior behavior) |
| 2557 { | 2437 { |
| 2558 m_paintBehavior = behavior; | 2438 m_paintBehavior = behavior; |
| 2559 } | 2439 } |
| 2560 | 2440 |
| 2561 PaintBehavior FrameView::paintBehavior() const | 2441 PaintBehavior FrameView::paintBehavior() const |
| 2562 { | 2442 { |
| 2563 return m_paintBehavior; | 2443 return m_paintBehavior; |
| 2564 } | 2444 } |
| 2565 | 2445 |
| 2566 bool FrameView::isPainting() const | 2446 bool FrameView::isPainting() const |
| 2567 { | 2447 { |
| 2568 return m_isPainting; | 2448 return m_isPainting; |
| 2569 } | 2449 } |
| 2570 | 2450 |
| 2571 void FrameView::setNodeToDraw(Node* node) | 2451 void FrameView::setNodeToDraw(Node* node) |
| 2572 { | 2452 { |
| 2573 m_nodeToDraw = node; | 2453 m_nodeToDraw = node; |
| 2574 } | 2454 } |
| 2575 | 2455 |
| 2576 void FrameView::paintOverhangAreas(GraphicsContext* context, const IntRect& hori
zontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRec
t) | |
| 2577 { | |
| 2578 if (m_frame->document()->printing()) | |
| 2579 return; | |
| 2580 | |
| 2581 if (m_frame->isMainFrame()) { | |
| 2582 if (m_frame->page()->chrome().client().paintCustomOverhangArea(context,
horizontalOverhangArea, verticalOverhangArea, dirtyRect)) | |
| 2583 return; | |
| 2584 } | |
| 2585 | |
| 2586 paintOverhangAreasInternal(context, horizontalOverhangArea, verticalOverhang
Area, dirtyRect); | |
| 2587 } | |
| 2588 | |
| 2589 void FrameView::updateWidgetPositionsIfNeeded() | 2456 void FrameView::updateWidgetPositionsIfNeeded() |
| 2590 { | 2457 { |
| 2591 if (!m_needsUpdateWidgetPositions) | 2458 if (!m_needsUpdateWidgetPositions) |
| 2592 return; | 2459 return; |
| 2593 | 2460 |
| 2594 m_needsUpdateWidgetPositions = false; | 2461 m_needsUpdateWidgetPositions = false; |
| 2595 | 2462 |
| 2596 updateWidgetPositions(); | 2463 updateWidgetPositions(); |
| 2597 } | 2464 } |
| 2598 | 2465 |
| (...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3632 void FrameView::scrollContents(const IntSize& scrollDelta) | 3499 void FrameView::scrollContents(const IntSize& scrollDelta) |
| 3633 { | 3500 { |
| 3634 HostWindow* window = hostWindow(); | 3501 HostWindow* window = hostWindow(); |
| 3635 if (!window) | 3502 if (!window) |
| 3636 return; | 3503 return; |
| 3637 | 3504 |
| 3638 IntRect clipRect = windowClipRect(); | 3505 IntRect clipRect = windowClipRect(); |
| 3639 IntRect updateRect = clipRect; | 3506 IntRect updateRect = clipRect; |
| 3640 updateRect.intersect(rectToCopyOnScroll()); | 3507 updateRect.intersect(rectToCopyOnScroll()); |
| 3641 | 3508 |
| 3642 if (m_drawPanScrollIcon) { | 3509 if (m_shouldDrawPanScrollIcon) { |
| 3643 // FIXME: the pan icon is broken when accelerated compositing is on, sin
ce it will draw under the compositing layers. | 3510 // FIXME: the pan icon is broken when accelerated compositing is on, sin
ce it will draw under the compositing layers. |
| 3644 // https://bugs.webkit.org/show_bug.cgi?id=47837 | 3511 // https://bugs.webkit.org/show_bug.cgi?id=47837 |
| 3645 int panIconDirtySquareSizeLength = 2 * (panIconSizeLength + std::max(abs
(scrollDelta.width()), abs(scrollDelta.height()))); // We only want to repaint w
hat's necessary | 3512 int panIconDirtySquareSizeLength = 2 * (panIconSizeLength + std::max(abs
(scrollDelta.width()), abs(scrollDelta.height()))); // We only want to repaint w
hat's necessary |
| 3646 IntPoint panIconDirtySquareLocation = IntPoint(m_panScrollIconPoint.x()
- (panIconDirtySquareSizeLength / 2), m_panScrollIconPoint.y() - (panIconDirtySq
uareSizeLength / 2)); | 3513 IntPoint panIconDirtySquareLocation = IntPoint(m_panScrollIconPoint.x()
- (panIconDirtySquareSizeLength / 2), m_panScrollIconPoint.y() - (panIconDirtySq
uareSizeLength / 2)); |
| 3647 IntRect panScrollIconDirtyRect = IntRect(panIconDirtySquareLocation, Int
Size(panIconDirtySquareSizeLength, panIconDirtySquareSizeLength)); | 3514 IntRect panScrollIconDirtyRect = IntRect(panIconDirtySquareLocation, Int
Size(panIconDirtySquareSizeLength, panIconDirtySquareSizeLength)); |
| 3648 panScrollIconDirtyRect.intersect(clipRect); | 3515 panScrollIconDirtyRect.intersect(clipRect); |
| 3649 window->invalidateContentsAndRootView(panScrollIconDirtyRect); | 3516 window->invalidateContentsAndRootView(panScrollIconDirtyRect); |
| 3650 } | 3517 } |
| 3651 | 3518 |
| 3652 if (!scrollContentsFastPath(-scrollDelta)) | 3519 if (!scrollContentsFastPath(-scrollDelta)) |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3918 adjustScrollbarOpacity(); | 3785 adjustScrollbarOpacity(); |
| 3919 contentsResized(); | 3786 contentsResized(); |
| 3920 updateScrollbars(scrollOffsetDouble()); | 3787 updateScrollbars(scrollOffsetDouble()); |
| 3921 positionScrollbarLayers(); | 3788 positionScrollbarLayers(); |
| 3922 } | 3789 } |
| 3923 | 3790 |
| 3924 void FrameView::updateScrollCornerInternal() | 3791 void FrameView::updateScrollCornerInternal() |
| 3925 { | 3792 { |
| 3926 } | 3793 } |
| 3927 | 3794 |
| 3928 void FrameView::paintScrollCornerInternal(GraphicsContext* context, const IntRec
t& cornerRect) | |
| 3929 { | |
| 3930 ScrollbarTheme::theme()->paintScrollCorner(context, cornerRect); | |
| 3931 } | |
| 3932 | |
| 3933 void FrameView::paintScrollbarInternal(GraphicsContext* context, Scrollbar* bar,
const IntRect& rect) | |
| 3934 { | |
| 3935 bar->paint(context, rect); | |
| 3936 } | |
| 3937 | |
| 3938 void FrameView::invalidateScrollCornerRect(const IntRect& rect) | 3795 void FrameView::invalidateScrollCornerRect(const IntRect& rect) |
| 3939 { | 3796 { |
| 3940 invalidateRect(rect); | 3797 invalidateRect(rect); |
| 3941 } | 3798 } |
| 3942 | 3799 |
| 3943 void FrameView::paintScrollbars(GraphicsContext* context, const IntRect& rect) | |
| 3944 { | |
| 3945 if (m_horizontalScrollbar && !layerForHorizontalScrollbar()) | |
| 3946 paintScrollbar(context, m_horizontalScrollbar.get(), rect); | |
| 3947 if (m_verticalScrollbar && !layerForVerticalScrollbar()) | |
| 3948 paintScrollbar(context, m_verticalScrollbar.get(), rect); | |
| 3949 | |
| 3950 if (layerForScrollCorner()) | |
| 3951 return; | |
| 3952 paintScrollCorner(context, scrollCornerRect()); | |
| 3953 } | |
| 3954 | |
| 3955 void FrameView::paintPanScrollIcon(GraphicsContext* context) | 3800 void FrameView::paintPanScrollIcon(GraphicsContext* context) |
| 3956 { | 3801 { |
| 3957 DEFINE_STATIC_REF(Image, panScrollIcon, (Image::loadPlatformResource("panIco
n"))); | 3802 DEFINE_STATIC_REF(Image, panScrollIcon, (Image::loadPlatformResource("panIco
n"))); |
| 3958 IntPoint iconGCPoint = m_panScrollIconPoint; | 3803 IntPoint iconGCPoint = m_panScrollIconPoint; |
| 3959 if (parent()) | 3804 if (parent()) |
| 3960 iconGCPoint = toFrameView(parent())->windowToContents(iconGCPoint); | 3805 iconGCPoint = toFrameView(parent())->windowToContents(iconGCPoint); |
| 3961 context->drawImage(panScrollIcon, iconGCPoint); | 3806 context->drawImage(panScrollIcon, iconGCPoint); |
| 3962 } | 3807 } |
| 3963 | 3808 |
| 3964 void FrameView::paint(GraphicsContext* context, const IntRect& rect) | 3809 void FrameView::paint(GraphicsContext* context, const IntRect& rect) |
| 3965 { | 3810 { |
| 3966 notifyPageThatContentAreaWillPaint(); | 3811 FramePainter(*this).paint(context, rect); |
| 3812 } |
| 3967 | 3813 |
| 3968 IntRect documentDirtyRect = rect; | 3814 void FrameView::paintContents(GraphicsContext* context, const IntRect& damageRec
t) |
| 3969 IntRect visibleAreaWithoutScrollbars(location(), visibleContentRect().size()
); | 3815 { |
| 3970 documentDirtyRect.intersect(visibleAreaWithoutScrollbars); | 3816 FramePainter(*this).paintContents(context, damageRect); |
| 3971 | |
| 3972 if (!documentDirtyRect.isEmpty()) { | |
| 3973 GraphicsContextStateSaver stateSaver(*context); | |
| 3974 | |
| 3975 context->translate(x() - scrollX(), y() - scrollY()); | |
| 3976 context->clip(visibleContentRect()); | |
| 3977 | |
| 3978 documentDirtyRect.moveBy(-location() + scrollPosition()); | |
| 3979 paintContents(context, documentDirtyRect); | |
| 3980 } | |
| 3981 | |
| 3982 calculateAndPaintOverhangAreas(context, rect); | |
| 3983 | |
| 3984 // Now paint the scrollbars. | |
| 3985 if (!m_scrollbarsSuppressed && (m_horizontalScrollbar || m_verticalScrollbar
)) { | |
| 3986 GraphicsContextStateSaver stateSaver(*context); | |
| 3987 IntRect scrollViewDirtyRect = rect; | |
| 3988 IntRect visibleAreaWithScrollbars(location(), visibleContentRect(Include
Scrollbars).size()); | |
| 3989 scrollViewDirtyRect.intersect(visibleAreaWithScrollbars); | |
| 3990 context->translate(x(), y()); | |
| 3991 scrollViewDirtyRect.moveBy(-location()); | |
| 3992 context->clip(IntRect(IntPoint(), visibleAreaWithScrollbars.size())); | |
| 3993 | |
| 3994 paintScrollbars(context, scrollViewDirtyRect); | |
| 3995 } | |
| 3996 | |
| 3997 // Paint the panScroll Icon | |
| 3998 if (m_drawPanScrollIcon) | |
| 3999 paintPanScrollIcon(context); | |
| 4000 } | 3817 } |
| 4001 | 3818 |
| 4002 void FrameView::calculateOverhangAreasForPainting(IntRect& horizontalOverhangRec
t, IntRect& verticalOverhangRect) | 3819 void FrameView::calculateOverhangAreasForPainting(IntRect& horizontalOverhangRec
t, IntRect& verticalOverhangRect) |
| 4003 { | 3820 { |
| 4004 int verticalScrollbarWidth = (verticalScrollbar() && !verticalScrollbar()->i
sOverlayScrollbar()) | 3821 int verticalScrollbarWidth = (verticalScrollbar() && !verticalScrollbar()->i
sOverlayScrollbar()) |
| 4005 ? verticalScrollbar()->width() : 0; | 3822 ? verticalScrollbar()->width() : 0; |
| 4006 int horizontalScrollbarHeight = (horizontalScrollbar() && !horizontalScrollb
ar()->isOverlayScrollbar()) | 3823 int horizontalScrollbarHeight = (horizontalScrollbar() && !horizontalScrollb
ar()->isOverlayScrollbar()) |
| 4007 ? horizontalScrollbar()->height() : 0; | 3824 ? horizontalScrollbar()->height() : 0; |
| 4008 | 3825 |
| 4009 int physicalScrollY = scrollPosition().y() + scrollOrigin().y(); | 3826 int physicalScrollY = scrollPosition().y() + scrollOrigin().y(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4048 | 3865 |
| 4049 IntRect horizontalOverhangRect; | 3866 IntRect horizontalOverhangRect; |
| 4050 IntRect verticalOverhangRect; | 3867 IntRect verticalOverhangRect; |
| 4051 calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRe
ct); | 3868 calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRe
ct); |
| 4052 if (!horizontalOverhangRect.isEmpty()) | 3869 if (!horizontalOverhangRect.isEmpty()) |
| 4053 window->invalidateContentsAndRootView(horizontalOverhangRect); | 3870 window->invalidateContentsAndRootView(horizontalOverhangRect); |
| 4054 if (!verticalOverhangRect.isEmpty()) | 3871 if (!verticalOverhangRect.isEmpty()) |
| 4055 window->invalidateContentsAndRootView(verticalOverhangRect); | 3872 window->invalidateContentsAndRootView(verticalOverhangRect); |
| 4056 } | 3873 } |
| 4057 | 3874 |
| 4058 void FrameView::paintOverhangAreasInternal(GraphicsContext* context, const IntRe
ct& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect&
dirtyRect) | |
| 4059 { | |
| 4060 ScrollbarTheme::theme()->paintOverhangBackground(context, horizontalOverhang
Rect, verticalOverhangRect, dirtyRect); | |
| 4061 ScrollbarTheme::theme()->paintOverhangShadows(context, scrollOffset(), horiz
ontalOverhangRect, verticalOverhangRect, dirtyRect); | |
| 4062 } | |
| 4063 | |
| 4064 void FrameView::calculateAndPaintOverhangAreas(GraphicsContext* context, const I
ntRect& dirtyRect) | |
| 4065 { | |
| 4066 IntRect horizontalOverhangRect; | |
| 4067 IntRect verticalOverhangRect; | |
| 4068 calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRe
ct); | |
| 4069 | |
| 4070 if (dirtyRect.intersects(horizontalOverhangRect) || dirtyRect.intersects(ver
ticalOverhangRect)) | |
| 4071 paintOverhangAreas(context, horizontalOverhangRect, verticalOverhangRect
, dirtyRect); | |
| 4072 } | |
| 4073 | |
| 4074 void FrameView::calculateAndPaintOverhangBackground(GraphicsContext* context, co
nst IntRect& dirtyRect) | |
| 4075 { | |
| 4076 IntRect horizontalOverhangRect; | |
| 4077 IntRect verticalOverhangRect; | |
| 4078 calculateOverhangAreasForPainting(horizontalOverhangRect, verticalOverhangRe
ct); | |
| 4079 | |
| 4080 if (dirtyRect.intersects(horizontalOverhangRect) || dirtyRect.intersects(ver
ticalOverhangRect)) | |
| 4081 ScrollbarTheme::theme()->paintOverhangBackground(context, horizontalOver
hangRect, verticalOverhangRect, dirtyRect); | |
| 4082 } | |
| 4083 | |
| 4084 bool FrameView::isPointInScrollbarCorner(const IntPoint& windowPoint) | 3875 bool FrameView::isPointInScrollbarCorner(const IntPoint& windowPoint) |
| 4085 { | 3876 { |
| 4086 if (!scrollbarCornerPresent()) | 3877 if (!scrollbarCornerPresent()) |
| 4087 return false; | 3878 return false; |
| 4088 | 3879 |
| 4089 IntPoint viewPoint = convertFromContainingWindow(windowPoint); | 3880 IntPoint viewPoint = convertFromContainingWindow(windowPoint); |
| 4090 | 3881 |
| 4091 if (m_horizontalScrollbar) { | 3882 if (m_horizontalScrollbar) { |
| 4092 int horizontalScrollbarYMin = m_horizontalScrollbar->frameRect().y(); | 3883 int horizontalScrollbarYMin = m_horizontalScrollbar->frameRect().y(); |
| 4093 int horizontalScrollbarYMax = m_horizontalScrollbar->frameRect().y() + m
_horizontalScrollbar->frameRect().height(); | 3884 int horizontalScrollbarYMax = m_horizontalScrollbar->frameRect().y() + m
_horizontalScrollbar->frameRect().height(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4183 } | 3974 } |
| 4184 | 3975 |
| 4185 Widget::hide(); | 3976 Widget::hide(); |
| 4186 } | 3977 } |
| 4187 | 3978 |
| 4188 void FrameView::addPanScrollIcon(const IntPoint& iconPosition) | 3979 void FrameView::addPanScrollIcon(const IntPoint& iconPosition) |
| 4189 { | 3980 { |
| 4190 HostWindow* window = hostWindow(); | 3981 HostWindow* window = hostWindow(); |
| 4191 if (!window) | 3982 if (!window) |
| 4192 return; | 3983 return; |
| 4193 m_drawPanScrollIcon = true; | 3984 m_shouldDrawPanScrollIcon = true; |
| 4194 m_panScrollIconPoint = IntPoint(iconPosition.x() - panIconSizeLength / 2 , i
conPosition.y() - panIconSizeLength / 2); | 3985 m_panScrollIconPoint = IntPoint(iconPosition.x() - panIconSizeLength / 2 , i
conPosition.y() - panIconSizeLength / 2); |
| 4195 window->invalidateContentsAndRootView(IntRect(m_panScrollIconPoint, IntSize(
panIconSizeLength, panIconSizeLength))); | 3986 window->invalidateContentsAndRootView(IntRect(m_panScrollIconPoint, IntSize(
panIconSizeLength, panIconSizeLength))); |
| 4196 } | 3987 } |
| 4197 | 3988 |
| 4198 void FrameView::removePanScrollIcon() | 3989 void FrameView::removePanScrollIcon() |
| 4199 { | 3990 { |
| 4200 HostWindow* window = hostWindow(); | 3991 HostWindow* window = hostWindow(); |
| 4201 if (!window) | 3992 if (!window) |
| 4202 return; | 3993 return; |
| 4203 m_drawPanScrollIcon = false; | 3994 m_shouldDrawPanScrollIcon = false; |
| 4204 window->invalidateContentsAndRootView(IntRect(m_panScrollIconPoint, IntSize(
panIconSizeLength, panIconSizeLength))); | 3995 window->invalidateContentsAndRootView(IntRect(m_panScrollIconPoint, IntSize(
panIconSizeLength, panIconSizeLength))); |
| 4205 } | 3996 } |
| 4206 | 3997 |
| 4207 void FrameView::setScrollOrigin(const IntPoint& origin, bool updatePositionAtAll
, bool updatePositionSynchronously) | 3998 void FrameView::setScrollOrigin(const IntPoint& origin, bool updatePositionAtAll
, bool updatePositionSynchronously) |
| 4208 { | 3999 { |
| 4209 if (scrollOrigin() == origin) | 4000 if (scrollOrigin() == origin) |
| 4210 return; | 4001 return; |
| 4211 | 4002 |
| 4212 ScrollableArea::setScrollOrigin(origin); | 4003 ScrollableArea::setScrollOrigin(origin); |
| 4213 | 4004 |
| 4214 // Update if the scroll origin changes, since our position will be different
if the content size did not change. | 4005 // Update if the scroll origin changes, since our position will be different
if the content size did not change. |
| 4215 if (updatePositionAtAll && updatePositionSynchronously) | 4006 if (updatePositionAtAll && updatePositionSynchronously) |
| 4216 updateScrollbars(scrollOffsetDouble()); | 4007 updateScrollbars(scrollOffsetDouble()); |
| 4217 } | 4008 } |
| 4218 | 4009 |
| 4219 } // namespace blink | 4010 } // namespace blink |
| OLD | NEW |