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

Side by Side Diff: content/browser/permissions/permission_service_context.cc

Issue 2617863003: Restore logic to unsubscribe from permission changes on frame change. (Closed)
Patch Set: Created 3 years, 11 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/permissions/permission_service_context.h" 5 #include "content/browser/permissions/permission_service_context.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "content/browser/permissions/permission_service_impl.h" 9 #include "content/browser/permissions/permission_service_impl.h"
10 #include "content/public/browser/browser_context.h" 10 #include "content/public/browser/browser_context.h"
11 #include "content/public/browser/navigation_details.h" 11 #include "content/public/browser/navigation_details.h"
12 #include "content/public/browser/permission_manager.h" 12 #include "content/public/browser/permission_manager.h"
13 #include "content/public/browser/render_frame_host.h" 13 #include "content/public/browser/render_frame_host.h"
14 #include "content/public/browser/render_process_host.h" 14 #include "content/public/browser/render_process_host.h"
15 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
16 16
17 using blink::mojom::PermissionObserverPtr; 17 using blink::mojom::PermissionObserverPtr;
18 18
19 namespace content { 19 namespace content {
20 20
21 class PermissionServiceContext::PermissionSubscription { 21 class PermissionServiceContext::PermissionSubscription {
22 public: 22 public:
23 PermissionSubscription(PermissionServiceContext* context, 23 PermissionSubscription(PermissionServiceContext* context,
24 PermissionObserverPtr observer) 24 PermissionObserverPtr observer)
25 : context_(context), observer_(std::move(observer)) { 25 : context_(context), observer_(std::move(observer)) {
26 observer_.set_connection_error_handler(base::Bind( 26 observer_.set_connection_error_handler(base::Bind(
27 &PermissionSubscription::OnConnectionError, base::Unretained(this))); 27 &PermissionSubscription::OnConnectionError, base::Unretained(this)));
28 } 28 }
29 29
30 ~PermissionSubscription() = default; 30 ~PermissionSubscription() {
31 DCHECK_NE(id_, 0);
32 BrowserContext* browser_context = context_->GetBrowserContext();
33 DCHECK(browser_context);
34 if (browser_context->GetPermissionManager()) {
35 browser_context->GetPermissionManager()
36 ->UnsubscribePermissionStatusChange(id_);
37 }
38 }
31 39
32 void OnConnectionError() { 40 void OnConnectionError() {
33 DCHECK_NE(id_, 0); 41 DCHECK_NE(id_, 0);
34 context_->ObserverHadConnectionError(id_); 42 context_->ObserverHadConnectionError(id_);
35 } 43 }
36 44
37 void OnPermissionStatusChanged(blink::mojom::PermissionStatus status) { 45 void OnPermissionStatusChanged(blink::mojom::PermissionStatus status) {
38 observer_->OnPermissionStatusChange(status); 46 observer_->OnPermissionStatusChange(status);
39 } 47 }
40 48
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 auto it = std::find_if( 106 auto it = std::find_if(
99 services_.begin(), services_.end(), 107 services_.begin(), services_.end(),
100 [service](const std::unique_ptr<PermissionServiceImpl>& this_service) { 108 [service](const std::unique_ptr<PermissionServiceImpl>& this_service) {
101 return service == this_service.get(); 109 return service == this_service.get();
102 }); 110 });
103 DCHECK(it != services_.end()); 111 DCHECK(it != services_.end());
104 services_.erase(it); 112 services_.erase(it);
105 } 113 }
106 114
107 void PermissionServiceContext::ObserverHadConnectionError(int subscription_id) { 115 void PermissionServiceContext::ObserverHadConnectionError(int subscription_id) {
108 BrowserContext* browser_context = GetBrowserContext();
109 DCHECK(browser_context);
110 if (browser_context->GetPermissionManager()) {
111 browser_context->GetPermissionManager()->UnsubscribePermissionStatusChange(
112 subscription_id);
113 }
114
115 auto it = subscriptions_.find(subscription_id); 116 auto it = subscriptions_.find(subscription_id);
116 DCHECK(it != subscriptions_.end()); 117 DCHECK(it != subscriptions_.end());
117 subscriptions_.erase(it); 118 subscriptions_.erase(it);
118 } 119 }
119 120
120 void PermissionServiceContext::RenderFrameHostChanged( 121 void PermissionServiceContext::RenderFrameHostChanged(
121 RenderFrameHost* old_host, 122 RenderFrameHost* old_host,
122 RenderFrameHost* new_host) { 123 RenderFrameHost* new_host) {
123 CancelPendingOperations(old_host); 124 CancelPendingOperations(old_host);
124 } 125 }
125 126
126 void PermissionServiceContext::FrameDeleted( 127 void PermissionServiceContext::FrameDeleted(
127 RenderFrameHost* render_frame_host) { 128 RenderFrameHost* render_frame_host) {
128 CancelPendingOperations(render_frame_host); 129 CancelPendingOperations(render_frame_host);
129 } 130 }
130 131
131 void PermissionServiceContext::DidNavigateAnyFrame( 132 void PermissionServiceContext::DidNavigateAnyFrame(
132 RenderFrameHost* render_frame_host, 133 RenderFrameHost* render_frame_host,
133 const LoadCommittedDetails& details, 134 const LoadCommittedDetails& details,
134 const FrameNavigateParams& params) { 135 const FrameNavigateParams& params) {
135 if (details.is_in_page) 136 if (details.is_in_page)
136 return; 137 return;
137 138
138 CancelPendingOperations(render_frame_host); 139 CancelPendingOperations(render_frame_host);
139 } 140 }
140 141
141 void PermissionServiceContext::CancelPendingOperations( 142 void PermissionServiceContext::CancelPendingOperations(
142 RenderFrameHost* render_frame_host) const { 143 RenderFrameHost* render_frame_host) {
143 DCHECK(render_frame_host_); 144 DCHECK(render_frame_host_);
144 if (render_frame_host != render_frame_host_) 145 if (render_frame_host != render_frame_host_)
145 return; 146 return;
146 147
147 for (const auto& service : services_) 148 for (const auto& service : services_)
148 service->CancelPendingOperations(); 149 service->CancelPendingOperations();
150
151 subscriptions_.clear();
149 } 152 }
150 153
151 BrowserContext* PermissionServiceContext::GetBrowserContext() const { 154 BrowserContext* PermissionServiceContext::GetBrowserContext() const {
152 if (!web_contents()) { 155 if (!web_contents()) {
153 DCHECK(render_process_host_); 156 DCHECK(render_process_host_);
154 return render_process_host_->GetBrowserContext(); 157 return render_process_host_->GetBrowserContext();
155 } 158 }
156 return web_contents()->GetBrowserContext(); 159 return web_contents()->GetBrowserContext();
157 } 160 }
158 161
159 GURL PermissionServiceContext::GetEmbeddingOrigin() const { 162 GURL PermissionServiceContext::GetEmbeddingOrigin() const {
160 return web_contents() ? web_contents()->GetLastCommittedURL().GetOrigin() 163 return web_contents() ? web_contents()->GetLastCommittedURL().GetOrigin()
161 : GURL(); 164 : GURL();
162 } 165 }
163 166
164 RenderFrameHost* PermissionServiceContext::render_frame_host() const { 167 RenderFrameHost* PermissionServiceContext::render_frame_host() const {
165 return render_frame_host_; 168 return render_frame_host_;
166 } 169 }
167 170
168 } // namespace content 171 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/permissions/permission_service_context.h ('k') | content/browser/permissions/permission_service_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698