diff options
Diffstat (limited to 'extensions/browser')
5 files changed, 31 insertions, 18 deletions
diff --git a/extensions/browser/api/declarative/rules_registry_service.cc b/extensions/browser/api/declarative/rules_registry_service.cc index 939b01e..bca6fd5 100644 --- a/extensions/browser/api/declarative/rules_registry_service.cc +++ b/extensions/browser/api/declarative/rules_registry_service.cc @@ -137,6 +137,13 @@ RulesRegistryService* RulesRegistryService::Get( return BrowserContextKeyedAPIFactory<RulesRegistryService>::Get(context); } +// static +RulesRegistryService* RulesRegistryService::GetIfExists( + content::BrowserContext* context) { + return BrowserContextKeyedAPIFactory<RulesRegistryService>::GetIfExists( + context); +} + void RulesRegistryService::RegisterRulesRegistry( scoped_refptr<RulesRegistry> rule_registry) { const std::string event_name(rule_registry->event_name()); diff --git a/extensions/browser/api/declarative/rules_registry_service.h b/extensions/browser/api/declarative/rules_registry_service.h index f03adba..8f16cb2 100644 --- a/extensions/browser/api/declarative/rules_registry_service.h +++ b/extensions/browser/api/declarative/rules_registry_service.h @@ -61,9 +61,15 @@ class RulesRegistryService : public BrowserContextKeyedAPI, static BrowserContextKeyedAPIFactory<RulesRegistryService>* GetFactoryInstance(); - // Convenience method to get the RulesRegistryService for a context. + // Convenience method to get the RulesRegistryService for a context. If a + // RulesRegistryService does not already exist for |context|, one will be + // created and returned. static RulesRegistryService* Get(content::BrowserContext* context); + // The same as Get(), except that if a RulesRegistryService does not already + // exist for |context|, nullptr is returned. + static RulesRegistryService* GetIfExists(content::BrowserContext* context); + int GetNextRulesRegistryID(); // Registers the default RulesRegistries used in Chromium. diff --git a/extensions/browser/browser_context_keyed_api_factory.h b/extensions/browser/browser_context_keyed_api_factory.h index fc0add2..ad87e22 100644 --- a/extensions/browser/browser_context_keyed_api_factory.h +++ b/extensions/browser/browser_context_keyed_api_factory.h @@ -76,6 +76,11 @@ class BrowserContextKeyedAPIFactory : public BrowserContextKeyedServiceFactory { T::GetFactoryInstance()->GetServiceForBrowserContext(context, true)); } + static T* GetIfExists(content::BrowserContext* context) { + return static_cast<T*>( + T::GetFactoryInstance()->GetServiceForBrowserContext(context, false)); + } + // Declare dependencies on other factories. // By default, ExtensionSystemFactory is the only dependency; however, // specializations can override this. Declare your specialization in 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 63d2275..4ab87e2 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.cc +++ b/extensions/browser/guest_view/web_view/web_view_guest.cc @@ -198,20 +198,11 @@ static base::LazyInstance<WebViewKeyToIDMap> web_view_key_to_id_map = } // namespace // static -void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) { - GuestViewBase::CleanUp(embedder_process_id, view_instance_id); - - auto rph = content::RenderProcessHost::FromID(embedder_process_id); - // TODO(paulmeyer): It should be impossible for rph to be nullptr here, but - // this check is needed here for now as there seems to be occasional crashes - // because of this (http//crbug.com/499438). This should be removed once the - // cause is discovered and fixed. - DCHECK(rph != nullptr) - << "Cannot find RenderProcessHost for embedder process ID# " - << embedder_process_id; - if (rph == nullptr) - return; - auto browser_context = rph->GetBrowserContext(); +void WebViewGuest::CleanUp(content::BrowserContext* browser_context, + int embedder_process_id, + int view_instance_id) { + GuestViewBase::CleanUp(browser_context, embedder_process_id, + view_instance_id); // Clean up rules registries for the WebView. WebViewKey key(embedder_process_id, view_instance_id); @@ -219,8 +210,10 @@ void WebViewGuest::CleanUp(int embedder_process_id, int view_instance_id) { if (it != web_view_key_to_id_map.Get().end()) { auto rules_registry_id = it->second; web_view_key_to_id_map.Get().erase(it); - RulesRegistryService::Get(browser_context) - ->RemoveRulesRegistriesByID(rules_registry_id); + RulesRegistryService* rrs = + RulesRegistryService::GetIfExists(browser_context); + if (rrs) + rrs->RemoveRulesRegistriesByID(rules_registry_id); } // Clean up web request event listeners for the WebView. diff --git a/extensions/browser/guest_view/web_view/web_view_guest.h b/extensions/browser/guest_view/web_view/web_view_guest.h index 3014f92..d19ddf8 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.h +++ b/extensions/browser/guest_view/web_view/web_view_guest.h @@ -42,7 +42,9 @@ class WebViewGuest : public guest_view::GuestView<WebViewGuest>, public: // Clean up state when this GuestView is being destroyed. See // GuestViewBase::CleanUp(). - static void CleanUp(int embedder_process_id, int view_instance_id); + static void CleanUp(content::BrowserContext* browser_context, + int embedder_process_id, + int view_instance_id); static GuestViewBase* Create(content::WebContents* owner_web_contents); |
