| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 destroyRootLayer(); | 256 destroyRootLayer(); |
| 257 } | 257 } |
| 258 } | 258 } |
| 259 | 259 |
| 260 void RenderLayerCompositor::cacheAcceleratedCompositingFlags() | 260 void RenderLayerCompositor::cacheAcceleratedCompositingFlags() |
| 261 { | 261 { |
| 262 bool hasAcceleratedCompositing = false; | 262 bool hasAcceleratedCompositing = false; |
| 263 bool showRepaintCounter = false; | 263 bool showRepaintCounter = false; |
| 264 bool forceCompositingMode = false; | 264 bool forceCompositingMode = false; |
| 265 | 265 |
| 266 if (Settings* settings = m_renderView->document()->settings()) { | 266 if (Settings* settings = m_renderView->document().settings()) { |
| 267 hasAcceleratedCompositing = settings->acceleratedCompositingEnabled(); | 267 hasAcceleratedCompositing = settings->acceleratedCompositingEnabled(); |
| 268 | 268 |
| 269 // We allow the chrome to override the settings, in case the page is ren
dered | 269 // We allow the chrome to override the settings, in case the page is ren
dered |
| 270 // on a chrome that doesn't allow accelerated compositing. | 270 // on a chrome that doesn't allow accelerated compositing. |
| 271 if (hasAcceleratedCompositing) { | 271 if (hasAcceleratedCompositing) { |
| 272 if (Page* page = this->page()) { | 272 if (Page* page = this->page()) { |
| 273 m_compositingTriggers = page->chrome().client().allowedCompositi
ngTriggers(); | 273 m_compositingTriggers = page->chrome().client().allowedCompositi
ngTriggers(); |
| 274 hasAcceleratedCompositing = m_compositingTriggers; | 274 hasAcceleratedCompositing = m_compositingTriggers; |
| 275 } | 275 } |
| 276 } | 276 } |
| (...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1196 void RenderLayerCompositor::frameViewDidScroll() | 1196 void RenderLayerCompositor::frameViewDidScroll() |
| 1197 { | 1197 { |
| 1198 FrameView* frameView = m_renderView->frameView(); | 1198 FrameView* frameView = m_renderView->frameView(); |
| 1199 IntPoint scrollPosition = frameView->scrollPosition(); | 1199 IntPoint scrollPosition = frameView->scrollPosition(); |
| 1200 | 1200 |
| 1201 if (!m_scrollLayer) | 1201 if (!m_scrollLayer) |
| 1202 return; | 1202 return; |
| 1203 | 1203 |
| 1204 bool scrollingCoordinatorHandlesOffset = false; | 1204 bool scrollingCoordinatorHandlesOffset = false; |
| 1205 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator(
)) { | 1205 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator(
)) { |
| 1206 if (Settings* settings = m_renderView->document()->settings()) { | 1206 if (Settings* settings = m_renderView->document().settings()) { |
| 1207 if (isMainFrame() || settings->compositedScrollingForFramesEnabled()
) | 1207 if (isMainFrame() || settings->compositedScrollingForFramesEnabled()
) |
| 1208 scrollingCoordinatorHandlesOffset = scrollingCoordinator->scroll
ableAreaScrollLayerDidChange(frameView); | 1208 scrollingCoordinatorHandlesOffset = scrollingCoordinator->scroll
ableAreaScrollLayerDidChange(frameView); |
| 1209 } | 1209 } |
| 1210 } | 1210 } |
| 1211 | 1211 |
| 1212 // Scroll position = scroll minimum + scroll offset. Adjust the layer's | 1212 // Scroll position = scroll minimum + scroll offset. Adjust the layer's |
| 1213 // position to handle whatever the scroll coordinator isn't handling. | 1213 // position to handle whatever the scroll coordinator isn't handling. |
| 1214 // The minimum scroll position is non-zero for RTL pages with overflow. | 1214 // The minimum scroll position is non-zero for RTL pages with overflow. |
| 1215 if (scrollingCoordinatorHandlesOffset) | 1215 if (scrollingCoordinatorHandlesOffset) |
| 1216 m_scrollLayer->setPosition(-frameView->minimumScrollPosition()); | 1216 m_scrollLayer->setPosition(-frameView->minimumScrollPosition()); |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1900 if (AnimationController* animController = renderer->animation()) | 1900 if (AnimationController* animController = renderer->animation()) |
| 1901 return animController->isRunningAcceleratableAnimationOnRenderer(rendere
r); | 1901 return animController->isRunningAcceleratableAnimationOnRenderer(rendere
r); |
| 1902 return false; | 1902 return false; |
| 1903 } | 1903 } |
| 1904 | 1904 |
| 1905 bool RenderLayerCompositor::requiresCompositingForTransition(RenderObject* rende
rer) const | 1905 bool RenderLayerCompositor::requiresCompositingForTransition(RenderObject* rende
rer) const |
| 1906 { | 1906 { |
| 1907 if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) | 1907 if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) |
| 1908 return false; | 1908 return false; |
| 1909 | 1909 |
| 1910 if (Settings* settings = m_renderView->document()->settings()) { | 1910 if (Settings* settings = m_renderView->document().settings()) { |
| 1911 if (!settings->acceleratedCompositingForTransitionEnabled()) | 1911 if (!settings->acceleratedCompositingForTransitionEnabled()) |
| 1912 return false; | 1912 return false; |
| 1913 } | 1913 } |
| 1914 | 1914 |
| 1915 return renderer->style()->transitionForProperty(CSSPropertyOpacity) | 1915 return renderer->style()->transitionForProperty(CSSPropertyOpacity) |
| 1916 || renderer->style()->transitionForProperty(CSSPropertyWebkitFilter) | 1916 || renderer->style()->transitionForProperty(CSSPropertyWebkitFilter) |
| 1917 || renderer->style()->transitionForProperty(CSSPropertyWebkitTransform); | 1917 || renderer->style()->transitionForProperty(CSSPropertyWebkitTransform); |
| 1918 } | 1918 } |
| 1919 | 1919 |
| 1920 CompositingReasons RenderLayerCompositor::subtreeReasonsForCompositing(RenderObj
ect* renderer, bool hasCompositedDescendants, bool has3DTransformedDescendants)
const | 1920 CompositingReasons RenderLayerCompositor::subtreeReasonsForCompositing(RenderObj
ect* renderer, bool hasCompositedDescendants, bool has3DTransformedDescendants)
const |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2023 EPosition position = renderer->style()->position(); | 2023 EPosition position = renderer->style()->position(); |
| 2024 bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPositio
n; | 2024 bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPositio
n; |
| 2025 if (isFixed && !layer->isStackingContainer()) | 2025 if (isFixed && !layer->isStackingContainer()) |
| 2026 return false; | 2026 return false; |
| 2027 | 2027 |
| 2028 bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition
; | 2028 bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition
; |
| 2029 if (!isFixed && !isSticky) | 2029 if (!isFixed && !isSticky) |
| 2030 return false; | 2030 return false; |
| 2031 | 2031 |
| 2032 // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be r
enamed acceleratedCompositingForViewportConstrainedPositionEnabled(). | 2032 // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be r
enamed acceleratedCompositingForViewportConstrainedPositionEnabled(). |
| 2033 if (Settings* settings = m_renderView->document()->settings()) { | 2033 if (Settings* settings = m_renderView->document().settings()) { |
| 2034 if (!settings->acceleratedCompositingForFixedPositionEnabled()) | 2034 if (!settings->acceleratedCompositingForFixedPositionEnabled()) |
| 2035 return false; | 2035 return false; |
| 2036 } | 2036 } |
| 2037 | 2037 |
| 2038 if (isSticky) | 2038 if (isSticky) |
| 2039 return true; | 2039 return true; |
| 2040 | 2040 |
| 2041 RenderObject* container = renderer->container(); | 2041 RenderObject* container = renderer->container(); |
| 2042 // If the renderer is not hooked up yet then we have to wait until it is. | 2042 // If the renderer is not hooked up yet then we have to wait until it is. |
| 2043 if (!container) { | 2043 if (!container) { |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2162 #if ENABLE(RUBBER_BANDING) | 2162 #if ENABLE(RUBBER_BANDING) |
| 2163 } else if (graphicsLayer == layerForOverhangAreas()) { | 2163 } else if (graphicsLayer == layerForOverhangAreas()) { |
| 2164 ScrollView* view = m_renderView->frameView(); | 2164 ScrollView* view = m_renderView->frameView(); |
| 2165 view->calculateAndPaintOverhangBackground(&context, clip); | 2165 view->calculateAndPaintOverhangBackground(&context, clip); |
| 2166 #endif | 2166 #endif |
| 2167 } | 2167 } |
| 2168 } | 2168 } |
| 2169 | 2169 |
| 2170 bool RenderLayerCompositor::supportsFixedRootBackgroundCompositing() const | 2170 bool RenderLayerCompositor::supportsFixedRootBackgroundCompositing() const |
| 2171 { | 2171 { |
| 2172 if (Settings* settings = m_renderView->document()->settings()) { | 2172 if (Settings* settings = m_renderView->document().settings()) { |
| 2173 if (settings->acceleratedCompositingForFixedRootBackgroundEnabled()) | 2173 if (settings->acceleratedCompositingForFixedRootBackgroundEnabled()) |
| 2174 return true; | 2174 return true; |
| 2175 } | 2175 } |
| 2176 return false; | 2176 return false; |
| 2177 } | 2177 } |
| 2178 | 2178 |
| 2179 bool RenderLayerCompositor::needsFixedRootBackgroundLayer(const RenderLayer* lay
er) const | 2179 bool RenderLayerCompositor::needsFixedRootBackgroundLayer(const RenderLayer* lay
er) const |
| 2180 { | 2180 { |
| 2181 if (layer != m_renderView->layer()) | 2181 if (layer != m_renderView->layer()) |
| 2182 return false; | 2182 return false; |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2467 Frame* frame = m_renderView->frameView()->frame(); | 2467 Frame* frame = m_renderView->frameView()->frame(); |
| 2468 Page* page = frame ? frame->page() : 0; | 2468 Page* page = frame ? frame->page() : 0; |
| 2469 if (!page) | 2469 if (!page) |
| 2470 return; | 2470 return; |
| 2471 page->chrome().client().attachRootGraphicsLayer(frame, rootGraphicsL
ayer()); | 2471 page->chrome().client().attachRootGraphicsLayer(frame, rootGraphicsL
ayer()); |
| 2472 break; | 2472 break; |
| 2473 } | 2473 } |
| 2474 case RootLayerAttachedViaEnclosingFrame: { | 2474 case RootLayerAttachedViaEnclosingFrame: { |
| 2475 // The layer will get hooked up via RenderLayerBacking::updateGraphi
csLayerConfiguration() | 2475 // The layer will get hooked up via RenderLayerBacking::updateGraphi
csLayerConfiguration() |
| 2476 // for the frame's renderer in the parent document. | 2476 // for the frame's renderer in the parent document. |
| 2477 m_renderView->document()->ownerElement()->scheduleLayerUpdate(); | 2477 m_renderView->document().ownerElement()->scheduleLayerUpdate(); |
| 2478 break; | 2478 break; |
| 2479 } | 2479 } |
| 2480 } | 2480 } |
| 2481 | 2481 |
| 2482 m_rootLayerAttachment = attachment; | 2482 m_rootLayerAttachment = attachment; |
| 2483 } | 2483 } |
| 2484 | 2484 |
| 2485 void RenderLayerCompositor::detachRootLayer() | 2485 void RenderLayerCompositor::detachRootLayer() |
| 2486 { | 2486 { |
| 2487 if (!m_rootContentLayer || m_rootLayerAttachment == RootLayerUnattached) | 2487 if (!m_rootContentLayer || m_rootLayerAttachment == RootLayerUnattached) |
| 2488 return; | 2488 return; |
| 2489 | 2489 |
| 2490 switch (m_rootLayerAttachment) { | 2490 switch (m_rootLayerAttachment) { |
| 2491 case RootLayerAttachedViaEnclosingFrame: { | 2491 case RootLayerAttachedViaEnclosingFrame: { |
| 2492 // The layer will get unhooked up via RenderLayerBacking::updateGraphics
LayerConfiguration() | 2492 // The layer will get unhooked up via RenderLayerBacking::updateGraphics
LayerConfiguration() |
| 2493 // for the frame's renderer in the parent document. | 2493 // for the frame's renderer in the parent document. |
| 2494 if (m_overflowControlsHostLayer) | 2494 if (m_overflowControlsHostLayer) |
| 2495 m_overflowControlsHostLayer->removeFromParent(); | 2495 m_overflowControlsHostLayer->removeFromParent(); |
| 2496 else | 2496 else |
| 2497 m_rootContentLayer->removeFromParent(); | 2497 m_rootContentLayer->removeFromParent(); |
| 2498 | 2498 |
| 2499 if (HTMLFrameOwnerElement* ownerElement = m_renderView->document()->owne
rElement()) | 2499 if (HTMLFrameOwnerElement* ownerElement = m_renderView->document().owner
Element()) |
| 2500 ownerElement->scheduleLayerUpdate(); | 2500 ownerElement->scheduleLayerUpdate(); |
| 2501 break; | 2501 break; |
| 2502 } | 2502 } |
| 2503 case RootLayerAttachedViaChromeClient: { | 2503 case RootLayerAttachedViaChromeClient: { |
| 2504 Frame* frame = m_renderView->frameView()->frame(); | 2504 Frame* frame = m_renderView->frameView()->frame(); |
| 2505 Page* page = frame ? frame->page() : 0; | 2505 Page* page = frame ? frame->page() : 0; |
| 2506 if (!page) | 2506 if (!page) |
| 2507 return; | 2507 return; |
| 2508 page->chrome().client().attachRootGraphicsLayer(frame, 0); | 2508 page->chrome().client().attachRootGraphicsLayer(frame, 0); |
| 2509 } | 2509 } |
| 2510 break; | 2510 break; |
| 2511 case RootLayerUnattached: | 2511 case RootLayerUnattached: |
| 2512 break; | 2512 break; |
| 2513 } | 2513 } |
| 2514 | 2514 |
| 2515 m_rootLayerAttachment = RootLayerUnattached; | 2515 m_rootLayerAttachment = RootLayerUnattached; |
| 2516 } | 2516 } |
| 2517 | 2517 |
| 2518 void RenderLayerCompositor::updateRootLayerAttachment() | 2518 void RenderLayerCompositor::updateRootLayerAttachment() |
| 2519 { | 2519 { |
| 2520 ensureRootLayer(); | 2520 ensureRootLayer(); |
| 2521 } | 2521 } |
| 2522 | 2522 |
| 2523 bool RenderLayerCompositor::isMainFrame() const | 2523 bool RenderLayerCompositor::isMainFrame() const |
| 2524 { | 2524 { |
| 2525 return !m_renderView->document()->ownerElement(); | 2525 return !m_renderView->document().ownerElement(); |
| 2526 } | 2526 } |
| 2527 | 2527 |
| 2528 // IFrames are special, because we hook compositing layers together across ifram
e boundaries | 2528 // IFrames are special, because we hook compositing layers together across ifram
e boundaries |
| 2529 // when both parent and iframe content are composited. So when this frame become
s composited, we have | 2529 // when both parent and iframe content are composited. So when this frame become
s composited, we have |
| 2530 // to use a synthetic style change to get the iframes into RenderLayers in order
to allow them to composite. | 2530 // to use a synthetic style change to get the iframes into RenderLayers in order
to allow them to composite. |
| 2531 void RenderLayerCompositor::notifyIFramesOfCompositingChange() | 2531 void RenderLayerCompositor::notifyIFramesOfCompositingChange() |
| 2532 { | 2532 { |
| 2533 Frame* frame = m_renderView->frameView() ? m_renderView->frameView()->frame(
) : 0; | 2533 Frame* frame = m_renderView->frameView() ? m_renderView->frameView()->frame(
) : 0; |
| 2534 if (!frame) | 2534 if (!frame) |
| 2535 return; | 2535 return; |
| 2536 | 2536 |
| 2537 for (Frame* child = frame->tree()->firstChild(); child; child = child->tree(
)->traverseNext(frame)) { | 2537 for (Frame* child = frame->tree()->firstChild(); child; child = child->tree(
)->traverseNext(frame)) { |
| 2538 if (child->document() && child->document()->ownerElement()) | 2538 if (child->document() && child->document()->ownerElement()) |
| 2539 child->document()->ownerElement()->scheduleLayerUpdate(); | 2539 child->document()->ownerElement()->scheduleLayerUpdate(); |
| 2540 } | 2540 } |
| 2541 | 2541 |
| 2542 // Compositing also affects the answer to RenderIFrame::requiresAcceleratedC
ompositing(), so | 2542 // Compositing also affects the answer to RenderIFrame::requiresAcceleratedC
ompositing(), so |
| 2543 // we need to schedule a style recalc in our parent document. | 2543 // we need to schedule a style recalc in our parent document. |
| 2544 if (HTMLFrameOwnerElement* ownerElement = m_renderView->document()->ownerEle
ment()) | 2544 if (HTMLFrameOwnerElement* ownerElement = m_renderView->document().ownerElem
ent()) |
| 2545 ownerElement->scheduleLayerUpdate(); | 2545 ownerElement->scheduleLayerUpdate(); |
| 2546 } | 2546 } |
| 2547 | 2547 |
| 2548 bool RenderLayerCompositor::layerHas3DContent(const RenderLayer* layer) const | 2548 bool RenderLayerCompositor::layerHas3DContent(const RenderLayer* layer) const |
| 2549 { | 2549 { |
| 2550 const RenderStyle* style = layer->renderer()->style(); | 2550 const RenderStyle* style = layer->renderer()->style(); |
| 2551 | 2551 |
| 2552 if (style && | 2552 if (style && |
| 2553 (style->transformStyle3D() == TransformStyle3DPreserve3D || | 2553 (style->transformStyle3D() == TransformStyle3DPreserve3D || |
| 2554 style->hasPerspective() || | 2554 style->hasPerspective() || |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2735 } else if (graphicsLayer == m_scrollLayer.get()) { | 2735 } else if (graphicsLayer == m_scrollLayer.get()) { |
| 2736 name = "Frame Scrolling Layer"; | 2736 name = "Frame Scrolling Layer"; |
| 2737 } else { | 2737 } else { |
| 2738 ASSERT_NOT_REACHED(); | 2738 ASSERT_NOT_REACHED(); |
| 2739 } | 2739 } |
| 2740 | 2740 |
| 2741 return name; | 2741 return name; |
| 2742 } | 2742 } |
| 2743 | 2743 |
| 2744 } // namespace WebCore | 2744 } // namespace WebCore |
| OLD | NEW |