15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The intent of this file is to provide a type-neutral abstraction between
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Chrome and WebKit for resource loading. This pure-virtual interface is
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// implemented by the embedder.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// One of these objects will be created by WebKit for each request. WebKit
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// will own the pointer to the bridge, and will delete it when the request is
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// no longer needed.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// In turn, the bridge's owner on the WebKit end will implement the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// RequestPeer interface, which we will use to communicate notifications
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// back.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CONTENT_CHILD_RESOURCE_LOADER_BRIDGE_H_
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CONTENT_CHILD_RESOURCE_LOADER_BRIDGE_H_
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/macros.h"
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "content/common/content_export.h"
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "net/base/request_priority.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace blink {
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WebThreadedDataReceiver;
265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)namespace content {
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class RequestPeer;
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class ResourceRequestBody;
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)struct SyncLoadResponse;
33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// TODO(tfarina): Refactor code that uses this class. This shouldn't be needed
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// now that it lives in content/.
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CONTENT_EXPORT ResourceLoaderBridge {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // use WebKitPlatformSupportImpl::CreateResourceLoader() for construction, but
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // anybody can delete at any time, INCLUDING during processing of callbacks.
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual ~ResourceLoaderBridge();
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)  // Call this method before calling Start() to set the request body.
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // May only be used with HTTP(S) POST requests.
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  virtual void SetRequestBody(ResourceRequestBody* request_body) = 0;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Call this method to initiate the request.  If this method succeeds, then
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)  // the peer's methods will be called asynchronously to report various events.
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual bool Start(RequestPeer* peer) = 0;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  // Call this method to cancel a request that is in progress.  This method
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  // causes the request to immediately transition into the 'done' state. The
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // OnCompletedRequest method will be called asynchronously; this assumes
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // the peer is still valid.
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual void Cancel() = 0;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  // Call this method to suspend or resume a load that is in progress.  This
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  // method may only be called after a successful call to the Start method.
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual void SetDefersLoading(bool value) = 0;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Call this method when the priority of the requested resource changes after
6106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)  // Start() has been called.  This method may only be called after a successful
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // call to the Start method.
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual void DidChangePriority(net::RequestPriority new_priority,
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                 int intra_priority_value) = 0;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Call this method to attach a data receiver which will receive resource data
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // on its own thread.
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual bool AttachThreadedDataReceiver(
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      blink::WebThreadedDataReceiver* threaded_data_receiver) = 0;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Call this method to load the resource synchronously (i.e., in one shot).
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // This is an alternative to the Start method.  Be warned that this method
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // will block the calling thread until the resource is fully downloaded or an
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // error occurs.  It could block the calling thread for a long time, so only
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // use this if you really need it!  There is also no way for the caller to
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // interrupt this method.  Errors are reported via the status field of the
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // response parameter.
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual void SyncLoad(SyncLoadResponse* response) = 0;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) protected:
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Construction must go through
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // WebKitPlatformSupportImpl::CreateResourceLoader()
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // For HTTP(S) POST requests, the AppendDataToUpload and AppendFileToUpload
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // methods may be called to construct the body of the request.
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceLoaderBridge();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceLoaderBridge);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}  // namespace content
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif  // CONTENT_CHILD_RESOURCE_LOADER_BRIDGE_H_
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)