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

Unified Diff: content/browser/navigator_connect/navigator_connect_context_impl.cc

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: rockot nits Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/navigator_connect/navigator_connect_context_impl.cc
diff --git a/content/browser/navigator_connect/navigator_connect_context_impl.cc b/content/browser/navigator_connect/navigator_connect_context_impl.cc
index c46960570919bb5d47a2028ab3cea10878e39e13..c393c4bf45a318321165ec3a6fb7bcb7e7a1d931 100644
--- a/content/browser/navigator_connect/navigator_connect_context_impl.cc
+++ b/content/browser/navigator_connect/navigator_connect_context_impl.cc
@@ -6,6 +6,7 @@
#include <stdint.h>
+#include "base/stl_util.h"
#include "content/browser/message_port_service.h"
#include "content/browser/navigator_connect/service_port_service_impl.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
@@ -13,6 +14,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigator_connect_service_factory.h"
#include "content/public/common/navigator_connect_client.h"
+#include "mojo/common/url_type_converters.h"
namespace content {
@@ -139,8 +141,7 @@ void NavigatorConnectContextImpl::GotServiceWorkerRegistration(
if (status != SERVICE_WORKER_OK) {
// No service worker found, reject connection attempt.
- OnConnectResult(callback, client_port_id, service_port_id, registration,
- status, false, base::string16(), base::string16());
+ OnConnectError(callback, client_port_id, service_port_id, status);
return;
}
@@ -152,10 +153,37 @@ void NavigatorConnectContextImpl::GotServiceWorkerRegistration(
service_port.service_worker_registration_origin =
registration->pattern().GetOrigin();
- active_version->DispatchServicePortConnectEvent(
+ active_version->RunAfterStartWorker(
+ base::Bind(&NavigatorConnectContextImpl::OnConnectError, this, callback,
+ client_port_id, service_port_id),
+ base::Bind(&NavigatorConnectContextImpl::DispatchConnectEvent, this,
+ callback, client_port_id, service_port_id, registration,
+ make_scoped_refptr(active_version)));
+}
+
+void NavigatorConnectContextImpl::DispatchConnectEvent(
+ const ConnectCallback& callback,
+ int client_port_id,
+ int service_port_id,
+ const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
+ const scoped_refptr<ServiceWorkerVersion>& worker) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(ContainsKey(ports_, client_port_id));
+ DCHECK(ContainsKey(ports_, service_port_id));
+
+ const Port& service_port = ports_[service_port_id];
+ int request_id = worker->StartRequest(
+ ServiceWorkerMetrics::EventType::SERVICE_PORT_CONNECT,
+ base::Bind(&NavigatorConnectContextImpl::OnConnectError, this, callback,
+ client_port_id, service_port_id));
+ base::WeakPtr<ServicePortDispatcher> dispatcher =
+ worker->GetMojoServiceForRequest<ServicePortDispatcher>(request_id);
+ dispatcher->Connect(
+ mojo::String::From(service_port.target_url),
+ mojo::String::From(service_port.client_origin), service_port_id,
base::Bind(&NavigatorConnectContextImpl::OnConnectResult, this, callback,
- client_port_id, service_port_id, registration),
- service_port.target_url, service_port.client_origin, service_port_id);
+ client_port_id, service_port_id, service_worker_registration,
+ worker, request_id));
}
void NavigatorConnectContextImpl::ServicePortServiceDestroyed(
@@ -171,26 +199,42 @@ void NavigatorConnectContextImpl::ServicePortServiceDestroyed(
}
}
+void NavigatorConnectContextImpl::OnConnectError(
+ const ConnectCallback& callback,
+ int client_port_id,
+ int service_port_id,
+ ServiceWorkerStatusCode status) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ // Destroy ports since connection failed.
+ ports_.erase(service_port_id);
+ ports_.erase(client_port_id);
+ callback.Run(MSG_ROUTING_NONE, false);
+}
+
void NavigatorConnectContextImpl::OnConnectResult(
const ConnectCallback& callback,
int client_port_id,
int service_port_id,
const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
- ServiceWorkerStatusCode status,
- bool accept_connection,
- const base::string16& name,
- const base::string16& data) {
+ const scoped_refptr<ServiceWorkerVersion>& worker,
+ int request_id,
+ ServicePortConnectResult result,
+ const mojo::String& name,
+ const mojo::String& data) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (accept_connection) {
- // TODO(mek): Might have to do something else if the client connection got
- // severed while the service side connection was being set up.
- callback.Run(client_port_id, true);
- } else {
- // Destroy ports since connection failed.
- ports_.erase(service_port_id);
- ports_.erase(client_port_id);
- callback.Run(MSG_ROUTING_NONE, false);
+
+ if (!worker->FinishRequest(request_id))
+ return;
+
+ if (result != SERVICE_PORT_CONNECT_RESULT_ACCEPT) {
+ OnConnectError(callback, client_port_id, service_port_id,
+ SERVICE_WORKER_ERROR_FAILED);
+ return;
}
+
+ // TODO(mek): Might have to do something else if the client connection got
+ // severed while the service side connection was being set up.
+ callback.Run(client_port_id, true);
}
void NavigatorConnectContextImpl::DeliverMessage(

Powered by Google App Engine
This is Rietveld 408576698