Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/guest_view/web_view/web_view_guest.h" | 5 #include "chrome/browser/guest_view/web_view/web_view_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 "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| 11 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | |
| 12 #include "chrome/browser/extensions/api/web_request/web_request_api.h" | 11 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| 13 #include "chrome/browser/extensions/api/webview/webview_api.h" | 12 #include "chrome/browser/extensions/api/webview/webview_api.h" |
| 14 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" | 13 #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" |
| 15 #include "chrome/browser/extensions/extension_renderer_state.h" | 14 #include "chrome/browser/extensions/extension_renderer_state.h" |
| 16 #include "chrome/browser/extensions/menu_manager.h" | 15 #include "chrome/browser/extensions/menu_manager.h" |
| 17 #include "chrome/browser/extensions/script_executor.h" | 16 #include "chrome/browser/extensions/script_executor.h" |
| 18 #include "chrome/browser/favicon/favicon_tab_helper.h" | 17 #include "chrome/browser/favicon/favicon_tab_helper.h" |
| 19 #include "chrome/browser/geolocation/geolocation_permission_context.h" | |
| 20 #include "chrome/browser/geolocation/geolocation_permission_context_factory.h" | |
| 21 #include "chrome/browser/guest_view/guest_view_constants.h" | 18 #include "chrome/browser/guest_view/guest_view_constants.h" |
| 22 #include "chrome/browser/guest_view/guest_view_manager.h" | 19 #include "chrome/browser/guest_view/guest_view_manager.h" |
| 23 #include "chrome/browser/guest_view/web_view/web_view_constants.h" | 20 #include "chrome/browser/guest_view/web_view/web_view_constants.h" |
| 21 #include "chrome/browser/guest_view/web_view/web_view_permission_helper.h" | |
| 24 #include "chrome/browser/guest_view/web_view/web_view_permission_types.h" | 22 #include "chrome/browser/guest_view/web_view/web_view_permission_types.h" |
| 25 #include "chrome/browser/renderer_context_menu/context_menu_delegate.h" | 23 #include "chrome/browser/renderer_context_menu/context_menu_delegate.h" |
| 26 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" | 24 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" |
| 27 #include "chrome/browser/ui/pdf/pdf_tab_helper.h" | 25 #include "chrome/browser/ui/pdf/pdf_tab_helper.h" |
| 28 #include "chrome/common/chrome_version_info.h" | 26 #include "chrome/common/chrome_version_info.h" |
| 29 #include "chrome/common/render_messages.h" | 27 #include "chrome/common/render_messages.h" |
| 30 #include "content/public/browser/browser_thread.h" | 28 #include "content/public/browser/browser_thread.h" |
| 31 #include "content/public/browser/child_process_security_policy.h" | 29 #include "content/public/browser/child_process_security_policy.h" |
| 32 #include "content/public/browser/host_zoom_map.h" | 30 #include "content/public/browser/host_zoom_map.h" |
| 33 #include "content/public/browser/native_web_keyboard_event.h" | 31 #include "content/public/browser/native_web_keyboard_event.h" |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 58 | 56 |
| 59 #if defined(ENABLE_PRINTING) | 57 #if defined(ENABLE_PRINTING) |
| 60 #if defined(ENABLE_FULL_PRINTING) | 58 #if defined(ENABLE_FULL_PRINTING) |
| 61 #include "chrome/browser/printing/print_preview_message_handler.h" | 59 #include "chrome/browser/printing/print_preview_message_handler.h" |
| 62 #include "chrome/browser/printing/print_view_manager.h" | 60 #include "chrome/browser/printing/print_view_manager.h" |
| 63 #else | 61 #else |
| 64 #include "chrome/browser/printing/print_view_manager_basic.h" | 62 #include "chrome/browser/printing/print_view_manager_basic.h" |
| 65 #endif // defined(ENABLE_FULL_PRINTING) | 63 #endif // defined(ENABLE_FULL_PRINTING) |
| 66 #endif // defined(ENABLE_PRINTING) | 64 #endif // defined(ENABLE_PRINTING) |
| 67 | 65 |
| 68 #if defined(ENABLE_PLUGINS) | |
| 69 #include "chrome/browser/guest_view/web_view/plugin_permission_helper.h" | |
| 70 #endif | |
| 71 | |
| 72 #if defined(OS_CHROMEOS) | 66 #if defined(OS_CHROMEOS) |
| 73 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" | 67 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" |
| 74 #endif | 68 #endif |
| 75 | 69 |
| 76 using base::UserMetricsAction; | 70 using base::UserMetricsAction; |
| 77 using content::RenderFrameHost; | 71 using content::RenderFrameHost; |
| 78 using content::WebContents; | 72 using content::WebContents; |
| 79 | 73 |
| 80 namespace { | 74 namespace { |
| 81 | 75 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 116 case base::TERMINATION_STATUS_OOM_PROTECTED: | 110 case base::TERMINATION_STATUS_OOM_PROTECTED: |
| 117 #endif | 111 #endif |
| 118 return "crashed"; | 112 return "crashed"; |
| 119 case base::TERMINATION_STATUS_MAX_ENUM: | 113 case base::TERMINATION_STATUS_MAX_ENUM: |
| 120 break; | 114 break; |
| 121 } | 115 } |
| 122 NOTREACHED() << "Unknown Termination Status."; | 116 NOTREACHED() << "Unknown Termination Status."; |
| 123 return "unknown"; | 117 return "unknown"; |
| 124 } | 118 } |
| 125 | 119 |
| 126 static std::string PermissionTypeToString(WebViewPermissionType type) { | |
| 127 switch (type) { | |
| 128 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: | |
| 129 return webview::kPermissionTypeDownload; | |
| 130 case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: | |
| 131 return webview::kPermissionTypeFileSystem; | |
| 132 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: | |
| 133 return webview::kPermissionTypeGeolocation; | |
| 134 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: | |
| 135 return webview::kPermissionTypeDialog; | |
| 136 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: | |
| 137 return webview::kPermissionTypeLoadPlugin; | |
| 138 case WEB_VIEW_PERMISSION_TYPE_MEDIA: | |
| 139 return webview::kPermissionTypeMedia; | |
| 140 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: | |
| 141 return webview::kPermissionTypeNewWindow; | |
| 142 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: | |
| 143 return webview::kPermissionTypePointerLock; | |
| 144 default: | |
| 145 NOTREACHED(); | |
| 146 return std::string(); | |
| 147 } | |
| 148 } | |
| 149 | |
| 150 std::string GetStoragePartitionIdFromSiteURL(const GURL& site_url) { | 120 std::string GetStoragePartitionIdFromSiteURL(const GURL& site_url) { |
| 151 const std::string& partition_id = site_url.query(); | 121 const std::string& partition_id = site_url.query(); |
| 152 bool persist_storage = site_url.path().find("persist") != std::string::npos; | 122 bool persist_storage = site_url.path().find("persist") != std::string::npos; |
| 153 return (persist_storage ? webview::kPersistPrefix : "") + partition_id; | 123 return (persist_storage ? webview::kPersistPrefix : "") + partition_id; |
| 154 } | 124 } |
| 155 | 125 |
| 156 void RemoveWebViewEventListenersOnIOThread( | 126 void RemoveWebViewEventListenersOnIOThread( |
| 157 void* profile, | 127 void* profile, |
| 158 const std::string& extension_id, | 128 const std::string& extension_id, |
| 159 int embedder_process_id, | 129 int embedder_process_id, |
| 160 int view_instance_id) { | 130 int view_instance_id) { |
| 161 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 131 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
| 162 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners( | 132 ExtensionWebRequestEventRouter::GetInstance()->RemoveWebViewEventListeners( |
| 163 profile, | 133 profile, |
| 164 extension_id, | 134 extension_id, |
| 165 embedder_process_id, | 135 embedder_process_id, |
| 166 view_instance_id); | 136 view_instance_id); |
| 167 } | 137 } |
| 168 | 138 |
| 169 void AttachWebViewHelpers(WebContents* contents) { | 139 void AttachWebViewHelpers(WebContents* contents) { |
| 170 FaviconTabHelper::CreateForWebContents(contents); | 140 FaviconTabHelper::CreateForWebContents(contents); |
| 171 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( | 141 extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( |
| 172 contents); | 142 contents); |
| 173 #if defined(ENABLE_PLUGINS) | 143 WebViewPermissionHelper::CreateForWebContents(contents); |
|
Fady Samuel
2014/06/20 22:54:33
Let's not manage this here.
| |
| 174 PluginPermissionHelper::CreateForWebContents(contents); | |
| 175 #endif | |
| 176 #if defined(ENABLE_PRINTING) | 144 #if defined(ENABLE_PRINTING) |
| 177 #if defined(ENABLE_FULL_PRINTING) | 145 #if defined(ENABLE_FULL_PRINTING) |
| 178 printing::PrintViewManager::CreateForWebContents(contents); | 146 printing::PrintViewManager::CreateForWebContents(contents); |
| 179 printing::PrintPreviewMessageHandler::CreateForWebContents(contents); | 147 printing::PrintPreviewMessageHandler::CreateForWebContents(contents); |
| 180 #else | 148 #else |
| 181 printing::PrintViewManagerBasic::CreateForWebContents(contents); | 149 printing::PrintViewManagerBasic::CreateForWebContents(contents); |
| 182 #endif // defined(ENABLE_FULL_PRINTING) | 150 #endif // defined(ENABLE_FULL_PRINTING) |
| 183 #endif // defined(ENABLE_PRINTING) | 151 #endif // defined(ENABLE_PRINTING) |
| 184 PDFTabHelper::CreateForWebContents(contents); | 152 PDFTabHelper::CreateForWebContents(contents); |
| 185 } | 153 } |
| 186 | 154 |
| 187 } // namespace | 155 } // namespace |
| 188 | 156 |
| 189 WebViewGuest::WebViewGuest(int guest_instance_id, | 157 WebViewGuest::WebViewGuest(int guest_instance_id, |
| 190 WebContents* guest_web_contents, | 158 WebContents* guest_web_contents, |
| 191 const std::string& embedder_extension_id) | 159 const std::string& embedder_extension_id) |
| 192 : GuestView<WebViewGuest>(guest_instance_id, | 160 : GuestView<WebViewGuest>(guest_instance_id, |
| 193 guest_web_contents, | 161 guest_web_contents, |
| 194 embedder_extension_id), | 162 embedder_extension_id), |
| 195 script_executor_(new extensions::ScriptExecutor(guest_web_contents, | 163 script_executor_(new extensions::ScriptExecutor(guest_web_contents, |
| 196 &script_observers_)), | 164 &script_observers_)), |
| 197 pending_context_menu_request_id_(0), | 165 pending_context_menu_request_id_(0), |
| 198 next_permission_request_id_(0), | |
| 199 is_overriding_user_agent_(false), | 166 is_overriding_user_agent_(false), |
| 200 pending_reload_on_attachment_(false), | 167 pending_reload_on_attachment_(false), |
| 201 main_frame_id_(0), | 168 main_frame_id_(0), |
| 202 chromevox_injected_(false), | 169 chromevox_injected_(false), |
| 203 find_helper_(this), | 170 find_helper_(this), |
| 204 javascript_dialog_helper_(this) { | 171 javascript_dialog_helper_(this) { |
| 205 notification_registrar_.Add( | 172 notification_registrar_.Add( |
| 206 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, | 173 this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
| 207 content::Source<WebContents>(guest_web_contents)); | 174 content::Source<WebContents>(guest_web_contents)); |
| 208 | 175 |
| 209 notification_registrar_.Add( | 176 notification_registrar_.Add( |
| 210 this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, | 177 this, content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, |
| 211 content::Source<WebContents>(guest_web_contents)); | 178 content::Source<WebContents>(guest_web_contents)); |
| 212 | 179 |
| 213 #if defined(OS_CHROMEOS) | 180 #if defined(OS_CHROMEOS) |
| 214 chromeos::AccessibilityManager* accessibility_manager = | 181 chromeos::AccessibilityManager* accessibility_manager = |
| 215 chromeos::AccessibilityManager::Get(); | 182 chromeos::AccessibilityManager::Get(); |
| 216 CHECK(accessibility_manager); | 183 CHECK(accessibility_manager); |
| 217 accessibility_subscription_ = accessibility_manager->RegisterCallback( | 184 accessibility_subscription_ = accessibility_manager->RegisterCallback( |
| 218 base::Bind(&WebViewGuest::OnAccessibilityStatusChanged, | 185 base::Bind(&WebViewGuest::OnAccessibilityStatusChanged, |
| 219 base::Unretained(this))); | 186 base::Unretained(this))); |
| 220 #endif | 187 #endif |
| 221 | 188 |
| 222 AttachWebViewHelpers(guest_web_contents); | 189 AttachWebViewHelpers(guest_web_contents); |
| 190 web_view_permission_helper_ = | |
| 191 WebViewPermissionHelper::FromWebContents(guest_web_contents); | |
| 223 } | 192 } |
| 224 | 193 |
| 225 // static | 194 // static |
| 226 bool WebViewGuest::GetGuestPartitionConfigForSite( | 195 bool WebViewGuest::GetGuestPartitionConfigForSite( |
| 227 const GURL& site, | 196 const GURL& site, |
| 228 std::string* partition_domain, | 197 std::string* partition_domain, |
| 229 std::string* partition_name, | 198 std::string* partition_name, |
| 230 bool* in_memory) { | 199 bool* in_memory) { |
| 231 if (!site.SchemeIs(content::kGuestScheme)) | 200 if (!site.SchemeIs(content::kGuestScheme)) |
| 232 return false; | 201 return false; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 282 return; | 251 return; |
| 283 } | 252 } |
| 284 *persist_storage = true; | 253 *persist_storage = true; |
| 285 } else { | 254 } else { |
| 286 *storage_partition_id = partition_str; | 255 *storage_partition_id = partition_str; |
| 287 *persist_storage = false; | 256 *persist_storage = false; |
| 288 } | 257 } |
| 289 } | 258 } |
| 290 | 259 |
| 291 // static | 260 // static |
| 292 void WebViewGuest::RecordUserInitiatedUMA(const PermissionResponseInfo& info, | |
| 293 bool allow) { | |
| 294 if (allow) { | |
| 295 // Note that |allow| == true means the embedder explicitly allowed the | |
| 296 // request. For some requests they might still fail. An example of such | |
| 297 // scenario would be: an embedder allows geolocation request but doesn't | |
| 298 // have geolocation access on its own. | |
| 299 switch (info.permission_type) { | |
| 300 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: | |
| 301 content::RecordAction( | |
| 302 UserMetricsAction("WebView.PermissionAllow.Download")); | |
| 303 break; | |
| 304 case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: | |
| 305 content::RecordAction( | |
| 306 UserMetricsAction("WebView.PermissionAllow.FileSystem")); | |
| 307 break; | |
| 308 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: | |
| 309 content::RecordAction( | |
| 310 UserMetricsAction("WebView.PermissionAllow.Geolocation")); | |
| 311 break; | |
| 312 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: | |
| 313 content::RecordAction( | |
| 314 UserMetricsAction("WebView.PermissionAllow.JSDialog")); | |
| 315 break; | |
| 316 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: | |
| 317 content::RecordAction( | |
| 318 UserMetricsAction("WebView.Guest.PermissionAllow.PluginLoad")); | |
| 319 case WEB_VIEW_PERMISSION_TYPE_MEDIA: | |
| 320 content::RecordAction( | |
| 321 UserMetricsAction("WebView.PermissionAllow.Media")); | |
| 322 break; | |
| 323 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: | |
| 324 content::RecordAction( | |
| 325 UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow")); | |
| 326 break; | |
| 327 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: | |
| 328 content::RecordAction( | |
| 329 UserMetricsAction("WebView.PermissionAllow.PointerLock")); | |
| 330 break; | |
| 331 default: | |
| 332 break; | |
| 333 } | |
| 334 } else { | |
| 335 switch (info.permission_type) { | |
| 336 case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD: | |
| 337 content::RecordAction( | |
| 338 UserMetricsAction("WebView.PermissionDeny.Download")); | |
| 339 break; | |
| 340 case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM: | |
| 341 content::RecordAction( | |
| 342 UserMetricsAction("WebView.PermissionDeny.FileSystem")); | |
| 343 break; | |
| 344 case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION: | |
| 345 content::RecordAction( | |
| 346 UserMetricsAction("WebView.PermissionDeny.Geolocation")); | |
| 347 break; | |
| 348 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: | |
| 349 content::RecordAction( | |
| 350 UserMetricsAction("WebView.PermissionDeny.JSDialog")); | |
| 351 break; | |
| 352 case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN: | |
| 353 content::RecordAction( | |
| 354 UserMetricsAction("WebView.Guest.PermissionDeny.PluginLoad")); | |
| 355 break; | |
| 356 case WEB_VIEW_PERMISSION_TYPE_MEDIA: | |
| 357 content::RecordAction( | |
| 358 UserMetricsAction("WebView.PermissionDeny.Media")); | |
| 359 break; | |
| 360 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: | |
| 361 content::RecordAction( | |
| 362 UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow")); | |
| 363 break; | |
| 364 case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK: | |
| 365 content::RecordAction( | |
| 366 UserMetricsAction("WebView.PermissionDeny.PointerLock")); | |
| 367 break; | |
| 368 default: | |
| 369 break; | |
| 370 } | |
| 371 } | |
| 372 } | |
| 373 | |
| 374 // static | |
| 375 scoped_ptr<base::ListValue> WebViewGuest::MenuModelToValue( | 261 scoped_ptr<base::ListValue> WebViewGuest::MenuModelToValue( |
| 376 const ui::SimpleMenuModel& menu_model) { | 262 const ui::SimpleMenuModel& menu_model) { |
| 377 scoped_ptr<base::ListValue> items(new base::ListValue()); | 263 scoped_ptr<base::ListValue> items(new base::ListValue()); |
| 378 for (int i = 0; i < menu_model.GetItemCount(); ++i) { | 264 for (int i = 0; i < menu_model.GetItemCount(); ++i) { |
| 379 base::DictionaryValue* item_value = new base::DictionaryValue(); | 265 base::DictionaryValue* item_value = new base::DictionaryValue(); |
| 380 // TODO(lazyboy): We need to expose some kind of enum equivalent of | 266 // TODO(lazyboy): We need to expose some kind of enum equivalent of |
| 381 // |command_id| instead of plain integers. | 267 // |command_id| instead of plain integers. |
| 382 item_value->SetInteger(webview::kMenuItemCommandId, | 268 item_value->SetInteger(webview::kMenuItemCommandId, |
| 383 menu_model.GetCommandIdAt(i)); | 269 menu_model.GetCommandIdAt(i)); |
| 384 item_value->SetString(webview::kMenuItemLabel, menu_model.GetLabelAt(i)); | 270 item_value->SetString(webview::kMenuItemLabel, menu_model.GetLabelAt(i)); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 688 guest_web_contents()->GetController().GoToOffset(relative_index); | 574 guest_web_contents()->GetController().GoToOffset(relative_index); |
| 689 } | 575 } |
| 690 | 576 |
| 691 void WebViewGuest::Reload() { | 577 void WebViewGuest::Reload() { |
| 692 // TODO(fsamuel): Don't check for repost because we don't want to show | 578 // TODO(fsamuel): Don't check for repost because we don't want to show |
| 693 // Chromium's repost warning. We might want to implement a separate API | 579 // Chromium's repost warning. We might want to implement a separate API |
| 694 // for registering a callback if a repost is about to happen. | 580 // for registering a callback if a repost is about to happen. |
| 695 guest_web_contents()->GetController().Reload(false); | 581 guest_web_contents()->GetController().Reload(false); |
| 696 } | 582 } |
| 697 | 583 |
| 698 void WebViewGuest::RequestFileSystemPermission( | 584 WebViewPermissionHelper::SetPermissionResult WebViewGuest::SetPermission( |
| 699 const GURL& url, | 585 int request_id, |
| 700 bool allowed_by_default, | 586 WebViewPermissionHelper::PermissionResponseAction action, |
| 701 const base::Callback<void(bool)>& callback) { | |
| 702 base::DictionaryValue request_info; | |
| 703 request_info.Set(guestview::kUrl, base::Value::CreateStringValue(url.spec())); | |
| 704 RequestPermission( | |
| 705 WEB_VIEW_PERMISSION_TYPE_FILESYSTEM, | |
| 706 request_info, | |
| 707 base::Bind(&WebViewGuest::OnWebViewFileSystemPermissionResponse, | |
| 708 base::Unretained(this), | |
| 709 callback), | |
| 710 allowed_by_default); | |
| 711 } | |
| 712 | |
| 713 void WebViewGuest::OnWebViewFileSystemPermissionResponse( | |
| 714 const base::Callback<void(bool)>& callback, | |
| 715 bool allow, | |
| 716 const std::string& user_input) { | 587 const std::string& user_input) { |
| 717 callback.Run(allow && attached()); | 588 return web_view_permission_helper_->SetPermission(request_id, |
| 718 } | 589 action, |
| 719 | 590 user_input); |
| 720 void WebViewGuest::RequestGeolocationPermission( | |
| 721 int bridge_id, | |
| 722 const GURL& requesting_frame, | |
| 723 bool user_gesture, | |
| 724 const base::Callback<void(bool)>& callback) { | |
| 725 base::DictionaryValue request_info; | |
| 726 request_info.Set(guestview::kUrl, | |
| 727 base::Value::CreateStringValue(requesting_frame.spec())); | |
| 728 request_info.Set(guestview::kUserGesture, | |
| 729 base::Value::CreateBooleanValue(user_gesture)); | |
| 730 | |
| 731 // It is safe to hold an unretained pointer to WebViewGuest because this | |
| 732 // callback is called from WebViewGuest::SetPermission. | |
| 733 const PermissionResponseCallback permission_callback = | |
| 734 base::Bind(&WebViewGuest::OnWebViewGeolocationPermissionResponse, | |
| 735 base::Unretained(this), | |
| 736 bridge_id, | |
| 737 user_gesture, | |
| 738 callback); | |
| 739 int request_id = RequestPermission( | |
| 740 WEB_VIEW_PERMISSION_TYPE_GEOLOCATION, | |
| 741 request_info, | |
| 742 permission_callback, | |
| 743 false /* allowed_by_default */); | |
| 744 bridge_id_to_request_id_map_[bridge_id] = request_id; | |
| 745 } | |
| 746 | |
| 747 void WebViewGuest::OnWebViewGeolocationPermissionResponse( | |
| 748 int bridge_id, | |
| 749 bool user_gesture, | |
| 750 const base::Callback<void(bool)>& callback, | |
| 751 bool allow, | |
| 752 const std::string& user_input) { | |
| 753 // The <webview> embedder has allowed the permission. We now need to make sure | |
| 754 // that the embedder has geolocation permission. | |
| 755 RemoveBridgeID(bridge_id); | |
| 756 | |
| 757 if (!allow || !attached()) { | |
| 758 callback.Run(false); | |
| 759 return; | |
| 760 } | |
| 761 | |
| 762 Profile* profile = Profile::FromBrowserContext(browser_context()); | |
| 763 GeolocationPermissionContextFactory::GetForProfile(profile)-> | |
| 764 RequestGeolocationPermission( | |
| 765 embedder_web_contents(), | |
| 766 // The geolocation permission request here is not initiated | |
| 767 // through WebGeolocationPermissionRequest. We are only interested | |
| 768 // in the fact whether the embedder/app has geolocation | |
| 769 // permission. Therefore we use an invalid |bridge_id|. | |
| 770 -1, | |
| 771 embedder_web_contents()->GetLastCommittedURL(), | |
| 772 user_gesture, | |
| 773 callback, | |
| 774 NULL); | |
| 775 } | |
| 776 | |
| 777 void WebViewGuest::CancelGeolocationPermissionRequest(int bridge_id) { | |
| 778 int request_id = RemoveBridgeID(bridge_id); | |
| 779 RequestMap::iterator request_itr = | |
| 780 pending_permission_requests_.find(request_id); | |
| 781 | |
| 782 if (request_itr == pending_permission_requests_.end()) | |
| 783 return; | |
| 784 | |
| 785 pending_permission_requests_.erase(request_itr); | |
| 786 } | |
| 787 | |
| 788 void WebViewGuest::OnWebViewMediaPermissionResponse( | |
| 789 const content::MediaStreamRequest& request, | |
| 790 const content::MediaResponseCallback& callback, | |
| 791 bool allow, | |
| 792 const std::string& user_input) { | |
| 793 if (!allow || !attached()) { | |
| 794 // Deny the request. | |
| 795 callback.Run(content::MediaStreamDevices(), | |
| 796 content::MEDIA_DEVICE_INVALID_STATE, | |
| 797 scoped_ptr<content::MediaStreamUI>()); | |
| 798 return; | |
| 799 } | |
| 800 if (!embedder_web_contents()->GetDelegate()) | |
| 801 return; | |
| 802 | |
| 803 embedder_web_contents()->GetDelegate()-> | |
| 804 RequestMediaAccessPermission(embedder_web_contents(), request, callback); | |
| 805 } | |
| 806 | |
| 807 void WebViewGuest::OnWebViewDownloadPermissionResponse( | |
| 808 const base::Callback<void(bool)>& callback, | |
| 809 bool allow, | |
| 810 const std::string& user_input) { | |
| 811 callback.Run(allow && attached()); | |
| 812 } | |
| 813 | |
| 814 void WebViewGuest::OnWebViewPointerLockPermissionResponse( | |
| 815 const base::Callback<void(bool)>& callback, | |
| 816 bool allow, | |
| 817 const std::string& user_input) { | |
| 818 callback.Run(allow && attached()); | |
| 819 } | |
| 820 | |
| 821 WebViewGuest::SetPermissionResult WebViewGuest::SetPermission( | |
| 822 int request_id, | |
| 823 PermissionResponseAction action, | |
| 824 const std::string& user_input) { | |
| 825 RequestMap::iterator request_itr = | |
| 826 pending_permission_requests_.find(request_id); | |
| 827 | |
| 828 if (request_itr == pending_permission_requests_.end()) | |
| 829 return SET_PERMISSION_INVALID; | |
| 830 | |
| 831 const PermissionResponseInfo& info = request_itr->second; | |
| 832 bool allow = (action == ALLOW) || | |
| 833 ((action == DEFAULT) && info.allowed_by_default); | |
| 834 | |
| 835 info.callback.Run(allow, user_input); | |
| 836 | |
| 837 // Only record user initiated (i.e. non-default) actions. | |
| 838 if (action != DEFAULT) | |
| 839 RecordUserInitiatedUMA(info, allow); | |
| 840 | |
| 841 pending_permission_requests_.erase(request_itr); | |
| 842 | |
| 843 return allow ? SET_PERMISSION_ALLOWED : SET_PERMISSION_DENIED; | |
| 844 } | 591 } |
| 845 | 592 |
| 846 void WebViewGuest::SetUserAgentOverride( | 593 void WebViewGuest::SetUserAgentOverride( |
| 847 const std::string& user_agent_override) { | 594 const std::string& user_agent_override) { |
| 848 is_overriding_user_agent_ = !user_agent_override.empty(); | 595 is_overriding_user_agent_ = !user_agent_override.empty(); |
| 849 if (is_overriding_user_agent_) { | 596 if (is_overriding_user_agent_) { |
| 850 content::RecordAction(UserMetricsAction("WebView.Guest.OverrideUA")); | 597 content::RecordAction(UserMetricsAction("WebView.Guest.OverrideUA")); |
| 851 } | 598 } |
| 852 guest_web_contents()->SetUserAgentOverride(user_agent_override); | 599 guest_web_contents()->SetUserAgentOverride(user_agent_override); |
| 853 } | 600 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 886 callback); | 633 callback); |
| 887 return true; | 634 return true; |
| 888 } | 635 } |
| 889 | 636 |
| 890 // static | 637 // static |
| 891 void WebViewGuest::FileSystemAccessedAsync(int render_process_id, | 638 void WebViewGuest::FileSystemAccessedAsync(int render_process_id, |
| 892 int render_frame_id, | 639 int render_frame_id, |
| 893 int request_id, | 640 int request_id, |
| 894 const GURL& url, | 641 const GURL& url, |
| 895 bool blocked_by_policy) { | 642 bool blocked_by_policy) { |
| 896 WebViewGuest* guest = | 643 WebViewPermissionHelper* web_view_permission_helper = |
| 897 WebViewGuest::FromFrameID(render_process_id, render_frame_id); | 644 WebViewPermissionHelper::FromFrameID(render_process_id, render_frame_id); |
| 898 DCHECK(guest); | 645 DCHECK(web_view_permission_helper); |
| 899 guest->RequestFileSystemPermission( | 646 web_view_permission_helper->FileSystemAccessedAsync(render_process_id, |
| 900 url, | 647 render_frame_id, |
| 901 !blocked_by_policy, | 648 request_id, |
| 902 base::Bind(&WebViewGuest::FileSystemAccessedAsyncResponse, | 649 url, |
| 903 render_process_id, | 650 blocked_by_policy); |
| 904 render_frame_id, | |
| 905 request_id, | |
| 906 url)); | |
| 907 } | 651 } |
| 908 | 652 |
| 909 // static | 653 // static |
| 910 void WebViewGuest::FileSystemAccessedAsyncResponse(int render_process_id, | |
| 911 int render_frame_id, | |
| 912 int request_id, | |
| 913 const GURL& url, | |
| 914 bool allowed) { | |
| 915 TabSpecificContentSettings::FileSystemAccessed( | |
| 916 render_process_id, render_frame_id, url, !allowed); | |
| 917 content::RenderFrameHost* render_frame_host = | |
| 918 content::RenderFrameHost::FromID(render_process_id, render_frame_id); | |
| 919 if (!render_frame_host) | |
| 920 return; | |
| 921 render_frame_host->Send( | |
| 922 new ChromeViewMsg_RequestFileSystemAccessAsyncResponse( | |
| 923 render_frame_id, request_id, allowed)); | |
| 924 } | |
| 925 | |
| 926 // static | |
| 927 void WebViewGuest::FileSystemAccessedSync(int render_process_id, | 654 void WebViewGuest::FileSystemAccessedSync(int render_process_id, |
| 928 int render_frame_id, | 655 int render_frame_id, |
| 929 const GURL& url, | 656 const GURL& url, |
| 930 bool blocked_by_policy, | 657 bool blocked_by_policy, |
| 931 IPC::Message* reply_msg) { | 658 IPC::Message* reply_msg) { |
| 932 WebViewGuest* guest = | 659 WebViewPermissionHelper* web_view_permission_helper = |
| 933 WebViewGuest::FromFrameID(render_process_id, render_frame_id); | 660 WebViewPermissionHelper::FromFrameID(render_process_id, render_frame_id); |
| 934 DCHECK(guest); | 661 DCHECK(web_view_permission_helper); |
| 935 guest->RequestFileSystemPermission( | 662 web_view_permission_helper->FileSystemAccessedSync(render_process_id, |
| 936 url, | 663 render_frame_id, |
| 937 !blocked_by_policy, | 664 url, |
| 938 base::Bind(&WebViewGuest::FileSystemAccessedSyncResponse, | 665 blocked_by_policy, |
| 939 render_process_id, | 666 reply_msg); |
| 940 render_frame_id, | |
| 941 url, | |
| 942 reply_msg)); | |
| 943 } | |
| 944 | |
| 945 // static | |
| 946 void WebViewGuest::FileSystemAccessedSyncResponse(int render_process_id, | |
| 947 int render_frame_id, | |
| 948 const GURL& url, | |
| 949 IPC::Message* reply_msg, | |
| 950 bool allowed) { | |
| 951 TabSpecificContentSettings::FileSystemAccessed( | |
| 952 render_process_id, render_frame_id, url, !allowed); | |
| 953 ChromeViewHostMsg_RequestFileSystemAccessSync::WriteReplyParams(reply_msg, | |
| 954 allowed); | |
| 955 content::RenderFrameHost* render_frame_host = | |
| 956 content::RenderFrameHost::FromID(render_process_id, render_frame_id); | |
| 957 if (!render_frame_id) | |
| 958 return; | |
| 959 render_frame_host->Send(reply_msg); | |
| 960 } | 667 } |
| 961 | 668 |
| 962 WebViewGuest::~WebViewGuest() { | 669 WebViewGuest::~WebViewGuest() { |
| 963 } | 670 } |
| 964 | 671 |
| 965 void WebViewGuest::DidCommitProvisionalLoadForFrame( | 672 void WebViewGuest::DidCommitProvisionalLoadForFrame( |
| 966 int64 frame_id, | 673 int64 frame_id, |
| 967 const base::string16& frame_unique_name, | 674 const base::string16& frame_unique_name, |
| 968 bool is_main_frame, | 675 bool is_main_frame, |
| 969 const GURL& url, | 676 const GURL& url, |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1146 args->SetInteger(webview::kNewHeight, new_size.height()); | 853 args->SetInteger(webview::kNewHeight, new_size.height()); |
| 1147 args->SetInteger(webview::kNewWidth, new_size.width()); | 854 args->SetInteger(webview::kNewWidth, new_size.width()); |
| 1148 DispatchEvent( | 855 DispatchEvent( |
| 1149 new GuestViewBase::Event(webview::kEventSizeChanged, args.Pass())); | 856 new GuestViewBase::Event(webview::kEventSizeChanged, args.Pass())); |
| 1150 } | 857 } |
| 1151 | 858 |
| 1152 void WebViewGuest::RequestMediaAccessPermission( | 859 void WebViewGuest::RequestMediaAccessPermission( |
| 1153 content::WebContents* source, | 860 content::WebContents* source, |
| 1154 const content::MediaStreamRequest& request, | 861 const content::MediaStreamRequest& request, |
| 1155 const content::MediaResponseCallback& callback) { | 862 const content::MediaResponseCallback& callback) { |
| 1156 base::DictionaryValue request_info; | 863 if (!web_view_permission_helper_) { |
| 1157 request_info.Set( | 864 return; |
| 1158 guestview::kUrl, | 865 } |
| 1159 base::Value::CreateStringValue(request.security_origin.spec())); | 866 web_view_permission_helper_->RequestMediaAccessPermission(source, |
| 1160 RequestPermission(WEB_VIEW_PERMISSION_TYPE_MEDIA, | 867 request, |
| 1161 request_info, | 868 callback); |
| 1162 base::Bind(&WebViewGuest::OnWebViewMediaPermissionResponse, | |
| 1163 base::Unretained(this), | |
| 1164 request, | |
| 1165 callback), | |
| 1166 false /* allowed_by_default */); | |
| 1167 } | 869 } |
| 1168 | 870 |
| 1169 void WebViewGuest::CanDownload( | 871 void WebViewGuest::CanDownload( |
| 1170 content::RenderViewHost* render_view_host, | 872 content::RenderViewHost* render_view_host, |
| 1171 const GURL& url, | 873 const GURL& url, |
| 1172 const std::string& request_method, | 874 const std::string& request_method, |
| 1173 const base::Callback<void(bool)>& callback) { | 875 const base::Callback<void(bool)>& callback) { |
| 1174 base::DictionaryValue request_info; | 876 if (!web_view_permission_helper_) { |
| 1175 request_info.Set( | 877 return; |
| 1176 guestview::kUrl, | 878 } |
| 1177 base::Value::CreateStringValue(url.spec())); | 879 web_view_permission_helper_->CanDownload(render_view_host, |
| 1178 RequestPermission( | 880 url, |
| 1179 WEB_VIEW_PERMISSION_TYPE_DOWNLOAD, | 881 request_method, |
| 1180 request_info, | 882 callback); |
| 1181 base::Bind(&WebViewGuest::OnWebViewDownloadPermissionResponse, | |
| 1182 base::Unretained(this), | |
| 1183 callback), | |
| 1184 false /* allowed_by_default */); | |
| 1185 } | 883 } |
| 1186 | 884 |
| 1187 void WebViewGuest::RequestPointerLockPermission( | 885 void WebViewGuest::RequestPointerLockPermission( |
| 1188 bool user_gesture, | 886 bool user_gesture, |
| 1189 bool last_unlocked_by_target, | 887 bool last_unlocked_by_target, |
| 1190 const base::Callback<void(bool)>& callback) { | 888 const base::Callback<void(bool)>& callback) { |
| 1191 base::DictionaryValue request_info; | 889 if (!web_view_permission_helper_) { |
| 1192 request_info.Set(guestview::kUserGesture, | 890 return; |
| 1193 base::Value::CreateBooleanValue(user_gesture)); | 891 } |
| 1194 request_info.Set(webview::kLastUnlockedBySelf, | 892 web_view_permission_helper_->RequestPointerLockPermission( |
| 1195 base::Value::CreateBooleanValue(last_unlocked_by_target)); | 893 user_gesture, |
| 1196 request_info.Set(guestview::kUrl, | 894 last_unlocked_by_target, |
| 1197 base::Value::CreateStringValue( | 895 callback); |
| 1198 guest_web_contents()->GetLastCommittedURL().spec())); | |
| 1199 | |
| 1200 RequestPermission( | |
| 1201 WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK, | |
| 1202 request_info, | |
| 1203 base::Bind(&WebViewGuest::OnWebViewPointerLockPermissionResponse, | |
| 1204 base::Unretained(this), | |
| 1205 callback), | |
| 1206 false /* allowed_by_default */); | |
| 1207 } | 896 } |
| 1208 | 897 |
| 1209 content::JavaScriptDialogManager* | 898 content::JavaScriptDialogManager* |
| 1210 WebViewGuest::GetJavaScriptDialogManager() { | 899 WebViewGuest::GetJavaScriptDialogManager() { |
| 1211 return &javascript_dialog_helper_; | 900 return &javascript_dialog_helper_; |
| 1212 } | 901 } |
| 1213 | 902 |
| 1214 content::ColorChooser* WebViewGuest::OpenColorChooser( | 903 content::ColorChooser* WebViewGuest::OpenColorChooser( |
| 1215 WebContents* web_contents, | 904 WebContents* web_contents, |
| 1216 SkColor color, | 905 SkColor color, |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1283 chromeos::AccessibilityManager* manager = | 972 chromeos::AccessibilityManager* manager = |
| 1284 chromeos::AccessibilityManager::Get(); | 973 chromeos::AccessibilityManager::Get(); |
| 1285 if (manager && manager->IsSpokenFeedbackEnabled()) { | 974 if (manager && manager->IsSpokenFeedbackEnabled()) { |
| 1286 manager->InjectChromeVox(render_view_host); | 975 manager->InjectChromeVox(render_view_host); |
| 1287 chromevox_injected_ = true; | 976 chromevox_injected_ = true; |
| 1288 } | 977 } |
| 1289 } | 978 } |
| 1290 #endif | 979 #endif |
| 1291 } | 980 } |
| 1292 | 981 |
| 1293 int WebViewGuest::RemoveBridgeID(int bridge_id) { | |
| 1294 std::map<int, int>::iterator bridge_itr = | |
| 1295 bridge_id_to_request_id_map_.find(bridge_id); | |
| 1296 if (bridge_itr == bridge_id_to_request_id_map_.end()) | |
| 1297 return webview::kInvalidPermissionRequestID; | |
| 1298 | |
| 1299 int request_id = bridge_itr->second; | |
| 1300 bridge_id_to_request_id_map_.erase(bridge_itr); | |
| 1301 return request_id; | |
| 1302 } | |
| 1303 | |
| 1304 int WebViewGuest::RequestPermission( | |
| 1305 WebViewPermissionType permission_type, | |
| 1306 const base::DictionaryValue& request_info, | |
| 1307 const PermissionResponseCallback& callback, | |
| 1308 bool allowed_by_default) { | |
| 1309 // If there are too many pending permission requests then reject this request. | |
| 1310 if (pending_permission_requests_.size() >= | |
| 1311 webview::kMaxOutstandingPermissionRequests) { | |
| 1312 // Let the stack unwind before we deny the permission request so that | |
| 1313 // objects held by the permission request are not destroyed immediately | |
| 1314 // after creation. This is to allow those same objects to be accessed again | |
| 1315 // in the same scope without fear of use after freeing. | |
| 1316 base::MessageLoop::current()->PostTask( | |
| 1317 FROM_HERE, | |
| 1318 base::Bind(&PermissionResponseCallback::Run, | |
| 1319 base::Owned(new PermissionResponseCallback(callback)), | |
| 1320 allowed_by_default, | |
| 1321 std::string())); | |
| 1322 return webview::kInvalidPermissionRequestID; | |
| 1323 } | |
| 1324 | |
| 1325 int request_id = next_permission_request_id_++; | |
| 1326 pending_permission_requests_[request_id] = | |
| 1327 PermissionResponseInfo(callback, permission_type, allowed_by_default); | |
| 1328 scoped_ptr<base::DictionaryValue> args(request_info.DeepCopy()); | |
| 1329 args->SetInteger(webview::kRequestId, request_id); | |
| 1330 switch (permission_type) { | |
| 1331 case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: { | |
| 1332 DispatchEvent( | |
| 1333 new GuestViewBase::Event(webview::kEventNewWindow, args.Pass())); | |
| 1334 break; | |
| 1335 } | |
| 1336 case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: { | |
| 1337 DispatchEvent( | |
| 1338 new GuestViewBase::Event(webview::kEventDialog, args.Pass())); | |
| 1339 break; | |
| 1340 } | |
| 1341 default: { | |
| 1342 args->SetString(webview::kPermission, | |
| 1343 PermissionTypeToString(permission_type)); | |
| 1344 DispatchEvent(new GuestViewBase::Event(webview::kEventPermissionRequest, | |
| 1345 args.Pass())); | |
| 1346 break; | |
| 1347 } | |
| 1348 } | |
| 1349 return request_id; | |
| 1350 } | |
| 1351 | |
| 1352 bool WebViewGuest::HandleKeyboardShortcuts( | 982 bool WebViewGuest::HandleKeyboardShortcuts( |
| 1353 const content::NativeWebKeyboardEvent& event) { | 983 const content::NativeWebKeyboardEvent& event) { |
| 1354 if (event.type != blink::WebInputEvent::RawKeyDown) | 984 if (event.type != blink::WebInputEvent::RawKeyDown) |
| 1355 return false; | 985 return false; |
| 1356 | 986 |
| 1357 // If the user hits the escape key without any modifiers then unlock the | 987 // If the user hits the escape key without any modifiers then unlock the |
| 1358 // mouse if necessary. | 988 // mouse if necessary. |
| 1359 if ((event.windowsKeyCode == ui::VKEY_ESCAPE) && | 989 if ((event.windowsKeyCode == ui::VKEY_ESCAPE) && |
| 1360 !(event.modifiers & blink::WebInputEvent::InputModifiers)) { | 990 !(event.modifiers & blink::WebInputEvent::InputModifiers)) { |
| 1361 return guest_web_contents()->GotResponseToLockMouseRequest(false); | 991 return guest_web_contents()->GotResponseToLockMouseRequest(false); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1382 | 1012 |
| 1383 if (event.windowsKeyCode == ui::VKEY_BROWSER_FORWARD) { | 1013 if (event.windowsKeyCode == ui::VKEY_BROWSER_FORWARD) { |
| 1384 Go(1); | 1014 Go(1); |
| 1385 return true; | 1015 return true; |
| 1386 } | 1016 } |
| 1387 #endif | 1017 #endif |
| 1388 | 1018 |
| 1389 return false; | 1019 return false; |
| 1390 } | 1020 } |
| 1391 | 1021 |
| 1392 WebViewGuest::PermissionResponseInfo::PermissionResponseInfo() | |
| 1393 : permission_type(WEB_VIEW_PERMISSION_TYPE_UNKNOWN), | |
| 1394 allowed_by_default(false) { | |
| 1395 } | |
| 1396 | |
| 1397 WebViewGuest::PermissionResponseInfo::PermissionResponseInfo( | |
| 1398 const PermissionResponseCallback& callback, | |
| 1399 WebViewPermissionType permission_type, | |
| 1400 bool allowed_by_default) | |
| 1401 : callback(callback), | |
| 1402 permission_type(permission_type), | |
| 1403 allowed_by_default(allowed_by_default) { | |
| 1404 } | |
| 1405 | |
| 1406 WebViewGuest::PermissionResponseInfo::~PermissionResponseInfo() { | |
| 1407 } | |
| 1408 | |
| 1409 void WebViewGuest::ShowContextMenu(int request_id, | 1022 void WebViewGuest::ShowContextMenu(int request_id, |
| 1410 const MenuItemVector* items) { | 1023 const MenuItemVector* items) { |
| 1411 if (!pending_menu_.get()) | 1024 if (!pending_menu_.get()) |
| 1412 return; | 1025 return; |
| 1413 | 1026 |
| 1414 // Make sure this was the correct request. | 1027 // Make sure this was the correct request. |
| 1415 if (request_id != pending_context_menu_request_id_) | 1028 if (request_id != pending_context_menu_request_id_) |
| 1416 return; | 1029 return; |
| 1417 | 1030 |
| 1418 // TODO(lazyboy): Implement. | 1031 // TODO(lazyboy): Implement. |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1544 request_info.Set(webview::kWindowID, | 1157 request_info.Set(webview::kWindowID, |
| 1545 base::Value::CreateIntegerValue(guest->guest_instance_id())); | 1158 base::Value::CreateIntegerValue(guest->guest_instance_id())); |
| 1546 // We pass in partition info so that window-s created through newwindow | 1159 // We pass in partition info so that window-s created through newwindow |
| 1547 // API can use it to set their partition attribute. | 1160 // API can use it to set their partition attribute. |
| 1548 request_info.Set(webview::kStoragePartitionId, | 1161 request_info.Set(webview::kStoragePartitionId, |
| 1549 base::Value::CreateStringValue(storage_partition_id)); | 1162 base::Value::CreateStringValue(storage_partition_id)); |
| 1550 request_info.Set(webview::kWindowOpenDisposition, | 1163 request_info.Set(webview::kWindowOpenDisposition, |
| 1551 base::Value::CreateStringValue( | 1164 base::Value::CreateStringValue( |
| 1552 WindowOpenDispositionToString(disposition))); | 1165 WindowOpenDispositionToString(disposition))); |
| 1553 | 1166 |
| 1554 RequestPermission(WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW, | 1167 if (!web_view_permission_helper_) { |
| 1555 request_info, | 1168 return; |
| 1556 base::Bind(&WebViewGuest::OnWebViewNewWindowResponse, | 1169 } |
| 1557 base::Unretained(this), | 1170 web_view_permission_helper_-> |
| 1558 guest->guest_instance_id()), | 1171 RequestPermission(WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW, |
| 1559 false /* allowed_by_default */); | 1172 request_info, |
| 1173 base::Bind(&WebViewGuest::OnWebViewNewWindowResponse, | |
| 1174 base::Unretained(this), | |
| 1175 guest->guest_instance_id()), | |
| 1176 false /* allowed_by_default */); | |
| 1560 } | 1177 } |
| 1561 | 1178 |
| 1562 void WebViewGuest::DestroyUnattachedWindows() { | 1179 void WebViewGuest::DestroyUnattachedWindows() { |
| 1563 // Destroy() reaches in and removes the WebViewGuest from its opener's | 1180 // Destroy() reaches in and removes the WebViewGuest from its opener's |
| 1564 // pending_new_windows_ set. To avoid mutating the set while iterating, we | 1181 // pending_new_windows_ set. To avoid mutating the set while iterating, we |
| 1565 // create a copy of the pending new windows set and iterate over the copy. | 1182 // create a copy of the pending new windows set and iterate over the copy. |
| 1566 PendingWindowMap pending_new_windows(pending_new_windows_); | 1183 PendingWindowMap pending_new_windows(pending_new_windows_); |
| 1567 // Clean up unattached new windows opened by this guest. | 1184 // Clean up unattached new windows opened by this guest. |
| 1568 for (PendingWindowMap::const_iterator it = pending_new_windows.begin(); | 1185 for (PendingWindowMap::const_iterator it = pending_new_windows.begin(); |
| 1569 it != pending_new_windows.end(); ++it) { | 1186 it != pending_new_windows.end(); ++it) { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1591 bool allow, | 1208 bool allow, |
| 1592 const std::string& user_input) { | 1209 const std::string& user_input) { |
| 1593 WebViewGuest* guest = | 1210 WebViewGuest* guest = |
| 1594 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); | 1211 WebViewGuest::From(embedder_render_process_id(), new_window_instance_id); |
| 1595 if (!guest) | 1212 if (!guest) |
| 1596 return; | 1213 return; |
| 1597 | 1214 |
| 1598 if (!allow) | 1215 if (!allow) |
| 1599 guest->Destroy(); | 1216 guest->Destroy(); |
| 1600 } | 1217 } |
| OLD | NEW |