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

Side by Side Diff: content/browser/browser_plugin/browser_plugin_guest.cc

Issue 235633002: <webview>: Move Geolocation permission to chrome layer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reordered permission names Created 6 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser_plugin/browser_plugin_guest.h" 5 #include "content/browser/browser_plugin/browser_plugin_guest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 14 matching lines...) Expand all
25 #include "content/common/browser_plugin/browser_plugin_messages.h" 25 #include "content/common/browser_plugin/browser_plugin_messages.h"
26 #include "content/common/content_constants_internal.h" 26 #include "content/common/content_constants_internal.h"
27 #include "content/common/drag_messages.h" 27 #include "content/common/drag_messages.h"
28 #include "content/common/gpu/gpu_messages.h" 28 #include "content/common/gpu/gpu_messages.h"
29 #include "content/common/input_messages.h" 29 #include "content/common/input_messages.h"
30 #include "content/common/view_messages.h" 30 #include "content/common/view_messages.h"
31 #include "content/port/browser/render_view_host_delegate_view.h" 31 #include "content/port/browser/render_view_host_delegate_view.h"
32 #include "content/port/browser/render_widget_host_view_port.h" 32 #include "content/port/browser/render_widget_host_view_port.h"
33 #include "content/public/browser/browser_context.h" 33 #include "content/public/browser/browser_context.h"
34 #include "content/public/browser/content_browser_client.h" 34 #include "content/public/browser/content_browser_client.h"
35 #include "content/public/browser/geolocation_permission_context.h"
36 #include "content/public/browser/navigation_controller.h" 35 #include "content/public/browser/navigation_controller.h"
37 #include "content/public/browser/render_process_host.h" 36 #include "content/public/browser/render_process_host.h"
38 #include "content/public/browser/render_widget_host_view.h" 37 #include "content/public/browser/render_widget_host_view.h"
39 #include "content/public/browser/resource_request_details.h" 38 #include "content/public/browser/resource_request_details.h"
40 #include "content/public/browser/user_metrics.h" 39 #include "content/public/browser/user_metrics.h"
41 #include "content/public/browser/web_contents_observer.h" 40 #include "content/public/browser/web_contents_observer.h"
42 #include "content/public/browser/web_contents_view.h" 41 #include "content/public/browser/web_contents_view.h"
43 #include "content/public/common/drop_data.h" 42 #include "content/public/common/drop_data.h"
44 #include "content/public/common/media_stream_request.h" 43 #include "content/public/common/media_stream_request.h"
45 #include "content/public/common/result_codes.h" 44 #include "content/public/common/result_codes.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 virtual void RespondImpl(bool should_allow, 100 virtual void RespondImpl(bool should_allow,
102 const std::string& user_input) OVERRIDE { 101 const std::string& user_input) OVERRIDE {
103 callback_.Run(should_allow); 102 callback_.Run(should_allow);
104 } 103 }
105 104
106 private: 105 private:
107 virtual ~DownloadRequest() {} 106 virtual ~DownloadRequest() {}
108 base::Callback<void(bool)> callback_; 107 base::Callback<void(bool)> callback_;
109 }; 108 };
110 109
111 class BrowserPluginGuest::GeolocationRequest : public PermissionRequest {
112 public:
113 GeolocationRequest(const base::WeakPtr<BrowserPluginGuest>& guest,
114 GeolocationCallback callback,
115 int bridge_id,
116 bool user_gesture)
117 : PermissionRequest(guest),
118 callback_(callback),
119 bridge_id_(bridge_id),
120 user_gesture_(user_gesture) {
121 RecordAction(
122 base::UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.Geolocati on"));
123 }
124
125 virtual void RespondImpl(bool should_allow,
126 const std::string& user_input) OVERRIDE {
127 WebContents* web_contents = guest_->embedder_web_contents();
128 if (should_allow && web_contents) {
129 // If renderer side embedder decides to allow gelocation, we need to check
130 // if the app/embedder itself has geolocation access.
131 BrowserContext* browser_context = web_contents->GetBrowserContext();
132 if (browser_context) {
133 GeolocationPermissionContext* geolocation_context =
134 browser_context->GetGeolocationPermissionContext();
135 if (geolocation_context) {
136 base::Callback<void(bool)> geolocation_callback = base::Bind(
137 &BrowserPluginGuest::SetGeolocationPermission,
138 guest_,
139 callback_,
140 bridge_id_);
141 geolocation_context->RequestGeolocationPermission(
142 web_contents->GetRenderProcessHost()->GetID(),
143 web_contents->GetRoutingID(),
144 // The geolocation permission request here is not initiated
145 // through WebGeolocationPermissionRequest. We are only interested
146 // in the fact whether the embedder/app has geolocation
147 // permission. Therefore we use an invalid |bridge_id|.
148 -1 /* bridge_id */,
149 web_contents->GetLastCommittedURL(),
150 user_gesture_,
151 geolocation_callback);
152 return;
153 }
154 }
155 }
156 guest_->SetGeolocationPermission(callback_, bridge_id_, false);
157 }
158
159 private:
160 virtual ~GeolocationRequest() {}
161 base::Callback<void(bool)> callback_;
162 int bridge_id_;
163 bool user_gesture_;
164 };
165
166 class BrowserPluginGuest::MediaRequest : public PermissionRequest { 110 class BrowserPluginGuest::MediaRequest : public PermissionRequest {
167 public: 111 public:
168 MediaRequest(const base::WeakPtr<BrowserPluginGuest>& guest, 112 MediaRequest(const base::WeakPtr<BrowserPluginGuest>& guest,
169 const MediaStreamRequest& request, 113 const MediaStreamRequest& request,
170 const MediaResponseCallback& callback) 114 const MediaResponseCallback& callback)
171 : PermissionRequest(guest), 115 : PermissionRequest(guest),
172 request_(request), 116 request_(request),
173 callback_(callback) { 117 callback_(callback) {
174 RecordAction( 118 RecordAction(
175 base::UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.Media")); 119 base::UserMetricsAction("BrowserPlugin.Guest.PermissionRequest.Media"));
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 return browser_plugin::kInvalidPermissionRequestID; 402 return browser_plugin::kInvalidPermissionRequestID;
459 } 403 }
460 404
461 int request_id = ++next_permission_request_id_; 405 int request_id = ++next_permission_request_id_;
462 permission_request_map_[request_id] = request; 406 permission_request_map_[request_id] = request;
463 407
464 BrowserPluginGuestDelegate::PermissionResponseCallback callback = 408 BrowserPluginGuestDelegate::PermissionResponseCallback callback =
465 base::Bind(&BrowserPluginGuest::RespondToPermissionRequest, 409 base::Bind(&BrowserPluginGuest::RespondToPermissionRequest,
466 AsWeakPtr(), 410 AsWeakPtr(),
467 request_id); 411 request_id);
468 // If BrowserPluginGuestDelegate hasn't handled the permission then we simply 412 delegate_->RequestPermission(
469 // perform the default action (which is one of allow or reject) immediately. 413 permission_type, request_info, callback, request->AllowedByDefault());
470 if (!delegate_->RequestPermission(
471 permission_type, request_info, callback, request->AllowedByDefault())) {
472 callback.Run(request->AllowedByDefault(), "");
473 return browser_plugin::kInvalidPermissionRequestID;
474 }
475 414
476 return request_id; 415 return request_id;
477 } 416 }
478 417
479 BrowserPluginGuest* BrowserPluginGuest::CreateNewGuestWindow( 418 BrowserPluginGuest* BrowserPluginGuest::CreateNewGuestWindow(
480 const OpenURLParams& params) { 419 const OpenURLParams& params) {
481 BrowserPluginGuestManager* guest_manager = 420 BrowserPluginGuestManager* guest_manager =
482 GetWebContents()->GetBrowserPluginGuestManager(); 421 GetWebContents()->GetBrowserPluginGuestManager();
483 422
484 // Allocate a new instance ID for the new guest. 423 // Allocate a new instance ID for the new guest.
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>( 990 RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>(
1052 GetWebContents()->GetRenderViewHost()); 991 GetWebContents()->GetRenderViewHost());
1053 guest_rvh->DragSourceSystemDragEnded(); 992 guest_rvh->DragSourceSystemDragEnded();
1054 } 993 }
1055 994
1056 void BrowserPluginGuest::SetDelegate(BrowserPluginGuestDelegate* delegate) { 995 void BrowserPluginGuest::SetDelegate(BrowserPluginGuestDelegate* delegate) {
1057 DCHECK(!delegate_); 996 DCHECK(!delegate_);
1058 delegate_.reset(delegate); 997 delegate_.reset(delegate);
1059 } 998 }
1060 999
1061 void BrowserPluginGuest::AskEmbedderForGeolocationPermission(
1062 int bridge_id,
1063 const GURL& requesting_frame,
1064 bool user_gesture,
1065 const GeolocationCallback& callback) {
1066 base::DictionaryValue request_info;
1067 request_info.Set(browser_plugin::kURL,
1068 base::Value::CreateStringValue(requesting_frame.spec()));
1069
1070 int request_id =
1071 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_GEOLOCATION,
1072 new GeolocationRequest(weak_ptr_factory_.GetWeakPtr(),
1073 callback,
1074 bridge_id,
1075 user_gesture),
1076 request_info);
1077
1078 DCHECK(bridge_id_to_request_id_map_.find(bridge_id) ==
1079 bridge_id_to_request_id_map_.end());
1080 bridge_id_to_request_id_map_[bridge_id] = request_id;
1081 }
1082
1083 int BrowserPluginGuest::RemoveBridgeID(int bridge_id) {
1084 std::map<int, int>::iterator bridge_itr =
1085 bridge_id_to_request_id_map_.find(bridge_id);
1086 if (bridge_itr == bridge_id_to_request_id_map_.end())
1087 return browser_plugin::kInvalidPermissionRequestID;
1088
1089 int request_id = bridge_itr->second;
1090 bridge_id_to_request_id_map_.erase(bridge_itr);
1091 return request_id;
1092 }
1093
1094 void BrowserPluginGuest::CancelGeolocationRequest(int bridge_id) {
1095 int request_id = RemoveBridgeID(bridge_id);
1096 RequestMap::iterator request_itr = permission_request_map_.find(request_id);
1097 if (request_itr == permission_request_map_.end())
1098 return;
1099 permission_request_map_.erase(request_itr);
1100 }
1101
1102 void BrowserPluginGuest::SetGeolocationPermission(GeolocationCallback callback,
1103 int bridge_id,
1104 bool allowed) {
1105 callback.Run(allowed);
1106 RemoveBridgeID(bridge_id);
1107 }
1108
1109 void BrowserPluginGuest::SendQueuedMessages() { 1000 void BrowserPluginGuest::SendQueuedMessages() {
1110 if (!attached()) 1001 if (!attached())
1111 return; 1002 return;
1112 1003
1113 while (!pending_messages_.empty()) { 1004 while (!pending_messages_.empty()) {
1114 IPC::Message* message = pending_messages_.front(); 1005 IPC::Message* message = pending_messages_.front();
1115 pending_messages_.pop(); 1006 pending_messages_.pop();
1116 SendMessageToEmbedder(message); 1007 SendMessageToEmbedder(message);
1117 } 1008 }
1118 } 1009 }
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after
1932 base::Value::CreateStringValue(request_method)); 1823 base::Value::CreateStringValue(request_method));
1933 request_info.Set(browser_plugin::kURL, base::Value::CreateStringValue(url)); 1824 request_info.Set(browser_plugin::kURL, base::Value::CreateStringValue(url));
1934 1825
1935 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_DOWNLOAD, 1826 RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_DOWNLOAD,
1936 new DownloadRequest(weak_ptr_factory_.GetWeakPtr(), 1827 new DownloadRequest(weak_ptr_factory_.GetWeakPtr(),
1937 callback), 1828 callback),
1938 request_info); 1829 request_info);
1939 } 1830 }
1940 1831
1941 } // namespace content 1832 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698