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 3d5f31e930e2f9bb0233b3be6aede2d3ab5fa2d4..9f0b7b83f3e96066cf45acf684cb6eaef77e8b65 100644 |
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc |
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc |
@@ -4,6 +4,8 @@ |
#include "extensions/browser/guest_view/web_view/web_view_guest.h" |
+#include <utility> |
+ |
#include "base/message_loop/message_loop.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -40,6 +42,7 @@ |
#include "extensions/browser/api/guest_view/web_view/web_view_internal_api.h" |
#include "extensions/browser/api/web_request/web_request_api.h" |
#include "extensions/browser/extension_system.h" |
+#include "extensions/browser/extensions_browser_client.h" |
#include "extensions/browser/guest_view/web_view/web_view_constants.h" |
#include "extensions/browser/guest_view/web_view/web_view_content_script_manager.h" |
#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h" |
@@ -189,10 +192,15 @@ double ConvertZoomLevelToZoomFactor(double zoom_level) { |
} |
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; |
+using WebViewKeyToExtensionIDMap = std::map<WebViewKey, std::string>; |
+static base::LazyInstance<WebViewKeyToExtensionIDMap> |
Devlin
2015/07/06 17:46:18
Storing this as global state seems unnecessary (an
|
+ web_view_key_to_extension_id_map = LAZY_INSTANCE_INITIALIZER; |
+ |
} // namespace |
// static |
@@ -234,6 +242,13 @@ void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) { |
// Clean up content scripts for the WebView. |
auto csm = WebViewContentScriptManager::Get(browser_context); |
csm->RemoveAllContentScriptsForWebView(embedder_process_id, view_instance_id); |
+ |
+ // Allow an extensions browser client to potentially perform more cleanup. |
+ ExtensionsBrowserClient::Get()->CleanUpWebView(embedder_process_id, |
+ view_instance_id); |
+ |
+ // Remove this WebView's entry in |web_view_key_to_extension_id_map|. |
+ web_view_key_to_extension_id_map.Get().erase(key); |
} |
// static |
@@ -275,7 +290,7 @@ int WebViewGuest::GetOrGenerateRulesRegistryID( |
if (!is_web_view) |
return RulesRegistryService::kDefaultRulesRegistryID; |
- WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id); |
+ WebViewKey key(embedder_process_id, webview_instance_id); |
auto it = web_view_key_to_id_map.Get().find(key); |
if (it != web_view_key_to_id_map.Get().end()) |
return it->second; |
@@ -297,6 +312,26 @@ int WebViewGuest::GetViewInstanceId(WebContents* contents) { |
return guest->view_instance_id(); |
} |
+// static |
+std::string WebViewGuest::GetExtensionID(int embedder_process_id, |
+ int view_instance_id) { |
+ WebViewKey key(embedder_process_id, view_instance_id); |
+ auto it = web_view_key_to_extension_id_map.Get().find(key); |
+ |
+ if (it == web_view_key_to_extension_id_map.Get().end()) |
+ return ""; |
+ |
+ return it->second; |
+} |
+ |
+// static |
+void WebViewGuest::RegisterExtensionID(const std::string& extension_id, |
+ int embedder_process_id, |
+ int view_instance_id) { |
+ WebViewKey key(embedder_process_id, view_instance_id); |
+ web_view_key_to_extension_id_map.Get()[key] = extension_id; |
+} |
+ |
bool WebViewGuest::CanRunInDetachedState() const { |
return true; |
} |
@@ -434,9 +469,6 @@ int WebViewGuest::GetTaskPrefix() const { |
} |
void WebViewGuest::GuestDestroyed() { |
- // Clean up custom context menu items for this guest. |
- if (web_view_guest_delegate_) |
- web_view_guest_delegate_->OnGuestDestroyed(); |
RemoveWebViewStateFromIOThread(web_contents()); |
} |