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

Side by Side Diff: content/browser/push_messaging_router.cc

Issue 340773006: Dispatch push event to worker from PushServiceImpl#OnMessage. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleanup. Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « content/browser/push_messaging_router.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/push_messaging_router.h"
6
7 #include "base/bind.h"
8 #include "content/browser/service_worker/service_worker_context_wrapper.h"
9 #include "content/browser/service_worker/service_worker_registration.h"
10 #include "content/browser/service_worker/service_worker_storage.h"
11 #include "content/public/browser/browser_context.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/storage_partition.h"
14
15 namespace content {
16
17 // static
18 void PushMessagingRouter::DeliverMessage(
19 BrowserContext* browser_context,
20 const GURL& origin,
21 int64 service_worker_registration_id,
22 const std::string& data,
23 const DeliverMessageCallback& deliver_message_callback) {
24 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
25 StoragePartition* partition =
26 BrowserContext::GetStoragePartitionForSite(browser_context, origin);
27 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context =
28 static_cast<ServiceWorkerContextWrapper*>(
29 partition->GetServiceWorkerContext());
30 BrowserThread::PostTask(
31 BrowserThread::IO,
32 FROM_HERE,
33 base::Bind(&PushMessagingRouter::FindServiceWorkerRegistration,
34 origin,
35 service_worker_registration_id,
36 data,
37 deliver_message_callback,
38 service_worker_context));
39 }
40
41 // static
42 void PushMessagingRouter::FindServiceWorkerRegistration(
43 const GURL& origin,
44 int64 service_worker_registration_id,
45 const std::string& data,
46 const DeliverMessageCallback& deliver_message_callback,
47 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) {
48 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
49 // Try to acquire the registration from storage. If it's already live we'll
50 // receive it right away. If not, it will be revived from storage.
51 service_worker_context->context()->storage()->FindRegistrationForId(
52 service_worker_registration_id,
53 origin,
54 base::Bind(&PushMessagingRouter::FindServiceWorkerRegistrationCallback,
55 data,
56 deliver_message_callback));
57 }
58
59 // static
60 void PushMessagingRouter::FindServiceWorkerRegistrationCallback(
61 const std::string& data,
62 const DeliverMessageCallback& deliver_message_callback,
63 ServiceWorkerStatusCode service_worker_status,
64 const scoped_refptr<ServiceWorkerRegistration>&
65 service_worker_registration) {
66 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
67 if (service_worker_status == SERVICE_WORKER_OK) {
68 // Hold on to the service worker registration in the callback to keep it
69 // alive until the callback dies. Otherwise the registration could be
70 // released when this method returns - before the event is delivered to the
71 // service worker.
72 base::Callback<void(ServiceWorkerStatusCode)> dispatch_event_callback =
73 base::Bind(&PushMessagingRouter::DeliverMessageEnd,
74 deliver_message_callback,
75 service_worker_registration);
76 service_worker_registration->active_version()->DispatchPushEvent(
77 dispatch_event_callback, data);
78 } else {
79 // TODO(mvanouwerkerk): UMA logging.
80 BrowserThread::PostTask(
81 BrowserThread::UI,
82 FROM_HERE,
83 base::Bind(
84 deliver_message_callback,
85 PUSH_MESSAGING_STATUS_MESSAGE_DELIVERY_FAILED_NO_SERVICE_WORKER));
86 }
87 }
88
89 // static
90 void PushMessagingRouter::DeliverMessageEnd(
91 const DeliverMessageCallback& deliver_message_callback,
92 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
93 ServiceWorkerStatusCode service_worker_status) {
94 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
95 // TODO(mvanouwerkerk): UMA logging.
96 PushMessagingStatus push_messaging_status =
97 service_worker_status == SERVICE_WORKER_OK
98 ? PUSH_MESSAGING_STATUS_OK
99 : PUSH_MESSAGING_STATUS_MESSAGE_DELIVERY_FAILED_SERVICE_WORKER_ERROR;
100 BrowserThread::PostTask(
101 BrowserThread::UI,
102 FROM_HERE,
103 base::Bind(deliver_message_callback, push_messaging_status));
104 }
105
106 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/push_messaging_router.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698