Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutPart.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/LayoutPart.cpp b/third_party/WebKit/Source/core/layout/LayoutPart.cpp |
| index 4beb5b0074c5461dee0aa1b693b8e11457c9e07b..5d63160c03ecf99534d6fbc9b9c1fdc9b882f1bd 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutPart.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutPart.cpp |
| @@ -25,8 +25,10 @@ |
| #include "core/layout/LayoutPart.h" |
| #include "core/dom/AXObjectCache.h" |
| +#include "core/frame/FrameOrPlugin.h" |
| #include "core/frame/FrameView.h" |
| #include "core/frame/LocalFrame.h" |
| +#include "core/frame/RemoteFrameView.h" |
| #include "core/html/HTMLFrameElementBase.h" |
| #include "core/html/HTMLPlugInElement.h" |
| #include "core/layout/HitTestResult.h" |
| @@ -108,14 +110,21 @@ PluginView* LayoutPart::Plugin() const { |
| : nullptr; |
| } |
| -FrameViewBase* LayoutPart::PluginOrFrame() const { |
| - FrameViewBase* result = nullptr; |
| +FrameOrPlugin* LayoutPart::GetFrameOrPlugin() const { |
| Node* node = GetNode(); |
| - if (node && node->IsFrameOwnerElement()) |
| - result = ToHTMLFrameOwnerElement(node)->OwnedWidget(); |
| - if (!result) |
| - result = Plugin(); |
| - return result; |
| + if (node && node->IsFrameOwnerElement()) { |
| + FrameViewBase* frame_view_base = |
| + ToHTMLFrameOwnerElement(node)->OwnedWidget(); |
| + if (frame_view_base) { |
| + if (frame_view_base->IsFrameView()) |
| + return ToFrameView(frame_view_base); |
| + if (frame_view_base->IsRemoteFrameView()) |
| + return ToRemoteFrameView(frame_view_base); |
|
dcheng
2017/04/17 21:09:05
This is another example of something that would be
joelhockey
2017/04/18 00:42:41
That is true, but it will be even better when Fram
|
| + // Must be either FrameView or RemoteFrameView. |
| + NOTREACHED(); |
| + } |
| + } |
| + return Plugin(); |
| } |
| PaintLayerType LayoutPart::LayerTypeRequired() const { |
| @@ -259,18 +268,18 @@ CompositingReasons LayoutPart::AdditionalCompositingReasons() const { |
| void LayoutPart::StyleDidChange(StyleDifference diff, |
| const ComputedStyle* old_style) { |
| LayoutReplaced::StyleDidChange(diff, old_style); |
| - FrameViewBase* frame_view_base = this->PluginOrFrame(); |
| - if (!frame_view_base) |
| + FrameOrPlugin* frame_or_plugin = GetFrameOrPlugin(); |
| + if (!frame_or_plugin) |
| return; |
| // If the iframe has custom scrollbars, recalculate their style. |
| - if (frame_view_base->IsFrameView()) |
| - ToFrameView(frame_view_base)->RecalculateCustomScrollbarStyle(); |
| + if (FrameView* frame_view = ChildFrameView()) |
| + frame_view->RecalculateCustomScrollbarStyle(); |
| if (Style()->Visibility() != EVisibility::kVisible) { |
| - frame_view_base->Hide(); |
| + frame_or_plugin->Hide(); |
| } else { |
| - frame_view_base->Show(); |
| + frame_or_plugin->Show(); |
| } |
| } |
| @@ -312,20 +321,20 @@ LayoutRect LayoutPart::ReplacedContentRect() const { |
| } |
| void LayoutPart::UpdateOnWidgetChange() { |
| - FrameViewBase* frame_view_base = this->PluginOrFrame(); |
| - if (!frame_view_base) |
| + FrameOrPlugin* frame_or_plugin = GetFrameOrPlugin(); |
| + if (!frame_or_plugin) |
| return; |
| if (!Style()) |
| return; |
| if (!NeedsLayout()) |
| - UpdateGeometryInternal(*frame_view_base); |
| + UpdateGeometryInternal(*frame_or_plugin); |
| if (Style()->Visibility() != EVisibility::kVisible) { |
| - frame_view_base->Hide(); |
| + frame_or_plugin->Hide(); |
| } else { |
| - frame_view_base->Show(); |
| + frame_or_plugin->Show(); |
| // FIXME: Why do we issue a full paint invalidation in this case, but not |
| // the other? |
| SetShouldDoFullPaintInvalidation(); |
| @@ -333,40 +342,38 @@ void LayoutPart::UpdateOnWidgetChange() { |
| } |
| void LayoutPart::UpdateGeometry() { |
| - FrameViewBase* frame_view_base = this->PluginOrFrame(); |
| - if (!frame_view_base || |
| - !GetNode()) // Check the node in case destroy() has been called. |
| + FrameOrPlugin* frame_or_plugin = GetFrameOrPlugin(); |
| + if (!frame_or_plugin) |
| return; |
| LayoutRect new_frame = ReplacedContentRect(); |
| DCHECK(new_frame.Size() == RoundedIntSize(new_frame.Size())); |
| bool bounds_will_change = |
| - LayoutSize(frame_view_base->FrameRect().Size()) != new_frame.Size(); |
| - |
| - FrameView* frame_view = |
| - frame_view_base->IsFrameView() ? ToFrameView(frame_view_base) : nullptr; |
| + LayoutSize(frame_or_plugin->FrameRect().Size()) != new_frame.Size(); |
| // If frame bounds are changing mark the view for layout. Also check the |
| // frame's page to make sure that the frame isn't in the process of being |
| // destroyed. If iframe scrollbars needs reconstruction from native to custom |
| // scrollbar, then also we need to layout the frameview. |
| + FrameView* frame_view = ChildFrameView(); |
| if (frame_view && frame_view->GetFrame().GetPage() && |
| (bounds_will_change || frame_view->NeedsScrollbarReconstruction())) |
| frame_view->SetNeedsLayout(); |
| - UpdateGeometryInternal(*frame_view_base); |
| + UpdateGeometryInternal(*frame_or_plugin); |
| // If view needs layout, either because bounds have changed or possibly |
| // indicating content size is wrong, we have to do a layout to set the right |
| - // FrameViewBase size. |
| + // FrameView size. |
| if (frame_view && frame_view->NeedsLayout() && |
| frame_view->GetFrame().GetPage()) |
| frame_view->UpdateLayout(); |
| - frame_view_base->GeometryMayHaveChanged(); |
| + if (PluginView* plugin = Plugin()) |
| + plugin->GeometryMayHaveChanged(); |
| } |
| -void LayoutPart::UpdateGeometryInternal(FrameViewBase& frame_view_base) { |
| +void LayoutPart::UpdateGeometryInternal(FrameOrPlugin& frame_or_plugin) { |
| // Ignore transform here, as we only care about the sub-pixel accumulation. |
| // TODO(trchen): What about multicol? Need a LayoutBox function to query |
| // sub-pixel accumulation. |
| @@ -378,7 +385,7 @@ void LayoutPart::UpdateGeometryInternal(FrameViewBase& frame_view_base) { |
| PixelSnappedIntRect(absolute_replaced_rect).Size()); |
| // Normally the location of the frame rect is ignored by the painter, but |
| // currently it is still used by a family of coordinate conversion function in |
| - // FrameViewBase/FrameView. This is incorrect because coordinate conversion |
| + // FrameView. This is incorrect because coordinate conversion |
| // needs to take transform and into account. A few callers still use the |
| // family of conversion function, including but not exhaustive: |
| // FrameView::updateViewportIntersectionIfNeeded() |
| @@ -391,7 +398,7 @@ void LayoutPart::UpdateGeometryInternal(FrameViewBase& frame_view_base) { |
| // Why is the protector needed? |
| RefPtr<LayoutPart> protector(this); |
| - frame_view_base.SetFrameRect(frame_rect); |
| + frame_or_plugin.SetFrameRect(frame_rect); |
| } |
| void LayoutPart::InvalidatePaintOfSubtreesIfNeeded( |