Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2000 Simon Hausmann <hausmann@kde.org> | 3 * (C) 2000 Simon Hausmann <hausmann@kde.org> |
| 4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) | 4 * (C) 2000 Stefan Schimanski (1Stein@gmx.de) |
| 5 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
| 6 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 21 * Boston, MA 02110-1301, USA. | 21 * Boston, MA 02110-1301, USA. |
| 22 * | 22 * |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 #include "core/layout/LayoutPart.h" | 25 #include "core/layout/LayoutPart.h" |
| 26 | 26 |
| 27 #include "core/dom/AXObjectCache.h" | 27 #include "core/dom/AXObjectCache.h" |
| 28 #include "core/frame/FrameView.h" | 28 #include "core/frame/FrameView.h" |
| 29 #include "core/frame/LocalFrame.h" | 29 #include "core/frame/LocalFrame.h" |
| 30 #include "core/html/HTMLFrameElementBase.h" | 30 #include "core/html/HTMLFrameElementBase.h" |
| 31 #include "core/html/HTMLPlugInElement.h" | |
| 31 #include "core/layout/HitTestResult.h" | 32 #include "core/layout/HitTestResult.h" |
| 32 #include "core/layout/LayoutAnalyzer.h" | 33 #include "core/layout/LayoutAnalyzer.h" |
| 33 #include "core/layout/LayoutView.h" | 34 #include "core/layout/LayoutView.h" |
| 34 #include "core/layout/api/LayoutAPIShim.h" | 35 #include "core/layout/api/LayoutAPIShim.h" |
| 35 #include "core/layout/api/LayoutViewItem.h" | 36 #include "core/layout/api/LayoutViewItem.h" |
| 36 #include "core/paint/PartPainter.h" | 37 #include "core/paint/PartPainter.h" |
| 37 #include "core/plugins/PluginView.h" | 38 #include "core/plugins/PluginView.h" |
| 38 | 39 |
| 39 namespace blink { | 40 namespace blink { |
| 40 | 41 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 FrameViewBase* LayoutPart::frameViewBase() const { | 92 FrameViewBase* LayoutPart::frameViewBase() const { |
| 92 // Plugin FrameViewBases are stored in their DOM node. | 93 // Plugin FrameViewBases are stored in their DOM node. |
| 93 Element* element = toElement(node()); | 94 Element* element = toElement(node()); |
| 94 | 95 |
| 95 if (element && element->isFrameOwnerElement()) | 96 if (element && element->isFrameOwnerElement()) |
| 96 return toHTMLFrameOwnerElement(element)->ownedWidget(); | 97 return toHTMLFrameOwnerElement(element)->ownedWidget(); |
| 97 | 98 |
| 98 return nullptr; | 99 return nullptr; |
| 99 } | 100 } |
| 100 | 101 |
| 102 PluginView* LayoutPart::plugin() const { | |
| 103 // Plugins are stored in their DOM node. | |
| 104 return node() && isHTMLPlugInElement(node()) | |
| 105 ? toHTMLPlugInElement(node())->plugin() | |
| 106 : nullptr; | |
| 107 } | |
| 108 | |
| 101 PaintLayerType LayoutPart::layerTypeRequired() const { | 109 PaintLayerType LayoutPart::layerTypeRequired() const { |
| 102 PaintLayerType type = LayoutReplaced::layerTypeRequired(); | 110 PaintLayerType type = LayoutReplaced::layerTypeRequired(); |
| 103 if (type != NoPaintLayer) | 111 if (type != NoPaintLayer) |
| 104 return type; | 112 return type; |
| 105 return ForcedPaintLayer; | 113 return ForcedPaintLayer; |
| 106 } | 114 } |
| 107 | 115 |
| 108 bool LayoutPart::requiresAcceleratedCompositing() const { | 116 bool LayoutPart::requiresAcceleratedCompositing() const { |
| 109 // There are two general cases in which we can return true. First, if this is | 117 // There are two general cases in which we can return true. First, if this is |
| 110 // a plugin LayoutObject and the plugin has a layer, then we need a layer. | 118 // a plugin LayoutObject and the plugin has a layer, then we need a layer. |
| 111 // Second, if this is a LayoutObject with a contentDocument and that document | 119 // Second, if this is a LayoutObject with a contentDocument and that document |
| 112 // needs a layer, then we need a layer. | 120 // needs a layer, then we need a layer. |
| 113 if (frameViewBase() && frameViewBase()->isPluginView() && | 121 PluginView* pluginView = plugin(); |
| 114 toPluginView(frameViewBase())->platformLayer()) | 122 if (pluginView && pluginView->platformLayer()) |
| 115 return true; | 123 return true; |
| 116 | 124 |
| 117 if (!node() || !node()->isFrameOwnerElement()) | 125 if (!node() || !node()->isFrameOwnerElement()) |
| 118 return false; | 126 return false; |
| 119 | 127 |
| 120 HTMLFrameOwnerElement* element = toHTMLFrameOwnerElement(node()); | 128 HTMLFrameOwnerElement* element = toHTMLFrameOwnerElement(node()); |
| 121 if (element->contentFrame() && element->contentFrame()->isRemoteFrame()) | 129 if (element->contentFrame() && element->contentFrame()->isRemoteFrame()) |
| 122 return true; | 130 return true; |
| 123 | 131 |
| 124 if (Document* contentDocument = element->contentDocument()) { | 132 if (Document* contentDocument = element->contentDocument()) { |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 LayoutReplaced::styleDidChange(diff, oldStyle); | 248 LayoutReplaced::styleDidChange(diff, oldStyle); |
| 241 FrameViewBase* frameViewBase = this->frameViewBase(); | 249 FrameViewBase* frameViewBase = this->frameViewBase(); |
| 242 | 250 |
| 243 if (!frameViewBase) | 251 if (!frameViewBase) |
| 244 return; | 252 return; |
| 245 | 253 |
| 246 // If the iframe has custom scrollbars, recalculate their style. | 254 // If the iframe has custom scrollbars, recalculate their style. |
| 247 if (frameViewBase && frameViewBase->isFrameView()) | 255 if (frameViewBase && frameViewBase->isFrameView()) |
| 248 toFrameView(frameViewBase)->recalculateCustomScrollbarStyle(); | 256 toFrameView(frameViewBase)->recalculateCustomScrollbarStyle(); |
| 249 | 257 |
| 258 // TODO(joelhockey): Does this need separate code for plugins? | |
|
haraken
2017/03/22 15:32:33
I guess yes.
Can you add CHECK(!(node() && isHTML
joelhockey
2017/03/27 06:42:21
Thanks, that is a helpful approach. It showed tha
| |
| 250 if (style()->visibility() != EVisibility::kVisible) { | 259 if (style()->visibility() != EVisibility::kVisible) { |
| 251 frameViewBase->hide(); | 260 frameViewBase->hide(); |
|
haraken
2017/03/22 15:32:33
One way to handle both the FrameViewBase case and
joelhockey
2017/03/27 06:42:21
This function will be ok to take FrameViewBase as
haraken
2017/03/28 07:39:41
However, you're planning to remove the inheritance
joelhockey
2017/03/28 22:56:23
Yes, I will remove the inheritance from FrameView
haraken
2017/03/29 11:04:46
Sounds like a nice plan.
| |
| 252 } else { | 261 } else { |
| 253 frameViewBase->show(); | 262 frameViewBase->show(); |
| 254 } | 263 } |
| 255 } | 264 } |
| 256 | 265 |
| 257 void LayoutPart::layout() { | 266 void LayoutPart::layout() { |
| 258 ASSERT(needsLayout()); | 267 ASSERT(needsLayout()); |
| 259 LayoutAnalyzer::Scope analyzer(*this); | 268 LayoutAnalyzer::Scope analyzer(*this); |
| 260 clearNeedsLayout(); | 269 clearNeedsLayout(); |
| 261 } | 270 } |
| 262 | 271 |
| 263 void LayoutPart::paint(const PaintInfo& paintInfo, | 272 void LayoutPart::paint(const PaintInfo& paintInfo, |
| 264 const LayoutPoint& paintOffset) const { | 273 const LayoutPoint& paintOffset) const { |
| 265 PartPainter(*this).paint(paintInfo, paintOffset); | 274 PartPainter(*this).paint(paintInfo, paintOffset); |
| 266 } | 275 } |
| 267 | 276 |
| 268 void LayoutPart::paintContents(const PaintInfo& paintInfo, | 277 void LayoutPart::paintContents(const PaintInfo& paintInfo, |
| 269 const LayoutPoint& paintOffset) const { | 278 const LayoutPoint& paintOffset) const { |
| 270 PartPainter(*this).paintContents(paintInfo, paintOffset); | 279 PartPainter(*this).paintContents(paintInfo, paintOffset); |
| 271 } | 280 } |
| 272 | 281 |
| 273 CursorDirective LayoutPart::getCursor(const LayoutPoint& point, | 282 CursorDirective LayoutPart::getCursor(const LayoutPoint& point, |
| 274 Cursor& cursor) const { | 283 Cursor& cursor) const { |
| 275 if (frameViewBase() && frameViewBase()->isPluginView()) { | 284 if (plugin()) { |
| 276 // A plugin is responsible for setting the cursor when the pointer is over | 285 // A plugin is responsible for setting the cursor when the pointer is over |
| 277 // it. | 286 // it. |
| 278 return DoNotSetCursor; | 287 return DoNotSetCursor; |
| 279 } | 288 } |
| 280 return LayoutReplaced::getCursor(point, cursor); | 289 return LayoutReplaced::getCursor(point, cursor); |
| 281 } | 290 } |
| 282 | 291 |
| 283 LayoutRect LayoutPart::replacedContentRect() const { | 292 LayoutRect LayoutPart::replacedContentRect() const { |
| 284 // We don't propagate sub-pixel into sub-frame layout, in other words, the | 293 // We don't propagate sub-pixel into sub-frame layout, in other words, the |
| 285 // rect is snapped at the document boundary, and sub-pixel movement could | 294 // rect is snapped at the document boundary, and sub-pixel movement could |
| 286 // cause the sub-frame to layout due to the 1px snap difference. In order to | 295 // cause the sub-frame to layout due to the 1px snap difference. In order to |
| 287 // avoid that, the size of sub-frame is rounded in advance. | 296 // avoid that, the size of sub-frame is rounded in advance. |
| 288 LayoutRect sizeRoundedRect = contentBoxRect(); | 297 LayoutRect sizeRoundedRect = contentBoxRect(); |
| 289 sizeRoundedRect.setSize(LayoutSize(roundedIntSize(sizeRoundedRect.size()))); | 298 sizeRoundedRect.setSize(LayoutSize(roundedIntSize(sizeRoundedRect.size()))); |
| 290 return sizeRoundedRect; | 299 return sizeRoundedRect; |
| 291 } | 300 } |
| 292 | 301 |
| 293 void LayoutPart::updateOnWidgetChange() { | 302 void LayoutPart::updateOnWidgetChange() { |
| 294 FrameViewBase* frameViewBase = this->frameViewBase(); | 303 FrameViewBase* frameViewBase = this->frameViewBase(); |
| 295 if (!frameViewBase) | 304 if (!frameViewBase) |
| 296 return; | 305 return; |
| 297 | 306 |
| 298 if (!style()) | 307 if (!style()) |
| 299 return; | 308 return; |
| 300 | 309 |
| 301 if (!needsLayout()) | 310 if (!needsLayout()) |
| 302 updateGeometryInternal(); | 311 updateGeometryInternal(); |
| 303 | 312 |
| 313 // TODO(joelhockey): Does this need special handling for plugin? | |
|
dcheng
2017/03/23 07:21:42
I think this also needs to be handled: the main su
joelhockey
2017/03/27 06:42:21
Thanks. I just noticed how the impl forwards the
| |
| 304 if (style()->visibility() != EVisibility::kVisible) { | 314 if (style()->visibility() != EVisibility::kVisible) { |
| 305 frameViewBase->hide(); | 315 frameViewBase->hide(); |
| 306 } else { | 316 } else { |
| 307 frameViewBase->show(); | 317 frameViewBase->show(); |
| 308 // FIXME: Why do we issue a full paint invalidation in this case, but not | 318 // FIXME: Why do we issue a full paint invalidation in this case, but not |
| 309 // the other? | 319 // the other? |
| 310 setShouldDoFullPaintInvalidation(); | 320 setShouldDoFullPaintInvalidation(); |
| 311 } | 321 } |
| 312 } | 322 } |
| 313 | 323 |
| 314 void LayoutPart::updateGeometry() { | 324 void LayoutPart::updateGeometry() { |
| 315 FrameViewBase* frameViewBase = this->frameViewBase(); | 325 FrameViewBase* frameViewBase = this->frameViewBase(); |
| 316 if (!frameViewBase || | 326 if (!frameViewBase || |
| 317 !node()) // Check the node in case destroy() has been called. | 327 !node()) // Check the node in case destroy() has been called. |
| 318 return; | 328 return; |
| 319 | 329 |
| 320 LayoutRect newFrame = replacedContentRect(); | 330 LayoutRect newFrame = replacedContentRect(); |
| 321 DCHECK(newFrame.size() == roundedIntSize(newFrame.size())); | 331 DCHECK(newFrame.size() == roundedIntSize(newFrame.size())); |
| 332 // TODO(joelhockey): Does this need special handling for plugin? | |
| 322 bool boundsWillChange = | 333 bool boundsWillChange = |
| 323 LayoutSize(frameViewBase->frameRect().size()) != newFrame.size(); | 334 LayoutSize(frameViewBase->frameRect().size()) != newFrame.size(); |
| 324 | 335 |
| 325 FrameView* frameView = | 336 FrameView* frameView = |
| 326 frameViewBase->isFrameView() ? toFrameView(frameViewBase) : nullptr; | 337 frameViewBase->isFrameView() ? toFrameView(frameViewBase) : nullptr; |
| 327 | 338 |
| 328 // If frame bounds are changing mark the view for layout. Also check the | 339 // If frame bounds are changing mark the view for layout. Also check the |
| 329 // frame's page to make sure that the frame isn't in the process of being | 340 // frame's page to make sure that the frame isn't in the process of being |
| 330 // destroyed. If iframe scrollbars needs reconstruction from native to custom | 341 // destroyed. If iframe scrollbars needs reconstruction from native to custom |
| 331 // scrollbar, then also we need to layout the frameview. | 342 // scrollbar, then also we need to layout the frameview. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 365 // FrameView::updateViewportIntersectionIfNeeded() | 376 // FrameView::updateViewportIntersectionIfNeeded() |
| 366 // RemoteFrameView::frameRectsChanged(). | 377 // RemoteFrameView::frameRectsChanged(). |
| 367 // WebPluginContainerImpl::reportGeometry() | 378 // WebPluginContainerImpl::reportGeometry() |
| 368 // TODO(trchen): Remove this hack once we fixed all callers. | 379 // TODO(trchen): Remove this hack once we fixed all callers. |
| 369 FloatRect absoluteBoundingBox = | 380 FloatRect absoluteBoundingBox = |
| 370 localToAbsoluteQuad(FloatRect(replacedContentRect())).boundingBox(); | 381 localToAbsoluteQuad(FloatRect(replacedContentRect())).boundingBox(); |
| 371 frameRect.setLocation(roundedIntPoint(absoluteBoundingBox.location())); | 382 frameRect.setLocation(roundedIntPoint(absoluteBoundingBox.location())); |
| 372 | 383 |
| 373 // Why is the protector needed? | 384 // Why is the protector needed? |
| 374 RefPtr<LayoutPart> protector(this); | 385 RefPtr<LayoutPart> protector(this); |
| 386 // TODO(joelhockey): Does this need special handling for plugin? | |
| 375 frameViewBase->setFrameRect(frameRect); | 387 frameViewBase->setFrameRect(frameRect); |
| 376 } | 388 } |
| 377 | 389 |
| 378 void LayoutPart::invalidatePaintOfSubtreesIfNeeded( | 390 void LayoutPart::invalidatePaintOfSubtreesIfNeeded( |
| 379 const PaintInvalidationState& paintInvalidationState) { | 391 const PaintInvalidationState& paintInvalidationState) { |
| 380 if (frameViewBase() && frameViewBase()->isFrameView() && | 392 if (frameViewBase() && frameViewBase()->isFrameView() && |
| 381 !isThrottledFrameView()) { | 393 !isThrottledFrameView()) { |
| 382 FrameView* childFrameView = toFrameView(frameViewBase()); | 394 FrameView* childFrameView = toFrameView(frameViewBase()); |
| 383 // |childFrameView| is in another document, which could be | 395 // |childFrameView| is in another document, which could be |
| 384 // missing its LayoutView. TODO(jchaffraix): Ideally we should | 396 // missing its LayoutView. TODO(jchaffraix): Ideally we should |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 396 } | 408 } |
| 397 | 409 |
| 398 bool LayoutPart::isThrottledFrameView() const { | 410 bool LayoutPart::isThrottledFrameView() const { |
| 399 if (!frameViewBase() || !frameViewBase()->isFrameView()) | 411 if (!frameViewBase() || !frameViewBase()->isFrameView()) |
| 400 return false; | 412 return false; |
| 401 const FrameView* frameView = toFrameView(frameViewBase()); | 413 const FrameView* frameView = toFrameView(frameViewBase()); |
| 402 return frameView->shouldThrottleRendering(); | 414 return frameView->shouldThrottleRendering(); |
| 403 } | 415 } |
| 404 | 416 |
| 405 } // namespace blink | 417 } // namespace blink |
| OLD | NEW |