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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 m_rootShouldAlwaysCompositeDirty(true), | 81 m_rootShouldAlwaysCompositeDirty(true), |
82 m_needsUpdateFixedBackground(false), | 82 m_needsUpdateFixedBackground(false), |
83 m_isTrackingRasterInvalidations( | 83 m_isTrackingRasterInvalidations( |
84 layoutView.frameView()->isTrackingPaintInvalidations()), | 84 layoutView.frameView()->isTrackingPaintInvalidations()), |
85 m_inOverlayFullscreenVideo(false), | 85 m_inOverlayFullscreenVideo(false), |
86 m_rootLayerAttachment(RootLayerUnattached) { | 86 m_rootLayerAttachment(RootLayerUnattached) { |
87 updateAcceleratedCompositingSettings(); | 87 updateAcceleratedCompositingSettings(); |
88 } | 88 } |
89 | 89 |
90 PaintLayerCompositor::~PaintLayerCompositor() { | 90 PaintLayerCompositor::~PaintLayerCompositor() { |
91 ASSERT(m_rootLayerAttachment == RootLayerUnattached); | 91 DCHECK_EQ(m_rootLayerAttachment, RootLayerUnattached); |
92 } | 92 } |
93 | 93 |
94 bool PaintLayerCompositor::inCompositingMode() const { | 94 bool PaintLayerCompositor::inCompositingMode() const { |
95 // FIXME: This should assert that lifecycle is >= CompositingClean since | 95 // FIXME: This should assert that lifecycle is >= CompositingClean since |
96 // the last step of updateIfNeeded can set this bit to false. | 96 // the last step of updateIfNeeded can set this bit to false. |
97 ASSERT(m_layoutView.layer()->isAllowedToQueryCompositingState()); | 97 DCHECK(m_layoutView.layer()->isAllowedToQueryCompositingState()); |
98 return m_compositing; | 98 return m_compositing; |
99 } | 99 } |
100 | 100 |
101 bool PaintLayerCompositor::staleInCompositingMode() const { | 101 bool PaintLayerCompositor::staleInCompositingMode() const { |
102 return m_compositing; | 102 return m_compositing; |
103 } | 103 } |
104 | 104 |
105 void PaintLayerCompositor::setCompositingModeEnabled(bool enable) { | 105 void PaintLayerCompositor::setCompositingModeEnabled(bool enable) { |
106 if (enable == m_compositing) | 106 if (enable == m_compositing) |
107 return; | 107 return; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. | 204 // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. |
205 if (localFrame->document()->isActive() && | 205 if (localFrame->document()->isActive() && |
206 !localFrame->contentLayoutItem().isNull()) | 206 !localFrame->contentLayoutItem().isNull()) |
207 localFrame->contentLayoutItem() | 207 localFrame->contentLayoutItem() |
208 .compositor() | 208 .compositor() |
209 ->updateIfNeededRecursiveInternal(); | 209 ->updateIfNeededRecursiveInternal(); |
210 } | 210 } |
211 | 211 |
212 TRACE_EVENT0("blink", "PaintLayerCompositor::updateIfNeededRecursive"); | 212 TRACE_EVENT0("blink", "PaintLayerCompositor::updateIfNeededRecursive"); |
213 | 213 |
214 ASSERT(!m_layoutView.needsLayout()); | 214 DCHECK(!m_layoutView.needsLayout()); |
215 | 215 |
216 ScriptForbiddenScope forbidScript; | 216 ScriptForbiddenScope forbidScript; |
217 | 217 |
218 // FIXME: enableCompositingModeIfNeeded can trigger a | 218 // FIXME: enableCompositingModeIfNeeded can trigger a |
219 // CompositingUpdateRebuildTree, which asserts that it's not | 219 // CompositingUpdateRebuildTree, which asserts that it's not |
220 // InCompositingUpdate. | 220 // InCompositingUpdate. |
221 enableCompositingModeIfNeeded(); | 221 enableCompositingModeIfNeeded(); |
222 | 222 |
223 rootLayer()->updateDescendantDependentFlags(); | 223 rootLayer()->updateDescendantDependentFlags(); |
224 | 224 |
225 m_layoutView.commitPendingSelection(); | 225 m_layoutView.commitPendingSelection(); |
226 | 226 |
227 lifecycle().advanceTo(DocumentLifecycle::InCompositingUpdate); | 227 lifecycle().advanceTo(DocumentLifecycle::InCompositingUpdate); |
228 updateIfNeeded(); | 228 updateIfNeeded(); |
229 lifecycle().advanceTo(DocumentLifecycle::CompositingClean); | 229 lifecycle().advanceTo(DocumentLifecycle::CompositingClean); |
230 | 230 |
231 DocumentAnimations::updateAnimations(m_layoutView.document(), | 231 DocumentAnimations::updateAnimations(m_layoutView.document(), |
232 DocumentLifecycle::CompositingClean); | 232 DocumentLifecycle::CompositingClean); |
233 | 233 |
234 m_layoutView.frameView() | 234 m_layoutView.frameView() |
235 ->getScrollableArea() | 235 ->getScrollableArea() |
236 ->updateCompositorScrollAnimations(); | 236 ->updateCompositorScrollAnimations(); |
237 if (const FrameView::ScrollableAreaSet* animatingScrollableAreas = | 237 if (const FrameView::ScrollableAreaSet* animatingScrollableAreas = |
238 m_layoutView.frameView()->animatingScrollableAreas()) { | 238 m_layoutView.frameView()->animatingScrollableAreas()) { |
239 for (ScrollableArea* scrollableArea : *animatingScrollableAreas) | 239 for (ScrollableArea* scrollableArea : *animatingScrollableAreas) |
240 scrollableArea->updateCompositorScrollAnimations(); | 240 scrollableArea->updateCompositorScrollAnimations(); |
241 } | 241 } |
242 | 242 |
243 #if DCHECK_IS_ON() | 243 #if DCHECK_IS_ON() |
244 ASSERT(lifecycle().state() == DocumentLifecycle::CompositingClean); | 244 DCHECK_EQ(lifecycle().state(), DocumentLifecycle::CompositingClean); |
245 assertNoUnresolvedDirtyBits(); | 245 assertNoUnresolvedDirtyBits(); |
246 for (Frame* child = m_layoutView.frameView()->frame().tree().firstChild(); | 246 for (Frame* child = m_layoutView.frameView()->frame().tree().firstChild(); |
247 child; child = child->tree().nextSibling()) { | 247 child; child = child->tree().nextSibling()) { |
248 if (!child->isLocalFrame()) | 248 if (!child->isLocalFrame()) |
249 continue; | 249 continue; |
250 LocalFrame* localFrame = toLocalFrame(child); | 250 LocalFrame* localFrame = toLocalFrame(child); |
251 if (localFrame->shouldThrottleRendering() || | 251 if (localFrame->shouldThrottleRendering() || |
252 localFrame->contentLayoutItem().isNull()) | 252 localFrame->contentLayoutItem().isNull()) |
253 continue; | 253 continue; |
254 localFrame->contentLayoutItem().compositor()->assertNoUnresolvedDirtyBits(); | 254 localFrame->contentLayoutItem().compositor()->assertNoUnresolvedDirtyBits(); |
255 } | 255 } |
256 #endif | 256 #endif |
257 } | 257 } |
258 | 258 |
259 void PaintLayerCompositor::setNeedsCompositingUpdate( | 259 void PaintLayerCompositor::setNeedsCompositingUpdate( |
260 CompositingUpdateType updateType) { | 260 CompositingUpdateType updateType) { |
261 ASSERT(updateType != CompositingUpdateNone); | 261 DCHECK_NE(updateType, CompositingUpdateNone); |
262 m_pendingUpdateType = std::max(m_pendingUpdateType, updateType); | 262 m_pendingUpdateType = std::max(m_pendingUpdateType, updateType); |
263 if (Page* page = this->page()) | 263 if (Page* page = this->page()) |
264 page->animator().scheduleVisualUpdate(m_layoutView.frame()); | 264 page->animator().scheduleVisualUpdate(m_layoutView.frame()); |
265 lifecycle().ensureStateAtMost(DocumentLifecycle::LayoutClean); | 265 lifecycle().ensureStateAtMost(DocumentLifecycle::LayoutClean); |
266 } | 266 } |
267 | 267 |
268 void PaintLayerCompositor::didLayout() { | 268 void PaintLayerCompositor::didLayout() { |
269 // FIXME: Technically we only need to do this when the FrameView's | 269 // FIXME: Technically we only need to do this when the FrameView's |
270 // isScrollable method would return a different value. | 270 // isScrollable method would return a different value. |
271 m_rootShouldAlwaysCompositeDirty = true; | 271 m_rootShouldAlwaysCompositeDirty = true; |
272 enableCompositingModeIfNeeded(); | 272 enableCompositingModeIfNeeded(); |
273 | 273 |
274 // FIXME: Rather than marking the entire LayoutView as dirty, we should | 274 // FIXME: Rather than marking the entire LayoutView as dirty, we should |
275 // track which Layers moved during layout and only dirty those | 275 // track which Layers moved during layout and only dirty those |
276 // specific Layers. | 276 // specific Layers. |
277 rootLayer()->setNeedsCompositingInputsUpdate(); | 277 rootLayer()->setNeedsCompositingInputsUpdate(); |
278 } | 278 } |
279 | 279 |
280 #if DCHECK_IS_ON() | 280 #if DCHECK_IS_ON() |
281 | 281 |
282 void PaintLayerCompositor::assertNoUnresolvedDirtyBits() { | 282 void PaintLayerCompositor::assertNoUnresolvedDirtyBits() { |
283 ASSERT(m_pendingUpdateType == CompositingUpdateNone); | 283 DCHECK_EQ(m_pendingUpdateType, CompositingUpdateNone); |
284 ASSERT(!m_rootShouldAlwaysCompositeDirty); | 284 DCHECK(!m_rootShouldAlwaysCompositeDirty); |
285 } | 285 } |
286 | 286 |
287 #endif | 287 #endif |
288 | 288 |
289 void PaintLayerCompositor::applyOverlayFullscreenVideoAdjustmentIfNeeded() { | 289 void PaintLayerCompositor::applyOverlayFullscreenVideoAdjustmentIfNeeded() { |
290 m_inOverlayFullscreenVideo = false; | 290 m_inOverlayFullscreenVideo = false; |
291 if (!m_rootContentLayer) | 291 if (!m_rootContentLayer) |
292 return; | 292 return; |
293 | 293 |
294 bool isLocalRoot = m_layoutView.frame()->isLocalRoot(); | 294 bool isLocalRoot = m_layoutView.frame()->isLocalRoot(); |
(...skipping 24 matching lines...) Expand all Loading... |
319 | 319 |
320 m_rootContentLayer->removeAllChildren(); | 320 m_rootContentLayer->removeAllChildren(); |
321 m_overflowControlsHostLayer->addChild(videoLayer); | 321 m_overflowControlsHostLayer->addChild(videoLayer); |
322 if (GraphicsLayer* backgroundLayer = fixedRootBackgroundLayer()) | 322 if (GraphicsLayer* backgroundLayer = fixedRootBackgroundLayer()) |
323 backgroundLayer->removeFromParent(); | 323 backgroundLayer->removeFromParent(); |
324 m_inOverlayFullscreenVideo = true; | 324 m_inOverlayFullscreenVideo = true; |
325 } | 325 } |
326 | 326 |
327 void PaintLayerCompositor::updateWithoutAcceleratedCompositing( | 327 void PaintLayerCompositor::updateWithoutAcceleratedCompositing( |
328 CompositingUpdateType updateType) { | 328 CompositingUpdateType updateType) { |
329 ASSERT(!hasAcceleratedCompositing()); | 329 DCHECK(!hasAcceleratedCompositing()); |
330 | 330 |
331 if (updateType >= CompositingUpdateAfterCompositingInputChange) | 331 if (updateType >= CompositingUpdateAfterCompositingInputChange) |
332 CompositingInputsUpdater(rootLayer()).update(); | 332 CompositingInputsUpdater(rootLayer()).update(); |
333 | 333 |
334 #if DCHECK_IS_ON() | 334 #if DCHECK_IS_ON() |
335 CompositingInputsUpdater::assertNeedsCompositingInputsUpdateBitsCleared( | 335 CompositingInputsUpdater::assertNeedsCompositingInputsUpdateBitsCleared( |
336 rootLayer()); | 336 rootLayer()); |
337 #endif | 337 #endif |
338 } | 338 } |
339 | 339 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 bool PaintLayerCompositor::allocateOrClearCompositedLayerMapping( | 494 bool PaintLayerCompositor::allocateOrClearCompositedLayerMapping( |
495 PaintLayer* layer, | 495 PaintLayer* layer, |
496 const CompositingStateTransitionType compositedLayerUpdate) { | 496 const CompositingStateTransitionType compositedLayerUpdate) { |
497 bool compositedLayerMappingChanged = false; | 497 bool compositedLayerMappingChanged = false; |
498 | 498 |
499 // FIXME: It would be nice to directly use the layer's compositing reason, | 499 // FIXME: It would be nice to directly use the layer's compositing reason, |
500 // but allocateOrClearCompositedLayerMapping also gets called without having | 500 // but allocateOrClearCompositedLayerMapping also gets called without having |
501 // updated compositing requirements fully. | 501 // updated compositing requirements fully. |
502 switch (compositedLayerUpdate) { | 502 switch (compositedLayerUpdate) { |
503 case AllocateOwnCompositedLayerMapping: | 503 case AllocateOwnCompositedLayerMapping: |
504 ASSERT(!layer->hasCompositedLayerMapping()); | 504 DCHECK(!layer->hasCompositedLayerMapping()); |
505 setCompositingModeEnabled(true); | 505 setCompositingModeEnabled(true); |
506 | 506 |
507 // If we need to issue paint invalidations, do so before allocating the | 507 // If we need to issue paint invalidations, do so before allocating the |
508 // compositedLayerMapping and clearing out the groupedMapping. | 508 // compositedLayerMapping and clearing out the groupedMapping. |
509 paintInvalidationOnCompositingChange(layer); | 509 paintInvalidationOnCompositingChange(layer); |
510 | 510 |
511 // If this layer was previously squashed, we need to remove its reference | 511 // If this layer was previously squashed, we need to remove its reference |
512 // to a groupedMapping right away, so that computing paint invalidation | 512 // to a groupedMapping right away, so that computing paint invalidation |
513 // rects will know the layer's correct compositingState. | 513 // rects will know the layer's correct compositingState. |
514 // FIXME: do we need to also remove the layer from it's location in the | 514 // FIXME: do we need to also remove the layer from it's location in the |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 | 683 |
684 bool PaintLayerCompositor::scrollingLayerDidChange(PaintLayer* layer) { | 684 bool PaintLayerCompositor::scrollingLayerDidChange(PaintLayer* layer) { |
685 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) | 685 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) |
686 return scrollingCoordinator->scrollableAreaScrollLayerDidChange( | 686 return scrollingCoordinator->scrollableAreaScrollLayerDidChange( |
687 layer->getScrollableArea()); | 687 layer->getScrollableArea()); |
688 return false; | 688 return false; |
689 } | 689 } |
690 | 690 |
691 std::unique_ptr<JSONObject> PaintLayerCompositor::layerTreeAsJSON( | 691 std::unique_ptr<JSONObject> PaintLayerCompositor::layerTreeAsJSON( |
692 LayerTreeFlags flags) const { | 692 LayerTreeFlags flags) const { |
693 ASSERT(lifecycle().state() >= DocumentLifecycle::PaintInvalidationClean || | 693 DCHECK(lifecycle().state() >= DocumentLifecycle::PaintInvalidationClean || |
694 m_layoutView.frameView()->shouldThrottleRendering()); | 694 m_layoutView.frameView()->shouldThrottleRendering()); |
695 | 695 |
696 // We skip dumping the scroll and clip layers to keep layerTreeAsText output | 696 // We skip dumping the scroll and clip layers to keep layerTreeAsText output |
697 // similar between platforms (unless we explicitly request dumping from the | 697 // similar between platforms (unless we explicitly request dumping from the |
698 // root. | 698 // root. |
699 GraphicsLayer* rootLayer = m_rootContentLayer.get(); | 699 GraphicsLayer* rootLayer = m_rootContentLayer.get(); |
700 if (!rootLayer) | 700 if (!rootLayer) |
701 rootLayer = rootGraphicsLayer(); | 701 rootLayer = rootGraphicsLayer(); |
702 | 702 |
703 if (!rootLayer) | 703 if (!rootLayer) |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
980 graphicsLayer->contentsClippingMaskLayer()) { | 980 graphicsLayer->contentsClippingMaskLayer()) { |
981 setTracksRasterInvalidationsRecursive(clippingMaskLayer, | 981 setTracksRasterInvalidationsRecursive(clippingMaskLayer, |
982 tracksPaintInvalidations); | 982 tracksPaintInvalidations); |
983 } | 983 } |
984 } | 984 } |
985 | 985 |
986 void PaintLayerCompositor::setTracksRasterInvalidations( | 986 void PaintLayerCompositor::setTracksRasterInvalidations( |
987 bool tracksRasterInvalidations) { | 987 bool tracksRasterInvalidations) { |
988 #if DCHECK_IS_ON() | 988 #if DCHECK_IS_ON() |
989 FrameView* view = m_layoutView.frameView(); | 989 FrameView* view = m_layoutView.frameView(); |
990 ASSERT(lifecycle().state() == DocumentLifecycle::PaintClean || | 990 DCHECK(lifecycle().state() == DocumentLifecycle::PaintClean || |
991 (view && view->shouldThrottleRendering())); | 991 (view && view->shouldThrottleRendering())); |
992 #endif | 992 #endif |
993 | 993 |
994 m_isTrackingRasterInvalidations = tracksRasterInvalidations; | 994 m_isTrackingRasterInvalidations = tracksRasterInvalidations; |
995 if (GraphicsLayer* rootLayer = rootGraphicsLayer()) | 995 if (GraphicsLayer* rootLayer = rootGraphicsLayer()) |
996 setTracksRasterInvalidationsRecursive(rootLayer, tracksRasterInvalidations); | 996 setTracksRasterInvalidationsRecursive(rootLayer, tracksRasterInvalidations); |
997 } | 997 } |
998 | 998 |
999 bool PaintLayerCompositor::isTrackingRasterInvalidations() const { | 999 bool PaintLayerCompositor::isTrackingRasterInvalidations() const { |
1000 return m_isTrackingRasterInvalidations; | 1000 return m_isTrackingRasterInvalidations; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 | 1102 |
1103 // FIXME: with rootLayerScrolls, we probably don't even need | 1103 // FIXME: with rootLayerScrolls, we probably don't even need |
1104 // m_rootContentLayer? | 1104 // m_rootContentLayer? |
1105 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { | 1105 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
1106 // Need to clip to prevent transformed content showing outside this frame | 1106 // Need to clip to prevent transformed content showing outside this frame |
1107 m_rootContentLayer->setMasksToBounds(true); | 1107 m_rootContentLayer->setMasksToBounds(true); |
1108 } | 1108 } |
1109 } | 1109 } |
1110 | 1110 |
1111 if (shouldCreateOwnLayers && !m_overflowControlsHostLayer) { | 1111 if (shouldCreateOwnLayers && !m_overflowControlsHostLayer) { |
1112 ASSERT(!m_scrollLayer); | 1112 DCHECK(!m_scrollLayer); |
1113 ASSERT(!m_containerLayer); | 1113 DCHECK(!m_containerLayer); |
1114 | 1114 |
1115 // Create a layer to host the clipping layer and the overflow controls | 1115 // Create a layer to host the clipping layer and the overflow controls |
1116 // layers. | 1116 // layers. |
1117 m_overflowControlsHostLayer = GraphicsLayer::create(this); | 1117 m_overflowControlsHostLayer = GraphicsLayer::create(this); |
1118 | 1118 |
1119 // Clip iframe's overflow controls layer. | 1119 // Clip iframe's overflow controls layer. |
1120 bool containerMasksToBounds = !m_layoutView.frame()->isLocalRoot(); | 1120 bool containerMasksToBounds = !m_layoutView.frame()->isLocalRoot(); |
1121 m_overflowControlsHostLayer->setMasksToBounds(containerMasksToBounds); | 1121 m_overflowControlsHostLayer->setMasksToBounds(containerMasksToBounds); |
1122 | 1122 |
1123 // Create a clipping layer if this is an iframe or settings require to clip. | 1123 // Create a clipping layer if this is an iframe or settings require to clip. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 if (m_layerForScrollCorner) { | 1176 if (m_layerForScrollCorner) { |
1177 m_layerForScrollCorner = nullptr; | 1177 m_layerForScrollCorner = nullptr; |
1178 m_layoutView.frameView()->setScrollCornerNeedsPaintInvalidation(); | 1178 m_layoutView.frameView()->setScrollCornerNeedsPaintInvalidation(); |
1179 } | 1179 } |
1180 | 1180 |
1181 if (m_overflowControlsHostLayer) { | 1181 if (m_overflowControlsHostLayer) { |
1182 m_overflowControlsHostLayer = nullptr; | 1182 m_overflowControlsHostLayer = nullptr; |
1183 m_containerLayer = nullptr; | 1183 m_containerLayer = nullptr; |
1184 m_scrollLayer = nullptr; | 1184 m_scrollLayer = nullptr; |
1185 } | 1185 } |
1186 ASSERT(!m_scrollLayer); | 1186 DCHECK(!m_scrollLayer); |
1187 m_rootContentLayer = nullptr; | 1187 m_rootContentLayer = nullptr; |
1188 } | 1188 } |
1189 | 1189 |
1190 void PaintLayerCompositor::attachRootLayer() { | 1190 void PaintLayerCompositor::attachRootLayer() { |
1191 // In Slimming Paint v2, PaintArtifactCompositor is responsible for the root | 1191 // In Slimming Paint v2, PaintArtifactCompositor is responsible for the root |
1192 // layer. | 1192 // layer. |
1193 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 1193 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
1194 return; | 1194 return; |
1195 | 1195 |
1196 if (m_layoutView.frame()->isLocalRoot()) { | 1196 if (m_layoutView.frame()->isLocalRoot()) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 } else if (graphicsLayer == m_scrollLayer.get()) { | 1306 } else if (graphicsLayer == m_scrollLayer.get()) { |
1307 name = "Frame Scrolling Layer"; | 1307 name = "Frame Scrolling Layer"; |
1308 } else { | 1308 } else { |
1309 NOTREACHED(); | 1309 NOTREACHED(); |
1310 } | 1310 } |
1311 | 1311 |
1312 return name; | 1312 return name; |
1313 } | 1313 } |
1314 | 1314 |
1315 } // namespace blink | 1315 } // namespace blink |
OLD | NEW |