| 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 |