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