Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: extensions/browser/guest_view/web_view/web_view_guest.cc

Issue 764643002: Remove WebViewKey in rules registry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Renaming move "remove rules registry for webview" part to WebViewGuest. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e27039b6013c936071b622a62f2f8edb9a0e304f..461804153271528d00979321a3333f14dc46fd24 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -30,6 +30,7 @@
#include "content/public/common/result_codes.h"
#include "content/public/common/stop_find_action.h"
#include "content/public/common/url_constants.h"
+#include "extensions/browser/api/declarative/rules_registry_service.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/api/web_request/web_request_api.h"
#include "extensions/browser/api/web_view/web_view_internal_api.h"
@@ -180,6 +181,35 @@ bool WebViewGuest::GetGuestPartitionConfigForSite(
// static
const char WebViewGuest::Type[] = "webview";
+typedef std::pair<int, int> WebViewKey;
+typedef std::map<WebViewKey, int> WebViewKeyToIDMap;
+typedef std::map<int, WebViewKey> IDToWebViewKeyMap;
+static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map =
+ LAZY_INSTANCE_INITIALIZER;
+static base::LazyInstance<IDToWebViewKeyMap> id_to_web_view_key_map =
+ LAZY_INSTANCE_INITIALIZER;
+
+// static
+int WebViewGuest::GetOrGenerateRulesRegistryID(
+ int embedder_process_id,
+ int webview_instance_id,
+ content::BrowserContext* browser_context) {
+ bool is_web_view = embedder_process_id && webview_instance_id;
+ if (!is_web_view)
+ return RulesRegistryService::kDefaultRulesRegistryID;
+
+ WebViewKey key = std::make_pair(embedder_process_id, webview_instance_id);
+ WebViewKeyToIDMap::iterator it = web_view_key_to_id_map.Get().find(key);
Fady Samuel 2014/11/28 11:34:24 nit: Use auto. auto it = web_view_key_to_id_map.G
Xi Han 2014/11/28 16:12:56 Done. Do we use auto whenever possible?
+ if (it != web_view_key_to_id_map.Get().end()) {
Fady Samuel 2014/11/28 11:34:25 No need for a new block.
Xi Han 2014/11/28 16:12:56 Done.
+ return it->second;
+ }
+ int rules_registry_id =
+ RulesRegistryService::Get(browser_context)->GetNextRulesRegistryID();
+ web_view_key_to_id_map.Get()[key] = rules_registry_id;
+ id_to_web_view_key_map.Get()[rules_registry_id] = key;
+ return rules_registry_id;
+}
+
// static
int WebViewGuest::GetViewInstanceId(WebContents* contents) {
WebViewGuest* guest = FromWebContents(contents);
@@ -347,6 +377,16 @@ void WebViewGuest::EmbedderWillBeDestroyed() {
if (web_view_guest_delegate_)
web_view_guest_delegate_->OnEmbedderWillBeDestroyed();
+ // Clean up rules registries for the webview.
+ RulesRegistryService::Get(browser_context())
+ ->RemoveRulesRegistryID(rules_registry_id_);
+ IDToWebViewKeyMap::iterator it =
+ id_to_web_view_key_map.Get().find(rules_registry_id_);
Fady Samuel 2014/11/28 11:34:25 Hmm, I don't think we need IDToWebViewKeyMap? A We
Xi Han 2014/11/28 16:12:56 You are right. It was used before I move the "remo
+ if (it != id_to_web_view_key_map.Get().end()) {
+ web_view_key_to_id_map.Get().erase(it->second);
+ id_to_web_view_key_map.Get().erase(it);
+ }
+
content::BrowserThread::PostTask(
content::BrowserThread::IO,
FROM_HERE,
@@ -668,6 +708,7 @@ bool WebViewGuest::ClearData(const base::Time remove_since,
WebViewGuest::WebViewGuest(content::BrowserContext* browser_context,
int guest_instance_id)
: GuestView<WebViewGuest>(browser_context, guest_instance_id),
+ rules_registry_id_(0),
Fady Samuel 2014/11/28 11:34:24 Use the kDefaultRulesRegistryID constant here?
Xi Han 2014/11/28 16:12:56 Define kInvalidRulesRegistryID in RulesRegistrySer
find_helper_(this),
is_overriding_user_agent_(false),
guest_opaque_(true),
@@ -812,6 +853,7 @@ void WebViewGuest::PushWebViewStateToIOThread() {
web_view_info.instance_id = view_instance_id();
web_view_info.partition_id = partition_id;
web_view_info.embedder_extension_id = embedder_extension_id();
+ web_view_info.rules_registry_id = rules_registry_id_;
content::BrowserThread::PostTask(
content::BrowserThread::IO,
@@ -884,6 +926,13 @@ void WebViewGuest::RequestPointerLockPermission(
}
void WebViewGuest::WillAttachToEmbedder() {
+ int embedder_process_id =
+ embedder_web_contents()->GetRenderProcessHost()->GetID();
+ WebViewKey key(embedder_process_id, view_instance_id());
+ WebViewKeyToIDMap::iterator it = web_view_key_to_id_map.Get().find(key);
+ if (it != web_view_key_to_id_map.Get().end())
+ rules_registry_id_ = web_view_key_to_id_map.Get().find(key)->second;
Fady Samuel 2014/11/28 11:34:25 Hmm, what if add rules after attachment? I feel l
Xi Han 2014/11/28 16:12:56 This is a good point. Updated.
+
// We must install the mapping from guests to WebViews prior to resuming
// suspended resource loads so that the WebRequest API will catch resource
// requests.

Powered by Google App Engine
This is Rietveld 408576698