OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file tests that Service Workers (a Content feature) work in the Chromium | 5 // This file tests that Service Workers (a Content feature) work in the Chromium |
6 // embedder. | 6 // embedder. |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | |
9 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
10 #include "base/numerics/safe_conversions.h" | 11 #include "base/numerics/safe_conversions.h" |
11 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
13 #include "base/strings/stringprintf.h" | |
14 #include "base/strings/utf_string_conversions.h" | |
12 #include "chrome/browser/chrome_notification_types.h" | 15 #include "chrome/browser/chrome_notification_types.h" |
13 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/ui/browser.h" | 17 #include "chrome/browser/ui/browser.h" |
15 #include "chrome/browser/ui/browser_window.h" | 18 #include "chrome/browser/ui/browser_window.h" |
16 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 19 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
20 #include "chrome/common/chrome_switches.h" | |
17 #include "chrome/test/base/in_process_browser_test.h" | 21 #include "chrome/test/base/in_process_browser_test.h" |
18 #include "chrome/test/base/ui_test_utils.h" | 22 #include "chrome/test/base/ui_test_utils.h" |
19 #include "content/public/browser/browser_context.h" | 23 #include "content/public/browser/browser_context.h" |
24 #include "content/public/browser/render_frame_host.h" | |
20 #include "content/public/browser/service_worker_context.h" | 25 #include "content/public/browser/service_worker_context.h" |
21 #include "content/public/browser/storage_partition.h" | 26 #include "content/public/browser/storage_partition.h" |
22 #include "content/public/browser/web_contents.h" | 27 #include "content/public/browser/web_contents.h" |
28 #include "content/public/test/browser_test_utils.h" | |
23 #include "net/test/embedded_test_server/embedded_test_server.h" | 29 #include "net/test/embedded_test_server/embedded_test_server.h" |
30 #include "ppapi/shared_impl/ppapi_switches.h" | |
24 | 31 |
25 namespace { | 32 namespace { |
26 | 33 |
27 class ChromeServiceWorkerTest : public InProcessBrowserTest { | 34 class ChromeServiceWorkerTest : public InProcessBrowserTest { |
28 protected: | 35 protected: |
29 ChromeServiceWorkerTest() { | 36 ChromeServiceWorkerTest() { |
30 EXPECT_TRUE(service_worker_dir_.CreateUniqueTempDir()); | 37 EXPECT_TRUE(service_worker_dir_.CreateUniqueTempDir()); |
31 } | 38 } |
32 | 39 |
33 void WriteFile(const base::FilePath::StringType& filename, | 40 void WriteFile(const base::FilePath::StringType& filename, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
102 embedded_test_server()->GetURL("/test.html")); | 109 embedded_test_server()->GetURL("/test.html")); |
103 | 110 |
104 content::WindowedNotificationObserver observer( | 111 content::WindowedNotificationObserver observer( |
105 chrome::NOTIFICATION_BROWSER_CLOSED, content::Source<Browser>(incognito)); | 112 chrome::NOTIFICATION_BROWSER_CLOSED, content::Source<Browser>(incognito)); |
106 incognito->window()->Close(); | 113 incognito->window()->Close(); |
107 observer.Wait(); | 114 observer.Wait(); |
108 | 115 |
109 // Test passes if we don't crash. | 116 // Test passes if we don't crash. |
110 } | 117 } |
111 | 118 |
119 class ChromeServiceWorkerFetchTest : public ChromeServiceWorkerTest { | |
120 protected: | |
121 ChromeServiceWorkerFetchTest() {} | |
jochen (gone - plz use gerrit)
2016/02/17 11:01:04
please also add a virtual dtor
horo
2016/02/18 03:41:58
Done.
| |
122 | |
123 void SetUpOnMainThread() override { | |
124 WriteServiceWorkerFetchTestFiles(); | |
125 embedded_test_server()->ServeFilesFromDirectory(service_worker_dir_.path()); | |
126 ASSERT_TRUE(embedded_test_server()->Start()); | |
127 InitializeServiceWorkerFetchTestPage(); | |
128 } | |
129 | |
130 std::string ExecuteScriptAndExtractString(const std::string& js) { | |
131 std::string result; | |
132 EXPECT_TRUE(content::ExecuteScriptAndExtractString( | |
133 browser()->tab_strip_model()->GetActiveWebContents(), js, &result)); | |
134 return result; | |
135 } | |
136 | |
137 std::string RequestString(const std::string& url, | |
138 const std::string& mode, | |
139 const std::string& credentials) const { | |
140 return base::StringPrintf("url:%s, mode:%s, credentials:%s\n", url.c_str(), | |
141 mode.c_str(), credentials.c_str()); | |
142 } | |
143 | |
144 std::string GetURL(const std::string& relative_url) const { | |
145 return embedded_test_server()->GetURL(relative_url).spec(); | |
146 } | |
147 | |
148 private: | |
149 void WriteServiceWorkerFetchTestFiles() { | |
150 WriteFile(FILE_PATH_LITERAL("sw.js"), | |
151 "this.onactivate = function(event) {" | |
152 " event.waitUntil(self.clients.claim());" | |
153 "};" | |
154 "this.onfetch = function(event) {" | |
155 " event.respondWith(" | |
156 " self.clients.matchAll().then(function(clients) {" | |
157 " clients.forEach(function(client) {" | |
158 " client.postMessage(" | |
159 " 'url:' + event.request.url + ', ' +" | |
160 " 'mode:' + event.request.mode + ', ' +" | |
161 " 'credentials:' + event.request.credentials" | |
162 " );" | |
163 " });" | |
164 " return fetch(event.request);" | |
165 " }));" | |
166 "};"); | |
167 WriteFile(FILE_PATH_LITERAL("test.html"), | |
168 "<script>" | |
169 "navigator.serviceWorker.register('./sw.js', {scope: './'})" | |
170 " .then(function(reg) {" | |
171 " reg.addEventListener('updatefound', function() {" | |
172 " var worker = reg.installing;" | |
173 " worker.addEventListener('statechange', function() {" | |
174 " if (worker.state == 'activated')" | |
175 " document.title = 'READY';" | |
176 " });" | |
177 " });" | |
178 " });" | |
179 "var reportOnFetch = true;" | |
180 "var issuedRequests = [];" | |
181 "function reportRequests() {" | |
182 " var str = '';" | |
183 " issuedRequests.forEach(function(data) {" | |
184 " str += data + '\\n';" | |
185 " });" | |
186 " window.domAutomationController.setAutomationId(0);" | |
187 " window.domAutomationController.send(str);" | |
188 "}" | |
189 "navigator.serviceWorker.addEventListener(" | |
190 " 'message'," | |
191 " function(event) {" | |
192 " issuedRequests.push(event.data);" | |
193 " if (reportOnFetch) {" | |
194 " reportRequests();" | |
195 " }" | |
196 " }, false);" | |
197 "</script>"); | |
198 } | |
199 | |
200 void InitializeServiceWorkerFetchTestPage() { | |
201 // The message "READY" will be sent when the service worker is activated. | |
202 const base::string16 expected_title = base::ASCIIToUTF16("READY"); | |
203 content::TitleWatcher title_watcher( | |
204 browser()->tab_strip_model()->GetActiveWebContents(), expected_title); | |
205 ui_test_utils::NavigateToURL(browser(), | |
206 embedded_test_server()->GetURL("/test.html")); | |
207 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); | |
208 } | |
209 }; | |
jochen (gone - plz use gerrit)
2016/02/17 11:01:04
private: disallow copy/assign
horo
2016/02/18 03:41:58
Done.
| |
210 | |
211 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchTest, EmbedPdfSameOrigin) { | |
212 // <embed src="test.pdf"> | |
213 const std::string result(ExecuteScriptAndExtractString( | |
214 "var embed = document.createElement('embed');" | |
215 "embed.src = 'test.pdf';" | |
216 "document.body.appendChild(embed);")); | |
217 EXPECT_EQ(RequestString(GetURL("/test.pdf"), "no-cors", "include"), result); | |
218 } | |
219 | |
220 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchTest, EmbedPdfOtherOrigin) { | |
221 // <embed src="https://www.example.com/test.pdf"> | |
222 const std::string result(ExecuteScriptAndExtractString( | |
223 "var embed = document.createElement('embed');" | |
224 "embed.src = 'https://www.example.com/test.pdf';" | |
225 "document.body.appendChild(embed);")); | |
226 EXPECT_EQ( | |
227 RequestString("https://www.example.com/test.pdf", "no-cors", "include"), | |
228 result); | |
229 } | |
230 | |
231 class ChromeServiceWorkerManifestFetchTest | |
232 : public ChromeServiceWorkerFetchTest { | |
233 protected: | |
234 ChromeServiceWorkerManifestFetchTest() {} | |
jochen (gone - plz use gerrit)
2016/02/17 11:01:04
also add dtor
horo
2016/02/18 03:41:58
Done.
| |
235 | |
236 void SetUpCommandLine(base::CommandLine* command_line) override { | |
237 ChromeServiceWorkerFetchTest::SetUpCommandLine(command_line); | |
238 command_line->AppendSwitch(switches::kEnableAddToShelf); | |
239 } | |
240 | |
241 std::string ExecuteManifestFetchTest(const std::string& url, | |
242 const std::string& cross_origin) { | |
243 std::string js( | |
244 base::StringPrintf("reportOnFetch = false;" | |
245 "var link = document.createElement('link');" | |
246 "link.rel = 'manifest';" | |
247 "link.href = '%s';", | |
248 url.c_str())); | |
249 if (!cross_origin.empty()) { | |
250 js += | |
251 base::StringPrintf("link.crossOrigin = '%s';", cross_origin.c_str()); | |
252 } | |
253 js += "document.head.appendChild(link);"; | |
254 ExecuteJavaScriptForTests(js); | |
255 return RequestAppBannerAndGetIssuedRequests(); | |
256 } | |
257 | |
258 private: | |
259 void ExecuteJavaScriptForTests(const std::string& js) { | |
260 browser() | |
261 ->tab_strip_model() | |
262 ->GetActiveWebContents() | |
263 ->GetMainFrame() | |
264 ->ExecuteJavaScriptForTests(base::ASCIIToUTF16(js)); | |
265 } | |
266 | |
267 std::string RequestAppBannerAndGetIssuedRequests() { | |
268 EXPECT_TRUE(browser()->RequestAppBanner( | |
269 browser()->tab_strip_model()->GetActiveWebContents())); | |
270 return ExecuteScriptAndExtractString( | |
271 "if (issuedRequests.length != 0) reportRequests();" | |
272 "else reportOnFetch = true;"); | |
273 } | |
274 }; | |
jochen (gone - plz use gerrit)
2016/02/17 11:01:04
disallow copy/assign
horo
2016/02/18 03:41:58
Done.
| |
275 | |
276 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerManifestFetchTest, SameOrigin) { | |
277 // <link rel="manifest" href="manifest.json"> | |
278 EXPECT_EQ(RequestString(GetURL("/manifest.json"), "cors", "same-origin"), | |
279 ExecuteManifestFetchTest("manifest.json", "")); | |
280 } | |
281 | |
282 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerManifestFetchTest, | |
283 SameOriginUseCredentials) { | |
284 // <link rel="manifest" href="manifest.json" crossorigin="use-credentials"> | |
285 EXPECT_EQ(RequestString(GetURL("/manifest.json"), "cors", "include"), | |
286 ExecuteManifestFetchTest("manifest.json", "use-credentials")); | |
287 } | |
288 | |
289 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerManifestFetchTest, OtherOrigin) { | |
290 // <link rel="manifest" href="https://www.example.com/manifest.json"> | |
291 EXPECT_EQ( | |
292 RequestString("https://www.example.com/manifest.json", "cors", | |
293 "same-origin"), | |
294 ExecuteManifestFetchTest("https://www.example.com/manifest.json", "")); | |
295 } | |
296 | |
297 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerManifestFetchTest, | |
298 OtherOriginUseCredentials) { | |
299 // <link rel="manifest" href="https://www.example.com/manifest.json" | |
300 // crossorigin="use-credentials"> | |
301 EXPECT_EQ( | |
302 RequestString("https://www.example.com/manifest.json", "cors", "include"), | |
303 ExecuteManifestFetchTest("https://www.example.com/manifest.json", | |
304 "use-credentials")); | |
305 } | |
306 | |
307 class ChromeServiceWorkerFetchPPAPITest : public ChromeServiceWorkerFetchTest { | |
308 protected: | |
309 ChromeServiceWorkerFetchPPAPITest() {} | |
jochen (gone - plz use gerrit)
2016/02/17 11:01:04
same here
horo
2016/02/18 03:41:58
Done.
| |
310 | |
311 void SetUpOnMainThread() override { | |
312 base::FilePath document_root; | |
313 ASSERT_TRUE(ui_test_utils::GetRelativeBuildDirectory(&document_root)); | |
314 embedded_test_server()->AddDefaultHandlers( | |
315 document_root.Append(FILE_PATH_LITERAL("nacl_test_data")) | |
316 .Append(FILE_PATH_LITERAL("pnacl"))); | |
317 ChromeServiceWorkerFetchTest::SetUpOnMainThread(); | |
318 test_page_url_ = GetURL("/pnacl_url_loader.html"); | |
319 } | |
320 | |
321 std::string GetRequestStringForPNACL() const { | |
322 return RequestString(test_page_url_, "navigate", "include") + | |
323 RequestString(GetURL("/pnacl_url_loader.nmf"), "same-origin", | |
324 "include") + | |
325 RequestString(GetURL("/pnacl_url_loader_newlib_pnacl.pexe"), | |
326 "same-origin", "include"); | |
327 } | |
328 | |
329 std::string ExecutePNACLUrlLoaderTest(const std::string& mode) { | |
330 std::string result(ExecuteScriptAndExtractString( | |
331 base::StringPrintf("reportOnFetch = false;" | |
332 "var iframe = document.createElement('iframe');" | |
333 "iframe.src='%s#%s';" | |
334 "document.body.appendChild(iframe);", | |
335 test_page_url_.c_str(), mode.c_str()))); | |
336 EXPECT_EQ(base::StringPrintf("OnOpen%s", mode.c_str()), result); | |
337 return ExecuteScriptAndExtractString("reportRequests();"); | |
338 } | |
339 | |
340 private: | |
341 std::string test_page_url_; | |
342 }; | |
343 | |
344 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, SameOrigin) { | |
345 // In pnacl_url_loader.cc: | |
346 // request.SetMethod("GET"); | |
347 // request.SetURL("/echo"); | |
348 EXPECT_EQ(GetRequestStringForPNACL() + | |
349 RequestString(GetURL("/echo"), "same-origin", "include"), | |
350 ExecutePNACLUrlLoaderTest("Same")); | |
351 } | |
352 | |
353 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, SameOriginCORS) { | |
354 // In pnacl_url_loader.cc: | |
355 // request.SetMethod("GET"); | |
356 // request.SetURL("/echo"); | |
357 // request.SetAllowCrossOriginRequests(true); | |
358 EXPECT_EQ(GetRequestStringForPNACL() + | |
359 RequestString(GetURL("/echo"), "cors", "same-origin"), | |
360 ExecutePNACLUrlLoaderTest("SameCORS")); | |
361 } | |
362 | |
363 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, | |
364 SameOriginCredentials) { | |
365 // In pnacl_url_loader.cc: | |
366 // request.SetMethod("GET"); | |
367 // request.SetURL("/echo"); | |
368 // request.SetAllowCredentials(true); | |
369 EXPECT_EQ(GetRequestStringForPNACL() + | |
370 RequestString(GetURL("/echo"), "same-origin", "include"), | |
371 ExecutePNACLUrlLoaderTest("SameCredentials")); | |
372 } | |
373 | |
374 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, | |
375 SameOriginCORSCredentials) { | |
376 // In pnacl_url_loader.cc: | |
377 // request.SetMethod("GET"); | |
378 // request.SetURL("/echo"); | |
379 // request.SetAllowCrossOriginRequests(true); | |
380 // request.SetAllowCredentials(true); | |
381 EXPECT_EQ(GetRequestStringForPNACL() + | |
382 RequestString(GetURL("/echo"), "cors", "include"), | |
383 ExecutePNACLUrlLoaderTest("SameCORSCredentials")); | |
384 } | |
385 | |
386 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, OtherOrigin) { | |
387 // In pnacl_url_loader.cc: | |
388 // request.SetMethod("GET"); | |
389 // request.SetURL("https://www.example.com/echo"); | |
390 // This request fails because AllowCrossOriginRequests is not set. | |
391 EXPECT_EQ(GetRequestStringForPNACL(), ExecutePNACLUrlLoaderTest("Other")); | |
392 } | |
393 | |
394 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, OtherOriginCORS) { | |
395 // In pnacl_url_loader.cc: | |
396 // request.SetMethod("GET"); | |
397 // request.SetURL("https://www.example.com/echo"); | |
398 // request.SetAllowCrossOriginRequests(true); | |
399 EXPECT_EQ( | |
400 GetRequestStringForPNACL() + | |
401 RequestString("https://www.example.com/echo", "cors", "same-origin"), | |
402 ExecutePNACLUrlLoaderTest("OtherCORS")); | |
403 } | |
404 | |
405 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, | |
406 OtherOriginCredentials) { | |
407 // In pnacl_url_loader.cc: | |
408 // request.SetMethod("GET"); | |
409 // request.SetURL("https://www.example.com/echo"); | |
410 // request.SetAllowCredentials(true); | |
411 // This request fails because AllowCrossOriginRequests is not set. | |
412 EXPECT_EQ(GetRequestStringForPNACL(), | |
413 ExecutePNACLUrlLoaderTest("OtherCredentials")); | |
414 } | |
415 | |
416 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPITest, | |
417 OtherOriginCORSCredentials) { | |
418 // In pnacl_url_loader.cc: | |
419 // request.SetMethod("GET"); | |
420 // request.SetURL("https://www.example.com/echo"); | |
421 // request.SetAllowCrossOriginRequests(true); | |
422 // request.SetAllowCredentials(true); | |
423 EXPECT_EQ( | |
424 GetRequestStringForPNACL() + | |
425 RequestString("https://www.example.com/echo", "cors", "include"), | |
426 ExecutePNACLUrlLoaderTest("OtherCORSCredentials")); | |
427 } | |
428 | |
429 class ChromeServiceWorkerFetchPPAPIPrivateTest | |
430 : public ChromeServiceWorkerFetchPPAPITest { | |
431 protected: | |
432 ChromeServiceWorkerFetchPPAPIPrivateTest() {} | |
jochen (gone - plz use gerrit)
2016/02/17 11:01:04
and here
horo
2016/02/18 03:41:58
Done.
| |
433 | |
434 void SetUpCommandLine(base::CommandLine* command_line) override { | |
435 ChromeServiceWorkerFetchPPAPITest::SetUpCommandLine(command_line); | |
436 // Sets this flag to test that the fetch request from the plugins with | |
437 // private permission (PERMISSION_PRIVATE) should not go to the service | |
438 // worker. | |
439 command_line->AppendSwitch(switches::kEnablePepperTesting); | |
440 } | |
441 }; | |
442 | |
443 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, SameOrigin) { | |
444 EXPECT_EQ(GetRequestStringForPNACL(), ExecutePNACLUrlLoaderTest("Same")); | |
445 } | |
446 | |
447 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, | |
448 SameOriginCORS) { | |
449 EXPECT_EQ(GetRequestStringForPNACL(), ExecutePNACLUrlLoaderTest("SameCORS")); | |
450 } | |
451 | |
452 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, | |
453 SameOriginCredentials) { | |
454 EXPECT_EQ(GetRequestStringForPNACL(), | |
455 ExecutePNACLUrlLoaderTest("SameCredentials")); | |
456 } | |
457 | |
458 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, | |
459 SameOriginCORSCredentials) { | |
460 EXPECT_EQ(GetRequestStringForPNACL(), | |
461 ExecutePNACLUrlLoaderTest("SameCORSCredentials")); | |
462 } | |
463 | |
464 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, OtherOrigin) { | |
465 EXPECT_EQ(GetRequestStringForPNACL(), ExecutePNACLUrlLoaderTest("Other")); | |
466 } | |
467 | |
468 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, | |
469 OtherOriginCORS) { | |
470 EXPECT_EQ(GetRequestStringForPNACL(), ExecutePNACLUrlLoaderTest("OtherCORS")); | |
471 } | |
472 | |
473 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, | |
474 OtherOriginCredentials) { | |
475 EXPECT_EQ(GetRequestStringForPNACL(), | |
476 ExecutePNACLUrlLoaderTest("OtherCredentials")); | |
477 } | |
478 | |
479 IN_PROC_BROWSER_TEST_F(ChromeServiceWorkerFetchPPAPIPrivateTest, | |
480 OtherOriginCORSCredentials) { | |
481 EXPECT_EQ(GetRequestStringForPNACL(), | |
482 ExecutePNACLUrlLoaderTest("OtherCORSCredentials")); | |
483 } | |
484 | |
112 } // namespace | 485 } // namespace |
OLD | NEW |