Chromium Code Reviews| Index: content/browser/android/render_widget_host_connector.cc |
| diff --git a/content/browser/android/render_widget_host_connector.cc b/content/browser/android/render_widget_host_connector.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6276858eb5fd82ffc54137e2e86d107e65a705cf |
| --- /dev/null |
| +++ b/content/browser/android/render_widget_host_connector.cc |
| @@ -0,0 +1,129 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/android/render_widget_host_connector.h" |
| + |
| +#include "content/browser/frame_host/interstitial_page_impl.h" |
| +#include "content/browser/renderer_host/render_widget_host_view_android.h" |
| +#include "content/browser/web_contents/web_contents_impl.h" |
| + |
| +namespace content { |
| + |
| +// Observes RenderWidgetHostViewAndroid to keep the instance up to date. |
| +class RenderWidgetHostConnector::Observer |
| + : public WebContentsObserver, |
| + public RenderWidgetHostViewAndroid::DestructionObserver { |
| + public: |
| + Observer(WebContents* web_contents, RenderWidgetHostConnector* connector); |
| + ~Observer() override; |
| + |
| + // WebContentsObserver implementation. |
| + void RenderViewHostChanged(RenderViewHost* old_host, |
| + RenderViewHost* new_host) override; |
| + void DidAttachInterstitialPage() override; |
| + void DidDetachInterstitialPage() override; |
| + void WebContentsDestroyed() override; |
| + |
| + // RenderWidgetHostViewAndroid::DestructionObserver implementation. |
| + void RenderWidgetHostViewDestroyed( |
| + RenderWidgetHostViewAndroid* rwhva) override; |
| + |
| + RenderWidgetHostViewAndroid* rwhva() const { return rwhva_; } |
| + |
| + private: |
| + void UpdateRenderWidgetHostView(RenderWidgetHostViewAndroid* new_rwhva); |
| + RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() const; |
| + |
| + RenderWidgetHostConnector* const connector_; |
| + RenderWidgetHostViewAndroid* rwhva_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(Observer); |
| +}; |
| + |
| +RenderWidgetHostConnector::Observer::Observer( |
| + WebContents* web_contents, |
| + RenderWidgetHostConnector* connector) |
| + : WebContentsObserver(web_contents), |
| + connector_(connector), |
| + rwhva_(nullptr) {} |
| + |
| +RenderWidgetHostConnector::Observer::~Observer() {} |
|
boliu
2017/04/14 01:10:07
DCHECK(rwhva_) is null here
Jinsuk Kim
2017/04/14 02:16:33
Done.
|
| + |
| +void RenderWidgetHostConnector::Observer::RenderViewHostChanged( |
| + RenderViewHost* old_host, |
| + RenderViewHost* new_host) { |
| + auto* old_view = old_host ? static_cast<RenderWidgetHostViewAndroid*>( |
| + old_host->GetWidget()->GetView()) |
| + : nullptr; |
| + auto* new_view = new_host ? static_cast<RenderWidgetHostViewAndroid*>( |
| + new_host->GetWidget()->GetView()) |
| + : nullptr; |
| + DCHECK_EQ(old_view, rwhva_); |
| + UpdateRenderWidgetHostView(new_view); |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::DidAttachInterstitialPage() { |
| + UpdateRenderWidgetHostView(GetRenderWidgetHostViewAndroid()); |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::DidDetachInterstitialPage() { |
| + UpdateRenderWidgetHostView(GetRenderWidgetHostViewAndroid()); |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::WebContentsDestroyed() { |
| + DCHECK_EQ(rwhva_, GetRenderWidgetHostViewAndroid()); |
| + UpdateRenderWidgetHostView(nullptr); |
| + delete connector_; |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::RenderWidgetHostViewDestroyed( |
| + RenderWidgetHostViewAndroid* destroyed_rwhva) { |
| + if (rwhva_ == destroyed_rwhva) { |
| + // Null out the raw pointers here and in the connector impl to keep |
| + // them from referencing the rwvha about to be destroyed. |
| + connector_->UpdateRenderProcessConnection(rwhva_, nullptr); |
| + rwhva_ = nullptr; |
| + } |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::UpdateRenderWidgetHostView( |
| + RenderWidgetHostViewAndroid* new_rwhva) { |
| + if (rwhva_ == new_rwhva) |
| + return; |
| + if (rwhva_) |
| + rwhva_->RemoveDestructionObserver(this); |
| + if (new_rwhva) |
| + new_rwhva->AddDestructionObserver(this); |
| + |
| + connector_->UpdateRenderProcessConnection(rwhva_, new_rwhva); |
| + rwhva_ = new_rwhva; |
| +} |
| + |
| +RenderWidgetHostViewAndroid* |
| +RenderWidgetHostConnector::Observer::GetRenderWidgetHostViewAndroid() const { |
| + RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView(); |
| + WebContentsImpl* web_contents_impl = |
| + static_cast<WebContentsImpl*>(web_contents()); |
| + if (web_contents_impl->ShowingInterstitialPage()) { |
| + rwhv = web_contents_impl->GetInterstitialPage() |
| + ->GetMainFrame() |
| + ->GetRenderViewHost() |
| + ->GetWidget() |
| + ->GetView(); |
| + } |
| + return static_cast<RenderWidgetHostViewAndroid*>(rwhv); |
| +} |
| + |
| +RenderWidgetHostConnector::RenderWidgetHostConnector(WebContents* web_contents) |
| + : render_widget_observer_( |
| + new RenderWidgetHostConnector::Observer(web_contents, this)) {} |
|
boliu
2017/04/14 01:10:07
is namespace here required?
Jinsuk Kim
2017/04/14 02:16:33
No. removed.
|
| + |
| +RenderWidgetHostConnector::~RenderWidgetHostConnector() {} |
| + |
| +RenderWidgetHostViewAndroid* |
| +RenderWidgetHostConnector::GetRenderWidgetHostViewAndroidForTesting() const { |
| + return render_widget_observer_->rwhva(); |
| +} |
| + |
| +} // namespace content |