OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/guestview/webview/webview_guest.h" | 5 #include "chrome/browser/guestview/webview/webview_guest.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "chrome/browser/chrome_notification_types.h" | 9 #include "chrome/browser/chrome_notification_types.h" |
10 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 10 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 break; | 72 break; |
73 } | 73 } |
74 NOTREACHED() << "Unknown Termination Status."; | 74 NOTREACHED() << "Unknown Termination Status."; |
75 return "unknown"; | 75 return "unknown"; |
76 } | 76 } |
77 | 77 |
78 static std::string PermissionTypeToString(BrowserPluginPermissionType type) { | 78 static std::string PermissionTypeToString(BrowserPluginPermissionType type) { |
79 switch (type) { | 79 switch (type) { |
80 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: | 80 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: |
81 return webview::kPermissionTypeNewWindow; | 81 return webview::kPermissionTypeNewWindow; |
82 case BROWSER_PLUGIN_PERMISSION_TYPE_JAVASCRIPT_DIALOG: | |
83 return webview::kPermissionTypeDialog; | |
84 case BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN: | 82 case BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN: |
85 NOTREACHED(); | 83 NOTREACHED(); |
86 break; | 84 break; |
87 default: { | 85 default: { |
88 WebViewPermissionType webview = static_cast<WebViewPermissionType>(type); | 86 WebViewPermissionType webview = static_cast<WebViewPermissionType>(type); |
89 switch (webview) { | 87 switch (webview) { |
90 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: | 88 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: |
91 return webview::kPermissionTypeDownload; | 89 return webview::kPermissionTypeDownload; |
92 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: | 90 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: |
93 return webview::kPermissionTypeGeolocation; | 91 return webview::kPermissionTypeGeolocation; |
| 92 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: |
| 93 return webview::kPermissionTypeDialog; |
94 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: | 94 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: |
95 return webview::kPermissionTypeLoadPlugin; | 95 return webview::kPermissionTypeLoadPlugin; |
96 case WEB_VIEW_PERMISSION_TYPE_MEDIA: | 96 case WEB_VIEW_PERMISSION_TYPE_MEDIA: |
97 return webview::kPermissionTypeMedia; | 97 return webview::kPermissionTypeMedia; |
98 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: | 98 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: |
99 return webview::kPermissionTypePointerLock; | 99 return webview::kPermissionTypePointerLock; |
100 } | 100 } |
101 NOTREACHED(); | 101 NOTREACHED(); |
102 } | 102 } |
103 } | 103 } |
(...skipping 28 matching lines...) Expand all Loading... |
132 const std::string& extension_id) | 132 const std::string& extension_id) |
133 : GuestView(guest_web_contents, extension_id), | 133 : GuestView(guest_web_contents, extension_id), |
134 WebContentsObserver(guest_web_contents), | 134 WebContentsObserver(guest_web_contents), |
135 script_executor_(new extensions::ScriptExecutor(guest_web_contents, | 135 script_executor_(new extensions::ScriptExecutor(guest_web_contents, |
136 &script_observers_)), | 136 &script_observers_)), |
137 next_permission_request_id_(0), | 137 next_permission_request_id_(0), |
138 is_overriding_user_agent_(false), | 138 is_overriding_user_agent_(false), |
139 pending_reload_on_attachment_(false), | 139 pending_reload_on_attachment_(false), |
140 main_frame_id_(0), | 140 main_frame_id_(0), |
141 chromevox_injected_(false), | 141 chromevox_injected_(false), |
142 find_helper_(this) { | 142 find_helper_(this), |
| 143 javascript_dialog_helper_(this) { |
143 notification_registrar_.Add( | 144 notification_registrar_.Add( |
144 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, | 145 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
145 content::Source<WebContents>(guest_web_contents)); | 146 content::Source<WebContents>(guest_web_contents)); |
146 | 147 |
147 notification_registrar_.Add( | 148 notification_registrar_.Add( |
148 this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, | 149 this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, |
149 content::Source<WebContents>(guest_web_contents)); | 150 content::Source<WebContents>(guest_web_contents)); |
150 | 151 |
151 #if defined(OS_CHROMEOS) | 152 #if defined(OS_CHROMEOS) |
152 chromeos::AccessibilityManager* accessibility_manager = | 153 chromeos::AccessibilityManager* accessibility_manager = |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 if (allow) { | 191 if (allow) { |
191 // Note that |allow| == true means the embedder explicitly allowed the | 192 // Note that |allow| == true means the embedder explicitly allowed the |
192 // request. For some requests they might still fail. An example of such | 193 // request. For some requests they might still fail. An example of such |
193 // scenario would be: an embedder allows geolocation request but doesn't | 194 // scenario would be: an embedder allows geolocation request but doesn't |
194 // have geolocation access on its own. | 195 // have geolocation access on its own. |
195 switch (info.permission_type) { | 196 switch (info.permission_type) { |
196 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: | 197 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: |
197 content::RecordAction( | 198 content::RecordAction( |
198 UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow")); | 199 UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow")); |
199 break; | 200 break; |
200 case BROWSER_PLUGIN_PERMISSION_TYPE_JAVASCRIPT_DIALOG: | |
201 content::RecordAction( | |
202 UserMetricsAction("BrowserPlugin.PermissionAllow.JSDialog")); | |
203 break; | |
204 case BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN: | 201 case BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN: |
205 break; | 202 break; |
206 default: { | 203 default: { |
207 WebViewPermissionType webview_permission_type = | 204 WebViewPermissionType webview_permission_type = |
208 static_cast<WebViewPermissionType>(info.permission_type); | 205 static_cast<WebViewPermissionType>(info.permission_type); |
209 switch (webview_permission_type) { | 206 switch (webview_permission_type) { |
210 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: | 207 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: |
211 content::RecordAction( | 208 content::RecordAction( |
212 UserMetricsAction("WebView.PermissionAllow.Download")); | 209 UserMetricsAction("WebView.PermissionAllow.Download")); |
213 break; | 210 break; |
214 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: | 211 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: |
215 content::RecordAction( | 212 content::RecordAction( |
216 UserMetricsAction("WebView.PermissionAllow.Geolocation")); | 213 UserMetricsAction("WebView.PermissionAllow.Geolocation")); |
217 break; | 214 break; |
| 215 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: |
| 216 content::RecordAction( |
| 217 UserMetricsAction("WebView.PermissionAllow.JSDialog")); |
| 218 break; |
218 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: | 219 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: |
219 content::RecordAction( | 220 content::RecordAction( |
220 UserMetricsAction("WebView.Guest.PermissionAllow.PluginLoad")); | 221 UserMetricsAction("WebView.Guest.PermissionAllow.PluginLoad")); |
221 case WEB_VIEW_PERMISSION_TYPE_MEDIA: | 222 case WEB_VIEW_PERMISSION_TYPE_MEDIA: |
222 content::RecordAction( | 223 content::RecordAction( |
223 UserMetricsAction("WebView.PermissionAllow.Media")); | 224 UserMetricsAction("WebView.PermissionAllow.Media")); |
224 break; | 225 break; |
225 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: | 226 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: |
226 content::RecordAction( | 227 content::RecordAction( |
227 UserMetricsAction("WebView.PermissionAllow.PointerLock")); | 228 UserMetricsAction("WebView.PermissionAllow.PointerLock")); |
228 break; | 229 break; |
229 default: | 230 default: |
230 break; | 231 break; |
231 } | 232 } |
232 } | 233 } |
233 } | 234 } |
234 } else { | 235 } else { |
235 switch (info.permission_type) { | 236 switch (info.permission_type) { |
236 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: | 237 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: |
237 content::RecordAction( | 238 content::RecordAction( |
238 UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow")); | 239 UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow")); |
239 break; | 240 break; |
240 case BROWSER_PLUGIN_PERMISSION_TYPE_JAVASCRIPT_DIALOG: | |
241 content::RecordAction( | |
242 UserMetricsAction("BrowserPlugin.PermissionDeny.JSDialog")); | |
243 break; | |
244 case BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN: | 241 case BROWSER_PLUGIN_PERMISSION_TYPE_UNKNOWN: |
245 break; | 242 break; |
246 default: { | 243 default: { |
247 WebViewPermissionType webview_permission_type = | 244 WebViewPermissionType webview_permission_type = |
248 static_cast<WebViewPermissionType>(info.permission_type); | 245 static_cast<WebViewPermissionType>(info.permission_type); |
249 switch (webview_permission_type) { | 246 switch (webview_permission_type) { |
250 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: | 247 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: |
251 content::RecordAction( | 248 content::RecordAction( |
252 UserMetricsAction("WebView.PermissionDeny.Download")); | 249 UserMetricsAction("WebView.PermissionDeny.Download")); |
253 break; | 250 break; |
254 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: | 251 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: |
255 content::RecordAction( | 252 content::RecordAction( |
256 UserMetricsAction("WebView.PermissionDeny.Geolocation")); | 253 UserMetricsAction("WebView.PermissionDeny.Geolocation")); |
257 break; | 254 break; |
| 255 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: |
| 256 content::RecordAction( |
| 257 UserMetricsAction("WebView.PermissionDeny.JSDialog")); |
| 258 break; |
258 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: | 259 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: |
259 content::RecordAction( | 260 content::RecordAction( |
260 UserMetricsAction("WebView.Guest.PermissionDeny.PluginLoad")); | 261 UserMetricsAction("WebView.Guest.PermissionDeny.PluginLoad")); |
261 case WEB_VIEW_PERMISSION_TYPE_MEDIA: | 262 case WEB_VIEW_PERMISSION_TYPE_MEDIA: |
262 content::RecordAction( | 263 content::RecordAction( |
263 UserMetricsAction("WebView.PermissionDeny.Media")); | 264 UserMetricsAction("WebView.PermissionDeny.Media")); |
264 break; | 265 break; |
265 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: | 266 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: |
266 content::RecordAction( | 267 content::RecordAction( |
267 UserMetricsAction("WebView.PermissionDeny.PointerLock")); | 268 UserMetricsAction("WebView.PermissionDeny.PointerLock")); |
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 RequestPermission( | 920 RequestPermission( |
920 static_cast<BrowserPluginPermissionType>( | 921 static_cast<BrowserPluginPermissionType>( |
921 WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK), | 922 WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK), |
922 request_info, | 923 request_info, |
923 base::Bind(&WebViewGuest::OnWebViewPointerLockPermissionResponse, | 924 base::Bind(&WebViewGuest::OnWebViewPointerLockPermissionResponse, |
924 base::Unretained(this), | 925 base::Unretained(this), |
925 callback), | 926 callback), |
926 false /* allowed_by_default */); | 927 false /* allowed_by_default */); |
927 } | 928 } |
928 | 929 |
| 930 content::JavaScriptDialogManager* |
| 931 WebViewGuest::GetJavaScriptDialogManager() { |
| 932 return &javascript_dialog_helper_; |
| 933 } |
| 934 |
929 #if defined(OS_CHROMEOS) | 935 #if defined(OS_CHROMEOS) |
930 void WebViewGuest::OnAccessibilityStatusChanged( | 936 void WebViewGuest::OnAccessibilityStatusChanged( |
931 const chromeos::AccessibilityStatusEventDetails& details) { | 937 const chromeos::AccessibilityStatusEventDetails& details) { |
932 if (details.notification_type == chromeos::ACCESSIBILITY_MANAGER_SHUTDOWN) { | 938 if (details.notification_type == chromeos::ACCESSIBILITY_MANAGER_SHUTDOWN) { |
933 accessibility_subscription_.reset(); | 939 accessibility_subscription_.reset(); |
934 } else if (details.notification_type == | 940 } else if (details.notification_type == |
935 chromeos::ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) { | 941 chromeos::ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK) { |
936 if (details.enabled) | 942 if (details.enabled) |
937 InjectChromeVoxIfNeeded(guest_web_contents()->GetRenderViewHost()); | 943 InjectChromeVoxIfNeeded(guest_web_contents()->GetRenderViewHost()); |
938 else | 944 else |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
985 allowed_by_default, | 991 allowed_by_default, |
986 std::string())); | 992 std::string())); |
987 return webview::kInvalidPermissionRequestID; | 993 return webview::kInvalidPermissionRequestID; |
988 } | 994 } |
989 | 995 |
990 int request_id = next_permission_request_id_++; | 996 int request_id = next_permission_request_id_++; |
991 pending_permission_requests_[request_id] = | 997 pending_permission_requests_[request_id] = |
992 PermissionResponseInfo(callback, permission_type, allowed_by_default); | 998 PermissionResponseInfo(callback, permission_type, allowed_by_default); |
993 scoped_ptr<base::DictionaryValue> args(request_info.DeepCopy()); | 999 scoped_ptr<base::DictionaryValue> args(request_info.DeepCopy()); |
994 args->SetInteger(webview::kRequestId, request_id); | 1000 args->SetInteger(webview::kRequestId, request_id); |
995 switch (permission_type) { | 1001 switch (static_cast<int>(permission_type)) { |
996 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: { | 1002 case BROWSER_PLUGIN_PERMISSION_TYPE_NEW_WINDOW: { |
997 DispatchEvent(new GuestView::Event(webview::kEventNewWindow, | 1003 DispatchEvent(new GuestView::Event(webview::kEventNewWindow, |
998 args.Pass())); | 1004 args.Pass())); |
999 break; | 1005 break; |
1000 } | 1006 } |
1001 case BROWSER_PLUGIN_PERMISSION_TYPE_JAVASCRIPT_DIALOG: { | 1007 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: { |
1002 DispatchEvent(new GuestView::Event(webview::kEventDialog, | 1008 DispatchEvent(new GuestView::Event(webview::kEventDialog, |
1003 args.Pass())); | 1009 args.Pass())); |
1004 break; | 1010 break; |
1005 } | 1011 } |
1006 default: { | 1012 default: { |
1007 args->SetString(webview::kPermission, | 1013 args->SetString(webview::kPermission, |
1008 PermissionTypeToString(permission_type)); | 1014 PermissionTypeToString(permission_type)); |
1009 DispatchEvent(new GuestView::Event(webview::kEventPermissionRequest, | 1015 DispatchEvent(new GuestView::Event(webview::kEventPermissionRequest, |
1010 args.Pass())); | 1016 args.Pass())); |
1011 break; | 1017 break; |
(...skipping 11 matching lines...) Expand all Loading... |
1023 const PermissionResponseCallback& callback, | 1029 const PermissionResponseCallback& callback, |
1024 BrowserPluginPermissionType permission_type, | 1030 BrowserPluginPermissionType permission_type, |
1025 bool allowed_by_default) | 1031 bool allowed_by_default) |
1026 : callback(callback), | 1032 : callback(callback), |
1027 permission_type(permission_type), | 1033 permission_type(permission_type), |
1028 allowed_by_default(allowed_by_default) { | 1034 allowed_by_default(allowed_by_default) { |
1029 } | 1035 } |
1030 | 1036 |
1031 WebViewGuest::PermissionResponseInfo::~PermissionResponseInfo() { | 1037 WebViewGuest::PermissionResponseInfo::~PermissionResponseInfo() { |
1032 } | 1038 } |
OLD | NEW |