diff options
Diffstat (limited to 'chromium/content/browser/service_worker')
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, ®istration_id)); + base::BindOnce(&DidRegisterServiceWorker, ®istration_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 { |