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)