| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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 // The intent of this file is to provide a type-neutral abstraction between | |
| 6 // Chrome and WebKit for resource loading. This pure-virtual interface is | |
| 7 // implemented by the embedder. | |
| 8 // | |
| 9 // One of these objects will be created by WebKit for each request. WebKit | |
| 10 // will own the pointer to the bridge, and will delete it when the request is | |
| 11 // no longer needed. | |
| 12 // | |
| 13 // In turn, the bridge's owner on the WebKit end will implement the Peer | |
| 14 // interface, which we will use to communicate notifications back. | |
| 15 | |
| 16 #ifndef WEBKIT_GLUE_RESOURCE_LOADER_BRIDGE_H_ | |
| 17 #define WEBKIT_GLUE_RESOURCE_LOADER_BRIDGE_H_ | |
| 18 | |
| 19 #include <utility> | |
| 20 | |
| 21 #include "build/build_config.h" | |
| 22 #if defined(OS_POSIX) | |
| 23 #include "base/file_descriptor_posix.h" | |
| 24 #endif | |
| 25 #include "base/memory/ref_counted.h" | |
| 26 #include "base/platform_file.h" | |
| 27 #include "base/values.h" | |
| 28 #include "net/base/request_priority.h" | |
| 29 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" | |
| 30 #include "third_party/WebKit/public/platform/WebURLRequest.h" | |
| 31 #include "url/gurl.h" | |
| 32 #include "webkit/common/resource_response_info.h" | |
| 33 #include "webkit/glue/resource_type.h" | |
| 34 #include "webkit/glue/webkit_glue_export.h" | |
| 35 | |
| 36 namespace webkit_glue { | |
| 37 class ResourceRequestBody; | |
| 38 | |
| 39 class ResourceLoaderBridge { | |
| 40 public: | |
| 41 // Structure used when calling | |
| 42 // WebKitPlatformSupportImpl::CreateResourceLoader(). | |
| 43 struct WEBKIT_GLUE_EXPORT RequestInfo { | |
| 44 RequestInfo(); | |
| 45 ~RequestInfo(); | |
| 46 | |
| 47 // HTTP-style method name (e.g., "GET" or "POST"). | |
| 48 std::string method; | |
| 49 | |
| 50 // Absolute URL encoded in ASCII per the rules of RFC-2396. | |
| 51 GURL url; | |
| 52 | |
| 53 // URL of the document in the top-level window, which may be checked by the | |
| 54 // third-party cookie blocking policy. | |
| 55 GURL first_party_for_cookies; | |
| 56 | |
| 57 // Optional parameter, a URL with similar constraints in how it must be | |
| 58 // encoded as the url member. | |
| 59 GURL referrer; | |
| 60 | |
| 61 // The referrer policy that applies to the referrer. | |
| 62 WebKit::WebReferrerPolicy referrer_policy; | |
| 63 | |
| 64 // For HTTP(S) requests, the headers parameter can be a \r\n-delimited and | |
| 65 // \r\n-terminated list of MIME headers. They should be ASCII-encoded using | |
| 66 // the standard MIME header encoding rules. The headers parameter can also | |
| 67 // be null if no extra request headers need to be set. | |
| 68 std::string headers; | |
| 69 | |
| 70 // Composed of the values defined in url_request_load_flags.h. | |
| 71 int load_flags; | |
| 72 | |
| 73 // Process id of the process making the request. | |
| 74 int requestor_pid; | |
| 75 | |
| 76 // Indicates if the current request is the main frame load, a sub-frame | |
| 77 // load, or a sub objects load. | |
| 78 ResourceType::Type request_type; | |
| 79 | |
| 80 // Indicates the priority of this request, as determined by WebKit. | |
| 81 net::RequestPriority priority; | |
| 82 | |
| 83 // Used for plugin to browser requests. | |
| 84 uint32 request_context; | |
| 85 | |
| 86 // Identifies what appcache host this request is associated with. | |
| 87 int appcache_host_id; | |
| 88 | |
| 89 // Used to associated the bridge with a frame's network context. | |
| 90 int routing_id; | |
| 91 | |
| 92 // If true, then the response body will be downloaded to a file and the | |
| 93 // path to that file will be provided in ResponseInfo::download_file_path. | |
| 94 bool download_to_file; | |
| 95 | |
| 96 // True if the request was user initiated. | |
| 97 bool has_user_gesture; | |
| 98 | |
| 99 // Extra data associated with this request. We do not own this pointer. | |
| 100 WebKit::WebURLRequest::ExtraData* extra_data; | |
| 101 | |
| 102 private: | |
| 103 DISALLOW_COPY_AND_ASSIGN(RequestInfo); | |
| 104 }; | |
| 105 | |
| 106 // See the SyncLoad method declared below. (The name of this struct is not | |
| 107 // suffixed with "Info" because it also contains the response data.) | |
| 108 struct SyncLoadResponse : ResourceResponseInfo { | |
| 109 SyncLoadResponse(); | |
| 110 ~SyncLoadResponse(); | |
| 111 | |
| 112 // The response error code. | |
| 113 int error_code; | |
| 114 | |
| 115 // The final URL of the response. This may differ from the request URL in | |
| 116 // the case of a server redirect. | |
| 117 GURL url; | |
| 118 | |
| 119 // The response data. | |
| 120 std::string data; | |
| 121 }; | |
| 122 | |
| 123 // Generated by the bridge. This is implemented by our custom resource loader | |
| 124 // within webkit. The Peer and it's bridge should have identical lifetimes | |
| 125 // as they represent each end of a communication channel. | |
| 126 // | |
| 127 // These callbacks mirror net::URLRequest::Delegate and the order and | |
| 128 // conditions in which they will be called are identical. See url_request.h | |
| 129 // for more information. | |
| 130 class Peer { | |
| 131 public: | |
| 132 // Called as upload progress is made. | |
| 133 // note: only for requests with LOAD_ENABLE_UPLOAD_PROGRESS set | |
| 134 virtual void OnUploadProgress(uint64 position, uint64 size) = 0; | |
| 135 | |
| 136 // Called when a redirect occurs. The implementation may return false to | |
| 137 // suppress the redirect. The given ResponseInfo provides complete | |
| 138 // information about the redirect, and new_url is the URL that will be | |
| 139 // loaded if this method returns true. If this method returns true, the | |
| 140 // output parameter *has_new_first_party_for_cookies indicates whether the | |
| 141 // output parameter *new_first_party_for_cookies contains the new URL that | |
| 142 // should be consulted for the third-party cookie blocking policy. | |
| 143 virtual bool OnReceivedRedirect(const GURL& new_url, | |
| 144 const ResourceResponseInfo& info, | |
| 145 bool* has_new_first_party_for_cookies, | |
| 146 GURL* new_first_party_for_cookies) = 0; | |
| 147 | |
| 148 // Called when response headers are available (after all redirects have | |
| 149 // been followed). | |
| 150 virtual void OnReceivedResponse(const ResourceResponseInfo& info) = 0; | |
| 151 | |
| 152 // Called when a chunk of response data is downloaded. This method may be | |
| 153 // called multiple times or not at all if an error occurs. This method is | |
| 154 // only called if RequestInfo::download_to_file was set to true, and in | |
| 155 // that case, OnReceivedData will not be called. | |
| 156 virtual void OnDownloadedData(int len) = 0; | |
| 157 | |
| 158 // Called when a chunk of response data is available. This method may | |
| 159 // be called multiple times or not at all if an error occurs. | |
| 160 // The encoded_data_length is the length of the encoded data transferred | |
| 161 // over the network, which could be different from data length (e.g. for | |
| 162 // gzipped content), or -1 if if unknown. | |
| 163 virtual void OnReceivedData(const char* data, | |
| 164 int data_length, | |
| 165 int encoded_data_length) = 0; | |
| 166 | |
| 167 // Called when metadata generated by the renderer is retrieved from the | |
| 168 // cache. This method may be called zero or one times. | |
| 169 virtual void OnReceivedCachedMetadata(const char* data, int len) { } | |
| 170 | |
| 171 // Called when the response is complete. This method signals completion of | |
| 172 // the resource load. | |
| 173 virtual void OnCompletedRequest( | |
| 174 int error_code, | |
| 175 bool was_ignored_by_handler, | |
| 176 const std::string& security_info, | |
| 177 const base::TimeTicks& completion_time) = 0; | |
| 178 | |
| 179 protected: | |
| 180 virtual ~Peer() {} | |
| 181 }; | |
| 182 | |
| 183 // use WebKitPlatformSupportImpl::CreateResourceLoader() for construction, but | |
| 184 // anybody can delete at any time, INCLUDING during processing of callbacks. | |
| 185 WEBKIT_GLUE_EXPORT virtual ~ResourceLoaderBridge(); | |
| 186 | |
| 187 // Call this method before calling Start() to set the request body. | |
| 188 // May only be used with HTTP(S) POST requests. | |
| 189 virtual void SetRequestBody(ResourceRequestBody* request_body) = 0; | |
| 190 | |
| 191 // Call this method to initiate the request. If this method succeeds, then | |
| 192 // the peer's methods will be called asynchronously to report various events. | |
| 193 virtual bool Start(Peer* peer) = 0; | |
| 194 | |
| 195 // Call this method to cancel a request that is in progress. This method | |
| 196 // causes the request to immediately transition into the 'done' state. The | |
| 197 // OnCompletedRequest method will be called asynchronously; this assumes | |
| 198 // the peer is still valid. | |
| 199 virtual void Cancel() = 0; | |
| 200 | |
| 201 // Call this method to suspend or resume a load that is in progress. This | |
| 202 // method may only be called after a successful call to the Start method. | |
| 203 virtual void SetDefersLoading(bool value) = 0; | |
| 204 | |
| 205 // Call this method when the priority of the requested resource changes after | |
| 206 // Start() has been called. This method may only be called after a successful | |
| 207 // call to the Start method. | |
| 208 virtual void DidChangePriority(net::RequestPriority new_priority) = 0; | |
| 209 | |
| 210 // Call this method to load the resource synchronously (i.e., in one shot). | |
| 211 // This is an alternative to the Start method. Be warned that this method | |
| 212 // will block the calling thread until the resource is fully downloaded or an | |
| 213 // error occurs. It could block the calling thread for a long time, so only | |
| 214 // use this if you really need it! There is also no way for the caller to | |
| 215 // interrupt this method. Errors are reported via the status field of the | |
| 216 // response parameter. | |
| 217 virtual void SyncLoad(SyncLoadResponse* response) = 0; | |
| 218 | |
| 219 protected: | |
| 220 // Construction must go through | |
| 221 // WebKitPlatformSupportImpl::CreateResourceLoader() | |
| 222 // For HTTP(S) POST requests, the AppendDataToUpload and AppendFileToUpload | |
| 223 // methods may be called to construct the body of the request. | |
| 224 WEBKIT_GLUE_EXPORT ResourceLoaderBridge(); | |
| 225 | |
| 226 private: | |
| 227 DISALLOW_COPY_AND_ASSIGN(ResourceLoaderBridge); | |
| 228 }; | |
| 229 | |
| 230 } // namespace webkit_glue | |
| 231 | |
| 232 #endif // WEBKIT_GLUE_RESOURCE_LOADER_BRIDGE_H_ | |
| OLD | NEW |