Commit b3548b1b authored by Ghazale Hosseinabadi's avatar Ghazale Hosseinabadi Committed by Commit Bot

[Extensions] Display an error when service worker registration fails.

This CL displays an error in chrome://extensions page when service
worker registrations fails, as opposed to calling DCHECK(false).

Bug: 1136582
Change-Id: Ie1619a922966d1b2e16ca316dc8f5dae8d448616
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2505602
Commit-Queue: Ghazale Hosseinabadi <ghazale@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827016}
parent 2c337159
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "chrome/browser/extensions/browsertest_util.h" #include "chrome/browser/extensions/browsertest_util.h"
#include "chrome/browser/extensions/chrome_test_extension_loader.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h"
#include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/error_console/error_console.h"
#include "chrome/browser/extensions/extension_action_runner.h" #include "chrome/browser/extensions/extension_action_runner.h"
#include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
...@@ -36,6 +37,7 @@ ...@@ -36,6 +37,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/api/web_navigation.h" #include "chrome/common/extensions/api/web_navigation.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "components/content_settings/core/common/content_settings_types.h" #include "components/content_settings/core/common/content_settings_types.h"
#include "components/gcm_driver/fake_gcm_profile_service.h" #include "components/gcm_driver/fake_gcm_profile_service.h"
...@@ -117,6 +119,39 @@ constexpr char kTestExtensionId[] = "ogdbpbegnmindpdjfafpmpicikegejdj"; ...@@ -117,6 +119,39 @@ constexpr char kTestExtensionId[] = "ogdbpbegnmindpdjfafpmpicikegejdj";
} // namespace } // namespace
class ErrorObserver : public ErrorConsole::Observer {
public:
ErrorObserver(size_t errors_expected, ErrorConsole* error_console)
: errors_expected_(errors_expected),
error_console_(error_console),
errors_observed_(0),
observer_(this) {
observer_.Add(error_console_);
}
// ErrorConsole::Observer implementation.
void OnErrorAdded(const ExtensionError* error) override {
++errors_observed_;
if (errors_observed_ >= errors_expected_) {
run_loop_.Quit();
}
}
// Spin until the appropriate number of errors have been observed.
void WaitForErrors() {
if (errors_observed_ < errors_expected_) {
run_loop_.Run();
}
}
private:
size_t errors_expected_;
ErrorConsole* error_console_;
size_t errors_observed_;
ScopedObserver<ErrorConsole, ErrorConsole::Observer> observer_;
base::RunLoop run_loop_;
};
class ServiceWorkerTest : public ExtensionApiTest { class ServiceWorkerTest : public ExtensionApiTest {
public: public:
ServiceWorkerTest() : current_channel_(version_info::Channel::STABLE) {} ServiceWorkerTest() : current_channel_(version_info::Channel::STABLE) {}
...@@ -348,6 +383,26 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, Basic) { ...@@ -348,6 +383,26 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, Basic) {
EXPECT_TRUE(newtab_listener.WaitUntilSatisfied()); EXPECT_TRUE(newtab_listener.WaitUntilSatisfied());
} }
// Tests that an error is generated if the service worker script is
// saved in non-root directory.
IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, NonRootDirectory) {
ErrorConsole* error_console = ErrorConsole::Get(profile());
profile()->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
constexpr size_t kErrorsExpected = 1u;
ErrorObserver observer(kErrorsExpected, error_console);
const Extension* extension = LoadExtension(test_data_dir_.AppendASCII(
"service_worker/worker_based_background/non_root_directory"));
observer.WaitForErrors();
const ErrorList& error_list =
error_console->GetErrorsForExtension(extension->id());
ASSERT_EQ(kErrorsExpected, error_list.size());
ASSERT_EQ(
error_list[0]->message(),
base::string16(base::ASCIIToUTF16("Service worker registration failed")));
}
// Tests chrome.runtime.onInstalled fires for extension service workers. // Tests chrome.runtime.onInstalled fires for extension service workers.
IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, OnInstalledEvent) { IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, OnInstalledEvent) {
ASSERT_TRUE(RunExtensionTest( ASSERT_TRUE(RunExtensionTest(
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
{
"name": "Service Worker-based background script",
"version": "0.1",
"manifest_version": 2,
"description": "Test reporting error to UI for service worker-based extensions.",
"background": {"service_worker": "js/service_worker_background.js"}
}
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/utf_string_conversions.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -17,12 +18,15 @@ ...@@ -17,12 +18,15 @@
#include "content/public/browser/service_worker_context.h" #include "content/public/browser/service_worker_context.h"
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
#include "extensions/browser/extension_error.h"
#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_util.h" #include "extensions/browser/extension_util.h"
#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/process_manager.h" #include "extensions/browser/process_manager.h"
#include "extensions/browser/service_worker_task_queue_factory.h" #include "extensions/browser/service_worker_task_queue_factory.h"
#include "extensions/common/constants.h" #include "extensions/common/constants.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/background_info.h"
using content::BrowserContext; using content::BrowserContext;
...@@ -493,8 +497,14 @@ void ServiceWorkerTaskQueue::DidRegisterServiceWorker( ...@@ -493,8 +497,14 @@ void ServiceWorkerTaskQueue::DidRegisterServiceWorker(
success); success);
if (!success) { if (!success) {
// TODO(lazyboy): Handle failure case thoroughly. auto error = std::make_unique<ManifestError>(
DCHECK(false) << "Failed to register Service Worker"; extension_id, base::UTF8ToUTF16("Service worker registration failed"),
base::UTF8ToUTF16(manifest_keys::kBackground),
base::UTF8ToUTF16(
BackgroundInfo::GetBackgroundServiceWorkerScript(extension)));
ExtensionsBrowserClient::Get()->ReportError(browser_context_,
std::move(error));
return; return;
} }
UMA_HISTOGRAM_TIMES("Extensions.ServiceWorkerBackground.RegistrationTime", UMA_HISTOGRAM_TIMES("Extensions.ServiceWorkerBackground.RegistrationTime",
......
...@@ -23,6 +23,7 @@ const char kAppDisplayMode[] = "app.display_mode"; ...@@ -23,6 +23,7 @@ const char kAppDisplayMode[] = "app.display_mode";
const char kAppIconColor[] = "app.icon_color"; const char kAppIconColor[] = "app.icon_color";
const char kAppThemeColor[] = "app.theme_color"; const char kAppThemeColor[] = "app.theme_color";
const char kAutomation[] = "automation"; const char kAutomation[] = "automation";
const char kBackground[] = "background";
const char kBackgroundAllowJsAccess[] = "background.allow_js_access"; const char kBackgroundAllowJsAccess[] = "background.allow_js_access";
const char kBackgroundPage[] = "background.page"; const char kBackgroundPage[] = "background.page";
const char kBackgroundPersistent[] = "background.persistent"; const char kBackgroundPersistent[] = "background.persistent";
......
...@@ -25,6 +25,7 @@ extern const char kAppDisplayMode[]; ...@@ -25,6 +25,7 @@ extern const char kAppDisplayMode[];
extern const char kAppIconColor[]; extern const char kAppIconColor[];
extern const char kAppThemeColor[]; extern const char kAppThemeColor[];
extern const char kAutomation[]; extern const char kAutomation[];
extern const char kBackground[];
extern const char kBackgroundAllowJsAccess[]; extern const char kBackgroundAllowJsAccess[];
extern const char kBackgroundPage[]; extern const char kBackgroundPage[];
extern const char kBackgroundPersistent[]; extern const char kBackgroundPersistent[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment