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

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

Issue 861373002: Refactor navigator.connect code to make it more flexible. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: lower similarity threshold Created 5 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.cc b/content/browser/navigator_connect/navigator_connect_context_impl.cc
similarity index 19%
copy from content/browser/navigator_connect/navigator_connect_context.cc
copy to content/browser/navigator_connect/navigator_connect_context_impl.cc
index 45d6a6f6cf74f17072ed984b4038c4d921e8f806..849028ec00404409c2b7d2484668a8701fbfc1ea 100644
--- a/content/browser/navigator_connect/navigator_connect_context.cc
+++ b/content/browser/navigator_connect/navigator_connect_context_impl.cc
@@ -2,90 +2,92 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/browser/navigator_connect/navigator_connect_context.h"
+#include "content/browser/navigator_connect/navigator_connect_context_impl.h"
#include "content/browser/message_port_service.h"
-#include "content/browser/service_worker/service_worker_context_wrapper.h"
-#include "content/browser/service_worker/service_worker_utils.h"
-#include "content/common/navigator_connect_types.h"
+#include "content/public/browser/navigator_connect_service.h"
+#include "content/public/browser/navigator_connect_service_factory.h"
+#include "content/public/common/navigator_connect_client.h"
namespace content {
-struct NavigatorConnectContext::Connection {
- CrossOriginServiceWorkerClient client;
- int64 service_worker_registration_id;
- GURL service_worker_registration_origin;
-};
+NavigatorConnectContextImpl::NavigatorConnectContextImpl() {
+}
+
+NavigatorConnectContextImpl::~NavigatorConnectContextImpl() {
+}
-NavigatorConnectContext::NavigatorConnectContext(
- const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context)
- : service_worker_context_(service_worker_context) {
+void NavigatorConnectContextImpl::AddFactory(
+ scoped_ptr<NavigatorConnectServiceFactory> factory) {
+ service_factories_.push_back(factory.release());
}
-NavigatorConnectContext::~NavigatorConnectContext() {
+void NavigatorConnectContextImpl::Connect(const NavigatorConnectClient& client,
+ const ConnectCallback& callback) {
+ // Hold messages for port while setting up connection.
+ MessagePortService::GetInstance()->HoldMessages(client.message_port_id);
+
+ // Find factory to handle request, more recently added factories should take
+ // priority.
scheib 2015/01/23 22:03:58 take priority as per comment at NavigatorConnectCo
Marijn Kruisselbrink 2015/01/26 21:34:26 Done.
+ NavigatorConnectServiceFactory* factory = nullptr;
+ for (auto it = service_factories_.rbegin(); it != service_factories_.rend();
+ ++it) {
+ if ((*it)->HandlesUrl(client.target_url)) {
+ factory = *it;
+ break;
+ }
+ }
+
+ if (!factory) {
+ // No factories found.
+ // Close port since connection failed.
+ MessagePortService::GetInstance()->ClosePort(client.message_port_id);
+ callback.Run(false);
+ return;
+ }
+
+ // Actually initiate connection.
+ factory->Connect(
+ client, base::Bind(&NavigatorConnectContextImpl::OnConnectResult, this,
+ client, callback));
}
-void NavigatorConnectContext::RegisterConnection(
- const CrossOriginServiceWorkerClient& client,
- const scoped_refptr<ServiceWorkerRegistration>&
- service_worker_registration) {
- MessagePortService::GetInstance()->UpdateMessagePort(
- client.message_port_id, this, client.message_port_id);
- MessagePortService::GetInstance()->ReleaseMessages(client.message_port_id);
- Connection& connection = connections_[client.message_port_id];
- connection.client = client;
- connection.service_worker_registration_id = service_worker_registration->id();
- connection.service_worker_registration_origin =
- service_worker_registration->pattern().GetOrigin();
+void NavigatorConnectContextImpl::OnConnectResult(
+ const NavigatorConnectClient& client,
+ const ConnectCallback& callback,
+ scoped_ptr<NavigatorConnectService> service) {
+ if (service) {
+ MessagePortService::GetInstance()->UpdateMessagePort(
+ client.message_port_id, this, client.message_port_id);
+ MessagePortService::GetInstance()->ReleaseMessages(client.message_port_id);
+ connected_services_[client.message_port_id] = service.release();
+ callback.Run(true);
+ } else {
+ // Close port since connection failed.
+ MessagePortService::GetInstance()->ClosePort(client.message_port_id);
+ callback.Run(false);
+ }
}
-void NavigatorConnectContext::SendMessage(
+void NavigatorConnectContextImpl::SendMessageToPort(
int route_id,
const base::string16& message,
const std::vector<int>& sent_message_port_ids) {
- DCHECK(connections_.find(route_id) != connections_.end());
- const Connection& connection = connections_[route_id];
+ DCHECK(connected_services_.find(route_id) != connected_services_.end());
+ NavigatorConnectService* service = connected_services_[route_id];
- // Hold messages while service worker is found, activated, and message sent
- // causing ServiceWorkerScriptContext::OnCrossOriginMessageToWorker to
- // construct WebMessagePortChannelImpl instances which send
- // MessagePortHostMsg_ReleaseMessages.
+ // Hold messages on transferred message ports. Actual delivery of the message
+ // by the service can be asynchronous. When a message is delivered,
+ // WebMessagePortChannelImpl instances will be constructed which send
+ // MessagePortHostMsg_ReleaseMessages to release messages.
for (int sent_message_port_id : sent_message_port_ids)
MessagePortService::GetInstance()->HoldMessages(sent_message_port_id);
- service_worker_context_->context()->storage()->FindRegistrationForId(
- connection.service_worker_registration_id,
- connection.service_worker_registration_origin,
- base::Bind(&NavigatorConnectContext::DoSendMessage, this,
- connection.client, message, sent_message_port_ids));
+ service->OnMessage(message, sent_message_port_ids);
}
-void NavigatorConnectContext::SendMessagesAreQueued(int route_id) {
+void NavigatorConnectContextImpl::SendMessagesAreQueued(int route_id) {
NOTREACHED() << "navigator.connect endpoints should never queue messages.";
}
-void NavigatorConnectContext::DoSendMessage(
- const CrossOriginServiceWorkerClient& client,
- const base::string16& message,
- const std::vector<int>& sent_message_port_ids,
- ServiceWorkerStatusCode service_worker_status,
- const scoped_refptr<ServiceWorkerRegistration>&
- service_worker_registration) {
- if (service_worker_status != SERVICE_WORKER_OK) {
- // TODO(mek): Do something when no service worker was found.
- return;
- }
-
- ServiceWorkerVersion* active_version =
- service_worker_registration->active_version();
- if (!active_version) {
- // TODO(mek): Do something when no active version exists.
- return;
- }
-
- active_version->DispatchCrossOriginMessageEvent(
- client, message, sent_message_port_ids,
- base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
-}
-
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698