Index: chrome/browser/extensions/service_worker_apitest.cc |
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc |
index 68c6e0a9789a47525be737054d08d074f4a80182..aff4ef385b35fe1bb8235c7bfeac4d741d3db148 100644 |
--- a/chrome/browser/extensions/service_worker_apitest.cc |
+++ b/chrome/browser/extensions/service_worker_apitest.cc |
@@ -31,6 +31,7 @@ |
#include "extensions/browser/process_manager.h" |
#include "extensions/test/background_page_watcher.h" |
#include "extensions/test/extension_test_message_listener.h" |
+#include "net/dns/mock_host_resolver.h" |
#include "net/test/embedded_test_server/embedded_test_server.h" |
namespace extensions { |
@@ -674,6 +675,64 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerTest, WebAccessibleResourcesIframeSrc) { |
EXPECT_EQ("FROM_SW_RESOURCE", result); |
} |
+// Tests that service worker serves resources even if they are embedded in an |
+// insecure context. |
+IN_PROC_BROWSER_TEST_F(ServiceWorkerTest, |
+ WebAccessibleResourcesInsecureIframe) { |
+ const Extension* extension = LoadExtensionWithFlags( |
+ test_data_dir_.AppendASCII( |
+ "service_worker/web_accessible_resources/iframe_src"), |
+ kFlagNone); |
+ ASSERT_TRUE(extension); |
+ ASSERT_TRUE(StartEmbeddedTestServer()); |
+ host_resolver()->AddRule("a.com", "127.0.0.1"); |
+ GURL page_url = |
+ embedded_test_server()->GetURL("a.com", |
+ "/extensions/api_test/service_worker/" |
+ "web_accessible_resources/webpage.html"); |
+ GURL::Replacements replace_host_and_scheme; |
+ replace_host_and_scheme.SetHostStr("a.com"); |
+ replace_host_and_scheme.SetSchemeStr("http"); |
+ page_url = page_url.ReplaceComponents(replace_host_and_scheme); |
falken
2016/06/06 06:38:13
Oops, I meant to delete the use of GURL::Replaceme
|
+ |
+ content::WebContents* web_contents = AddTab(browser(), page_url); |
+ std::string result; |
+ // webpage.html will create an iframe pointing to a resource from |extension|. |
+ // Expect the resource to be served by the extension. |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString( |
+ web_contents, base::StringPrintf("window.testIframe('%s', 'iframe.html')", |
+ extension->id().c_str()), |
+ &result)); |
+ EXPECT_EQ("FROM_EXTENSION_RESOURCE", result); |
+ |
+ ExtensionTestMessageListener service_worker_ready_listener("SW_READY", false); |
+ EXPECT_TRUE(ExecuteScriptInBackgroundPageNoWait( |
+ extension->id(), "window.registerServiceWorker()")); |
+ EXPECT_TRUE(service_worker_ready_listener.WaitUntilSatisfied()); |
+ |
+ result.clear(); |
+ // webpage.html will create another iframe pointing to a resource from |
+ // |extension| as before. But this time, the resource should be be served |
+ // from the Service Worker. |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString( |
+ web_contents, base::StringPrintf("window.testIframe('%s', 'iframe.html')", |
+ extension->id().c_str()), |
+ &result)); |
+ EXPECT_EQ("FROM_SW_RESOURCE", result); |
+ |
+ result.clear(); |
+ // webpage.html will create yet another iframe pointing to a resource that |
+ // exists in the extension manifest's web_accessible_resources, but is not |
+ // present in the extension directory. Expect the resources of the iframe to |
+ // be served by the Service Worker. |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString( |
+ web_contents, |
+ base::StringPrintf("window.testIframe('%s', 'iframe_non_existent.html')", |
+ extension->id().c_str()), |
+ &result)); |
+ EXPECT_EQ("FROM_SW_RESOURCE", result); |
+} |
+ |
IN_PROC_BROWSER_TEST_F(ServiceWorkerBackgroundSyncTest, Sync) { |
const Extension* extension = LoadExtensionWithFlags( |
test_data_dir_.AppendASCII("service_worker/sync"), kFlagNone); |