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