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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/service_worker/service_worker_version.h
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index cbeb65597f94342489405655f80cda93e7520c58..bb54b0c8141331a075c5a42af93c85e664f7b0ae 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -13,6 +13,7 @@
#include "base/basictypes.h"
#include "base/callback.h"
+#include "base/containers/scoped_ptr_hash_map.h"
#include "base/gtest_prod_util.h"
#include "base/id_map.h"
#include "base/memory/ref_counted.h"
@@ -24,7 +25,6 @@
#include "content/browser/service_worker/service_worker_script_cache_map.h"
#include "content/common/background_sync_service.mojom.h"
#include "content/common/content_export.h"
-#include "content/common/service_port_service.mojom.h"
#include "content/common/service_worker/service_worker_status_code.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/public/common/service_registry.h"
@@ -72,11 +72,6 @@ class CONTENT_EXPORT ServiceWorkerVersion
typedef base::Callback<void(ServiceWorkerStatusCode,
ServiceWorkerFetchEventResult,
const ServiceWorkerResponse&)> FetchCallback;
- typedef base::Callback<void(ServiceWorkerStatusCode,
- bool /* accept_connction */,
- const base::string16& /* name */,
- const base::string16& /* data */)>
- ServicePortConnectCallback;
enum RunningStatus {
STOPPED = EmbeddedWorkerInstance::STOPPED,
@@ -177,6 +172,35 @@ class CONTENT_EXPORT ServiceWorkerVersion
// Starts an update now.
void StartUpdate();
+ // Starts the worker if it isn't already running, and calls |task| when the
+ // worker is running, or |error_callback| if starting the worker failed.
+ void RunAfterStartWorker(const StatusCallback& error_callback,
+ const base::Closure& task);
+
+ // Call this while the worker is running before dispatching an event to the
+ // worker. This informs ServiceWorkerVersion about the event in progress.
+ // Returns a request id, which should later be passed to FinishRequest when
+ // the event finished.
+ // The |error_callback| is called if either ServiceWorkerVersion decides the
+ // event is taking too long, or if for some reason the worker stops or is
+ // killed before the request finishes.
+ int StartRequest(const StatusCallback& error_callback);
+
+ // Informs ServiceWorkerVersion that an event has finished being dispatched.
+ // Returns false if no pending requests with the provided id exist, for
+ // example if the request has already timed out.
+ bool FinishRequest(int request_id);
+
+ // Connects to a specific mojo service exposed by the (running) service
+ // worker. If a connection to a service for the same Interface already exists
+ // this will return that existing connection. The |request_id| must be a value
+ // previously returned by StartRequest. If the connection to the service
+ // fails or closes before the request finished, the error callback associated
+ // with |request_id| is called.
+ // Only call GetMojoServiceForRequest once for a specific |request_id|.
+ template <typename Interface>
+ base::WeakPtr<Interface> GetMojoServiceForRequest(int request_id);
+
// Sends a message event to the associated embedded worker.
void DispatchMessageEvent(
const base::string16& message,
@@ -253,16 +277,6 @@ class CONTENT_EXPORT ServiceWorkerVersion
const std::string& region_id,
const blink::WebCircularGeofencingRegion& region);
- // Sends a ServicePort connect event to the associated embedded worker and
- // asynchronously calls |callback| with the response from the worker.
- //
- // This must be called when the status() is ACTIVATED.
- void DispatchServicePortConnectEvent(
- const ServicePortConnectCallback& callback,
- const GURL& target_url,
- const GURL& origin,
- int port_id);
-
// Sends a cross origin message event to the associated embedded worker and
// asynchronously calls |callback| when the message was sent (or failed to
// sent).
@@ -360,6 +374,7 @@ class CONTENT_EXPORT ServiceWorkerVersion
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest,
StaleUpdate_DoNotDeferTimer);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerWaitForeverInFetchTest, RequestTimeout);
+ FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionTest, RequestTimeout);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerFailToStartTest, Timeout);
FRIEND_TEST_ALL_PREFIXES(ServiceWorkerVersionBrowserTest,
TimeoutStartingWorker);
@@ -385,7 +400,7 @@ class CONTENT_EXPORT ServiceWorkerVersion
REQUEST_NOTIFICATION_CLICK,
REQUEST_PUSH,
REQUEST_GEOFENCING,
- REQUEST_SERVICE_PORT_CONNECT,
+ 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
NUM_REQUEST_TYPES
};
@@ -405,6 +420,44 @@ class CONTENT_EXPORT ServiceWorkerVersion
CallbackType callback;
base::TimeTicks start_time;
+ // Name of the mojo service this request is associated with. Used to call
+ // the callback when a connection closes with outstanding requests.
+ // Compared as pointer, so should only contain static strings. Typically
+ // this would be Interface::Name_ for some mojo interface.
+ const char* mojo_service = nullptr;
+ };
+
+ // Base class to enable storing a list of mojo interface pointers for
+ // arbitrary interfaces. The destructor is also responsible for calling the
+ // error callbacks for any outstanding requests using this service.
+ class CONTENT_EXPORT BaseMojoService {
+ public:
+ BaseMojoService(ServiceWorkerVersion* worker, const char* service_name);
+ virtual ~BaseMojoService();
+
+ private:
+ ServiceWorkerVersion* worker_;
+ const char* service_name_;
+ };
+
+ // Wrapper around a mojo::InterfacePtr, which passes out WeakPtr's to the
+ // interface.
+ template <typename Interface>
+ class MojoService : public BaseMojoService {
+ public:
+ MojoService(ServiceWorkerVersion* worker,
+ mojo::InterfacePtr<Interface> interface)
+ : BaseMojoService(worker, Interface::Name_),
+ interface_(std::move(interface)),
+ weak_ptr_factory_(interface_.get()) {}
+
+ base::WeakPtr<Interface> GetWeakPtr() {
+ return weak_ptr_factory_.GetWeakPtr();
+ }
+
+ private:
+ mojo::InterfacePtr<Interface> interface_;
+ base::WeakPtrFactory<Interface> weak_ptr_factory_;
};
typedef ServiceWorkerVersion self;
@@ -475,10 +528,6 @@ class CONTENT_EXPORT ServiceWorkerVersion
void OnPushEventFinished(int request_id,
blink::WebServiceWorkerEventResult result);
void OnGeofencingEventFinished(int request_id);
- void OnServicePortConnectEventFinished(int request_id,
- ServicePortConnectResult result,
- const mojo::String& name,
- const mojo::String& data);
void OnOpenWindow(int request_id, GURL url);
void OnOpenWindowFinished(int request_id,
ServiceWorkerStatusCode status,
@@ -589,9 +638,11 @@ class CONTENT_EXPORT ServiceWorkerVersion
// Called when a connection to a mojo event Dispatcher drops or fails.
// Calls callbacks for any outstanding requests to the dispatcher as well
// as cleans up the dispatcher.
- void OnServicePortDispatcherConnectionError();
void OnBackgroundSyncDispatcherConnectionError();
+ // Called when the remote side of a connection to a mojo service is lost.
+ void OnMojoConnectionError(const char* service_name);
+
// Called at the beginning of each Dispatch*Event function: records
// the time elapsed since idle (generally the time since the previous
// event ended).
@@ -619,12 +670,18 @@ class CONTENT_EXPORT ServiceWorkerVersion
notification_click_requests_;
IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> push_requests_;
IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> geofencing_requests_;
- IDMap<PendingRequest<ServicePortConnectCallback>, IDMapOwnPointer>
- service_port_connect_requests_;
+ IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer> custom_requests_;
- ServicePortDispatcherPtr service_port_dispatcher_;
BackgroundSyncServiceClientPtr background_sync_dispatcher_;
+ // Stores all open connections to mojo services. Maps the service name to
+ // the actual interface pointer. When a connection is closed it is removed
+ // from this map.
+ // mojo_services_[Interface::Name_] is assumed to always contain a
+ // MojoService<Interface> instance.
+ base::ScopedPtrHashMap<const char*, scoped_ptr<BaseMojoService>>
+ mojo_services_;
+
std::set<const ServiceWorkerURLRequestJob*> streaming_url_request_jobs_;
std::map<std::string, ServiceWorkerProviderHost*> controllee_map_;
@@ -679,6 +736,31 @@ class CONTENT_EXPORT ServiceWorkerVersion
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersion);
};
+template <typename Interface>
+base::WeakPtr<Interface> ServiceWorkerVersion::GetMojoServiceForRequest(
+ int request_id) {
+ DCHECK_EQ(RUNNING, running_status());
+ PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id);
+ DCHECK(request) << "Invalid request id";
+ DCHECK(!request->mojo_service)
+ << "Request is already associated with a mojo service";
+
+ MojoService<Interface>* service = static_cast<MojoService<Interface>*>(
+ mojo_services_.get(Interface::Name_));
+ if (!service) {
+ mojo::InterfacePtr<Interface> interface;
+ embedded_worker_->GetServiceRegistry()->ConnectToRemoteService(
+ mojo::GetProxy(&interface));
+ interface.set_connection_error_handler(
+ base::Bind(&ServiceWorkerVersion::OnMojoConnectionError,
+ weak_factory_.GetWeakPtr(), Interface::Name_));
+ service = new MojoService<Interface>(this, std::move(interface));
+ mojo_services_.add(Interface::Name_, make_scoped_ptr(service));
+ }
+ request->mojo_service = Interface::Name_;
+ return service->GetWeakPtr();
+}
+
} // namespace content
#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_VERSION_H_

Powered by Google App Engine
This is Rietveld 408576698