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

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

Issue 2792063003: Factor out RenderWidgetHostConnector (Closed)
Patch Set: no interstitial flag/var 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 connector_->UpdateRenderProcessConnection(active_rwhva_, nullptr);
boliu 2017/04/18 03:53:58 should this just be UpdateRenderWidgetHostView(nul
Jinsuk Kim 2017/04/18 04:25:34 This came from RWHVA destruction observer. So no n
boliu 2017/04/18 04:45:32 Well, won't be adding observer because it's callin
boliu 2017/04/18 04:47:09 Oh you mean it's not safe modifying the vector and
Jinsuk Kim 2017/04/18 05:20:23 Done.
97 active_rwhva_ = nullptr;
98 }
99 }
100
101 void RenderWidgetHostConnector::Observer::UpdateRenderWidgetHostView(
102 RenderWidgetHostViewAndroid* new_rwhva) {
103 if (active_rwhva_ == new_rwhva)
104 return;
105 if (active_rwhva_)
106 active_rwhva_->RemoveDestructionObserver(this);
107 if (new_rwhva)
108 new_rwhva->AddDestructionObserver(this);
109
110 connector_->UpdateRenderProcessConnection(active_rwhva_, new_rwhva);
111 active_rwhva_ = new_rwhva;
112 }
113
114 RenderWidgetHostViewAndroid*
115 RenderWidgetHostConnector::Observer::GetRenderWidgetHostViewAndroid() const {
116 RenderWidgetHostView* rwhv = web_contents()->GetRenderWidgetHostView();
117 WebContentsImpl* web_contents_impl =
118 static_cast<WebContentsImpl*>(web_contents());
119 if (web_contents_impl->ShowingInterstitialPage()) {
120 rwhv = web_contents_impl->GetInterstitialPage()
121 ->GetMainFrame()
122 ->GetRenderViewHost()
123 ->GetWidget()
124 ->GetView();
125 }
126 return static_cast<RenderWidgetHostViewAndroid*>(rwhv);
127 }
128
129 RenderWidgetHostConnector::RenderWidgetHostConnector(WebContents* web_contents)
130 : render_widget_observer_(new Observer(web_contents, this)) {}
131
132 RenderWidgetHostConnector::~RenderWidgetHostConnector() {}
133
134 RenderWidgetHostViewAndroid* RenderWidgetHostConnector::GetRWHVAForTesting()
135 const {
136 return render_widget_observer_->active_rwhva();
137 }
138
139 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698