blob: 83ecbc55d7898749d4b484a0380732f157f94901 [file] [log] [blame]
annekao38685502015-07-14 17:46:391// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
avia2f4804a2015-12-24 23:11:135#include <stdint.h>
6
kalman6f984ae2015-09-18 17:21:587#include "base/bind_helpers.h"
avia2f4804a2015-12-24 23:11:138#include "base/macros.h"
Gabriel Charette078e3662017-08-28 22:59:049#include "base/run_loop.h"
kalman6f984ae2015-09-18 17:21:5810#include "base/strings/stringprintf.h"
horo1eeddde2015-11-19 05:59:2511#include "base/strings/utf_string_conversions.h"
jam3f2d3932017-04-26 20:28:5112#include "base/threading/thread_restrictions.h"
Olga Sharonova3e13cd92018-02-08 16:43:5613#include "build/build_config.h"
annekao38685502015-07-14 17:46:3914#include "chrome/browser/extensions/extension_apitest.h"
rdevlin.croninf5863da2015-09-10 19:21:4515#include "chrome/browser/extensions/extension_service.h"
Istiaque Ahmed805f6a83b2017-10-05 01:23:2616#include "chrome/browser/extensions/lazy_background_page_test_util.h"
peter9f4490a2017-01-27 00:58:3617#include "chrome/browser/gcm/gcm_profile_service_factory.h"
lazyboy561b7de2015-11-19 19:27:3018#include "chrome/browser/notifications/desktop_notification_profile_util.h"
miguelg9b502862017-04-24 18:13:5319#include "chrome/browser/notifications/notification_display_service_factory.h"
20#include "chrome/browser/notifications/stub_notification_display_service.h"
lshang106c1772016-06-06 01:43:2321#include "chrome/browser/permissions/permission_manager.h"
timlohc6911802017-03-01 05:37:0322#include "chrome/browser/permissions/permission_result.h"
lazyboy561b7de2015-11-19 19:27:3023#include "chrome/browser/push_messaging/push_messaging_app_identifier.h"
24#include "chrome/browser/push_messaging/push_messaging_service_factory.h"
25#include "chrome/browser/push_messaging/push_messaging_service_impl.h"
annekao1db36fd2015-07-29 17:09:1626#include "chrome/browser/ui/tabs/tab_strip_model.h"
Elly Fong-Jones4a4f21d2018-05-30 15:04:1627#include "chrome/browser/ui/views_mode_controller.h"
Trent Apted4267b942017-10-27 03:25:3628#include "chrome/common/chrome_switches.h"
rdevlin.croninf5863da2015-09-10 19:21:4529#include "chrome/test/base/ui_test_utils.h"
timloh9a180ad2017-02-20 07:15:2330#include "components/content_settings/core/common/content_settings_types.h"
Peter Beverloo34139462018-04-10 14:18:0631#include "components/gcm_driver/fake_gcm_profile_service.h"
johnmea5045732016-09-08 17:23:2932#include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
sdefresne9fb67692015-08-03 18:48:2233#include "components/version_info/version_info.h"
kalman6f984ae2015-09-18 17:21:5834#include "content/public/browser/navigation_controller.h"
rdevlin.croninf5863da2015-09-10 19:21:4535#include "content/public/browser/navigation_entry.h"
lazyboy4c82177a2016-10-18 00:04:0936#include "content/public/browser/service_worker_context.h"
37#include "content/public/browser/storage_partition.h"
kalman6f984ae2015-09-18 17:21:5838#include "content/public/browser/web_contents.h"
lazyboybd325ae2015-11-18 21:35:2639#include "content/public/common/content_switches.h"
falkenad185092016-06-16 06:10:0240#include "content/public/common/origin_util.h"
kalman6f984ae2015-09-18 17:21:5841#include "content/public/common/page_type.h"
lazyboybd325ae2015-11-18 21:35:2642#include "content/public/test/background_sync_test_util.h"
annekao1db36fd2015-07-29 17:09:1643#include "content/public/test/browser_test_utils.h"
lazyboy63b994a2017-06-30 21:20:2344#include "content/public/test/service_worker_test_helpers.h"
Istiaque Ahmed771aa8a22018-06-20 23:40:5345#include "extensions/browser/event_router.h"
kalman6f984ae2015-09-18 17:21:5846#include "extensions/browser/extension_host.h"
lazyboyc3e763a2015-12-09 23:09:5847#include "extensions/browser/extension_registry.h"
kalman6f984ae2015-09-18 17:21:5848#include "extensions/browser/process_manager.h"
Devlin Cronina3fe3d602017-11-22 04:47:4349#include "extensions/common/extension_features.h"
Istiaque Ahmed771aa8a22018-06-20 23:40:5350#include "extensions/common/value_builder.h"
kalman6f984ae2015-09-18 17:21:5851#include "extensions/test/background_page_watcher.h"
annekao38685502015-07-14 17:46:3952#include "extensions/test/extension_test_message_listener.h"
Istiaque Ahmed805f6a83b2017-10-05 01:23:2653#include "extensions/test/result_catcher.h"
falkenad185092016-06-16 06:10:0254#include "net/dns/mock_host_resolver.h"
horo1eeddde2015-11-19 05:59:2555#include "net/test/embedded_test_server/embedded_test_server.h"
lazyboy63b994a2017-06-30 21:20:2356#include "url/url_constants.h"
annekao38685502015-07-14 17:46:3957
58namespace extensions {
59
kalman6f984ae2015-09-18 17:21:5860namespace {
61
62// Pass into ServiceWorkerTest::StartTestFromBackgroundPage to indicate that
63// registration is expected to succeed.
64std::string* const kExpectSuccess = nullptr;
65
lazyboy22eddc712015-12-10 21:16:2666// Returns the newly added WebContents.
67content::WebContents* AddTab(Browser* browser, const GURL& url) {
68 int starting_tab_count = browser->tab_strip_model()->count();
69 ui_test_utils::NavigateToURLWithDisposition(
nick3b04f322016-08-31 19:29:1970 browser, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
lazyboy22eddc712015-12-10 21:16:2671 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
72 int tab_count = browser->tab_strip_model()->count();
73 EXPECT_EQ(starting_tab_count + 1, tab_count);
74 return browser->tab_strip_model()->GetActiveWebContents();
75}
76
Istiaque Ahmedea5ed5042017-09-25 19:00:1677enum BindingsType { NATIVE_BINDINGS, JAVASCRIPT_BINDINGS };
78
lazyboy22eddc712015-12-10 21:16:2679class WebContentsLoadStopObserver : content::WebContentsObserver {
80 public:
81 explicit WebContentsLoadStopObserver(content::WebContents* web_contents)
82 : content::WebContentsObserver(web_contents),
83 load_stop_observed_(false) {}
84
85 void WaitForLoadStop() {
86 if (load_stop_observed_)
87 return;
88 message_loop_runner_ = new content::MessageLoopRunner;
89 message_loop_runner_->Run();
90 }
91
92 private:
93 void DidStopLoading() override {
94 load_stop_observed_ = true;
95 if (message_loop_runner_)
96 message_loop_runner_->Quit();
97 }
98
99 bool load_stop_observed_;
100 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
101
102 DISALLOW_COPY_AND_ASSIGN(WebContentsLoadStopObserver);
103};
104
Elly Fong-Jones4a4f21d2018-05-30 15:04:16105bool IsMacViewsMode() {
106// Some tests are flaky on Mac: <https://crbug.com/845979>. This helper function
107// is used to skip them.
108#if defined(OS_MACOSX)
109 return !views_mode_controller::IsViewsBrowserCocoa();
110#else
111 return false;
112#endif
113}
114
kalman6f984ae2015-09-18 17:21:58115} // namespace
116
Istiaque Ahmedea5ed5042017-09-25 19:00:16117class ServiceWorkerTest : public ExtensionApiTest,
118 public ::testing::WithParamInterface<BindingsType> {
annekao38685502015-07-14 17:46:39119 public:
lazyboy20167c22016-05-18 00:59:30120 ServiceWorkerTest() : current_channel_(version_info::Channel::STABLE) {}
Istiaque Ahmed7105f2a2017-10-07 01:11:59121 explicit ServiceWorkerTest(version_info::Channel channel)
122 : current_channel_(channel) {}
annekao38685502015-07-14 17:46:39123
124 ~ServiceWorkerTest() override {}
125
Devlin Cronina3fe3d602017-11-22 04:47:43126 void SetUp() override {
127 if (GetParam() == NATIVE_BINDINGS) {
128 scoped_feature_list_.InitAndEnableFeature(features::kNativeCrxBindings);
129 } else {
130 DCHECK_EQ(JAVASCRIPT_BINDINGS, GetParam());
131 scoped_feature_list_.InitAndDisableFeature(features::kNativeCrxBindings);
132 }
133 ExtensionApiTest::SetUp();
134 }
135
jam1a5b5582017-05-01 16:50:10136 void SetUpOnMainThread() override {
137 ExtensionApiTest::SetUpOnMainThread();
138 host_resolver()->AddRule("a.com", "127.0.0.1");
139 }
140
kalman6f984ae2015-09-18 17:21:58141 protected:
142 // Returns the ProcessManager for the test's profile.
143 ProcessManager* process_manager() { return ProcessManager::Get(profile()); }
144
145 // Starts running a test from the background page test extension.
146 //
147 // This registers a service worker with |script_name|, and fetches the
148 // registration result.
149 //
150 // If |error_or_null| is null (kExpectSuccess), success is expected and this
151 // will fail if there is an error.
152 // If |error_or_null| is not null, nothing is assumed, and the error (which
153 // may be empty) is written to it.
154 const Extension* StartTestFromBackgroundPage(const char* script_name,
155 std::string* error_or_null) {
156 const Extension* extension =
157 LoadExtension(test_data_dir_.AppendASCII("service_worker/background"));
158 CHECK(extension);
159 ExtensionHost* background_host =
160 process_manager()->GetBackgroundHostForExtension(extension->id());
161 CHECK(background_host);
162 std::string error;
163 CHECK(content::ExecuteScriptAndExtractString(
164 background_host->host_contents(),
165 base::StringPrintf("test.registerServiceWorker('%s')", script_name),
166 &error));
167 if (error_or_null)
168 *error_or_null = error;
169 else if (!error.empty())
170 ADD_FAILURE() << "Got unexpected error " << error;
171 return extension;
172 }
173
174 // Navigates the browser to a new tab at |url|, waits for it to load, then
175 // returns it.
176 content::WebContents* Navigate(const GURL& url) {
177 ui_test_utils::NavigateToURLWithDisposition(
nick3b04f322016-08-31 19:29:19178 browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
kalman6f984ae2015-09-18 17:21:58179 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
180 content::WebContents* web_contents =
181 browser()->tab_strip_model()->GetActiveWebContents();
182 content::WaitForLoadStop(web_contents);
183 return web_contents;
184 }
185
186 // Navigates the browser to |url| and returns the new tab's page type.
187 content::PageType NavigateAndGetPageType(const GURL& url) {
clamy1d7a4112018-06-15 15:47:16188 return Navigate(url)
189 ->GetController()
190 .GetLastCommittedEntry()
191 ->GetPageType();
kalman6f984ae2015-09-18 17:21:58192 }
193
194 // Extracts the innerText from |contents|.
195 std::string ExtractInnerText(content::WebContents* contents) {
196 std::string inner_text;
197 if (!content::ExecuteScriptAndExtractString(
198 contents,
199 "window.domAutomationController.send(document.body.innerText)",
200 &inner_text)) {
201 ADD_FAILURE() << "Failed to get inner text for "
202 << contents->GetVisibleURL();
203 }
204 return inner_text;
205 }
206
207 // Navigates the browser to |url|, then returns the innerText of the new
208 // tab's WebContents' main frame.
209 std::string NavigateAndExtractInnerText(const GURL& url) {
210 return ExtractInnerText(Navigate(url));
211 }
212
lazyboy4c82177a2016-10-18 00:04:09213 size_t GetWorkerRefCount(const GURL& origin) {
214 content::ServiceWorkerContext* sw_context =
215 content::BrowserContext::GetDefaultStoragePartition(
216 browser()->profile())
217 ->GetServiceWorkerContext();
218 base::RunLoop run_loop;
219 size_t ref_count = 0;
220 auto set_ref_count = [](size_t* ref_count, base::RunLoop* run_loop,
221 size_t external_request_count) {
222 *ref_count = external_request_count;
223 run_loop->Quit();
224 };
225 sw_context->CountExternalRequestsForTest(
Matt Falkenhagenc5cb4282017-09-07 08:43:42226 origin, base::BindOnce(set_ref_count, &ref_count, &run_loop));
lazyboy4c82177a2016-10-18 00:04:09227 run_loop.Run();
228 return ref_count;
229 }
230
annekao38685502015-07-14 17:46:39231 private:
lazyboy20167c22016-05-18 00:59:30232 // Sets the channel to "stable".
233 // Not useful after we've opened extension Service Workers to stable
234 // channel.
235 // TODO(lazyboy): Remove this when ExtensionServiceWorkersEnabled() is
236 // removed.
annekao38685502015-07-14 17:46:39237 ScopedCurrentChannel current_channel_;
kalman6f984ae2015-09-18 17:21:58238
Devlin Cronina3fe3d602017-11-22 04:47:43239 base::test::ScopedFeatureList scoped_feature_list_;
240
annekao38685502015-07-14 17:46:39241 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerTest);
242};
243
Istiaque Ahmedccb444022018-06-19 02:11:12244class ServiceWorkerBasedBackgroundTest : public ServiceWorkerTest {
245 public:
246 ServiceWorkerBasedBackgroundTest()
247 : ServiceWorkerTest(
248 // Extensions APIs from SW are only enabled on trunk.
249 // It is important to set the channel early so that this change is
250 // visible in renderers running with service workers (and no
251 // extension).
252 version_info::Channel::UNKNOWN) {}
253 ~ServiceWorkerBasedBackgroundTest() override {}
254
255 void SetUpOnMainThread() override {
256 host_resolver()->AddRule("*", "127.0.0.1");
257 ASSERT_TRUE(embedded_test_server()->Start());
258 ServiceWorkerTest::SetUpOnMainThread();
259 }
260
261 private:
262 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerBasedBackgroundTest);
263};
264
265// Tests that Service Worker based background pages can be loaded and they can
266// receive extension events.
267// The extension is installed and loaded during this step and it registers
268// an event listener for tabs.onCreated event. The step also verifies that tab
269// creation correctly fires the listener.
270IN_PROC_BROWSER_TEST_P(ServiceWorkerBasedBackgroundTest, PRE_Basic) {
271 ExtensionTestMessageListener newtab_listener("CREATED", false);
272 newtab_listener.set_failure_message("CREATE_FAILED");
273 ExtensionTestMessageListener worker_listener("WORKER_RUNNING", false);
274 worker_listener.set_failure_message("NON_WORKER_SCOPE");
275 const Extension* extension = LoadExtension(test_data_dir_.AppendASCII(
276 "service_worker/worker_based_background/basic"));
277 ASSERT_TRUE(extension);
278 const ExtensionId extension_id = extension->id();
279 EXPECT_TRUE(worker_listener.WaitUntilSatisfied());
280
281 const GURL url = embedded_test_server()->GetURL("/extensions/test_file.html");
282 content::WebContents* new_web_contents = AddTab(browser(), url);
283 EXPECT_TRUE(new_web_contents);
284 EXPECT_TRUE(newtab_listener.WaitUntilSatisfied());
285
286 // Service Worker extension does not have ExtensionHost.
287 EXPECT_FALSE(process_manager()->GetBackgroundHostForExtension(extension_id));
288}
289
290// After browser restarts, this test step ensures that opening a tab fires
291// tabs.onCreated event listener to the extension without explicitly loading the
292// extension. This is because the extension registered a listener before browser
293// restarted in PRE_Basic.
294IN_PROC_BROWSER_TEST_P(ServiceWorkerBasedBackgroundTest, Basic) {
295 ExtensionTestMessageListener newtab_listener("CREATED", false);
296 newtab_listener.set_failure_message("CREATE_FAILED");
297 const GURL url = embedded_test_server()->GetURL("/extensions/test_file.html");
298 content::WebContents* new_web_contents = AddTab(browser(), url);
299 EXPECT_TRUE(new_web_contents);
300 EXPECT_TRUE(newtab_listener.WaitUntilSatisfied());
301}
302
Istiaque Ahmed771aa8a22018-06-20 23:40:53303// Class that dispatches "test.onMessage" event to |extension_id| right after a
304// listener to the event is added from the extension's Service Worker.
305class EarlyWorkerMessageSender : public EventRouter::Observer {
306 public:
307 EarlyWorkerMessageSender(content::BrowserContext* browser_context,
308 const ExtensionId& extension_id)
309 : browser_context_(browser_context),
310 event_router_(EventRouter::EventRouter::Get(browser_context_)),
311 extension_id_(extension_id),
312 listener_("PASS", false) {
313 DCHECK(browser_context_);
314 listener_.set_failure_message("FAIL");
315 event_router_->RegisterObserver(this, kTestOnMessageEventName);
316 }
317
318 ~EarlyWorkerMessageSender() override {
319 event_router_->UnregisterObserver(this);
320 }
321
322 // EventRouter::Observer:
323 void OnListenerAdded(const EventListenerInfo& details) override {
324 if (did_dispatch_event_ || extension_id_ != details.extension_id)
325 return;
326 const bool is_lazy_listener = details.browser_context == nullptr;
327 if (is_lazy_listener) {
328 // Wait for the non-lazy listener as we want to exercise the code to
329 // dispatch the event right after the Service Worker registration is
330 // completing.
331 return;
332 }
333 DispatchEvent();
334 did_dispatch_event_ = true;
335 }
336
337 bool SendAndWait() { return listener_.WaitUntilSatisfied(); }
338
339 private:
340 static constexpr const char* const kTestOnMessageEventName = "test.onMessage";
341
342 void DispatchEvent() {
343 std::unique_ptr<base::ListValue> event_args =
344 ListBuilder()
345 .Append(DictionaryBuilder()
346 .Set("data", "hello")
347 .Set("lastMessage", true)
348 .Build())
349 .Build();
350 auto event = std::make_unique<Event>(
351 events::TEST_ON_MESSAGE, std::string(kTestOnMessageEventName),
352 std::move(event_args), browser_context_);
353 EventRouter::Get(browser_context_)
354 ->DispatchEventToExtension(extension_id_, std::move(event));
355 }
356
357 content::BrowserContext* const browser_context_ = nullptr;
358 EventRouter* const event_router_ = nullptr;
359 const ExtensionId extension_id_;
360 ExtensionTestMessageListener listener_;
361 bool did_dispatch_event_ = false;
362
363 DISALLOW_COPY_AND_ASSIGN(EarlyWorkerMessageSender);
364};
365
366// Tests that extension event dispatch works correctly right after extension
367// installation registers its Service Worker.
368// Regression test for: https://crbug.com/850792.
369IN_PROC_BROWSER_TEST_P(ServiceWorkerBasedBackgroundTest, EarlyEventDispatch) {
370 const ExtensionId kId("pkplfbidichfdicaijlchgnapepdginl");
371 EarlyWorkerMessageSender sender(profile(), kId);
372 // pkplfbidichfdicaijlchgnapepdginl
373 const Extension* extension = LoadExtension(test_data_dir_.AppendASCII(
374 "service_worker/worker_based_background/early_event_dispatch"));
375 CHECK(extension);
376 EXPECT_EQ(kId, extension->id());
377 EXPECT_TRUE(sender.SendAndWait());
378}
379
lazyboybd325ae2015-11-18 21:35:26380class ServiceWorkerBackgroundSyncTest : public ServiceWorkerTest {
381 public:
382 ServiceWorkerBackgroundSyncTest() {}
383 ~ServiceWorkerBackgroundSyncTest() override {}
384
385 void SetUpCommandLine(base::CommandLine* command_line) override {
386 // ServiceWorkerRegistration.sync requires experimental flag.
387 command_line->AppendSwitch(
Istiaque Ahmedea5ed5042017-09-25 19:00:16388 ::switches::kEnableExperimentalWebPlatformFeatures);
lazyboybd325ae2015-11-18 21:35:26389 ServiceWorkerTest::SetUpCommandLine(command_line);
390 }
391
392 void SetUp() override {
393 content::background_sync_test_util::SetIgnoreNetworkChangeNotifier(true);
394 ServiceWorkerTest::SetUp();
395 }
396
397 private:
398 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerBackgroundSyncTest);
399};
400
lazyboy561b7de2015-11-19 19:27:30401class ServiceWorkerPushMessagingTest : public ServiceWorkerTest {
402 public:
403 ServiceWorkerPushMessagingTest()
johnmea5045732016-09-08 17:23:29404 : gcm_driver_(nullptr), push_service_(nullptr) {}
lazyboy561b7de2015-11-19 19:27:30405 ~ServiceWorkerPushMessagingTest() override {}
406
407 void GrantNotificationPermissionForTest(const GURL& url) {
408 GURL origin = url.GetOrigin();
409 DesktopNotificationProfileUtil::GrantPermission(profile(), origin);
timlohc6911802017-03-01 05:37:03410 ASSERT_EQ(CONTENT_SETTING_ALLOW,
411 PermissionManager::Get(profile())
412 ->GetPermissionStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
413 origin, origin)
414 .content_setting);
lazyboy561b7de2015-11-19 19:27:30415 }
416
417 PushMessagingAppIdentifier GetAppIdentifierForServiceWorkerRegistration(
avia2f4804a2015-12-24 23:11:13418 int64_t service_worker_registration_id,
lazyboy561b7de2015-11-19 19:27:30419 const GURL& origin) {
420 PushMessagingAppIdentifier app_identifier =
421 PushMessagingAppIdentifier::FindByServiceWorker(
422 profile(), origin, service_worker_registration_id);
423
424 EXPECT_FALSE(app_identifier.is_null());
425 return app_identifier;
426 }
427
428 // ExtensionApiTest overrides.
429 void SetUpCommandLine(base::CommandLine* command_line) override {
peter9de96272015-12-04 15:23:27430 command_line->AppendSwitch(
Istiaque Ahmedea5ed5042017-09-25 19:00:16431 ::switches::kEnableExperimentalWebPlatformFeatures);
lazyboy561b7de2015-11-19 19:27:30432 ServiceWorkerTest::SetUpCommandLine(command_line);
433 }
434 void SetUpOnMainThread() override {
miguelg9b502862017-04-24 18:13:53435 NotificationDisplayServiceFactory::GetInstance()->SetTestingFactory(
436 profile(), &StubNotificationDisplayService::FactoryForTests);
437
johnmea5045732016-09-08 17:23:29438 gcm::FakeGCMProfileService* gcm_service =
439 static_cast<gcm::FakeGCMProfileService*>(
440 gcm::GCMProfileServiceFactory::GetInstance()
441 ->SetTestingFactoryAndUse(profile(),
442 &gcm::FakeGCMProfileService::Build));
443 gcm_driver_ = static_cast<instance_id::FakeGCMDriverForInstanceID*>(
444 gcm_service->driver());
lazyboy561b7de2015-11-19 19:27:30445 push_service_ = PushMessagingServiceFactory::GetForProfile(profile());
446
447 ServiceWorkerTest::SetUpOnMainThread();
448 }
449
johnmea5045732016-09-08 17:23:29450 instance_id::FakeGCMDriverForInstanceID* gcm_driver() const {
451 return gcm_driver_;
452 }
lazyboy561b7de2015-11-19 19:27:30453 PushMessagingServiceImpl* push_service() const { return push_service_; }
454
455 private:
johnmea5045732016-09-08 17:23:29456 instance_id::FakeGCMDriverForInstanceID* gcm_driver_;
lazyboy561b7de2015-11-19 19:27:30457 PushMessagingServiceImpl* push_service_;
458
459 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerPushMessagingTest);
460};
461
Istiaque Ahmed805f6a83b2017-10-05 01:23:26462class ServiceWorkerLazyBackgroundTest : public ServiceWorkerTest {
463 public:
Istiaque Ahmed7105f2a2017-10-07 01:11:59464 ServiceWorkerLazyBackgroundTest()
465 : ServiceWorkerTest(
466 // Extensions APIs from SW are only enabled on trunk.
467 // It is important to set the channel early so that this change is
468 // visible in renderers running with service workers (and no
469 // extension).
470 version_info::Channel::UNKNOWN) {}
Istiaque Ahmed805f6a83b2017-10-05 01:23:26471 ~ServiceWorkerLazyBackgroundTest() override {}
472
473 void SetUpCommandLine(base::CommandLine* command_line) override {
474 ServiceWorkerTest::SetUpCommandLine(command_line);
475 // Disable background network activity as it can suddenly bring the Lazy
476 // Background Page alive.
477 command_line->AppendSwitch(::switches::kDisableBackgroundNetworking);
478 command_line->AppendSwitch(::switches::kNoProxyServer);
479 }
480
481 void SetUpInProcessBrowserTestFixture() override {
482 ServiceWorkerTest::SetUpInProcessBrowserTestFixture();
483 // Set shorter delays to prevent test timeouts.
484 ProcessManager::SetEventPageIdleTimeForTesting(1);
485 ProcessManager::SetEventPageSuspendingTimeForTesting(1);
486 }
487
488 private:
489 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerLazyBackgroundTest);
490};
491
Istiaque Ahmedea5ed5042017-09-25 19:00:16492IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, RegisterSucceeds) {
kalman6f984ae2015-09-18 17:21:58493 StartTestFromBackgroundPage("register.js", kExpectSuccess);
annekao38685502015-07-14 17:46:39494}
495
Istiaque Ahmedea5ed5042017-09-25 19:00:16496IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, UpdateRefreshesServiceWorker) {
Francois Doraye6fb2d02017-10-18 21:29:13497 base::ScopedAllowBlockingForTesting allow_blocking;
lazyboyc3e763a2015-12-09 23:09:58498 base::ScopedTempDir scoped_temp_dir;
499 ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
500 base::FilePath pem_path = test_data_dir_.AppendASCII("service_worker")
501 .AppendASCII("update")
502 .AppendASCII("service_worker.pem");
vabr9142fe22016-09-08 13:19:22503 base::FilePath path_v1 =
504 PackExtensionWithOptions(test_data_dir_.AppendASCII("service_worker")
505 .AppendASCII("update")
506 .AppendASCII("v1"),
507 scoped_temp_dir.GetPath().AppendASCII("v1.crx"),
508 pem_path, base::FilePath());
509 base::FilePath path_v2 =
510 PackExtensionWithOptions(test_data_dir_.AppendASCII("service_worker")
511 .AppendASCII("update")
512 .AppendASCII("v2"),
513 scoped_temp_dir.GetPath().AppendASCII("v2.crx"),
514 pem_path, base::FilePath());
lazyboyc3e763a2015-12-09 23:09:58515 const char* kId = "hfaanndiiilofhfokeanhddpkfffchdi";
516
517 ExtensionTestMessageListener listener_v1("Pong from version 1", false);
518 listener_v1.set_failure_message("FAILURE_V1");
519 // Install version 1.0 of the extension.
520 ASSERT_TRUE(InstallExtension(path_v1, 1));
521 EXPECT_TRUE(extensions::ExtensionRegistry::Get(profile())
522 ->enabled_extensions()
523 .GetByID(kId));
524 EXPECT_TRUE(listener_v1.WaitUntilSatisfied());
525
526 ExtensionTestMessageListener listener_v2("Pong from version 2", false);
527 listener_v2.set_failure_message("FAILURE_V2");
528
529 // Update to version 2.0.
530 EXPECT_TRUE(UpdateExtension(kId, path_v2, 0));
531 EXPECT_TRUE(extensions::ExtensionRegistry::Get(profile())
532 ->enabled_extensions()
533 .GetByID(kId));
534 EXPECT_TRUE(listener_v2.WaitUntilSatisfied());
535}
536
[email protected]2ef85d562017-09-15 18:41:52537// TODO(crbug.com/765736) Fix the test.
Istiaque Ahmedea5ed5042017-09-25 19:00:16538IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, DISABLED_UpdateWithoutSkipWaiting) {
Francois Doraye6fb2d02017-10-18 21:29:13539 base::ScopedAllowBlockingForTesting allow_blocking;
lazyboy22eddc712015-12-10 21:16:26540 base::ScopedTempDir scoped_temp_dir;
541 ASSERT_TRUE(scoped_temp_dir.CreateUniqueTempDir());
542 base::FilePath pem_path = test_data_dir_.AppendASCII("service_worker")
543 .AppendASCII("update_without_skip_waiting")
544 .AppendASCII("update_without_skip_waiting.pem");
vabr9142fe22016-09-08 13:19:22545 base::FilePath path_v1 =
546 PackExtensionWithOptions(test_data_dir_.AppendASCII("service_worker")
547 .AppendASCII("update_without_skip_waiting")
548 .AppendASCII("v1"),
549 scoped_temp_dir.GetPath().AppendASCII("v1.crx"),
550 pem_path, base::FilePath());
551 base::FilePath path_v2 =
552 PackExtensionWithOptions(test_data_dir_.AppendASCII("service_worker")
553 .AppendASCII("update_without_skip_waiting")
554 .AppendASCII("v2"),
555 scoped_temp_dir.GetPath().AppendASCII("v2.crx"),
556 pem_path, base::FilePath());
lazyboy22eddc712015-12-10 21:16:26557 const char* kId = "mhnnnflgagdakldgjpfcofkiocpdmogl";
558
559 // Install version 1.0 of the extension.
560 ASSERT_TRUE(InstallExtension(path_v1, 1));
561 EXPECT_TRUE(extensions::ExtensionRegistry::Get(profile())
562 ->enabled_extensions()
563 .GetByID(kId));
564 const Extension* extension = extensions::ExtensionRegistry::Get(profile())
565 ->enabled_extensions()
566 .GetByID(kId);
567
568 ExtensionTestMessageListener listener1("Pong from version 1", false);
569 listener1.set_failure_message("FAILURE");
570 content::WebContents* web_contents =
571 AddTab(browser(), extension->GetResourceURL("page.html"));
572 EXPECT_TRUE(listener1.WaitUntilSatisfied());
573
574 // Update to version 2.0.
575 EXPECT_TRUE(UpdateExtension(kId, path_v2, 0));
576 EXPECT_TRUE(extensions::ExtensionRegistry::Get(profile())
577 ->enabled_extensions()
578 .GetByID(kId));
579 const Extension* extension_after_update =
580 extensions::ExtensionRegistry::Get(profile())
581 ->enabled_extensions()
582 .GetByID(kId);
583
584 // Service worker version 2 would be installed but it won't be controlling
585 // the extension page yet.
586 ExtensionTestMessageListener listener2("Pong from version 1", false);
587 listener2.set_failure_message("FAILURE");
588 web_contents =
589 AddTab(browser(), extension_after_update->GetResourceURL("page.html"));
590 EXPECT_TRUE(listener2.WaitUntilSatisfied());
591
592 // Navigate the tab away from the extension page so that no clients are
593 // using the service worker.
594 // Note that just closing the tab with WebContentsDestroyedWatcher doesn't
595 // seem to be enough because it returns too early.
596 WebContentsLoadStopObserver navigate_away_observer(web_contents);
597 web_contents->GetController().LoadURL(
598 GURL(url::kAboutBlankURL), content::Referrer(), ui::PAGE_TRANSITION_TYPED,
599 std::string());
600 navigate_away_observer.WaitForLoadStop();
601
602 // Now expect service worker version 2 to control the extension page.
603 ExtensionTestMessageListener listener3("Pong from version 2", false);
604 listener3.set_failure_message("FAILURE");
605 web_contents =
606 AddTab(browser(), extension_after_update->GetResourceURL("page.html"));
607 EXPECT_TRUE(listener3.WaitUntilSatisfied());
608}
609
Istiaque Ahmedea5ed5042017-09-25 19:00:16610IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, FetchArbitraryPaths) {
kalman6f984ae2015-09-18 17:21:58611 const Extension* extension =
612 StartTestFromBackgroundPage("fetch.js", kExpectSuccess);
annekao1db36fd2015-07-29 17:09:16613
kalman6f984ae2015-09-18 17:21:58614 // Open some arbirary paths. Their contents should be what the service worker
615 // responds with, which in this case is the path of the fetch.
616 EXPECT_EQ(
617 "Caught a fetch for /index.html",
618 NavigateAndExtractInnerText(extension->GetResourceURL("index.html")));
619 EXPECT_EQ("Caught a fetch for /path/to/other.html",
620 NavigateAndExtractInnerText(
621 extension->GetResourceURL("path/to/other.html")));
622 EXPECT_EQ("Caught a fetch for /some/text/file.txt",
623 NavigateAndExtractInnerText(
624 extension->GetResourceURL("some/text/file.txt")));
625 EXPECT_EQ("Caught a fetch for /no/file/extension",
626 NavigateAndExtractInnerText(
627 extension->GetResourceURL("no/file/extension")));
628 EXPECT_EQ("Caught a fetch for /",
629 NavigateAndExtractInnerText(extension->GetResourceURL("")));
annekao1db36fd2015-07-29 17:09:16630}
631
Istiaque Ahmedea5ed5042017-09-25 19:00:16632IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, SWServedBackgroundPageReceivesEvent) {
lazyboy52c3bcf2016-01-08 00:11:29633 const Extension* extension =
634 StartTestFromBackgroundPage("replace_background.js", kExpectSuccess);
635 ExtensionHost* background_page =
636 process_manager()->GetBackgroundHostForExtension(extension->id());
637 ASSERT_TRUE(background_page);
638
639 // Close the background page and start it again so that the service worker
640 // will start controlling pages.
641 background_page->Close();
642 BackgroundPageWatcher(process_manager(), extension).WaitForClose();
643 background_page = nullptr;
Peter Kasting341e1fb2018-02-24 00:03:01644 process_manager()->WakeEventPage(extension->id(), base::DoNothing());
lazyboy52c3bcf2016-01-08 00:11:29645 BackgroundPageWatcher(process_manager(), extension).WaitForOpen();
646
647 // Since the SW is now controlling the extension, the SW serves the background
648 // script. page.html sends a message to the background script and we verify
649 // that the SW served background script correctly receives the message/event.
650 ExtensionTestMessageListener listener("onMessage/SW BG.", false);
651 listener.set_failure_message("onMessage/original BG.");
652 content::WebContents* web_contents =
653 AddTab(browser(), extension->GetResourceURL("page.html"));
654 ASSERT_TRUE(web_contents);
655 EXPECT_TRUE(listener.WaitUntilSatisfied());
656}
657
Matt Falkenhagena612fc02018-05-30 00:35:39658IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, SWServedBackgroundPage) {
kalman6f984ae2015-09-18 17:21:58659 const Extension* extension =
660 StartTestFromBackgroundPage("fetch.js", kExpectSuccess);
annekao49241182015-08-18 17:14:01661
kalman6f984ae2015-09-18 17:21:58662 std::string kExpectedInnerText = "background.html contents for testing.";
annekao49241182015-08-18 17:14:01663
kalman6f984ae2015-09-18 17:21:58664 // Sanity check that the background page has the expected content.
665 ExtensionHost* background_page =
666 process_manager()->GetBackgroundHostForExtension(extension->id());
667 ASSERT_TRUE(background_page);
668 EXPECT_EQ(kExpectedInnerText,
669 ExtractInnerText(background_page->host_contents()));
annekao49241182015-08-18 17:14:01670
kalman6f984ae2015-09-18 17:21:58671 // Close the background page.
672 background_page->Close();
673 BackgroundPageWatcher(process_manager(), extension).WaitForClose();
674 background_page = nullptr;
675
676 // Start it again.
Peter Kasting341e1fb2018-02-24 00:03:01677 process_manager()->WakeEventPage(extension->id(), base::DoNothing());
kalman6f984ae2015-09-18 17:21:58678 BackgroundPageWatcher(process_manager(), extension).WaitForOpen();
679
Matt Falkenhagena612fc02018-05-30 00:35:39680 // The service worker should get a fetch event for the background page.
kalman6f984ae2015-09-18 17:21:58681 background_page =
682 process_manager()->GetBackgroundHostForExtension(extension->id());
683 ASSERT_TRUE(background_page);
684 content::WaitForLoadStop(background_page->host_contents());
685
kalman6f984ae2015-09-18 17:21:58686 EXPECT_EQ("Caught a fetch for /background.html",
687 ExtractInnerText(background_page->host_contents()));
annekao49241182015-08-18 17:14:01688}
689
Istiaque Ahmedea5ed5042017-09-25 19:00:16690IN_PROC_BROWSER_TEST_P(ServiceWorkerTest,
kalman6f984ae2015-09-18 17:21:58691 ServiceWorkerPostsMessageToBackgroundClient) {
692 const Extension* extension = StartTestFromBackgroundPage(
693 "post_message_to_background_client.js", kExpectSuccess);
annekao533482222015-08-21 23:23:53694
kalman6f984ae2015-09-18 17:21:58695 // The service worker in this test simply posts a message to the background
696 // client it receives from getBackgroundClient().
697 const char* kScript =
698 "var messagePromise = null;\n"
699 "if (test.lastMessageFromServiceWorker) {\n"
700 " messagePromise = Promise.resolve(test.lastMessageFromServiceWorker);\n"
701 "} else {\n"
702 " messagePromise = test.waitForMessage(navigator.serviceWorker);\n"
703 "}\n"
704 "messagePromise.then(function(message) {\n"
705 " window.domAutomationController.send(String(message == 'success'));\n"
706 "})\n";
707 EXPECT_EQ("true", ExecuteScriptInBackgroundPage(extension->id(), kScript));
annekao533482222015-08-21 23:23:53708}
709
Istiaque Ahmedea5ed5042017-09-25 19:00:16710IN_PROC_BROWSER_TEST_P(ServiceWorkerTest,
kalman6f984ae2015-09-18 17:21:58711 BackgroundPagePostsMessageToServiceWorker) {
712 const Extension* extension =
713 StartTestFromBackgroundPage("post_message_to_sw.js", kExpectSuccess);
annekao533482222015-08-21 23:23:53714
kalman6f984ae2015-09-18 17:21:58715 // The service worker in this test waits for a message, then echoes it back
716 // by posting a message to the background page via getBackgroundClient().
717 const char* kScript =
718 "var mc = new MessageChannel();\n"
719 "test.waitForMessage(mc.port1).then(function(message) {\n"
720 " window.domAutomationController.send(String(message == 'hello'));\n"
721 "});\n"
722 "test.registeredServiceWorker.postMessage(\n"
723 " {message: 'hello', port: mc.port2}, [mc.port2])\n";
724 EXPECT_EQ("true", ExecuteScriptInBackgroundPage(extension->id(), kScript));
annekao533482222015-08-21 23:23:53725}
726
Istiaque Ahmedea5ed5042017-09-25 19:00:16727IN_PROC_BROWSER_TEST_P(ServiceWorkerTest,
rdevlin.croninf5863da2015-09-10 19:21:45728 ServiceWorkerSuspensionOnExtensionUnload) {
kalman6f984ae2015-09-18 17:21:58729 // For this test, only hold onto the extension's ID and URL + a function to
730 // get a resource URL, because we're going to be disabling and uninstalling
731 // it, which will invalidate the pointer.
732 std::string extension_id;
733 GURL extension_url;
734 {
735 const Extension* extension =
736 StartTestFromBackgroundPage("fetch.js", kExpectSuccess);
737 extension_id = extension->id();
738 extension_url = extension->url();
739 }
740 auto get_resource_url = [&extension_url](const std::string& path) {
741 return Extension::GetResourceURL(extension_url, path);
742 };
rdevlin.croninf5863da2015-09-10 19:21:45743
kalman6f984ae2015-09-18 17:21:58744 // Fetch should route to the service worker.
745 EXPECT_EQ("Caught a fetch for /index.html",
746 NavigateAndExtractInnerText(get_resource_url("index.html")));
rdevlin.croninf5863da2015-09-10 19:21:45747
kalman6f984ae2015-09-18 17:21:58748 // Disable the extension. Opening the page should fail.
749 extension_service()->DisableExtension(extension_id,
Minh X. Nguyen45479012017-08-18 21:35:36750 disable_reason::DISABLE_USER_ACTION);
rdevlin.croninf5863da2015-09-10 19:21:45751 base::RunLoop().RunUntilIdle();
rdevlin.croninf5863da2015-09-10 19:21:45752
kalman6f984ae2015-09-18 17:21:58753 EXPECT_EQ(content::PAGE_TYPE_ERROR,
754 NavigateAndGetPageType(get_resource_url("index.html")));
755 EXPECT_EQ(content::PAGE_TYPE_ERROR,
756 NavigateAndGetPageType(get_resource_url("other.html")));
757
758 // Re-enable the extension. Opening pages should immediately start to succeed
759 // again.
rdevlin.croninf5863da2015-09-10 19:21:45760 extension_service()->EnableExtension(extension_id);
761 base::RunLoop().RunUntilIdle();
762
kalman6f984ae2015-09-18 17:21:58763 EXPECT_EQ("Caught a fetch for /index.html",
764 NavigateAndExtractInnerText(get_resource_url("index.html")));
765 EXPECT_EQ("Caught a fetch for /other.html",
766 NavigateAndExtractInnerText(get_resource_url("other.html")));
767 EXPECT_EQ("Caught a fetch for /another.html",
768 NavigateAndExtractInnerText(get_resource_url("another.html")));
rdevlin.croninf5863da2015-09-10 19:21:45769
kalman6f984ae2015-09-18 17:21:58770 // Uninstall the extension. Opening pages should fail again.
771 base::string16 error;
772 extension_service()->UninstallExtension(
Devlin Cronin218df7f2017-11-21 21:41:31773 extension_id, UninstallReason::UNINSTALL_REASON_FOR_TESTING, &error);
kalman6f984ae2015-09-18 17:21:58774 base::RunLoop().RunUntilIdle();
775
776 EXPECT_EQ(content::PAGE_TYPE_ERROR,
777 NavigateAndGetPageType(get_resource_url("index.html")));
778 EXPECT_EQ(content::PAGE_TYPE_ERROR,
779 NavigateAndGetPageType(get_resource_url("other.html")));
780 EXPECT_EQ(content::PAGE_TYPE_ERROR,
781 NavigateAndGetPageType(get_resource_url("anotherother.html")));
782 EXPECT_EQ(content::PAGE_TYPE_ERROR,
783 NavigateAndGetPageType(get_resource_url("final.html")));
784}
785
Istiaque Ahmedea5ed5042017-09-25 19:00:16786IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, BackgroundPageIsWokenIfAsleep) {
kalman6f984ae2015-09-18 17:21:58787 const Extension* extension =
788 StartTestFromBackgroundPage("wake_on_fetch.js", kExpectSuccess);
789
790 // Navigate to special URLs that this test's service worker recognises, each
791 // making a check then populating the response with either "true" or "false".
792 EXPECT_EQ("true", NavigateAndExtractInnerText(extension->GetResourceURL(
793 "background-client-is-awake")));
794 EXPECT_EQ("true", NavigateAndExtractInnerText(
795 extension->GetResourceURL("ping-background-client")));
796 // Ping more than once for good measure.
797 EXPECT_EQ("true", NavigateAndExtractInnerText(
798 extension->GetResourceURL("ping-background-client")));
799
800 // Shut down the event page. The SW should detect that it's closed, but still
801 // be able to ping it.
802 ExtensionHost* background_page =
803 process_manager()->GetBackgroundHostForExtension(extension->id());
804 ASSERT_TRUE(background_page);
805 background_page->Close();
806 BackgroundPageWatcher(process_manager(), extension).WaitForClose();
807
808 EXPECT_EQ("false", NavigateAndExtractInnerText(extension->GetResourceURL(
809 "background-client-is-awake")));
810 EXPECT_EQ("true", NavigateAndExtractInnerText(
811 extension->GetResourceURL("ping-background-client")));
812 EXPECT_EQ("true", NavigateAndExtractInnerText(
813 extension->GetResourceURL("ping-background-client")));
814 EXPECT_EQ("true", NavigateAndExtractInnerText(extension->GetResourceURL(
815 "background-client-is-awake")));
816}
817
Istiaque Ahmedea5ed5042017-09-25 19:00:16818IN_PROC_BROWSER_TEST_P(ServiceWorkerTest,
kalman6f984ae2015-09-18 17:21:58819 GetBackgroundClientFailsWithNoBackgroundPage) {
820 // This extension doesn't have a background page, only a tab at page.html.
821 // The service worker it registers tries to call getBackgroundClient() and
822 // should fail.
823 // Note that this also tests that service workers can be registered from tabs.
824 EXPECT_TRUE(RunExtensionSubtest("service_worker/no_background", "page.html"));
rdevlin.croninf5863da2015-09-10 19:21:45825}
826
Istiaque Ahmedea5ed5042017-09-25 19:00:16827IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, NotificationAPI) {
lazyboy6ddb7d62015-11-10 23:15:27828 EXPECT_TRUE(RunExtensionSubtest("service_worker/notifications/has_permission",
829 "page.html"));
830}
831
Istiaque Ahmedea5ed5042017-09-25 19:00:16832IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, WebAccessibleResourcesFetch) {
lazyboyaea32c22016-01-04 21:37:07833 EXPECT_TRUE(RunExtensionSubtest(
834 "service_worker/web_accessible_resources/fetch/", "page.html"));
835}
836
Olga Sharonova3e13cd92018-02-08 16:43:56837// Flaky on Linux: http://crbug/810397.
838#if defined(OS_LINUX)
839#define MAYBE_TabsCreate DISABLED_TabsCreate
840#else
841#define MAYBE_TabsCreate TabsCreate
842#endif
843IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, MAYBE_TabsCreate) {
Elly Fong-Jones4a4f21d2018-05-30 15:04:16844 if (IsMacViewsMode())
845 return;
lazyboyee4adef2016-05-24 00:55:16846 // Extensions APIs from SW are only enabled on trunk.
847 ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
848 const Extension* extension = LoadExtensionWithFlags(
849 test_data_dir_.AppendASCII("service_worker/tabs_create"), kFlagNone);
850 ASSERT_TRUE(extension);
851 ui_test_utils::NavigateToURL(browser(),
852 extension->GetResourceURL("page.html"));
853 content::WebContents* web_contents =
854 browser()->tab_strip_model()->GetActiveWebContents();
855
856 int starting_tab_count = browser()->tab_strip_model()->count();
857 std::string result;
858 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
859 web_contents, "window.runServiceWorker()", &result));
860 ASSERT_EQ("chrome.tabs.create callback", result);
861 EXPECT_EQ(starting_tab_count + 1, browser()->tab_strip_model()->count());
862
863 // Check extension shutdown path.
864 UnloadExtension(extension->id());
865 EXPECT_EQ(starting_tab_count, browser()->tab_strip_model()->count());
866}
867
Istiaque Ahmedea5ed5042017-09-25 19:00:16868IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, Events) {
Elly Fong-Jones4a4f21d2018-05-30 15:04:16869 if (IsMacViewsMode())
870 return;
lazyboye7847242017-06-07 23:29:18871 // Extensions APIs from SW are only enabled on trunk.
872 ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
873 const Extension* extension = LoadExtensionWithFlags(
874 test_data_dir_.AppendASCII("service_worker/events"), kFlagNone);
875 ASSERT_TRUE(extension);
876 ui_test_utils::NavigateToURL(browser(),
877 extension->GetResourceURL("page.html"));
878 content::WebContents* web_contents =
879 browser()->tab_strip_model()->GetActiveWebContents();
880 std::string result;
881 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
882 web_contents, "window.runEventTest()", &result));
883 ASSERT_EQ("chrome.tabs.onUpdated callback", result);
884}
885
Istiaque Ahmedea5ed5042017-09-25 19:00:16886IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, EventsToStoppedWorker) {
lazyboy63b994a2017-06-30 21:20:23887 // Extensions APIs from SW are only enabled on trunk.
888 ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
889 const Extension* extension = LoadExtensionWithFlags(
890 test_data_dir_.AppendASCII("service_worker/events_to_stopped_worker"),
891 kFlagNone);
892 ASSERT_TRUE(extension);
893 ui_test_utils::NavigateToURL(browser(),
894 extension->GetResourceURL("page.html"));
895 content::WebContents* web_contents =
896 browser()->tab_strip_model()->GetActiveWebContents();
897 {
898 std::string result;
899 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
900 web_contents, "window.runServiceWorker()", &result));
901 ASSERT_EQ("ready", result);
902
903 base::RunLoop run_loop;
904 content::StoragePartition* storage_partition =
905 content::BrowserContext::GetDefaultStoragePartition(
906 browser()->profile());
907 content::StopServiceWorkerForPattern(
908 storage_partition->GetServiceWorkerContext(),
909 // The service worker is registered at the top level scope.
910 extension->url(), run_loop.QuitClosure());
911 run_loop.Run();
912 }
913
914 std::string result;
915 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
916 web_contents, "window.createTabThenUpdate()", &result));
917 ASSERT_EQ("chrome.tabs.onUpdated callback", result);
918}
919
Istiaque Ahmed805f6a83b2017-10-05 01:23:26920// Tests that events to service worker arrives correctly event if the owner
921// extension of the worker is not running.
922IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest,
Xida Chen1f18f462018-04-24 13:55:54923 DISABLED_EventsToStoppedExtension) {
Istiaque Ahmed805f6a83b2017-10-05 01:23:26924 LazyBackgroundObserver lazy_observer;
925 ResultCatcher catcher;
926 const Extension* extension = LoadExtensionWithFlags(
927 test_data_dir_.AppendASCII("service_worker/events_to_stopped_extension"),
928 kFlagNone);
929 ASSERT_TRUE(extension);
930 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
931
932 ProcessManager* pm = ProcessManager::Get(browser()->profile());
933 EXPECT_GT(pm->GetLazyKeepaliveCount(extension), 0);
934
935 // |extension|'s background page opens a tab to its resource.
936 content::WebContents* extension_web_contents =
937 browser()->tab_strip_model()->GetActiveWebContents();
938 EXPECT_TRUE(content::WaitForLoadStop(extension_web_contents));
939 EXPECT_EQ(extension->GetResourceURL("page.html").spec(),
940 extension_web_contents->GetURL().spec());
941 {
942 // Let the service worker start and register a listener to
943 // chrome.tabs.onCreated event.
944 ExtensionTestMessageListener add_listener_done("listener-added", false);
945 content::ExecuteScriptAsync(extension_web_contents,
946 "window.runServiceWorkerAsync()");
947 EXPECT_TRUE(add_listener_done.WaitUntilSatisfied());
948
949 base::RunLoop run_loop;
950 content::StoragePartition* storage_partition =
951 content::BrowserContext::GetDefaultStoragePartition(
952 browser()->profile());
953 content::StopServiceWorkerForPattern(
954 storage_partition->GetServiceWorkerContext(),
955 // The service worker is registered at the top level scope.
956 extension->url(), run_loop.QuitClosure());
957 run_loop.Run();
958 }
959
960 // Close the tab to |extension|'s resource. This will also close the
961 // extension's event page.
962 browser()->tab_strip_model()->CloseWebContentsAt(
963 browser()->tab_strip_model()->active_index(), TabStripModel::CLOSE_NONE);
964 lazy_observer.Wait();
965
966 // At this point both the extension worker and extension event page is not
967 // running. Since the worker registered a listener for tabs.onCreated, it
968 // will be started to dispatch the event once we create a tab.
969 ExtensionTestMessageListener newtab_listener("hello-newtab", false);
970 newtab_listener.set_failure_message("WRONG_NEWTAB");
971 content::WebContents* new_web_contents =
Istiaque Ahmed7105f2a2017-10-07 01:11:59972 AddTab(browser(), GURL(url::kAboutBlankURL));
973 EXPECT_TRUE(new_web_contents);
974 EXPECT_TRUE(newtab_listener.WaitUntilSatisfied());
975}
976
977// Tests that events to service worker correctly after browser restart.
978// This test is similar to EventsToStoppedExtension, except that the event
979// delivery is verified after a browser restart.
980IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest,
981 PRE_EventsAfterRestart) {
982 LazyBackgroundObserver lazy_observer;
983 ResultCatcher catcher;
984 const Extension* extension = LoadExtensionWithFlags(
985 test_data_dir_.AppendASCII("service_worker/events_to_stopped_extension"),
986 kFlagNone);
987 ASSERT_TRUE(extension);
988 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
989
990 ProcessManager* pm = ProcessManager::Get(browser()->profile());
991 EXPECT_GT(pm->GetLazyKeepaliveCount(extension), 0);
992
993 // |extension|'s background page opens a tab to its resource.
994 content::WebContents* extension_web_contents =
995 browser()->tab_strip_model()->GetActiveWebContents();
996 EXPECT_TRUE(content::WaitForLoadStop(extension_web_contents));
997 EXPECT_EQ(extension->GetResourceURL("page.html").spec(),
998 extension_web_contents->GetURL().spec());
999 {
1000 // Let the service worker start and register a listener to
1001 // chrome.tabs.onCreated event.
1002 ExtensionTestMessageListener add_listener_done("listener-added", false);
1003 content::ExecuteScriptAsync(extension_web_contents,
1004 "window.runServiceWorkerAsync()");
1005 EXPECT_TRUE(add_listener_done.WaitUntilSatisfied());
1006
1007 base::RunLoop run_loop;
1008 content::StoragePartition* storage_partition =
1009 content::BrowserContext::GetDefaultStoragePartition(
1010 browser()->profile());
1011 content::StopServiceWorkerForPattern(
1012 storage_partition->GetServiceWorkerContext(),
1013 // The service worker is registered at the top level scope.
1014 extension->url(), run_loop.QuitClosure());
1015 run_loop.Run();
1016 }
1017
1018 // Close the tab to |extension|'s resource. This will also close the
1019 // extension's event page.
1020 browser()->tab_strip_model()->CloseWebContentsAt(
1021 browser()->tab_strip_model()->active_index(), TabStripModel::CLOSE_NONE);
1022 lazy_observer.Wait();
1023}
1024
Han Leond717ddc2018-05-03 00:33:141025// Flaky: http://crbug/834200.
1026IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest,
1027 DISABLED_EventsAfterRestart) {
Istiaque Ahmed7105f2a2017-10-07 01:11:591028 ExtensionTestMessageListener newtab_listener("hello-newtab", false);
1029 content::WebContents* new_web_contents =
1030 AddTab(browser(), GURL(url::kAboutBlankURL));
Istiaque Ahmed805f6a83b2017-10-05 01:23:261031 EXPECT_TRUE(new_web_contents);
1032 EXPECT_TRUE(newtab_listener.WaitUntilSatisfied());
1033}
1034
lazyboy4c82177a2016-10-18 00:04:091035// Tests that worker ref count increments while extension API function is
1036// active.
Istiaque Ahmedea5ed5042017-09-25 19:00:161037IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, WorkerRefCount) {
lazyboy4c82177a2016-10-18 00:04:091038 // Extensions APIs from SW are only enabled on trunk.
1039 ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
1040 const Extension* extension = LoadExtensionWithFlags(
1041 test_data_dir_.AppendASCII("service_worker/api_worker_ref_count"),
1042 kFlagNone);
1043 ASSERT_TRUE(extension);
1044 ui_test_utils::NavigateToURL(browser(),
1045 extension->GetResourceURL("page.html"));
1046 content::WebContents* web_contents =
1047 browser()->tab_strip_model()->GetActiveWebContents();
1048
1049 ExtensionTestMessageListener worker_start_listener("WORKER STARTED", false);
1050 worker_start_listener.set_failure_message("FAILURE");
1051 ASSERT_TRUE(
1052 content::ExecuteScript(web_contents, "window.runServiceWorker()"));
1053 ASSERT_TRUE(worker_start_listener.WaitUntilSatisfied());
1054
1055 // Service worker should have no pending requests because it hasn't peformed
1056 // any extension API request yet.
1057 EXPECT_EQ(0u, GetWorkerRefCount(extension->url()));
1058
1059 ExtensionTestMessageListener worker_listener("CHECK_REF_COUNT", true);
1060 worker_listener.set_failure_message("FAILURE");
1061 ASSERT_TRUE(content::ExecuteScript(web_contents, "window.testSendMessage()"));
1062 ASSERT_TRUE(worker_listener.WaitUntilSatisfied());
1063
1064 // Service worker should have exactly one pending request because
1065 // chrome.test.sendMessage() API call is in-flight.
1066 EXPECT_EQ(1u, GetWorkerRefCount(extension->url()));
1067
1068 // Peform another extension API request while one is ongoing.
1069 {
1070 ExtensionTestMessageListener listener("CHECK_REF_COUNT", true);
1071 listener.set_failure_message("FAILURE");
1072 ASSERT_TRUE(
1073 content::ExecuteScript(web_contents, "window.testSendMessage()"));
1074 ASSERT_TRUE(listener.WaitUntilSatisfied());
1075
1076 // Service worker currently has two extension API requests in-flight.
1077 EXPECT_EQ(2u, GetWorkerRefCount(extension->url()));
1078 // Finish executing the nested chrome.test.sendMessage() first.
1079 listener.Reply("Hello world");
1080 }
1081
Istiaque Ahmedb57c9752017-08-20 19:08:571082 ExtensionTestMessageListener worker_completion_listener("SUCCESS_FROM_WORKER",
1083 false);
lazyboy4c82177a2016-10-18 00:04:091084 // Finish executing chrome.test.sendMessage().
1085 worker_listener.Reply("Hello world");
Istiaque Ahmedb57c9752017-08-20 19:08:571086 EXPECT_TRUE(worker_completion_listener.WaitUntilSatisfied());
1087
1088 // The following block makes sure we have received all the IPCs related to
1089 // ref-count from the worker.
1090 {
1091 // The following roundtrip:
1092 // browser->extension->worker->extension->browser
1093 // will ensure that the worker sent the relevant ref count IPCs.
1094 std::string result;
1095 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
1096 web_contents, "window.roundtripToWorker();", &result));
1097 EXPECT_EQ("roundtrip-succeeded", result);
1098
1099 // Ensure IO thread IPCs run.
Gabriel Charette01507a22017-09-27 21:30:081100 content::RunAllTasksUntilIdle();
Istiaque Ahmedb57c9752017-08-20 19:08:571101 }
lazyboy4c82177a2016-10-18 00:04:091102
1103 // The ref count should drop to 0.
1104 EXPECT_EQ(0u, GetWorkerRefCount(extension->url()));
1105}
1106
lazyboyaea32c22016-01-04 21:37:071107// This test loads a web page that has an iframe pointing to a
1108// chrome-extension:// URL. The URL is listed in the extension's
1109// web_accessible_resources. Initially the iframe is served from the extension's
1110// resource file. After verifying that, we register a Service Worker that
1111// controls the extension. Further requests to the same resource as before
1112// should now be served by the Service Worker.
1113// This test also verifies that if the requested resource exists in the manifest
1114// but is not present in the extension directory, the Service Worker can still
1115// serve the resource file.
Istiaque Ahmedea5ed5042017-09-25 19:00:161116IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, WebAccessibleResourcesIframeSrc) {
lazyboyaea32c22016-01-04 21:37:071117 const Extension* extension = LoadExtensionWithFlags(
1118 test_data_dir_.AppendASCII(
1119 "service_worker/web_accessible_resources/iframe_src"),
1120 kFlagNone);
1121 ASSERT_TRUE(extension);
1122 ASSERT_TRUE(StartEmbeddedTestServer());
falkenad185092016-06-16 06:10:021123
1124 // Service workers can only control secure contexts
1125 // (https://w3c.github.io/webappsec-secure-contexts/). For documents, this
1126 // typically means the document must have a secure origin AND all its ancestor
1127 // frames must have documents with secure origins. However, extension pages
1128 // are considered secure, even if they have an ancestor document that is an
1129 // insecure context (see GetSchemesBypassingSecureContextCheckWhitelist). So
1130 // extension service workers must be able to control an extension page
1131 // embedded in an insecure context. To test this, set up an insecure
1132 // (non-localhost, non-https) URL for the web page. This page will create
1133 // iframes that load extension pages that must be controllable by service
1134 // worker.
falkenad185092016-06-16 06:10:021135 GURL page_url =
1136 embedded_test_server()->GetURL("a.com",
1137 "/extensions/api_test/service_worker/"
1138 "web_accessible_resources/webpage.html");
1139 EXPECT_FALSE(content::IsOriginSecure(page_url));
lazyboyaea32c22016-01-04 21:37:071140
1141 content::WebContents* web_contents = AddTab(browser(), page_url);
1142 std::string result;
1143 // webpage.html will create an iframe pointing to a resource from |extension|.
1144 // Expect the resource to be served by the extension.
1145 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
1146 web_contents, base::StringPrintf("window.testIframe('%s', 'iframe.html')",
1147 extension->id().c_str()),
1148 &result));
1149 EXPECT_EQ("FROM_EXTENSION_RESOURCE", result);
1150
1151 ExtensionTestMessageListener service_worker_ready_listener("SW_READY", false);
1152 EXPECT_TRUE(ExecuteScriptInBackgroundPageNoWait(
1153 extension->id(), "window.registerServiceWorker()"));
1154 EXPECT_TRUE(service_worker_ready_listener.WaitUntilSatisfied());
1155
1156 result.clear();
1157 // webpage.html will create another iframe pointing to a resource from
1158 // |extension| as before. But this time, the resource should be be served
1159 // from the Service Worker.
1160 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
1161 web_contents, base::StringPrintf("window.testIframe('%s', 'iframe.html')",
1162 extension->id().c_str()),
1163 &result));
1164 EXPECT_EQ("FROM_SW_RESOURCE", result);
1165
1166 result.clear();
1167 // webpage.html will create yet another iframe pointing to a resource that
1168 // exists in the extension manifest's web_accessible_resources, but is not
1169 // present in the extension directory. Expect the resources of the iframe to
1170 // be served by the Service Worker.
1171 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
1172 web_contents,
1173 base::StringPrintf("window.testIframe('%s', 'iframe_non_existent.html')",
1174 extension->id().c_str()),
1175 &result));
1176 EXPECT_EQ("FROM_SW_RESOURCE", result);
1177}
1178
Istiaque Ahmedea5ed5042017-09-25 19:00:161179IN_PROC_BROWSER_TEST_P(ServiceWorkerBackgroundSyncTest, Sync) {
Elly Fong-Jones4a4f21d2018-05-30 15:04:161180 if (IsMacViewsMode())
1181 return;
lazyboybd325ae2015-11-18 21:35:261182 const Extension* extension = LoadExtensionWithFlags(
1183 test_data_dir_.AppendASCII("service_worker/sync"), kFlagNone);
1184 ASSERT_TRUE(extension);
1185 ui_test_utils::NavigateToURL(browser(),
1186 extension->GetResourceURL("page.html"));
1187 content::WebContents* web_contents =
1188 browser()->tab_strip_model()->GetActiveWebContents();
1189
1190 // Prevent firing by going offline.
1191 content::background_sync_test_util::SetOnline(web_contents, false);
1192
1193 ExtensionTestMessageListener sync_listener("SYNC: send-chats", false);
1194 sync_listener.set_failure_message("FAIL");
1195
1196 std::string result;
1197 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
1198 web_contents, "window.runServiceWorker()", &result));
1199 ASSERT_EQ("SERVICE_WORKER_READY", result);
1200
1201 EXPECT_FALSE(sync_listener.was_satisfied());
1202 // Resume firing by going online.
1203 content::background_sync_test_util::SetOnline(web_contents, true);
1204 EXPECT_TRUE(sync_listener.WaitUntilSatisfied());
1205}
1206
Istiaque Ahmedea5ed5042017-09-25 19:00:161207IN_PROC_BROWSER_TEST_P(ServiceWorkerTest,
horo1eeddde2015-11-19 05:59:251208 FetchFromContentScriptShouldNotGoToServiceWorkerOfPage) {
1209 ASSERT_TRUE(StartEmbeddedTestServer());
1210 GURL page_url = embedded_test_server()->GetURL(
1211 "/extensions/api_test/service_worker/content_script_fetch/"
1212 "controlled_page/index.html");
1213 content::WebContents* tab =
1214 browser()->tab_strip_model()->GetActiveWebContents();
1215 ui_test_utils::NavigateToURL(browser(), page_url);
1216 content::WaitForLoadStop(tab);
1217
1218 std::string value;
1219 ASSERT_TRUE(
1220 content::ExecuteScriptAndExtractString(tab, "register();", &value));
1221 EXPECT_EQ("SW controlled", value);
1222
1223 ASSERT_TRUE(RunExtensionTest("service_worker/content_script_fetch"))
1224 << message_;
1225}
1226
Istiaque Ahmedea5ed5042017-09-25 19:00:161227IN_PROC_BROWSER_TEST_P(ServiceWorkerPushMessagingTest, OnPush) {
lazyboy561b7de2015-11-19 19:27:301228 const Extension* extension = LoadExtensionWithFlags(
1229 test_data_dir_.AppendASCII("service_worker/push_messaging"), kFlagNone);
1230 ASSERT_TRUE(extension);
1231 GURL extension_url = extension->url();
1232
1233 ASSERT_NO_FATAL_FAILURE(GrantNotificationPermissionForTest(extension_url));
1234
1235 GURL url = extension->GetResourceURL("page.html");
1236 ui_test_utils::NavigateToURL(browser(), url);
1237
1238 content::WebContents* web_contents =
1239 browser()->tab_strip_model()->GetActiveWebContents();
1240
1241 // Start the ServiceWorker.
1242 ExtensionTestMessageListener ready_listener("SERVICE_WORKER_READY", false);
1243 ready_listener.set_failure_message("SERVICE_WORKER_FAILURE");
1244 const char* kScript = "window.runServiceWorker()";
1245 EXPECT_TRUE(content::ExecuteScript(web_contents->GetMainFrame(), kScript));
1246 EXPECT_TRUE(ready_listener.WaitUntilSatisfied());
1247
1248 PushMessagingAppIdentifier app_identifier =
1249 GetAppIdentifierForServiceWorkerRegistration(0LL, extension_url);
johnmea5045732016-09-08 17:23:291250 ASSERT_EQ(app_identifier.app_id(), gcm_driver()->last_gettoken_app_id());
1251 EXPECT_EQ("1234567890", gcm_driver()->last_gettoken_authorized_entity());
lazyboy561b7de2015-11-19 19:27:301252
lazyboyd429e2582016-05-20 20:18:521253 base::RunLoop run_loop;
lazyboy561b7de2015-11-19 19:27:301254 // Send a push message via gcm and expect the ServiceWorker to receive it.
1255 ExtensionTestMessageListener push_message_listener("OK", false);
1256 push_message_listener.set_failure_message("FAIL");
1257 gcm::IncomingMessage message;
1258 message.sender_id = "1234567890";
1259 message.raw_data = "testdata";
1260 message.decrypted = true;
lazyboyd429e2582016-05-20 20:18:521261 push_service()->SetMessageCallbackForTesting(run_loop.QuitClosure());
lazyboy561b7de2015-11-19 19:27:301262 push_service()->OnMessage(app_identifier.app_id(), message);
1263 EXPECT_TRUE(push_message_listener.WaitUntilSatisfied());
lazyboyd429e2582016-05-20 20:18:521264 run_loop.Run(); // Wait until the message is handled by push service.
lazyboy561b7de2015-11-19 19:27:301265}
1266
Istiaque Ahmedea5ed5042017-09-25 19:00:161267IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, FilteredEvents) {
Istiaque Ahmed9d1666182017-09-21 23:58:181268 // Extensions APIs from SW are only enabled on trunk.
1269 ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
1270 ASSERT_TRUE(RunExtensionTest("service_worker/filtered_events"));
1271}
1272
Rob Wue89b90032018-02-16 19:46:081273IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, MimeHandlerView) {
1274 ASSERT_TRUE(RunExtensionTest("service_worker/mime_handler_view"));
1275}
1276
Istiaque Ahmed9ce21b32017-10-10 20:43:181277IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest,
1278 PRE_FilteredEventsAfterRestart) {
1279 LazyBackgroundObserver lazy_observer;
1280 ResultCatcher catcher;
1281 const Extension* extension = LoadExtensionWithFlags(
1282 test_data_dir_.AppendASCII(
1283 "service_worker/filtered_events_after_restart"),
1284 kFlagNone);
1285 ASSERT_TRUE(extension);
1286 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1287
1288 // |extension|'s background page opens a tab to its resource.
1289 content::WebContents* extension_web_contents =
1290 browser()->tab_strip_model()->GetActiveWebContents();
1291 EXPECT_TRUE(content::WaitForLoadStop(extension_web_contents));
1292 EXPECT_EQ(extension->GetResourceURL("page.html").spec(),
1293 extension_web_contents->GetURL().spec());
1294 {
1295 // Let the service worker start and register a filtered listener to
1296 // chrome.webNavigation.onCommitted event.
1297 ExtensionTestMessageListener add_listener_done("listener-added", false);
1298 add_listener_done.set_failure_message("FAILURE");
1299 content::ExecuteScriptAsync(extension_web_contents,
1300 "window.runServiceWorkerAsync()");
1301 EXPECT_TRUE(add_listener_done.WaitUntilSatisfied());
1302
1303 base::RunLoop run_loop;
1304 content::StoragePartition* storage_partition =
1305 content::BrowserContext::GetDefaultStoragePartition(
1306 browser()->profile());
1307 content::StopServiceWorkerForPattern(
1308 storage_partition->GetServiceWorkerContext(),
1309 // The service worker is registered at the top level scope.
1310 extension->url(), run_loop.QuitClosure());
1311 run_loop.Run();
1312 }
1313
1314 // Close the tab to |extension|'s resource. This will also close the
1315 // extension's event page.
1316 browser()->tab_strip_model()->CloseWebContentsAt(
1317 browser()->tab_strip_model()->active_index(), TabStripModel::CLOSE_NONE);
1318 lazy_observer.Wait();
1319}
1320
Trent Apted1d8b22d2018-05-28 03:12:381321// Flaky. See https://crbug.com/844821.
Istiaque Ahmed9ce21b32017-10-10 20:43:181322IN_PROC_BROWSER_TEST_P(ServiceWorkerLazyBackgroundTest,
Trent Apted1d8b22d2018-05-28 03:12:381323 DISABLED_FilteredEventsAfterRestart) {
Istiaque Ahmed9ce21b32017-10-10 20:43:181324 // Create a tab to a.html, expect it to navigate to b.html. The service worker
1325 // will see two webNavigation.onCommitted events.
1326 ASSERT_TRUE(StartEmbeddedTestServer());
1327 GURL page_url = embedded_test_server()->GetURL(
1328 "/extensions/api_test/service_worker/filtered_events_after_restart/"
1329 "a.html");
1330 ExtensionTestMessageListener worker_filtered_event_listener(
1331 "PASS_FROM_WORKER", false);
1332 worker_filtered_event_listener.set_failure_message("FAIL_FROM_WORKER");
1333 content::WebContents* web_contents = AddTab(browser(), page_url);
1334 EXPECT_TRUE(web_contents);
1335 EXPECT_TRUE(worker_filtered_event_listener.WaitUntilSatisfied());
1336}
1337
Istiaque Ahmedea5ed5042017-09-25 19:00:161338// Run with both native and JS-based bindings. This ensures that both stable
1339// (JS) and experimental (native) phases work correctly with worker scripts
1340// while we launch native bindings to stable.
1341INSTANTIATE_TEST_CASE_P(ServiceWorkerTestWithNativeBindings,
1342 ServiceWorkerTest,
1343 ::testing::Values(NATIVE_BINDINGS));
1344INSTANTIATE_TEST_CASE_P(ServiceWorkerTestWithJSBindings,
1345 ServiceWorkerTest,
1346 ::testing::Values(JAVASCRIPT_BINDINGS));
1347INSTANTIATE_TEST_CASE_P(ServiceWorkerBackgroundSyncTestWithNativeBindings,
1348 ServiceWorkerBackgroundSyncTest,
1349 ::testing::Values(NATIVE_BINDINGS));
1350INSTANTIATE_TEST_CASE_P(ServiceWorkerBackgroundSyncTestWithJSBindings,
1351 ServiceWorkerBackgroundSyncTest,
1352 ::testing::Values(JAVASCRIPT_BINDINGS));
1353INSTANTIATE_TEST_CASE_P(ServiceWorkerPushMessagingTestWithNativeBindings,
1354 ServiceWorkerPushMessagingTest,
1355 ::testing::Values(NATIVE_BINDINGS));
1356INSTANTIATE_TEST_CASE_P(ServiceWorkerPushMessagingTestWithJSBindings,
1357 ServiceWorkerPushMessagingTest,
1358 ::testing::Values(JAVASCRIPT_BINDINGS));
Istiaque Ahmed805f6a83b2017-10-05 01:23:261359INSTANTIATE_TEST_CASE_P(ServiceWorkerLazyBackgroundTestWithNativeBindings,
1360 ServiceWorkerLazyBackgroundTest,
1361 ::testing::Values(NATIVE_BINDINGS));
1362INSTANTIATE_TEST_CASE_P(ServiceWorkerLazyBackgroundTestWithJSBindings,
1363 ServiceWorkerLazyBackgroundTest,
1364 ::testing::Values(JAVASCRIPT_BINDINGS));
Istiaque Ahmedccb444022018-06-19 02:11:121365INSTANTIATE_TEST_CASE_P(ServiceWorkerTestWithNativeBindings,
1366 ServiceWorkerBasedBackgroundTest,
1367 ::testing::Values(NATIVE_BINDINGS));
1368INSTANTIATE_TEST_CASE_P(ServiceWorkerTestWithJSBindings,
1369 ServiceWorkerBasedBackgroundTest,
1370 ::testing::Values(JAVASCRIPT_BINDINGS));
Istiaque Ahmedea5ed5042017-09-25 19:00:161371
annekao38685502015-07-14 17:46:391372} // namespace extensions