OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 // First try to use the anchor's delta to scroll the FrameView. | 312 // First try to use the anchor's delta to scroll the FrameView. |
313 FloatSize anchorDeltaUnusedByScroll = anchorDelta; | 313 FloatSize anchorDeltaUnusedByScroll = anchorDelta; |
314 | 314 |
315 // Manually bubble any remaining anchor delta up to the visual viewport. | 315 // Manually bubble any remaining anchor delta up to the visual viewport. |
316 FloatPoint newLocation(FloatPoint(getScrollOffset()) + | 316 FloatPoint newLocation(FloatPoint(getScrollOffset()) + |
317 anchorDeltaUnusedByScroll); | 317 anchorDeltaUnusedByScroll); |
318 setScaleAndLocation(newPageScale, newLocation); | 318 setScaleAndLocation(newPageScale, newLocation); |
319 return true; | 319 return true; |
320 } | 320 } |
321 | 321 |
322 // Modifies the top of the graphics layer tree to add layers needed to support | 322 void VisualViewport::createLayerTree() { |
323 // the inner/outer viewport fixed-position model for pinch zoom. When finished, | 323 if (m_innerViewportScrollLayer) |
324 // the tree will look like this (with * denoting added layers): | 324 return; |
325 // | 325 |
326 // *rootTransformLayer | 326 DCHECK(!m_overlayScrollbarHorizontal && !m_overlayScrollbarVertical && |
327 // +- *innerViewportContainerLayer (fixed pos container) | 327 !m_overscrollElasticityLayer && !m_pageScaleLayer && |
328 // +- *overscrollElasticityLayer | 328 !m_innerViewportContainerLayer); |
329 // | +- *pageScaleLayer | 329 |
330 // | +- *innerViewportScrollLayer | 330 // FIXME: The root transform layer should only be created on demand. |
331 // | +-- overflowControlsHostLayer (root layer) | 331 m_rootTransformLayer = GraphicsLayer::create(this); |
332 // | | [ owned by PaintLayerCompositor ] | 332 m_innerViewportContainerLayer = GraphicsLayer::create(this); |
333 // | +-- outerViewportContainerLayer (fixed pos container) | 333 m_overscrollElasticityLayer = GraphicsLayer::create(this); |
334 // | | [frame container layer in PaintLayerCompositor] | 334 m_pageScaleLayer = GraphicsLayer::create(this); |
335 // | | +-- outerViewportScrollLayer | 335 m_innerViewportScrollLayer = GraphicsLayer::create(this); |
336 // | | | [frame scroll layer in PaintLayerCompositor] | 336 m_overlayScrollbarHorizontal = GraphicsLayer::create(this); |
337 // | | +-- content layers ... | 337 m_overlayScrollbarVertical = GraphicsLayer::create(this); |
338 // +- *PageOverlay for InspectorOverlay | 338 |
339 // +- *PageOverlay for ColorOverlay | 339 ScrollingCoordinator* coordinator = frameHost().page().scrollingCoordinator(); |
340 // +- horizontalScrollbarLayer [ owned by PaintLayerCompositor ] | 340 DCHECK(coordinator); |
341 // +- verticalScrollbarLayer [ owned by PaintLayerCompositor ] | 341 coordinator->setLayerIsContainerForFixedPositionLayers( |
342 // +- scroll corner (non-overlay only) [ owned by PaintLayerCompositor ] | 342 m_innerViewportScrollLayer.get(), true); |
343 // | 343 |
344 void VisualViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot) { | 344 // Set masks to bounds so the compositor doesn't clobber a manually |
345 TRACE_EVENT1("blink", "VisualViewport::attachToLayerTree", | 345 // set inner viewport container layer size. |
| 346 m_innerViewportContainerLayer->setMasksToBounds( |
| 347 frameHost().page().settings().getMainFrameClipsContent()); |
| 348 m_innerViewportContainerLayer->setSize(FloatSize(m_size)); |
| 349 |
| 350 m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer( |
| 351 m_innerViewportContainerLayer->platformLayer()); |
| 352 m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true); |
| 353 if (mainFrame()) { |
| 354 if (Document* document = mainFrame()->document()) { |
| 355 m_innerViewportScrollLayer->setElementId(createCompositorElementId( |
| 356 DOMNodeIds::idForNode(document), CompositorSubElementId::Viewport)); |
| 357 } |
| 358 } |
| 359 |
| 360 m_rootTransformLayer->addChild(m_innerViewportContainerLayer.get()); |
| 361 m_innerViewportContainerLayer->addChild(m_overscrollElasticityLayer.get()); |
| 362 m_overscrollElasticityLayer->addChild(m_pageScaleLayer.get()); |
| 363 m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get()); |
| 364 |
| 365 // Ensure this class is set as the scroll layer's ScrollableArea. |
| 366 coordinator->scrollableAreaScrollLayerDidChange(this); |
| 367 |
| 368 initializeScrollbars(); |
| 369 } |
| 370 |
| 371 void VisualViewport::attachLayerTree(GraphicsLayer* currentLayerTreeRoot) { |
| 372 TRACE_EVENT1("blink", "VisualViewport::attachLayerTree", |
346 "currentLayerTreeRoot", (bool)currentLayerTreeRoot); | 373 "currentLayerTreeRoot", (bool)currentLayerTreeRoot); |
347 if (!currentLayerTreeRoot) { | 374 if (!currentLayerTreeRoot) { |
348 if (m_innerViewportScrollLayer) | 375 if (m_innerViewportScrollLayer) |
349 m_innerViewportScrollLayer->removeAllChildren(); | 376 m_innerViewportScrollLayer->removeAllChildren(); |
350 return; | 377 return; |
351 } | 378 } |
352 | 379 |
353 if (currentLayerTreeRoot->parent() && | 380 if (currentLayerTreeRoot->parent() && |
354 currentLayerTreeRoot->parent() == m_innerViewportScrollLayer.get()) | 381 currentLayerTreeRoot->parent() == m_innerViewportScrollLayer.get()) |
355 return; | 382 return; |
356 | 383 |
357 if (!m_innerViewportScrollLayer) { | 384 DCHECK(m_innerViewportScrollLayer); |
358 ASSERT(!m_overlayScrollbarHorizontal && !m_overlayScrollbarVertical && | |
359 !m_overscrollElasticityLayer && !m_pageScaleLayer && | |
360 !m_innerViewportContainerLayer); | |
361 | |
362 // FIXME: The root transform layer should only be created on demand. | |
363 m_rootTransformLayer = GraphicsLayer::create(this); | |
364 m_innerViewportContainerLayer = GraphicsLayer::create(this); | |
365 m_overscrollElasticityLayer = GraphicsLayer::create(this); | |
366 m_pageScaleLayer = GraphicsLayer::create(this); | |
367 m_innerViewportScrollLayer = GraphicsLayer::create(this); | |
368 m_overlayScrollbarHorizontal = GraphicsLayer::create(this); | |
369 m_overlayScrollbarVertical = GraphicsLayer::create(this); | |
370 | |
371 ScrollingCoordinator* coordinator = | |
372 frameHost().page().scrollingCoordinator(); | |
373 ASSERT(coordinator); | |
374 coordinator->setLayerIsContainerForFixedPositionLayers( | |
375 m_innerViewportScrollLayer.get(), true); | |
376 | |
377 // Set masks to bounds so the compositor doesn't clobber a manually | |
378 // set inner viewport container layer size. | |
379 m_innerViewportContainerLayer->setMasksToBounds( | |
380 frameHost().page().settings().getMainFrameClipsContent()); | |
381 m_innerViewportContainerLayer->setSize(FloatSize(m_size)); | |
382 | |
383 m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer( | |
384 m_innerViewportContainerLayer->platformLayer()); | |
385 m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true); | |
386 if (mainFrame()) { | |
387 if (Document* document = mainFrame()->document()) { | |
388 m_innerViewportScrollLayer->setElementId(createCompositorElementId( | |
389 DOMNodeIds::idForNode(document), CompositorSubElementId::Viewport)); | |
390 } | |
391 } | |
392 | |
393 m_rootTransformLayer->addChild(m_innerViewportContainerLayer.get()); | |
394 m_innerViewportContainerLayer->addChild(m_overscrollElasticityLayer.get()); | |
395 m_overscrollElasticityLayer->addChild(m_pageScaleLayer.get()); | |
396 m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get()); | |
397 | |
398 // Ensure this class is set as the scroll layer's ScrollableArea. | |
399 coordinator->scrollableAreaScrollLayerDidChange(this); | |
400 | |
401 initializeScrollbars(); | |
402 } | |
403 | |
404 m_innerViewportScrollLayer->removeAllChildren(); | 385 m_innerViewportScrollLayer->removeAllChildren(); |
405 m_innerViewportScrollLayer->addChild(currentLayerTreeRoot); | 386 m_innerViewportScrollLayer->addChild(currentLayerTreeRoot); |
406 } | 387 } |
407 | 388 |
408 void VisualViewport::initializeScrollbars() { | 389 void VisualViewport::initializeScrollbars() { |
409 // Do nothing if not attached to layer tree yet - will initialize upon attach. | 390 // Do nothing if not attached to layer tree yet - will initialize upon attach. |
410 if (!m_innerViewportContainerLayer) | 391 if (!m_innerViewportContainerLayer) |
411 return; | 392 return; |
412 | 393 |
413 if (visualViewportSuppliesScrollbars() && | 394 if (visualViewportSuppliesScrollbars() && |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
855 } else if (graphicsLayer == m_rootTransformLayer.get()) { | 836 } else if (graphicsLayer == m_rootTransformLayer.get()) { |
856 name = "Root Transform Layer"; | 837 name = "Root Transform Layer"; |
857 } else { | 838 } else { |
858 ASSERT_NOT_REACHED(); | 839 ASSERT_NOT_REACHED(); |
859 } | 840 } |
860 | 841 |
861 return name; | 842 return name; |
862 } | 843 } |
863 | 844 |
864 } // namespace blink | 845 } // namespace blink |
OLD | NEW |