15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CONTROLLEE_REQUEST_HANDLER_H_
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CONTROLLEE_REQUEST_HANDLER_H_
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/gtest_prod_util.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_request_handler.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace net {
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass NetworkDelegate;
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass URLRequest;
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace content {
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class ResourceRequestBody;
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ServiceWorkerRegistration;
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass ServiceWorkerURLRequestJob;
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ServiceWorkerVersion;
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// A request handler derivative used to handle requests from
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// controlled documents.
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass CONTENT_EXPORT ServiceWorkerControlleeRequestHandler
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : public ServiceWorkerRequestHandler {
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ServiceWorkerControlleeRequestHandler(
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::WeakPtr<ServiceWorkerContextCore> context,
305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      base::WeakPtr<ServiceWorkerProviderHost> provider_host,
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ResourceType resource_type,
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_refptr<ResourceRequestBody> body);
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~ServiceWorkerControlleeRequestHandler();
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Called via custom URLRequestJobFactory.
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual net::URLRequestJob* MaybeCreateJob(
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      net::URLRequest* request,
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      net::NetworkDelegate* network_delegate) OVERRIDE;
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void GetExtraResponseInfo(
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      bool* was_fetched_via_service_worker,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL* original_url_via_service_worker,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeTicks* fetch_start_time,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeTicks* fetch_ready_time,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeTicks* fetch_end_time) const OVERRIDE;
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ServiceWorkerControlleeRequestHandlerTest,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ActivateWaitingVersion);
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  typedef ServiceWorkerControlleeRequestHandler self;
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // For main resource case.
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void PrepareForMainResource(const GURL& url);
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void DidLookupRegistrationForMainResource(
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ServiceWorkerStatusCode status,
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const scoped_refptr<ServiceWorkerRegistration>& registration);
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnVersionStatusChanged(
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ServiceWorkerRegistration* registration,
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ServiceWorkerVersion* version);
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // For sub resource case.
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void PrepareForSubResource();
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_main_resource_load_;
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_refptr<ServiceWorkerURLRequestJob> job_;
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<ResourceRequestBody> body_;
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::WeakPtrFactory<ServiceWorkerControlleeRequestHandler> weak_factory_;
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(ServiceWorkerControlleeRequestHandler);
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace content
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_CONTROLLEE_REQUEST_HANDLER_H_
76