Chromium Code Reviews| Index: chrome/browser/apps/web_view_browsertest.cc |
| diff --git a/chrome/browser/apps/web_view_browsertest.cc b/chrome/browser/apps/web_view_browsertest.cc |
| index a859a6caf3f7da5a0ab3f2f3c6782647da4fe880..e97c02120a17e8a0cd0ea8473406685e182d8705 100644 |
| --- a/chrome/browser/apps/web_view_browsertest.cc |
| +++ b/chrome/browser/apps/web_view_browsertest.cc |
| @@ -27,10 +27,15 @@ |
| #include "content/public/test/browser_test_utils.h" |
| #include "content/public/test/fake_speech_recognition_manager.h" |
| #include "content/public/test/test_renderer_host.h" |
| +#include "extensions/browser/api/declarative/rules_registry.h" |
| +#include "extensions/browser/api/declarative/rules_registry_service.h" |
| +#include "extensions/browser/api/declarative/test_rules_registry.h" |
| +#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
| #include "extensions/browser/app_window/native_app_window.h" |
| #include "extensions/browser/guest_view/guest_view_manager.h" |
| #include "extensions/browser/guest_view/guest_view_manager_factory.h" |
| #include "extensions/browser/guest_view/test_guest_view_manager.h" |
| +#include "extensions/browser/guest_view/web_view/web_view_guest.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/extensions_client.h" |
| #include "extensions/test/extension_test_message_listener.h" |
| @@ -119,6 +124,34 @@ class WebContentsHiddenObserver : public content::WebContentsObserver { |
| DISALLOW_COPY_AND_ASSIGN(WebContentsHiddenObserver); |
| }; |
| +class EmbedderWebContentsObserver : public content::WebContentsObserver { |
| + public: |
| + EmbedderWebContentsObserver(content:: WebContents* web_contents) |
| + : WebContentsObserver(web_contents), |
| + event_occur_(false) { |
| + } |
| + |
| + // WebContentsObserver. |
| + void RenderProcessGone(base::TerminationStatus status) override { |
| + event_occur_ = true; |
|
Fady Samuel
2014/11/28 22:02:49
nit: terminated_
Xi Han
2014/11/28 22:24:39
Done.
|
| + if (message_loop_runner_.get()) |
| + message_loop_runner_->Quit(); |
| + } |
| + |
| + void WaitForEmbedderRenderProcessTerminate() { |
| + if (event_occur_) |
| + return; |
| + message_loop_runner_ = new content::MessageLoopRunner; |
| + message_loop_runner_->Run(); |
| + } |
| + |
| + private: |
| + bool event_occur_; |
| + scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); |
| +}; |
| + |
| void ExecuteScriptWaitForTitle(content::WebContents* web_contents, |
| const char* script, |
| const char* title) { |
| @@ -2295,6 +2328,78 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_TestLoadDataAPI) { |
| TestHelper("testLoadDataAPI", "web_view/shim", NEEDS_TEST_SERVER); |
| } |
| +// This test verify that the set of rules registries of a webview will be |
| +// removed from RulesRegistryService after the webview is gone. |
| +IN_PROC_BROWSER_TEST_F(WebViewTest, |
| + Shim_TestRulesRegistryIDAreRemovedAfterWebViewIsGone) { |
| + LoadAppWithGuest("web_view/rules_registry"); |
| + |
| + content::WebContents* embedder_web_contents = GetEmbedderWebContents(); |
| + ASSERT_TRUE(embedder_web_contents); |
| + scoped_ptr<EmbedderWebContentsObserver> observer( |
| + new EmbedderWebContentsObserver(embedder_web_contents)); |
| + |
| + content::WebContents* guest_web_contents = GetGuestWebContents(); |
| + ASSERT_TRUE(guest_web_contents); |
| + extensions::WebViewGuest* guest = |
| + extensions::WebViewGuest::FromWebContents(guest_web_contents); |
| + ASSERT_TRUE(guest); |
| + |
| + // Register rule for the guest. |
| + Profile* profile = browser()->profile(); |
| + int rules_registry_id = |
| + extensions::WebViewGuest::GetOrGenerateRulesRegistryID( |
| + guest->embedder_render_process_id(), |
| + guest->view_instance_id(), |
| + profile); |
| + |
| + extensions::RulesRegistryService* registry_service = |
| + extensions::RulesRegistryService::Get(profile); |
| + extensions::TestRulesRegistry* key = new extensions::TestRulesRegistry( |
|
Fady Samuel
2014/11/28 22:02:49
this is a rules_registry not a key.
Xi Han
2014/11/28 22:24:39
Done.
|
| + content::BrowserThread::UI, "ui", rules_registry_id); |
| + registry_service->RegisterRulesRegistry(make_scoped_refptr(key)); |
| + |
| + EXPECT_TRUE(registry_service->GetRulesRegistry( |
| + rules_registry_id, "ui").get()); |
| + |
| + // Kill the embedder's render process, so the webview will go as well. |
| + content::RenderProcessHost* host = |
| + embedder_web_contents->GetRenderProcessHost(); |
| + base::KillProcess(host->GetHandle(), 0, false); |
| + observer->WaitForEmbedderRenderProcessTerminate(); |
| + |
| + EXPECT_FALSE(registry_service->GetRulesRegistry( |
| + rules_registry_id, "ui").get()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(WebViewTest, Shim_WebViewWebRequestRegistryHasNoCache) { |
| + LoadAppWithGuest("web_view/rules_registry"); |
| + |
| + content::WebContents* guest_web_contents = GetGuestWebContents(); |
| + ASSERT_TRUE(guest_web_contents); |
| + extensions::WebViewGuest* guest = |
| + extensions::WebViewGuest::FromWebContents(guest_web_contents); |
| + ASSERT_TRUE(guest); |
| + |
| + Profile* profile = browser()->profile(); |
| + extensions::RulesRegistryService* registry_service = |
| + extensions::RulesRegistryService::Get(profile); |
| + int rules_registry_id = |
| + extensions::WebViewGuest::GetOrGenerateRulesRegistryID( |
| + guest->embedder_render_process_id(), |
| + guest->view_instance_id(), |
| + profile); |
| + |
| + // Get an existing registered rule for the guest. |
| + extensions::RulesRegistry* registry = |
| + registry_service->GetRulesRegistry( |
| + rules_registry_id, |
| + extensions::declarative_webrequest_constants::kOnRequest).get(); |
| + |
| + EXPECT_TRUE(registry); |
| + EXPECT_FALSE(registry->rules_cache_delegate_for_testing()); |
| +} |
| + |
| // <webview> screenshot capture fails with ubercomp. |
| // See http://crbug.com/327035. |
| IN_PROC_BROWSER_TEST_F(WebViewCaptureTest, |