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

Unified Diff: content/browser/service_worker/service_worker_fetch_dispatcher.cc

Issue 2449933003: Use Associated interfaces for mojo-loading (Closed)
Patch Set: fix Created 4 years, 2 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/service_worker/service_worker_fetch_dispatcher.cc
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index c6810ef22f171dfa8faedc56dd62e2bb0a1824fe..3e27d4b2b8b3069e99846770065f7784014b1187 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -20,19 +20,71 @@
#include "content/common/service_worker/service_worker_status_code.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/common/service_worker/service_worker_utils.h"
-#include "content/common/url_loader.mojom.h"
-#include "content/common/url_loader_factory.mojom.h"
#include "content/public/common/browser_side_navigation_policy.h"
#include "content/public/common/content_features.h"
+#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/bindings/binding.h"
#include "net/log/net_log.h"
#include "net/log/net_log_capture_mode.h"
#include "net/log/net_log_event_type.h"
#include "net/url_request/url_request.h"
+#include "services/service_manager/public/cpp/identity.h"
+#include "services/service_manager/public/cpp/interface_provider_spec.h"
namespace content {
namespace {
+class DelegatingURLLoader final : public mojom::URLLoader {
+ public:
+ explicit DelegatingURLLoader(mojom::URLLoaderAssociatedPtr loader)
+ : binding_(this), loader_(std::move(loader)) {}
+ ~DelegatingURLLoader() override {}
+
+ void FollowRedirect() override { loader_->FollowRedirect(); }
+ void Cancel() override { loader_->Cancel(); }
+
+ mojom::URLLoaderPtr CreateInterfacePtrAndBind() {
+ return binding_.CreateInterfacePtrAndBind();
+ }
+
+ private:
+ mojo::Binding<mojom::URLLoader> binding_;
+ mojom::URLLoaderAssociatedPtr loader_;
+
+ DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader);
+};
+
+class DelegatingURLLoaderClient final : public mojom::URLLoaderClient {
+ public:
+ explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client)
+ : binding_(this), client_(std::move(client)) {}
+ ~DelegatingURLLoaderClient() override {}
+
+ void OnReceiveResponse(const ResourceResponseHead& head) override {
+ client_->OnReceiveResponse(head);
+ }
+ void OnStartLoadingResponseBody(
+ mojo::ScopedDataPipeConsumerHandle body) override {
+ client_->OnStartLoadingResponseBody(std::move(body));
+ }
+ void OnComplete(
+ const ResourceRequestCompletionStatus& completion_status) override {
+ client_->OnComplete(completion_status);
+ }
+
+ void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info,
+ mojo::AssociatedGroup* associated_group) {
+ binding_.Bind(ptr_info, associated_group);
+ }
+
+ private:
+ mojo::AssociatedBinding<mojom::URLLoaderClient> binding_;
+ mojom::URLLoaderClientPtr client_;
+
+ DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient);
+};
+
using EventType = ServiceWorkerMetrics::EventType;
EventType ResourceTypeToEventType(ResourceType resource_type) {
switch (resource_type) {
@@ -138,6 +190,8 @@ ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
request_(std::move(request)),
resource_type_(resource_type),
did_complete_(false),
+ interface_registry_(service_manager::Identity(),
+ service_manager::InterfaceProviderSpec()),
weak_factory_(this) {
net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
net::NetLog::StringCallback(
@@ -301,19 +355,22 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
NOTIMPLEMENTED();
return;
}
+
+ DCHECK(!url_loader_factory_);
+ service_manager::mojom::InterfaceProviderPtr provider_proxy;
+ interface_registry_.Bind(mojo::GetProxy(&provider_proxy),
+ service_manager::Identity(),
+ service_manager::InterfaceProviderSpec());
+ interface_provider_.Bind(std::move(provider_proxy));
+ interface_registry_.AddInterface(url_loader_factory_getter);
+ interface_provider_.GetInterface(&url_loader_factory_);
+
DCHECK(!url_loader_factory_getter.is_null());
- mojom::URLLoaderFactoryPtr factory;
- url_loader_factory_getter.Run(mojo::GetProxy(&factory));
- if (url_loader_factory_getter.IsCancelled())
- return;
+ url_loader_factory_getter.Run(mojo::GetProxy(&url_loader_factory_));
- preload_handle_ = mojom::FetchEventPreloadHandle::New();
const ResourceRequestInfoImpl* original_info =
ResourceRequestInfoImpl::ForRequest(original_request);
- mojom::URLLoaderClientPtr url_loader_client;
- preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
-
ResourceRequest request;
request.method = original_request->method();
request.url = original_request->url();
@@ -332,11 +389,31 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
request.parent_is_main_frame = original_info->ParentIsMainFrame();
const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
DCHECK_LT(request_id, -1);
- // TODO(horo): Add "Service-Worker-Navigation-Preload" header.
- // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
- factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader),
- original_info->GetRouteID(), request_id,
- request, std::move(url_loader_client));
+
+ preload_handle_ = mojom::FetchEventPreloadHandle::New();
+ mojom::URLLoaderClientPtr url_loader_client_ptr;
+ preload_handle_->url_loader_client_request =
+ mojo::GetProxy(&url_loader_client_ptr);
+ std::unique_ptr<DelegatingURLLoaderClient> url_loader_client(
+ new DelegatingURLLoaderClient(std::move(url_loader_client_ptr)));
+ mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info;
+ url_loader_client->Bind(&url_loader_client_associated_ptr_info,
+ url_loader_factory_.associated_group());
+ mojom::URLLoaderAssociatedPtr url_loader_associated_ptr;
+
+ // TODO(horo): Add "Service-Worker-Navigation-Preload" header. See
+ // https://getithub.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
+ url_loader_factory_->CreateLoaderAndStart(
+ mojo::GetProxy(&url_loader_associated_ptr,
+ url_loader_factory_.associated_group()),
+ original_info->GetRouteID(), request_id, request,
+ std::move(url_loader_client_associated_ptr_info));
+
+ std::unique_ptr<DelegatingURLLoader> url_loader(
+ new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
+ preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
+ url_loader_ = std::move(url_loader);
+ url_loader_client_ = std::move(url_loader_client);
}
ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()

Powered by Google App Engine
This is Rietveld 408576698