| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/frame/RemoteFrameView.h" | 5 #include "core/frame/RemoteFrameView.h" |
| 6 | 6 |
| 7 #include "core/dom/IntersectionObserverEntry.h" | 7 #include "core/dom/IntersectionObserverEntry.h" |
| 8 #include "core/frame/FrameView.h" | 8 #include "core/frame/FrameView.h" |
| 9 #include "core/frame/LocalFrame.h" | 9 #include "core/frame/LocalFrame.h" |
| 10 #include "core/frame/RemoteFrame.h" | 10 #include "core/frame/RemoteFrame.h" |
| 11 #include "core/frame/RemoteFrameClient.h" | 11 #include "core/frame/RemoteFrameClient.h" |
| 12 #include "core/html/HTMLFrameOwnerElement.h" | 12 #include "core/html/HTMLFrameOwnerElement.h" |
| 13 #include "core/layout/LayoutView.h" | 13 #include "core/layout/LayoutView.h" |
| 14 #include "core/layout/api/LayoutPartItem.h" | 14 #include "core/layout/api/LayoutPartItem.h" |
| 15 | 15 |
| 16 namespace blink { | 16 namespace blink { |
| 17 | 17 |
| 18 RemoteFrameView::RemoteFrameView(RemoteFrame* remote_frame) | 18 RemoteFrameView::RemoteFrameView(RemoteFrame* remote_frame) |
| 19 : remote_frame_(remote_frame) { | 19 : remote_frame_(remote_frame) { |
| 20 ASSERT(remote_frame); | 20 ASSERT(remote_frame); |
| 21 } | 21 } |
| 22 | 22 |
| 23 RemoteFrameView::~RemoteFrameView() {} | 23 RemoteFrameView::~RemoteFrameView() {} |
| 24 | 24 |
| 25 void RemoteFrameView::SetParent(FrameViewBase* parent) { | 25 void RemoteFrameView::SetParent(FrameViewBase* parent_frame_view_base) { |
| 26 FrameViewBase::SetParent(parent); | 26 FrameView* parent = ToFrameView(parent_frame_view_base); |
| 27 if (parent == parent_) |
| 28 return; |
| 29 |
| 30 DCHECK(!parent || !parent_); |
| 31 if (!parent || !parent->IsVisible()) |
| 32 SetParentVisible(false); |
| 33 parent_ = parent; |
| 34 if (parent && parent->IsVisible()) |
| 35 SetParentVisible(true); |
| 27 FrameRectsChanged(); | 36 FrameRectsChanged(); |
| 28 } | 37 } |
| 29 | 38 |
| 30 RemoteFrameView* RemoteFrameView::Create(RemoteFrame* remote_frame) { | 39 RemoteFrameView* RemoteFrameView::Create(RemoteFrame* remote_frame) { |
| 31 RemoteFrameView* view = new RemoteFrameView(remote_frame); | 40 RemoteFrameView* view = new RemoteFrameView(remote_frame); |
| 32 view->Show(); | 41 view->Show(); |
| 33 return view; | 42 return view; |
| 34 } | 43 } |
| 35 | 44 |
| 36 void RemoteFrameView::UpdateRemoteViewportIntersection() { | 45 void RemoteFrameView::UpdateRemoteViewportIntersection() { |
| 37 if (!remote_frame_->OwnerLayoutObject()) | 46 if (!remote_frame_->OwnerLayoutObject()) |
| 38 return; | 47 return; |
| 39 | 48 |
| 40 FrameView* local_root_view = | 49 FrameView* local_root_view = |
| 41 ToLocalFrame(remote_frame_->Tree().Parent())->LocalFrameRoot()->View(); | 50 ToLocalFrame(remote_frame_->Tree().Parent())->LocalFrameRoot()->View(); |
| 42 if (!local_root_view) | 51 if (!local_root_view) |
| 43 return; | 52 return; |
| 44 | 53 |
| 45 // Start with rect in remote frame's coordinate space. Then | 54 // Start with rect in remote frame's coordinate space. Then |
| 46 // mapToVisualRectInAncestorSpace will move it to the local root's coordinate | 55 // mapToVisualRectInAncestorSpace will move it to the local root's coordinate |
| 47 // space and account for any clip from containing elements such as a | 56 // space and account for any clip from containing elements such as a |
| 48 // scrollable div. Passing nullptr as an argument to | 57 // scrollable div. Passing nullptr as an argument to |
| 49 // mapToVisualRectInAncestorSpace causes it to be clipped to the viewport, | 58 // mapToVisualRectInAncestorSpace causes it to be clipped to the viewport, |
| 50 // even if there are RemoteFrame ancestors in the frame tree. | 59 // even if there are RemoteFrame ancestors in the frame tree. |
| 51 LayoutRect rect(0, 0, FrameRect().Width(), FrameRect().Height()); | 60 LayoutRect rect(0, 0, frame_rect_.Width(), frame_rect_.Height()); |
| 52 rect.Move(remote_frame_->OwnerLayoutObject()->ContentBoxOffset()); | 61 rect.Move(remote_frame_->OwnerLayoutObject()->ContentBoxOffset()); |
| 53 if (!remote_frame_->OwnerLayoutObject()->MapToVisualRectInAncestorSpace( | 62 if (!remote_frame_->OwnerLayoutObject()->MapToVisualRectInAncestorSpace( |
| 54 nullptr, rect)) | 63 nullptr, rect)) |
| 55 return; | 64 return; |
| 56 IntRect root_visible_rect = local_root_view->VisibleContentRect(); | 65 IntRect root_visible_rect = local_root_view->VisibleContentRect(); |
| 57 IntRect viewport_intersection(rect); | 66 IntRect viewport_intersection(rect); |
| 58 viewport_intersection.Intersect(root_visible_rect); | 67 viewport_intersection.Intersect(root_visible_rect); |
| 59 viewport_intersection.Move(-local_root_view->ScrollOffsetInt()); | 68 viewport_intersection.Move(-local_root_view->ScrollOffsetInt()); |
| 60 | 69 |
| 61 // Translate the intersection rect from the root frame's coordinate space | 70 // Translate the intersection rect from the root frame's coordinate space |
| 62 // to the remote frame's coordinate space. | 71 // to the remote frame's coordinate space. |
| 63 viewport_intersection = ConvertFromRootFrame(viewport_intersection); | 72 viewport_intersection = ConvertFromRootFrame(viewport_intersection); |
| 64 if (viewport_intersection != last_viewport_intersection_) { | 73 if (viewport_intersection != last_viewport_intersection_) { |
| 65 remote_frame_->Client()->UpdateRemoteViewportIntersection( | 74 remote_frame_->Client()->UpdateRemoteViewportIntersection( |
| 66 viewport_intersection); | 75 viewport_intersection); |
| 67 } | 76 } |
| 68 last_viewport_intersection_ = viewport_intersection; | 77 last_viewport_intersection_ = viewport_intersection; |
| 69 } | 78 } |
| 70 | 79 |
| 71 void RemoteFrameView::Dispose() { | 80 void RemoteFrameView::Dispose() { |
| 72 HTMLFrameOwnerElement* owner_element = remote_frame_->DeprecatedLocalOwner(); | 81 HTMLFrameOwnerElement* owner_element = remote_frame_->DeprecatedLocalOwner(); |
| 73 // ownerElement can be null during frame swaps, because the | 82 // ownerElement can be null during frame swaps, because the |
| 74 // RemoteFrameView is disconnected before detachment. | 83 // RemoteFrameView is disconnected before detachment. |
| 75 if (owner_element && owner_element->OwnedWidget() == this) | 84 if (owner_element && owner_element->OwnedWidget() == this) |
| 76 owner_element->SetWidget(nullptr); | 85 owner_element->SetWidget(nullptr); |
| 77 FrameViewBase::Dispose(); | |
| 78 } | 86 } |
| 79 | 87 |
| 80 void RemoteFrameView::InvalidateRect(const IntRect& rect) { | 88 void RemoteFrameView::InvalidateRect(const IntRect& rect) { |
| 81 LayoutPartItem layout_item = remote_frame_->OwnerLayoutItem(); | 89 LayoutPartItem layout_item = remote_frame_->OwnerLayoutItem(); |
| 82 if (layout_item.IsNull()) | 90 if (layout_item.IsNull()) |
| 83 return; | 91 return; |
| 84 | 92 |
| 85 LayoutRect repaint_rect(rect); | 93 LayoutRect repaint_rect(rect); |
| 86 repaint_rect.Move(layout_item.BorderLeft() + layout_item.PaddingLeft(), | 94 repaint_rect.Move(layout_item.BorderLeft() + layout_item.PaddingLeft(), |
| 87 layout_item.BorderTop() + layout_item.PaddingTop()); | 95 layout_item.BorderTop() + layout_item.PaddingTop()); |
| 88 layout_item.InvalidatePaintRectangle(repaint_rect); | 96 layout_item.InvalidatePaintRectangle(repaint_rect); |
| 89 } | 97 } |
| 90 | 98 |
| 91 void RemoteFrameView::SetFrameRect(const IntRect& new_rect) { | 99 void RemoteFrameView::SetFrameRect(const IntRect& frame_rect) { |
| 92 IntRect old_rect = FrameRect(); | 100 if (frame_rect == frame_rect_) |
| 93 | |
| 94 if (new_rect == old_rect) | |
| 95 return; | 101 return; |
| 96 | 102 |
| 97 FrameViewBase::SetFrameRect(new_rect); | 103 frame_rect_ = frame_rect; |
| 98 | |
| 99 FrameRectsChanged(); | 104 FrameRectsChanged(); |
| 100 } | 105 } |
| 101 | 106 |
| 102 void RemoteFrameView::FrameRectsChanged() { | 107 void RemoteFrameView::FrameRectsChanged() { |
| 103 // Update the rect to reflect the position of the frame relative to the | 108 // Update the rect to reflect the position of the frame relative to the |
| 104 // containing local frame root. The position of the local root within | 109 // containing local frame root. The position of the local root within |
| 105 // any remote frames, if any, is accounted for by the embedder. | 110 // any remote frames, if any, is accounted for by the embedder. |
| 106 IntRect new_rect = FrameRect(); | 111 IntRect new_rect = frame_rect_; |
| 107 if (const FrameView* parent = ToFrameView(Parent())) | 112 if (parent_) |
| 108 new_rect = parent->ConvertToRootFrame(parent->ContentsToFrame(new_rect)); | 113 new_rect = parent_->ConvertToRootFrame(parent_->ContentsToFrame(new_rect)); |
| 109 | |
| 110 remote_frame_->Client()->FrameRectsChanged(new_rect); | 114 remote_frame_->Client()->FrameRectsChanged(new_rect); |
| 111 | 115 |
| 112 UpdateRemoteViewportIntersection(); | 116 UpdateRemoteViewportIntersection(); |
| 113 } | 117 } |
| 114 | 118 |
| 115 void RemoteFrameView::Hide() { | 119 void RemoteFrameView::Hide() { |
| 116 SetSelfVisible(false); | 120 self_visible_ = false; |
| 117 | |
| 118 remote_frame_->Client()->VisibilityChanged(false); | 121 remote_frame_->Client()->VisibilityChanged(false); |
| 119 } | 122 } |
| 120 | 123 |
| 121 void RemoteFrameView::Show() { | 124 void RemoteFrameView::Show() { |
| 122 SetSelfVisible(true); | 125 self_visible_ = true; |
| 123 | |
| 124 remote_frame_->Client()->VisibilityChanged(true); | 126 remote_frame_->Client()->VisibilityChanged(true); |
| 125 } | 127 } |
| 126 | 128 |
| 127 void RemoteFrameView::SetParentVisible(bool visible) { | 129 void RemoteFrameView::SetParentVisible(bool visible) { |
| 128 if (IsParentVisible() == visible) | 130 if (parent_visible_ == visible) |
| 129 return; | 131 return; |
| 130 | 132 |
| 131 FrameViewBase::SetParentVisible(visible); | 133 parent_visible_ = visible; |
| 132 if (!IsSelfVisible()) | 134 if (!self_visible_) |
| 133 return; | 135 return; |
| 134 | 136 |
| 135 remote_frame_->Client()->VisibilityChanged(IsVisible()); | 137 remote_frame_->Client()->VisibilityChanged(self_visible_ && parent_visible_); |
| 136 } | 138 } |
| 137 | 139 |
| 138 IntRect RemoteFrameView::ConvertFromContainingFrameViewBase( | 140 IntRect RemoteFrameView::ConvertFromContainingFrameViewBase( |
| 139 const IntRect& parent_rect) const { | 141 const IntRect& parent_rect) const { |
| 140 if (const FrameView* parent = ToFrameView(Parent())) { | 142 if (const FrameView* parent = ToFrameView(Parent())) { |
| 141 IntRect local_rect = parent_rect; | 143 IntRect local_rect = parent_rect; |
| 142 local_rect.SetLocation( | 144 local_rect.SetLocation( |
| 143 parent->ConvertSelfToChild(this, local_rect.Location())); | 145 parent->ConvertSelfToChild(this, local_rect.Location())); |
| 144 return local_rect; | 146 return local_rect; |
| 145 } | 147 } |
| 146 | 148 |
| 147 return parent_rect; | 149 return parent_rect; |
| 148 } | 150 } |
| 149 | 151 |
| 150 DEFINE_TRACE(RemoteFrameView) { | 152 DEFINE_TRACE(RemoteFrameView) { |
| 151 visitor->Trace(remote_frame_); | 153 visitor->Trace(remote_frame_); |
| 152 FrameViewBase::Trace(visitor); | 154 visitor->Trace(parent_); |
| 153 } | 155 } |
| 154 | 156 |
| 155 } // namespace blink | 157 } // namespace blink |
| OLD | NEW |