Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: content/browser/android/render_widget_host_connector.cc

Issue 2792063003: Factor out RenderWidgetHostConnector (Closed)
Patch Set: base::ObserverList Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/android/render_widget_host_connector.h"
6
7 #include "content/browser/frame_host/interstitial_page_impl.h"
8 #include "content/browser/renderer_host/render_widget_host_view_android.h"
9 #include "content/browser/web_contents/web_contents_impl.h"
10
11 namespace content {
12
13 // Observes RenderWidgetHostViewAndroid to keep the instance up to date.
14 class RenderWidgetHostConnector::Observer
15 : public WebContentsObserver,
16 public RenderWidgetHostViewAndroid::DestructionObserver {
17 public:
18 Observer(WebContents* web_contents, RenderWidgetHostConnector* connector);
19 ~Observer() override;
20
21 // WebContentsObserver implementation.
22 void RenderViewReady() override;
23 void RenderViewHostChanged(RenderViewHost* old_host,
24 RenderViewHost* new_host) override;
25 void DidAttachInterstitialPage() override;
26 void DidDetachInterstitialPage() override;
27 void WebContentsDestroyed() override;
28
29 // RenderWidgetHostViewAndroid::DestructionObserver implementation.
30 void RenderWidgetHostViewDestroyed(
31 RenderWidgetHostViewAndroid* rwhva) override;
32
33 RenderWidgetHostViewAndroid* active_rwhva() const { return active_rwhva_; }
34
35 private:
36 void UpdateRenderWidgetHostView(RenderWidgetHostViewAndroid* new_rwhva);
37 RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() const;
38
39 RenderWidgetHostConnector* const connector_;
40
41 // Active RenderWidgetHostView connected to this instance. Can also point to
42 // an interstitial while it is showing.
43 RenderWidgetHostViewAndroid* active_rwhva_;
44
45 DISALLOW_COPY_AND_ASSIGN(Observer);
46 };
47
48 RenderWidgetHostConnector::Observer::Observer(
49 WebContents* web_contents,
50 RenderWidgetHostConnector* connector)
51 : WebContentsObserver(web_contents),
52 connector_(connector),
53 active_rwhva_(nullptr) {}
54
55 RenderWidgetHostConnector::Observer::~Observer() {
56 DCHECK(!active_rwhva_);
57 }
58
59 void RenderWidgetHostConnector::Observer::RenderViewReady() {
60 UpdateRenderWidgetHostView(GetRenderWidgetHostViewAndroid());
61 }
62
63 void RenderWidgetHostConnector::Observer::RenderViewHostChanged(
64 RenderViewHost* old_host,
65 RenderViewHost* new_host) {
66 // |RenderViewHostChanged| is called only for main rwhva change.
67 // No need to update connection if an interstitial page is active.
68 if (web_contents()->ShowingInterstitialPage())
69 return;
70
71 auto* new_view = new_host ? static_cast<RenderWidgetHostViewAndroid*>(
72 new_host->GetWidget()->GetView())
73 : nullptr;
74 UpdateRenderWidgetHostView(new_view);
75 }
76
77 void RenderWidgetHostConnector::Observer::DidAttachInterstitialPage() {
78 UpdateRenderWidgetHostView(GetRenderWidgetHostViewAndroid());
79 }
80
81 void RenderWidgetHostConnector::Observer::DidDetachInterstitialPage() {
82 UpdateRenderWidgetHostView(GetRenderWidgetHostViewAndroid());
83 }
84
85 void RenderWidgetHostConnector::Observer::WebContentsDestroyed() {
86 DCHECK_EQ(active_rwhva_, GetRenderWidgetHostViewAndroid());
87 UpdateRenderWidgetHostView(nullptr);
88 delete connector_;
89 }
90
91 void RenderWidgetHostConnector::Observer::RenderWidgetHostViewDestroyed(
92 RenderWidgetHostViewAndroid* destroyed_rwhva) {
93 // Null out the raw pointer here and in the connector impl to keep
94 // them from referencing the rwvha about to be destroyed.
95 if (destroyed_rwhva == active_rwhva_)
96 UpdateRenderWidgetHostView(nullptr);
97 }
98
99 void RenderWidgetHostConnector::Observer::UpdateRenderWidgetHostView(
100 RenderWidgetHostViewAndroid* new_rwhva) {
101 if (active_rwhva_ == new_rwhva)
102 return;
103 if (active_rwhva_)
104 active_rwhva_->RemoveDestructionObserver(this);
105 if (new_rwhva)
106 new_rwhva->AddDestructionObserver(this);
107
108 connector_->UpdateRenderProcessConnection(active_rwhva_, new_rwhva);
109 active_rwhva_ = new_rwhva;
110 }
111
112 RenderWidgetHostViewAndroid*
113 RenderWidgetHostConnector::Observer::GetRenderWidgetHostViewAndroid() const {
114 RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView();
115 WebContentsImpl* web_contents_impl =
116 static_cast<WebContentsImpl*>(web_contents());
117 if (web_contents_impl->ShowingInterstitialPage()) {
118 rwhv = web_contents_impl->GetInterstitialPage()
119 ->GetMainFrame()
120 ->GetRenderViewHost()
121 ->GetWidget()
122 ->GetView();
123 }
124 return static_cast<RenderWidgetHostViewAndroid*>(rwhv);
125 }
126
127 RenderWidgetHostConnector::RenderWidgetHostConnector(WebContents* web_contents)
128 : render_widget_observer_(new Observer(web_contents, this)) {}
129
130 RenderWidgetHostConnector::~RenderWidgetHostConnector() {}
131
132 RenderWidgetHostViewAndroid* RenderWidgetHostConnector::GetRWHVAForTesting()
133 const {
134 return render_widget_observer_->active_rwhva();
135 }
136
137 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698