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..af2dcd1215c9199fc32f3609fdac6b3b6420a931 |
| --- /dev/null |
| +++ b/content/browser/android/render_widget_host_connector.cc |
| @@ -0,0 +1,89 @@ |
| +// 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 { |
| + |
| +RenderWidgetHostConnector::Observer::Observer( |
| + WebContents* web_contents, |
| + RenderWidgetHostConnector* connector) |
| + : WebContentsObserver(web_contents), |
| + connector_(connector), |
| + rwhva_(nullptr) {} |
| + |
| +RenderWidgetHostConnector::Observer::~Observer() {} |
| + |
| +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; |
| + UpdateRenderWidgetHostView(old_view, new_view); |
|
boliu
2017/04/13 03:44:13
hmm, I'm not sure how interstitials are implemente
Jinsuk Kim
2017/04/13 04:20:20
I don't know right now, but that doesn't sound rig
|
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::DidAttachInterstitialPage() { |
| + UpdateRenderWidgetHostView(rwhva_, GetRenderWidgetHostViewAndroid()); |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::DidDetachInterstitialPage() { |
| + UpdateRenderWidgetHostView(rwhva_, GetRenderWidgetHostViewAndroid()); |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::WebContentsDestroyed() { |
| + UpdateRenderWidgetHostView(GetRenderWidgetHostViewAndroid(), nullptr); |
| + delete connector_; |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::RenderWidgetHostViewDestroyed( |
| + RenderWidgetHostViewAndroid* destroyed_rwhva) { |
| + if (GetRenderWidgetHostViewAndroid() == 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(nullptr, nullptr); |
|
boliu
2017/04/13 03:44:13
why is old null?
Jinsuk Kim
2017/04/13 04:20:20
This is to set the current rwhva cached in the con
boliu
2017/04/13 04:29:41
That's not part of the interface. The interface is
Jinsuk Kim
2017/04/13 04:44:05
Done. This will help ensure ime_adapter_ in rwhva
|
| + rwhva_ = nullptr; |
| + } |
| +} |
| + |
| +void RenderWidgetHostConnector::Observer::UpdateRenderWidgetHostView( |
| + RenderWidgetHostViewAndroid* old_rwhva, |
| + RenderWidgetHostViewAndroid* new_rwhva) { |
| + if (old_rwhva == new_rwhva) |
| + return; |
| + if (new_rwhva) |
| + new_rwhva->add_destruction_observer(this); |
|
boliu
2017/04/13 03:44:13
you need to remove this from the old_rwhva
Jinsuk Kim
2017/04/13 04:20:20
Done.
|
| + |
| + connector_->UpdateRenderProcessConnection(old_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 Observer(web_contents, this)) {} |
| + |
| +RenderWidgetHostConnector::~RenderWidgetHostConnector() {} |
| + |
| +} // namespace content |