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

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

Issue 1224263007: Refactor browser side navigator.connect code to not use MessagePortService. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@serviceport-serviceside
Patch Set: fix merge conflict Created 5 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/navigator_connect/navigator_connect_service_worker_service_factory.cc
diff --git a/content/browser/navigator_connect/navigator_connect_service_worker_service_factory.cc b/content/browser/navigator_connect/navigator_connect_service_worker_service_factory.cc
deleted file mode 100644
index ed2793a9afe3228c1fe13bfa5e42d13255ca53c8..0000000000000000000000000000000000000000
--- a/content/browser/navigator_connect/navigator_connect_service_worker_service_factory.cc
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// 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_service_worker_service_factory.h"
-
-#include "base/bind.h"
-#include "content/browser/message_port_service.h"
-#include "content/browser/service_worker/service_worker_context_wrapper.h"
-#include "content/common/service_worker/service_worker_utils.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/message_port_delegate.h"
-#include "content/public/common/navigator_connect_client.h"
-
-namespace content {
-
-namespace {
-
-// MessagePortDelegate implementation that directs all messages to the
-// oncrossoriginmessage event of a service worker.
-// TODO(mek): Somehow clean up message ports when a service worker is
-// unregistered.
-class NavigatorConnectServiceWorkerService : public MessagePortDelegate {
- public:
- NavigatorConnectServiceWorkerService(
- const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context,
- const NavigatorConnectClient& client,
- const scoped_refptr<ServiceWorkerRegistration>&
- service_worker_registration);
- ~NavigatorConnectServiceWorkerService() override;
-
- // MessagePortDelegate implementation.
- void SendMessage(
- int route_id,
- const MessagePortMessage& message,
- const std::vector<TransferredMessagePort>& sent_message_ports) override;
- void SendMessagesAreQueued(int route_id) override;
-
- private:
- // Callback called by SendMessage when the ServiceWorkerRegistration for this
- // service has been located.
- void DeliverMessage(
- const base::string16& message,
- const std::vector<TransferredMessagePort>& sent_message_ports,
- ServiceWorkerStatusCode service_worker_status,
- const scoped_refptr<ServiceWorkerRegistration>&
- service_worker_registration);
-
- scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
- NavigatorConnectClient client_;
- int64 service_worker_registration_id_;
- GURL service_worker_registration_origin_;
-
- base::WeakPtrFactory<NavigatorConnectServiceWorkerService> weak_factory_;
-};
-
-NavigatorConnectServiceWorkerService::NavigatorConnectServiceWorkerService(
- const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context,
- const NavigatorConnectClient& client,
- const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration)
- : service_worker_context_(service_worker_context),
- client_(client),
- service_worker_registration_id_(service_worker_registration->id()),
- service_worker_registration_origin_(
- service_worker_registration->pattern().GetOrigin()),
- weak_factory_(this) {
-}
-
-NavigatorConnectServiceWorkerService::~NavigatorConnectServiceWorkerService() {
-}
-
-void NavigatorConnectServiceWorkerService::SendMessage(
- int route_id,
- const MessagePortMessage& message,
- const std::vector<TransferredMessagePort>& sent_message_ports) {
- DCHECK(route_id == client_.message_port_id);
- DCHECK(message.message_as_value.empty());
-
- // 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 (const auto& port : sent_message_ports)
- MessagePortService::GetInstance()->HoldMessages(port.id);
-
- service_worker_context_->FindRegistrationForId(
- service_worker_registration_id_, service_worker_registration_origin_,
- base::Bind(&NavigatorConnectServiceWorkerService::DeliverMessage,
- weak_factory_.GetWeakPtr(), message.message_as_string,
- sent_message_ports));
-}
-
-void NavigatorConnectServiceWorkerService::SendMessagesAreQueued(int route_id) {
- NOTREACHED() << "navigator.connect endpoints should never queue messages.";
-}
-
-void NavigatorConnectServiceWorkerService::DeliverMessage(
- const base::string16& message,
- const std::vector<TransferredMessagePort>& sent_message_ports,
- 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_ports,
- base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
-}
-
-} // namespace
-
-NavigatorConnectServiceWorkerServiceFactory::
- NavigatorConnectServiceWorkerServiceFactory(const scoped_refptr<
- ServiceWorkerContextWrapper>& service_worker_context)
- : service_worker_context_(service_worker_context), weak_factory_(this) {
-}
-
-NavigatorConnectServiceWorkerServiceFactory::
- ~NavigatorConnectServiceWorkerServiceFactory() {
-}
-
-bool NavigatorConnectServiceWorkerServiceFactory::HandlesUrl(
- const GURL& target_url) {
- // Always return true, all URLs could potentially have a service worker, and
- // this factory will be installed as first factory, so it will only be used
- // if no other factory claims to handle the url.
- return true;
-}
-
-void NavigatorConnectServiceWorkerServiceFactory::Connect(
- const NavigatorConnectClient& client,
- const ConnectCallback& callback) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- // Find the right service worker to service this connection.
- service_worker_context_->FindRegistrationForDocument(
- client.target_url,
- base::Bind(&NavigatorConnectServiceWorkerServiceFactory::
- GotServiceWorkerRegistration,
- weak_factory_.GetWeakPtr(), callback, client));
-}
-
-void NavigatorConnectServiceWorkerServiceFactory::GotServiceWorkerRegistration(
- const ConnectCallback& callback,
- const NavigatorConnectClient& client,
- ServiceWorkerStatusCode status,
- const scoped_refptr<ServiceWorkerRegistration>& registration) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (status != SERVICE_WORKER_OK) {
- // No service worker found, reject connection attempt.
- OnConnectResult(callback, client, registration, status, false,
- base::string16(), base::string16());
- return;
- }
-
- ServiceWorkerVersion* active_version = registration->active_version();
- if (!active_version) {
- // No active version, reject connection attempt.
- OnConnectResult(callback, client, registration, status, false,
- base::string16(), base::string16());
- return;
- }
-
- active_version->DispatchServicePortConnectEvent(
- base::Bind(&NavigatorConnectServiceWorkerServiceFactory::OnConnectResult,
- weak_factory_.GetWeakPtr(), callback, client, registration),
- client.target_url, client.origin, client.message_port_id);
-}
-
-void NavigatorConnectServiceWorkerServiceFactory::OnConnectResult(
- const ConnectCallback& callback,
- const NavigatorConnectClient& client,
- const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
- ServiceWorkerStatusCode status,
- bool accept_connection,
- const base::string16& name,
- const base::string16& data) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- if (status != SERVICE_WORKER_OK || !accept_connection) {
- callback.Run(nullptr, false);
- return;
- }
-
- // TODO(mek): Keep track of name and data for this port.
- // TODO(mek): http://crbug.com/462744 Keep track of these
- // NavigatorConnectServiceWorkerService instances and clean them up when a
- // service worker registration is deleted.
- callback.Run(
- new NavigatorConnectServiceWorkerService(service_worker_context_, client,
- service_worker_registration),
- false);
-}
-
-} // namespace content

Powered by Google App Engine
This is Rietveld 408576698