| 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 fc031a82fd5e5cc7d1038f35ed2e5e08021f4d00..db2ee4b233d8dab7ebc5736b177856ad63136137 100644
 | 
| --- a/third_party/WebKit/Source/core/frame/FrameView.cpp
 | 
| +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
 | 
| @@ -236,6 +236,7 @@ DEFINE_TRACE(FrameView) {
 | 
|    visitor->trace(m_animatingScrollableAreas);
 | 
|    visitor->trace(m_autoSizeInfo);
 | 
|    visitor->trace(m_children);
 | 
| +  visitor->trace(m_plugins);
 | 
|    visitor->trace(m_viewportScrollableArea);
 | 
|    visitor->trace(m_visibilityObserver);
 | 
|    visitor->trace(m_scrollAnchor);
 | 
| @@ -1483,7 +1484,7 @@ void FrameView::updateGeometries() {
 | 
|      if (layoutViewItem().isNull())
 | 
|        break;
 | 
|  
 | 
| -    if (FrameViewBase* frameViewBase = part->frameViewBase()) {
 | 
| +    if (FrameViewBase* frameViewBase = part->pluginOrFrame()) {
 | 
|        if (frameViewBase->isFrameView()) {
 | 
|          FrameView* frameView = toFrameView(frameViewBase);
 | 
|          bool didNeedLayout = frameView->needsLayout();
 | 
| @@ -3299,10 +3300,8 @@ void FrameView::updateStyleAndLayoutIfNeededRecursiveInternal() {
 | 
|    // TODO(leviw): This currently runs the entire lifecycle on plugin WebViews.
 | 
|    // We should have a way to only run these other Documents to the same
 | 
|    // lifecycle stage as this frame.
 | 
| -  const ChildrenSet* viewChildren = children();
 | 
| -  for (const Member<FrameViewBase>& child : *viewChildren) {
 | 
| -    if ((*child).isPluginContainer())
 | 
| -      toPluginView(child.get())->updateAllLifecyclePhases();
 | 
| +  for (const Member<PluginView>& plugin : *plugins()) {
 | 
| +    plugin->updateAllLifecyclePhases();
 | 
|    }
 | 
|    checkDoesNotNeedLayout();
 | 
|  
 | 
| @@ -3755,16 +3754,30 @@ void FrameView::setParent(FrameViewBase* parentView) {
 | 
|  }
 | 
|  
 | 
|  void FrameView::removeChild(FrameViewBase* child) {
 | 
| -  ASSERT(child->parent() == this);
 | 
| +  DCHECK(child->parent() == this);
 | 
|  
 | 
|    if (child->isFrameView() &&
 | 
|        !RuntimeEnabledFeatures::rootLayerScrollingEnabled())
 | 
|      removeScrollableArea(toFrameView(child));
 | 
|  
 | 
| -  child->setParent(0);
 | 
| +  child->setParent(nullptr);
 | 
|    m_children.erase(child);
 | 
|  }
 | 
|  
 | 
| +void FrameView::removePlugin(PluginView* plugin) {
 | 
| +  DCHECK(plugin->parent() == this);
 | 
| +  DCHECK(m_plugins.contains(plugin));
 | 
| +  plugin->setParent(nullptr);
 | 
| +  m_plugins.erase(plugin);
 | 
| +}
 | 
| +
 | 
| +void FrameView::addPlugin(PluginView* plugin) {
 | 
| +  DCHECK(!plugin->parent());
 | 
| +  DCHECK(!m_plugins.contains(plugin));
 | 
| +  plugin->setParent(this);
 | 
| +  m_plugins.insert(plugin);
 | 
| +}
 | 
| +
 | 
|  bool FrameView::visualViewportSuppliesScrollbars() {
 | 
|    // On desktop, we always use the layout viewport's scrollbars.
 | 
|    if (!m_frame->settings() || !m_frame->settings()->getViewportEnabled() ||
 | 
| @@ -3801,6 +3814,9 @@ void FrameView::frameRectsChanged() {
 | 
|  
 | 
|    for (const auto& child : m_children)
 | 
|      child->frameRectsChanged();
 | 
| +
 | 
| +  for (const auto& plugin : m_plugins)
 | 
| +    plugin->frameRectsChanged();
 | 
|  }
 | 
|  
 | 
|  void FrameView::setLayoutSizeInternal(const IntSize& size) {
 | 
| @@ -3851,7 +3867,8 @@ IntSize FrameView::maximumScrollOffsetInt() const {
 | 
|  }
 | 
|  
 | 
|  void FrameView::addChild(FrameViewBase* child) {
 | 
| -  ASSERT(child != this && !child->parent());
 | 
| +  DCHECK(child != this && !child->parent());
 | 
| +  DCHECK(!child->isPluginView());
 | 
|    child->setParent(this);
 | 
|    m_children.insert(child);
 | 
|  }
 | 
| @@ -4647,6 +4664,9 @@ void FrameView::setParentVisible(bool visible) {
 | 
|  
 | 
|    for (const auto& child : m_children)
 | 
|      child->setParentVisible(visible);
 | 
| +
 | 
| +  for (const auto& plugin : m_plugins)
 | 
| +    plugin->setParentVisible(visible);
 | 
|  }
 | 
|  
 | 
|  void FrameView::show() {
 | 
| @@ -4666,6 +4686,9 @@ void FrameView::show() {
 | 
|      if (isParentVisible()) {
 | 
|        for (const auto& child : m_children)
 | 
|          child->setParentVisible(true);
 | 
| +
 | 
| +      for (const auto& plugin : m_plugins)
 | 
| +        plugin->setParentVisible(true);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -4677,6 +4700,9 @@ void FrameView::hide() {
 | 
|      if (isParentVisible()) {
 | 
|        for (const auto& child : m_children)
 | 
|          child->setParentVisible(false);
 | 
| +
 | 
| +      for (const auto& plugin : m_plugins)
 | 
| +        plugin->setParentVisible(false);
 | 
|      }
 | 
|      setSelfVisible(false);
 | 
|      if (ScrollingCoordinator* scrollingCoordinator =
 | 
| 
 |