summaryrefslogtreecommitdiff
path: root/chromium/content/browser/service_worker
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/service_worker')
-rw-r--r--chromium/content/browser/service_worker/DEPS2
-rw-r--r--chromium/content/browser/service_worker/OWNERS8
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_instance.cc26
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_instance.h16
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_instance_unittest.cc14
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_registry.cc35
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_registry.h9
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_test_helper.cc9
-rw-r--r--chromium/content/browser/service_worker/embedded_worker_test_helper.h6
-rw-r--r--chromium/content/browser/service_worker/payment_handler_support.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_browsertest.cc281
-rw-r--r--chromium/content/browser/service_worker/service_worker_cache_writer.cc8
-rw-r--r--chromium/content/browser/service_worker/service_worker_client_utils.cc30
-rw-r--r--chromium/content/browser/service_worker/service_worker_client_utils.h17
-rw-r--r--chromium/content/browser/service_worker/service_worker_content_settings_proxy_impl.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_core.cc105
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_core.h54
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_core_observer.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_request_handler.cc3
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_request_handler_unittest.cc3
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_unittest.cc26
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_watcher.cc5
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_watcher.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_watcher_unittest.cc6
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_wrapper.cc71
-rw-r--r--chromium/content/browser/service_worker/service_worker_context_wrapper.h25
-rw-r--r--chromium/content/browser/service_worker/service_worker_controllee_request_handler.cc15
-rw-r--r--chromium/content/browser/service_worker/service_worker_controllee_request_handler.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc3
-rw-r--r--chromium/content/browser/service_worker/service_worker_data_pipe_reader.cc4
-rw-r--r--chromium/content/browser/service_worker/service_worker_data_pipe_reader.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_data_pipe_reader_unittest.cc2
-rw-r--r--chromium/content/browser/service_worker/service_worker_database.cc4
-rw-r--r--chromium/content/browser/service_worker/service_worker_database.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_database_unittest.cc4
-rw-r--r--chromium/content/browser/service_worker/service_worker_dispatcher_host.cc135
-rw-r--r--chromium/content/browser/service_worker/service_worker_dispatcher_host.h38
-rw-r--r--chromium/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc9
-rw-r--r--chromium/content/browser/service_worker/service_worker_fetch_dispatcher.cc6
-rw-r--r--chromium/content/browser/service_worker/service_worker_fetch_dispatcher.h4
-rw-r--r--chromium/content/browser/service_worker/service_worker_handle.cc77
-rw-r--r--chromium/content/browser/service_worker/service_worker_handle.h58
-rw-r--r--chromium/content/browser/service_worker/service_worker_handle_unittest.cc76
-rw-r--r--chromium/content/browser/service_worker/service_worker_info.cc4
-rw-r--r--chromium/content/browser/service_worker/service_worker_info.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_installed_script_loader.cc11
-rw-r--r--chromium/content/browser/service_worker/service_worker_installed_script_loader.h8
-rw-r--r--chromium/content/browser/service_worker/service_worker_installed_script_reader.cc16
-rw-r--r--chromium/content/browser/service_worker/service_worker_installed_scripts_sender.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc2
-rw-r--r--chromium/content/browser/service_worker/service_worker_internals_ui.cc52
-rw-r--r--chromium/content/browser/service_worker/service_worker_job_coordinator.cc14
-rw-r--r--chromium/content/browser/service_worker/service_worker_job_coordinator.h11
-rw-r--r--chromium/content/browser/service_worker/service_worker_job_unittest.cc116
-rw-r--r--chromium/content/browser/service_worker/service_worker_lifetime_tracker.cc2
-rw-r--r--chromium/content/browser/service_worker/service_worker_lifetime_tracker.h5
-rw-r--r--chromium/content/browser/service_worker/service_worker_metrics.cc24
-rw-r--r--chromium/content/browser/service_worker/service_worker_metrics.h3
-rw-r--r--chromium/content/browser/service_worker/service_worker_navigation_handle.h6
-rw-r--r--chromium/content/browser/service_worker/service_worker_navigation_loader.cc22
-rw-r--r--chromium/content/browser/service_worker/service_worker_navigation_loader.h28
-rw-r--r--chromium/content/browser/service_worker/service_worker_navigation_loader_unittest.cc27
-rw-r--r--chromium/content/browser/service_worker/service_worker_new_script_loader.cc92
-rw-r--r--chromium/content/browser/service_worker/service_worker_new_script_loader.h4
-rw-r--r--chromium/content/browser/service_worker/service_worker_new_script_loader_unittest.cc23
-rw-r--r--chromium/content/browser/service_worker/service_worker_process_manager.cc9
-rw-r--r--chromium/content/browser/service_worker/service_worker_process_manager_unittest.cc7
-rw-r--r--chromium/content/browser/service_worker/service_worker_provider_host.cc238
-rw-r--r--chromium/content/browser/service_worker/service_worker_provider_host.h193
-rw-r--r--chromium/content/browser/service_worker/service_worker_provider_host_unittest.cc58
-rw-r--r--chromium/content/browser/service_worker/service_worker_quota_client.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc2
-rw-r--r--chromium/content/browser/service_worker/service_worker_register_job.cc26
-rw-r--r--chromium/content/browser/service_worker/service_worker_register_job.h12
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration.cc6
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration_object_host.cc3
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration_object_host.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration_status.cc2
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration_status.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_registration_unittest.cc4
-rw-r--r--chromium/content/browser/service_worker/service_worker_request_handler.cc43
-rw-r--r--chromium/content/browser/service_worker/service_worker_request_handler.h14
-rw-r--r--chromium/content/browser/service_worker/service_worker_script_loader_factory.cc2
-rw-r--r--chromium/content/browser/service_worker/service_worker_storage.cc23
-rw-r--r--chromium/content/browser/service_worker/service_worker_storage_unittest.cc13
-rw-r--r--chromium/content/browser/service_worker/service_worker_test_utils.cc3
-rw-r--r--chromium/content/browser/service_worker/service_worker_test_utils.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_type_converters.h4
-rw-r--r--chromium/content/browser/service_worker/service_worker_unregister_job.cc14
-rw-r--r--chromium/content/browser/service_worker/service_worker_unregister_job.h6
-rw-r--r--chromium/content/browser/service_worker/service_worker_url_job_wrapper.h2
-rw-r--r--chromium/content/browser/service_worker/service_worker_url_request_job_unittest.cc9
-rw-r--r--chromium/content/browser/service_worker/service_worker_version.cc119
-rw-r--r--chromium/content/browser/service_worker/service_worker_version.h47
-rw-r--r--chromium/content/browser/service_worker/service_worker_version_unittest.cc87
-rw-r--r--chromium/content/browser/service_worker/service_worker_write_to_cache_job.cc39
-rw-r--r--chromium/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc2
98 files changed, 1263 insertions, 1416 deletions
diff --git a/chromium/content/browser/service_worker/DEPS b/chromium/content/browser/service_worker/DEPS
index b85fe4e879a..b90ca0945bd 100644
--- a/chromium/content/browser/service_worker/DEPS
+++ b/chromium/content/browser/service_worker/DEPS
@@ -1,4 +1,4 @@
include_rules = [
"+third_party/leveldatabase",
- "+third_party/WebKit/public/web/worker_content_settings_proxy.mojom.h",
+ "+third_party/blink/public/web/worker_content_settings_proxy.mojom.h",
]
diff --git a/chromium/content/browser/service_worker/OWNERS b/chromium/content/browser/service_worker/OWNERS
index 53c92bc6fce..c19a2565fc3 100644
--- a/chromium/content/browser/service_worker/OWNERS
+++ b/chromium/content/browser/service_worker/OWNERS
@@ -5,11 +5,11 @@
# //content/browser/resources/service_worker/
# //content/common/service_worker/
# //content/renderer/service_worker/
-# //third_party/WebKit/public/mojom/service_worker/
-# //third_party/WebKit/public/web/modules/serviceworker/
-# //third_party/WebKit/public/platform/modules/serviceworker/
+# //third_party/blink/public/mojom/service_worker/
+# //third_party/blink/public/web/modules/serviceworker/
+# //third_party/blink/public/platform/modules/serviceworker/
# //third_party/WebKit/LayoutTests/external/wpt/service-workers/
-# //third_party/WebKit/Source/modules/serviceworkers/
+# //third_party/blink/renderer/modules/serviceworkers/
falken@chromium.org
horo@chromium.org
diff --git a/chromium/content/browser/service_worker/embedded_worker_instance.cc b/chromium/content/browser/service_worker/embedded_worker_instance.cc
index 754f001c315..19d8459d972 100644
--- a/chromium/content/browser/service_worker/embedded_worker_instance.cc
+++ b/chromium/content/browser/service_worker/embedded_worker_instance.cc
@@ -8,7 +8,6 @@
#include "base/bind_helpers.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/trace_event/trace_event.h"
#include "content/browser/bad_message.h"
@@ -19,7 +18,6 @@
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/common/content_switches_internal.h"
#include "content/common/renderer.mojom.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/browser/browser_thread.h"
@@ -29,8 +27,8 @@
#include "content/public/common/content_client.h"
#include "content/public/common/content_switches.h"
#include "ipc/ipc_message.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/web/WebConsoleMessage.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/web/web_console_message.h"
#include "url/gurl.h"
namespace content {
@@ -460,11 +458,6 @@ class EmbeddedWorkerInstance::StartTask {
DISALLOW_COPY_AND_ASSIGN(StartTask);
};
-bool EmbeddedWorkerInstance::Listener::OnMessageReceived(
- const IPC::Message& message) {
- return false;
-}
-
EmbeddedWorkerInstance::~EmbeddedWorkerInstance() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK(status_ == EmbeddedWorkerStatus::STOPPING ||
@@ -682,6 +675,10 @@ void EmbeddedWorkerInstance::RequestTermination() {
owner_version_->StopWorkerIfIdle(true /* requested_from_renderer */);
}
+void EmbeddedWorkerInstance::CountFeature(blink::mojom::WebFeature feature) {
+ owner_version_->CountFeature(feature);
+}
+
void EmbeddedWorkerInstance::OnReadyForInspection() {
if (devtools_proxy_) {
blink::mojom::DevToolsAgentAssociatedPtrInfo devtools_agent_ptr_info;
@@ -827,8 +824,7 @@ void EmbeddedWorkerInstance::OnStopped() {
}
void EmbeddedWorkerInstance::Detach() {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (status() == EmbeddedWorkerStatus::STOPPED)
return;
registry_->DetachWorker(process_id(), embedded_worker_id());
@@ -843,14 +839,6 @@ base::WeakPtr<EmbeddedWorkerInstance> EmbeddedWorkerInstance::AsWeakPtr() {
return weak_factory_.GetWeakPtr();
}
-bool EmbeddedWorkerInstance::OnMessageReceived(const IPC::Message& message) {
- for (auto& listener : listener_list_) {
- if (listener.OnMessageReceived(message))
- return true;
- }
- return false;
-}
-
void EmbeddedWorkerInstance::OnReportException(
const base::string16& error_message,
int line_number,
diff --git a/chromium/content/browser/service_worker/embedded_worker_instance.h b/chromium/content/browser/service_worker/embedded_worker_instance.h
index 01bc2122e61..5b6566ecb6d 100644
--- a/chromium/content/browser/service_worker/embedded_worker_instance.h
+++ b/chromium/content/browser/service_worker/embedded_worker_instance.h
@@ -29,14 +29,10 @@
#include "content/common/service_worker/service_worker_event_dispatcher.mojom.h"
#include "content/common/service_worker/service_worker_status_code.h"
#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
#include "url/gurl.h"
-namespace IPC {
-class Message;
-}
-
namespace content {
class EmbeddedWorkerRegistry;
@@ -117,8 +113,6 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
const base::string16& message,
int line_number,
const GURL& source_url) {}
- // Returns false if the message is not handled by this listener.
- CONTENT_EXPORT virtual bool OnMessageReceived(const IPC::Message& message);
};
~EmbeddedWorkerInstance() override;
@@ -252,6 +246,7 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
// Implements mojom::EmbeddedWorkerInstanceHost.
// These functions all run on the IO thread.
void RequestTermination() override;
+ void CountFeature(blink::mojom::WebFeature feature) override;
void OnReadyForInspection() override;
void OnScriptLoaded() override;
// Notifies the corresponding provider host that the thread has started and is
@@ -275,11 +270,6 @@ class CONTENT_EXPORT EmbeddedWorkerInstance
int line_number,
const GURL& source_url) override;
- // Called back from Registry when the worker instance sends message
- // to the browser (i.e. EmbeddedWorker observers).
- // Returns false if the message is not handled.
- bool OnMessageReceived(const IPC::Message& message);
-
// Resets all running state. After this function is called, |status_| is
// STOPPED.
void ReleaseProcess();
diff --git a/chromium/content/browser/service_worker/embedded_worker_instance_unittest.cc b/chromium/content/browser/service_worker/embedded_worker_instance_unittest.cc
index 82e5fed9caf..b77c0716f69 100644
--- a/chromium/content/browser/service_worker/embedded_worker_instance_unittest.cc
+++ b/chromium/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -10,7 +10,6 @@
#include "base/command_line.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
@@ -22,7 +21,6 @@
#include "content/browser/service_worker/service_worker_test_utils.h"
#include "content/browser/service_worker/service_worker_version.h"
#include "content/common/service_worker/embedded_worker.mojom.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_event_dispatcher.mojom.h"
#include "content/public/common/child_process_host.h"
#include "content/public/common/content_switches.h"
@@ -30,8 +28,8 @@
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -88,14 +86,16 @@ class ProviderHostEndpoints : public mojom::ServiceWorkerContainerHost {
GetRegistrationForReadyCallback callback) override {
NOTIMPLEMENTED();
}
- void GetControllerServiceWorker(
- mojom::ControllerServiceWorkerRequest request) override {
+ void EnsureControllerServiceWorker(
+ mojom::ControllerServiceWorkerRequest request,
+ mojom::ControllerServiceWorkerPurpose purpose) override {
NOTIMPLEMENTED();
}
void CloneForWorker(
mojom::ServiceWorkerContainerHostRequest request) override {
NOTIMPLEMENTED();
}
+ void Ping(PingCallback callback) override { NOTIMPLEMENTED(); }
mojom::ServiceWorkerContainerAssociatedPtr client_;
mojo::AssociatedBinding<mojom::ServiceWorkerContainerHost> binding_;
@@ -143,8 +143,6 @@ class EmbeddedWorkerInstanceTest : public testing::Test,
RecordEvent(DETACHED, old_status);
}
- bool OnMessageReceived(const IPC::Message&) override { return false; }
-
void SetUp() override {
helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath()));
}
diff --git a/chromium/content/browser/service_worker/embedded_worker_registry.cc b/chromium/content/browser/service_worker/embedded_worker_registry.cc
index 16daab86fa5..c63e6333f45 100644
--- a/chromium/content/browser/service_worker/embedded_worker_registry.cc
+++ b/chromium/content/browser/service_worker/embedded_worker_registry.cc
@@ -12,7 +12,6 @@
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_dispatcher_host.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/public/browser/browser_thread.h"
#include "ipc/ipc_message.h"
#include "ipc/ipc_sender.h"
@@ -44,28 +43,6 @@ std::unique_ptr<EmbeddedWorkerInstance> EmbeddedWorkerRegistry::CreateWorker(
return worker;
}
-bool EmbeddedWorkerRegistry::OnMessageReceived(const IPC::Message& message,
- int process_id) {
- // TODO(kinuko): Move all EmbeddedWorker message handling from
- // ServiceWorkerDispatcherHost.
-
- EmbeddedWorkerInstance* worker =
- GetWorkerForMessage(process_id, message.routing_id());
- if (!worker) {
- // Assume this is from a detached worker, return true to indicate we're
- // purposely handling the message as no-op.
- return true;
- }
- bool handled = worker->OnMessageReceived(message);
-
- // Assume an unhandled message for a stopping worker is because the message
- // was timed out and its handler removed prior to stopping.
- // We might be more precise and record timed out request ids, but some
- // cumbersome bookkeeping is needed and the IPC messaging will soon migrate
- // to Mojo anyway.
- return handled || worker->status() == EmbeddedWorkerStatus::STOPPING;
-}
-
void EmbeddedWorkerRegistry::Shutdown() {
for (WorkerInstanceMap::iterator it = worker_map_.begin();
it != worker_map_.end();
@@ -152,16 +129,4 @@ void EmbeddedWorkerRegistry::DetachWorker(int process_id,
lifetime_tracker_.StopTiming(embedded_worker_id);
}
-EmbeddedWorkerInstance* EmbeddedWorkerRegistry::GetWorkerForMessage(
- int process_id,
- int embedded_worker_id) {
- EmbeddedWorkerInstance* worker = GetWorker(embedded_worker_id);
- if (!worker || worker->process_id() != process_id) {
- UMA_HISTOGRAM_BOOLEAN("ServiceWorker.WorkerForMessageFound", false);
- return nullptr;
- }
- UMA_HISTOGRAM_BOOLEAN("ServiceWorker.WorkerForMessageFound", true);
- return worker;
-}
-
} // namespace content
diff --git a/chromium/content/browser/service_worker/embedded_worker_registry.h b/chromium/content/browser/service_worker/embedded_worker_registry.h
index deab4b367fd..c4e25c4b695 100644
--- a/chromium/content/browser/service_worker/embedded_worker_registry.h
+++ b/chromium/content/browser/service_worker/embedded_worker_registry.h
@@ -19,10 +19,6 @@
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_status_code.h"
-namespace IPC {
-class Message;
-}
-
namespace content {
class EmbeddedWorkerInstance;
@@ -46,8 +42,6 @@ class CONTENT_EXPORT EmbeddedWorkerRegistry
const base::WeakPtr<ServiceWorkerContextCore>& context,
EmbeddedWorkerRegistry* old_registry);
- bool OnMessageReceived(const IPC::Message& message, int process_id);
-
// Creates and removes a new worker instance entry for bookkeeping.
// This doesn't actually start or stop the worker.
std::unique_ptr<EmbeddedWorkerInstance> CreateWorker(
@@ -101,9 +95,6 @@ class CONTENT_EXPORT EmbeddedWorkerRegistry
// cleanly stopped, e.g., because connection with the renderer was lost.
void DetachWorker(int process_id, int embedded_worker_id);
- EmbeddedWorkerInstance* GetWorkerForMessage(int process_id,
- int embedded_worker_id);
-
base::WeakPtr<ServiceWorkerContextCore> context_;
WorkerInstanceMap worker_map_;
diff --git a/chromium/content/browser/service_worker/embedded_worker_test_helper.cc b/chromium/content/browser/service_worker/embedded_worker_test_helper.cc
index a7a6575e0ee..963ff792cd5 100644
--- a/chromium/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/chromium/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -12,7 +12,6 @@
#include "base/atomic_sequence_num.h"
#include "base/bind.h"
-#include "base/memory/ptr_util.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -26,7 +25,6 @@
#include "content/browser/service_worker/service_worker_test_utils.h"
#include "content/common/background_fetch/background_fetch_types.h"
#include "content/common/renderer.mojom.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_event_dispatcher.mojom.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
@@ -39,7 +37,7 @@
#include "services/network/public/mojom/fetch_api.mojom.h"
#include "storage/common/blob_storage/blob_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
namespace content {
@@ -780,11 +778,6 @@ void EmbeddedWorkerTestHelper::SimulateWorkerStopped(int embedded_worker_id) {
}
}
-void EmbeddedWorkerTestHelper::SimulateSend(IPC::Message* message) {
- registry()->OnMessageReceived(*message, mock_render_process_id_);
- delete message;
-}
-
void EmbeddedWorkerTestHelper::OnStartWorkerStub(
mojom::EmbeddedWorkerStartParamsPtr params) {
EmbeddedWorkerInstance* worker =
diff --git a/chromium/content/browser/service_worker/embedded_worker_test_helper.h b/chromium/content/browser/service_worker/embedded_worker_test_helper.h
index 0a3369c66c7..c0cd7275d30 100644
--- a/chromium/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/chromium/content/browser/service_worker/embedded_worker_test_helper.h
@@ -14,7 +14,6 @@
#include "base/callback.h"
#include "base/containers/hash_tables.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "base/time/time.h"
@@ -27,8 +26,8 @@
#include "ipc/ipc_test_sink.h"
#include "mojo/public/cpp/bindings/associated_binding.h"
#include "net/http/http_response_info.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
#include "url/gurl.h"
class GURL;
@@ -275,7 +274,6 @@ class EmbeddedWorkerTestHelper : public IPC::Sender,
void SimulateWorkerScriptEvaluated(int embedded_worker_id, bool success);
void SimulateWorkerStarted(int embedded_worker_id);
void SimulateWorkerStopped(int embedded_worker_id);
- void SimulateSend(IPC::Message* message);
EmbeddedWorkerRegistry* registry();
diff --git a/chromium/content/browser/service_worker/payment_handler_support.h b/chromium/content/browser/service_worker/payment_handler_support.h
index 4e74d28c527..34ae62d2b71 100644
--- a/chromium/content/browser/service_worker/payment_handler_support.h
+++ b/chromium/content/browser/service_worker/payment_handler_support.h
@@ -6,7 +6,7 @@
#define CONTENT_BROWSER_SERVICE_WORKER_PAYMENT_HANDLER_SUPPORT_H_
#include "base/callback.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
class GURL;
diff --git a/chromium/content/browser/service_worker/service_worker_browsertest.cc b/chromium/content/browser/service_worker/service_worker_browsertest.cc
index 0d7a6c42b25..baf6eb5e6ab 100644
--- a/chromium/content/browser/service_worker/service_worker_browsertest.cc
+++ b/chromium/content/browser/service_worker/service_worker_browsertest.cc
@@ -14,7 +14,6 @@
#include "base/command_line.h"
#include "base/json/json_reader.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/metrics/statistics_recorder.h"
#include "base/run_loop.h"
@@ -25,6 +24,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/task_scheduler/post_task.h"
#include "base/task_scheduler/task_traits.h"
+#include "base/test/bind_test_util.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
@@ -88,9 +88,9 @@
#include "storage/browser/blob/blob_data_snapshot.h"
#include "storage/browser/blob/blob_reader.h"
#include "storage/browser/blob/blob_storage_context.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
using blink::mojom::CacheStorageError;
@@ -98,8 +98,10 @@ namespace content {
namespace {
-// V8ScriptRunner::setCacheTimeStamp() stores 12 byte data (tag + timestamp).
-const int kV8CacheTimeStampDataSize = sizeof(unsigned) + sizeof(double);
+// V8ScriptRunner::setCacheTimeStamp() stores 16 byte data (marker + tag +
+// timestamp).
+const int kV8CacheTimeStampDataSize =
+ sizeof(uint32_t) + sizeof(uint32_t) + sizeof(double);
struct FetchResult {
ServiceWorkerStatusCode status;
@@ -108,26 +110,25 @@ struct FetchResult {
std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
};
-void RunAndQuit(const base::Closure& closure,
- const base::Closure& quit,
+void RunAndQuit(base::OnceClosure closure,
+ base::OnceClosure quit,
base::SingleThreadTaskRunner* original_message_loop) {
- closure.Run();
- original_message_loop->PostTask(FROM_HERE, quit);
+ std::move(closure).Run();
+ original_message_loop->PostTask(FROM_HERE, std::move(quit));
}
-void RunOnIOThreadWithDelay(const base::Closure& closure,
- base::TimeDelta delay) {
+void RunOnIOThreadWithDelay(base::OnceClosure closure, base::TimeDelta delay) {
base::RunLoop run_loop;
BrowserThread::PostDelayedTask(
BrowserThread::IO, FROM_HERE,
- base::BindOnce(&RunAndQuit, closure, run_loop.QuitClosure(),
+ base::BindOnce(&RunAndQuit, std::move(closure), run_loop.QuitClosure(),
base::RetainedRef(base::ThreadTaskRunnerHandle::Get())),
delay);
run_loop.Run();
}
-void RunOnIOThread(const base::Closure& closure) {
- RunOnIOThreadWithDelay(closure, base::TimeDelta());
+void RunOnIOThread(base::OnceClosure closure) {
+ RunOnIOThreadWithDelay(std::move(closure), base::TimeDelta());
}
void RunOnIOThread(
@@ -138,8 +139,9 @@ void RunOnIOThread(
base::ThreadTaskRunnerHandle::Get().get(),
FROM_HERE,
run_loop.QuitClosure());
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
- base::BindOnce(closure, quit_on_original_thread));
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::BindOnce(closure, std::move(quit_on_original_thread)));
run_loop.Run();
}
@@ -181,7 +183,7 @@ void ReadResponseBody(std::string* body,
}
void ExpectResultAndRun(bool expected,
- const base::Closure& continuation,
+ base::RepeatingClosure continuation,
bool actual) {
EXPECT_EQ(expected, actual);
continuation.Run();
@@ -194,7 +196,8 @@ class WorkerActivatedObserver
explicit WorkerActivatedObserver(ServiceWorkerContextWrapper* context)
: context_(context) {}
void Init() {
- RunOnIOThread(base::Bind(&WorkerActivatedObserver::InitOnIOThread, this));
+ RunOnIOThread(
+ base::BindOnce(&WorkerActivatedObserver::InitOnIOThread, this));
}
// ServiceWorkerContextCoreObserver overrides.
void OnVersionStateChanged(int64_t version_id,
@@ -358,10 +361,10 @@ void CountScriptResources(
}
void StoreString(std::string* result,
- const base::Closure& callback,
+ base::OnceClosure callback,
const base::Value* value) {
value->GetAsString(result);
- callback.Run();
+ std::move(callback).Run();
}
int GetInt(const base::DictionaryValue& dict, base::StringPiece path) {
@@ -450,12 +453,13 @@ class ServiceWorkerBrowserTest : public ContentBrowserTest {
wrapper_ = static_cast<ServiceWorkerContextWrapper*>(
partition->GetServiceWorkerContext());
- RunOnIOThread(base::Bind(&self::SetUpOnIOThread, base::Unretained(this)));
+ RunOnIOThread(
+ base::BindOnce(&self::SetUpOnIOThread, base::Unretained(this)));
}
void TearDownOnMainThread() override {
RunOnIOThread(
- base::Bind(&self::TearDownOnIOThread, base::Unretained(this)));
+ base::BindOnce(&self::TearDownOnIOThread, base::Unretained(this)));
wrapper_ = nullptr;
}
@@ -510,7 +514,6 @@ class ConsoleListener : public EmbeddedWorkerInstance::Listener {
ASSERT_EQ(messages_.size(), expected_message_count);
}
- bool OnMessageReceived(const IPC::Message& message) override { return false; }
const std::vector<base::string16>& messages() const { return messages_; }
private:
@@ -587,8 +590,8 @@ class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
void InstallTestHelper(const std::string& worker_url,
ServiceWorkerStatusCode expected_status) {
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this), worker_url));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this), worker_url));
// Dispatch install on a worker.
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
@@ -737,8 +740,9 @@ class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
store_run_loop.Run();
ASSERT_EQ(expected_status, status);
- RunOnIOThread(base::Bind(&self::NotifyDoneInstallingRegistrationOnIOThread,
- base::Unretained(this), status));
+ RunOnIOThread(
+ base::BindOnce(&self::NotifyDoneInstallingRegistrationOnIOThread,
+ base::Unretained(this), status));
}
void FindRegistrationForId(int64_t id,
@@ -940,9 +944,9 @@ class ServiceWorkerVersionBrowserTest : public ServiceWorkerBrowserTest {
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartAndStop) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
// Start a worker.
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
@@ -963,12 +967,14 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartAndStop) {
stop_run_loop.Run();
}
+// TODO(lunalu): remove this test when blink side use counter is removed
+// (crbug.com/811948).
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
DropCountsOnBlinkUseCounter) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
// Start a worker.
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
base::RunLoop start_run_loop;
@@ -981,7 +987,7 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
// Expect no PageVisits count.
EXPECT_EQ(nullptr, base::StatisticsRecorder::FindHistogram(
- "Blink.UseCounter.Features"));
+ "Blink.UseCounter.Features_Legacy"));
// Stop the worker.
base::RunLoop stop_run_loop;
@@ -992,14 +998,14 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
stop_run_loop.Run();
// Expect no PageVisits count.
EXPECT_EQ(nullptr, base::StatisticsRecorder::FindHistogram(
- "Blink.UseCounter.Features"));
+ "Blink.UseCounter.Features_Legacy"));
}
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, StartNotFound) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/nonexistent.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/nonexistent.js"));
// Start a worker for nonexistent URL.
StartWorker(SERVICE_WORKER_ERROR_NETWORK);
@@ -1015,9 +1021,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
MAYBE_ReadResourceFailure) {
StartServerAndNavigateToSetup();
// Create a registration.
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
version_->set_fetch_handler_existence(
ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
@@ -1037,8 +1043,8 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
// The registration should be deleted from storage since the broken worker was
// the stored one.
- RunOnIOThread(base::Bind(&self::RemoveLiveRegistrationOnIOThread,
- base::Unretained(this), registration_->id()));
+ RunOnIOThread(base::BindOnce(&self::RemoveLiveRegistrationOnIOThread,
+ base::Unretained(this), registration_->id()));
FindRegistrationForId(registration_->id(),
registration_->pattern().GetOrigin(),
SERVICE_WORKER_ERROR_NOT_FOUND);
@@ -1054,16 +1060,16 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
// Give the version a controllee.
RunOnIOThread(
- base::Bind(&self::AddControlleeOnIOThread, base::Unretained(this)));
+ base::BindOnce(&self::AddControlleeOnIOThread, base::Unretained(this)));
// Add a non-existent resource to the version.
version_->script_cache_map()->resource_map_[version_->script_url()] =
ServiceWorkerDatabase::ResourceRecord(30, version_->script_url(), 100);
// Make a waiting version and store it.
- RunOnIOThread(base::Bind(&self::AddWaitingWorkerOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::AddWaitingWorkerOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
std::vector<ServiceWorkerDatabase::ResourceRecord> records = {
ServiceWorkerDatabase::ResourceRecord(31, version_->script_url(), 100)};
registration_->waiting_version()->script_cache_map()->SetResources(records);
@@ -1078,8 +1084,8 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
// The registration should still be in storage since the waiting worker was
// the stored one.
- RunOnIOThread(base::Bind(&self::RemoveLiveRegistrationOnIOThread,
- base::Unretained(this), registration_->id()));
+ RunOnIOThread(base::BindOnce(&self::RemoveLiveRegistrationOnIOThread,
+ base::Unretained(this), registration_->id()));
FindRegistrationForId(registration_->id(),
registration_->pattern().GetOrigin(),
SERVICE_WORKER_OK);
@@ -1149,14 +1155,14 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
InstallWithWaitUntil_RejectConsoleMessage) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/worker_install_rejected.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker_install_rejected.js"));
ConsoleListener console_listener;
- RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener,
- base::Unretained(version_->embedded_worker()),
- &console_listener));
+ RunOnIOThread(base::BindOnce(&EmbeddedWorkerInstance::AddListener,
+ base::Unretained(version_->embedded_worker()),
+ &console_listener));
// Dispatch install on a worker.
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
@@ -1173,9 +1179,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
console_listener.WaitForConsoleMessages(1);
ASSERT_NE(base::string16::npos,
console_listener.messages()[0].find(expected));
- RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener,
- base::Unretained(version_->embedded_worker()),
- &console_listener));
+ RunOnIOThread(base::BindOnce(&EmbeddedWorkerInstance::RemoveListener,
+ base::Unretained(version_->embedded_worker()),
+ &console_listener));
}
class WaitForLoaded : public EmbeddedWorkerInstance::Listener {
@@ -1186,7 +1192,6 @@ class WaitForLoaded : public EmbeddedWorkerInstance::Listener {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit_);
}
- bool OnMessageReceived(const IPC::Message& message) override { return false; }
private:
base::Closure quit_;
@@ -1194,26 +1199,26 @@ class WaitForLoaded : public EmbeddedWorkerInstance::Listener {
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/while_true_worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/while_true_worker.js"));
// Start a worker, waiting until the script is loaded.
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
base::RunLoop start_run_loop;
base::RunLoop load_run_loop;
WaitForLoaded wait_for_load(load_run_loop.QuitClosure());
- RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener,
- base::Unretained(version_->embedded_worker()),
- &wait_for_load));
+ RunOnIOThread(base::BindOnce(&EmbeddedWorkerInstance::AddListener,
+ base::Unretained(version_->embedded_worker()),
+ &wait_for_load));
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::BindOnce(&self::StartOnIOThread, base::Unretained(this),
start_run_loop.QuitClosure(), &status));
load_run_loop.Run();
- RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener,
- base::Unretained(version_->embedded_worker()),
- &wait_for_load));
+ RunOnIOThread(base::BindOnce(&EmbeddedWorkerInstance::RemoveListener,
+ base::Unretained(version_->embedded_worker()),
+ &wait_for_load));
// The script has loaded but start has not completed yet.
ASSERT_EQ(SERVICE_WORKER_ERROR_FAILED, status);
@@ -1222,7 +1227,7 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) {
// Simulate execution timeout. Use a delay to prevent killing the worker
// before it's started execution.
RunOnIOThreadWithDelay(
- base::Bind(&self::TimeoutWorkerOnIOThread, base::Unretained(this)),
+ base::BindOnce(&self::TimeoutWorkerOnIOThread, base::Unretained(this)),
base::TimeDelta::FromMilliseconds(100));
start_run_loop.Run();
@@ -1231,9 +1236,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutStartingWorker) {
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutWorkerInEvent) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/while_true_in_install_worker.js"));
+ RunOnIOThread(
+ base::BindOnce(&self::SetUpRegistrationOnIOThread, base::Unretained(this),
+ "/service_worker/while_true_in_install_worker.js"));
// Start a worker.
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
@@ -1255,7 +1260,7 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, TimeoutWorkerInEvent) {
// Simulate execution timeout. Use a delay to prevent killing the worker
// before it's started execution.
RunOnIOThreadWithDelay(
- base::Bind(&self::TimeoutWorkerOnIOThread, base::Unretained(this)),
+ base::BindOnce(&self::TimeoutWorkerOnIOThread, base::Unretained(this)),
base::TimeDelta::FromMilliseconds(100));
install_run_loop.Run();
@@ -1283,9 +1288,8 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Response) {
EXPECT_EQ(expected_headers, response.headers);
std::string body;
- RunOnIOThread(
- base::Bind(&ReadResponseBody,
- &body, base::Owned(blob_data_handle.release())));
+ RunOnIOThread(base::BindOnce(&ReadResponseBody, &body,
+ base::Owned(blob_data_handle.release())));
EXPECT_EQ("This resource is gone. Gone, gone, gone.", body);
}
@@ -1333,9 +1337,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
SERVICE_WORKER_OK);
ConsoleListener console_listener;
- RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::AddListener,
- base::Unretained(version_->embedded_worker()),
- &console_listener));
+ RunOnIOThread(base::BindOnce(&EmbeddedWorkerInstance::AddListener,
+ base::Unretained(version_->embedded_worker()),
+ &console_listener));
FetchOnRegisteredWorker(&result, &response, &blob_data_handle);
const base::string16 expected1 = base::ASCIIToUTF16(
@@ -1346,9 +1350,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
ASSERT_NE(base::string16::npos,
console_listener.messages()[0].find(expected1));
ASSERT_EQ(0u, console_listener.messages()[1].find(expected2));
- RunOnIOThread(base::Bind(&EmbeddedWorkerInstance::RemoveListener,
- base::Unretained(version_->embedded_worker()),
- &console_listener));
+ RunOnIOThread(base::BindOnce(&EmbeddedWorkerInstance::RemoveListener,
+ base::Unretained(version_->embedded_worker()),
+ &console_listener));
ASSERT_EQ(ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse,
result);
@@ -1609,7 +1613,7 @@ class ServiceWorkerNavigationPreloadTest : public ServiceWorkerBrowserTest {
content::ResourceContext* resource_context,
OnHeaderProcessedCallback callback) {
DCHECK_EQ(kNavigationPreloadHeaderName, header);
- callback.Run(HeaderInterceptorResult::KILL);
+ std::move(callback).Run(HeaderInterceptorResult::KILL);
}
void SetupForNavigationPreloadTest(const GURL& scope,
@@ -2401,10 +2405,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, ImportsBustMemcache) {
const base::string16 kOKTitle(base::ASCIIToUTF16("OK"));
const base::string16 kFailTitle(base::ASCIIToUTF16("FAIL"));
- RunOnIOThread(
- base::Bind(&CreateLongLivedResourceInterceptors,
- embedded_test_server()->GetURL(kScriptUrl),
- embedded_test_server()->GetURL(kImportUrl)));
+ RunOnIOThread(base::BindOnce(&CreateLongLivedResourceInterceptors,
+ embedded_test_server()->GetURL(kScriptUrl),
+ embedded_test_server()->GetURL(kImportUrl)));
TitleWatcher title_watcher(shell()->web_contents(), kOKTitle);
title_watcher.AlsoWaitForTitle(kFailTitle);
@@ -2415,11 +2418,9 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, ImportsBustMemcache) {
// Verify the number of resources in the implicit script cache is correct.
const int kExpectedNumResources = 2;
int num_resources = 0;
- RunOnIOThread(
- base::Bind(&CountScriptResources,
- base::Unretained(wrapper()),
- embedded_test_server()->GetURL(kScopeUrl),
- &num_resources));
+ RunOnIOThread(base::BindOnce(
+ &CountScriptResources, base::Unretained(wrapper()),
+ embedded_test_server()->GetURL(kScopeUrl), &num_resources));
EXPECT_EQ(kExpectedNumResources, num_resources);
}
@@ -2441,23 +2442,23 @@ class StopObserver : public ServiceWorkerVersion::Listener {
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, RendererCrash) {
// Start a worker.
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
StartWorker(SERVICE_WORKER_OK);
// Crash the renderer process. The version should stop.
base::RunLoop run_loop;
StopObserver observer(run_loop.QuitClosure());
- RunOnIOThread(base::Bind(&ServiceWorkerVersion::AddListener,
- base::Unretained(version_.get()), &observer));
+ RunOnIOThread(base::BindOnce(&ServiceWorkerVersion::AddListener,
+ base::Unretained(version_.get()), &observer));
shell()->web_contents()->GetMainFrame()->GetProcess()->Shutdown(
- content::RESULT_CODE_KILLED, false /* wait */);
+ content::RESULT_CODE_KILLED);
run_loop.Run();
EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status());
- RunOnIOThread(base::Bind(&ServiceWorkerVersion::RemoveListener,
- base::Unretained(version_.get()), &observer));
+ RunOnIOThread(base::BindOnce(&ServiceWorkerVersion::RemoveListener,
+ base::Unretained(version_.get()), &observer));
}
class ServiceWorkerBlackBoxBrowserTest : public ServiceWorkerBrowserTest {
@@ -2486,13 +2487,7 @@ class ServiceWorkerBlackBoxBrowserTest : public ServiceWorkerBrowserTest {
};
static int CountRenderProcessHosts() {
- int result = 0;
- for (RenderProcessHost::iterator iter(RenderProcessHost::AllHostsIterator());
- !iter.IsAtEnd();
- iter.Advance()) {
- result++;
- }
- return result;
+ return RenderProcessHost::GetCurrentRenderProcessCountForTesting();
}
IN_PROC_BROWSER_TEST_F(ServiceWorkerBlackBoxBrowserTest, Registration) {
@@ -2629,6 +2624,10 @@ class ServiceWorkerVersionBrowserV8CacheTest
public ServiceWorkerVersion::Listener {
public:
using self = ServiceWorkerVersionBrowserV8CacheTest;
+ ServiceWorkerVersionBrowserV8CacheTest() {
+ scoped_feature_list_.InitAndDisableFeature(
+ features::kServiceWorkerScriptFullCodeCache);
+ }
~ServiceWorkerVersionBrowserV8CacheTest() override {
if (version_)
version_->RemoveListener(this);
@@ -2652,13 +2651,16 @@ class ServiceWorkerVersionBrowserV8CacheTest
base::Closure cache_updated_closure_;
size_t metadata_size_ = 0;
+
+ private:
+ base::test::ScopedFeatureList scoped_feature_list_;
};
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserV8CacheTest, Restart) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationAndListenerOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationAndListenerOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
{
base::RunLoop cached_metadata_run_loop;
cache_updated_closure_ = cached_metadata_run_loop.QuitClosure();
@@ -2732,9 +2734,9 @@ class ServiceWorkerVersionBrowserV8FullCodeCacheTest
IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserV8FullCodeCacheTest,
FullCode) {
StartServerAndNavigateToSetup();
- RunOnIOThread(base::Bind(&self::SetUpRegistrationAndListenerOnIOThread,
- base::Unretained(this),
- "/service_worker/worker.js"));
+ RunOnIOThread(base::BindOnce(&self::SetUpRegistrationAndListenerOnIOThread,
+ base::Unretained(this),
+ "/service_worker/worker.js"));
base::RunLoop cached_metadata_run_loop;
cache_updated_closure_ = cached_metadata_run_loop.QuitClosure();
@@ -2818,46 +2820,17 @@ class CacheStorageSideDataSizeChecker
const base::Closure& continuation,
CacheStorageCacheHandle cache_handle,
CacheStorageError error,
- std::unique_ptr<ServiceWorkerResponse> response,
- std::unique_ptr<storage::BlobDataHandle> blob_data_handle) {
+ std::unique_ptr<ServiceWorkerResponse> response) {
ASSERT_EQ(CacheStorageError::kSuccess, error);
- blob_data_handle_ = std::move(blob_data_handle);
- blob_reader_ = blob_data_handle_->CreateReader();
- const storage::BlobReader::Status status = blob_reader_->CalculateSize(
- base::BindOnce(&self::OnBlobReaderCalculateSizeCallback, this, result,
- continuation));
-
- ASSERT_NE(storage::BlobReader::Status::NET_ERROR, status);
- if (status == storage::BlobReader::Status::DONE)
- OnBlobReaderCalculateSizeCallback(result, continuation, net::OK);
- }
-
- void OnBlobReaderCalculateSizeCallback(int* result,
- const base::Closure& continuation,
- int size_result) {
- ASSERT_EQ(net::OK, size_result);
- if (!blob_reader_->has_side_data()) {
- blob_reader_ = nullptr;
- continuation.Run();
- return;
- }
- const storage::BlobReader::Status status = blob_reader_->ReadSideData(
- base::Bind(&self::OnBlobReaderReadSideDataCallback, this, result,
- continuation));
- ASSERT_NE(storage::BlobReader::Status::NET_ERROR, status);
- if (status == storage::BlobReader::Status::DONE) {
- OnBlobReaderReadSideDataCallback(result, continuation,
- storage::BlobReader::Status::DONE);
- }
- }
-
- void OnBlobReaderReadSideDataCallback(int* result,
- const base::Closure& continuation,
- storage::BlobReader::Status status) {
- ASSERT_NE(storage::BlobReader::Status::NET_ERROR, status);
- *result = blob_reader_->side_data()->size();
- blob_reader_ = nullptr;
- continuation.Run();
+ ASSERT_TRUE(response->blob);
+ auto blob = response->blob;
+ response->blob->get()->ReadSideData(base::BindLambdaForTesting(
+ [blob, result,
+ continuation](const base::Optional<std::vector<uint8_t>>& data) {
+ if (data)
+ *result = data->size();
+ continuation.Run();
+ }));
}
CacheStorageContextImpl* cache_storage_context_;
@@ -2865,8 +2838,6 @@ class CacheStorageSideDataSizeChecker
const GURL origin_;
const std::string cache_name_;
const GURL url_;
- std::unique_ptr<storage::BlobDataHandle> blob_data_handle_;
- std::unique_ptr<storage::BlobReader> blob_reader_;
DISALLOW_COPY_AND_ASSIGN(CacheStorageSideDataSizeChecker);
};
diff --git a/chromium/content/browser/service_worker/service_worker_cache_writer.cc b/chromium/content/browser/service_worker/service_worker_cache_writer.cc
index dceaa6117d7..b58e6db84b0 100644
--- a/chromium/content/browser/service_worker/service_worker_cache_writer.cc
+++ b/chromium/content/browser/service_worker/service_worker_cache_writer.cc
@@ -433,7 +433,7 @@ int ServiceWorkerCacheWriter::ReadInfoHelper(
net::CompletionCallback run_callback = base::Bind(
&ServiceWorkerCacheWriter::AsyncDoLoop, weak_factory_.GetWeakPtr());
scoped_refptr<AsyncOnlyCompletionCallbackAdaptor> adaptor(
- new AsyncOnlyCompletionCallbackAdaptor(run_callback));
+ new AsyncOnlyCompletionCallbackAdaptor(std::move(run_callback)));
reader->ReadInfo(
buf, base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
adaptor));
@@ -448,7 +448,7 @@ int ServiceWorkerCacheWriter::ReadDataHelper(
net::CompletionCallback run_callback = base::Bind(
&ServiceWorkerCacheWriter::AsyncDoLoop, weak_factory_.GetWeakPtr());
scoped_refptr<AsyncOnlyCompletionCallbackAdaptor> adaptor(
- new AsyncOnlyCompletionCallbackAdaptor(run_callback));
+ new AsyncOnlyCompletionCallbackAdaptor(std::move(run_callback)));
reader->ReadData(
buf, buf_len,
base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
@@ -464,7 +464,7 @@ int ServiceWorkerCacheWriter::WriteInfoHelper(
net::CompletionCallback run_callback = base::Bind(
&ServiceWorkerCacheWriter::AsyncDoLoop, weak_factory_.GetWeakPtr());
scoped_refptr<AsyncOnlyCompletionCallbackAdaptor> adaptor(
- new AsyncOnlyCompletionCallbackAdaptor(run_callback));
+ new AsyncOnlyCompletionCallbackAdaptor(std::move(run_callback)));
writer->WriteInfo(
buf, base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
adaptor));
@@ -479,7 +479,7 @@ int ServiceWorkerCacheWriter::WriteDataHelper(
net::CompletionCallback run_callback = base::Bind(
&ServiceWorkerCacheWriter::AsyncDoLoop, weak_factory_.GetWeakPtr());
scoped_refptr<AsyncOnlyCompletionCallbackAdaptor> adaptor(
- new AsyncOnlyCompletionCallbackAdaptor(run_callback));
+ new AsyncOnlyCompletionCallbackAdaptor(std::move(run_callback)));
writer->WriteData(
buf, buf_len,
base::BindOnce(&AsyncOnlyCompletionCallbackAdaptor::WrappedCallback,
diff --git a/chromium/content/browser/service_worker/service_worker_client_utils.cc b/chromium/content/browser/service_worker/service_worker_client_utils.cc
index fdf5de6526d..b27c2d353f7 100644
--- a/chromium/content/browser/service_worker/service_worker_client_utils.cc
+++ b/chromium/content/browser/service_worker/service_worker_client_utils.cc
@@ -9,7 +9,6 @@
#include "base/location.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/browser/frame_host/frame_tree_node.h"
@@ -25,13 +24,15 @@
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/page_navigator.h"
+#include "content/public/browser/payment_app_provider.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/common/child_process_host.h"
#include "services/network/public/mojom/request_context_frame_type.mojom.h"
-#include "third_party/WebKit/public/mojom/page/page_visibility_state.mojom.h"
+#include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
+#include "ui/base/mojo/window_open_disposition.mojom.h"
#include "url/gurl.h"
namespace content {
@@ -160,7 +161,9 @@ blink::mojom::ServiceWorkerClientInfoPtr FocusOnUI(
}
// This is only called for main frame navigations in OpenWindowOnUI().
-void DidOpenURLOnUI(OpenURLCallback callback, WebContents* web_contents) {
+void DidOpenURLOnUI(WindowType type,
+ OpenURLCallback callback,
+ WebContents* web_contents) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents) {
@@ -183,6 +186,12 @@ void DidOpenURLOnUI(OpenURLCallback callback, WebContents* web_contents) {
new OpenURLObserver(web_contents,
rfhi->frame_tree_node()->frame_tree_node_id(),
std::move(callback));
+
+ if (type == WindowType::PAYMENT_HANDLER_WINDOW) {
+ // Set the opened web_contents to payment app provider to manage its life
+ // cycle.
+ PaymentAppProvider::GetInstance()->SetOpenedWindow(web_contents);
+ }
}
void OpenWindowOnUI(
@@ -190,7 +199,7 @@ void OpenWindowOnUI(
const GURL& script_url,
int worker_process_id,
const scoped_refptr<ServiceWorkerContextWrapper>& context_wrapper,
- WindowOpenDisposition disposition,
+ WindowType type,
OpenURLCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -216,13 +225,16 @@ void OpenWindowOnUI(
url,
Referrer::SanitizeForRequest(
url, Referrer(script_url, blink::kWebReferrerPolicyDefault)),
- disposition, ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
- true /* is_renderer_initiated */);
+ type == WindowType::PAYMENT_HANDLER_WINDOW
+ ? WindowOpenDisposition::NEW_POPUP
+ : WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ ui::PAGE_TRANSITION_AUTO_TOPLEVEL, true /* is_renderer_initiated */);
+ params.open_app_window_if_possible = type == WindowType::NEW_TAB_WINDOW;
GetContentClient()->browser()->OpenURL(
browser_context, params,
base::AdaptCallbackForRepeating(
- base::BindOnce(&DidOpenURLOnUI, std::move(callback))));
+ base::BindOnce(&DidOpenURLOnUI, type, std::move(callback))));
}
void NavigateClientOnUI(const GURL& url,
@@ -446,14 +458,14 @@ void OpenWindow(const GURL& url,
const GURL& script_url,
int worker_process_id,
const base::WeakPtr<ServiceWorkerContextCore>& context,
- WindowOpenDisposition disposition,
+ WindowType type,
NavigationCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::BindOnce(
&OpenWindowOnUI, url, script_url, worker_process_id,
- base::WrapRefCounted(context->wrapper()), disposition,
+ base::WrapRefCounted(context->wrapper()), type,
base::BindOnce(&DidNavigate, context, script_url.GetOrigin(),
std::move(callback))));
}
diff --git a/chromium/content/browser/service_worker/service_worker_client_utils.h b/chromium/content/browser/service_worker/service_worker_client_utils.h
index 74d5cefff90..93ac4aba752 100644
--- a/chromium/content/browser/service_worker/service_worker_client_utils.h
+++ b/chromium/content/browser/service_worker/service_worker_client_utils.h
@@ -11,8 +11,7 @@
#include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "content/common/service_worker/service_worker_status_code.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_client.mojom.h"
-#include "ui/base/mojo/window_open_disposition.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
class GURL;
@@ -34,18 +33,28 @@ using ServiceWorkerClientPtrs =
using ClientsCallback =
base::OnceCallback<void(std::unique_ptr<ServiceWorkerClientPtrs> clients)>;
+// The type of an opened window.
+enum class WindowType {
+ NEW_TAB_WINDOW = 0,
+ PAYMENT_HANDLER_WINDOW,
+};
+
// Focuses the window client associated with |provider_host|. |callback| is
// called with the client information on completion.
void FocusWindowClient(ServiceWorkerProviderHost* provider_host,
ClientCallback callback);
// Opens a new window and navigates it to |url|. |callback| is called with the
-// window's client information on completion.
+// window's client information on completion. If |type| is NEW_TAB_WINDOW, we
+// will open a new app window, if there is an app installed that has |url| in
+// its scope. What an "installed app" is depends on the embedder of content. In
+// Chrome's case, it is an installed Progressive Web App. If there is no such
+// app, we will open a new foreground tab instead.
void OpenWindow(const GURL& url,
const GURL& script_url,
int worker_process_id,
const base::WeakPtr<ServiceWorkerContextCore>& context,
- WindowOpenDisposition disposition,
+ WindowType type,
NavigationCallback callback);
// Navigates the client specified by |process_id| and |frame_id| to |url|.
diff --git a/chromium/content/browser/service_worker/service_worker_content_settings_proxy_impl.h b/chromium/content/browser/service_worker/service_worker_content_settings_proxy_impl.h
index ac195dff926..d519ce707d8 100644
--- a/chromium/content/browser/service_worker/service_worker_content_settings_proxy_impl.h
+++ b/chromium/content/browser/service_worker/service_worker_content_settings_proxy_impl.h
@@ -9,7 +9,7 @@
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/common/content_export.h"
#include "mojo/public/cpp/bindings/binding.h"
-#include "third_party/WebKit/public/web/worker_content_settings_proxy.mojom.h"
+#include "third_party/blink/public/web/worker_content_settings_proxy.mojom.h"
#include "url/origin.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_context_core.cc b/chromium/content/browser/service_worker/service_worker_context_core.cc
index a7ce9eae6a9..d5b665ca761 100644
--- a/chromium/content/browser/service_worker/service_worker_context_core.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_core.cc
@@ -39,8 +39,8 @@
#include "net/http/http_response_headers.h"
#include "net/http/http_response_info.h"
#include "storage/browser/quota/quota_manager_proxy.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "url/gurl.h"
namespace content {
@@ -89,7 +89,10 @@ void SuccessReportingCallback(
bool IsSameOriginClientProviderHost(const GURL& origin,
ServiceWorkerProviderHost* host) {
return host->IsProviderForClient() &&
- host->document_url().GetOrigin() == origin;
+ host->document_url().GetOrigin() == origin &&
+ // Don't expose "reserved" clients (clients that are not yet execution
+ // ready) to the Clients API.
+ host->is_execution_ready();
}
bool IsSameOriginWindowProviderHost(const GURL& origin,
@@ -150,7 +153,7 @@ class ClearAllServiceWorkersHelper
for (const auto& registration_info : registrations) {
context->UnregisterServiceWorker(
registration_info.pattern,
- base::Bind(&ClearAllServiceWorkersHelper::OnResult, this));
+ base::BindOnce(&ClearAllServiceWorkersHelper::OnResult, this));
}
}
@@ -340,8 +343,7 @@ ServiceWorkerDispatcherHost* ServiceWorkerContextCore::GetDispatcherHost(
}
void ServiceWorkerContextCore::RemoveDispatcherHost(int process_id) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
// TODO(falken) Try to remove this call. It should be unnecessary because
// provider hosts remove themselves when their Mojo connection to the renderer
// is destroyed. But if we don't remove the hosts immediately here, collisions
@@ -353,8 +355,7 @@ void ServiceWorkerContextCore::RemoveDispatcherHost(int process_id) {
void ServiceWorkerContextCore::AddProviderHost(
std::unique_ptr<ServiceWorkerProviderHost> host) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
int process_id = host->process_id();
int provider_id = host->provider_id();
ProviderMap* map = GetProviderMapForProcess(process_id);
@@ -368,6 +369,7 @@ void ServiceWorkerContextCore::AddProviderHost(
ServiceWorkerProviderHost* ServiceWorkerContextCore::GetProviderHost(
int process_id,
int provider_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
ProviderMap* map = GetProviderMapForProcess(process_id);
if (!map)
return nullptr;
@@ -376,8 +378,7 @@ ServiceWorkerProviderHost* ServiceWorkerContextCore::GetProviderHost(
void ServiceWorkerContextCore::RemoveProviderHost(
int process_id, int provider_id) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
ProviderMap* map = GetProviderMapForProcess(process_id);
DCHECK(map);
map->Remove(provider_id);
@@ -385,38 +386,28 @@ void ServiceWorkerContextCore::RemoveProviderHost(
void ServiceWorkerContextCore::RemoveAllProviderHostsForProcess(
int process_id) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (providers_->Lookup(process_id))
providers_->Remove(process_id);
}
std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator>
-ServiceWorkerContextCore::GetProviderHostIterator() {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- return base::WrapUnique(new ProviderHostIterator(
- providers_.get(), ProviderHostIterator::ProviderHostPredicate()));
-}
-
-std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator>
ServiceWorkerContextCore::GetClientProviderHostIterator(const GURL& origin) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
return base::WrapUnique(new ProviderHostIterator(
providers_.get(), base::Bind(IsSameOriginClientProviderHost, origin)));
}
void ServiceWorkerContextCore::HasMainFrameProviderHost(
const GURL& origin,
- const BoolCallback& callback) const {
+ BoolCallback callback) const {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
ProviderHostIterator provider_host_iterator(
providers_.get(), base::Bind(IsSameOriginWindowProviderHost, origin));
if (provider_host_iterator.IsAtEnd()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(callback, false));
+ FROM_HERE, base::BindOnce(std::move(callback), false));
return;
}
@@ -433,9 +424,8 @@ void ServiceWorkerContextCore::HasMainFrameProviderHost(
BrowserThread::PostTaskAndReplyWithResult(
BrowserThread::UI, FROM_HERE,
- base::Bind(&FrameListContainsMainFrameOnUI,
- base::Passed(std::move(render_frames))),
- callback);
+ base::BindOnce(&FrameListContainsMainFrameOnUI, std::move(render_frames)),
+ std::move(callback));
}
void ServiceWorkerContextCore::RegisterProviderHostByClientID(
@@ -462,13 +452,13 @@ ServiceWorkerProviderHost* ServiceWorkerContextCore::GetProviderHostByClientID(
void ServiceWorkerContextCore::RegisterServiceWorker(
const GURL& script_url,
const blink::mojom::ServiceWorkerRegistrationOptions& options,
- const RegistrationCallback& callback) {
+ RegistrationCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
was_service_worker_registered_ = true;
job_coordinator_->Register(
script_url, options,
- base::Bind(&ServiceWorkerContextCore::RegistrationComplete, AsWeakPtr(),
- options.scope, callback));
+ base::BindOnce(&ServiceWorkerContextCore::RegistrationComplete,
+ AsWeakPtr(), options.scope, std::move(callback)));
}
void ServiceWorkerContextCore::UpdateServiceWorker(
@@ -482,29 +472,25 @@ void ServiceWorkerContextCore::UpdateServiceWorker(
ServiceWorkerRegistration* registration,
bool force_bypass_cache,
bool skip_script_comparison,
- const UpdateCallback& callback) {
+ UpdateCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- job_coordinator_->Update(registration, force_bypass_cache,
- skip_script_comparison,
- base::Bind(&ServiceWorkerContextCore::UpdateComplete,
- AsWeakPtr(), callback));
+ job_coordinator_->Update(
+ registration, force_bypass_cache, skip_script_comparison,
+ base::BindOnce(&ServiceWorkerContextCore::UpdateComplete, AsWeakPtr(),
+ std::move(callback)));
}
void ServiceWorkerContextCore::UnregisterServiceWorker(
const GURL& pattern,
- const UnregistrationCallback& callback) {
+ UnregistrationCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
job_coordinator_->Unregister(
- pattern,
- base::Bind(&ServiceWorkerContextCore::UnregistrationComplete,
- AsWeakPtr(),
- pattern,
- callback));
+ pattern, base::BindOnce(&ServiceWorkerContextCore::UnregistrationComplete,
+ AsWeakPtr(), pattern, std::move(callback)));
}
-void ServiceWorkerContextCore::DeleteForOrigin(
- const GURL& origin,
- base::OnceCallback<void(ServiceWorkerStatusCode)> callback) {
+void ServiceWorkerContextCore::DeleteForOrigin(const GURL& origin,
+ StatusCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
storage()->GetRegistrationsForOrigin(
origin,
@@ -545,26 +531,25 @@ void ServiceWorkerContextCore::DidGetRegistrationsForDeleteForOrigin(
ServiceWorkerContextCore::ProviderMap*
ServiceWorkerContextCore::GetProviderMapForProcess(int process_id) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
return providers_->Lookup(process_id);
}
void ServiceWorkerContextCore::RegistrationComplete(
const GURL& pattern,
- const ServiceWorkerContextCore::RegistrationCallback& callback,
+ ServiceWorkerContextCore::RegistrationCallback callback,
ServiceWorkerStatusCode status,
const std::string& status_message,
ServiceWorkerRegistration* registration) {
if (status != SERVICE_WORKER_OK) {
DCHECK(!registration);
- callback.Run(status, status_message,
- blink::mojom::kInvalidServiceWorkerRegistrationId);
+ std::move(callback).Run(status, status_message,
+ blink::mojom::kInvalidServiceWorkerRegistrationId);
return;
}
DCHECK(registration);
- callback.Run(status, status_message, registration->id());
+ std::move(callback).Run(status, status_message, registration->id());
// TODO(falken): At this point the registration promise is resolved, but we
// haven't persisted anything to storage yet. So we should either call
// OnRegistrationStored somewhere else or change its name.
@@ -576,27 +561,27 @@ void ServiceWorkerContextCore::RegistrationComplete(
}
void ServiceWorkerContextCore::UpdateComplete(
- const ServiceWorkerContextCore::UpdateCallback& callback,
+ ServiceWorkerContextCore::UpdateCallback callback,
ServiceWorkerStatusCode status,
const std::string& status_message,
ServiceWorkerRegistration* registration) {
if (status != SERVICE_WORKER_OK) {
DCHECK(!registration);
- callback.Run(status, status_message,
- blink::mojom::kInvalidServiceWorkerRegistrationId);
+ std::move(callback).Run(status, status_message,
+ blink::mojom::kInvalidServiceWorkerRegistrationId);
return;
}
DCHECK(registration);
- callback.Run(status, status_message, registration->id());
+ std::move(callback).Run(status, status_message, registration->id());
}
void ServiceWorkerContextCore::UnregistrationComplete(
const GURL& pattern,
- const ServiceWorkerContextCore::UnregistrationCallback& callback,
+ ServiceWorkerContextCore::UnregistrationCallback callback,
int64_t registration_id,
ServiceWorkerStatusCode status) {
- callback.Run(status);
+ std::move(callback).Run(status);
if (status == SERVICE_WORKER_OK && observer_list_.get()) {
observer_list_->Notify(
FROM_HERE, &ServiceWorkerContextCoreObserver::OnRegistrationDeleted,
@@ -721,10 +706,9 @@ void ServiceWorkerContextCore::ScheduleDeleteAndStartOver() const {
wrapper_));
}
-void ServiceWorkerContextCore::DeleteAndStartOver(
- const StatusCallback& callback) {
+void ServiceWorkerContextCore::DeleteAndStartOver(StatusCallback callback) {
job_coordinator_->AbortAll();
- storage_->DeleteAndStartOver(callback);
+ storage_->DeleteAndStartOver(std::move(callback));
}
void ServiceWorkerContextCore::ClearAllServiceWorkersForTest(
@@ -748,8 +732,7 @@ void ServiceWorkerContextCore::CheckHasServiceWorker(
storage()->FindRegistrationForDocument(
url, base::BindOnce(&ServiceWorkerContextCore::
DidFindRegistrationForCheckHasServiceWorker,
- AsWeakPtr(), other_url,
- base::Passed(std::move(callback))));
+ AsWeakPtr(), other_url, std::move(callback)));
}
void ServiceWorkerContextCore::UpdateVersionFailureCount(
diff --git a/chromium/content/browser/service_worker/service_worker_context_core.h b/chromium/content/browser/service_worker/service_worker_context_core.h
index 892c3950941..18389af21fb 100644
--- a/chromium/content/browser/service_worker/service_worker_context_core.h
+++ b/chromium/content/browser/service_worker/service_worker_context_core.h
@@ -25,7 +25,7 @@
#include "content/browser/service_worker/service_worker_storage.h"
#include "content/common/content_export.h"
#include "content/public/browser/service_worker_context.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
class GURL;
@@ -59,17 +59,19 @@ class URLLoaderFactoryGetter;
class CONTENT_EXPORT ServiceWorkerContextCore
: public ServiceWorkerVersion::Listener {
public:
- using BoolCallback = base::Callback<void(bool)>;
- using StatusCallback = base::Callback<void(ServiceWorkerStatusCode status)>;
+ using BoolCallback = base::OnceCallback<void(bool)>;
+ using StatusCallback =
+ base::OnceCallback<void(ServiceWorkerStatusCode status)>;
using RegistrationCallback =
- base::Callback<void(ServiceWorkerStatusCode status,
- const std::string& status_message,
- int64_t registration_id)>;
- using UpdateCallback = base::Callback<void(ServiceWorkerStatusCode status,
- const std::string& status_message,
- int64_t registration_id)>;
+ base::OnceCallback<void(ServiceWorkerStatusCode status,
+ const std::string& status_message,
+ int64_t registration_id)>;
+ using UpdateCallback =
+ base::OnceCallback<void(ServiceWorkerStatusCode status,
+ const std::string& status_message,
+ int64_t registration_id)>;
using UnregistrationCallback =
- base::Callback<void(ServiceWorkerStatusCode status)>;
+ base::OnceCallback<void(ServiceWorkerStatusCode status)>;
using ProviderMap = base::IDMap<std::unique_ptr<ServiceWorkerProviderHost>>;
using ProcessToProviderMap = base::IDMap<std::unique_ptr<ProviderMap>>;
@@ -172,11 +174,11 @@ class CONTENT_EXPORT ServiceWorkerContextCore
ServiceWorkerProviderHost* GetProviderHost(int process_id, int provider_id);
void RemoveProviderHost(int process_id, int provider_id);
void RemoveAllProviderHostsForProcess(int process_id);
- std::unique_ptr<ProviderHostIterator> GetProviderHostIterator();
- // Returns a ProviderHost iterator for all ServiceWorker clients for
- // the |origin|. This only returns ProviderHosts that are of CONTROLLEE
- // and belong to the |origin|.
+ // Returns a ProviderHost iterator for all service worker clients for the
+ // |origin|. This only returns clients that are execution ready (i.e., for
+ // windows, the navigation has been committed and for workers, the final
+ // response after redirects has been delivered).
std::unique_ptr<ProviderHostIterator> GetClientProviderHostIterator(
const GURL& origin);
@@ -184,7 +186,7 @@ class CONTENT_EXPORT ServiceWorkerContextCore
// blink::mojom::ServiceWorkerProviderType::kForWindow which is a main
// (top-level) frame.
void HasMainFrameProviderHost(const GURL& origin,
- const BoolCallback& callback) const;
+ BoolCallback callback) const;
// Maintains a map from Client UUID to ProviderHost.
// (Note: instead of maintaining 2 maps we might be able to uniformly use
@@ -199,16 +201,14 @@ class CONTENT_EXPORT ServiceWorkerContextCore
void RegisterServiceWorker(
const GURL& script_url,
const blink::mojom::ServiceWorkerRegistrationOptions& options,
- const RegistrationCallback& callback);
+ RegistrationCallback callback);
void UnregisterServiceWorker(const GURL& pattern,
- const UnregistrationCallback& callback);
+ UnregistrationCallback callback);
// Callback is called after all deletions occured. The status code is
// SERVICE_WORKER_OK if all succeed, or SERVICE_WORKER_FAILED
// if any did not succeed.
- void DeleteForOrigin(
- const GURL& origin,
- base::OnceCallback<void(ServiceWorkerStatusCode)> callback);
+ void DeleteForOrigin(const GURL& origin, StatusCallback callback);
// Updates the service worker. If |force_bypass_cache| is true or 24 hours
// have passed since the last update, bypasses the browser cache.
@@ -217,7 +217,7 @@ class CONTENT_EXPORT ServiceWorkerContextCore
void UpdateServiceWorker(ServiceWorkerRegistration* registration,
bool force_bypass_cache,
bool skip_script_comparison,
- const UpdateCallback& callback);
+ UpdateCallback callback);
// Used in DevTools to update the service worker registrations without
// consulting the browser cache while loading the controlled page. The
@@ -269,7 +269,7 @@ class CONTENT_EXPORT ServiceWorkerContextCore
// Deletes all files on disk and restarts the system. This leaves the system
// in a disabled state until it's done.
- void DeleteAndStartOver(const StatusCallback& callback);
+ void DeleteAndStartOver(StatusCallback callback);
void ClearAllServiceWorkersForTest(base::OnceClosure callback);
@@ -310,18 +310,18 @@ class CONTENT_EXPORT ServiceWorkerContextCore
ProviderMap* GetProviderMapForProcess(int process_id);
void RegistrationComplete(const GURL& pattern,
- const RegistrationCallback& callback,
+ RegistrationCallback callback,
ServiceWorkerStatusCode status,
const std::string& status_message,
ServiceWorkerRegistration* registration);
- void UpdateComplete(const UpdateCallback& callback,
+ void UpdateComplete(UpdateCallback callback,
ServiceWorkerStatusCode status,
const std::string& status_message,
ServiceWorkerRegistration* registration);
void UnregistrationComplete(const GURL& pattern,
- const UnregistrationCallback& callback,
+ UnregistrationCallback callback,
int64_t registration_id,
ServiceWorkerStatusCode status);
@@ -333,11 +333,11 @@ class CONTENT_EXPORT ServiceWorkerContextCore
void DidFindRegistrationForCheckHasServiceWorker(
const GURL& other_url,
- const ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
+ ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
ServiceWorkerStatusCode status,
scoped_refptr<ServiceWorkerRegistration> registration);
void OnRegistrationFinishedForCheckHasServiceWorker(
- const ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
+ ServiceWorkerContext::CheckHasServiceWorkerCallback callback,
scoped_refptr<ServiceWorkerRegistration> registration);
// It's safe to store a raw pointer instead of a scoped_refptr to |wrapper_|
diff --git a/chromium/content/browser/service_worker/service_worker_context_core_observer.h b/chromium/content/browser/service_worker/service_worker_context_core_observer.h
index f664aa2ba34..1453739b55a 100644
--- a/chromium/content/browser/service_worker/service_worker_context_core_observer.h
+++ b/chromium/content/browser/service_worker/service_worker_context_core_observer.h
@@ -12,7 +12,7 @@
#include "base/time/time.h"
#include "content/browser/service_worker/service_worker_info.h"
#include "content/browser/service_worker/service_worker_version.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
#include "url/gurl.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_context_request_handler.cc b/chromium/content/browser/service_worker/service_worker_context_request_handler.cc
index 8c21ad6e5be..eaf2f2b0759 100644
--- a/chromium/content/browser/service_worker/service_worker_context_request_handler.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_request_handler.cc
@@ -58,7 +58,8 @@ ServiceWorkerContextRequestHandler::ServiceWorkerContextRequestHandler(
blob_storage_context,
resource_type),
version_(provider_host_->running_hosted_version()) {
- DCHECK(provider_host_->IsHostToRunningServiceWorker());
+ DCHECK(provider_host_->IsProviderForServiceWorker());
+ DCHECK(version_);
}
ServiceWorkerContextRequestHandler::~ServiceWorkerContextRequestHandler() {
diff --git a/chromium/content/browser/service_worker/service_worker_context_request_handler_unittest.cc b/chromium/content/browser/service_worker/service_worker_context_request_handler_unittest.cc
index d9a6ff06d64..c7e1e2194f7 100644
--- a/chromium/content/browser/service_worker/service_worker_context_request_handler_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_request_handler_unittest.cc
@@ -11,7 +11,6 @@
#include "base/run_loop.h"
#include "base/test/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
-#include "content/browser/browser_thread_impl.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_provider_host.h"
@@ -32,7 +31,7 @@
#include "services/network/public/mojom/request_context_frame_type.mojom.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_context_unittest.cc b/chromium/content/browser/service_worker/service_worker_context_unittest.cc
index 10f0068b562..06decdcd47b 100644
--- a/chromium/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_unittest.cc
@@ -8,11 +8,9 @@
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
-#include "base/memory/ptr_util.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/time/time.h"
-#include "content/browser/browser_thread_impl.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
@@ -23,13 +21,12 @@
#include "content/browser/service_worker/service_worker_storage.h"
#include "content/browser/service_worker/service_worker_test_utils.h"
#include "content/browser/service_worker/service_worker_version.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "content/public/test/test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -48,7 +45,7 @@ void SaveResponseCallback(bool* called,
ServiceWorkerContextCore::RegistrationCallback MakeRegisteredCallback(
bool* called,
int64_t* store_registration_id) {
- return base::Bind(&SaveResponseCallback, called, store_registration_id);
+ return base::BindOnce(&SaveResponseCallback, called, store_registration_id);
}
void CallCompletedCallback(bool* called, ServiceWorkerStatusCode) {
@@ -57,7 +54,7 @@ void CallCompletedCallback(bool* called, ServiceWorkerStatusCode) {
ServiceWorkerContextCore::UnregistrationCallback MakeUnregisteredCallback(
bool* called) {
- return base::Bind(&CallCompletedCallback, called);
+ return base::BindOnce(&CallCompletedCallback, called);
}
void ExpectRegisteredWorkers(
@@ -645,26 +642,13 @@ TEST_F(ServiceWorkerContextTest, ProviderHostIterator) {
ServiceWorkerProviderHost* host1_raw = host1.get();
ServiceWorkerProviderHost* host2_raw = host2.get();
ServiceWorkerProviderHost* host3_raw = host3.get();
- ServiceWorkerProviderHost* host4_raw = host4.get();
context()->AddProviderHost(std::move(host1));
context()->AddProviderHost(std::move(host2));
context()->AddProviderHost(std::move(host3));
context()->AddProviderHost(std::move(host4));
- // Iterate over all provider hosts.
- std::set<ServiceWorkerProviderHost*> results;
- for (auto it = context()->GetProviderHostIterator(); !it->IsAtEnd();
- it->Advance()) {
- results.insert(it->GetProviderHost());
- }
- EXPECT_EQ(4u, results.size());
- EXPECT_TRUE(ContainsKey(results, host1_raw));
- EXPECT_TRUE(ContainsKey(results, host2_raw));
- EXPECT_TRUE(ContainsKey(results, host3_raw));
- EXPECT_TRUE(ContainsKey(results, host4_raw));
-
// Iterate over the client provider hosts that belong to kOrigin1.
- results.clear();
+ std::set<ServiceWorkerProviderHost*> results;
for (auto it = context()->GetClientProviderHostIterator(kOrigin1);
!it->IsAtEnd(); it->Advance()) {
results.insert(it->GetProviderHost());
diff --git a/chromium/content/browser/service_worker/service_worker_context_watcher.cc b/chromium/content/browser/service_worker/service_worker_context_watcher.cc
index 08006a83a07..983547fe8ed 100644
--- a/chromium/content/browser/service_worker/service_worker_context_watcher.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_watcher.cc
@@ -7,14 +7,13 @@
#include <utility>
#include "base/bind.h"
-#include "base/memory/ptr_util.h"
#include "content/browser/service_worker/embedded_worker_status.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_version.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/common/console_message_level.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "url/gurl.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_context_watcher.h b/chromium/content/browser/service_worker/service_worker_context_watcher.h
index 2aede25980b..aa432522b51 100644
--- a/chromium/content/browser/service_worker/service_worker_context_watcher.h
+++ b/chromium/content/browser/service_worker/service_worker_context_watcher.h
@@ -14,7 +14,7 @@
#include "content/browser/service_worker/service_worker_context_core_observer.h"
#include "content/browser/service_worker/service_worker_info.h"
#include "content/common/content_export.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_context_watcher_unittest.cc b/chromium/content/browser/service_worker/service_worker_context_watcher_unittest.cc
index c9bb895faef..3bc8afdbd8a 100644
--- a/chromium/content/browser/service_worker/service_worker_context_watcher_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_watcher_unittest.cc
@@ -11,7 +11,7 @@
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -146,7 +146,7 @@ class ServiceWorkerContextWatcherTest : public testing::Test {
int64_t registration_id = blink::mojom::kInvalidServiceWorkerRegistrationId;
context()->RegisterServiceWorker(
script_url, options,
- base::Bind(&DidRegisterServiceWorker, &registration_id));
+ base::BindOnce(&DidRegisterServiceWorker, &registration_id));
base::RunLoop().RunUntilIdle();
return registration_id;
}
@@ -154,7 +154,7 @@ class ServiceWorkerContextWatcherTest : public testing::Test {
ServiceWorkerStatusCode UnregisterServiceWorker(const GURL& scope) {
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
context()->UnregisterServiceWorker(
- scope, base::Bind(&DidUnregisterServiceWorker, &status));
+ scope, base::BindOnce(&DidUnregisterServiceWorker, &status));
base::RunLoop().RunUntilIdle();
return status;
}
diff --git a/chromium/content/browser/service_worker/service_worker_context_wrapper.cc b/chromium/content/browser/service_worker/service_worker_context_wrapper.cc
index 3af66c5a20f..241193f74fd 100644
--- a/chromium/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/chromium/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -32,7 +32,7 @@
#include "net/base/url_util.h"
#include "storage/browser/quota/quota_manager_proxy.h"
#include "storage/browser/quota/special_storage_policy.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -42,15 +42,15 @@ typedef std::set<std::string> HeaderNameSet;
base::LazyInstance<HeaderNameSet>::DestructorAtExit g_excluded_header_name_set =
LAZY_INSTANCE_INITIALIZER;
-void WorkerStarted(const ServiceWorkerContextWrapper::StatusCallback& callback,
+void WorkerStarted(ServiceWorkerContextWrapper::StatusCallback callback,
ServiceWorkerStatusCode status) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::BindOnce(callback, status));
+ base::BindOnce(std::move(callback), status));
}
void StartActiveWorkerOnIO(
- const ServiceWorkerContextWrapper::StatusCallback& callback,
+ ServiceWorkerContextWrapper::StatusCallback callback,
ServiceWorkerStatusCode status,
scoped_refptr<ServiceWorkerRegistration> registration) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -60,12 +60,12 @@ void StartActiveWorkerOnIO(
// |registration| is 1, it will be deleted after WorkerStarted is called.
registration->active_version()->StartWorker(
ServiceWorkerMetrics::EventType::UNKNOWN,
- base::BindOnce(WorkerStarted, callback));
+ base::BindOnce(WorkerStarted, std::move(callback)));
return;
}
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- base::BindOnce(callback, SERVICE_WORKER_ERROR_NOT_FOUND));
+ base::BindOnce(std::move(callback), SERVICE_WORKER_ERROR_NOT_FOUND));
}
void SkipWaitingWorkerOnIO(
@@ -224,8 +224,8 @@ void ServiceWorkerContextWrapper::DeleteAndStartOver() {
// here.
return;
}
- context_core_->DeleteAndStartOver(
- base::Bind(&ServiceWorkerContextWrapper::DidDeleteAndStartOver, this));
+ context_core_->DeleteAndStartOver(base::BindOnce(
+ &ServiceWorkerContextWrapper::DidDeleteAndStartOver, this));
}
StoragePartitionImpl* ServiceWorkerContextWrapper::storage_partition() const {
@@ -281,7 +281,7 @@ void ServiceWorkerContextWrapper::RegisterServiceWorker(
net::SimplifyUrlForRequest(options.scope), options.update_via_cache);
context()->RegisterServiceWorker(
net::SimplifyUrlForRequest(script_url), options_to_pass,
- base::Bind(&FinishRegistrationOnIO, base::Passed(std::move(callback))));
+ base::BindOnce(&FinishRegistrationOnIO, std::move(callback)));
}
void ServiceWorkerContextWrapper::UnregisterServiceWorker(
@@ -302,7 +302,7 @@ void ServiceWorkerContextWrapper::UnregisterServiceWorker(
context()->UnregisterServiceWorker(
net::SimplifyUrlForRequest(pattern),
- base::Bind(&FinishUnregistrationOnIO, base::Passed(std::move(callback))));
+ base::BindOnce(&FinishUnregistrationOnIO, std::move(callback)));
}
bool ServiceWorkerContextWrapper::StartingExternalRequest(
@@ -509,14 +509,14 @@ ServiceWorkerContextWrapper::GetAllLiveVersionInfo() {
void ServiceWorkerContextWrapper::HasMainFrameProviderHost(
const GURL& origin,
- const BoolCallback& callback) const {
+ BoolCallback callback) const {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!context_core_) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(callback, false));
+ FROM_HERE, base::BindOnce(std::move(callback), false));
return;
}
- context_core_->HasMainFrameProviderHost(origin, callback);
+ context_core_->HasMainFrameProviderHost(origin, std::move(callback));
}
std::unique_ptr<std::vector<std::pair<int, int>>>
@@ -668,42 +668,46 @@ void ServiceWorkerContextWrapper::StoreRegistrationUserData(
int64_t registration_id,
const GURL& origin,
const std::vector<std::pair<std::string, std::string>>& key_value_pairs,
- const StatusCallback& callback) {
+ StatusCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!context_core_) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(callback, SERVICE_WORKER_ERROR_ABORT));
+ FROM_HERE,
+ base::BindOnce(std::move(callback), SERVICE_WORKER_ERROR_ABORT));
return;
}
context_core_->storage()->StoreUserData(registration_id, origin.GetOrigin(),
- key_value_pairs, callback);
+ key_value_pairs, std::move(callback));
}
void ServiceWorkerContextWrapper::ClearRegistrationUserData(
int64_t registration_id,
const std::vector<std::string>& keys,
- const StatusCallback& callback) {
+ StatusCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!context_core_) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(callback, SERVICE_WORKER_ERROR_ABORT));
+ FROM_HERE,
+ base::BindOnce(std::move(callback), SERVICE_WORKER_ERROR_ABORT));
return;
}
- context_core_->storage()->ClearUserData(registration_id, keys, callback);
+ context_core_->storage()->ClearUserData(registration_id, keys,
+ std::move(callback));
}
void ServiceWorkerContextWrapper::ClearRegistrationUserDataByKeyPrefixes(
int64_t registration_id,
const std::vector<std::string>& key_prefixes,
- const StatusCallback& callback) {
+ StatusCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!context_core_) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(callback, SERVICE_WORKER_ERROR_ABORT));
+ FROM_HERE,
+ base::BindOnce(std::move(callback), SERVICE_WORKER_ERROR_ABORT));
return;
}
- context_core_->storage()->ClearUserDataByKeyPrefixes(registration_id,
- key_prefixes, callback);
+ context_core_->storage()->ClearUserDataByKeyPrefixes(
+ registration_id, key_prefixes, std::move(callback));
}
void ServiceWorkerContextWrapper::GetUserDataForAllRegistrations(
@@ -738,25 +742,24 @@ void ServiceWorkerContextWrapper::GetUserDataForAllRegistrationsByKeyPrefix(
key_prefix, std::move(callback));
}
-void ServiceWorkerContextWrapper::StartServiceWorker(
- const GURL& pattern,
- const StatusCallback& callback) {
+void ServiceWorkerContextWrapper::StartServiceWorker(const GURL& pattern,
+ StatusCallback callback) {
if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::BindOnce(&ServiceWorkerContextWrapper::StartServiceWorker, this,
- pattern, callback));
+ pattern, std::move(callback)));
return;
}
if (!context_core_) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- base::BindOnce(callback, SERVICE_WORKER_ERROR_ABORT));
+ base::BindOnce(std::move(callback), SERVICE_WORKER_ERROR_ABORT));
return;
}
context_core_->storage()->FindRegistrationForPattern(
net::SimplifyUrlForRequest(pattern),
- base::BindOnce(&StartActiveWorkerOnIO, callback));
+ base::BindOnce(&StartActiveWorkerOnIO, std::move(callback)));
}
void ServiceWorkerContextWrapper::SkipWaitingWorker(const GURL& pattern) {
@@ -814,6 +817,16 @@ void ServiceWorkerContextWrapper::RemoveObserver(
core_observer_list_->RemoveObserver(observer);
}
+base::WeakPtr<ServiceWorkerProviderHost>
+ServiceWorkerContextWrapper::PreCreateHostForSharedWorker(
+ int process_id,
+ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ return ServiceWorkerProviderHost::PreCreateForSharedWorker(
+ context()->AsWeakPtr(), process_id, out_provider_info);
+}
+
ServiceWorkerContextWrapper::~ServiceWorkerContextWrapper() {
// Explicitly remove this object as an observer to avoid use-after-frees in
// tests where this object is not guaranteed to outlive the
diff --git a/chromium/content/browser/service_worker/service_worker_context_wrapper.h b/chromium/content/browser/service_worker/service_worker_context_wrapper.h
index 3dedf308040..96ec90d9a1c 100644
--- a/chromium/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/chromium/content/browser/service_worker/service_worker_context_wrapper.h
@@ -48,8 +48,8 @@ class CONTENT_EXPORT ServiceWorkerContextWrapper
public ServiceWorkerContextCoreObserver,
public base::RefCountedThreadSafe<ServiceWorkerContextWrapper> {
public:
- using StatusCallback = base::Callback<void(ServiceWorkerStatusCode)>;
- using BoolCallback = base::Callback<void(bool)>;
+ using StatusCallback = base::OnceCallback<void(ServiceWorkerStatusCode)>;
+ using BoolCallback = base::OnceCallback<void(bool)>;
using FindRegistrationCallback =
ServiceWorkerStorage::FindRegistrationCallback;
using GetRegistrationsInfosCallback =
@@ -140,7 +140,7 @@ class CONTENT_EXPORT ServiceWorkerContextWrapper
// Must be called from the IO thread.
void HasMainFrameProviderHost(const GURL& origin,
- const BoolCallback& callback) const;
+ BoolCallback callback) const;
// Returns all render process ids and frame ids for the given |origin|.
std::unique_ptr<
@@ -224,14 +224,14 @@ class CONTENT_EXPORT ServiceWorkerContextWrapper
int64_t registration_id,
const GURL& origin,
const std::vector<std::pair<std::string, std::string>>& key_value_pairs,
- const StatusCallback& callback);
+ StatusCallback callback);
void ClearRegistrationUserData(int64_t registration_id,
const std::vector<std::string>& keys,
- const StatusCallback& callback);
+ StatusCallback callback);
void ClearRegistrationUserDataByKeyPrefixes(
int64_t registration_id,
const std::vector<std::string>& key_prefixes,
- const StatusCallback& callback);
+ StatusCallback callback);
void GetUserDataForAllRegistrations(
const std::string& key,
GetUserDataForAllRegistrationsCallback callback);
@@ -241,7 +241,7 @@ class CONTENT_EXPORT ServiceWorkerContextWrapper
// This function can be called from any thread, but the callback will always
// be called on the UI thread.
- void StartServiceWorker(const GURL& pattern, const StatusCallback& callback);
+ void StartServiceWorker(const GURL& pattern, StatusCallback callback);
// These methods can be called from any thread.
void SkipWaitingWorker(const GURL& pattern);
@@ -254,6 +254,17 @@ class CONTENT_EXPORT ServiceWorkerContextWrapper
bool is_incognito() const { return is_incognito_; }
+ // S13nServiceWorker:
+ // Used for starting a shared worker. Returns a provider host for the shared
+ // worker and fills |out_provider_info| with info to send to the renderer to
+ // connect to the host. The host stays alive as long as this info stays alive
+ // (namely, as long as |out_provider_info->host_ptr_info| stays alive).
+ //
+ // Must be called on the IO thread.
+ base::WeakPtr<ServiceWorkerProviderHost> PreCreateHostForSharedWorker(
+ int process_id,
+ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info);
+
private:
friend class BackgroundSyncManagerTest;
friend class base::RefCountedThreadSafe<ServiceWorkerContextWrapper>;
diff --git a/chromium/content/browser/service_worker/service_worker_controllee_request_handler.cc b/chromium/content/browser/service_worker/service_worker_controllee_request_handler.cc
index 2ed0c353cad..ea569859aef 100644
--- a/chromium/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/chromium/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -232,7 +232,7 @@ void ServiceWorkerControlleeRequestHandler::MaybeCreateLoader(
resource_request.site_for_cookies);
if (url_job_->ShouldFallbackToNetwork()) {
- // We're falling back to the next URLLoaderRequestHandler, forward
+ // We're falling back to the next NavigationLoaderInterceptor, forward
// the request and clear job now.
url_job_->FallbackToNetwork();
ClearJob();
@@ -271,7 +271,7 @@ ServiceWorkerControlleeRequestHandler::MaybeCreateSubresourceLoaderParams() {
controller_info->object_info = provider_host_->GetOrCreateServiceWorkerHandle(
provider_host_->controller());
params.controller_service_worker_info = std::move(controller_info);
- return params;
+ return base::Optional<SubresourceLoaderParams>(std::move(params));
}
void ServiceWorkerControlleeRequestHandler::PrepareForMainResource(
@@ -288,7 +288,7 @@ void ServiceWorkerControlleeRequestHandler::PrepareForMainResource(
// in redirect case, unassociate it now.
provider_host_->DisassociateRegistration();
- // Also prevent a registrater job for establishing an association to a new
+ // Also prevent a register job from establishing an association to a new
// registration while we're finding an existing registration.
provider_host_->SetAllowAssociation(false);
@@ -350,14 +350,13 @@ void ServiceWorkerControlleeRequestHandler::
context_->UpdateServiceWorker(
registration.get(), true /* force_bypass_cache */,
true /* skip_script_comparison */,
- base::Bind(&self::DidUpdateRegistration, weak_factory_.GetWeakPtr(),
- registration));
+ base::BindOnce(&self::DidUpdateRegistration, weak_factory_.GetWeakPtr(),
+ registration));
return;
}
- // Initiate activation of a waiting version.
- // Usually a register job initiates activation but that
- // doesn't happen if the browser exits prior to activation
+ // Initiate activation of a waiting version. Usually a register job initiates
+ // activation but that doesn't happen if the browser exits prior to activation
// having occurred. This check handles that case.
if (registration->waiting_version())
registration->ActivateWaitingVersionWhenReady();
diff --git a/chromium/content/browser/service_worker/service_worker_controllee_request_handler.h b/chromium/content/browser/service_worker/service_worker_controllee_request_handler.h
index 5b874a5755f..f5b750685e3 100644
--- a/chromium/content/browser/service_worker/service_worker_controllee_request_handler.h
+++ b/chromium/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -76,7 +76,7 @@ class CONTENT_EXPORT ServiceWorkerControlleeRequestHandler
// This could get called multiple times during the lifetime in redirect
// cases. (In fallback-to-network cases we basically forward the request
// to the request to the next request handler)
- // URLLoaderRequestHandler overrides:
+ // NavigationLoaderInterceptor overrides:
void MaybeCreateLoader(const network::ResourceRequest& request,
ResourceContext* resource_context,
LoaderCallback callback) override;
diff --git a/chromium/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/chromium/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index 177dfa75b78..5974fee450c 100644
--- a/chromium/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -12,7 +12,6 @@
#include "base/logging.h"
#include "base/run_loop.h"
#include "components/offline_pages/buildflags/buildflags.h"
-#include "content/browser/browser_thread_impl.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_provider_host.h"
@@ -34,7 +33,7 @@
#include "services/network/public/cpp/resource_request_body.h"
#include "services/network/public/mojom/request_context_frame_type.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
namespace service_worker_controllee_request_handler_unittest {
diff --git a/chromium/content/browser/service_worker/service_worker_data_pipe_reader.cc b/chromium/content/browser/service_worker/service_worker_data_pipe_reader.cc
index ab8c0743deb..0343e2e2822 100644
--- a/chromium/content/browser/service_worker/service_worker_data_pipe_reader.cc
+++ b/chromium/content/browser/service_worker/service_worker_data_pipe_reader.cc
@@ -18,7 +18,9 @@ ServiceWorkerDataPipeReader::ServiceWorkerDataPipeReader(
: owner_(owner),
streaming_version_(streaming_version),
stream_pending_buffer_size_(0),
- handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL),
+ handle_watcher_(FROM_HERE,
+ mojo::SimpleWatcher::ArmingPolicy::MANUAL,
+ base::SequencedTaskRunnerHandle::Get()),
stream_(std::move(stream_handle->stream)),
binding_(this, std::move(stream_handle->callback_request)),
producer_state_(State::kStreaming) {
diff --git a/chromium/content/browser/service_worker/service_worker_data_pipe_reader.h b/chromium/content/browser/service_worker/service_worker_data_pipe_reader.h
index 228b49772d8..081d3620111 100644
--- a/chromium/content/browser/service_worker/service_worker_data_pipe_reader.h
+++ b/chromium/content/browser/service_worker/service_worker_data_pipe_reader.h
@@ -10,7 +10,7 @@
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/cpp/system/simple_watcher.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
namespace net {
class IOBuffer;
diff --git a/chromium/content/browser/service_worker/service_worker_data_pipe_reader_unittest.cc b/chromium/content/browser/service_worker/service_worker_data_pipe_reader_unittest.cc
index 75ca86fb120..4b9a1d71457 100644
--- a/chromium/content/browser/service_worker/service_worker_data_pipe_reader_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_data_pipe_reader_unittest.cc
@@ -16,7 +16,7 @@
#include "services/network/public/cpp/resource_request_body.h"
#include "services/network/public/mojom/request_context_frame_type.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_database.cc b/chromium/content/browser/service_worker/service_worker_database.cc
index 032021571ad..746351acfb8 100644
--- a/chromium/content/browser/service_worker/service_worker_database.cc
+++ b/chromium/content/browser/service_worker/service_worker_database.cc
@@ -19,8 +19,8 @@
#include "content/browser/service_worker/service_worker_metrics.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/common/content_switches.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "third_party/leveldatabase/env_chromium.h"
#include "third_party/leveldatabase/leveldb_chrome.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
diff --git a/chromium/content/browser/service_worker/service_worker_database.h b/chromium/content/browser/service_worker/service_worker_database.h
index a55f7c1c0ed..c320569785c 100644
--- a/chromium/content/browser/service_worker/service_worker_database.h
+++ b/chromium/content/browser/service_worker/service_worker_database.h
@@ -23,7 +23,7 @@
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_status_code.h"
#include "content/common/service_worker/service_worker_types.h"
-#include "third_party/WebKit/public/common/origin_trials/trial_token_validator.h"
+#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
#include "url/gurl.h"
#include "url/origin.h"
diff --git a/chromium/content/browser/service_worker/service_worker_database_unittest.cc b/chromium/content/browser/service_worker/service_worker_database_unittest.cc
index d4f5eb2044a..8b0dca82d17 100644
--- a/chromium/content/browser/service_worker/service_worker_database_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_database_unittest.cc
@@ -20,8 +20,8 @@
#include "content/public/common/content_switches.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
#include "url/origin.h"
diff --git a/chromium/content/browser/service_worker/service_worker_dispatcher_host.cc b/chromium/content/browser/service_worker/service_worker_dispatcher_host.cc
index c1d3345495b..5401fdb46d8 100644
--- a/chromium/content/browser/service_worker/service_worker_dispatcher_host.cc
+++ b/chromium/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -14,16 +14,15 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "content/browser/bad_message.h"
-#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/embedded_worker_status.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_handle.h"
#include "content/browser/service_worker/service_worker_navigation_handle_core.h"
#include "content/browser/service_worker/service_worker_registration.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
@@ -32,11 +31,10 @@
#include "content/public/common/content_client.h"
#include "content/public/common/origin_util.h"
#include "ipc/ipc_message_macros.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_error_type.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
-#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerError.h"
-#include "third_party/WebKit/public/platform/web_feature.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/platform/modules/serviceworker/web_service_worker_error.h"
#include "url/gurl.h"
using blink::MessagePortChannel;
@@ -47,7 +45,7 @@ namespace content {
namespace {
const uint32_t kServiceWorkerFilteredMessageClasses[] = {
- ServiceWorkerMsgStart, EmbeddedWorkerMsgStart,
+ ServiceWorkerMsgStart,
};
} // namespace
@@ -65,8 +63,7 @@ ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost(
weak_ptr_factory_(this) {}
ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() {
- // Temporary CHECK for debugging https://crbug.com/736203.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (GetContext() && phase_ == Phase::kAddedToContext)
GetContext()->RemoveDispatcherHost(render_process_id_);
}
@@ -96,8 +93,7 @@ void ServiceWorkerDispatcherHost::Init(
void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) {
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerDispatcherHost::OnFilterAdded");
- // Temporary CHECK for debugging https://crbug.com/736203.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
channel_ready_ = true;
std::vector<std::unique_ptr<IPC::Message>> messages;
messages.swap(pending_messages_);
@@ -107,8 +103,7 @@ void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) {
}
void ServiceWorkerDispatcherHost::OnFilterRemoved() {
- // Temporary CHECK for debugging https://crbug.com/736203.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
// Don't wait until the destructor to teardown since a new dispatcher host
// for this process might be created before then.
if (GetContext() && phase_ == Phase::kAddedToContext) {
@@ -128,19 +123,7 @@ void ServiceWorkerDispatcherHost::OnDestruct() const {
bool ServiceWorkerDispatcherHost::OnMessageReceived(
const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcherHost, message)
- IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_CountFeature, OnCountFeature)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
-
- if (!handled && GetContext()) {
- handled = GetContext()->embedded_worker_registry()->OnMessageReceived(
- message, render_process_id_);
- if (!handled)
- bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED);
- }
- return handled;
+ return false;
}
bool ServiceWorkerDispatcherHost::Send(IPC::Message* message) {
@@ -154,33 +137,6 @@ bool ServiceWorkerDispatcherHost::Send(IPC::Message* message) {
return true;
}
-void ServiceWorkerDispatcherHost::RegisterServiceWorkerHandle(
- std::unique_ptr<ServiceWorkerHandle> handle) {
- int handle_id = handle->handle_id();
- handles_.AddWithID(std::move(handle), handle_id);
-}
-
-ServiceWorkerHandle* ServiceWorkerDispatcherHost::FindServiceWorkerHandle(
- int provider_id,
- int64_t version_id) {
- for (base::IDMap<std::unique_ptr<ServiceWorkerHandle>>::iterator iter(
- &handles_);
- !iter.IsAtEnd(); iter.Advance()) {
- ServiceWorkerHandle* handle = iter.GetCurrentValue();
- DCHECK(handle);
- DCHECK(handle->version());
- if (handle->provider_id() == provider_id &&
- handle->version()->version_id() == version_id) {
- return handle;
- }
- }
- return nullptr;
-}
-
-void ServiceWorkerDispatcherHost::UnregisterServiceWorkerHandle(int handle_id) {
- handles_.Remove(handle_id);
-}
-
base::WeakPtr<ServiceWorkerDispatcherHost>
ServiceWorkerDispatcherHost::AsWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
@@ -198,74 +154,55 @@ void ServiceWorkerDispatcherHost::OnProviderCreated(
return;
}
- if (IsBrowserSideNavigationEnabled() &&
- ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) {
- std::unique_ptr<ServiceWorkerProviderHost> provider_host;
- // PlzNavigate
+ // Provider hosts for navigations are precreated on the browser process with a
+ // browser-assigned id. The renderer process calls OnProviderCreated once it
+ // creates the provider.
+ if (ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) {
+ if (info.type != blink::mojom::ServiceWorkerProviderType::kForWindow) {
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_PROVIDER_CREATED_ILLEGAL_TYPE_NOT_WINDOW);
+ return;
+ }
+
// Retrieve the provider host previously created for navigation requests.
+ std::unique_ptr<ServiceWorkerProviderHost> provider_host;
ServiceWorkerNavigationHandleCore* navigation_handle_core =
GetContext()->GetNavigationHandleCore(info.provider_id);
if (navigation_handle_core != nullptr)
provider_host = navigation_handle_core->RetrievePreCreatedHost();
// If no host is found, create one.
- if (provider_host == nullptr) {
+ // TODO(crbug.com/789111#c14): This is probably not right, see bug.
+ if (!provider_host) {
GetContext()->AddProviderHost(ServiceWorkerProviderHost::Create(
render_process_id_, std::move(info), GetContext()->AsWeakPtr(),
AsWeakPtr()));
return;
}
- // Otherwise, completed the initialization of the pre-created host.
- if (info.type != blink::mojom::ServiceWorkerProviderType::kForWindow) {
- bad_message::ReceivedBadMessage(
- this, bad_message::SWDH_PROVIDER_CREATED_ILLEGAL_TYPE_NOT_WINDOW);
- return;
- }
+ // Otherwise, complete initialization of the pre-created host.
provider_host->CompleteNavigationInitialized(render_process_id_,
std::move(info), AsWeakPtr());
GetContext()->AddProviderHost(std::move(provider_host));
- } else {
- // Provider hosts for service workers should be pre-created in StartWorker
- // in ServiceWorkerVersion.
- if (info.type ==
- blink::mojom::ServiceWorkerProviderType::kForServiceWorker) {
- bad_message::ReceivedBadMessage(
- this, bad_message::SWDH_PROVIDER_CREATED_ILLEGAL_TYPE_CONTROLLER);
- return;
- }
- if (ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) {
- bad_message::ReceivedBadMessage(
- this, bad_message::SWDH_PROVIDER_CREATED_BAD_ID);
- return;
- }
- GetContext()->AddProviderHost(ServiceWorkerProviderHost::Create(
- render_process_id_, std::move(info), GetContext()->AsWeakPtr(),
- AsWeakPtr()));
+ return;
}
-}
-void ServiceWorkerDispatcherHost::OnCountFeature(int64_t version_id,
- uint32_t feature) {
- if (!GetContext())
- return;
- ServiceWorkerVersion* version = GetContext()->GetLiveVersion(version_id);
- if (!version)
- return;
- if (feature >=
- static_cast<uint32_t>(blink::mojom::WebFeature::kNumberOfFeatures)) {
- // We don't use BadMessageReceived here since this IPC will be converted to
- // a Mojo method call soon, which will validate inputs for us.
- // TODO(xiaofeng.zhang): Convert the OnCountFeature IPC into a Mojo method
- // call.
+ // Provider hosts for service workers don't call OnProviderCreated. They are
+ // precreated and ServiceWorkerProviderHost::CompleteStartWorkerPreparation is
+ // called during the startup sequence once a process is allocated.
+ if (info.type == blink::mojom::ServiceWorkerProviderType::kForServiceWorker) {
+ bad_message::ReceivedBadMessage(
+ this, bad_message::SWDH_PROVIDER_CREATED_ILLEGAL_TYPE_SERVICE_WORKER);
return;
}
- version->CountFeature(feature);
+
+ GetContext()->AddProviderHost(ServiceWorkerProviderHost::Create(
+ render_process_id_, std::move(info), GetContext()->AsWeakPtr(),
+ AsWeakPtr()));
}
ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() {
- // Temporary CHECK for debugging https://crbug.com/736203.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!context_wrapper_.get())
return nullptr;
return context_wrapper_->context();
diff --git a/chromium/content/browser/service_worker/service_worker_dispatcher_host.h b/chromium/content/browser/service_worker/service_worker_dispatcher_host.h
index 43d549e06a1..89a2aae8739 100644
--- a/chromium/content/browser/service_worker/service_worker_dispatcher_host.h
+++ b/chromium/content/browser/service_worker/service_worker_dispatcher_host.h
@@ -10,7 +10,6 @@
#include <memory>
#include <vector>
-#include "base/containers/id_map.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
@@ -22,14 +21,13 @@
#include "content/public/browser/browser_associated_interface.h"
#include "content/public/browser/browser_message_filter.h"
#include "mojo/public/cpp/bindings/strong_associated_binding_set.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
class ResourceContext;
class ServiceWorkerContextCore;
class ServiceWorkerContextWrapper;
-class ServiceWorkerHandle;
namespace service_worker_dispatcher_host_unittest {
class ServiceWorkerDispatcherHostTest;
@@ -44,20 +42,17 @@ FORWARD_DECLARE_TEST(BackgroundSyncManagerTest,
// ServiceWorkerDispatcherHost is the browser-side endpoint for several IPC
// messages for service workers. There is a 1:1 correspondence between
// renderer processes and ServiceWorkerDispatcherHosts. Currently
-// ServiceWorkerDispatcherHost handles both legacy IPC messages (to and from
-// its corresponding ServiceWorkerDispatcher on the renderer) and Mojo IPC
-// messages (from any ServiceWorkerNetworkProvider on the renderer).
-//
-// Most messages are "from" a "service worker provider" on the renderer (a
-// ServiceWorkerNetworkProvider or a blink::WebServiceWorkerProvider), hence
-// they include a provider_id which must match to a ServiceWorkerProviderHost.
+// ServiceWorkerDispatcherHost sends the legacy IPC message
+// ServiceWorkerMsg_ServiceWorkerStateChanged to its corresponding
+// ServiceWorkerDispatcher on the renderer and receives Mojo IPC messages from
+// any ServiceWorkerNetworkProvider on the renderer.
//
// ServiceWorkerDispatcherHost is created on the UI thread in
-// RenderProcessHostImpl::Init() via CreateMessageFilters(). But initialization
-// and destruction occur on the IO thread, as does most (or all?) message
-// handling. It lives as long as the renderer process lives. Therefore much
-// tracking of renderer processes in browser-side service worker code is built
-// on ServiceWorkerDispatcherHost lifetime.
+// RenderProcessHostImpl::Init() via CreateMessageFilters(), but initialization,
+// destruction, and IPC message handling occur on the IO thread. It lives as
+// long as the renderer process lives. Therefore much tracking of renderer
+// processes in browser-side service worker code is built on
+// ServiceWorkerDispatcherHost lifetime.
//
// This class is bound with mojom::ServiceWorkerDispatcherHost. All
// InterfacePtrs on the same render process are bound to the same
@@ -88,14 +83,6 @@ class CONTENT_EXPORT ServiceWorkerDispatcherHost
// be destroyed.
bool Send(IPC::Message* message) override;
- // These methods are virtual only for testing.
- virtual void RegisterServiceWorkerHandle(
- std::unique_ptr<ServiceWorkerHandle> handle);
- virtual void UnregisterServiceWorkerHandle(int handle_id);
-
- ServiceWorkerHandle* FindServiceWorkerHandle(int provider_id,
- int64_t version_id);
-
ResourceContext* resource_context() { return resource_context_; }
base::WeakPtr<ServiceWorkerDispatcherHost> AsWeakPtr();
@@ -127,9 +114,6 @@ class CONTENT_EXPORT ServiceWorkerDispatcherHost
// mojom::ServiceWorkerDispatcherHost implementation
void OnProviderCreated(ServiceWorkerProviderHostInfo info) override;
- // IPC Message handlers
- void OnCountFeature(int64_t version_id, uint32_t feature);
-
ServiceWorkerContextCore* GetContext();
const int render_process_id_;
@@ -139,8 +123,6 @@ class CONTENT_EXPORT ServiceWorkerDispatcherHost
// Only accessed on the IO thread.
scoped_refptr<ServiceWorkerContextWrapper> context_wrapper_;
- base::IDMap<std::unique_ptr<ServiceWorkerHandle>> handles_;
-
bool channel_ready_; // True after BrowserMessageFilter::sender_ != NULL.
std::vector<std::unique_ptr<IPC::Message>> pending_messages_;
diff --git a/chromium/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/chromium/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
index b47f138c02a..b4394c09853 100644
--- a/chromium/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
@@ -10,10 +10,8 @@
#include "base/command_line.h"
#include "base/files/file_path.h"
-#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/time/time.h"
-#include "content/browser/browser_thread_impl.h"
#include "content/browser/service_worker/embedded_worker_instance.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/embedded_worker_status.h"
@@ -23,7 +21,6 @@
#include "content/browser/service_worker/service_worker_handle.h"
#include "content/browser/service_worker/service_worker_navigation_handle_core.h"
#include "content/browser/service_worker/service_worker_test_utils.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/common/browser_side_navigation_policy.h"
@@ -31,9 +28,9 @@
#include "content/public/test/mock_resource_context.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
namespace service_worker_dispatcher_host_unittest {
diff --git a/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 72d2209d8cd..da9ecafedbf 100644
--- a/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -11,7 +11,6 @@
#include "base/bind.h"
#include "base/containers/queue.h"
#include "base/feature_list.h"
-#include "base/memory/ptr_util.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "content/browser/devtools/service_worker_devtools_agent_host.h"
@@ -173,9 +172,8 @@ class DelegatingURLLoaderClient final : public network::mojom::URLLoaderClient {
}
void OnReceiveResponse(
const network::ResourceResponseHead& head,
- const base::Optional<net::SSLInfo>& ssl_info,
network::mojom::DownloadedTempFilePtr downloaded_file) override {
- client_->OnReceiveResponse(head, ssl_info, std::move(downloaded_file));
+ client_->OnReceiveResponse(head, std::move(downloaded_file));
DCHECK(on_response_);
std::move(on_response_).Run();
AddDevToolsCallback(
@@ -225,7 +223,7 @@ class DelegatingURLLoaderClient final : public network::mojom::URLLoaderClient {
}
void AddDevToolsCallback(
base::Callback<void(const WorkerId&, const std::string&)> callback) {
- devtools_callbacks.push(callback);
+ devtools_callbacks.push(std::move(callback));
MaybeRunDevToolsCallbacks();
}
diff --git a/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.h b/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.h
index 873f4d74d7c..f2ac45ac5ca 100644
--- a/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.h
+++ b/chromium/content/browser/service_worker/service_worker_fetch_dispatcher.h
@@ -23,8 +23,8 @@
#include "net/log/net_log_with_source.h"
#include "services/network/public/mojom/url_loader.mojom.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
-#include "third_party/WebKit/public/mojom/blob/blob.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/blob/blob.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
namespace net {
class URLRequest;
diff --git a/chromium/content/browser/service_worker/service_worker_handle.cc b/chromium/content/browser/service_worker/service_worker_handle.cc
index 48a7a52c396..1b87b9edab0 100644
--- a/chromium/content/browser/service_worker/service_worker_handle.cc
+++ b/chromium/content/browser/service_worker/service_worker_handle.cc
@@ -4,10 +4,8 @@
#include "content/browser/service_worker/service_worker_handle.h"
-#include "base/memory/ptr_util.h"
#include "content/browser/service_worker/service_worker_client_utils.h"
#include "content/browser/service_worker/service_worker_context_core.h"
-#include "content/browser/service_worker/service_worker_dispatcher_host.h"
#include "content/browser/service_worker/service_worker_provider_host.h"
#include "content/browser/service_worker/service_worker_registration.h"
#include "content/browser/service_worker/service_worker_type_converters.h"
@@ -153,39 +151,22 @@ void DispatchExtendableMessageEventFromServiceWorker(
} // namespace
-// static
-base::WeakPtr<ServiceWorkerHandle> ServiceWorkerHandle::Create(
- ServiceWorkerDispatcherHost* dispatcher_host,
- base::WeakPtr<ServiceWorkerContextCore> context,
- base::WeakPtr<ServiceWorkerProviderHost> provider_host,
- ServiceWorkerVersion* version,
- blink::mojom::ServiceWorkerObjectInfoPtr* out_info) {
- DCHECK(context && provider_host && version && out_info);
- ServiceWorkerHandle* handle =
- new ServiceWorkerHandle(dispatcher_host, context, provider_host, version);
- *out_info = handle->CreateObjectInfo();
- return handle->AsWeakPtr();
-}
-
ServiceWorkerHandle::ServiceWorkerHandle(
- ServiceWorkerDispatcherHost* dispatcher_host,
base::WeakPtr<ServiceWorkerContextCore> context,
- base::WeakPtr<ServiceWorkerProviderHost> provider_host,
- ServiceWorkerVersion* version)
- : dispatcher_host_(dispatcher_host),
- context_(context),
+ ServiceWorkerProviderHost* provider_host,
+ scoped_refptr<ServiceWorkerVersion> version)
+ : context_(context),
provider_host_(provider_host),
+ provider_origin_(url::Origin::Create(provider_host->document_url())),
provider_id_(provider_host->provider_id()),
handle_id_(context->GetNewServiceWorkerHandleId()),
- version_(version),
+ version_(std::move(version)),
weak_ptr_factory_(this) {
DCHECK(context_ && provider_host_ && version_);
DCHECK(context_->GetLiveRegistration(version_->registration_id()));
version_->AddListener(this);
bindings_.set_connection_error_handler(base::BindRepeating(
&ServiceWorkerHandle::OnConnectionError, base::Unretained(this)));
- if (dispatcher_host_)
- dispatcher_host_->RegisterServiceWorkerHandle(base::WrapUnique(this));
}
ServiceWorkerHandle::~ServiceWorkerHandle() {
@@ -194,8 +175,6 @@ ServiceWorkerHandle::~ServiceWorkerHandle() {
void ServiceWorkerHandle::OnVersionStateChanged(ServiceWorkerVersion* version) {
DCHECK(version);
- if (!provider_host_)
- return;
provider_host_->SendServiceWorkerStateChangedMessage(
handle_id_,
mojo::ConvertTo<blink::mojom::ServiceWorkerState>(version->status()));
@@ -213,26 +192,15 @@ ServiceWorkerHandle::CreateObjectInfo() {
return info;
}
-void ServiceWorkerHandle::RegisterIntoDispatcherHost(
- ServiceWorkerDispatcherHost* dispatcher_host) {
- DCHECK(ServiceWorkerUtils::IsServicificationEnabled() ||
- IsNavigationMojoResponseEnabled());
- DCHECK(!dispatcher_host_);
- dispatcher_host_ = dispatcher_host;
- dispatcher_host_->RegisterServiceWorkerHandle(base::WrapUnique(this));
-}
-
void ServiceWorkerHandle::PostMessageToServiceWorker(
- ::blink::TransferableMessage message,
- const url::Origin& source_origin) {
+ ::blink::TransferableMessage message) {
// When this method is called the encoded_message inside message could just
// point to the IPC message's buffer. But that buffer can become invalid
// before the message is passed on to the service worker, so make sure
// message owns its data.
message.EnsureDataIsOwned();
- DispatchExtendableMessageEvent(std::move(message), source_origin,
- base::DoNothing());
+ DispatchExtendableMessageEvent(std::move(message), base::DoNothing());
}
void ServiceWorkerHandle::TerminateForTesting(
@@ -242,21 +210,19 @@ void ServiceWorkerHandle::TerminateForTesting(
void ServiceWorkerHandle::DispatchExtendableMessageEvent(
::blink::TransferableMessage message,
- const url::Origin& source_origin,
StatusCallback callback) {
- if (!context_ || !provider_host_) {
- std::move(callback).Run(SERVICE_WORKER_ERROR_FAILED);
+ if (!context_) {
+ std::move(callback).Run(SERVICE_WORKER_ERROR_ABORT);
return;
}
+ DCHECK_EQ(provider_origin_,
+ url::Origin::Create(provider_host_->document_url()));
switch (provider_host_->provider_type()) {
case blink::mojom::ServiceWorkerProviderType::kForWindow:
- // TODO(leonhsl): Move kForSharedWorker to the kUnknown block to clarify
- // that currently a shared worker can not postMessage to a service worker.
- case blink::mojom::ServiceWorkerProviderType::kForSharedWorker:
service_worker_client_utils::GetClient(
- provider_host_.get(),
+ provider_host_,
base::BindOnce(&DispatchExtendableMessageEventFromClient, version_,
- std::move(message), source_origin,
+ std::move(message), provider_origin_,
std::move(callback)));
return;
case blink::mojom::ServiceWorkerProviderType::kForServiceWorker: {
@@ -268,11 +234,14 @@ void ServiceWorkerHandle::DispatchExtendableMessageEvent(
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&DispatchExtendableMessageEventFromServiceWorker,
- version_, std::move(message), source_origin,
+ version_, std::move(message), provider_origin_,
base::make_optional(timeout), std::move(callback),
- provider_host_));
+ provider_host_->AsWeakPtr()));
return;
}
+ case blink::mojom::ServiceWorkerProviderType::kForSharedWorker:
+ // Shared workers don't yet have access to ServiceWorker objects, so they
+ // can't postMessage to one (https://crbug.com/371690).
case blink::mojom::ServiceWorkerProviderType::kUnknown:
break;
}
@@ -287,16 +256,8 @@ void ServiceWorkerHandle::OnConnectionError() {
// If there are still bindings, |this| is still being used.
if (!bindings_.empty())
return;
- // S13nServiceWorker: This handle may have been precreated before registering
- // to a dispatcher host. Just self-destruct since we're no longer needed.
- if (!dispatcher_host_) {
- DCHECK(ServiceWorkerUtils::IsServicificationEnabled() ||
- IsNavigationMojoResponseEnabled());
- delete this;
- return;
- }
// Will destroy |this|.
- dispatcher_host_->UnregisterServiceWorkerHandle(handle_id_);
+ provider_host_->RemoveServiceWorkerHandle(version_->version_id());
}
} // namespace content
diff --git a/chromium/content/browser/service_worker/service_worker_handle.h b/chromium/content/browser/service_worker/service_worker_handle.h
index e9427e07431..b6a2d421279 100644
--- a/chromium/content/browser/service_worker/service_worker_handle.h
+++ b/chromium/content/browser/service_worker/service_worker_handle.h
@@ -14,16 +14,12 @@
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_types.h"
#include "mojo/public/cpp/bindings/associated_binding_set.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-
-namespace url {
-class Origin;
-} // namespace url
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "url/origin.h"
namespace content {
class ServiceWorkerContextCore;
-class ServiceWorkerDispatcherHost;
class ServiceWorkerProviderHost;
namespace service_worker_handle_unittest {
@@ -42,22 +38,9 @@ class CONTENT_EXPORT ServiceWorkerHandle
: public blink::mojom::ServiceWorkerObjectHost,
public ServiceWorkerVersion::Listener {
public:
- // Creates a newly created instance for a live version. |out_info| holds the
- // first ServiceWorkerObjectHost Mojo connection to this instance, which will
- // delete itself once it detects that all the Mojo connections have gone
- // away.
- //
- // This instance registers itself into |dispatcher_host| to be owned by the
- // dispatcher host. S13nServiceWorker: |dispatcher_host| may be null.
- // RegisterIntoDispatcherHost() should be called later to register the handle
- // once the host is known.
- static base::WeakPtr<ServiceWorkerHandle> Create(
- ServiceWorkerDispatcherHost* dispatcher_host,
- base::WeakPtr<ServiceWorkerContextCore> context,
- base::WeakPtr<ServiceWorkerProviderHost> provider_host,
- ServiceWorkerVersion* version,
- blink::mojom::ServiceWorkerObjectInfoPtr* out_info);
-
+ ServiceWorkerHandle(base::WeakPtr<ServiceWorkerContextCore> context,
+ ServiceWorkerProviderHost* provider_host,
+ scoped_refptr<ServiceWorkerVersion> version);
~ServiceWorkerHandle() override;
// ServiceWorkerVersion::Listener overrides.
@@ -66,10 +49,6 @@ class CONTENT_EXPORT ServiceWorkerHandle
// Establishes a new mojo connection into |bindings_|.
blink::mojom::ServiceWorkerObjectInfoPtr CreateObjectInfo();
- // Should only be called on a ServiceWorkerHandle instance constructed with
- // null |dispatcher_host| before.
- void RegisterIntoDispatcherHost(ServiceWorkerDispatcherHost* dispatcher_host);
-
int provider_id() const { return provider_id_; }
int handle_id() const { return handle_id_; }
ServiceWorkerVersion* version() { return version_.get(); }
@@ -77,32 +56,31 @@ class CONTENT_EXPORT ServiceWorkerHandle
private:
friend class service_worker_handle_unittest::ServiceWorkerHandleTest;
- ServiceWorkerHandle(ServiceWorkerDispatcherHost* dispatcher_host,
- base::WeakPtr<ServiceWorkerContextCore> context,
- base::WeakPtr<ServiceWorkerProviderHost> provider_host,
- ServiceWorkerVersion* version);
-
// Implements blink::mojom::ServiceWorkerObjectHost.
- void PostMessageToServiceWorker(::blink::TransferableMessage message,
- const url::Origin& source_origin) override;
+ void PostMessageToServiceWorker(
+ ::blink::TransferableMessage message) override;
void TerminateForTesting(TerminateForTestingCallback callback) override;
+ // TODO(leonhsl): Remove |callback| parameter because it's just for unit tests
+ // and production code does not use it. We need to figure out another way to
+ // observe the dispatch result in unit tests.
void DispatchExtendableMessageEvent(
::blink::TransferableMessage message,
- const url::Origin& source_origin,
base::OnceCallback<void(ServiceWorkerStatusCode)> callback);
base::WeakPtr<ServiceWorkerHandle> AsWeakPtr();
void OnConnectionError();
- // |dispatcher_host_| may get a valid value via ctor or
- // RegisterIntoDispatcherHost() function, after that |dispatcher_host_| starts
- // to own |this|, then, |dispatcher_host_| is valid throughout the lifetime of
- // |this|.
- ServiceWorkerDispatcherHost* dispatcher_host_;
base::WeakPtr<ServiceWorkerContextCore> context_;
- base::WeakPtr<ServiceWorkerProviderHost> provider_host_;
+ // |provider_host_| is valid throughout lifetime of |this| because it owns
+ // |this|.
+ ServiceWorkerProviderHost* provider_host_;
+ // The origin of the |provider_host_|. Note that this is const because once a
+ // JavaScript ServiceWorker object is created for an execution context, we
+ // don't expect that context to change origins and still hold on to the
+ // object.
+ const url::Origin provider_origin_;
const int provider_id_;
const int handle_id_;
scoped_refptr<ServiceWorkerVersion> version_;
diff --git a/chromium/content/browser/service_worker/service_worker_handle_unittest.cc b/chromium/content/browser/service_worker/service_worker_handle_unittest.cc
index 9ece9392e2f..1c31c0c11ff 100644
--- a/chromium/content/browser/service_worker/service_worker_handle_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_handle_unittest.cc
@@ -16,7 +16,6 @@
#include "content/browser/service_worker/service_worker_registration.h"
#include "content/browser/service_worker/service_worker_test_utils.h"
#include "content/browser/service_worker/service_worker_version.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/public/browser/render_frame_host.h"
@@ -29,8 +28,8 @@
#include "ipc/ipc_message.h"
#include "ipc/ipc_test_sink.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_state.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_state.mojom.h"
namespace content {
namespace service_worker_handle_unittest {
@@ -184,9 +183,8 @@ class ServiceWorkerHandleTest : public testing::Test {
void CallDispatchExtendableMessageEvent(
ServiceWorkerHandle* handle,
::blink::TransferableMessage message,
- const url::Origin& source_origin,
base::OnceCallback<void(ServiceWorkerStatusCode)> callback) {
- handle->DispatchExtendableMessageEvent(std::move(message), source_origin,
+ handle->DispatchExtendableMessageEvent(std::move(message),
std::move(callback));
}
@@ -194,6 +192,15 @@ class ServiceWorkerHandleTest : public testing::Test {
return handle->bindings_.size();
}
+ ServiceWorkerHandle* GetServiceWorkerHandle(
+ ServiceWorkerProviderHost* provider_host,
+ int64_t version_id) {
+ auto iter = provider_host->handles_.find(version_id);
+ if (iter != provider_host->handles_.end())
+ return iter->second.get();
+ return nullptr;
+ }
+
IPC::TestSink* ipc_sink() { return helper_->ipc_sink(); }
TestBrowserThreadBundle browser_thread_bundle_;
@@ -223,12 +230,10 @@ TEST_F(ServiceWorkerHandleTest, OnVersionStateChanged) {
helper_->mock_render_process_id(), kProviderId,
helper_->context()->AsWeakPtr(), kRenderFrameId,
dispatcher_host_.get(), &remote_endpoint);
- blink::mojom::ServiceWorkerObjectInfoPtr info;
- // ServiceWorkerHandle lifetime is controlled by |info| and is also owned by
- // |dispatcher_host_|.
- base::WeakPtr<ServiceWorkerHandle> handle = ServiceWorkerHandle::Create(
- dispatcher_host_.get(), helper_->context()->AsWeakPtr(),
- provider_host->AsWeakPtr(), version_.get(), &info);
+ blink::mojom::ServiceWorkerObjectInfoPtr info =
+ provider_host->GetOrCreateServiceWorkerHandle(version_.get());
+ ServiceWorkerHandle* handle =
+ GetServiceWorkerHandle(provider_host.get(), version_->version_id());
// Start the worker, and then...
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
@@ -283,16 +288,12 @@ TEST_F(ServiceWorkerHandleTest,
// Prepare a ServiceWorkerHandle corresponding to a JavaScript ServiceWorker
// object in the service worker execution context for |version_|.
- EXPECT_FALSE(dispatcher_host_->FindServiceWorkerHandle(
- version_->provider_host()->provider_id(), version_->version_id()));
- blink::mojom::ServiceWorkerObjectInfoPtr info;
- // ServiceWorkerHandle lifetime is controlled by |info| and is also owned by
- // |dispatcher_host_|.
- base::WeakPtr<ServiceWorkerHandle> sender_worker_handle =
- ServiceWorkerHandle::Create(
- dispatcher_host_.get(), helper_->context()->AsWeakPtr(),
- version_->provider_host()->AsWeakPtr(), version_.get(), &info);
- EXPECT_EQ(1u, GetBindingsCount(sender_worker_handle.get()));
+ ServiceWorkerProviderHost* provider_host = version_->provider_host();
+ blink::mojom::ServiceWorkerObjectInfoPtr info =
+ provider_host->GetOrCreateServiceWorkerHandle(version_.get());
+ ServiceWorkerHandle* sender_worker_handle =
+ GetServiceWorkerHandle(provider_host, version_->version_id());
+ EXPECT_EQ(1u, GetBindingsCount(sender_worker_handle));
// Dispatch an ExtendableMessageEvent simulating calling
// ServiceWorker#postMessage() on the ServiceWorker object corresponding to
@@ -302,8 +303,7 @@ TEST_F(ServiceWorkerHandleTest,
called = false;
status = SERVICE_WORKER_ERROR_MAX_VALUE;
CallDispatchExtendableMessageEvent(
- sender_worker_handle.get(), std::move(message),
- url::Origin::Create(version_->scope().GetOrigin()),
+ sender_worker_handle, std::move(message),
base::BindOnce(&SaveStatusCallback, &called, &status));
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
@@ -312,7 +312,7 @@ TEST_F(ServiceWorkerHandleTest,
// ExtendableMessageEventTestHelper, and the source service worker object info
// should correspond to the pair (|version_->provider_host()|, |version_|),
// means it should correspond to |sender_worker_handle|.
- EXPECT_EQ(2u, GetBindingsCount(sender_worker_handle.get()));
+ EXPECT_EQ(2u, GetBindingsCount(sender_worker_handle));
const std::vector<mojom::ExtendableMessageEventPtr>& events =
static_cast<ExtendableMessageEventTestHelper*>(helper_.get())->events();
EXPECT_EQ(1u, events.size());
@@ -350,13 +350,12 @@ TEST_F(ServiceWorkerHandleTest, DispatchExtendableMessageEvent_FromClient) {
ServiceWorkerProviderHost::Create(
frame_host->GetProcess()->GetID(), std::move(provider_host_info),
helper_->context()->AsWeakPtr(), dispatcher_host_->AsWeakPtr());
+ provider_host->SetDocumentUrl(pattern);
// Prepare a ServiceWorkerHandle for the above |provider_host|.
- blink::mojom::ServiceWorkerObjectInfoPtr info;
- // ServiceWorkerHandle lifetime is controlled by |info| and is also owned by
- // |dispatcher_host_|.
- base::WeakPtr<ServiceWorkerHandle> handle = ServiceWorkerHandle::Create(
- dispatcher_host_.get(), helper_->context()->AsWeakPtr(),
- provider_host->AsWeakPtr(), version_.get(), &info);
+ blink::mojom::ServiceWorkerObjectInfoPtr info =
+ provider_host->GetOrCreateServiceWorkerHandle(version_.get());
+ ServiceWorkerHandle* handle =
+ GetServiceWorkerHandle(provider_host.get(), version_->version_id());
// Simulate dispatching an ExtendableMessageEvent.
blink::TransferableMessage message;
@@ -364,8 +363,7 @@ TEST_F(ServiceWorkerHandleTest, DispatchExtendableMessageEvent_FromClient) {
bool called = false;
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
CallDispatchExtendableMessageEvent(
- handle.get(), std::move(message),
- url::Origin::Create(version_->scope().GetOrigin()),
+ handle, std::move(message),
base::BindOnce(&SaveStatusCallback, &called, &status));
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
@@ -407,13 +405,12 @@ TEST_F(ServiceWorkerHandleTest, DispatchExtendableMessageEvent_Fail) {
ServiceWorkerProviderHost::Create(
frame_host->GetProcess()->GetID(), std::move(provider_host_info),
helper_->context()->AsWeakPtr(), dispatcher_host_->AsWeakPtr());
+ provider_host->SetDocumentUrl(pattern);
// Prepare a ServiceWorkerHandle for the above |provider_host|.
- blink::mojom::ServiceWorkerObjectInfoPtr info;
- // ServiceWorkerHandle lifetime is controlled by |info| and is also owned by
- // |dispatcher_host_|.
- base::WeakPtr<ServiceWorkerHandle> handle = ServiceWorkerHandle::Create(
- dispatcher_host_.get(), helper_->context()->AsWeakPtr(),
- provider_host->AsWeakPtr(), version_.get(), &info);
+ blink::mojom::ServiceWorkerObjectInfoPtr info =
+ provider_host->GetOrCreateServiceWorkerHandle(version_.get());
+ ServiceWorkerHandle* handle =
+ GetServiceWorkerHandle(provider_host.get(), version_->version_id());
// Try to dispatch ExtendableMessageEvent. This should fail to start the
// worker and to dispatch the event.
@@ -422,8 +419,7 @@ TEST_F(ServiceWorkerHandleTest, DispatchExtendableMessageEvent_Fail) {
bool called = false;
ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
CallDispatchExtendableMessageEvent(
- handle.get(), std::move(message),
- url::Origin::Create(version_->scope().GetOrigin()),
+ handle, std::move(message),
base::BindOnce(&SaveStatusCallback, &called, &status));
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(called);
diff --git a/chromium/content/browser/service_worker/service_worker_info.cc b/chromium/content/browser/service_worker/service_worker_info.cc
index 40405d1c770..c6412175033 100644
--- a/chromium/content/browser/service_worker/service_worker_info.cc
+++ b/chromium/content/browser/service_worker/service_worker_info.cc
@@ -9,8 +9,8 @@
#include "content/public/common/browser_side_navigation_policy.h"
#include "content/public/common/child_process_host.h"
#include "ipc/ipc_message.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_info.h b/chromium/content/browser/service_worker/service_worker_info.h
index 3c5c7fecda7..945008dadcd 100644
--- a/chromium/content/browser/service_worker/service_worker_info.h
+++ b/chromium/content/browser/service_worker/service_worker_info.h
@@ -14,7 +14,7 @@
#include "content/browser/service_worker/service_worker_version.h"
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_types.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
#include "url/gurl.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_installed_script_loader.cc b/chromium/content/browser/service_worker/service_worker_installed_script_loader.cc
index 2b5d946b866..8283e936fdc 100644
--- a/chromium/content/browser/service_worker/service_worker_installed_script_loader.cc
+++ b/chromium/content/browser/service_worker/service_worker_installed_script_loader.cc
@@ -16,7 +16,7 @@
#include "content/common/service_worker/service_worker_utils.h"
#include "net/cert/cert_status_flags.h"
#include "services/network/public/cpp/resource_response.h"
-#include "third_party/WebKit/public/common/mime_util/mime_util.h"
+#include "third_party/blink/public/common/mime_util/mime_util.h"
namespace content {
@@ -52,8 +52,8 @@ void ServiceWorkerInstalledScriptLoader::OnStarted(
// Just drain the metadata (V8 code cache): this entire class is just to
// handle a corner case for non-installed service workers and high performance
// is not needed.
- metadata_drainer_ = std::make_unique<mojo::common::DataPipeDrainer>(
- this, std::move(metadata_handle));
+ metadata_drainer_ =
+ std::make_unique<mojo::DataPipeDrainer>(this, std::move(metadata_handle));
// We continue in OnHttpInfoRead().
}
@@ -78,11 +78,10 @@ void ServiceWorkerInstalledScriptLoader::OnHttpInfoRead(
head.socket_address = info->socket_address;
head.cert_status = info->ssl_info.cert_status;
- base::Optional<net::SSLInfo> ssl_info;
if (options_ & network::mojom::kURLLoadOptionSendSSLInfoWithResponse)
- ssl_info = info->ssl_info;
+ head.ssl_info = info->ssl_info;
- client_->OnReceiveResponse(head, ssl_info, nullptr /* downloaded_file */);
+ client_->OnReceiveResponse(head, nullptr /* downloaded_file */);
client_->OnStartLoadingResponseBody(std::move(body_handle_));
// We continue in OnFinished().
}
diff --git a/chromium/content/browser/service_worker/service_worker_installed_script_loader.h b/chromium/content/browser/service_worker/service_worker_installed_script_loader.h
index c02d9317de3..ad4844c1d64 100644
--- a/chromium/content/browser/service_worker/service_worker_installed_script_loader.h
+++ b/chromium/content/browser/service_worker/service_worker_installed_script_loader.h
@@ -8,9 +8,9 @@
#include "content/browser/service_worker/service_worker_disk_cache.h"
#include "content/browser/service_worker/service_worker_installed_script_reader.h"
#include "content/common/content_export.h"
-#include "mojo/common/data_pipe_drainer.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/data_pipe.h"
+#include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "services/network/public/mojom/url_loader.mojom.h"
namespace content {
@@ -27,7 +27,7 @@ namespace content {
class CONTENT_EXPORT ServiceWorkerInstalledScriptLoader
: public network::mojom::URLLoader,
public ServiceWorkerInstalledScriptReader::Client,
- public mojo::common::DataPipeDrainer::Client {
+ public mojo::DataPipeDrainer::Client {
public:
ServiceWorkerInstalledScriptLoader(
uint32_t options,
@@ -56,7 +56,7 @@ class CONTENT_EXPORT ServiceWorkerInstalledScriptLoader
void ResumeReadingBodyFromNet() override;
private:
- // mojo::common::DataPipeDrainer::Client overrides:
+ // mojo::DataPipeDrainer::Client overrides:
// These just do nothing.
void OnDataAvailable(const void* data, size_t num_bytes) override {}
void OnDataComplete() override {}
@@ -69,7 +69,7 @@ class CONTENT_EXPORT ServiceWorkerInstalledScriptLoader
std::string encoding_;
mojo::ScopedDataPipeConsumerHandle body_handle_;
uint64_t body_size_ = 0;
- std::unique_ptr<mojo::common::DataPipeDrainer> metadata_drainer_;
+ std::unique_ptr<mojo::DataPipeDrainer> metadata_drainer_;
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerInstalledScriptLoader);
};
diff --git a/chromium/content/browser/service_worker/service_worker_installed_script_reader.cc b/chromium/content/browser/service_worker/service_worker_installed_script_reader.cc
index 8ee5ba099e5..a70872a74d8 100644
--- a/chromium/content/browser/service_worker/service_worker_installed_script_reader.cc
+++ b/chromium/content/browser/service_worker/service_worker_installed_script_reader.cc
@@ -21,7 +21,9 @@ class ServiceWorkerInstalledScriptReader::MetaDataSender {
: meta_data_(std::move(meta_data)),
bytes_sent_(0),
handle_(std::move(handle)),
- watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC),
+ watcher_(FROM_HERE,
+ mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC,
+ base::SequencedTaskRunnerHandle::Get()),
weak_factory_(this) {}
void Start(base::OnceCallback<void(bool /* success */)> callback) {
@@ -82,7 +84,9 @@ ServiceWorkerInstalledScriptReader::ServiceWorkerInstalledScriptReader(
Client* client)
: reader_(std::move(reader)),
client_(client),
- body_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL),
+ body_watcher_(FROM_HERE,
+ mojo::SimpleWatcher::ArmingPolicy::MANUAL,
+ base::SequencedTaskRunnerHandle::Get()),
weak_factory_(this) {}
ServiceWorkerInstalledScriptReader::~ServiceWorkerInstalledScriptReader() {}
@@ -91,8 +95,8 @@ void ServiceWorkerInstalledScriptReader::Start() {
auto info_buf = base::MakeRefCounted<HttpResponseInfoIOBuffer>();
reader_->ReadInfo(
info_buf.get(),
- base::Bind(&ServiceWorkerInstalledScriptReader::OnReadInfoComplete,
- AsWeakPtr(), info_buf));
+ base::BindOnce(&ServiceWorkerInstalledScriptReader::OnReadInfoComplete,
+ AsWeakPtr(), info_buf));
}
void ServiceWorkerInstalledScriptReader::OnReadInfoComplete(
@@ -200,8 +204,8 @@ void ServiceWorkerInstalledScriptReader::OnWritableBody(MojoResult) {
body_pending_write_.get());
reader_->ReadData(
buffer.get(), num_bytes,
- base::Bind(&ServiceWorkerInstalledScriptReader::OnResponseDataRead,
- AsWeakPtr()));
+ base::BindOnce(&ServiceWorkerInstalledScriptReader::OnResponseDataRead,
+ AsWeakPtr()));
}
void ServiceWorkerInstalledScriptReader::OnResponseDataRead(int read_bytes) {
diff --git a/chromium/content/browser/service_worker/service_worker_installed_scripts_sender.h b/chromium/content/browser/service_worker/service_worker_installed_scripts_sender.h
index d97ae2b32b5..81531ca5c3a 100644
--- a/chromium/content/browser/service_worker/service_worker_installed_scripts_sender.h
+++ b/chromium/content/browser/service_worker/service_worker_installed_scripts_sender.h
@@ -10,7 +10,7 @@
#include "content/common/content_export.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/system/data_pipe.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc b/chromium/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
index 48a64621739..4a441aaf7e2 100644
--- a/chromium/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
@@ -17,7 +17,7 @@
#include "net/base/io_buffer.h"
#include "net/base/test_completion_callback.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_internals_ui.cc b/chromium/content/browser/service_worker/service_worker_internals_ui.cc
index 22d1e1cf892..6770fe5ac9d 100644
--- a/chromium/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/chromium/content/browser/service_worker/service_worker_internals_ui.cc
@@ -12,7 +12,6 @@
#include <vector>
#include "base/bind.h"
-#include "base/memory/ptr_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "content/browser/devtools/devtools_agent_host_impl.h"
@@ -33,7 +32,7 @@
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/common/child_process_host.h"
#include "content/public/common/url_constants.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
using base::DictionaryValue;
using base::ListValue;
@@ -343,31 +342,27 @@ ServiceWorkerInternalsUI::ServiceWorkerInternalsUI(WebUI* web_ui)
WebUIDataSource::Add(browser_context, source);
web_ui->RegisterMessageCallback(
- "GetOptions",
- base::Bind(&ServiceWorkerInternalsUI::GetOptions,
- base::Unretained(this)));
+ "GetOptions", base::BindRepeating(&ServiceWorkerInternalsUI::GetOptions,
+ base::Unretained(this)));
web_ui->RegisterMessageCallback(
- "SetOption",
- base::Bind(&ServiceWorkerInternalsUI::SetOption, base::Unretained(this)));
+ "SetOption", base::BindRepeating(&ServiceWorkerInternalsUI::SetOption,
+ base::Unretained(this)));
web_ui->RegisterMessageCallback(
"getAllRegistrations",
- base::Bind(&ServiceWorkerInternalsUI::GetAllRegistrations,
- base::Unretained(this)));
+ base::BindRepeating(&ServiceWorkerInternalsUI::GetAllRegistrations,
+ base::Unretained(this)));
web_ui->RegisterMessageCallback(
- "stop", base::Bind(&ServiceWorkerInternalsUI::StopWorker,
- base::Unretained(this)));
+ "stop", base::BindRepeating(&ServiceWorkerInternalsUI::StopWorker,
+ base::Unretained(this)));
web_ui->RegisterMessageCallback(
- "inspect",
- base::Bind(&ServiceWorkerInternalsUI::InspectWorker,
- base::Unretained(this)));
+ "inspect", base::BindRepeating(&ServiceWorkerInternalsUI::InspectWorker,
+ base::Unretained(this)));
web_ui->RegisterMessageCallback(
- "unregister",
- base::Bind(&ServiceWorkerInternalsUI::Unregister,
- base::Unretained(this)));
+ "unregister", base::BindRepeating(&ServiceWorkerInternalsUI::Unregister,
+ base::Unretained(this)));
web_ui->RegisterMessageCallback(
- "start",
- base::Bind(&ServiceWorkerInternalsUI::StartWorker,
- base::Unretained(this)));
+ "start", base::BindRepeating(&ServiceWorkerInternalsUI::StartWorker,
+ base::Unretained(this)));
}
ServiceWorkerInternalsUI::~ServiceWorkerInternalsUI() {
@@ -378,7 +373,8 @@ ServiceWorkerInternalsUI::~ServiceWorkerInternalsUI() {
BrowserContext::StoragePartitionCallback remove_observer_cb =
base::Bind(&ServiceWorkerInternalsUI::RemoveObserverFromStoragePartition,
base::Unretained(this));
- BrowserContext::ForEachStoragePartition(browser_context, remove_observer_cb);
+ BrowserContext::ForEachStoragePartition(browser_context,
+ std::move(remove_observer_cb));
}
void ServiceWorkerInternalsUI::GetOptions(const ListValue* args) {
@@ -409,7 +405,8 @@ void ServiceWorkerInternalsUI::GetAllRegistrations(const ListValue* args) {
BrowserContext::StoragePartitionCallback add_context_cb =
base::Bind(&ServiceWorkerInternalsUI::AddContextFromStoragePartition,
base::Unretained(this));
- BrowserContext::ForEachStoragePartition(browser_context, add_context_cb);
+ BrowserContext::ForEachStoragePartition(browser_context,
+ std::move(add_context_cb));
}
void ServiceWorkerInternalsUI::AddContextFromStoragePartition(
@@ -473,7 +470,8 @@ bool ServiceWorkerInternalsUI::GetServiceWorkerContext(
base::Unretained(this),
partition_id,
&result_partition);
- BrowserContext::ForEachStoragePartition(browser_context, find_context_cb);
+ BrowserContext::ForEachStoragePartition(browser_context,
+ std::move(find_context_cb));
if (!result_partition)
return false;
*context = static_cast<ServiceWorkerContextWrapper*>(
@@ -523,11 +521,11 @@ void ServiceWorkerInternalsUI::InspectWorker(const ListValue* args) {
->GetDevToolsAgentHostForWorker(process_host_id,
devtools_agent_route_id));
if (!agent_host.get()) {
- callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND);
+ std::move(callback).Run(SERVICE_WORKER_ERROR_NOT_FOUND);
return;
}
agent_host->Inspect();
- callback.Run(SERVICE_WORKER_OK);
+ std::move(callback).Run(SERVICE_WORKER_OK);
}
void ServiceWorkerInternalsUI::Unregister(const ListValue* args) {
@@ -547,7 +545,7 @@ void ServiceWorkerInternalsUI::Unregister(const ListValue* args) {
base::Callback<void(ServiceWorkerStatusCode)> callback =
base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id);
- UnregisterWithScope(context, GURL(scope_string), callback);
+ UnregisterWithScope(context, GURL(scope_string), std::move(callback));
}
void ServiceWorkerInternalsUI::StartWorker(const ListValue* args) {
@@ -566,7 +564,7 @@ void ServiceWorkerInternalsUI::StartWorker(const ListValue* args) {
}
base::Callback<void(ServiceWorkerStatusCode)> callback =
base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id);
- context->StartServiceWorker(GURL(scope_string), callback);
+ context->StartServiceWorker(GURL(scope_string), std::move(callback));
}
void ServiceWorkerInternalsUI::StopWorkerWithId(
diff --git a/chromium/content/browser/service_worker/service_worker_job_coordinator.cc b/chromium/content/browser/service_worker/service_worker_job_coordinator.cc
index 3155dac9ba2..c8ea110fd33 100644
--- a/chromium/content/browser/service_worker/service_worker_job_coordinator.cc
+++ b/chromium/content/browser/service_worker/service_worker_job_coordinator.cc
@@ -11,7 +11,7 @@
#include "base/memory/ptr_util.h"
#include "content/browser/service_worker/service_worker_register_job_base.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -105,23 +105,23 @@ ServiceWorkerJobCoordinator::~ServiceWorkerJobCoordinator() {
void ServiceWorkerJobCoordinator::Register(
const GURL& script_url,
const blink::mojom::ServiceWorkerRegistrationOptions& options,
- const ServiceWorkerRegisterJob::RegistrationCallback& callback) {
+ ServiceWorkerRegisterJob::RegistrationCallback callback) {
std::unique_ptr<ServiceWorkerRegisterJobBase> job(
new ServiceWorkerRegisterJob(context_, script_url, options));
ServiceWorkerRegisterJob* queued_job = static_cast<ServiceWorkerRegisterJob*>(
job_queues_[options.scope].Push(std::move(job)));
- queued_job->AddCallback(callback);
+ queued_job->AddCallback(std::move(callback));
}
void ServiceWorkerJobCoordinator::Unregister(
const GURL& pattern,
- const ServiceWorkerUnregisterJob::UnregistrationCallback& callback) {
+ ServiceWorkerUnregisterJob::UnregistrationCallback callback) {
std::unique_ptr<ServiceWorkerRegisterJobBase> job(
new ServiceWorkerUnregisterJob(context_, pattern));
ServiceWorkerUnregisterJob* queued_job =
static_cast<ServiceWorkerUnregisterJob*>(
job_queues_[pattern].Push(std::move(job)));
- queued_job->AddCallback(callback);
+ queued_job->AddCallback(std::move(callback));
}
void ServiceWorkerJobCoordinator::Update(
@@ -139,7 +139,7 @@ void ServiceWorkerJobCoordinator::Update(
ServiceWorkerRegistration* registration,
bool force_bypass_cache,
bool skip_script_comparison,
- const ServiceWorkerRegisterJob::RegistrationCallback& callback) {
+ ServiceWorkerRegisterJob::RegistrationCallback callback) {
DCHECK(registration);
ServiceWorkerRegisterJob* queued_job = static_cast<ServiceWorkerRegisterJob*>(
job_queues_[registration->pattern()].Push(
@@ -147,7 +147,7 @@ void ServiceWorkerJobCoordinator::Update(
new ServiceWorkerRegisterJob(context_, registration,
force_bypass_cache,
skip_script_comparison))));
- queued_job->AddCallback(callback);
+ queued_job->AddCallback(std::move(callback));
}
void ServiceWorkerJobCoordinator::AbortAll() {
diff --git a/chromium/content/browser/service_worker/service_worker_job_coordinator.h b/chromium/content/browser/service_worker/service_worker_job_coordinator.h
index 6eeef5fb227..cae8d52c46f 100644
--- a/chromium/content/browser/service_worker/service_worker_job_coordinator.h
+++ b/chromium/content/browser/service_worker/service_worker_job_coordinator.h
@@ -13,7 +13,7 @@
#include "content/browser/service_worker/service_worker_register_job.h"
#include "content/browser/service_worker/service_worker_unregister_job.h"
#include "content/common/content_export.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "url/gurl.h"
namespace content {
@@ -29,18 +29,17 @@ class CONTENT_EXPORT ServiceWorkerJobCoordinator {
void Register(const GURL& script_url,
const blink::mojom::ServiceWorkerRegistrationOptions& options,
- const ServiceWorkerRegisterJob::RegistrationCallback& callback);
+ ServiceWorkerRegisterJob::RegistrationCallback callback);
- void Unregister(
- const GURL& pattern,
- const ServiceWorkerUnregisterJob::UnregistrationCallback& callback);
+ void Unregister(const GURL& pattern,
+ ServiceWorkerUnregisterJob::UnregistrationCallback callback);
void Update(ServiceWorkerRegistration* registration, bool force_bypass_cache);
void Update(ServiceWorkerRegistration* registration,
bool force_bypass_cache,
bool skip_script_comparison,
- const ServiceWorkerRegisterJob::RegistrationCallback& callback);
+ ServiceWorkerRegisterJob::RegistrationCallback callback);
// Calls ServiceWorkerRegisterJobBase::Abort() on all jobs and removes them.
void AbortAll();
diff --git a/chromium/content/browser/service_worker/service_worker_job_unittest.cc b/chromium/content/browser/service_worker/service_worker_job_unittest.cc
index 64ee5077c63..78c577fe053 100644
--- a/chromium/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_job_unittest.cc
@@ -8,26 +8,22 @@
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
#include "base/optional.h"
#include "base/run_loop.h"
#include "base/test/test_simple_task_runner.h"
#include "base/time/time.h"
-#include "content/browser/browser_thread_impl.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/embedded_worker_status.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_disk_cache.h"
-#include "content/browser/service_worker/service_worker_dispatcher_host.h"
#include "content/browser/service_worker/service_worker_handle.h"
#include "content/browser/service_worker/service_worker_job_coordinator.h"
#include "content/browser/service_worker/service_worker_registration.h"
#include "content/browser/service_worker/service_worker_registration_object_host.h"
#include "content/browser/service_worker/service_worker_registration_status.h"
#include "content/browser/service_worker/service_worker_test_utils.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/test/test_browser_context.h"
@@ -38,10 +34,10 @@
#include "net/base/test_completion_callback.h"
#include "net/http/http_response_headers.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
using net::IOBuffer;
using net::TestCompletionCallback;
@@ -52,42 +48,6 @@ namespace content {
namespace {
-// A dispatcher host that holds on to all registered ServiceWorkerHandles.
-class KeepHandlesDispatcherHost : public ServiceWorkerDispatcherHost {
- public:
- KeepHandlesDispatcherHost(int render_process_id,
- ResourceContext* resource_context)
- : ServiceWorkerDispatcherHost(render_process_id, resource_context) {}
- void RegisterServiceWorkerHandle(
- std::unique_ptr<ServiceWorkerHandle> handle) override {
- handles_.push_back(std::move(handle));
- }
-
- void UnregisterServiceWorkerHandle(int handle_id) override {
- auto iter = handles_.begin();
- for (; iter != handles_.end(); ++iter) {
- if ((*iter)->handle_id() == handle_id)
- break;
- }
- ASSERT_NE(handles_.end(), iter);
- handles_.erase(iter);
- }
-
- void Clear() {
- handles_.clear();
- }
-
- const std::vector<std::unique_ptr<ServiceWorkerHandle>>& handles() {
- return handles_;
- }
-
- private:
- ~KeepHandlesDispatcherHost() override {}
-
- std::vector<std::unique_ptr<ServiceWorkerHandle>> handles_;
- DISALLOW_COPY_AND_ASSIGN(KeepHandlesDispatcherHost);
-};
-
void SaveRegistrationCallback(
ServiceWorkerStatusCode expected_status,
bool* called,
@@ -121,8 +81,8 @@ ServiceWorkerRegisterJob::RegistrationCallback SaveRegistration(
bool* called,
scoped_refptr<ServiceWorkerRegistration>* registration) {
*called = false;
- return base::Bind(
- &SaveRegistrationCallback, expected_status, called, registration);
+ return base::BindOnce(&SaveRegistrationCallback, expected_status, called,
+ registration);
}
ServiceWorkerStorage::FindRegistrationCallback SaveFoundRegistration(
@@ -146,7 +106,7 @@ ServiceWorkerUnregisterJob::UnregistrationCallback SaveUnregistration(
ServiceWorkerStatusCode expected_status,
bool* called) {
*called = false;
- return base::Bind(&SaveUnregistrationCallback, expected_status, called);
+ return base::BindOnce(&SaveUnregistrationCallback, expected_status, called);
}
} // namespace
@@ -340,41 +300,32 @@ TEST_F(ServiceWorkerJobTest, Register) {
// Make sure registrations are cleaned up when they are unregistered.
TEST_F(ServiceWorkerJobTest, Unregister) {
- // During registration, service worker handles will be created to host the
- // {installing,waiting,active} service worker objects for
- // ServiceWorkerGlobalScope#registration. KeepHandlesDispatcherHost will store
- // the handles.
- scoped_refptr<KeepHandlesDispatcherHost> dispatcher_host =
- base::MakeRefCounted<KeepHandlesDispatcherHost>(
- helper_->mock_render_process_id(),
- helper_->browser_context()->GetResourceContext());
- helper_->RegisterDispatcherHost(helper_->mock_render_process_id(),
- dispatcher_host);
- dispatcher_host->Init(helper_->context_wrapper());
-
blink::mojom::ServiceWorkerRegistrationOptions options;
options.scope = GURL("http://www.example.com/");
scoped_refptr<ServiceWorkerRegistration> registration =
RunRegisterJob(GURL("http://www.example.com/service_worker.js"), options);
+ scoped_refptr<ServiceWorkerVersion> version = registration->active_version();
- // During the above registration, a service worker registration object host
- // for ServiceWorkerGlobalScope#registration has been created/added into
- // |provider_host|.
ServiceWorkerProviderHost* provider_host =
registration->active_version()->provider_host();
ASSERT_NE(nullptr, provider_host);
+ // One ServiceWorkerRegistrationObjectHost should have been created for the
+ // new registration.
EXPECT_EQ(1UL, provider_host->registration_object_hosts_.size());
- EXPECT_EQ(3UL, dispatcher_host->handles().size());
+ // One ServiceWorkerHandle should have been created for the new service
+ // worker.
+ EXPECT_EQ(1UL, provider_host->handles_.size());
RunUnregisterJob(options.scope);
- // Clear all service worker handles.
- dispatcher_host->Clear();
- EXPECT_EQ(0UL, dispatcher_host->handles().size());
- // The service worker registration object host has been destroyed together
- // with |provider_host| by the above unregistration. Then the only reference
- // to the registration should be |registration|.
+ // The service worker registration object host and service worker handle have
+ // been destroyed together with |provider_host| by the above unregistration.
+ // Then |registration| and |version| should be the last one reference to the
+ // corresponding instance.
EXPECT_TRUE(registration->HasOneRef());
+ EXPECT_TRUE(version->HasOneRef());
+ EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version->running_status());
+ EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, version->status());
registration =
FindRegistrationForPattern(options.scope, SERVICE_WORKER_ERROR_NOT_FOUND);
@@ -417,16 +368,6 @@ TEST_F(ServiceWorkerJobTest, RegisterNewScript) {
// Make sure that when registering a duplicate pattern+script_url
// combination, that the same registration is used.
TEST_F(ServiceWorkerJobTest, RegisterDuplicateScript) {
- // During registration, handles will be created for hosting the worker's
- // context. KeepHandlesDispatcherHost will store the handles.
- scoped_refptr<KeepHandlesDispatcherHost> dispatcher_host =
- new KeepHandlesDispatcherHost(
- helper_->mock_render_process_id(),
- helper_->browser_context()->GetResourceContext());
- helper_->RegisterDispatcherHost(helper_->mock_render_process_id(),
- dispatcher_host);
- dispatcher_host->Init(helper_->context_wrapper());
-
GURL script_url("http://www.example.com/service_worker.js");
blink::mojom::ServiceWorkerRegistrationOptions options;
options.scope = GURL("http://www.example.com/");
@@ -442,7 +383,7 @@ TEST_F(ServiceWorkerJobTest, RegisterDuplicateScript) {
ASSERT_NE(nullptr, provider_host);
// Clear all service worker handles.
- dispatcher_host->Clear();
+ provider_host->handles_.clear();
// Ensure that the registration's object host doesn't have the reference.
EXPECT_EQ(1UL, provider_host->registration_object_hosts_.size());
provider_host->registration_object_hosts_.clear();
@@ -471,15 +412,6 @@ TEST_F(ServiceWorkerJobTest, RegisterDuplicateScript) {
// is updated when registering a duplicate pattern+script_url with a different
// update_via_cache value.
TEST_F(ServiceWorkerJobTest, RegisterWithDifferentUpdateViaCache) {
- // During registration, handles will be created for hosting the worker's
- // context. KeepHandlesDispatcherHost will store the handles.
- auto dispatcher_host = base::MakeRefCounted<KeepHandlesDispatcherHost>(
- helper_->mock_render_process_id(),
- helper_->browser_context()->GetResourceContext());
- helper_->RegisterDispatcherHost(helper_->mock_render_process_id(),
- dispatcher_host);
- dispatcher_host->Init(helper_->context_wrapper());
-
GURL script_url("https://www.example.com/service_worker.js");
blink::mojom::ServiceWorkerRegistrationOptions options;
options.scope = GURL("https://www.example.com/");
@@ -498,7 +430,7 @@ TEST_F(ServiceWorkerJobTest, RegisterWithDifferentUpdateViaCache) {
ASSERT_NE(nullptr, provider_host);
// Clear all service worker handles.
- dispatcher_host->Clear();
+ provider_host->handles_.clear();
// Ensure that the registration's object host doesn't have the reference.
EXPECT_EQ(1UL, provider_host->registration_object_hosts_.size());
provider_host->registration_object_hosts_.clear();
@@ -899,9 +831,7 @@ const std::string kScope("scope/");
const std::string kScript("script.js");
void RunNestedUntilIdle() {
- base::MessageLoop::ScopedNestableTaskAllower allow(
- base::MessageLoop::current());
- base::RunLoop().RunUntilIdle();
+ base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
}
void OnIOComplete(int* rv_out, int rv) {
diff --git a/chromium/content/browser/service_worker/service_worker_lifetime_tracker.cc b/chromium/content/browser/service_worker/service_worker_lifetime_tracker.cc
index 6a6d28cf062..9cb28153972 100644
--- a/chromium/content/browser/service_worker/service_worker_lifetime_tracker.cc
+++ b/chromium/content/browser/service_worker/service_worker_lifetime_tracker.cc
@@ -15,7 +15,7 @@ ServiceWorkerLifetimeTracker::ServiceWorkerLifetimeTracker()
: ServiceWorkerLifetimeTracker(base::DefaultTickClock::GetInstance()) {}
ServiceWorkerLifetimeTracker::ServiceWorkerLifetimeTracker(
- base::TickClock* tick_clock)
+ const base::TickClock* tick_clock)
: tick_clock_(tick_clock) {}
ServiceWorkerLifetimeTracker::~ServiceWorkerLifetimeTracker() = default;
diff --git a/chromium/content/browser/service_worker/service_worker_lifetime_tracker.h b/chromium/content/browser/service_worker/service_worker_lifetime_tracker.h
index 12b0eb16c23..7fd677dc2d4 100644
--- a/chromium/content/browser/service_worker/service_worker_lifetime_tracker.h
+++ b/chromium/content/browser/service_worker/service_worker_lifetime_tracker.h
@@ -10,7 +10,6 @@
#include "base/gtest_prod_util.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/time/tick_clock.h"
#include "base/timer/timer.h"
#include "content/common/content_export.h"
@@ -22,7 +21,7 @@ namespace content {
class CONTENT_EXPORT ServiceWorkerLifetimeTracker {
public:
ServiceWorkerLifetimeTracker();
- explicit ServiceWorkerLifetimeTracker(base::TickClock* tick_clock);
+ explicit ServiceWorkerLifetimeTracker(const base::TickClock* tick_clock);
virtual ~ServiceWorkerLifetimeTracker();
// Called when the worker started running.
@@ -38,7 +37,7 @@ class CONTENT_EXPORT ServiceWorkerLifetimeTracker {
void RecordHistograms();
- base::TickClock* tick_clock_;
+ const base::TickClock* tick_clock_;
std::map<int64_t /* embedded_worker_id */, base::TimeTicks /* start_time */>
running_workers_;
diff --git a/chromium/content/browser/service_worker/service_worker_metrics.cc b/chromium/content/browser/service_worker/service_worker_metrics.cc
index 03552196265..463d9e7d2dd 100644
--- a/chromium/content/browser/service_worker/service_worker_metrics.cc
+++ b/chromium/content/browser/service_worker/service_worker_metrics.cc
@@ -613,19 +613,6 @@ void ServiceWorkerMetrics::RecordInstallEventStatus(
SERVICE_WORKER_ERROR_MAX_VALUE);
}
-void ServiceWorkerMetrics::RecordForeignFetchRegistrationCount(
- size_t scope_count,
- size_t origin_count) {
- UMA_HISTOGRAM_COUNTS_100("ServiceWorker.ForeignFetch.ScopeCount",
- scope_count);
- if (scope_count > 0) {
- // Only record number of origins if service worker registered for at least
- // one foreign fetch scope.
- UMA_HISTOGRAM_COUNTS_100("ServiceWorker.ForeignFetch.OriginCount",
- origin_count);
- }
-}
-
void ServiceWorkerMetrics::RecordEventDispatchingDelay(EventType event_type,
base::TimeDelta time,
Site site_for_metrics) {
@@ -769,20 +756,17 @@ void ServiceWorkerMetrics::RecordStatusZeroResponseError(
blink::mojom::ServiceWorkerResponseError error) {
if (is_main_resource) {
UMA_HISTOGRAM_ENUMERATION(
- "ServiceWorker.URLRequestJob.MainResource.StatusZeroError", error,
- static_cast<int>(blink::mojom::ServiceWorkerResponseError::kLast) + 1);
+ "ServiceWorker.URLRequestJob.MainResource.StatusZeroError", error);
} else {
UMA_HISTOGRAM_ENUMERATION(
- "ServiceWorker.URLRequestJob.Subresource.StatusZeroError", error,
- static_cast<int>(blink::mojom::ServiceWorkerResponseError::kLast) + 1);
+ "ServiceWorker.URLRequestJob.Subresource.StatusZeroError", error);
}
}
void ServiceWorkerMetrics::RecordFallbackedRequestMode(
network::mojom::FetchRequestMode mode) {
- UMA_HISTOGRAM_ENUMERATION(
- "ServiceWorker.URLRequestJob.FallbackedRequestMode", mode,
- static_cast<int>(network::mojom::FetchRequestMode::kLast) + 1);
+ UMA_HISTOGRAM_ENUMERATION("ServiceWorker.URLRequestJob.FallbackedRequestMode",
+ mode);
}
void ServiceWorkerMetrics::RecordProcessCreated(bool is_new_process) {
diff --git a/chromium/content/browser/service_worker/service_worker_metrics.h b/chromium/content/browser/service_worker/service_worker_metrics.h
index fe9e9e2d0ee..e0a5ce15932 100644
--- a/chromium/content/browser/service_worker/service_worker_metrics.h
+++ b/chromium/content/browser/service_worker/service_worker_metrics.h
@@ -299,9 +299,6 @@ class ServiceWorkerMetrics {
bool is_shutdown);
static void RecordInstallEventStatus(ServiceWorkerStatusCode status);
- static void RecordForeignFetchRegistrationCount(size_t scope_count,
- size_t origin_count);
-
// Records how often a dispatched event times out.
static void RecordEventTimeout(EventType event);
diff --git a/chromium/content/browser/service_worker/service_worker_navigation_handle.h b/chromium/content/browser/service_worker/service_worker_navigation_handle.h
index c5c69388cf7..e1f32a87465 100644
--- a/chromium/content/browser/service_worker/service_worker_navigation_handle.h
+++ b/chromium/content/browser/service_worker/service_worker_navigation_handle.h
@@ -28,12 +28,12 @@ class ServiceWorkerNavigationHandleCore;
// pointer to the ServiceWorkerNavigationHandleCore.
//
// 3) If we pre-create a ServiceWorkerProviderHost for this navigation, its
-// ownershipped is passed to the ServiceWorkerNavigationHandleCore. The
+// ownership is passed to the ServiceWorkerNavigationHandleCore. The
// ServiceWorkerNavigationHandleCore id is updated.
//
// 4) The ServiceWorkerNavigationHandleCore informs the
-// ServiceWorkerNavigationHandle on the UI that the service worker provider
-// id was updated.
+// ServiceWorkerNavigationHandle on the UI thread that the service worker
+// provider id was updated.
//
// 5) When the navigation is ready to commit, the NavigationRequest will
// update the RequestNavigationParams based on the id from the
diff --git a/chromium/content/browser/service_worker/service_worker_navigation_loader.cc b/chromium/content/browser/service_worker/service_worker_navigation_loader.cc
index deaa67086c7..241e860824a 100644
--- a/chromium/content/browser/service_worker/service_worker_navigation_loader.cc
+++ b/chromium/content/browser/service_worker/service_worker_navigation_loader.cc
@@ -71,7 +71,7 @@ class ServiceWorkerNavigationLoader::StreamWaiter
};
ServiceWorkerNavigationLoader::ServiceWorkerNavigationLoader(
- URLLoaderRequestHandler::LoaderCallback callback,
+ NavigationLoaderInterceptor::LoaderCallback callback,
Delegate* delegate,
const network::ResourceRequest& resource_request,
scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter)
@@ -83,12 +83,7 @@ ServiceWorkerNavigationLoader::ServiceWorkerNavigationLoader(
weak_factory_(this) {
DCHECK(ServiceWorkerUtils::IsMainResourceType(
static_cast<ResourceType>(resource_request.resource_type)));
- DCHECK_EQ(network::mojom::FetchRequestMode::kNavigate,
- resource_request_.fetch_request_mode);
- DCHECK_EQ(network::mojom::FetchCredentialsMode::kInclude,
- resource_request_.fetch_credentials_mode);
- DCHECK_EQ(network::mojom::FetchRedirectMode::kManual,
- resource_request_.fetch_redirect_mode);
+
response_head_.load_timing.request_start = base::TimeTicks::Now();
response_head_.load_timing.request_start_time = base::Time::Now();
}
@@ -198,7 +193,7 @@ void ServiceWorkerNavigationLoader::CommitResponseHeaders() {
DCHECK_EQ(Status::kStarted, status_);
DCHECK(url_loader_client_.is_bound());
status_ = Status::kSentHeader;
- url_loader_client_->OnReceiveResponse(response_head_, ssl_info_,
+ url_loader_client_->OnReceiveResponse(response_head_,
nullptr /* downloaded_file */);
}
@@ -264,8 +259,8 @@ void ServiceWorkerNavigationLoader::DidDispatchFetchEvent(
return;
}
- // Creates a new HttpResponseInfo using the the ServiceWorker script's
- // HttpResponseInfo to show HTTPS padlock.
+ // Get SSLInfo from the ServiceWorker script's HttpResponseInfo to show HTTPS
+ // padlock.
// TODO(horo): When we support mixed-content (HTTP) no-cors requests from a
// ServiceWorker, we have to check the security level of the responses.
const net::HttpResponseInfo* main_script_http_info =
@@ -301,6 +296,7 @@ void ServiceWorkerNavigationLoader::StartResponse(
response_head_.did_service_worker_navigation_preload =
did_navigation_preload_;
response_head_.load_timing.receive_headers_end = base::TimeTicks::Now();
+ response_head_.ssl_info = ssl_info_;
// Handle a redirect response. ComputeRedirectInfo returns non-null redirect
// info if the given response is a redirect.
@@ -368,9 +364,9 @@ void ServiceWorkerNavigationLoader::FollowRedirect() {
}
void ServiceWorkerNavigationLoader::ProceedWithResponse() {
- // TODO(arthursonzogni): Implement this for navigation requests if the
- // ServiceWorker service is enabled before the Network Service.
- NOTREACHED();
+ // ServiceWorkerNavigationLoader doesn't need to wait for
+ // ProceedWithResponse() since it doesn't use MojoAsyncResourceHandler to load
+ // the resource request.
}
void ServiceWorkerNavigationLoader::SetPriority(net::RequestPriority priority,
diff --git a/chromium/content/browser/service_worker/service_worker_navigation_loader.h b/chromium/content/browser/service_worker/service_worker_navigation_loader.h
index 29293f14c99..4f12d5b6d15 100644
--- a/chromium/content/browser/service_worker/service_worker_navigation_loader.h
+++ b/chromium/content/browser/service_worker/service_worker_navigation_loader.h
@@ -10,7 +10,7 @@
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
-#include "content/browser/loader/url_loader_request_handler.h"
+#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
#include "content/browser/service_worker/service_worker_metrics.h"
#include "content/browser/service_worker/service_worker_response_type.h"
@@ -21,8 +21,8 @@
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "services/network/public/mojom/url_loader.mojom.h"
-#include "third_party/WebKit/public/mojom/blob/blob.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
+#include "third_party/blink/public/mojom/blob/blob.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
namespace content {
@@ -30,17 +30,18 @@ struct ServiceWorkerResponse;
class ServiceWorkerVersion;
// S13nServiceWorker:
-// ServiceWorkerNavigationLoader is the URLLoader used for navigation requests
-// that (potentially) go through a service worker. This loader is only used for
-// the main resource request; once the navigation is committed, the page loads
+// ServiceWorkerNavigationLoader is the URLLoader used for main resource
+// requests (i.e., navigation and shared worker requests) that (potentially) go
+// through a service worker. This loader is only used for the main resource
+// request; once the response is delivered, the resulting client loads
// subresources via ServiceWorkerSubresourceLoader.
//
// This class works similarly to ServiceWorkerURLRequestJob but with
// network::mojom::URLLoader instead of URLRequest.
//
// This class is owned by the job wrapper until it is bound to a URLLoader
-// request. After it is bound |this| is kept alive until the Mojo connection
-// to this URLLoader is dropped.
+// request. After it is bound |this| is kept alive until the Mojo connection to
+// this URLLoader is dropped.
class CONTENT_EXPORT ServiceWorkerNavigationLoader
: public network::mojom::URLLoader {
public:
@@ -48,9 +49,9 @@ class CONTENT_EXPORT ServiceWorkerNavigationLoader
using ResponseType = ServiceWorkerResponseType;
// Created by ServiceWorkerControlleeRequestHandler::MaybeCreateLoader
- // when starting to load a page for navigation.
+ // when starting to load a main resource.
//
- // This job typically works in the following order:
+ // For the navigation case, this job typically works in the following order:
// 1. One of the FallbackTo* or ForwardTo* methods are called via
// URLJobWrapper by ServiceWorkerControlleeRequestHandler, which
// determines how the request should be served (e.g. should fallback
@@ -71,8 +72,11 @@ class CONTENT_EXPORT ServiceWorkerNavigationLoader
// NavigationURLLoaderNetworkService (for resource loading for navigation).
// This forwards the blob/stream data pipe to the NavigationURLLoader if
// the response body was sent as a blob/stream.
+ //
+ // Loads for shared workers work similarly, except SharedWorkerScriptLoader
+ // is used instead of NavigationURLLoaderNetworkService.
ServiceWorkerNavigationLoader(
- URLLoaderRequestHandler::LoaderCallback loader_callback,
+ NavigationLoaderInterceptor::LoaderCallback loader_callback,
Delegate* delegate,
const network::ResourceRequest& resource_request,
scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter);
@@ -148,7 +152,7 @@ class CONTENT_EXPORT ServiceWorkerNavigationLoader
void DeleteIfNeeded();
ResponseType response_type_ = ResponseType::NOT_DETERMINED;
- URLLoaderRequestHandler::LoaderCallback loader_callback_;
+ NavigationLoaderInterceptor::LoaderCallback loader_callback_;
Delegate* delegate_;
network::ResourceRequest resource_request_;
diff --git a/chromium/content/browser/service_worker/service_worker_navigation_loader_unittest.cc b/chromium/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
index a2b7c725f88..e37883b9028 100644
--- a/chromium/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
@@ -6,7 +6,7 @@
#include "base/run_loop.h"
#include "base/test/scoped_feature_list.h"
-#include "content/browser/loader/url_loader_request_handler.h"
+#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_registration.h"
@@ -16,8 +16,8 @@
#include "content/common/service_worker/service_worker_utils.h"
#include "content/common/single_request_url_loader_factory.h"
#include "content/public/test/test_browser_thread_bundle.h"
-#include "mojo/common/data_pipe_utils.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/system/data_pipe_utils.h"
#include "net/http/http_util.h"
#include "net/ssl/ssl_info.h"
#include "net/test/cert_test_util.h"
@@ -31,8 +31,8 @@
#include "storage/browser/blob/blob_impl.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
namespace service_worker_navigation_loader_unittest {
@@ -85,7 +85,6 @@ class NavigationPreloadLoaderClient final
// network::mojom::URLLoaderClient implementation
void OnReceiveResponse(
const network::ResourceResponseHead& response_head,
- const base::Optional<net::SSLInfo>& ssl_info,
network::mojom::DownloadedTempFilePtr downloaded_file) override {
response_head_ = response_head;
}
@@ -178,7 +177,7 @@ class MockNetworkURLLoaderFactory final
network::ResourceResponseHead response;
response.headers = info.headers;
response.headers->GetMimeType(&response.mime_type);
- client->OnReceiveResponse(response, base::nullopt, nullptr);
+ client->OnReceiveResponse(response, nullptr);
std::string body = "this body came from the network";
uint32_t bytes_written = body.size();
@@ -690,8 +689,8 @@ TEST_F(ServiceWorkerNavigationLoaderTest, BlobResponse) {
// Test the body.
std::string body;
EXPECT_TRUE(client_.response_body().is_valid());
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_.response_body_release(), &body));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_.response_body_release(), &body));
EXPECT_EQ(kResponseBody, body);
EXPECT_EQ(net::OK, client_.completion_status().error_code);
}
@@ -759,8 +758,8 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponse) {
// Test the body.
std::string response;
EXPECT_TRUE(client_.response_body().is_valid());
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_.response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_.response_body_release(), &response));
EXPECT_EQ(kResponseBody, response);
}
@@ -797,8 +796,8 @@ TEST_F(ServiceWorkerNavigationLoaderTest, StreamResponse_Abort) {
// Test the body.
std::string response;
EXPECT_TRUE(client_.response_body().is_valid());
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_.response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_.response_body_release(), &response));
EXPECT_EQ(kResponseBody, response);
}
@@ -949,8 +948,8 @@ TEST_F(ServiceWorkerNavigationLoaderTest, NavigationPreload) {
std::string response;
EXPECT_TRUE(client_.response_body().is_valid());
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_.response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_.response_body_release(), &response));
EXPECT_EQ("this body came from the network", response);
}
diff --git a/chromium/content/browser/service_worker/service_worker_new_script_loader.cc b/chromium/content/browser/service_worker/service_worker_new_script_loader.cc
index a78f3446514..578d4ad6511 100644
--- a/chromium/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/chromium/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -18,7 +18,7 @@
#include "content/common/service_worker/service_worker_utils.h"
#include "net/cert/cert_status_flags.h"
#include "services/network/public/cpp/resource_response.h"
-#include "third_party/WebKit/public/common/mime_util/mime_util.h"
+#include "third_party/blink/public/common/mime_util/mime_util.h"
namespace content {
@@ -40,7 +40,9 @@ ServiceWorkerNewScriptLoader::ServiceWorkerNewScriptLoader(
resource_type_(static_cast<ResourceType>(resource_request.resource_type)),
version_(version),
network_client_binding_(this),
- network_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL),
+ network_watcher_(FROM_HERE,
+ mojo::SimpleWatcher::ArmingPolicy::MANUAL,
+ base::SequencedTaskRunnerHandle::Get()),
client_(std::move(client)),
weak_factory_(this) {
// ServiceWorkerNewScriptLoader is used for fetching the service worker main
@@ -94,6 +96,10 @@ ServiceWorkerNewScriptLoader::ServiceWorkerNewScriptLoader(
cache_resource_id);
AdvanceState(State::kStarted);
+ // Disable MIME sniffing sniffing. The spec requires the header list to have
+ // a JavaScript MIME type. Therefore, no sniffing is needed.
+ options &= ~network::mojom::kURLLoadOptionSniffMimeType;
+
network::mojom::URLLoaderClientPtr network_client;
network_client_binding_.Bind(mojo::MakeRequest(&network_client));
loader_factory_getter->GetNetworkFactory()->CreateLoaderAndStart(
@@ -130,10 +136,10 @@ void ServiceWorkerNewScriptLoader::ResumeReadingBodyFromNet() {
void ServiceWorkerNewScriptLoader::OnReceiveResponse(
const network::ResourceResponseHead& response_head,
- const base::Optional<net::SSLInfo>& ssl_info,
network::mojom::DownloadedTempFilePtr downloaded_file) {
if (!version_->context() || version_->is_redundant()) {
- CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED));
+ CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED),
+ kServiceWorkerFetchScriptError);
return;
}
@@ -141,8 +147,8 @@ void ServiceWorkerNewScriptLoader::OnReceiveResponse(
// At least we need headers and SSL info.
auto response_info = std::make_unique<net::HttpResponseInfo>();
response_info->headers = response_head.headers;
- if (ssl_info.has_value())
- response_info->ssl_info = *ssl_info;
+ if (response_head.ssl_info.has_value())
+ response_info->ssl_info = *response_head.ssl_info;
response_info->was_fetched_via_spdy = response_head.was_fetched_via_spdy;
response_info->was_alpn_negotiated = response_head.was_alpn_negotiated;
response_info->alpn_negotiated_protocol =
@@ -155,10 +161,12 @@ void ServiceWorkerNewScriptLoader::OnReceiveResponse(
if (response_head.headers->response_code() / 100 != 2) {
// Non-2XX HTTP status code is handled as an error.
- // TODO(nhiroki): Show an error message equivalent to kBadHTTPResponseError
- // in service_worker_write_to_cache_job.cc.
+ std::string error_message =
+ base::StringPrintf(kServiceWorkerBadHTTPResponseError,
+ response_head.headers->response_code());
CommitCompleted(
- network::URLLoaderCompletionStatus(net::ERR_INVALID_RESPONSE));
+ network::URLLoaderCompletionStatus(net::ERR_INVALID_RESPONSE),
+ error_message);
return;
}
@@ -166,25 +174,28 @@ void ServiceWorkerNewScriptLoader::OnReceiveResponse(
if (net::IsCertStatusError(response_head.cert_status) &&
!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kIgnoreCertificateErrors)) {
- // TODO(nhiroki): Show an error message equivalent to kSSLError in
- // service_worker_write_to_cache_job.cc.
- CommitCompleted(network::URLLoaderCompletionStatus(
- net::MapCertStatusToNetError(response_head.cert_status)));
+ CommitCompleted(
+ network::URLLoaderCompletionStatus(
+ net::MapCertStatusToNetError(response_head.cert_status)),
+ kServiceWorkerSSLError);
return;
}
if (resource_type_ == RESOURCE_TYPE_SERVICE_WORKER) {
if (!blink::IsSupportedJavascriptMimeType(response_head.mime_type)) {
- // TODO(nhiroki): Show an error message equivalent to kNoMIMEError or
- // kBadMIMEError in service_worker_write_to_cache_job.cc.
+ std::string error_message =
+ response_head.mime_type.empty()
+ ? kServiceWorkerNoMIMEError
+ : base::StringPrintf(kServiceWorkerBadMIMEError,
+ response_head.mime_type.c_str());
CommitCompleted(
- network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE));
+ network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE),
+ error_message);
return;
}
// Check the path restriction defined in the spec:
// https://w3c.github.io/ServiceWorker/#service-worker-script-response
- const char kServiceWorkerAllowed[] = "Service-Worker-Allowed";
std::string service_worker_allowed;
bool has_header = response_head.headers->EnumerateHeader(
nullptr, kServiceWorkerAllowed, &service_worker_allowed);
@@ -192,9 +203,9 @@ void ServiceWorkerNewScriptLoader::OnReceiveResponse(
if (!ServiceWorkerUtils::IsPathRestrictionSatisfied(
version_->scope(), request_url_,
has_header ? &service_worker_allowed : nullptr, &error_message)) {
- // TODO(nhiroki): Report |error_message|.
CommitCompleted(
- network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE));
+ network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE),
+ error_message);
return;
}
@@ -204,8 +215,7 @@ void ServiceWorkerNewScriptLoader::OnReceiveResponse(
WriteHeaders(
base::MakeRefCounted<HttpResponseInfoIOBuffer>(response_info.release()));
- client_->OnReceiveResponse(response_head, ssl_info,
- std::move(downloaded_file));
+ client_->OnReceiveResponse(response_head, std::move(downloaded_file));
}
void ServiceWorkerNewScriptLoader::OnReceiveRedirect(
@@ -215,10 +225,8 @@ void ServiceWorkerNewScriptLoader::OnReceiveRedirect(
//
// Step 7.5: "Set request's redirect mode to "error"."
// https://w3c.github.io/ServiceWorker/#update-algorithm
- //
- // TODO(nhiroki): Show an error message equivalent to kRedirectError in
- // service_worker_write_to_cache_job.cc.
- CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_UNSAFE_REDIRECT));
+ CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_UNSAFE_REDIRECT),
+ kServiceWorkerRedirectError);
}
void ServiceWorkerNewScriptLoader::OnDataDownloaded(int64_t data_len,
@@ -250,7 +258,8 @@ void ServiceWorkerNewScriptLoader::OnStartLoadingResponseBody(
mojo::ScopedDataPipeConsumerHandle client_consumer;
if (mojo::CreateDataPipe(nullptr, &client_producer_, &client_consumer) !=
MOJO_RESULT_OK) {
- CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED));
+ CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED),
+ kServiceWorkerFetchScriptError);
return;
}
@@ -264,7 +273,7 @@ void ServiceWorkerNewScriptLoader::OnStartLoadingResponseBody(
void ServiceWorkerNewScriptLoader::OnComplete(
const network::URLLoaderCompletionStatus& status) {
if (status.error_code != net::OK) {
- CommitCompleted(status);
+ CommitCompleted(status, kServiceWorkerFetchScriptError);
return;
}
@@ -279,7 +288,8 @@ void ServiceWorkerNewScriptLoader::OnComplete(
// storage.
return;
case State::kWroteData:
- CommitCompleted(network::URLLoaderCompletionStatus(net::OK));
+ CommitCompleted(network::URLLoaderCompletionStatus(net::OK),
+ std::string() /* status_message */);
return;
}
NOTREACHED() << static_cast<int>(state_);
@@ -328,7 +338,8 @@ void ServiceWorkerNewScriptLoader::WriteHeaders(
void ServiceWorkerNewScriptLoader::OnWriteHeadersComplete(net::Error error) {
DCHECK_NE(net::ERR_IO_PENDING, error);
if (error != net::OK) {
- CommitCompleted(network::URLLoaderCompletionStatus(error));
+ CommitCompleted(network::URLLoaderCompletionStatus(error),
+ kServiceWorkerFetchScriptError);
return;
}
AdvanceState(State::kWroteHeaders);
@@ -371,7 +382,8 @@ void ServiceWorkerNewScriptLoader::OnNetworkDataAvailable(MojoResult) {
// notified via OnComplete().
AdvanceState(State::kWroteData);
if (network_load_completed_)
- CommitCompleted(network::URLLoaderCompletionStatus(net::OK));
+ CommitCompleted(network::URLLoaderCompletionStatus(net::OK),
+ std::string() /* status_message */);
return;
case MOJO_RESULT_SHOULD_WAIT:
network_watcher_.ArmOrNotify();
@@ -387,15 +399,16 @@ void ServiceWorkerNewScriptLoader::WriteData(
// next time.
uint32_t bytes_written = std::min<uint32_t>(kReadBufferSize, bytes_available);
- auto buffer = base::MakeRefCounted<network::MojoToNetIOBuffer>(
- pending_buffer.get(), bytes_written);
+ auto buffer =
+ base::MakeRefCounted<net::WrappedIOBuffer>(pending_buffer->buffer());
MojoResult result = client_producer_->WriteData(
buffer->data(), &bytes_written, MOJO_WRITE_DATA_FLAG_NONE);
switch (result) {
case MOJO_RESULT_OK:
break;
case MOJO_RESULT_FAILED_PRECONDITION:
- CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED));
+ CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED),
+ kServiceWorkerFetchScriptError);
return;
case MOJO_RESULT_SHOULD_WAIT:
// No data was written to |client_producer_| because the pipe was full.
@@ -432,7 +445,8 @@ void ServiceWorkerNewScriptLoader::OnWriteDataComplete(
net::Error error) {
DCHECK_NE(net::ERR_IO_PENDING, error);
if (error != net::OK) {
- CommitCompleted(network::URLLoaderCompletionStatus(error));
+ CommitCompleted(network::URLLoaderCompletionStatus(error),
+ kServiceWorkerFetchScriptError);
return;
}
DCHECK(pending_buffer);
@@ -443,7 +457,8 @@ void ServiceWorkerNewScriptLoader::OnWriteDataComplete(
}
void ServiceWorkerNewScriptLoader::CommitCompleted(
- const network::URLLoaderCompletionStatus& status) {
+ const network::URLLoaderCompletionStatus& status,
+ const std::string& status_message) {
AdvanceState(State::kCompleted);
net::Error error_code = static_cast<net::Error>(status.error_code);
int bytes_written = -1;
@@ -459,16 +474,13 @@ void ServiceWorkerNewScriptLoader::CommitCompleted(
} else {
// AddMessageConsole must be called before notifying that an error occurred
// because the worker stops soon after receiving the error response.
- // TODO(nhiroki): Provide more accurate error message instead of
- // |kFetchScriptError|.
// TODO(nhiroki): Consider replacing this hacky way with the new error code
// handling mechanism in URLLoader.
version_->embedded_worker()->AddMessageToConsole(
- blink::WebConsoleMessage::kLevelError, kFetchScriptError);
+ blink::WebConsoleMessage::kLevelError, status_message);
}
version_->script_cache_map()->NotifyFinishedCaching(
- request_url_, bytes_written, error_code,
- std::string() /* status_message */);
+ request_url_, bytes_written, error_code, status_message);
// TODO(nhiroki): Record ServiceWorkerMetrics::CountWriteResponseResult().
// (https://crbug.com/762357)
diff --git a/chromium/content/browser/service_worker/service_worker_new_script_loader.h b/chromium/content/browser/service_worker/service_worker_new_script_loader.h
index 994f24701c1..621ce8ef458 100644
--- a/chromium/content/browser/service_worker/service_worker_new_script_loader.h
+++ b/chromium/content/browser/service_worker/service_worker_new_script_loader.h
@@ -70,7 +70,6 @@ class CONTENT_EXPORT ServiceWorkerNewScriptLoader
// network::mojom::URLLoaderClient for the network load:
void OnReceiveResponse(
const network::ResourceResponseHead& response_head,
- const base::Optional<net::SSLInfo>& ssl_info,
network::mojom::DownloadedTempFilePtr downloaded_file) override;
void OnReceiveRedirect(
const net::RedirectInfo& redirect_info,
@@ -120,7 +119,8 @@ class CONTENT_EXPORT ServiceWorkerNewScriptLoader
// This is the last method that is called on this class. Notifies the final
// result to |client_| and clears all mojo connections etc.
- void CommitCompleted(const network::URLLoaderCompletionStatus& status);
+ void CommitCompleted(const network::URLLoaderCompletionStatus& status,
+ const std::string& status_message);
const GURL request_url_;
diff --git a/chromium/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/chromium/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 5664ba199c8..c034c9c80d5 100644
--- a/chromium/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -13,8 +13,8 @@
#include "content/browser/service_worker/service_worker_disk_cache.h"
#include "content/browser/url_loader_factory_getter.h"
#include "content/public/test/test_browser_thread_bundle.h"
-#include "mojo/common/data_pipe_utils.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/system/data_pipe_utils.h"
#include "net/base/test_completion_callback.h"
#include "net/http/http_util.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
@@ -23,7 +23,7 @@
#include "services/network/public/cpp/url_loader_completion_status.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "services/network/test/test_url_loader_client.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -99,8 +99,7 @@ class MockNetworkURLLoaderFactory final
client->OnReceiveRedirect(net::RedirectInfo(), response_head);
return;
}
- client->OnReceiveResponse(response_head, base::nullopt /* ssl_info */,
- nullptr /* downloaded_file */);
+ client->OnReceiveResponse(response_head, nullptr /* downloaded_file */);
// Pass the response body to the client.
uint32_t bytes_written = response.body.size();
@@ -302,8 +301,8 @@ TEST_F(ServiceWorkerNewScriptLoaderTest, Success) {
EXPECT_TRUE(client_->has_received_response());
EXPECT_TRUE(client_->response_body().is_valid());
std::string response;
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_->response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_->response_body_release(), &response));
EXPECT_EQ(mock_server_->Get(kScriptURL).body, response);
// The response should also be stored in the storage.
@@ -326,8 +325,8 @@ TEST_F(ServiceWorkerNewScriptLoaderTest, Success_EmptyBody) {
EXPECT_TRUE(client_->has_received_response());
EXPECT_TRUE(client_->response_body().is_valid());
std::string response;
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_->response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_->response_body_release(), &response));
EXPECT_TRUE(response.empty());
// The response should also be stored in the storage.
@@ -356,8 +355,8 @@ TEST_F(ServiceWorkerNewScriptLoaderTest, Success_LargeBody) {
EXPECT_TRUE(client_->has_received_response());
EXPECT_TRUE(client_->response_body().is_valid());
std::string response;
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_->response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_->response_body_release(), &response));
EXPECT_EQ(mock_server_->Get(kScriptURL).body, response);
// The response should also be stored in the storage.
@@ -478,8 +477,8 @@ TEST_F(ServiceWorkerNewScriptLoaderTest, Success_PathRestriction) {
EXPECT_TRUE(client_->has_received_response());
EXPECT_TRUE(client_->response_body().is_valid());
std::string response;
- EXPECT_TRUE(mojo::common::BlockingCopyToString(
- client_->response_body_release(), &response));
+ EXPECT_TRUE(
+ mojo::BlockingCopyToString(client_->response_body_release(), &response));
EXPECT_EQ(mock_server_->Get(kScriptURL).body, response);
// The response should also be stored in the storage.
diff --git a/chromium/content/browser/service_worker/service_worker_process_manager.cc b/chromium/content/browser/service_worker/service_worker_process_manager.cc
index f47f72cd9d6..79850cf30c1 100644
--- a/chromium/content/browser/service_worker/service_worker_process_manager.cc
+++ b/chromium/content/browser/service_worker/service_worker_process_manager.cc
@@ -66,7 +66,8 @@ void ServiceWorkerProcessManager::Shutdown() {
if (it.second->HasProcess()) {
RenderProcessHost* process = it.second->GetProcess();
if (!process->IsKeepAliveRefCountDisabled())
- process->DecrementKeepAliveRefCount();
+ process->DecrementKeepAliveRefCount(
+ RenderProcessHost::KeepAliveClientType::kServiceWorker);
}
}
}
@@ -156,7 +157,8 @@ ServiceWorkerStatusCode ServiceWorkerProcessManager::AllocateWorkerProcess(
worker_process_map_.emplace(embedded_worker_id, std::move(site_instance));
if (!rph->IsKeepAliveRefCountDisabled())
- rph->IncrementKeepAliveRefCount();
+ rph->IncrementKeepAliveRefCount(
+ RenderProcessHost::KeepAliveClientType::kServiceWorker);
out_info->process_id = rph->GetID();
out_info->start_situation = start_situation;
return SERVICE_WORKER_OK;
@@ -186,7 +188,8 @@ void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) {
if (it->second->HasProcess()) {
RenderProcessHost* process = it->second->GetProcess();
if (!process->IsKeepAliveRefCountDisabled())
- process->DecrementKeepAliveRefCount();
+ process->DecrementKeepAliveRefCount(
+ RenderProcessHost::KeepAliveClientType::kServiceWorker);
}
worker_process_map_.erase(it);
}
diff --git a/chromium/content/browser/service_worker/service_worker_process_manager_unittest.cc b/chromium/content/browser/service_worker/service_worker_process_manager_unittest.cc
index 21bba85474e..0139091213d 100644
--- a/chromium/content/browser/service_worker/service_worker_process_manager_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_process_manager_unittest.cc
@@ -5,7 +5,6 @@
#include "content/browser/service_worker/service_worker_process_manager.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/test/scoped_feature_list.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
#include "content/browser/site_instance_impl.h"
@@ -36,7 +35,11 @@ class SiteInstanceRenderProcessHostFactory : public RenderProcessHostFactory {
SiteInstance* site_instance) const override {
processes_.push_back(
std::make_unique<MockRenderProcessHost>(browser_context));
- last_site_instance_used_ = site_instance;
+
+ // A spare RenderProcessHost is created with a null SiteInstance.
+ if (site_instance)
+ last_site_instance_used_ = site_instance;
+
return processes_.back().get();
}
diff --git a/chromium/content/browser/service_worker/service_worker_provider_host.cc b/chromium/content/browser/service_worker/service_worker_provider_host.cc
index 3fd12f21fa4..bdbd4e18287 100644
--- a/chromium/content/browser/service_worker/service_worker_provider_host.cc
+++ b/chromium/content/browser/service_worker/service_worker_provider_host.cc
@@ -30,6 +30,7 @@
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/common/service_worker/service_worker_utils.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
@@ -42,10 +43,10 @@
#include "net/base/url_util.h"
#include "services/network/public/cpp/resource_request_body.h"
#include "storage/browser/blob/blob_storage_context.h"
-#include "third_party/WebKit/public/common/message_port/message_port_channel.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_client.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/common/message_port/message_port_channel.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -109,15 +110,14 @@ class ServiceWorkerURLTrackingRequestHandler
void RemoveProviderHost(base::WeakPtr<ServiceWorkerContextCore> context,
int process_id,
int provider_id) {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerProviderHost::RemoveProviderHost");
if (!context || !context->GetProviderHost(process_id, provider_id)) {
- // In some cancellation of navigation cases, it is possible for the
- // pre-created host, whose |provider_id| is assigned by the browser process,
- // to have been destroyed before being claimed by the renderer. The provider
- // is then destroyed in the renderer, and no matching host will be found.
+ // In some cases, it is possible for the Mojo endpoint of a pre-created
+ // host to be destroyed before being claimed by the renderer and
+ // having the host become owned by ServiceWorkerContextCore. The owner of
+ // the host is responsible for deleting the host, so just return here.
return;
}
context->RemoveProviderHost(process_id, provider_id);
@@ -136,6 +136,38 @@ void GetInterfaceImpl(const std::string& interface_name,
origin);
}
+ServiceWorkerMetrics::EventType PurposeToEventType(
+ mojom::ControllerServiceWorkerPurpose purpose) {
+ switch (purpose) {
+ case mojom::ControllerServiceWorkerPurpose::FETCH_SUB_RESOURCE:
+ return ServiceWorkerMetrics::EventType::FETCH_SUB_RESOURCE;
+ }
+ NOTREACHED();
+ return ServiceWorkerMetrics::EventType::UNKNOWN;
+}
+
+// TODO(crbug/831255): Temporary debugging for the linked bug.
+std::string URLStringForBadMessage(const GURL& url) {
+ return url.possibly_invalid_spec().substr(0, 64);
+}
+
+// TODO(crbug/831255): Temporary debugging for the linked bug.
+std::string ProviderTypeStringForBadMessage(
+ blink::mojom::ServiceWorkerProviderType type) {
+ switch (type) {
+ case blink::mojom::ServiceWorkerProviderType::kUnknown:
+ return "unknown";
+ case blink::mojom::ServiceWorkerProviderType::kForSharedWorker:
+ return "shared";
+ case blink::mojom::ServiceWorkerProviderType::kForServiceWorker:
+ return "service";
+ case blink::mojom::ServiceWorkerProviderType::kForWindow:
+ return "window";
+ }
+ NOTREACHED();
+ return std::string();
+}
+
} // anonymous namespace
// static
@@ -170,13 +202,43 @@ ServiceWorkerProviderHost::PreCreateForController(
}
// static
+base::WeakPtr<ServiceWorkerProviderHost>
+ServiceWorkerProviderHost::PreCreateForSharedWorker(
+ base::WeakPtr<ServiceWorkerContextCore> context,
+ int process_id,
+ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info) {
+ auto host = base::WrapUnique(new ServiceWorkerProviderHost(
+ ChildProcessHost::kInvalidUniqueID,
+ ServiceWorkerProviderHostInfo(
+ NextBrowserProvidedProviderId(), MSG_ROUTING_NONE,
+ blink::mojom::ServiceWorkerProviderType::kForSharedWorker,
+ true /* is_parent_frame_secure */),
+ context, nullptr));
+ host->dispatcher_host_ = context->GetDispatcherHost(process_id)->AsWeakPtr();
+ host->render_process_id_ = process_id;
+
+ (*out_provider_info)->provider_id = host->provider_id();
+ (*out_provider_info)->client_request = mojo::MakeRequest(&host->container_);
+ host->binding_.Bind(
+ mojo::MakeRequest(&((*out_provider_info)->host_ptr_info)));
+ host->binding_.set_connection_error_handler(base::BindOnce(
+ &RemoveProviderHost, context, process_id, host->provider_id()));
+
+ auto weak_ptr = host->AsWeakPtr();
+ context->AddProviderHost(std::move(host));
+ return weak_ptr;
+}
+
+// static
std::unique_ptr<ServiceWorkerProviderHost> ServiceWorkerProviderHost::Create(
int process_id,
ServiceWorkerProviderHostInfo info,
base::WeakPtr<ServiceWorkerContextCore> context,
base::WeakPtr<ServiceWorkerDispatcherHost> dispatcher_host) {
- return base::WrapUnique(new ServiceWorkerProviderHost(
+ auto host = base::WrapUnique(new ServiceWorkerProviderHost(
process_id, std::move(info), context, dispatcher_host));
+ host->is_execution_ready_ = true;
+ return host;
}
ServiceWorkerProviderHost::ServiceWorkerProviderHost(
@@ -220,8 +282,7 @@ ServiceWorkerProviderHost::ServiceWorkerProviderHost(
}
ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
- // Temporary CHECK for debugging https://crbug.com/750267.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (context_)
context_->UnregisterProviderHostByClientID(client_uuid_);
@@ -353,6 +414,11 @@ void ServiceWorkerProviderHost::SetControllerVersionAttribute(
SendSetControllerServiceWorker(notify_controllerchange);
}
+bool ServiceWorkerProviderHost::IsProviderForServiceWorker() const {
+ return info_.type ==
+ blink::mojom::ServiceWorkerProviderType::kForServiceWorker;
+}
+
bool ServiceWorkerProviderHost::IsProviderForClient() const {
switch (info_.type) {
case blink::mojom::ServiceWorkerProviderType::kForWindow:
@@ -361,7 +427,7 @@ bool ServiceWorkerProviderHost::IsProviderForClient() const {
case blink::mojom::ServiceWorkerProviderType::kForServiceWorker:
return false;
case blink::mojom::ServiceWorkerProviderType::kUnknown:
- NOTREACHED() << info_.type;
+ break;
}
NOTREACHED() << info_.type;
return false;
@@ -376,7 +442,7 @@ blink::mojom::ServiceWorkerClientType ServiceWorkerProviderHost::client_type()
return blink::mojom::ServiceWorkerClientType::kSharedWorker;
case blink::mojom::ServiceWorkerProviderType::kForServiceWorker:
case blink::mojom::ServiceWorkerProviderType::kUnknown:
- NOTREACHED() << info_.type;
+ break;
}
NOTREACHED() << info_.type;
return blink::mojom::ServiceWorkerClientType::kWindow;
@@ -445,6 +511,11 @@ void ServiceWorkerProviderHost::RemoveServiceWorkerRegistrationObjectHost(
registration_object_hosts_.erase(registration_id);
}
+void ServiceWorkerProviderHost::RemoveServiceWorkerHandle(int64_t version_id) {
+ DCHECK(base::ContainsKey(handles_, version_id));
+ handles_.erase(version_id);
+}
+
bool ServiceWorkerProviderHost::AllowServiceWorker(const GURL& scope) {
return GetContentClient()->browser()->AllowServiceWorker(
scope, IsProviderForClient() ? topmost_frame_url() : document_url(),
@@ -476,10 +547,8 @@ ServiceWorkerProviderHost::CreateRequestHandler(
// scripts.
// TODO(falken): Really it should be treated as an error to set
// |skip_service_worker| for requests to start the service worker, but it's
- // difficult to fix that renderer-side, since we don't know whether a request
- // is for a service worker without access to IsHostToRunningServiceWorker() as
- // that state is stored browser-side.
- if (IsHostToRunningServiceWorker() &&
+ // difficult to fix that renderer-side (maybe try after S13nServiceWorker).
+ if (IsProviderForServiceWorker() &&
(resource_type == RESOURCE_TYPE_SERVICE_WORKER ||
resource_type == RESOURCE_TYPE_SCRIPT)) {
skip_service_worker = false;
@@ -490,7 +559,7 @@ ServiceWorkerProviderHost::CreateRequestHandler(
return std::make_unique<ServiceWorkerURLTrackingRequestHandler>(
context_, AsWeakPtr(), blob_storage_context, resource_type);
}
- if (IsHostToRunningServiceWorker()) {
+ if (IsProviderForServiceWorker()) {
return std::make_unique<ServiceWorkerContextRequestHandler>(
context_, AsWeakPtr(), blob_storage_context, resource_type);
}
@@ -508,29 +577,15 @@ ServiceWorkerProviderHost::GetOrCreateServiceWorkerHandle(
ServiceWorkerVersion* version) {
if (!context_ || !version)
return nullptr;
- if (!dispatcher_host_) {
- DCHECK(ServiceWorkerUtils::IsServicificationEnabled() ||
- IsNavigationMojoResponseEnabled());
- blink::mojom::ServiceWorkerObjectInfoPtr info;
- // This is called before the dispatcher host is created.
- // |precreated_controller_handle_| instance's lifetime is controlled by its
- // own internal Mojo connections via |info|.
- precreated_controller_handle_ = ServiceWorkerHandle::Create(
- nullptr, context_, AsWeakPtr(), version, &info);
- return info;
- }
- ServiceWorkerHandle* handle = dispatcher_host_->FindServiceWorkerHandle(
- provider_id(), version->version_id());
- if (handle) {
- return handle->CreateObjectInfo();
- }
- blink::mojom::ServiceWorkerObjectInfoPtr info;
- // ServiceWorkerHandle lifetime is controlled by |info| and is also owned by
- // |dispatcher_host_|.
- ServiceWorkerHandle::Create(dispatcher_host_.get(), context_, AsWeakPtr(),
- version, &info);
- return info;
+ const int64_t version_id = version->version_id();
+ auto existing_handle = handles_.find(version_id);
+ if (existing_handle != handles_.end())
+ return existing_handle->second->CreateObjectInfo();
+
+ handles_[version_id] =
+ std::make_unique<ServiceWorkerHandle>(context_, this, version);
+ return handles_[version_id]->CreateObjectInfo();
}
bool ServiceWorkerProviderHost::CanAssociateRegistration(
@@ -555,17 +610,12 @@ void ServiceWorkerProviderHost::PostMessageToClient(
std::move(message));
}
-void ServiceWorkerProviderHost::CountFeature(uint32_t feature) {
+void ServiceWorkerProviderHost::CountFeature(blink::mojom::WebFeature feature) {
if (!dispatcher_host_)
return;
// CountFeature message should be sent only for clients.
DCHECK(IsProviderForClient());
- DCHECK_LT(feature,
- static_cast<uint32_t>(blink::mojom::WebFeature::kNumberOfFeatures));
-
- blink::mojom::WebFeature web_feature =
- static_cast<blink::mojom::WebFeature>(feature);
- container_->CountFeature(web_feature);
+ container_->CountFeature(feature);
}
void ServiceWorkerProviderHost::ClaimedByRegistration(
@@ -592,6 +642,8 @@ void ServiceWorkerProviderHost::CompleteNavigationInitialized(
DCHECK_EQ(info_.provider_id, info.provider_id);
DCHECK_NE(MSG_ROUTING_NONE, info.route_id);
+ is_execution_ready_ = true;
+
// Connect with the mojom::ServiceWorkerContainer on the renderer.
DCHECK(!container_.is_bound());
DCHECK(!binding_.is_bound());
@@ -609,18 +661,6 @@ void ServiceWorkerProviderHost::CompleteNavigationInitialized(
if (!controller_)
return;
- if ((ServiceWorkerUtils::IsServicificationEnabled() ||
- IsNavigationMojoResponseEnabled()) &&
- precreated_controller_handle_) {
- // S13nServiceWorker: register the pre-created handle for the controller
- // service worker with the dispatcher host, now that it exists.
- DCHECK_NE(blink::mojom::kInvalidServiceWorkerHandleId,
- precreated_controller_handle_->handle_id());
- precreated_controller_handle_->RegisterIntoDispatcherHost(
- dispatcher_host_.get());
- precreated_controller_handle_ = nullptr;
- }
-
// In S13nServiceWorker/NavigationMojoResponse case the controller is already
// sent in navigation commit, but we still need this for
// S13nServiceWorker/NavigationMojoResponse case for setting the use counter
@@ -650,6 +690,7 @@ ServiceWorkerProviderHost::CompleteStartWorkerPreparation(
DCHECK(dispatcher_host);
render_process_id_ = process_id;
dispatcher_host_ = dispatcher_host->AsWeakPtr();
+ SetDocumentUrl(running_hosted_version()->script_url());
// Retrieve the registration associated with |version|. The registration
// must be alive because the version keeps it during starting worker.
@@ -684,13 +725,15 @@ ServiceWorkerProviderHost::CompleteStartWorkerPreparation(
mojom::kNavigation_ServiceWorkerSpec, process_id,
mojo::MakeRequest(&provider_info->interface_provider)));
- // Set the document URL to the script url in order to allow
- // register/unregister/getRegistration on ServiceWorkerGlobalScope.
- SetDocumentUrl(running_hosted_version()->script_url());
-
return provider_info;
}
+void ServiceWorkerProviderHost::CompleteSharedWorkerPreparation() {
+ DCHECK_EQ(blink::mojom::ServiceWorkerProviderType::kForSharedWorker,
+ provider_type());
+ is_execution_ready_ = true;
+}
+
void ServiceWorkerProviderHost::SendServiceWorkerStateChangedMessage(
int worker_handle_id,
blink::mojom::ServiceWorkerState state) {
@@ -796,11 +839,8 @@ void ServiceWorkerProviderHost::SendSetControllerServiceWorker(
// Populate used features for UseCounter purposes.
std::vector<blink::mojom::WebFeature> used_features;
- for (const uint32_t feature : controller_->used_features()) {
- DCHECK_LT(feature, static_cast<uint32_t>(
- blink::mojom::WebFeature::kNumberOfFeatures));
- used_features.push_back(static_cast<blink::mojom::WebFeature>(feature));
- }
+ for (const blink::mojom::WebFeature feature : controller_->used_features())
+ used_features.push_back(feature);
// S13nServiceWorker: Pass an endpoint for the client to talk to this
// controller.
@@ -1042,16 +1082,26 @@ void ServiceWorkerProviderHost::GetRegistrationForReady(
ReturnRegistrationForReadyIfNeeded();
}
-void ServiceWorkerProviderHost::GetControllerServiceWorker(
- mojom::ControllerServiceWorkerRequest controller_request) {
+void ServiceWorkerProviderHost::StartControllerComplete(
+ mojom::ControllerServiceWorkerRequest controller_request,
+ ServiceWorkerStatusCode status) {
+ DCHECK(ServiceWorkerUtils::IsServicificationEnabled());
+ if (status == SERVICE_WORKER_OK)
+ controller_->controller()->Clone(std::move(controller_request));
+}
+
+void ServiceWorkerProviderHost::EnsureControllerServiceWorker(
+ mojom::ControllerServiceWorkerRequest controller_request,
+ mojom::ControllerServiceWorkerPurpose purpose) {
// TODO(kinuko): Log the reasons we drop the request.
if (!dispatcher_host_ || !IsContextAlive() || !controller_)
return;
- // TODO(kinuko): Call version_->StartWorker() here if the service
- // is not starting or running. https://crbug.com/797222
DCHECK(ServiceWorkerUtils::IsServicificationEnabled());
- controller_->controller()->Clone(std::move(controller_request));
+ controller_->RunAfterStartWorker(
+ PurposeToEventType(purpose),
+ base::BindOnce(&ServiceWorkerProviderHost::StartControllerComplete,
+ AsWeakPtr(), std::move(controller_request)));
}
void ServiceWorkerProviderHost::CloneForWorker(
@@ -1061,6 +1111,10 @@ void ServiceWorkerProviderHost::CloneForWorker(
std::move(container_host_request));
}
+void ServiceWorkerProviderHost::Ping(PingCallback callback) {
+ std::move(callback).Run();
+}
+
bool ServiceWorkerProviderHost::IsValidRegisterMessage(
const GURL& script_url,
const blink::mojom::ServiceWorkerRegistrationOptions& options,
@@ -1069,17 +1123,41 @@ bool ServiceWorkerProviderHost::IsValidRegisterMessage(
*out_error = ServiceWorkerConsts::kBadMessageFromNonWindow;
return false;
}
- if (!options.scope.is_valid() || !script_url.is_valid()) {
- *out_error = ServiceWorkerConsts::kBadMessageInvalidURL;
+ // TODO(crbug/831255): Temporary detailed messages for the linked bug.
+ // These message are compact since there are only 256 characters available.
+ const std::string provider_str =
+ ProviderTypeStringForBadMessage(provider_type());
+ std::stringstream stream;
+ if (!document_url_.is_valid()) {
+ stream << "SWPH_REGISTER_INVALID_DOCUMENT:" << provider_str
+ << "d=" << URLStringForBadMessage(document_url_);
+ *out_error = stream.str();
return false;
}
+ if (!options.scope.is_valid()) {
+ stream << "SWPH_REGISTER_INVALID_SCOPE:" << provider_str
+ << "p=" << URLStringForBadMessage(options.scope);
+ *out_error = stream.str();
+ return false;
+ }
+ if (!script_url.is_valid()) {
+ stream << "SWPH_REGISTER_INVALID_SCRIPT: " << provider_str
+ << "s=" << URLStringForBadMessage(script_url);
+ *out_error = stream.str();
+ return false;
+ }
+
if (ServiceWorkerUtils::ContainsDisallowedCharacter(options.scope, script_url,
out_error)) {
return false;
}
- std::vector<GURL> urls = {document_url(), options.scope, script_url};
+ std::vector<GURL> urls = {document_url_, options.scope, script_url};
if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) {
- *out_error = ServiceWorkerConsts::kBadMessageImproperOrigins;
+ stream << "SWPH_REGISTER:" << provider_str
+ << ",d=" << URLStringForBadMessage(document_url_)
+ << ",p=" << URLStringForBadMessage(options.scope)
+ << ",s=" << URLStringForBadMessage(script_url);
+ *out_error = stream.str();
return false;
}
@@ -1141,7 +1219,7 @@ void ServiceWorkerProviderHost::GetInterface(
mojo::ScopedMessagePipeHandle interface_pipe) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK_NE(kDocumentMainThreadId, render_thread_id_);
- DCHECK(IsHostToRunningServiceWorker());
+ DCHECK(IsProviderForServiceWorker());
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::BindOnce(
diff --git a/chromium/content/browser/service_worker/service_worker_provider_host.h b/chromium/content/browser/service_worker/service_worker_provider_host.h
index 4187669e5f9..a82b1ffd2b5 100644
--- a/chromium/content/browser/service_worker/service_worker_provider_host.h
+++ b/chromium/content/browser/service_worker/service_worker_provider_host.h
@@ -32,13 +32,18 @@
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/network/public/mojom/fetch_api.mojom.h"
#include "services/network/public/mojom/request_context_frame_type.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_provider_type.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/platform/web_feature.mojom.h"
namespace network {
class ResourceRequestBody;
}
+namespace service_worker_handle_unittest {
+class ServiceWorkerHandleTest;
+}
+
namespace storage {
class BlobStorageContext;
}
@@ -60,38 +65,64 @@ FORWARD_DECLARE_TEST(ServiceWorkerDispatcherHostTest,
DispatchExtendableMessageEvent_Fail);
} // namespace service_worker_dispatcher_host_unittest
-// This class is the browser-process representation of a service worker
-// provider. There are two general types of providers: 1) those for a client
-// (windows or shared workers), and 2) those for hosting a running service
-// worker.
+// ServiceWorkerProviderHost is the browser-process representation of a
+// renderer-process entity that can involve service workers. Currently, these
+// entities are frames or workers. So basically, one ServiceWorkerProviderHost
+// instance is the browser process's source of truth about one frame/worker in a
+// renderer process, which the browser process uses when performing operations
+// involving service workers.
+//
+// ServiceWorkerProviderHost lives on the IO thread, since all nearly all
+// browser process service worker machinery lives on the IO thread.
+//
+// Example:
+// * A new service worker registration is created. The browser process loops
+// over all ServiceWorkerProviderHosts to find clients (frames and shared
+// workers) with a URL inside the registration's scope, and has the provider
+// host watch the registration in order to resolve navigator.serviceWorker.ready
+// once the registration settles, if neeed.
+//
+// "Provider" is a somewhat tricky term. The idea is that a provider is what
+// attaches to a frame/worker and "provides" it with functionality related to
+// service workers. This functionality is mostly granted by creating the
+// ServiceWorkerProviderHost for this frame/worker, which, again, makes the
+// frame/worker alive in the browser's service worker world.
+//
+// The analogue of ServiceWorkerProviderHost ("provider host") on the renderer
+// process is ServiceWorkerProviderContext ("provider"). A provider host has a
+// Mojo connection to the provider in the renderer. Destruction of the host
+// happens upon disconnection of the Mojo pipe.
+//
+// There are two general types of providers:
+// 1) those for service worker clients (windows or shared workers), and
+// 2) those for service workers themselves.
//
-// For client providers, there is a provider per document or a worker and the
-// lifetime of this object is tied to the lifetime of its document or the worker
-// in the renderer process. This class holds service worker state that is scoped
-// to an individual document or a worker.
+// For client providers, there is a provider per frame or shared worker in the
+// renderer process. The lifetime of this host object is tied to the lifetime of
+// the document or the worker.
//
-// For providers hosting a running service worker, this class will observe
-// resource loads made directly by the service worker.
+// For service worker providers, there is a provider per running service worker
+// in the renderer process. The lifetime of this host object is tied to the
+// lifetime of the running service worker.
//
// A ServiceWorkerProviderHost is created in the following situations:
//
// 1) For a client created for a navigation (for both top-level and
// non-top-level frames), the provider host for the resulting document is
-// pre-created by the browser process. Upon navigation commit, the
-// ServiceWorkerNetworkProvider is created on the renderer, at which point the
-// Mojo connection is established.
+// pre-created by the browser process. Upon navigation commit, the provider is
+// created on the renderer, which sends an OnProviderCreated IPC to establish
+// the Mojo connection.
//
-// 2) For clients created by the renderer not due to navigations (SharedWorkers
-// and about:blank iframes), the provider host is created when the
-// ServiceWorkerNetworkProvider is created by the renderer process.
+// 2) For clients created by the renderer not due to navigations (shared workers
+// in the non-S13nServiceWorker case, and about:blank iframes), the provider
+// host is created and the Mojo connection is established when the provider is
+// created by the renderer process and sends an OnProviderCreated IPC.
//
-// 3) For service workers, the provider host is created on the browser process
-// before sending the start worker IPC message. The provider host's Mojo's
-// connection to the renderer is established in the start worker message.
-//
-// Destruction of the ServiceWorkerProviderHost instance happens on
-// disconnection of the Mojo's pipe from the renderer side regardless of what
-// the provider is for.
+// 3) For shared workers in the S13nServiceWorker case and for service workers,
+// the provider host is pre-created by the browser process, and information
+// about the host is sent in the start worker IPC message. The Mojo connection
+// is established when renderer process receives the start message and creates
+// the provider.
class CONTENT_EXPORT ServiceWorkerProviderHost
: public ServiceWorkerRegistration::Listener,
public base::SupportsWeakPtr<ServiceWorkerProviderHost>,
@@ -111,12 +142,22 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
bool are_ancestors_secure,
const WebContentsGetter& web_contents_getter);
- // Creates a ServiceWorkerProviderHost for hosting a running service worker.
+ // Creates a ServiceWorkerProviderHost for a service worker execution context.
// Information about this provider host is passed down to the service worker
// via StartWorker message.
static std::unique_ptr<ServiceWorkerProviderHost> PreCreateForController(
base::WeakPtr<ServiceWorkerContextCore> context);
+ // S13nServiceWorker:
+ // Used for starting a shared worker. Returns a provider host for the shared
+ // worker and fills |out_provider_info| with info to send to the renderer to
+ // connect to the host. The host stays alive as long as this info stays alive
+ // (namely, as long as |out_provider_info->host_ptr_info| stays alive).
+ static base::WeakPtr<ServiceWorkerProviderHost> PreCreateForSharedWorker(
+ base::WeakPtr<ServiceWorkerContextCore> context,
+ int process_id,
+ mojom::ServiceWorkerProviderInfoForSharedWorkerPtr* out_provider_info);
+
// Used to create a ServiceWorkerProviderHost when the renderer-side provider
// is created. This ProviderHost will be created for the process specified by
// |process_id|.
@@ -150,10 +191,6 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// security, so they must be set properly before calling this function.
bool IsContextSecureForServiceWorker() const;
- bool IsHostToRunningServiceWorker() {
- return running_hosted_version_.get() != nullptr;
- }
-
// Returns this provider's controller. The controller is typically the same as
// active_version() but can differ in the following cases:
// (1) The client was created before the registration existed or had an active
@@ -197,8 +234,9 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
return associated_registration_.get();
}
- // The running version, if any, that this provider is providing resource
- // loads for.
+ // For service worker execution contexts. The version of the service worker.
+ // This is nullptr when the worker is still starting up (until
+ // CompleteStartWorkerPreparation() is called).
ServiceWorkerVersion* running_hosted_version() const {
DCHECK(!running_hosted_version_ ||
info_.type ==
@@ -207,8 +245,8 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
}
// S13nServiceWorker:
- // For service worker clients. Similar to GetControllerServiceWorker, but this
- // returns a bound Mojo ptr which is supposed to be sent to clients. The
+ // For service worker clients. Similar to EnsureControllerServiceWorker, but
+ // this returns a bound Mojo ptr which is supposed to be sent to clients. The
// controller ptr passed to the clients will be used to intercept requests
// from them.
// It is invalid to call this when controller_ is null.
@@ -224,6 +262,21 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
//
// This may return nullptr if the controller service worker does not have a
// fetch handler, i.e. when the renderer does not need the controller ptr.
+ //
+ // WARNING:
+ // Unlike EnsureControllerServiceWorker, this method doesn't guarantee that
+ // the controller worker is running because this method can be called in some
+ // situations where the worker isn't running yet. When the returned ptr is
+ // stored somewhere and intended to use later, clients need to make sure
+ // that the worker is eventually started to use the ptr.
+ // Currently all the callsites do this, i.e. they start the worker before
+ // or after calling this, but there's no mechanism to prevent future breakage.
+ // TODO(crbug.com/827935): Figure out a way to prevent misuse of this method.
+ // TODO(crbug.com/827935): Make sure the connection error handler fires in
+ // ControllerServiceWorkerConnector (so that it can correctly call
+ // EnsureControllerServiceWorker later) if the worker gets killed before
+ // events are dispatched.
+ //
// TODO(kinuko): revisit this if we start to use the ControllerServiceWorker
// for posting messages.
mojom::ControllerServiceWorkerPtr GetControllerServiceWorkerPtr();
@@ -231,19 +284,27 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// Sets the |document_url_|. When this object is for a client,
// |matching_registrations_| gets also updated to ensure that |document_url_|
// is in scope of all |matching_registrations_|.
+ // |document_url_| is the service worker script URL if this is for a
+ // service worker execution context. It will be used when creating
+ // ServiceWorkerHandle or handling ServiceWorkerRegistration#{*} calls etc.
+ // TODO(leonhsl): We should rename |document_url_| to something more
+ // appropriate and/or split this class into one for clients vs one for service
+ // workers.
void SetDocumentUrl(const GURL& url);
const GURL& document_url() const { return document_url_; }
// For service worker clients. Sets the |topmost_frame_url|.
void SetTopmostFrameUrl(const GURL& url);
// For service worker clients, used for permission checks. Use document_url()
- // instead if |this| is hosting a running service worker.
+ // instead if |this| is for a service worker execution context.
const GURL& topmost_frame_url() const;
blink::mojom::ServiceWorkerProviderType provider_type() const {
return info_.type;
}
+ bool IsProviderForServiceWorker() const;
bool IsProviderForClient() const;
+ // Can only be called when IsProviderForClient() is true.
blink::mojom::ServiceWorkerClientType client_type() const;
// For service worker clients. Associates to |registration| to listen for its
@@ -275,6 +336,8 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// The object info holds a Mojo connection to the ServiceWorkerHandle for the
// |version| to ensure the handle stays alive while the object info is alive.
// A new handle is created if one does not already exist.
+ // TODO(leonhsl): Make |version| be a scoped_refptr because we'll take its
+ // ownership.
blink::mojom::ServiceWorkerObjectInfoPtr GetOrCreateServiceWorkerHandle(
ServiceWorkerVersion* version);
@@ -296,7 +359,7 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// Notifies the client that its controller used a feature, for UseCounter
// purposes. This can only be called if IsProviderForClient() is true.
- void CountFeature(uint32_t feature);
+ void CountFeature(blink::mojom::WebFeature feature);
// |registration| claims the document to be controlled.
void ClaimedByRegistration(ServiceWorkerRegistration* registration);
@@ -318,6 +381,10 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
int process_id,
scoped_refptr<ServiceWorkerVersion> hosted_version);
+ // Called when the shared worker main script resource has finished loading.
+ // After this is called, is_execution_ready() returns true.
+ void CompleteSharedWorkerPreparation();
+
// Sends event messages to the renderer. Events for the worker are queued up
// until the worker thread id is known via SetReadyToSendMessagesToWorker().
void SendServiceWorkerStateChangedMessage(
@@ -338,6 +405,9 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// |registration_id|.
void RemoveServiceWorkerRegistrationObjectHost(int64_t registration_id);
+ // Removes the ServiceWorkerHandle corresponding to |version_id|.
+ void RemoveServiceWorkerHandle(int64_t version_id);
+
// Calls ContentBrowserClient::AllowServiceWorker(). Returns true if content
// settings allows service workers to run at |scope|. If this provider is for
// a window client, the check involves the topmost frame url as well as
@@ -349,11 +419,14 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// cache.
void NotifyControllerLost();
+ bool is_execution_ready() const { return is_execution_ready_; }
+
private:
friend class LinkHeaderServiceWorkerTest;
friend class ServiceWorkerProviderHostTest;
friend class ServiceWorkerWriteToCacheJobTest;
friend class ServiceWorkerContextRequestHandlerTest;
+ friend class service_worker_handle_unittest::ServiceWorkerHandleTest;
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWriteToCacheJobTest, Update_SameScript);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWriteToCacheJobTest,
Update_SameSizeScript);
@@ -426,10 +499,12 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
void GetRegistrations(GetRegistrationsCallback callback) override;
void GetRegistrationForReady(
GetRegistrationForReadyCallback callback) override;
- void GetControllerServiceWorker(
- mojom::ControllerServiceWorkerRequest controller_request) override;
+ void EnsureControllerServiceWorker(
+ mojom::ControllerServiceWorkerRequest controller_request,
+ mojom::ControllerServiceWorkerPurpose purpose) override;
void CloneForWorker(
mojom::ServiceWorkerContainerHostRequest container_host_request) override;
+ void Ping(PingCallback callback) override;
// Callback for ServiceWorkerContextCore::RegisterServiceWorker().
void RegistrationComplete(RegisterCallback callback,
@@ -451,6 +526,11 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
const std::vector<scoped_refptr<ServiceWorkerRegistration>>&
registrations);
+ // Callback for ServiceWorkerVersion::RunAfterStartWorker()
+ void StartControllerComplete(
+ mojom::ControllerServiceWorkerRequest controller_request,
+ ServiceWorkerStatusCode status);
+
bool IsValidRegisterMessage(
const GURL& script_url,
const blink::mojom::ServiceWorkerRegistrationOptions& options,
@@ -461,7 +541,7 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
bool IsValidGetRegistrationForReadyMessage(std::string* out_error) const;
// service_manager::mojom::InterfaceProvider:
- // For provider hosts that are hosting a running service worker.
+ // For service worker execution contexts.
void GetInterface(const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override;
@@ -490,9 +570,9 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
const base::TimeTicks create_time_;
int render_process_id_;
- // For provider hosts that are hosting a running service worker, the id of the
- // service worker thread or |kInvalidEmbeddedWorkerThreadId| before the
- // service worker starts up. Otherwise, |kDocumentMainThreadId|.
+ // For service worker execution contexts, the id of the service worker thread
+ // or |kInvalidEmbeddedWorkerThreadId| before the service worker starts up.
+ // Otherwise, |kDocumentMainThreadId|.
int render_thread_id_;
ServiceWorkerProviderHostInfo info_;
@@ -522,6 +602,13 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
std::unique_ptr<ServiceWorkerRegistrationObjectHost>>
registration_object_hosts_;
+ // Contains all ServiceWorkerHandle instances corresponding to
+ // the service worker JavaScript objects for the hosted execution
+ // context (service worker global scope or service worker client) in the
+ // renderer process.
+ std::map<int64_t /* version_id */, std::unique_ptr<ServiceWorkerHandle>>
+ handles_;
+
// The ready() promise is only allowed to be created once.
// |get_ready_callback_| has three states:
// 1. |get_ready_callback_| is null when ready() has not yet been called.
@@ -531,8 +618,15 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// been run.
std::unique_ptr<GetRegistrationForReadyCallback> get_ready_callback_;
+ // For service worker clients. The controller service worker (i.e.,
+ // ServiceWorkerContainer#controller).
scoped_refptr<ServiceWorkerVersion> controller_;
+ // For service worker execution contexts. The ServiceWorkerVersion of the
+ // service worker this is a provider for. This is nullptr if the service
+ // worker is still being started up (until CompleteStartWorkerPreparation() is
+ // called).
scoped_refptr<ServiceWorkerVersion> running_hosted_version_;
+
base::WeakPtr<ServiceWorkerContextCore> context_;
// |dispatcher_host_| is expected to outlive |this| because it destroys
@@ -550,7 +644,7 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// ServiceWorkerContainer that |this| is a ServiceWorkerContainerHost for.
mojom::ServiceWorkerContainerAssociatedPtr container_;
// |binding_| is the Mojo binding that keeps the connection to the
- // renderer-side counterpart (content::ServiceWorkerNetworkProvider). When the
+ // renderer-side counterpart (content::ServiceWorkerProviderContext). When the
// connection bound on |binding_| gets killed from the renderer side, or the
// bound |ServiceWorkerProviderInfoForStartWorker::host_ptr_info| is otherwise
// destroyed before being passed to the renderer, this
@@ -571,16 +665,15 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
std::vector<base::Closure> queued_events_;
- // S13nServiceWorker/NavigationMojoResponse:
- // A service worker handle for the controller service worker that is
- // pre-created before the renderer process (and therefore the dispatcher host)
- // is created.
- base::WeakPtr<ServiceWorkerHandle> precreated_controller_handle_;
-
- // For provider hosts that are hosting a running service worker.
+ // For service worker execution contexts.
mojo::Binding<service_manager::mojom::InterfaceProvider>
interface_provider_binding_;
+ // For service worker clients. True if the main resource for this host has
+ // finished loading. When false, the document URL may still change due to
+ // redirects.
+ bool is_execution_ready_ = false;
+
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerProviderHost);
};
diff --git a/chromium/content/browser/service_worker/service_worker_provider_host_unittest.cc b/chromium/content/browser/service_worker/service_worker_provider_host_unittest.cc
index 38e10296250..21722145594 100644
--- a/chromium/content/browser/service_worker/service_worker_provider_host_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_provider_host_unittest.cc
@@ -8,7 +8,6 @@
#include <utility>
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/memory/weak_ptr.h"
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
@@ -30,8 +29,8 @@
#include "content/test/test_content_client.h"
#include "mojo/edk/embedder/embedder.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -226,6 +225,17 @@ class ServiceWorkerProviderHostTest : public testing::Test {
void OnMojoError(const std::string& error) { bad_messages_.push_back(error); }
+ bool CanFindClientProviderHost(ServiceWorkerProviderHost* host) {
+ for (std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> it =
+ context_->GetClientProviderHostIterator(
+ host->document_url().GetOrigin());
+ !it->IsAtEnd(); it->Advance()) {
+ if (host == it->GetProviderHost())
+ return true;
+ }
+ return false;
+ }
+
std::vector<std::string> bad_messages_;
TestBrowserThreadBundle thread_bundle_;
std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
@@ -799,4 +809,46 @@ TEST_F(ServiceWorkerProviderHostTest,
EXPECT_EQ(1u, bad_messages_.size());
}
+// Test that a "reserved" (i.e., not execution ready) shared worker client is
+// not included when iterating over client provider hosts. If it were, it'd be
+// undesirably exposed via the Clients API.
+TEST_F(ServiceWorkerProviderHostTest,
+ ReservedClientsAreNotExposedToClientsAPI) {
+ {
+ auto provider_info = mojom::ServiceWorkerProviderInfoForSharedWorker::New();
+ base::WeakPtr<ServiceWorkerProviderHost> host =
+ ServiceWorkerProviderHost::PreCreateForSharedWorker(
+ context_->AsWeakPtr(), helper_->mock_render_process_id(),
+ &provider_info);
+ const GURL url("https://www.example.com/shared_worker.js");
+ host->SetTopmostFrameUrl(url);
+ EXPECT_FALSE(CanFindClientProviderHost(host.get()));
+ host->CompleteSharedWorkerPreparation();
+ EXPECT_TRUE(CanFindClientProviderHost(host.get()));
+ }
+
+ {
+ std::unique_ptr<ServiceWorkerProviderHost> host =
+ ServiceWorkerProviderHost::PreCreateNavigationHost(
+ helper_->context()->AsWeakPtr(), true,
+ base::RepeatingCallback<WebContents*(void)>());
+ ServiceWorkerProviderHostInfo info(
+ host->provider_id(), 1 /* route_id */,
+ blink::mojom::ServiceWorkerProviderType::kForWindow,
+ true /* is_parent_frame_secure */);
+ ServiceWorkerRemoteProviderEndpoint remote_endpoint;
+ remote_endpoint.BindWithProviderHostInfo(&info);
+ host->SetDocumentUrl(GURL("https://www.example.com/page"));
+ EXPECT_FALSE(CanFindClientProviderHost(host.get()));
+
+ host->CompleteNavigationInitialized(
+ helper_->mock_render_process_id(), std::move(info),
+ helper_->GetDispatcherHostForProcess(helper_->mock_render_process_id())
+ ->AsWeakPtr());
+ auto* host_rawptr = host.get();
+ context_->AddProviderHost(std::move(host));
+ EXPECT_TRUE(CanFindClientProviderHost(host_rawptr));
+ }
+}
+
} // namespace content
diff --git a/chromium/content/browser/service_worker/service_worker_quota_client.h b/chromium/content/browser/service_worker/service_worker_quota_client.h
index 23a44871928..bd263d5310a 100644
--- a/chromium/content/browser/service_worker/service_worker_quota_client.h
+++ b/chromium/content/browser/service_worker/service_worker_quota_client.h
@@ -9,7 +9,7 @@
#include "base/memory/ref_counted.h"
#include "content/common/content_export.h"
#include "storage/browser/quota/quota_client.h"
-#include "third_party/WebKit/public/mojom/quota/quota_types.mojom.h"
+#include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
#include "url/origin.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc b/chromium/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
index 493088c3154..85f49357f2e 100644
--- a/chromium/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_read_from_cache_job_unittest.cc
@@ -26,7 +26,7 @@
#include "net/url_request/url_request_status.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_register_job.cc b/chromium/content/browser/service_worker/service_worker_register_job.cc
index 7ce0873799c..d1d5416741b 100644
--- a/chromium/content/browser/service_worker/service_worker_register_job.cc
+++ b/chromium/content/browser/service_worker/service_worker_register_job.cc
@@ -25,7 +25,7 @@
#include "content/public/browser/browser_thread.h"
#include "mojo/public/cpp/bindings/associated_binding.h"
#include "net/base/net_errors.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
namespace content {
@@ -75,15 +75,14 @@ ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {
<< "Jobs should only be interrupted during shutdown.";
}
-void ServiceWorkerRegisterJob::AddCallback(
- const RegistrationCallback& callback) {
+void ServiceWorkerRegisterJob::AddCallback(RegistrationCallback callback) {
if (!is_promise_resolved_) {
- callbacks_.push_back(callback);
+ callbacks_.emplace_back(std::move(callback));
return;
}
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
- base::BindOnce(callback, promise_resolved_status_,
+ base::BindOnce(std::move(callback), promise_resolved_status_,
promise_resolved_status_message_,
base::RetainedRef(promise_resolved_registration_)));
}
@@ -389,7 +388,7 @@ void ServiceWorkerRegisterJob::OnStartWorkerFinished(
if (main_script_status.status() != net::URLRequestStatus::SUCCESS) {
message = new_version()->script_cache_map()->main_script_status_message();
if (message.empty())
- message = kFetchScriptError;
+ message = kServiceWorkerFetchScriptError;
}
Complete(status, message);
}
@@ -579,11 +578,8 @@ void ServiceWorkerRegisterJob::ResolvePromise(
promise_resolved_status_ = status;
promise_resolved_status_message_ = status_message,
promise_resolved_registration_ = registration;
- for (std::vector<RegistrationCallback>::iterator it = callbacks_.begin();
- it != callbacks_.end();
- ++it) {
- it->Run(status, status_message, registration);
- }
+ for (RegistrationCallback& callback : callbacks_)
+ std::move(callback).Run(status, status_message, registration);
callbacks_.clear();
}
@@ -591,14 +587,14 @@ void ServiceWorkerRegisterJob::AddRegistrationToMatchingProviderHosts(
ServiceWorkerRegistration* registration) {
DCHECK(registration);
for (std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> it =
- context_->GetProviderHostIterator();
+ context_->GetClientProviderHostIterator(
+ registration->pattern().GetOrigin());
!it->IsAtEnd(); it->Advance()) {
ServiceWorkerProviderHost* host = it->GetProviderHost();
- if (host->IsHostToRunningServiceWorker())
- continue;
if (!ServiceWorkerUtils::ScopeMatches(registration->pattern(),
- host->document_url()))
+ host->document_url())) {
continue;
+ }
host->AddMatchingRegistration(registration);
}
}
diff --git a/chromium/content/browser/service_worker/service_worker_register_job.h b/chromium/content/browser/service_worker/service_worker_register_job.h
index 8e2492975e4..cd726a0661b 100644
--- a/chromium/content/browser/service_worker/service_worker_register_job.h
+++ b/chromium/content/browser/service_worker/service_worker_register_job.h
@@ -15,8 +15,8 @@
#include "content/browser/service_worker/service_worker_register_job_base.h"
#include "content/browser/service_worker/service_worker_registration.h"
#include "content/common/service_worker/service_worker_status_code.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "url/gurl.h"
namespace content {
@@ -38,9 +38,9 @@ namespace content {
class ServiceWorkerRegisterJob : public ServiceWorkerRegisterJobBase,
public EmbeddedWorkerInstance::Listener {
public:
- typedef base::Callback<void(ServiceWorkerStatusCode status,
- const std::string& status_message,
- ServiceWorkerRegistration* registration)>
+ typedef base::OnceCallback<void(ServiceWorkerStatusCode status,
+ const std::string& status_message,
+ ServiceWorkerRegistration* registration)>
RegistrationCallback;
// For registration jobs.
@@ -59,7 +59,7 @@ class ServiceWorkerRegisterJob : public ServiceWorkerRegisterJobBase,
// Registers a callback to be called when the promise would resolve (whether
// successfully or not). Multiple callbacks may be registered.
- void AddCallback(const RegistrationCallback& callback);
+ void AddCallback(RegistrationCallback callback);
// ServiceWorkerRegisterJobBase implementation:
void Start() override;
diff --git a/chromium/content/browser/service_worker/service_worker_registration.cc b/chromium/content/browser/service_worker/service_worker_registration.cc
index 6dedd7bc2a6..3791d4e7af3 100644
--- a/chromium/content/browser/service_worker/service_worker_registration.cc
+++ b/chromium/content/browser/service_worker/service_worker_registration.cc
@@ -16,7 +16,7 @@
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/browser/browser_thread.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -219,11 +219,9 @@ void ServiceWorkerRegistration::ClaimClients() {
DCHECK(active_version());
for (std::unique_ptr<ServiceWorkerContextCore::ProviderHostIterator> it =
- context_->GetProviderHostIterator();
+ context_->GetClientProviderHostIterator(pattern_.GetOrigin());
!it->IsAtEnd(); it->Advance()) {
ServiceWorkerProviderHost* host = it->GetProviderHost();
- if (host->IsHostToRunningServiceWorker())
- continue;
if (host->controller() == active_version())
continue;
if (!host->IsContextSecureForServiceWorker())
diff --git a/chromium/content/browser/service_worker/service_worker_registration.h b/chromium/content/browser/service_worker/service_worker_registration.h
index 4fb403ba23f..164a9ac1960 100644
--- a/chromium/content/browser/service_worker/service_worker_registration.h
+++ b/chromium/content/browser/service_worker/service_worker_registration.h
@@ -18,7 +18,7 @@
#include "content/browser/service_worker/service_worker_version.h"
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_types.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "url/gurl.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_registration_object_host.cc b/chromium/content/browser/service_worker/service_worker_registration_object_host.cc
index 8d18858e7b8..11837fba49e 100644
--- a/chromium/content/browser/service_worker/service_worker_registration_object_host.cc
+++ b/chromium/content/browser/service_worker/service_worker_registration_object_host.cc
@@ -4,14 +4,13 @@
#include "content/browser/service_worker/service_worker_registration_object_host.h"
-#include "base/memory/ptr_util.h"
#include "content/browser/service_worker/service_worker_consts.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_handle.h"
#include "content/browser/service_worker/service_worker_provider_host.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "net/http/http_util.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_registration_object_host.h b/chromium/content/browser/service_worker/service_worker_registration_object_host.h
index 13dbd346683..9b978c6761c 100644
--- a/chromium/content/browser/service_worker/service_worker_registration_object_host.h
+++ b/chromium/content/browser/service_worker/service_worker_registration_object_host.h
@@ -14,7 +14,7 @@
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_types.h"
#include "mojo/public/cpp/bindings/associated_binding_set.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_registration_status.cc b/chromium/content/browser/service_worker/service_worker_registration_status.cc
index 21863f4efdb..97954034a48 100644
--- a/chromium/content/browser/service_worker/service_worker_registration_status.cc
+++ b/chromium/content/browser/service_worker/service_worker_registration_status.cc
@@ -8,7 +8,7 @@
#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_error_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_registration_status.h b/chromium/content/browser/service_worker/service_worker_registration_status.h
index 37c1815b4d9..b7368901770 100644
--- a/chromium/content/browser/service_worker/service_worker_registration_status.h
+++ b/chromium/content/browser/service_worker/service_worker_registration_status.h
@@ -7,7 +7,7 @@
#include "base/strings/string16.h"
#include "content/common/service_worker/service_worker_status_code.h"
-#include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerError.h"
+#include "third_party/blink/public/platform/modules/serviceworker/web_service_worker_error.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_registration_unittest.cc b/chromium/content/browser/service_worker/service_worker_registration_unittest.cc
index 31735f73eb9..c3c86f49727 100644
--- a/chromium/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -28,8 +28,8 @@
#include "content/test/test_content_browser_client.h"
#include "mojo/edk/embedder/embedder.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
#include "url/gurl.h"
namespace content {
diff --git a/chromium/content/browser/service_worker/service_worker_request_handler.cc b/chromium/content/browser/service_worker/service_worker_request_handler.cc
index a0892b30666..2ca37e938e9 100644
--- a/chromium/content/browser/service_worker/service_worker_request_handler.cc
+++ b/chromium/content/browser/service_worker/service_worker_request_handler.cc
@@ -9,7 +9,7 @@
#include "base/command_line.h"
#include "base/macros.h"
-#include "content/browser/loader/url_loader_request_handler.h"
+#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_navigation_handle_core.h"
@@ -86,6 +86,15 @@ void ServiceWorkerRequestHandler::InitializeForNavigation(
const base::Callback<WebContents*(void)>& web_contents_getter) {
CHECK(IsBrowserSideNavigationEnabled());
+ // S13nServiceWorker enabled, NetworkService disabled:
+ // To start the navigation, InitializeForNavigationNetworkService() is called
+ // instead of this, but when that request handler falls back to network,
+ // InitializeForNavigation() is called.
+ // Since we already determined to fall back to network, don't create another
+ // handler.
+ if (ServiceWorkerUtils::IsServicificationEnabled())
+ return;
+
// Only create a handler when there is a ServiceWorkerNavigationHandlerCore
// to take ownership of a pre-created SeviceWorkerProviderHost.
if (!navigation_handle_core)
@@ -131,7 +140,7 @@ void ServiceWorkerRequestHandler::InitializeForNavigation(
// S13nServiceWorker:
// static
-std::unique_ptr<URLLoaderRequestHandler>
+std::unique_ptr<NavigationLoaderInterceptor>
ServiceWorkerRequestHandler::InitializeForNavigationNetworkService(
const network::ResourceRequest& resource_request,
ResourceContext* resource_context,
@@ -181,7 +190,35 @@ ServiceWorkerRequestHandler::InitializeForNavigationNetworkService(
// ServiceWorkerNavigationHandleCore.
navigation_handle_core->DidPreCreateProviderHost(std::move(provider_host));
- return base::WrapUnique<URLLoaderRequestHandler>(handler.release());
+ return base::WrapUnique<NavigationLoaderInterceptor>(handler.release());
+}
+
+// static
+std::unique_ptr<NavigationLoaderInterceptor>
+ServiceWorkerRequestHandler::InitializeForSharedWorker(
+ const network::ResourceRequest& resource_request,
+ base::WeakPtr<ServiceWorkerProviderHost> host) {
+ DCHECK(ServiceWorkerUtils::IsServicificationEnabled());
+
+ // Create the handler even for insecure HTTP since it's used in the
+ // case of redirect to HTTPS.
+ if (!resource_request.url.SchemeIsHTTPOrHTTPS() &&
+ !OriginCanAccessServiceWorkers(resource_request.url)) {
+ return nullptr;
+ }
+
+ std::unique_ptr<ServiceWorkerRequestHandler> handler(
+ host->CreateRequestHandler(
+ resource_request.fetch_request_mode,
+ resource_request.fetch_credentials_mode,
+ resource_request.fetch_redirect_mode,
+ resource_request.fetch_integrity, resource_request.keepalive,
+ RESOURCE_TYPE_SHARED_WORKER, REQUEST_CONTEXT_TYPE_SHARED_WORKER,
+ resource_request.fetch_frame_type,
+ nullptr /* blob_storage_context: unused in S13n */,
+ resource_request.request_body, resource_request.skip_service_worker));
+
+ return base::WrapUnique<NavigationLoaderInterceptor>(handler.release());
}
// static
diff --git a/chromium/content/browser/service_worker/service_worker_request_handler.h b/chromium/content/browser/service_worker/service_worker_request_handler.h
index ef6d7d26970..da73b702058 100644
--- a/chromium/content/browser/service_worker/service_worker_request_handler.h
+++ b/chromium/content/browser/service_worker/service_worker_request_handler.h
@@ -12,7 +12,7 @@
#include "base/memory/weak_ptr.h"
#include "base/supports_user_data.h"
#include "base/time/time.h"
-#include "content/browser/loader/url_loader_request_handler.h"
+#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/common/content_export.h"
#include "content/common/service_worker/service_worker_status_code.h"
#include "content/common/service_worker/service_worker_types.h"
@@ -49,7 +49,7 @@ class WebContents;
// Created one per URLRequest and attached to each request.
class CONTENT_EXPORT ServiceWorkerRequestHandler
: public base::SupportsUserData::Data,
- public URLLoaderRequestHandler {
+ public NavigationLoaderInterceptor {
public:
// PlzNavigate
// Attaches a newly created handler if the given |request| needs to be handled
@@ -68,8 +68,8 @@ class CONTENT_EXPORT ServiceWorkerRequestHandler
// S13nServiceWorker:
// Same as InitializeForNavigation() but instead of attaching to a URLRequest,
- // just creates a URLLoaderRequestHandler and returns it.
- static std::unique_ptr<URLLoaderRequestHandler>
+ // just creates a NavigationLoaderInterceptor and returns it.
+ static std::unique_ptr<NavigationLoaderInterceptor>
InitializeForNavigationNetworkService(
const network::ResourceRequest& resource_request,
ResourceContext* resource_context,
@@ -83,6 +83,10 @@ class CONTENT_EXPORT ServiceWorkerRequestHandler
scoped_refptr<network::ResourceRequestBody> body,
const base::Callback<WebContents*(void)>& web_contents_getter);
+ static std::unique_ptr<NavigationLoaderInterceptor> InitializeForSharedWorker(
+ const network::ResourceRequest& resource_request,
+ base::WeakPtr<ServiceWorkerProviderHost> host);
+
// Attaches a newly created handler if the given |request| needs to
// be handled by ServiceWorker.
// TODO(kinuko): While utilizing UserData to attach data to URLRequest
@@ -134,7 +138,7 @@ class CONTENT_EXPORT ServiceWorkerRequestHandler
net::NetworkDelegate* network_delegate,
ResourceContext* context) = 0;
- // URLLoaderRequestHandler overrides.
+ // NavigationLoaderInterceptor overrides.
void MaybeCreateLoader(const network::ResourceRequest& request,
ResourceContext* resource_context,
LoaderCallback callback) override;
diff --git a/chromium/content/browser/service_worker/service_worker_script_loader_factory.cc b/chromium/content/browser/service_worker/service_worker_script_loader_factory.cc
index 46bcfb42dc4..a61fc1f14fe 100644
--- a/chromium/content/browser/service_worker/service_worker_script_loader_factory.cc
+++ b/chromium/content/browser/service_worker/service_worker_script_loader_factory.cc
@@ -24,7 +24,7 @@ ServiceWorkerScriptLoaderFactory::ServiceWorkerScriptLoaderFactory(
: context_(context),
provider_host_(provider_host),
loader_factory_getter_(loader_factory_getter) {
- DCHECK(provider_host_->IsHostToRunningServiceWorker());
+ DCHECK(provider_host_->IsProviderForServiceWorker());
}
ServiceWorkerScriptLoaderFactory::~ServiceWorkerScriptLoaderFactory() = default;
diff --git a/chromium/content/browser/service_worker/service_worker_storage.cc b/chromium/content/browser/service_worker/service_worker_storage.cc
index 31277926c84..08f439d6e4c 100644
--- a/chromium/content/browser/service_worker/service_worker_storage.cc
+++ b/chromium/content/browser/service_worker/service_worker_storage.cc
@@ -29,10 +29,10 @@
#include "net/base/net_errors.h"
#include "storage/browser/quota/quota_manager_proxy.h"
#include "storage/browser/quota/special_storage_policy.h"
-#include "third_party/WebKit/public/mojom/quota/quota_types.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/WebKit/public/platform/web_feature.mojom.h"
+#include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/platform/web_feature.mojom.h"
using std::swap;
@@ -431,7 +431,8 @@ void ServiceWorkerStorage::StoreRegistration(
if (version->origin_trial_tokens())
data.origin_trial_tokens = *version->origin_trial_tokens();
data.navigation_preload_state = registration->navigation_preload_state();
- data.used_features = version->used_features();
+ for (const blink::mojom::WebFeature feature : version->used_features())
+ data.used_features.insert(static_cast<uint32_t>(feature));
ResourceList resources;
version->script_cache_map()->GetResources(&resources);
@@ -1540,16 +1541,14 @@ ServiceWorkerStorage::GetOrCreateRegistration(
// TODO(falken): Maybe Chrome should have a generic mechanism to detect
// profile downgrade and just abort? Or we could just crash here, but that
// seems extreme and difficult for a user to escape.
- std::set<uint32_t> used_features = data.used_features;
- for (auto it = used_features.begin(); it != used_features.end();) {
- if (*it >=
+ std::set<blink::mojom::WebFeature> used_features;
+ for (const uint32_t feature : data.used_features) {
+ if (feature <
static_cast<uint32_t>(blink::mojom::WebFeature::kNumberOfFeatures)) {
- it = used_features.erase(it);
- } else {
- ++it;
+ used_features.insert(static_cast<blink::mojom::WebFeature>(feature));
}
}
- version->set_used_features(used_features);
+ version->set_used_features(std::move(used_features));
}
if (version->status() == ServiceWorkerVersion::ACTIVATED)
diff --git a/chromium/content/browser/service_worker/service_worker_storage_unittest.cc b/chromium/content/browser/service_worker/service_worker_storage_unittest.cc
index 002ee831382..8ab6e03831c 100644
--- a/chromium/content/browser/service_worker/service_worker_storage_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -17,7 +17,6 @@
#include "base/test/histogram_tester.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
-#include "content/browser/browser_thread_impl.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_disk_cache.h"
@@ -40,8 +39,8 @@
#include "net/test/cert_test_util.h"
#include "net/test/test_data_directory.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
using net::IOBuffer;
using net::TestCompletionCallback;
@@ -697,7 +696,10 @@ TEST_F(ServiceWorkerStorageTest, StoreFindUpdateDeleteRegistration) {
const int64_t kVersionId = 0;
const base::Time kToday = base::Time::Now();
const base::Time kYesterday = kToday - base::TimeDelta::FromDays(1);
- std::set<uint32_t> used_features = {124, 901, 1019};
+ std::set<blink::mojom::WebFeature> used_features = {
+ blink::mojom::WebFeature::kServiceWorkerControlledPage,
+ blink::mojom::WebFeature::kReferrerPolicyHeader,
+ blink::mojom::WebFeature::kLocationOrigin};
scoped_refptr<ServiceWorkerRegistration> found_registration;
@@ -731,7 +733,8 @@ TEST_F(ServiceWorkerStorageTest, StoreFindUpdateDeleteRegistration) {
ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
live_version->SetStatus(ServiceWorkerVersion::INSTALLED);
live_version->script_cache_map()->SetResources(resources);
- live_version->set_used_features(used_features);
+ live_version->set_used_features(
+ std::set<blink::mojom::WebFeature>(used_features));
live_registration->SetWaitingVersion(live_version);
live_registration->set_last_update_check(kYesterday);
EXPECT_EQ(SERVICE_WORKER_OK,
diff --git a/chromium/content/browser/service_worker/service_worker_test_utils.cc b/chromium/content/browser/service_worker/service_worker_test_utils.cc
index 4d05a4374ad..67e56a81a2b 100644
--- a/chromium/content/browser/service_worker/service_worker_test_utils.cc
+++ b/chromium/content/browser/service_worker/service_worker_test_utils.cc
@@ -225,7 +225,8 @@ WriteToDiskCacheWithCustomResponseInfoAsync(
WriteBodyToDiskCache(std::move(body_writer), std::move(http_info), body,
barrier);
auto metadata_writer = storage->CreateResponseMetadataWriter(resource_id);
- WriteMetaDataToDiskCache(std::move(metadata_writer), meta_data, barrier);
+ WriteMetaDataToDiskCache(std::move(metadata_writer), meta_data,
+ std::move(barrier));
return ServiceWorkerDatabase::ResourceRecord(resource_id, script_url,
body.size());
}
diff --git a/chromium/content/browser/service_worker/service_worker_test_utils.h b/chromium/content/browser/service_worker/service_worker_test_utils.h
index 318e7d24be3..363387afbde 100644
--- a/chromium/content/browser/service_worker/service_worker_test_utils.h
+++ b/chromium/content/browser/service_worker/service_worker_test_utils.h
@@ -16,7 +16,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/common/content_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace net {
diff --git a/chromium/content/browser/service_worker/service_worker_type_converters.h b/chromium/content/browser/service_worker/service_worker_type_converters.h
index 322455eaec4..207ef89cc3c 100644
--- a/chromium/content/browser/service_worker/service_worker_type_converters.h
+++ b/chromium/content/browser/service_worker/service_worker_type_converters.h
@@ -7,8 +7,8 @@
#include "content/browser/service_worker/service_worker_version.h"
#include "content/common/service_worker/service_worker_status_code.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_state.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_state.mojom.h"
namespace mojo {
diff --git a/chromium/content/browser/service_worker/service_worker_unregister_job.cc b/chromium/content/browser/service_worker/service_worker_unregister_job.cc
index 76e053bec92..64eb79e375d 100644
--- a/chromium/content/browser/service_worker/service_worker_unregister_job.cc
+++ b/chromium/content/browser/service_worker/service_worker_unregister_job.cc
@@ -11,7 +11,7 @@
#include "content/browser/service_worker/service_worker_storage.h"
#include "content/browser/service_worker/service_worker_version.h"
#include "content/common/service_worker/service_worker_utils.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
@@ -28,9 +28,8 @@ ServiceWorkerUnregisterJob::ServiceWorkerUnregisterJob(
ServiceWorkerUnregisterJob::~ServiceWorkerUnregisterJob() {}
-void ServiceWorkerUnregisterJob::AddCallback(
- const UnregistrationCallback& callback) {
- callbacks_.push_back(callback);
+void ServiceWorkerUnregisterJob::AddCallback(UnregistrationCallback callback) {
+ callbacks_.emplace_back(std::move(callback));
}
void ServiceWorkerUnregisterJob::Start() {
@@ -98,11 +97,8 @@ void ServiceWorkerUnregisterJob::ResolvePromise(
ServiceWorkerStatusCode status) {
DCHECK(!is_promise_resolved_);
is_promise_resolved_ = true;
- for (std::vector<UnregistrationCallback>::iterator it = callbacks_.begin();
- it != callbacks_.end();
- ++it) {
- it->Run(registration_id, status);
- }
+ for (UnregistrationCallback& callback : callbacks_)
+ std::move(callback).Run(registration_id, status);
}
} // namespace content
diff --git a/chromium/content/browser/service_worker/service_worker_unregister_job.h b/chromium/content/browser/service_worker/service_worker_unregister_job.h
index 9e4f2ff348e..0ded1bb3cd1 100644
--- a/chromium/content/browser/service_worker/service_worker_unregister_job.h
+++ b/chromium/content/browser/service_worker/service_worker_unregister_job.h
@@ -28,8 +28,8 @@ class ServiceWorkerRegistration;
// ServiceWorkerRegistration itself.
class ServiceWorkerUnregisterJob : public ServiceWorkerRegisterJobBase {
public:
- typedef base::Callback<void(int64_t registration_id,
- ServiceWorkerStatusCode status)>
+ typedef base::OnceCallback<void(int64_t registration_id,
+ ServiceWorkerStatusCode status)>
UnregistrationCallback;
ServiceWorkerUnregisterJob(base::WeakPtr<ServiceWorkerContextCore> context,
@@ -38,7 +38,7 @@ class ServiceWorkerUnregisterJob : public ServiceWorkerRegisterJobBase {
// Registers a callback to be called when the job completes (whether
// successfully or not). Multiple callbacks may be registered.
- void AddCallback(const UnregistrationCallback& callback);
+ void AddCallback(UnregistrationCallback callback);
// ServiceWorkerRegisterJobBase implementation:
void Start() override;
diff --git a/chromium/content/browser/service_worker/service_worker_url_job_wrapper.h b/chromium/content/browser/service_worker/service_worker_url_job_wrapper.h
index bd12480ec35..acaf609c685 100644
--- a/chromium/content/browser/service_worker/service_worker_url_job_wrapper.h
+++ b/chromium/content/browser/service_worker/service_worker_url_job_wrapper.h
@@ -6,7 +6,7 @@
#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_WRAPPER_H_
#include "base/macros.h"
-#include "content/browser/loader/url_loader_request_handler.h"
+#include "content/browser/loader/navigation_loader_interceptor.h"
#include "content/browser/service_worker/service_worker_metrics.h"
#include "content/common/content_export.h"
diff --git a/chromium/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/chromium/content/browser/service_worker/service_worker_url_request_job_unittest.cc
index c4d65e0b440..20b8ee246d9 100644
--- a/chromium/content/browser/service_worker/service_worker_url_request_job_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -12,7 +12,6 @@
#include "base/callback.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/test/histogram_tester.h"
@@ -62,10 +61,10 @@
#include "storage/browser/blob/blob_url_request_job_factory.h"
#include "storage/common/blob_storage/blob_handle.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
namespace service_worker_url_request_job_unittest {
diff --git a/chromium/content/browser/service_worker/service_worker_version.cc b/chromium/content/browser/service_worker/service_worker_version.cc
index 2417abcfdae..025c6403566 100644
--- a/chromium/content/browser/service_worker/service_worker_version.cc
+++ b/chromium/content/browser/service_worker/service_worker_version.cc
@@ -26,7 +26,6 @@
#include "content/browser/child_process_security_policy_impl.h"
#include "content/browser/service_worker/embedded_worker_registry.h"
#include "content/browser/service_worker/payment_handler_support.h"
-#include "content/browser/service_worker/service_worker_client_utils.h"
#include "content/browser/service_worker/service_worker_context_core.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/browser/service_worker/service_worker_installed_scripts_sender.h"
@@ -34,7 +33,6 @@
#include "content/browser/service_worker/service_worker_type_converters.h"
#include "content/common/origin_trials/trial_policy_impl.h"
#include "content/common/service_worker/embedded_worker.mojom.h"
-#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/browser/browser_thread.h"
@@ -46,16 +44,13 @@
#include "content/public/common/result_codes.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_response_info.h"
-#include "third_party/WebKit/public/common/origin_trials/trial_token_validator.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_error_type.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/WebKit/public/web/WebConsoleMessage.h"
+#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
+#include "third_party/blink/public/web/web_console_message.h"
namespace content {
-
-using StatusCallback = ServiceWorkerVersion::StatusCallback;
-
namespace {
// Timeout for an installed worker to start.
@@ -103,7 +98,7 @@ void RunCallbacks(ServiceWorkerVersion* version,
// An adapter to run a |callback| after StartWorker.
void RunCallbackAfterStartWorker(base::WeakPtr<ServiceWorkerVersion> version,
- StatusCallback callback,
+ ServiceWorkerVersion::StatusCallback callback,
ServiceWorkerStatusCode status) {
if (status == SERVICE_WORKER_OK &&
version->running_status() != EmbeddedWorkerStatus::RUNNING) {
@@ -892,7 +887,8 @@ void ServiceWorkerVersion::SimulatePingTimeoutForTesting() {
ping_controller_->SimulateTimeoutForTesting();
}
-void ServiceWorkerVersion::SetTickClockForTesting(base::TickClock* tick_clock) {
+void ServiceWorkerVersion::SetTickClockForTesting(
+ const base::TickClock* tick_clock) {
tick_clock_ = tick_clock;
}
@@ -1035,16 +1031,6 @@ void ServiceWorkerVersion::OnReportConsoleMessage(int source_identifier,
}
}
-bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(ServiceWorkerVersion, message)
- IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient,
- OnPostMessageToClient)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
void ServiceWorkerVersion::OnStartSentAndScriptEvaluated(
ServiceWorkerStatusCode status) {
if (status != SERVICE_WORKER_OK) {
@@ -1124,6 +1110,10 @@ void ServiceWorkerVersion::GetClient(const std::string& client_uuid,
if (!provider_host ||
provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) {
// The promise will be resolved to 'undefined'.
+ // Note that we don't BadMessage here since Clients#get() can be passed an
+ // arbitrary UUID. The BadMessages for the origin mismatches below are
+ // appropriate because the UUID is taken directly from a Client object so we
+ // expect it to be valid.
std::move(callback).Run(nullptr);
return;
}
@@ -1132,7 +1122,7 @@ void ServiceWorkerVersion::GetClient(const std::string& client_uuid,
void ServiceWorkerVersion::OpenNewTab(const GURL& url,
OpenNewTabCallback callback) {
- OpenWindow(url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+ OpenWindow(url, service_worker_client_utils::WindowType::NEW_TAB_WINDOW,
std::move(callback));
}
@@ -1150,12 +1140,32 @@ void ServiceWorkerVersion::OpenPaymentHandlerWindow(
PaymentHandlerSupport::ShowPaymentHandlerWindow(
url, context_.get(),
base::BindOnce(&DidShowPaymentHandlerWindow, url, context_),
- base::BindOnce(&ServiceWorkerVersion::OpenWindow,
- weak_factory_.GetWeakPtr(), url,
- WindowOpenDisposition::NEW_POPUP),
+ base::BindOnce(
+ &ServiceWorkerVersion::OpenWindow, weak_factory_.GetWeakPtr(), url,
+ service_worker_client_utils::WindowType::PAYMENT_HANDLER_WINDOW),
std::move(callback));
}
+void ServiceWorkerVersion::PostMessageToClient(
+ const std::string& client_uuid,
+ blink::TransferableMessage message) {
+ if (!context_)
+ return;
+ ServiceWorkerProviderHost* provider_host =
+ context_->GetProviderHostByClientID(client_uuid);
+ if (!provider_host) {
+ // The client may already have been closed, just ignore.
+ return;
+ }
+ if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) {
+ mojo::ReportBadMessage(
+ "Received Client#postMessage() request for a cross-origin client.");
+ binding_.Close();
+ return;
+ }
+ provider_host->PostMessageToClient(this, std::move(message));
+}
+
void ServiceWorkerVersion::FocusClient(const std::string& client_uuid,
FocusClientCallback callback) {
if (!context_) {
@@ -1170,15 +1180,16 @@ void ServiceWorkerVersion::FocusClient(const std::string& client_uuid,
return;
}
if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) {
- // The client does not belong to the same origin as this ServiceWorker,
- // possibly due to timing issue or bad message.
- std::move(callback).Run(nullptr /* client */);
+ mojo::ReportBadMessage(
+ "Received WindowClient#focus() request for a cross-origin client.");
+ binding_.Close();
return;
}
if (provider_host->client_type() !=
blink::mojom::ServiceWorkerClientType::kWindow) {
// focus() should be called only for WindowClient.
- mojo::ReportBadMessage("Received focus() request for a non-window client.");
+ mojo::ReportBadMessage(
+ "Received WindowClient#focus() request for a non-window client.");
binding_.Close();
return;
}
@@ -1223,6 +1234,20 @@ void ServiceWorkerVersion::NavigateClient(const std::string& client_uuid,
std::string("The client was not found."));
return;
}
+ if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) {
+ mojo::ReportBadMessage(
+ "Received WindowClient#navigate() request for a cross-origin client.");
+ binding_.Close();
+ return;
+ }
+ if (provider_host->client_type() !=
+ blink::mojom::ServiceWorkerClientType::kWindow) {
+ // navigate() should be called only for WindowClient.
+ mojo::ReportBadMessage(
+ "Received WindowClient#navigate() request for a non-window client.");
+ binding_.Close();
+ return;
+ }
if (provider_host->active_version() != this) {
std::move(callback).Run(
false /* success */, nullptr /* client */,
@@ -1291,9 +1316,10 @@ void ServiceWorkerVersion::OnClearCachedMetadataFinished(int64_t callback_id,
listener.OnCachedMetadataUpdated(this, 0);
}
-void ServiceWorkerVersion::OpenWindow(GURL url,
- WindowOpenDisposition disposition,
- OpenNewTabCallback callback) {
+void ServiceWorkerVersion::OpenWindow(
+ GURL url,
+ service_worker_client_utils::WindowType type,
+ OpenNewTabCallback callback) {
// Just respond failure if we are shutting down.
if (!context_) {
std::move(callback).Run(
@@ -1326,7 +1352,7 @@ void ServiceWorkerVersion::OpenWindow(GURL url,
}
service_worker_client_utils::OpenWindow(
- url, script_url_, embedded_worker_->process_id(), context_, disposition,
+ url, script_url_, embedded_worker_->process_id(), context_, type,
base::BindOnce(&OnOpenWindowFinished, std::move(callback)));
}
@@ -1348,7 +1374,7 @@ void ServiceWorkerVersion::OnSimpleEventFinished(
std::move(callback).Run(mojo::ConvertTo<ServiceWorkerStatusCode>(status));
}
-void ServiceWorkerVersion::CountFeature(uint32_t feature) {
+void ServiceWorkerVersion::CountFeature(blink::mojom::WebFeature feature) {
if (!used_features_.insert(feature).second)
return;
for (auto provider_host_by_uuid : controllee_map_)
@@ -1370,29 +1396,6 @@ bool ServiceWorkerVersion::IsInstalled(ServiceWorkerVersion::Status status) {
return false;
}
-void ServiceWorkerVersion::OnPostMessageToClient(
- const std::string& client_uuid,
- const scoped_refptr<base::RefCountedData<blink::TransferableMessage>>&
- message) {
- if (!context_)
- return;
- TRACE_EVENT1("ServiceWorker",
- "ServiceWorkerVersion::OnPostMessageToDocument",
- "Client id", client_uuid);
- ServiceWorkerProviderHost* provider_host =
- context_->GetProviderHostByClientID(client_uuid);
- if (!provider_host) {
- // The client may already have been closed, just ignore.
- return;
- }
- if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) {
- // The client does not belong to the same origin as this ServiceWorker,
- // possibly due to timing issue or bad message.
- return;
- }
- provider_host->PostMessageToClient(this, std::move(message->data));
-}
-
void ServiceWorkerVersion::OnPongFromWorker() {
ping_controller_->OnPongReceived();
}
diff --git a/chromium/content/browser/service_worker/service_worker_version.h b/chromium/content/browser/service_worker/service_worker_version.h
index ce0bfe6b8dc..c0aba6af7c5 100644
--- a/chromium/content/browser/service_worker/service_worker_version.h
+++ b/chromium/content/browser/service_worker/service_worker_version.h
@@ -19,7 +19,6 @@
#include "base/containers/id_map.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
-#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "base/optional.h"
@@ -30,6 +29,7 @@
#include "base/timer/timer.h"
#include "content/browser/service_worker/embedded_worker_instance.h"
#include "content/browser/service_worker/embedded_worker_status.h"
+#include "content/browser/service_worker/service_worker_client_utils.h"
#include "content/browser/service_worker/service_worker_context_request_handler.h"
#include "content/browser/service_worker/service_worker_metrics.h"
#include "content/browser/service_worker/service_worker_script_cache_map.h"
@@ -41,11 +41,11 @@
#include "ipc/ipc_message.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "services/service_manager/public/cpp/interface_provider.h"
-#include "third_party/WebKit/public/common/origin_trials/trial_token_validator.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_client.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "ui/base/mojo/window_open_disposition.mojom.h"
+#include "third_party/blink/public/common/origin_trials/trial_token_validator.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/platform/web_feature.mojom.h"
#include "url/gurl.h"
#include "url/origin.h"
@@ -323,7 +323,9 @@ class CONTENT_EXPORT ServiceWorkerVersion
// This must be called when the worker is running.
mojom::ServiceWorkerEventDispatcher* event_dispatcher() {
- DCHECK(event_dispatcher_.is_bound());
+ // Temporarily CHECK for debugging https://crbug.com/817981.
+ CHECK(event_dispatcher_.is_bound());
+ CHECK(event_dispatcher_.get());
return event_dispatcher_.get();
}
@@ -435,7 +437,7 @@ class CONTENT_EXPORT ServiceWorkerVersion
void SimulatePingTimeoutForTesting();
// Used to allow tests to change time for testing.
- void SetTickClockForTesting(base::TickClock* tick_clock);
+ void SetTickClockForTesting(const base::TickClock* tick_clock);
// Used to allow tests to change wall clock for testing.
void SetClockForTesting(base::Clock* clock);
@@ -463,11 +465,13 @@ class CONTENT_EXPORT ServiceWorkerVersion
return max_request_expiration_time_ - tick_clock_->NowTicks();
}
- void CountFeature(uint32_t feature);
- void set_used_features(const std::set<uint32_t>& used_features) {
- used_features_ = used_features;
+ void CountFeature(blink::mojom::WebFeature feature);
+ void set_used_features(std::set<blink::mojom::WebFeature> used_features) {
+ used_features_ = std::move(used_features);
+ }
+ const std::set<blink::mojom::WebFeature>& used_features() const {
+ return used_features_;
}
- const std::set<uint32_t>& used_features() const { return used_features_; }
static bool IsInstalled(ServiceWorkerVersion::Status status);
@@ -615,7 +619,6 @@ class CONTENT_EXPORT ServiceWorkerVersion
const base::string16& message,
int line_number,
const GURL& source_url) override;
- bool OnMessageReceived(const IPC::Message& message) override;
void OnStartSentAndScriptEvaluated(ServiceWorkerStatusCode status);
@@ -632,6 +635,8 @@ class CONTENT_EXPORT ServiceWorkerVersion
void OpenPaymentHandlerWindow(
const GURL& url,
OpenPaymentHandlerWindowCallback callback) override;
+ void PostMessageToClient(const std::string& client_uuid,
+ blink::TransferableMessage message) override;
void FocusClient(const std::string& client_uuid,
FocusClientCallback callback) override;
void NavigateClient(const std::string& client_uuid,
@@ -644,16 +649,9 @@ class CONTENT_EXPORT ServiceWorkerVersion
int result);
void OnClearCachedMetadataFinished(int64_t callback_id, int result);
void OpenWindow(GURL url,
- WindowOpenDisposition disposition,
+ service_worker_client_utils::WindowType type,
OpenNewTabCallback callback);
- // Message handlers.
-
- void OnPostMessageToClient(
- const std::string& client_uuid,
- const scoped_refptr<base::RefCountedData<blink::TransferableMessage>>&
- message);
-
void OnPongFromWorker();
void DidEnsureLiveRegistrationForStartWorker(
@@ -836,7 +834,7 @@ class CONTENT_EXPORT ServiceWorkerVersion
ServiceWorkerStatusCode start_worker_status_ = SERVICE_WORKER_OK;
// The clock used to vend tick time.
- base::TickClock* tick_clock_;
+ const base::TickClock* tick_clock_;
// The clock used for actual (wall clock) time
base::Clock* clock_;
@@ -855,9 +853,8 @@ class CONTENT_EXPORT ServiceWorkerVersion
base::Optional<ServiceWorkerMetrics::EventType> start_worker_first_purpose_;
// This is the set of features that were used up until installation of this
- // version completed, or used during the lifetime of |this|. The values must
- // be from blink::UseCounter::Feature enum.
- std::set<uint32_t> used_features_;
+ // version completed, or used during the lifetime of |this|.
+ std::set<blink::mojom::WebFeature> used_features_;
std::unique_ptr<blink::TrialTokenValidator> validator_;
diff --git a/chromium/content/browser/service_worker/service_worker_version_unittest.cc b/chromium/content/browser/service_worker/service_worker_version_unittest.cc
index b27604eb3c0..8023d7da5fa 100644
--- a/chromium/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_version_unittest.cc
@@ -29,27 +29,10 @@
#include "content/public/test/test_utils.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
-
-// IPC messages for testing ---------------------------------------------------
-
-#undef IPC_IPC_MESSAGE_MACROS_H_
-#undef IPC_MESSAGE_EXTRA
-#define IPC_MESSAGE_IMPL
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_message_templates_impl.h"
-
-#define IPC_MESSAGE_START TestMsgStart
-
-IPC_MESSAGE_CONTROL0(TestMsg_Message)
-IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int)
-
-IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string)
-
-// ---------------------------------------------------------------------------
+#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
namespace service_worker_version_unittest {
@@ -59,17 +42,6 @@ class MessageReceiver : public EmbeddedWorkerTestHelper {
MessageReceiver() : EmbeddedWorkerTestHelper(base::FilePath()) {}
~MessageReceiver() override {}
- void SimulateSendValueToBrowser(int embedded_worker_id, int value) {
- SimulateSend(new TestMsg_MessageFromWorker(embedded_worker_id, value));
- }
-
- void SimulateSendEventResult(int embedded_worker_id,
- int request_id,
- const std::string& reply) {
- SimulateSend(
- new TestMsg_TestEventResult(embedded_worker_id, request_id, reply));
- }
-
void SimulateSetCachedMetadata(int embedded_worker_id,
const GURL& url,
const std::vector<uint8_t>& data) {
@@ -107,10 +79,6 @@ class MessageReceiver : public EmbeddedWorkerTestHelper {
}
private:
- void OnMessage() {
- // Do nothing.
- }
-
std::map<
int /* embedded_worker_id */,
blink::mojom::ServiceWorkerHostAssociatedPtr /* service_worker_host */>
@@ -130,35 +98,6 @@ void ObserveStatusChanges(ServiceWorkerVersion* version,
&ObserveStatusChanges, base::Unretained(version), statuses));
}
-// A specialized listener class to receive test messages from a worker.
-class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener {
- public:
- explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance)
- : instance_(instance) {
- instance_->AddListener(this);
- }
- ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); }
-
- void OnStarted() override { NOTREACHED(); }
- void OnStopped(EmbeddedWorkerStatus old_status) override { NOTREACHED(); }
- bool OnMessageReceived(const IPC::Message& message) override {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(MessageReceiverFromWorker, message)
- IPC_MESSAGE_HANDLER(TestMsg_MessageFromWorker, OnMessageFromWorker)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
- }
-
- void OnMessageFromWorker(int value) { received_values_.push_back(value); }
- const std::vector<int>& received_values() const { return received_values_; }
-
- private:
- EmbeddedWorkerInstance* instance_;
- std::vector<int> received_values_;
- DISALLOW_COPY_AND_ASSIGN(MessageReceiverFromWorker);
-};
-
base::Time GetYesterday() {
return base::Time::Now() - base::TimeDelta::FromDays(1) -
base::TimeDelta::FromSeconds(1);
@@ -575,24 +514,6 @@ TEST_F(ServiceWorkerVersionTest, StartUnregisteredButStillLiveWorker) {
EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
}
-TEST_F(ServiceWorkerVersionTest, ReceiveMessageFromWorker) {
- // Start worker.
- StartWorker(version_.get(), ServiceWorkerMetrics::EventType::UNKNOWN);
-
- MessageReceiverFromWorker receiver(version_->embedded_worker());
-
- // Simulate sending some dummy values from the worker.
- helper_->SimulateSendValueToBrowser(
- version_->embedded_worker()->embedded_worker_id(), 555);
- helper_->SimulateSendValueToBrowser(
- version_->embedded_worker()->embedded_worker_id(), 777);
-
- // Verify the receiver received the values.
- ASSERT_EQ(2U, receiver.received_values().size());
- EXPECT_EQ(555, receiver.received_values()[0]);
- EXPECT_EQ(777, receiver.received_values()[1]);
-}
-
TEST_F(ServiceWorkerVersionTest, InstallAndWaitCompletion) {
version_->SetStatus(ServiceWorkerVersion::INSTALLING);
diff --git a/chromium/content/browser/service_worker/service_worker_write_to_cache_job.cc b/chromium/content/browser/service_worker/service_worker_write_to_cache_job.cc
index a4805f18a87..7b25cc96dcd 100644
--- a/chromium/content/browser/service_worker/service_worker_write_to_cache_job.cc
+++ b/chromium/content/browser/service_worker/service_worker_write_to_cache_job.cc
@@ -6,7 +6,6 @@
#include "base/bind.h"
#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
@@ -27,25 +26,16 @@
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_status.h"
-#include "third_party/WebKit/public/common/mime_util/mime_util.h"
-#include "third_party/WebKit/public/web/WebConsoleMessage.h"
+#include "third_party/blink/public/common/mime_util/mime_util.h"
+#include "third_party/blink/public/web/web_console_message.h"
namespace content {
namespace {
const char kKilledError[] = "The request to fetch the script was interrupted.";
-const char kBadHTTPResponseError[] =
- "A bad HTTP response code (%d) was received when fetching the script.";
-const char kSSLError[] =
- "An SSL certificate error occurred when fetching the script.";
-const char kBadMIMEError[] = "The script has an unsupported MIME type ('%s').";
-const char kNoMIMEError[] = "The script does not have a MIME type.";
const char kClientAuthenticationError[] =
"Client authentication was required to fetch the script.";
-const char kRedirectError[] =
- "The script resource is behind a redirect, which is disallowed.";
-const char kServiceWorkerAllowed[] = "Service-Worker-Allowed";
bool ShouldIgnoreSSLError(net::URLRequest* request) {
const net::HttpNetworkSession::Params* session_params =
@@ -186,7 +176,7 @@ int ServiceWorkerWriteToCacheJob::ReadRawData(net::IOBuffer* buf,
if (rv < 0) {
net::Error error = static_cast<net::Error>(rv);
- error = NotifyFinishedCaching(error, kFetchScriptError);
+ error = NotifyFinishedCaching(error, kServiceWorkerFetchScriptError);
DCHECK_EQ(rv, error);
return error;
}
@@ -272,7 +262,7 @@ void ServiceWorkerWriteToCacheJob::OnReceivedRedirect(
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerWriteToCacheJob::OnReceivedRedirect");
// Script resources can't redirect.
- NotifyStartErrorHelper(net::ERR_UNSAFE_REDIRECT, kRedirectError);
+ NotifyStartErrorHelper(net::ERR_UNSAFE_REDIRECT, kServiceWorkerRedirectError);
}
void ServiceWorkerWriteToCacheJob::OnAuthRequired(
@@ -308,7 +298,7 @@ void ServiceWorkerWriteToCacheJob::OnSSLCertificateError(
} else {
NotifyStartErrorHelper(
net::Error(net::MapCertStatusToNetError(ssl_info.cert_status)),
- kSSLError);
+ kServiceWorkerSSLError);
}
}
@@ -319,12 +309,12 @@ void ServiceWorkerWriteToCacheJob::OnResponseStarted(net::URLRequest* request,
if (net_error != net::OK) {
net::Error error = static_cast<net::Error>(net_error);
- NotifyStartErrorHelper(error, kFetchScriptError);
+ NotifyStartErrorHelper(error, kServiceWorkerFetchScriptError);
return;
}
if (request->GetResponseCode() / 100 != 2) {
- std::string error_message =
- base::StringPrintf(kBadHTTPResponseError, request->GetResponseCode());
+ std::string error_message = base::StringPrintf(
+ kServiceWorkerBadHTTPResponseError, request->GetResponseCode());
NotifyStartErrorHelper(net::ERR_INVALID_RESPONSE, error_message);
// TODO(michaeln): Instead of error'ing immediately, send the net
// response to our consumer, just don't cache it?
@@ -336,7 +326,7 @@ void ServiceWorkerWriteToCacheJob::OnResponseStarted(net::URLRequest* request,
!ShouldIgnoreSSLError(request)) {
NotifyStartErrorHelper(net::Error(net::MapCertStatusToNetError(
request->ssl_info().cert_status)),
- kSSLError);
+ kServiceWorkerSSLError);
return;
}
@@ -345,9 +335,9 @@ void ServiceWorkerWriteToCacheJob::OnResponseStarted(net::URLRequest* request,
request->GetMimeType(&mime_type);
if (!blink::IsSupportedJavascriptMimeType(mime_type)) {
std::string error_message =
- mime_type.empty()
- ? kNoMIMEError
- : base::StringPrintf(kBadMIMEError, mime_type.c_str());
+ mime_type.empty() ? kServiceWorkerNoMIMEError
+ : base::StringPrintf(kServiceWorkerBadMIMEError,
+ mime_type.c_str());
NotifyStartErrorHelper(net::ERR_INSECURE_RESPONSE, error_message);
return;
}
@@ -410,7 +400,7 @@ void ServiceWorkerWriteToCacheJob::OnReadCompleted(net::URLRequest* request,
int result;
if (bytes_read < 0) {
net::Error error = static_cast<net::Error>(bytes_read);
- result = NotifyFinishedCaching(error, kFetchScriptError);
+ result = NotifyFinishedCaching(error, kServiceWorkerFetchScriptError);
} else {
result = HandleNetData(bytes_read);
}
@@ -475,7 +465,8 @@ net::Error ServiceWorkerWriteToCacheJob::NotifyFinishedCaching(
// response.
version_->embedded_worker()->AddMessageToConsole(
blink::WebConsoleMessage::kLevelError,
- status_message.empty() ? kFetchScriptError : status_message);
+ status_message.empty() ? kServiceWorkerFetchScriptError
+ : status_message);
} else {
size = cache_writer_->bytes_written();
}
diff --git a/chromium/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc b/chromium/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
index e99f8b3479f..0b248f1fd2e 100644
--- a/chromium/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
+++ b/chromium/content/browser/service_worker/service_worker_write_to_cache_job_unittest.cc
@@ -38,7 +38,7 @@
#include "services/network/public/mojom/request_context_frame_type.mojom.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/public/mojom/service_worker/service_worker_registration.mojom.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
namespace content {
namespace service_worker_write_to_cache_job_unittest {