OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/browser/loader/url_loader_factory_impl.h" | |
6 | |
7 #include <memory> | |
8 | |
9 #include "base/memory/ptr_util.h" | |
10 #include "base/memory/weak_ptr.h" | |
11 #include "content/browser/loader/resource_dispatcher_host_impl.h" | |
12 #include "content/browser/loader/resource_message_filter.h" | |
13 #include "content/common/resource_messages.h" | |
14 #include "content/common/resource_request.h" | |
15 #include "content/common/url_loader.mojom.h" | |
16 | |
17 namespace content { | |
18 | |
19 namespace { | |
20 | |
21 // This class is an implementation of mojom::URLLoader which is a resource | |
22 // loader interface with Mojo. | |
23 class URLLoaderImpl final : public mojom::URLLoader { | |
24 public: | |
25 // Creates a URLLoader. This function returns nothing and registers the | |
26 // created instance to the ResourceDispatcherHostImpl instead. | |
27 static void Create(scoped_refptr<ResourceMessageFilter> filter, | |
28 mojom::URLLoaderRequest request) { | |
29 int child_id = filter->child_id(); | |
30 ResourceDispatcherHostImpl::Get()->AddUninitiatedURLLoader( | |
31 child_id, | |
32 base::WrapUnique(new URLLoaderImpl(filter.get(), std::move(request)))); | |
33 } | |
34 | |
35 ~URLLoaderImpl() override {} | |
36 | |
37 void Load(int32_t request_id, | |
38 const ResourceRequest& request, | |
39 mojom::URLLoaderClientPtr client) override { | |
40 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
41 | |
42 ResourceMessageFilter* filter = resource_message_filter_.get(); | |
43 if (!filter) { | |
44 // TODO(yhirano): Cancel the request. | |
45 return; | |
46 } | |
47 | |
48 std::unique_ptr<mojom::URLLoader> that = | |
49 ResourceDispatcherHostImpl::Get()->TakeUninitiatedURLLoader(this); | |
50 DCHECK(that); | |
51 | |
52 // TODO(yhirano): Provide the right routing ID. | |
53 const int routing_id = 0; | |
54 ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get(); | |
55 rdh->SetMojoLoaderAndClientForNextLoadRequest(std::move(that), | |
56 std::move(client)); | |
57 rdh->OnMessageReceived( | |
58 ResourceHostMsg_RequestResource(routing_id, request_id, request), | |
59 filter); | |
kinuko
2016/05/20 15:56:47
Actually... is there a reason we want to call OnRe
yhirano
2016/05/23 11:29:37
Done.
| |
60 } | |
61 void FollowRedirect() override {} | |
62 void Cancel() override {} | |
63 | |
64 private: | |
65 URLLoaderImpl(ResourceMessageFilter* filter, | |
66 mojo::InterfaceRequest<mojom::URLLoader> request) | |
67 : resource_message_filter_(filter->GetWeakPtr()), | |
68 binding_(this, std::move(request)) {} | |
69 | |
70 base::WeakPtr<ResourceMessageFilter> resource_message_filter_; | |
71 mojo::Binding<mojom::URLLoader> binding_; | |
72 }; | |
73 | |
74 } // namespace | |
75 | |
76 URLLoaderFactoryImpl::URLLoaderFactoryImpl( | |
77 scoped_refptr<ResourceMessageFilter> resource_message_filter, | |
78 mojo::InterfaceRequest<mojom::URLLoaderFactory> request) | |
79 : resource_message_filter_(resource_message_filter), | |
80 binding_(this, std::move(request)) {} | |
81 | |
82 URLLoaderFactoryImpl::~URLLoaderFactoryImpl() { | |
83 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
84 } | |
85 | |
86 void URLLoaderFactoryImpl::CreateURLLoader(mojom::URLLoaderRequest request) { | |
87 BrowserThread::PostTask( | |
88 BrowserThread::IO, FROM_HERE, | |
89 base::Bind(&URLLoaderImpl::Create, resource_message_filter_, | |
90 base::Passed(std::move(request)))); | |
91 } | |
92 | |
93 } // namespace content | |
OLD | NEW |