Chromium Code Reviews| Index: extensions/browser/guest_view/web_view/web_view_guest.cc |
| diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc |
| index e9c25ba23e1afb1c42174ed948b7be2d1647e083..7813ba0b4636ef666e144342ef88c9407d19740b 100644 |
| --- a/extensions/browser/guest_view/web_view/web_view_guest.cc |
| +++ b/extensions/browser/guest_view/web_view/web_view_guest.cc |
| @@ -58,6 +58,8 @@ namespace extensions { |
| namespace { |
| +int current_script_injection_instance_id = 0; |
| + |
| std::string WindowOpenDispositionToString( |
| WindowOpenDisposition window_open_disposition) { |
| switch (window_open_disposition) { |
| @@ -99,6 +101,10 @@ static std::string TerminationStatusToString(base::TerminationStatus status) { |
| return "unknown"; |
| } |
| +int GetNextScriptInjectionInstanceID() { |
| + return ++current_script_injection_instance_id; |
| +} |
| + |
| std::string GetStoragePartitionIdFromSiteURL(const GURL& site_url) { |
| const std::string& partition_id = site_url.query(); |
| bool persist_storage = site_url.path().find("persist") != std::string::npos; |
| @@ -184,6 +190,8 @@ using WebViewKey = std::pair<int, int>; |
| using WebViewKeyToIDMap = std::map<WebViewKey, int>; |
| static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map = |
| LAZY_INSTANCE_INITIALIZER; |
| +static base::LazyInstance<WebViewKeyToIDMap> script_injection_instance_id_map = |
| + LAZY_INSTANCE_INITIALIZER; |
| // static |
| int WebViewGuest::GetOrGenerateRulesRegistryID( |
| @@ -207,6 +215,25 @@ int WebViewGuest::GetOrGenerateRulesRegistryID( |
| } |
| // static |
| +int WebViewGuest:: GetOrGenerateScriptInjectionInstanceID( |
|
Devlin
2015/02/04 17:01:14
Why can't we use the guest_instance_id for the ins
Xi Han
2015/02/05 16:06:20
The guest_instance_id isn't a unique id, |embedder
|
| + int embedder_process_id, |
| + int guest_instance_id ) { |
| + if (!(embedder_process_id && guest_instance_id)) |
| + return Host::kDefaultInstanceId; |
| + |
| + WebViewKey key = std::make_pair(embedder_process_id, guest_instance_id); |
| + WebViewKeyToIDMap& script_injection_ids = |
| + script_injection_instance_id_map.Get(); |
| + auto it = script_injection_ids.find(key); |
| + if (it != script_injection_ids.end()) |
| + return it->second; |
| + |
| + int script_injection_instance_id = GetNextScriptInjectionInstanceID(); |
| + script_injection_ids[key] = script_injection_instance_id; |
| + return script_injection_instance_id; |
| +} |
| + |
| +// static |
| int WebViewGuest::GetViewInstanceId(WebContents* contents) { |
| auto guest = FromWebContents(contents); |
| if (!guest) |
| @@ -293,6 +320,10 @@ void WebViewGuest::DidInitialize(const base::DictionaryValue& create_params) { |
| owner_web_contents()->GetRenderProcessHost()->GetID(), |
| view_instance_id()); |
| + GetOrGenerateScriptInjectionInstanceID( |
| + owner_web_contents()->GetRenderProcessHost()->GetID(), |
| + guest_instance_id()); |
| + |
| // We must install the mapping from guests to WebViews prior to resuming |
| // suspended resource loads so that the WebRequest API will catch resource |
| // requests. |
| @@ -320,6 +351,7 @@ void WebViewGuest::EmbedderWillBeDestroyed() { |
| WebViewKey key(owner_web_contents()->GetRenderProcessHost()->GetID(), |
| view_instance_id()); |
| web_view_key_to_id_map.Get().erase(key); |
| + script_injection_instance_id_map.Get().erase(key); |
| content::BrowserThread::PostTask( |
| content::BrowserThread::IO, |