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

Side by Side Diff: content/browser/service_worker/service_worker_version.h

Issue 1264333002: First step to refactor ServiceWorkerVersion to make event dispatching more modular. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years 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 #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_ 5 #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_
6 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_ 6 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_
7 7
8 #include <map> 8 #include <map>
9 #include <queue> 9 #include <queue>
10 #include <set> 10 #include <set>
11 #include <string> 11 #include <string>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/basictypes.h" 14 #include "base/basictypes.h"
15 #include "base/callback.h" 15 #include "base/callback.h"
16 #include "base/containers/scoped_ptr_hash_map.h"
16 #include "base/gtest_prod_util.h" 17 #include "base/gtest_prod_util.h"
17 #include "base/id_map.h" 18 #include "base/id_map.h"
18 #include "base/memory/ref_counted.h" 19 #include "base/memory/ref_counted.h"
19 #include "base/memory/scoped_ptr.h" 20 #include "base/memory/scoped_ptr.h"
20 #include "base/observer_list.h" 21 #include "base/observer_list.h"
21 #include "base/timer/timer.h" 22 #include "base/timer/timer.h"
22 #include "content/browser/background_sync/background_sync_registration_handle.h" 23 #include "content/browser/background_sync/background_sync_registration_handle.h"
23 #include "content/browser/service_worker/embedded_worker_instance.h" 24 #include "content/browser/service_worker/embedded_worker_instance.h"
24 #include "content/browser/service_worker/service_worker_script_cache_map.h" 25 #include "content/browser/service_worker/service_worker_script_cache_map.h"
25 #include "content/common/background_sync_service.mojom.h" 26 #include "content/common/background_sync_service.mojom.h"
26 #include "content/common/content_export.h" 27 #include "content/common/content_export.h"
27 #include "content/common/service_port_service.mojom.h"
28 #include "content/common/service_worker/service_worker_status_code.h" 28 #include "content/common/service_worker/service_worker_status_code.h"
29 #include "content/common/service_worker/service_worker_types.h" 29 #include "content/common/service_worker/service_worker_types.h"
30 #include "content/public/common/service_registry.h" 30 #include "content/public/common/service_registry.h"
31 #include "third_party/WebKit/public/platform/WebGeofencingEventType.h" 31 #include "third_party/WebKit/public/platform/WebGeofencingEventType.h"
32 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerEventResult.h" 32 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerEventResult.h"
33 33
34 // Windows headers will redefine SendMessage. 34 // Windows headers will redefine SendMessage.
35 #ifdef SendMessage 35 #ifdef SendMessage
36 #undef SendMessage 36 #undef SendMessage
37 #endif 37 #endif
(...skipping 27 matching lines...) Expand all
65 // one of them is activated. This class connects the actual script with a 65 // one of them is activated. This class connects the actual script with a
66 // running worker. 66 // running worker.
67 class CONTENT_EXPORT ServiceWorkerVersion 67 class CONTENT_EXPORT ServiceWorkerVersion
68 : NON_EXPORTED_BASE(public base::RefCounted<ServiceWorkerVersion>), 68 : NON_EXPORTED_BASE(public base::RefCounted<ServiceWorkerVersion>),
69 public EmbeddedWorkerInstance::Listener { 69 public EmbeddedWorkerInstance::Listener {
70 public: 70 public:
71 typedef base::Callback<void(ServiceWorkerStatusCode)> StatusCallback; 71 typedef base::Callback<void(ServiceWorkerStatusCode)> StatusCallback;
72 typedef base::Callback<void(ServiceWorkerStatusCode, 72 typedef base::Callback<void(ServiceWorkerStatusCode,
73 ServiceWorkerFetchEventResult, 73 ServiceWorkerFetchEventResult,
74 const ServiceWorkerResponse&)> FetchCallback; 74 const ServiceWorkerResponse&)> FetchCallback;
75 typedef base::Callback<void(ServiceWorkerStatusCode,
76 bool /* accept_connction */,
77 const base::string16& /* name */,
78 const base::string16& /* data */)>
79 ServicePortConnectCallback;
80 75
81 enum RunningStatus { 76 enum RunningStatus {
82 STOPPED = EmbeddedWorkerInstance::STOPPED, 77 STOPPED = EmbeddedWorkerInstance::STOPPED,
83 STARTING = EmbeddedWorkerInstance::STARTING, 78 STARTING = EmbeddedWorkerInstance::STARTING,
84 RUNNING = EmbeddedWorkerInstance::RUNNING, 79 RUNNING = EmbeddedWorkerInstance::RUNNING,
85 STOPPING = EmbeddedWorkerInstance::STOPPING, 80 STOPPING = EmbeddedWorkerInstance::STOPPING,
86 }; 81 };
87 82
88 // Current version status; some of the status (e.g. INSTALLED and ACTIVATED) 83 // Current version status; some of the status (e.g. INSTALLED and ACTIVATED)
89 // should be persisted unlike running status. 84 // should be persisted unlike running status.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 // Schedules an update to be run 'soon'. 165 // Schedules an update to be run 'soon'.
171 void ScheduleUpdate(); 166 void ScheduleUpdate();
172 167
173 // If an update is scheduled but not yet started, this resets the timer 168 // If an update is scheduled but not yet started, this resets the timer
174 // delaying the start time by a 'small' amount. 169 // delaying the start time by a 'small' amount.
175 void DeferScheduledUpdate(); 170 void DeferScheduledUpdate();
176 171
177 // Starts an update now. 172 // Starts an update now.
178 void StartUpdate(); 173 void StartUpdate();
179 174
175 // Starts the worker if it isn't already running, and calls |task| when the
176 // worker is running, or |error_callback| if starting the worker failed.
177 void RunAfterStartWorker(const StatusCallback& error_callback,
178 const base::Closure& task);
179
180 // Call this while the worker is running before dispatching an event to the
181 // worker. This informs ServiceWorkerVersion about the event in progress.
182 // Returns a request id, which should later be passed to FinishRequest when
183 // the event finished.
184 // The |error_callback| is called if either ServiceWorkerVersion decides the
185 // event is taking too long, or if for some reason the worker stops or is
186 // killed before the request finishes.
187 int StartRequest(const StatusCallback& error_callback);
188
189 // Informs ServiceWorkerVersion that an event has finished being dispatched.
190 // Returns false if no pending requests with the provided id exist, for
191 // example if the request has already timed out.
192 bool FinishRequest(int request_id);
193
194 // Connects to a specific mojo service exposed by the (running) service
195 // worker. If a connection to a service for the same Interface already exists
196 // this will return that existing connection. The |request_id| must be a value
197 // previously returned by StartRequest. If the connection to the service
198 // fails or closes before the request finished, the error callback associated
199 // with |request_id| is called.
200 // Only call GetMojoServiceForRequest once for a specific |request_id|.
201 template <typename Interface>
202 base::WeakPtr<Interface> GetMojoServiceForRequest(int request_id);
203
180 // Sends a message event to the associated embedded worker. 204 // Sends a message event to the associated embedded worker.
181 void DispatchMessageEvent( 205 void DispatchMessageEvent(
182 const base::string16& message, 206 const base::string16& message,
183 const std::vector<TransferredMessagePort>& sent_message_ports, 207 const std::vector<TransferredMessagePort>& sent_message_ports,
184 const StatusCallback& callback); 208 const StatusCallback& callback);
185 209
186 // Sends install event to the associated embedded worker and asynchronously 210 // Sends install event to the associated embedded worker and asynchronously
187 // calls |callback| when it errors out or it gets a response from the worker 211 // calls |callback| when it errors out or it gets a response from the worker
188 // to notify install completion. 212 // to notify install completion.
189 // 213 //
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 // calls |callback| when it errors out or it gets a response from the worker 270 // calls |callback| when it errors out or it gets a response from the worker
247 // to notify completion. 271 // to notify completion.
248 // 272 //
249 // This must be called when the status() is ACTIVATED. 273 // This must be called when the status() is ACTIVATED.
250 void DispatchGeofencingEvent( 274 void DispatchGeofencingEvent(
251 const StatusCallback& callback, 275 const StatusCallback& callback,
252 blink::WebGeofencingEventType event_type, 276 blink::WebGeofencingEventType event_type,
253 const std::string& region_id, 277 const std::string& region_id,
254 const blink::WebCircularGeofencingRegion& region); 278 const blink::WebCircularGeofencingRegion& region);
255 279
256 // Sends a ServicePort connect event to the associated embedded worker and
257 // asynchronously calls |callback| with the response from the worker.
258 //
259 // This must be called when the status() is ACTIVATED.
260 void DispatchServicePortConnectEvent(
261 const ServicePortConnectCallback& callback,
262 const GURL& target_url,
263 const GURL& origin,
264 int port_id);
265
266 // Sends a cross origin message event to the associated embedded worker and 280 // Sends a cross origin message event to the associated embedded worker and
267 // asynchronously calls |callback| when the message was sent (or failed to 281 // asynchronously calls |callback| when the message was sent (or failed to
268 // sent). 282 // sent).
269 // It is the responsibility of the code calling this method to make sure that 283 // It is the responsibility of the code calling this method to make sure that
270 // any transferred message ports are put on hold while potentially a process 284 // any transferred message ports are put on hold while potentially a process
271 // for the service worker is spun up. 285 // for the service worker is spun up.
272 // 286 //
273 // This must be called when the status() is ACTIVATED. 287 // This must be called when the status() is ACTIVATED.
274 void DispatchCrossOriginMessageEvent( 288 void DispatchCrossOriginMessageEvent(
275 const NavigatorConnectClient& client, 289 const NavigatorConnectClient& client,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, IdleTimeout); 367 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, IdleTimeout);
354 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, SetDevToolsAttached); 368 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, SetDevToolsAttached);
355 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, StaleUpdate_FreshWorker); 369 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, StaleUpdate_FreshWorker);
356 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, 370 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest,
357 StaleUpdate_NonActiveWorker); 371 StaleUpdate_NonActiveWorker);
358 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, StaleUpdate_StartWorker); 372 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, StaleUpdate_StartWorker);
359 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, StaleUpdate_RunningWorker); 373 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, StaleUpdate_RunningWorker);
360 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, 374 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest,
361 StaleUpdate_DoNotDeferTimer); 375 StaleUpdate_DoNotDeferTimer);
362 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWaitForeverInFetchTest, RequestTimeout); 376 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWaitForeverInFetchTest, RequestTimeout);
377 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, RequestTimeout);
363 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerFailToStartTest, Timeout); 378 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerFailToStartTest, Timeout);
364 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionBrowserTest, 379 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionBrowserTest,
365 TimeoutStartingWorker); 380 TimeoutStartingWorker);
366 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionBrowserTest, 381 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionBrowserTest,
367 TimeoutWorkerInEvent); 382 TimeoutWorkerInEvent);
368 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerStallInStoppingTest, DetachThenStart); 383 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerStallInStoppingTest, DetachThenStart);
369 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerStallInStoppingTest, DetachThenRestart); 384 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerStallInStoppingTest, DetachThenRestart);
370 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, 385 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest,
371 RegisterForeignFetchScopes); 386 RegisterForeignFetchScopes);
372 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, RequestCustomizedTimeout); 387 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, RequestCustomizedTimeout);
373 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWaitForeverInFetchTest, 388 FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWaitForeverInFetchTest,
374 MixedRequestTimeouts); 389 MixedRequestTimeouts);
375 390
376 class Metrics; 391 class Metrics;
377 class PingController; 392 class PingController;
378 393
379 // Used for UMA; add new entries to the end, before NUM_REQUEST_TYPES. 394 // Used for UMA; add new entries to the end, before NUM_REQUEST_TYPES.
380 enum RequestType { 395 enum RequestType {
381 REQUEST_ACTIVATE, 396 REQUEST_ACTIVATE,
382 REQUEST_INSTALL, 397 REQUEST_INSTALL,
383 REQUEST_FETCH, 398 REQUEST_FETCH,
384 REQUEST_SYNC, 399 REQUEST_SYNC,
385 REQUEST_NOTIFICATION_CLICK, 400 REQUEST_NOTIFICATION_CLICK,
386 REQUEST_PUSH, 401 REQUEST_PUSH,
387 REQUEST_GEOFENCING, 402 REQUEST_GEOFENCING,
388 REQUEST_SERVICE_PORT_CONNECT, 403 REQUEST_CUSTOM,
nhiroki 2016/01/05 09:33:24 I think it'd be better that each event has a uniqu
Marijn Kruisselbrink 2016/01/05 23:23:16 Currently my approach was to add necessary functio
nhiroki 2016/01/06 10:13:57 Thank you for the explanation. On 2016/01/05 23:2
Marijn Kruisselbrink 2016/01/07 00:59:08 Ah yes, not sure how I missed the "Used for UMA" c
389 NUM_REQUEST_TYPES 404 NUM_REQUEST_TYPES
390 }; 405 };
391 406
392 struct RequestInfo { 407 struct RequestInfo {
393 RequestInfo(int id, RequestType type, const base::TimeTicks& expiration); 408 RequestInfo(int id, RequestType type, const base::TimeTicks& expiration);
394 ~RequestInfo(); 409 ~RequestInfo();
395 bool operator>(const RequestInfo& other) const; 410 bool operator>(const RequestInfo& other) const;
396 int id; 411 int id;
397 RequestType type; 412 RequestType type;
398 base::TimeTicks expiration; 413 base::TimeTicks expiration;
399 }; 414 };
400 415
401 template <typename CallbackType> 416 template <typename CallbackType>
402 struct PendingRequest { 417 struct PendingRequest {
403 PendingRequest(const CallbackType& callback, const base::TimeTicks& time); 418 PendingRequest(const CallbackType& callback, const base::TimeTicks& time);
404 ~PendingRequest(); 419 ~PendingRequest();
405 420
406 CallbackType callback; 421 CallbackType callback;
407 base::TimeTicks start_time; 422 base::TimeTicks start_time;
423 // Name of the mojo service this request is associated with. Used to call
424 // the callback when a connection closes with outstanding requests.
425 // Compared as pointer, so should only contain static strings. Typically
426 // this would be Interface::Name_ for some mojo interface.
427 const char* mojo_service = nullptr;
428 };
429
430 // Base class to enable storing a list of mojo interface pointers for
431 // arbitrary interfaces. The destructor is also responsible for calling the
432 // error callbacks for any outstanding requests using this service.
433 class CONTENT_EXPORT BaseMojoService {
434 public:
435 BaseMojoService(ServiceWorkerVersion* worker, const char* service_name);
436 virtual ~BaseMojoService();
437
438 private:
439 ServiceWorkerVersion* worker_;
440 const char* service_name_;
441 };
442
443 // Wrapper around a mojo::InterfacePtr, which passes out WeakPtr's to the
444 // interface.
445 template <typename Interface>
446 class MojoService : public BaseMojoService {
447 public:
448 MojoService(ServiceWorkerVersion* worker,
449 mojo::InterfacePtr<Interface> interface)
450 : BaseMojoService(worker, Interface::Name_),
451 interface_(std::move(interface)),
452 weak_ptr_factory_(interface_.get()) {}
453
454 base::WeakPtr<Interface> GetWeakPtr() {
455 return weak_ptr_factory_.GetWeakPtr();
456 }
457
458 private:
459 mojo::InterfacePtr<Interface> interface_;
460 base::WeakPtrFactory<Interface> weak_ptr_factory_;
408 }; 461 };
409 462
410 typedef ServiceWorkerVersion self; 463 typedef ServiceWorkerVersion self;
411 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>; 464 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>;
412 using RequestInfoPriorityQueue = 465 using RequestInfoPriorityQueue =
413 std::priority_queue<RequestInfo, 466 std::priority_queue<RequestInfo,
414 std::vector<RequestInfo>, 467 std::vector<RequestInfo>,
415 std::greater<RequestInfo>>; 468 std::greater<RequestInfo>>;
416 469
417 // The timeout timer interval. 470 // The timeout timer interval.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 void OnInstallEventFinished(int request_id, 521 void OnInstallEventFinished(int request_id,
469 blink::WebServiceWorkerEventResult result); 522 blink::WebServiceWorkerEventResult result);
470 void OnFetchEventFinished(int request_id, 523 void OnFetchEventFinished(int request_id,
471 ServiceWorkerFetchEventResult result, 524 ServiceWorkerFetchEventResult result,
472 const ServiceWorkerResponse& response); 525 const ServiceWorkerResponse& response);
473 void OnSyncEventFinished(int request_id, ServiceWorkerEventStatus status); 526 void OnSyncEventFinished(int request_id, ServiceWorkerEventStatus status);
474 void OnNotificationClickEventFinished(int request_id); 527 void OnNotificationClickEventFinished(int request_id);
475 void OnPushEventFinished(int request_id, 528 void OnPushEventFinished(int request_id,
476 blink::WebServiceWorkerEventResult result); 529 blink::WebServiceWorkerEventResult result);
477 void OnGeofencingEventFinished(int request_id); 530 void OnGeofencingEventFinished(int request_id);
478 void OnServicePortConnectEventFinished(int request_id,
479 ServicePortConnectResult result,
480 const mojo::String& name,
481 const mojo::String& data);
482 void OnOpenWindow(int request_id, GURL url); 531 void OnOpenWindow(int request_id, GURL url);
483 void OnOpenWindowFinished(int request_id, 532 void OnOpenWindowFinished(int request_id,
484 ServiceWorkerStatusCode status, 533 ServiceWorkerStatusCode status,
485 const std::string& client_uuid, 534 const std::string& client_uuid,
486 const ServiceWorkerClientInfo& client_info); 535 const ServiceWorkerClientInfo& client_info);
487 536
488 void OnSetCachedMetadata(const GURL& url, const std::vector<char>& data); 537 void OnSetCachedMetadata(const GURL& url, const std::vector<char>& data);
489 void OnSetCachedMetadataFinished(int64 callback_id, int result); 538 void OnSetCachedMetadataFinished(int64 callback_id, int result);
490 void OnClearCachedMetadata(const GURL& url); 539 void OnClearCachedMetadata(const GURL& url);
491 void OnClearCachedMetadataFinished(int64 callback_id, int result); 540 void OnClearCachedMetadataFinished(int64 callback_id, int result);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 631
583 void FoundRegistrationForUpdate( 632 void FoundRegistrationForUpdate(
584 ServiceWorkerStatusCode status, 633 ServiceWorkerStatusCode status,
585 const scoped_refptr<ServiceWorkerRegistration>& registration); 634 const scoped_refptr<ServiceWorkerRegistration>& registration);
586 635
587 void OnStoppedInternal(EmbeddedWorkerInstance::Status old_status); 636 void OnStoppedInternal(EmbeddedWorkerInstance::Status old_status);
588 637
589 // Called when a connection to a mojo event Dispatcher drops or fails. 638 // Called when a connection to a mojo event Dispatcher drops or fails.
590 // Calls callbacks for any outstanding requests to the dispatcher as well 639 // Calls callbacks for any outstanding requests to the dispatcher as well
591 // as cleans up the dispatcher. 640 // as cleans up the dispatcher.
592 void OnServicePortDispatcherConnectionError();
593 void OnBackgroundSyncDispatcherConnectionError(); 641 void OnBackgroundSyncDispatcherConnectionError();
594 642
643 // Called when the remote side of a connection to a mojo service is lost.
644 void OnMojoConnectionError(const char* service_name);
645
595 // Called at the beginning of each Dispatch*Event function: records 646 // Called at the beginning of each Dispatch*Event function: records
596 // the time elapsed since idle (generally the time since the previous 647 // the time elapsed since idle (generally the time since the previous
597 // event ended). 648 // event ended).
598 void OnBeginEvent(); 649 void OnBeginEvent();
599 650
600 const int64 version_id_; 651 const int64 version_id_;
601 const int64 registration_id_; 652 const int64 registration_id_;
602 const GURL script_url_; 653 const GURL script_url_;
603 const GURL scope_; 654 const GURL scope_;
604 std::vector<GURL> foreign_fetch_scopes_; 655 std::vector<GURL> foreign_fetch_scopes_;
605 656
606 Status status_ = NEW; 657 Status status_ = NEW;
607 scoped_ptr<EmbeddedWorkerInstance> embedded_worker_; 658 scoped_ptr<EmbeddedWorkerInstance> embedded_worker_;
608 std::vector<StatusCallback> start_callbacks_; 659 std::vector<StatusCallback> start_callbacks_;
609 std::vector<StatusCallback> stop_callbacks_; 660 std::vector<StatusCallback> stop_callbacks_;
610 std::vector<base::Closure> status_change_callbacks_; 661 std::vector<base::Closure> status_change_callbacks_;
611 662
612 // Message callbacks. (Update HasInflightRequests() too when you update this 663 // Message callbacks. (Update HasInflightRequests() too when you update this
613 // list.) 664 // list.)
614 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> activate_requests_; 665 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> activate_requests_;
615 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> install_requests_; 666 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> install_requests_;
616 IDMap<PendingRequest<FetchCallback>, IDMapOwnPointer> fetch_requests_; 667 IDMap<PendingRequest<FetchCallback>, IDMapOwnPointer> fetch_requests_;
617 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> sync_requests_; 668 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> sync_requests_;
618 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> 669 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer>
619 notification_click_requests_; 670 notification_click_requests_;
620 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> push_requests_; 671 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> push_requests_;
621 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> geofencing_requests_; 672 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> geofencing_requests_;
622 IDMap<PendingRequest<ServicePortConnectCallback>, IDMapOwnPointer> 673 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> custom_requests_;
623 service_port_connect_requests_;
624 674
625 ServicePortDispatcherPtr service_port_dispatcher_;
626 BackgroundSyncServiceClientPtr background_sync_dispatcher_; 675 BackgroundSyncServiceClientPtr background_sync_dispatcher_;
627 676
677 // Stores all open connections to mojo services. Maps the service name to
678 // the actual interface pointer. When a connection is closed it is removed
679 // from this map.
680 // mojo_services_[Interface::Name_] is assumed to always contain a
681 // MojoService<Interface> instance.
682 base::ScopedPtrHashMap<const char*, scoped_ptr<BaseMojoService>>
683 mojo_services_;
684
628 std::set<const ServiceWorkerURLRequestJob*> streaming_url_request_jobs_; 685 std::set<const ServiceWorkerURLRequestJob*> streaming_url_request_jobs_;
629 686
630 std::map<std::string, ServiceWorkerProviderHost*> controllee_map_; 687 std::map<std::string, ServiceWorkerProviderHost*> controllee_map_;
631 // Will be null while shutting down. 688 // Will be null while shutting down.
632 base::WeakPtr<ServiceWorkerContextCore> context_; 689 base::WeakPtr<ServiceWorkerContextCore> context_;
633 base::ObserverList<Listener> listeners_; 690 base::ObserverList<Listener> listeners_;
634 ServiceWorkerScriptCacheMap script_cache_map_; 691 ServiceWorkerScriptCacheMap script_cache_map_;
635 base::OneShotTimer update_timer_; 692 base::OneShotTimer update_timer_;
636 693
637 // Starts running in StartWorker and continues until the worker is stopped. 694 // Starts running in StartWorker and continues until the worker is stopped.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 729
673 scoped_ptr<PingController> ping_controller_; 730 scoped_ptr<PingController> ping_controller_;
674 scoped_ptr<Metrics> metrics_; 731 scoped_ptr<Metrics> metrics_;
675 const bool should_exclude_from_uma_ = false; 732 const bool should_exclude_from_uma_ = false;
676 733
677 base::WeakPtrFactory<ServiceWorkerVersion> weak_factory_; 734 base::WeakPtrFactory<ServiceWorkerVersion> weak_factory_;
678 735
679 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersion); 736 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersion);
680 }; 737 };
681 738
739 template <typename Interface>
740 base::WeakPtr<Interface> ServiceWorkerVersion::GetMojoServiceForRequest(
741 int request_id) {
742 DCHECK_EQ(RUNNING, running_status());
743 PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id);
744 DCHECK(request) << "Invalid request id";
745 DCHECK(!request->mojo_service)
746 << "Request is already associated with a mojo service";
747
748 MojoService<Interface>* service = static_cast<MojoService<Interface>*>(
749 mojo_services_.get(Interface::Name_));
750 if (!service) {
751 mojo::InterfacePtr<Interface> interface;
752 embedded_worker_->GetServiceRegistry()->ConnectToRemoteService(
753 mojo::GetProxy(&interface));
754 interface.set_connection_error_handler(
755 base::Bind(&ServiceWorkerVersion::OnMojoConnectionError,
756 weak_factory_.GetWeakPtr(), Interface::Name_));
757 service = new MojoService<Interface>(this, std::move(interface));
758 mojo_services_.add(Interface::Name_, make_scoped_ptr(service));
759 }
760 request->mojo_service = Interface::Name_;
761 return service->GetWeakPtr();
762 }
763
682 } // namespace content 764 } // namespace content
683 765
684 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_ 766 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698