Index: third_party/WebKit/Source/core/frame/FrameView.cpp |
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp |
index 6f3db2e977c3e9f30d4fc23ea5b43527f05c67d4..b9348e3d8e350222804b212aa233f20f54176dad 100644 |
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp |
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp |
@@ -168,8 +168,10 @@ static const double kResourcePriorityUpdateDelayAfterScroll = 0.250; |
static bool g_initial_track_all_paint_invalidations = false; |
-FrameView::FrameView(LocalFrame& frame) |
+FrameView::FrameView(LocalFrame& frame, IntRect frame_rect) |
dcheng
2017/04/26 08:42:59
Btw, this should be passed by const ref (followup
joelhockey
2017/04/26 10:37:57
OK, I'll follow up with this
|
: frame_(frame), |
+ frame_rect_(frame_rect), |
+ parent_(nullptr), |
display_mode_(kWebDisplayModeBrowser), |
can_have_scrollbars_(true), |
has_pending_layout_(false), |
@@ -216,14 +218,13 @@ FrameView::FrameView(LocalFrame& frame) |
} |
FrameView* FrameView::Create(LocalFrame& frame) { |
- FrameView* view = new FrameView(frame); |
+ FrameView* view = new FrameView(frame, IntRect()); |
view->Show(); |
return view; |
} |
FrameView* FrameView::Create(LocalFrame& frame, const IntSize& initial_size) { |
- FrameView* view = new FrameView(frame); |
- view->FrameViewBase::SetFrameRect(IntRect(view->Location(), initial_size)); |
+ FrameView* view = new FrameView(frame, IntRect(IntPoint(), initial_size)); |
view->SetLayoutSizeInternal(initial_size); |
view->Show(); |
@@ -236,6 +237,7 @@ FrameView::~FrameView() { |
DEFINE_TRACE(FrameView) { |
visitor->Trace(frame_); |
+ visitor->Trace(parent_); |
visitor->Trace(fragment_anchor_); |
visitor->Trace(scrollable_areas_); |
visitor->Trace(animating_scrollable_areas_); |
@@ -544,16 +546,15 @@ void FrameView::InvalidateRect(const IntRect& rect) { |
layout_item.InvalidatePaintRectangle(LayoutRect(paint_invalidation_rect)); |
} |
-void FrameView::SetFrameRect(const IntRect& new_rect) { |
- IntRect old_rect = FrameRect(); |
- if (new_rect == old_rect) |
+void FrameView::SetFrameRect(const IntRect& frame_rect) { |
+ if (frame_rect == frame_rect_) |
return; |
- FrameViewBase::SetFrameRect(new_rect); |
+ const bool width_changed = frame_rect_.Width() != frame_rect.Width(); |
+ const bool height_changed = frame_rect_.Height() != frame_rect.Height(); |
+ frame_rect_ = frame_rect; |
- const bool frame_size_changed = old_rect.Size() != new_rect.Size(); |
- |
- needs_scrollbars_update_ = frame_size_changed; |
+ needs_scrollbars_update_ = width_changed || height_changed; |
// TODO(wjmaclean): find out why scrollbars fail to resize for complex |
// subframes after changing the zoom level. For now always calling |
// updateScrollbarsIfNeeded() here fixes the issue, but it would be good to |
@@ -574,9 +575,8 @@ void FrameView::SetFrameRect(const IntRect& new_rect) { |
if (auto layout_view_item = this->GetLayoutViewItem()) |
layout_view_item.SetMayNeedPaintInvalidation(); |
- if (frame_size_changed) { |
- ViewportSizeChanged(new_rect.Width() != old_rect.Width(), |
- new_rect.Height() != old_rect.Height()); |
+ if (width_changed || height_changed) { |
+ ViewportSizeChanged(width_changed, height_changed); |
if (frame_->IsMainFrame()) |
frame_->GetPage()->GetVisualViewport().MainFrameDidChangeSize(); |
@@ -3656,7 +3656,7 @@ IntPoint FrameView::ConvertSelfToChild(const FrameViewBase* child, |
IntRect FrameView::ConvertToContainingFrameViewBase( |
const IntRect& local_rect) const { |
- if (const FrameView* parent = ToFrameView(Parent())) { |
+ if (parent_) { |
// Get our layoutObject in the parent view |
LayoutPartItem layout_item = frame_->OwnerLayoutItem(); |
if (layout_item.IsNull()) |
@@ -3666,7 +3666,7 @@ IntRect FrameView::ConvertToContainingFrameViewBase( |
// Add borders and padding?? |
rect.Move((layout_item.BorderLeft() + layout_item.PaddingLeft()).ToInt(), |
(layout_item.BorderTop() + layout_item.PaddingTop()).ToInt()); |
- return parent->ConvertFromLayoutItem(layout_item, rect); |
+ return parent_->ConvertFromLayoutItem(layout_item, rect); |
} |
return local_rect; |
@@ -3674,10 +3674,10 @@ IntRect FrameView::ConvertToContainingFrameViewBase( |
IntRect FrameView::ConvertFromContainingFrameViewBase( |
const IntRect& parent_rect) const { |
- if (const FrameView* parent = ToFrameView(Parent())) { |
+ if (parent_) { |
IntRect local_rect = parent_rect; |
local_rect.SetLocation( |
- parent->ConvertSelfToChild(this, local_rect.Location())); |
+ parent_->ConvertSelfToChild(this, local_rect.Location())); |
return local_rect; |
} |
@@ -3686,7 +3686,7 @@ IntRect FrameView::ConvertFromContainingFrameViewBase( |
IntPoint FrameView::ConvertToContainingFrameViewBase( |
const IntPoint& local_point) const { |
- if (const FrameView* parent = ToFrameView(Parent())) { |
+ if (parent_) { |
// Get our layoutObject in the parent view |
LayoutPartItem layout_item = frame_->OwnerLayoutItem(); |
if (layout_item.IsNull()) |
@@ -3697,7 +3697,7 @@ IntPoint FrameView::ConvertToContainingFrameViewBase( |
// Add borders and padding |
point.Move((layout_item.BorderLeft() + layout_item.PaddingLeft()).ToInt(), |
(layout_item.BorderTop() + layout_item.PaddingTop()).ToInt()); |
- return parent->ConvertFromLayoutItem(layout_item, point); |
+ return parent_->ConvertFromLayoutItem(layout_item, point); |
} |
return local_point; |
@@ -3705,13 +3705,13 @@ IntPoint FrameView::ConvertToContainingFrameViewBase( |
IntPoint FrameView::ConvertFromContainingFrameViewBase( |
const IntPoint& parent_point) const { |
- if (const FrameView* parent = ToFrameView(Parent())) { |
+ if (parent_) { |
// Get our layoutObject in the parent view |
LayoutPartItem layout_item = frame_->OwnerLayoutItem(); |
if (layout_item.IsNull()) |
return parent_point; |
- IntPoint point = parent->ConvertToLayoutItem(layout_item, parent_point); |
+ IntPoint point = parent_->ConvertToLayoutItem(layout_item, parent_point); |
// Subtract borders and padding |
point.Move((-layout_item.BorderLeft() - layout_item.PaddingLeft()).ToInt(), |
(-layout_item.BorderTop() - layout_item.PaddingTop()).ToInt()); |
@@ -3841,11 +3841,24 @@ void FrameView::RemoveAnimatingScrollableArea(ScrollableArea* scrollable_area) { |
animating_scrollable_areas_->erase(scrollable_area); |
} |
-void FrameView::SetParent(FrameViewBase* parent) { |
- if (parent == Parent()) |
+FrameView* FrameView::Root() const { |
+ const FrameView* top = this; |
+ while (top->Parent()) |
+ top = ToFrameView(top->Parent()); |
+ return const_cast<FrameView*>(top); |
+} |
+ |
+void FrameView::SetParent(FrameViewBase* parent_frame_view_base) { |
+ FrameView* parent = ToFrameView(parent_frame_view_base); |
+ if (parent == parent_) |
return; |
- FrameViewBase::SetParent(parent); |
+ DCHECK(!parent || !parent_); |
+ if (!parent || !parent->IsVisible()) |
+ SetParentVisible(false); |
+ parent_ = parent; |
+ if (parent && parent->IsVisible()) |
+ SetParentVisible(true); |
UpdateParentScrollableAreaSet(); |
SetupRenderThrottling(); |
@@ -3981,7 +3994,6 @@ IntSize FrameView::MaximumScrollOffsetInt() const { |
void FrameView::AddChild(FrameViewBase* child) { |
DCHECK(child != this && !child->Parent()); |
- DCHECK(!child->IsPluginView()); |
child->SetParent(this); |
children_.insert(child); |
} |
@@ -4735,17 +4747,17 @@ bool FrameView::ScrollbarCornerPresent() const { |
} |
IntRect FrameView::ConvertToRootFrame(const IntRect& local_rect) const { |
- if (const FrameView* parent = ToFrameView(Parent())) { |
+ if (parent_) { |
IntRect parent_rect = ConvertToContainingFrameViewBase(local_rect); |
- return parent->ConvertToRootFrame(parent_rect); |
+ return parent_->ConvertToRootFrame(parent_rect); |
} |
return local_rect; |
} |
IntPoint FrameView::ConvertToRootFrame(const IntPoint& local_point) const { |
- if (const FrameView* parent = ToFrameView(Parent())) { |
+ if (parent_) { |
IntPoint parent_point = ConvertToContainingFrameViewBase(local_point); |
- return parent->ConvertToRootFrame(parent_point); |
+ return parent_->ConvertToRootFrame(parent_point); |
} |
return local_point; |
} |
@@ -4774,7 +4786,7 @@ void FrameView::SetParentVisible(bool visible) { |
// and potentially child frame views. |
SetNeedsCompositingUpdate(GetLayoutViewItem(), kCompositingUpdateRebuildTree); |
- FrameViewBase::SetParentVisible(visible); |
+ parent_visible_ = visible; |
if (!IsSelfVisible()) |
return; |