Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: content/browser/service_worker/service_worker_register_job.cc

Issue 2746783002: [ServiceWorker] Mojofy InstallEvent of Service Worker (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_register_job.h" 5 #include "content/browser/service_worker/service_worker_register_job.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
11 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "content/browser/service_worker/embedded_worker_status.h" 13 #include "content/browser/service_worker/embedded_worker_status.h"
14 #include "content/browser/service_worker/service_worker_context_core.h" 14 #include "content/browser/service_worker/service_worker_context_core.h"
15 #include "content/browser/service_worker/service_worker_job_coordinator.h" 15 #include "content/browser/service_worker/service_worker_job_coordinator.h"
16 #include "content/browser/service_worker/service_worker_metrics.h" 16 #include "content/browser/service_worker/service_worker_metrics.h"
17 #include "content/browser/service_worker/service_worker_registration.h" 17 #include "content/browser/service_worker/service_worker_registration.h"
18 #include "content/browser/service_worker/service_worker_storage.h" 18 #include "content/browser/service_worker/service_worker_storage.h"
19 #include "content/browser/service_worker/service_worker_write_to_cache_job.h" 19 #include "content/browser/service_worker/service_worker_write_to_cache_job.h"
20 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h"
20 #include "content/common/service_worker/service_worker_messages.h" 21 #include "content/common/service_worker/service_worker_messages.h"
21 #include "content/common/service_worker/service_worker_types.h" 22 #include "content/common/service_worker/service_worker_types.h"
22 #include "content/common/service_worker/service_worker_utils.h" 23 #include "content/common/service_worker/service_worker_utils.h"
23 #include "content/public/browser/browser_thread.h" 24 #include "content/public/browser/browser_thread.h"
25 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
24 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
25 27
26 namespace content { 28 namespace content {
27 29
28 namespace { 30 namespace {
29 31
30 void RunSoon(const base::Closure& closure) { 32 void RunSoon(const base::Closure& closure) {
31 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure); 33 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure);
32 } 34 }
33 35
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 weak_factory_(this) { 72 weak_factory_(this) {
71 internal_.registration = registration; 73 internal_.registration = registration;
72 } 74 }
73 75
74 ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() { 76 ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {
75 DCHECK(!context_ || 77 DCHECK(!context_ ||
76 phase_ == INITIAL || phase_ == COMPLETE || phase_ == ABORT) 78 phase_ == INITIAL || phase_ == COMPLETE || phase_ == ABORT)
77 << "Jobs should only be interrupted during shutdown."; 79 << "Jobs should only be interrupted during shutdown.";
78 } 80 }
79 81
82 class ServiceWorkerRegisterJob::InstallEventMethodsReceiver
shimazu 2017/04/24 05:00:13 This is not necessary to be an inner class of Serv
xiaofengzhang 2017/04/25 06:01:29 Done.
83 : public mojom::ServiceWorkerInstallEventMethods {
84 public:
85 static mojom::ServiceWorkerInstallEventMethodsAssociatedPtrInfo CreateAndBind(
86 const base::WeakPtr<ServiceWorkerRegisterJob>& job) {
87 mojom::ServiceWorkerInstallEventMethodsAssociatedPtrInfo ptr_info;
88 auto request = mojo::MakeRequest(&ptr_info);
89 mojo::MakeStrongAssociatedBinding(
shimazu 2017/04/24 05:00:13 I feel managing its lifecycle in browser process i
leonhsl(Using Gerrit) 2017/04/24 05:34:26 In some cases the callback(OnInstallFinished()) of
shimazu 2017/04/24 06:22:18 Thanks for explanation! It makes sense. If we hav
leonhsl(Using Gerrit) 2017/04/24 06:37:38 Oh I see.. I think you're right, even if EventDisp
xiaofengzhang 2017/04/25 06:01:29 Done.
90 base::WrapUnique(new InstallEventMethodsReceiver(job)),
leonhsl(Using Gerrit) 2017/04/23 03:33:10 Use base::MakeUnique instead.
xiaofengzhang 2017/04/24 05:02:40 Done.
91 std::move(request));
92 return ptr_info;
93 }
94
95 InstallEventMethodsReceiver(
96 const base::WeakPtr<ServiceWorkerRegisterJob>& job)
97 : job_(job) {}
98 ~InstallEventMethodsReceiver() override {}
99
100 // mojom::ServiceWorkerInstallEventMethod implementation.
101 void RegisterForeignFetchScopes(
102 const std::vector<GURL>& sub_scopes,
103 const std::vector<url::Origin>& origins) override {
104 if (!job_)
105 return;
106 job_->new_version()->RegisterForeignFetchScopes(sub_scopes, origins);
107 }
108
109 private:
110 base::WeakPtr<ServiceWorkerRegisterJob> job_;
111 };
112
80 void ServiceWorkerRegisterJob::AddCallback( 113 void ServiceWorkerRegisterJob::AddCallback(
81 const RegistrationCallback& callback, 114 const RegistrationCallback& callback,
82 ServiceWorkerProviderHost* provider_host) { 115 ServiceWorkerProviderHost* provider_host) {
83 if (!is_promise_resolved_) { 116 if (!is_promise_resolved_) {
84 callbacks_.push_back(callback); 117 callbacks_.push_back(callback);
85 if (provider_host) 118 if (provider_host)
86 provider_host->AddScopedProcessReferenceToPattern(pattern_); 119 provider_host->AddScopedProcessReferenceToPattern(pattern_);
87 return; 120 return;
88 } 121 }
89 RunSoon(base::Bind(callback, promise_resolved_status_, 122 RunSoon(base::Bind(callback, promise_resolved_status_,
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 457
425 void ServiceWorkerRegisterJob::DispatchInstallEvent() { 458 void ServiceWorkerRegisterJob::DispatchInstallEvent() {
426 DCHECK_EQ(ServiceWorkerVersion::INSTALLING, new_version()->status()) 459 DCHECK_EQ(ServiceWorkerVersion::INSTALLING, new_version()->status())
427 << new_version()->status(); 460 << new_version()->status();
428 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, new_version()->running_status()) 461 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, new_version()->running_status())
429 << "Worker stopped too soon after it was started."; 462 << "Worker stopped too soon after it was started.";
430 int request_id = new_version()->StartRequest( 463 int request_id = new_version()->StartRequest(
431 ServiceWorkerMetrics::EventType::INSTALL, 464 ServiceWorkerMetrics::EventType::INSTALL,
432 base::Bind(&ServiceWorkerRegisterJob::OnInstallFailed, 465 base::Bind(&ServiceWorkerRegisterJob::OnInstallFailed,
433 weak_factory_.GetWeakPtr())); 466 weak_factory_.GetWeakPtr()));
434 new_version() 467
435 ->RegisterRequestCallback<ServiceWorkerHostMsg_InstallEventFinished>( 468 new_version()->event_dispatcher()->DispatchInstallEvent(
436 request_id, base::Bind(&ServiceWorkerRegisterJob::OnInstallFinished, 469 InstallEventMethodsReceiver::CreateAndBind(weak_factory_.GetWeakPtr()),
437 weak_factory_.GetWeakPtr())); 470 base::Bind(&ServiceWorkerRegisterJob::OnInstallFinished,
shimazu 2017/04/24 05:00:13 To clarify InstallEventMethodsReceiver is valid on
xiaofengzhang 2017/04/25 06:01:28 Done.
438 new_version()->DispatchEvent({request_id}, 471 weak_factory_.GetWeakPtr(), request_id));
439 ServiceWorkerMsg_InstallEvent(request_id));
440 } 472 }
441 473
442 void ServiceWorkerRegisterJob::OnInstallFinished( 474 void ServiceWorkerRegisterJob::OnInstallFinished(
443 int request_id, 475 int request_id,
444 blink::WebServiceWorkerEventResult result, 476 ServiceWorkerStatusCode status,
445 bool has_fetch_handler, 477 bool has_fetch_handler,
446 base::Time dispatch_event_time) { 478 base::Time dispatch_event_time) {
447 new_version()->FinishRequest( 479 new_version()->FinishRequest(request_id, status == SERVICE_WORKER_OK,
448 request_id, result == blink::kWebServiceWorkerEventResultCompleted, 480 dispatch_event_time);
449 dispatch_event_time);
450
451 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
452 switch (result) {
453 case blink::kWebServiceWorkerEventResultCompleted:
454 status = SERVICE_WORKER_OK;
455 break;
456 case blink::kWebServiceWorkerEventResultRejected:
457 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED;
458 break;
459 default:
460 NOTREACHED();
461 }
462 481
463 if (status != SERVICE_WORKER_OK) { 482 if (status != SERVICE_WORKER_OK) {
464 OnInstallFailed(status); 483 OnInstallFailed(status);
465 return; 484 return;
466 } 485 }
467 486
468 ServiceWorkerMetrics::RecordInstallEventStatus(status); 487 ServiceWorkerMetrics::RecordInstallEventStatus(status);
469 ServiceWorkerMetrics::RecordForeignFetchRegistrationCount( 488 ServiceWorkerMetrics::RecordForeignFetchRegistrationCount(
470 new_version()->foreign_fetch_scopes().size(), 489 new_version()->foreign_fetch_scopes().size(),
471 new_version()->foreign_fetch_origins().size()); 490 new_version()->foreign_fetch_origins().size());
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 new_version()->force_bypass_cache_for_scripts() || 667 new_version()->force_bypass_cache_for_scripts() ||
649 registration()->last_update_check().is_null()) { 668 registration()->last_update_check().is_null()) {
650 registration()->set_last_update_check(base::Time::Now()); 669 registration()->set_last_update_check(base::Time::Now());
651 670
652 if (registration()->has_installed_version()) 671 if (registration()->has_installed_version())
653 context_->storage()->UpdateLastUpdateCheckTime(registration()); 672 context_->storage()->UpdateLastUpdateCheckTime(registration());
654 } 673 }
655 } 674 }
656 675
657 } // namespace content 676 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698