| OLD | NEW | 
| (Empty) |  | 
 |    1 // Copyright 2017 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/renderer/service_worker/worker_fetch_context_info_impl.h" | 
 |    6  | 
 |    7 #include "content/child/child_thread_impl.h" | 
 |    8 #include "content/child/request_extra_data.h" | 
 |    9 #include "content/child/resource_dispatcher.h" | 
 |   10 #include "content/child/web_url_loader_impl.h" | 
 |   11 #include "content/common/frame_messages.h" | 
 |   12 #include "mojo/public/cpp/bindings/associated_binding.h" | 
 |   13  | 
 |   14 namespace content { | 
 |   15  | 
 |   16 namespace { | 
 |   17  | 
 |   18 class WorkerFetchContextImpl : public blink::WebWorkerFetchContext, | 
 |   19                                public mojom::ServiceWorkerClient { | 
 |   20  public: | 
 |   21   WorkerFetchContextImpl(mojom::WorkerFetchContextFactoryPtrInfo factory_info, | 
 |   22                          int service_worker_provider_id, | 
 |   23                          int appcache_host_id, | 
 |   24                          int parent_frame_id, | 
 |   25                          bool parent_is_secure_context, | 
 |   26                          bool parent_is_controlled_by_service_worker, | 
 |   27                          base::SingleThreadTaskRunner* loading_task_runner, | 
 |   28                          scoped_refptr<ThreadSafeSender> thread_safe_sender) | 
 |   29       : binding_(this), | 
 |   30         service_worker_provider_id_(service_worker_provider_id), | 
 |   31         appcache_host_id_(appcache_host_id), | 
 |   32         parent_frame_id_(parent_frame_id), | 
 |   33         parent_is_secure_context_(parent_is_secure_context), | 
 |   34         parent_is_controlled_by_service_worker_( | 
 |   35             parent_is_controlled_by_service_worker), | 
 |   36         resource_dispatcher_( | 
 |   37             base::MakeUnique<ResourceDispatcher>(nullptr, loading_task_runner)), | 
 |   38         thread_safe_sender_(std::move(thread_safe_sender)) { | 
 |   39     factory_.Bind(std::move(factory_info)); | 
 |   40     mojom::ServiceWorkerClientAssociatedPtrInfo ptr_info; | 
 |   41     binding_.Bind(&ptr_info); | 
 |   42     factory_->CreateWorkerFetchContext(mojo::MakeRequest(&url_loader_factory_), | 
 |   43                                        std::move(ptr_info), | 
 |   44                                        service_worker_provider_id_); | 
 |   45   } | 
 |   46   ~WorkerFetchContextImpl() override {} | 
 |   47  | 
 |   48   void SetControllerServiceWorker(int64_t controller_version_id) override { | 
 |   49     controller_version_id_ = controller_version_id; | 
 |   50   } | 
 |   51  | 
 |   52   bool IsControlledByServiceWorker() const override { | 
 |   53     return parent_is_controlled_by_service_worker_ || | 
 |   54            (controller_version_id_ != kInvalidServiceWorkerVersionId); | 
 |   55   } | 
 |   56  | 
 |   57   int64_t serviceWorkerID() const override { return controller_version_id_; } | 
 |   58  | 
 |   59   blink::WebURLLoader* createURLLoader() override { | 
 |   60     return new content::WebURLLoaderImpl(resource_dispatcher_.get(), | 
 |   61                                          url_loader_factory_.get()); | 
 |   62   } | 
 |   63   void willSendRequest(blink::WebURLRequest& request) override { | 
 |   64     RequestExtraData* extra_data = new RequestExtraData(); | 
 |   65     extra_data->set_service_worker_provider_id(service_worker_provider_id_); | 
 |   66     extra_data->set_render_frame_id(parent_frame_id_); | 
 |   67     // TODO(horo): Just checking the worker's origin is enough? | 
 |   68     extra_data->set_initiated_in_secure_context(parent_is_secure_context_); | 
 |   69     request.setExtraData(extra_data); | 
 |   70     request.setAppCacheHostID(appcache_host_id_); | 
 |   71  | 
 |   72     if (!IsControlledByServiceWorker() && | 
 |   73         request.getServiceWorkerMode() != | 
 |   74             blink::WebURLRequest::ServiceWorkerMode::None) { | 
 |   75       request.setServiceWorkerMode( | 
 |   76           blink::WebURLRequest::ServiceWorkerMode::Foreign); | 
 |   77     } | 
 |   78     // request.addHTTPOriginIfNeeded(blink::WebSecurityOrigin::createUnique()); | 
 |   79   } | 
 |   80   void didRunContentWithCertificateErrors(const blink::WebURL& url) override { | 
 |   81     Send(new FrameHostMsg_DidRunContentWithCertificateErrors(parent_frame_id_, | 
 |   82                                                              url)); | 
 |   83   } | 
 |   84   void didDisplayContentWithCertificateErrors( | 
 |   85       const blink::WebURL& url) override { | 
 |   86     Send(new FrameHostMsg_DidDisplayContentWithCertificateErrors( | 
 |   87         parent_frame_id_, url)); | 
 |   88   } | 
 |   89   bool Send(IPC::Message* message) { | 
 |   90     return thread_safe_sender_->Send(message); | 
 |   91   } | 
 |   92  | 
 |   93  private: | 
 |   94   mojo::AssociatedBinding<mojom::ServiceWorkerClient> binding_; | 
 |   95   const int service_worker_provider_id_; | 
 |   96   const int appcache_host_id_; | 
 |   97   const int parent_frame_id_; | 
 |   98   const int parent_is_secure_context_; | 
 |   99   const bool parent_is_controlled_by_service_worker_; | 
 |  100   std::unique_ptr<ResourceDispatcher> resource_dispatcher_; | 
 |  101   scoped_refptr<ThreadSafeSender> thread_safe_sender_; | 
 |  102   int controller_version_id_ = kInvalidServiceWorkerVersionId; | 
 |  103   mojom::WorkerFetchContextFactoryPtr factory_; | 
 |  104   mojom::URLLoaderFactoryAssociatedPtr url_loader_factory_; | 
 |  105 }; | 
 |  106  | 
 |  107 }  // namespace | 
 |  108  | 
 |  109 WorkerFetchContextInfoImpl::WorkerFetchContextInfoImpl( | 
 |  110     mojom::WorkerFetchContextFactoryPtrInfo factory_info) | 
 |  111     : factory_info_(std::move(factory_info)), | 
 |  112       thread_safe_sender_(ChildThreadImpl::current()->thread_safe_sender()) {} | 
 |  113  | 
 |  114 WorkerFetchContextInfoImpl::~WorkerFetchContextInfoImpl() {} | 
 |  115  | 
 |  116 std::unique_ptr<blink::WebWorkerFetchContext> | 
 |  117 WorkerFetchContextInfoImpl::CreateContext( | 
 |  118     base::SingleThreadTaskRunner* loading_task_runner) { | 
 |  119   DCHECK(factory_info_.is_valid()); | 
 |  120   return base::MakeUnique<WorkerFetchContextImpl>( | 
 |  121       std::move(factory_info_), service_worker_provider_id_, appcache_host_id_, | 
 |  122       parent_frame_id_, is_secure_context_, is_controlled_by_service_worker_, | 
 |  123       loading_task_runner, std::move(thread_safe_sender_)); | 
 |  124 } | 
 |  125 void WorkerFetchContextInfoImpl::setAppCacheHostID(int appcache_host_id) { | 
 |  126   appcache_host_id_ = appcache_host_id; | 
 |  127 } | 
 |  128 void WorkerFetchContextInfoImpl::setParentFrameID(int parent_frame_id) { | 
 |  129   parent_frame_id_ = parent_frame_id; | 
 |  130 } | 
 |  131 void WorkerFetchContextInfoImpl::setServiceWorkerProviderID( | 
 |  132     int service_worker_provider_id) { | 
 |  133   service_worker_provider_id_ = service_worker_provider_id; | 
 |  134 } | 
 |  135 void WorkerFetchContextInfoImpl::setIsSecureContext(bool is_secure_context) { | 
 |  136   is_secure_context_ = is_secure_context; | 
 |  137 } | 
 |  138 void WorkerFetchContextInfoImpl::setIsControlledByServiceWorker( | 
 |  139     bool contolled) { | 
 |  140   is_controlled_by_service_worker_ = contolled; | 
 |  141 } | 
 |  142 void WorkerFetchContextInfoImpl::willSendRequest(blink::WebURLRequest&) { | 
 |  143   NOTREACHED(); | 
 |  144 } | 
 |  145  | 
 |  146 }  // namespace content | 
| OLD | NEW |