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 @@
#include "chrome/browser/extensions/browsertest_util.h"
#include "chrome/browser/extensions/chrome_test_extension_loader.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_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
......@@ -36,6 +37,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/api/web_navigation.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/gcm_driver/fake_gcm_profile_service.h"
......@@ -117,6 +119,39 @@ constexpr char kTestExtensionId[] = "ogdbpbegnmindpdjfafpmpicikegejdj";
} // 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 {
public:
ServiceWorkerTest() : current_channel_(version_info::Channel::STABLE) {}
......@@ -348,6 +383,26 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, Basic) {
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.
IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, OnInstalledEvent) {
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 @@
#include "base/bind.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_task_traits.h"
#include "content/public/browser/browser_thread.h"
......@@ -17,12 +18,15 @@
#include "content/public/browser/service_worker_context.h"
#include "content/public/browser/storage_partition.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_error.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_util.h"
#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/service_worker_task_queue_factory.h"
#include "extensions/common/constants.h"
#include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/background_info.h"
using content::BrowserContext;
......@@ -493,8 +497,14 @@ void ServiceWorkerTaskQueue::DidRegisterServiceWorker(
success);
if (!success) {
// TODO(lazyboy): Handle failure case thoroughly.
DCHECK(false) << "Failed to register Service Worker";
auto error = std::make_unique<ManifestError>(
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;
}
UMA_HISTOGRAM_TIMES("Extensions.ServiceWorkerBackground.RegistrationTime",
......
......@@ -23,6 +23,7 @@ const char kAppDisplayMode[] = "app.display_mode";
const char kAppIconColor[] = "app.icon_color";
const char kAppThemeColor[] = "app.theme_color";
const char kAutomation[] = "automation";
const char kBackground[] = "background";
const char kBackgroundAllowJsAccess[] = "background.allow_js_access";
const char kBackgroundPage[] = "background.page";
const char kBackgroundPersistent[] = "background.persistent";
......
......@@ -25,6 +25,7 @@ extern const char kAppDisplayMode[];
extern const char kAppIconColor[];
extern const char kAppThemeColor[];
extern const char kAutomation[];
extern const char kBackground[];
extern const char kBackgroundAllowJsAccess[];
extern const char kBackgroundPage[];
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