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 "extensions/browser/guest_view/web_view/web_view_guest.h" | 5 #include "extensions/browser/guest_view/web_view/web_view_guest.h" |
| 6 | 6 |
| 7 #include <utility> | |
| 8 | |
| 7 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 8 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 10 #include "components/browsing_data/storage_partition_http_cache_data_remover.h" | 12 #include "components/browsing_data/storage_partition_http_cache_data_remover.h" |
| 11 #include "components/guest_view/browser/guest_view_event.h" | 13 #include "components/guest_view/browser/guest_view_event.h" |
| 12 #include "components/guest_view/browser/guest_view_manager.h" | 14 #include "components/guest_view/browser/guest_view_manager.h" |
| 13 #include "components/guest_view/common/guest_view_constants.h" | 15 #include "components/guest_view/common/guest_view_constants.h" |
| 14 #include "components/web_cache/browser/web_cache_manager.h" | 16 #include "components/web_cache/browser/web_cache_manager.h" |
| 15 #include "content/public/browser/browser_context.h" | 17 #include "content/public/browser/browser_context.h" |
| 16 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 33 #include "content/public/common/media_stream_request.h" | 35 #include "content/public/common/media_stream_request.h" |
| 34 #include "content/public/common/page_zoom.h" | 36 #include "content/public/common/page_zoom.h" |
| 35 #include "content/public/common/result_codes.h" | 37 #include "content/public/common/result_codes.h" |
| 36 #include "content/public/common/stop_find_action.h" | 38 #include "content/public/common/stop_find_action.h" |
| 37 #include "content/public/common/url_constants.h" | 39 #include "content/public/common/url_constants.h" |
| 38 #include "extensions/browser/api/declarative/rules_registry_service.h" | 40 #include "extensions/browser/api/declarative/rules_registry_service.h" |
| 39 #include "extensions/browser/api/extensions_api_client.h" | 41 #include "extensions/browser/api/extensions_api_client.h" |
| 40 #include "extensions/browser/api/guest_view/web_view/web_view_internal_api.h" | 42 #include "extensions/browser/api/guest_view/web_view/web_view_internal_api.h" |
| 41 #include "extensions/browser/api/web_request/web_request_api.h" | 43 #include "extensions/browser/api/web_request/web_request_api.h" |
| 42 #include "extensions/browser/extension_system.h" | 44 #include "extensions/browser/extension_system.h" |
| 45 #include "extensions/browser/extensions_browser_client.h" | |
| 43 #include "extensions/browser/guest_view/web_view/web_view_constants.h" | 46 #include "extensions/browser/guest_view/web_view/web_view_constants.h" |
| 44 #include "extensions/browser/guest_view/web_view/web_view_content_script_manager .h" | 47 #include "extensions/browser/guest_view/web_view/web_view_content_script_manager .h" |
| 45 #include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" | 48 #include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" |
| 46 #include "extensions/browser/guest_view/web_view/web_view_permission_types.h" | 49 #include "extensions/browser/guest_view/web_view/web_view_permission_types.h" |
| 47 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" | 50 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
| 48 #include "extensions/common/constants.h" | 51 #include "extensions/common/constants.h" |
| 49 #include "extensions/common/extension_messages.h" | 52 #include "extensions/common/extension_messages.h" |
| 50 #include "extensions/strings/grit/extensions_strings.h" | 53 #include "extensions/strings/grit/extensions_strings.h" |
| 51 #include "ipc/ipc_message_macros.h" | 54 #include "ipc/ipc_message_macros.h" |
| 52 #include "net/base/escape.h" | 55 #include "net/base/escape.h" |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 182 | 185 |
| 183 double ConvertZoomLevelToZoomFactor(double zoom_level) { | 186 double ConvertZoomLevelToZoomFactor(double zoom_level) { |
| 184 double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level); | 187 double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level); |
| 185 // Because the conversion from zoom level to zoom factor isn't perfect, the | 188 // Because the conversion from zoom level to zoom factor isn't perfect, the |
| 186 // resulting zoom factor is rounded to the nearest 6th decimal place. | 189 // resulting zoom factor is rounded to the nearest 6th decimal place. |
| 187 zoom_factor = round(zoom_factor * 1000000) / 1000000; | 190 zoom_factor = round(zoom_factor * 1000000) / 1000000; |
| 188 return zoom_factor; | 191 return zoom_factor; |
| 189 } | 192 } |
| 190 | 193 |
| 191 using WebViewKey = std::pair<int, int>; | 194 using WebViewKey = std::pair<int, int>; |
| 195 | |
| 192 using WebViewKeyToIDMap = std::map<WebViewKey, int>; | 196 using WebViewKeyToIDMap = std::map<WebViewKey, int>; |
| 193 static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map = | 197 static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map = |
| 194 LAZY_INSTANCE_INITIALIZER; | 198 LAZY_INSTANCE_INITIALIZER; |
| 195 | 199 |
| 200 using WebViewKeyToExtensionIDMap = std::map<WebViewKey, std::string>; | |
| 201 static base::LazyInstance<WebViewKeyToExtensionIDMap> | |
|
Devlin
2015/07/06 17:46:18
Storing this as global state seems unnecessary (an
| |
| 202 web_view_key_to_extension_id_map = LAZY_INSTANCE_INITIALIZER; | |
| 203 | |
| 196 } // namespace | 204 } // namespace |
| 197 | 205 |
| 198 // static | 206 // static |
| 199 void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) { | 207 void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) { |
| 200 GuestViewBase::CleanUp(embedder_process_id, view_instance_id); | 208 GuestViewBase::CleanUp(embedder_process_id, view_instance_id); |
| 201 | 209 |
| 202 auto rph = content::RenderProcessHost::FromID(embedder_process_id); | 210 auto rph = content::RenderProcessHost::FromID(embedder_process_id); |
| 203 // TODO(paulmeyer): It should be impossible for rph to be nullptr here, but | 211 // TODO(paulmeyer): It should be impossible for rph to be nullptr here, but |
| 204 // this check is needed here for now as there seems to be occasional crashes | 212 // this check is needed here for now as there seems to be occasional crashes |
| 205 // because of this (http//crbug.com/499438). This should be removed once the | 213 // because of this (http//crbug.com/499438). This should be removed once the |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 227 FROM_HERE, | 235 FROM_HERE, |
| 228 base::Bind( | 236 base::Bind( |
| 229 &RemoveWebViewEventListenersOnIOThread, | 237 &RemoveWebViewEventListenersOnIOThread, |
| 230 browser_context, | 238 browser_context, |
| 231 embedder_process_id, | 239 embedder_process_id, |
| 232 view_instance_id)); | 240 view_instance_id)); |
| 233 | 241 |
| 234 // Clean up content scripts for the WebView. | 242 // Clean up content scripts for the WebView. |
| 235 auto csm = WebViewContentScriptManager::Get(browser_context); | 243 auto csm = WebViewContentScriptManager::Get(browser_context); |
| 236 csm->RemoveAllContentScriptsForWebView(embedder_process_id, view_instance_id); | 244 csm->RemoveAllContentScriptsForWebView(embedder_process_id, view_instance_id); |
| 245 | |
| 246 // Allow an extensions browser client to potentially perform more cleanup. | |
| 247 ExtensionsBrowserClient::Get()->CleanUpWebView(embedder_process_id, | |
| 248 view_instance_id); | |
| 249 | |
| 250 // Remove this WebView's entry in |web_view_key_to_extension_id_map|. | |
| 251 web_view_key_to_extension_id_map.Get().erase(key); | |
| 237 } | 252 } |
| 238 | 253 |
| 239 // static | 254 // static |
| 240 GuestViewBase* WebViewGuest::Create(content::WebContents* owner_web_contents) { | 255 GuestViewBase* WebViewGuest::Create(content::WebContents* owner_web_contents) { |
| 241 return new WebViewGuest(owner_web_contents); | 256 return new WebViewGuest(owner_web_contents); |
| 242 } | 257 } |
| 243 | 258 |
| 244 // static | 259 // static |
| 245 bool WebViewGuest::GetGuestPartitionConfigForSite( | 260 bool WebViewGuest::GetGuestPartitionConfigForSite( |
| 246 const GURL& site, | 261 const GURL& site, |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 268 const char WebViewGuest::Type[] = "webview"; | 283 const char WebViewGuest::Type[] = "webview"; |
| 269 | 284 |
| 270 // static | 285 // static |
| 271 int WebViewGuest::GetOrGenerateRulesRegistryID( | 286 int WebViewGuest::GetOrGenerateRulesRegistryID( |
| 272 int embedder_process_id, | 287 int embedder_process_id, |
| 273 int webview_instance_id) { | 288 int webview_instance_id) { |
| 274 bool is_web_view = embedder_process_id && webview_instance_id; | 289 bool is_web_view = embedder_process_id && webview_instance_id; |
| 275 if (!is_web_view) | 290 if (!is_web_view) |
| 276 return RulesRegistryService::kDefaultRulesRegistryID; | 291 return RulesRegistryService::kDefaultRulesRegistryID; |
| 277 | 292 |
| 278 WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id); | 293 WebViewKey key(embedder_process_id, webview_instance_id); |
| 279 auto it = web_view_key_to_id_map.Get().find(key); | 294 auto it = web_view_key_to_id_map.Get().find(key); |
| 280 if (it != web_view_key_to_id_map.Get().end()) | 295 if (it != web_view_key_to_id_map.Get().end()) |
| 281 return it->second; | 296 return it->second; |
| 282 | 297 |
| 283 auto rph = content::RenderProcessHost::FromID(embedder_process_id); | 298 auto rph = content::RenderProcessHost::FromID(embedder_process_id); |
| 284 int rules_registry_id = | 299 int rules_registry_id = |
| 285 RulesRegistryService::Get(rph->GetBrowserContext())-> | 300 RulesRegistryService::Get(rph->GetBrowserContext())-> |
| 286 GetNextRulesRegistryID(); | 301 GetNextRulesRegistryID(); |
| 287 web_view_key_to_id_map.Get()[key] = rules_registry_id; | 302 web_view_key_to_id_map.Get()[key] = rules_registry_id; |
| 288 return rules_registry_id; | 303 return rules_registry_id; |
| 289 } | 304 } |
| 290 | 305 |
| 291 // static | 306 // static |
| 292 int WebViewGuest::GetViewInstanceId(WebContents* contents) { | 307 int WebViewGuest::GetViewInstanceId(WebContents* contents) { |
| 293 auto guest = FromWebContents(contents); | 308 auto guest = FromWebContents(contents); |
| 294 if (!guest) | 309 if (!guest) |
| 295 return guest_view::kInstanceIDNone; | 310 return guest_view::kInstanceIDNone; |
| 296 | 311 |
| 297 return guest->view_instance_id(); | 312 return guest->view_instance_id(); |
| 298 } | 313 } |
| 299 | 314 |
| 315 // static | |
| 316 std::string WebViewGuest::GetExtensionID(int embedder_process_id, | |
| 317 int view_instance_id) { | |
| 318 WebViewKey key(embedder_process_id, view_instance_id); | |
| 319 auto it = web_view_key_to_extension_id_map.Get().find(key); | |
| 320 | |
| 321 if (it == web_view_key_to_extension_id_map.Get().end()) | |
| 322 return ""; | |
| 323 | |
| 324 return it->second; | |
| 325 } | |
| 326 | |
| 327 // static | |
| 328 void WebViewGuest::RegisterExtensionID(const std::string& extension_id, | |
| 329 int embedder_process_id, | |
| 330 int view_instance_id) { | |
| 331 WebViewKey key(embedder_process_id, view_instance_id); | |
| 332 web_view_key_to_extension_id_map.Get()[key] = extension_id; | |
| 333 } | |
| 334 | |
| 300 bool WebViewGuest::CanRunInDetachedState() const { | 335 bool WebViewGuest::CanRunInDetachedState() const { |
| 301 return true; | 336 return true; |
| 302 } | 337 } |
| 303 | 338 |
| 304 void WebViewGuest::CreateWebContents( | 339 void WebViewGuest::CreateWebContents( |
| 305 const base::DictionaryValue& create_params, | 340 const base::DictionaryValue& create_params, |
| 306 const WebContentsCreatedCallback& callback) { | 341 const WebContentsCreatedCallback& callback) { |
| 307 content::RenderProcessHost* owner_render_process_host = | 342 content::RenderProcessHost* owner_render_process_host = |
| 308 owner_web_contents()->GetRenderProcessHost(); | 343 owner_web_contents()->GetRenderProcessHost(); |
| 309 std::string storage_partition_id; | 344 std::string storage_partition_id; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 427 | 462 |
| 428 const char* WebViewGuest::GetAPINamespace() const { | 463 const char* WebViewGuest::GetAPINamespace() const { |
| 429 return webview::kAPINamespace; | 464 return webview::kAPINamespace; |
| 430 } | 465 } |
| 431 | 466 |
| 432 int WebViewGuest::GetTaskPrefix() const { | 467 int WebViewGuest::GetTaskPrefix() const { |
| 433 return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX; | 468 return IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX; |
| 434 } | 469 } |
| 435 | 470 |
| 436 void WebViewGuest::GuestDestroyed() { | 471 void WebViewGuest::GuestDestroyed() { |
| 437 // Clean up custom context menu items for this guest. | |
| 438 if (web_view_guest_delegate_) | |
| 439 web_view_guest_delegate_->OnGuestDestroyed(); | |
| 440 RemoveWebViewStateFromIOThread(web_contents()); | 472 RemoveWebViewStateFromIOThread(web_contents()); |
| 441 } | 473 } |
| 442 | 474 |
| 443 void WebViewGuest::GuestReady() { | 475 void WebViewGuest::GuestReady() { |
| 444 // The guest RenderView should always live in an isolated guest process. | 476 // The guest RenderView should always live in an isolated guest process. |
| 445 CHECK(web_contents()->GetRenderProcessHost()->IsForGuestsOnly()); | 477 CHECK(web_contents()->GetRenderProcessHost()->IsForGuestsOnly()); |
| 446 Send(new ExtensionMsg_SetFrameName(web_contents()->GetRoutingID(), name_)); | 478 Send(new ExtensionMsg_SetFrameName(web_contents()->GetRoutingID(), name_)); |
| 447 | 479 |
| 448 // We don't want to accidentally set the opacity of an interstitial page. | 480 // We don't want to accidentally set the opacity of an interstitial page. |
| 449 // WebContents::GetRenderWidgetHostView will return the RWHV of an | 481 // WebContents::GetRenderWidgetHostView will return the RWHV of an |
| (...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1462 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); | 1494 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| 1463 DispatchEventToView( | 1495 DispatchEventToView( |
| 1464 new GuestViewEvent(webview::kEventExitFullscreen, args.Pass())); | 1496 new GuestViewEvent(webview::kEventExitFullscreen, args.Pass())); |
| 1465 } | 1497 } |
| 1466 // Since we changed fullscreen state, sending a Resize message ensures that | 1498 // Since we changed fullscreen state, sending a Resize message ensures that |
| 1467 // renderer/ sees the change. | 1499 // renderer/ sees the change. |
| 1468 web_contents()->GetRenderViewHost()->WasResized(); | 1500 web_contents()->GetRenderViewHost()->WasResized(); |
| 1469 } | 1501 } |
| 1470 | 1502 |
| 1471 } // namespace extensions | 1503 } // namespace extensions |
| OLD | NEW |