summaryrefslogtreecommitdiffstats
path: root/webkit/glue/resource_loader_bridge.h
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/resource_loader_bridge.h')
-rw-r--r--webkit/glue/resource_loader_bridge.h345
1 files changed, 345 insertions, 0 deletions
diff --git a/webkit/glue/resource_loader_bridge.h b/webkit/glue/resource_loader_bridge.h
new file mode 100644
index 0000000..e66181f
--- /dev/null
+++ b/webkit/glue/resource_loader_bridge.h
@@ -0,0 +1,345 @@
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// The intent of this file is to provide a type-neutral abstraction between
+// Chrome and WebKit for resource loading. This pure-virtual interface is
+// implemented by the embedder, which also provides a factory method Create
+// to instantiate this object.
+//
+// One of these objects will be created by WebKit for each request. WebKit
+// will own the pointer to the bridge, and will delete it when the request is
+// no longer needed.
+//
+// In turn, the bridge's owner on the WebKit end will implement the Peer
+// interface, which we will use to communicate notifications back.
+
+#ifndef WEBKIT_GLUE_RESOURCE_LOADER_BRIDGE_H_
+#define WEBKIT_GLUE_RESOURCE_LOADER_BRIDGE_H_
+
+#include "build/build_config.h"
+#if defined(OS_POSIX)
+#include "base/file_descriptor_posix.h"
+#endif
+#include "base/platform_file.h"
+#include "base/ref_counted.h"
+#include "base/time.h"
+#include "googleurl/src/gurl.h"
+#include "net/url_request/url_request_status.h"
+#include "webkit/glue/resource_type.h"
+
+namespace net {
+class HttpResponseHeaders;
+}
+
+class FilePath;
+
+namespace webkit_glue {
+
+class ResourceLoaderBridge {
+ public:
+ // Structure used when calling ResourceLoaderBridge::Create().
+ struct RequestInfo {
+ RequestInfo();
+ ~RequestInfo();
+
+ // HTTP-style method name (e.g., "GET" or "POST").
+ std::string method;
+
+ // Absolute URL encoded in ASCII per the rules of RFC-2396.
+ GURL url;
+
+ // URL of the document in the top-level window, which may be checked by the
+ // third-party cookie blocking policy.
+ GURL first_party_for_cookies;
+
+ // Optional parameter, a URL with similar constraints in how it must be
+ // encoded as the url member.
+ GURL referrer;
+
+ std::string frame_origin;
+ std::string main_frame_origin;
+
+ // For HTTP(S) requests, the headers parameter can be a \r\n-delimited and
+ // \r\n-terminated list of MIME headers. They should be ASCII-encoded using
+ // the standard MIME header encoding rules. The headers parameter can also
+ // be null if no extra request headers need to be set.
+ std::string headers;
+
+ // Composed of the values defined in url_request_load_flags.h.
+ int load_flags;
+
+ // Process id of the process making the request.
+ int requestor_pid;
+
+ // Indicates if the current request is the main frame load, a sub-frame
+ // load, or a sub objects load.
+ ResourceType::Type request_type;
+
+ // Used for plugin to browser requests.
+ uint32 request_context;
+
+ // Identifies what appcache host this request is associated with.
+ int appcache_host_id;
+
+ // Used to associated the bridge with a frame's network context.
+ int routing_id;
+ };
+
+ // Structure containing timing information for the request. It addresses
+ // http://groups.google.com/group/http-archive-specification/web/har-1-1-spec
+ // and http://dev.w3.org/2006/webapi/WebTiming/ needs.
+ //
+ // All the values for starts and ends are given in milliseconds and are
+ // offsets with respect to the given base time.
+ struct LoadTimingInfo {
+ LoadTimingInfo();
+ ~LoadTimingInfo();
+
+ // All the values in this struct are given as offsets in milliseconds wrt
+ // this base time.
+ base::Time base_time;
+
+ // The time that proxy processing started. For requests with no proxy phase,
+ // this time is -1.
+ int32 proxy_start;
+
+ // The time that proxy processing ended. For reused sockets this time
+ // is -1.
+ int32 proxy_end;
+
+ // The time that DNS lookup started. For reused sockets this time is -1.
+ int32 dns_start;
+
+ // The time that DNS lookup ended. For reused sockets this time is -1.
+ int32 dns_end;
+
+ // The time that establishing connection started. For reused sockets
+ // this time is -1. Connect time includes dns time.
+ int32 connect_start;
+
+ // The time that establishing connection ended. For reused sockets this
+ // time is -1. Connect time includes dns time.
+ int32 connect_end;
+
+ // The time at which SSL handshake started. For non-HTTPS requests this
+ // is 0.
+ int32 ssl_start;
+
+ // The time at which SSL handshake ended. For non-HTTPS requests this is 0.
+ int32 ssl_end;
+
+ // The time that HTTP request started. For non-HTTP requests this is 0.
+ int32 send_start;
+
+ // The time that HTTP request ended. For non-HTTP requests this is 0.
+ int32 send_end;
+
+ // The time at which receiving HTTP headers started. For non-HTTP requests
+ // this is 0.
+ int32 receive_headers_start;
+
+ // The time at which receiving HTTP headers ended. For non-HTTP requests
+ // this is 0.
+ int32 receive_headers_end;
+ };
+
+ struct ResponseInfo {
+ ResponseInfo();
+ ~ResponseInfo();
+
+ // The time at which the request was made that resulted in this response.
+ // For cached responses, this time could be "far" in the past.
+ base::Time request_time;
+
+ // The time at which the response headers were received. For cached
+ // responses, this time could be "far" in the past.
+ base::Time response_time;
+
+ // The response headers or NULL if the URL type does not support headers.
+ scoped_refptr<net::HttpResponseHeaders> headers;
+
+ // The mime type of the response. This may be a derived value.
+ std::string mime_type;
+
+ // The character encoding of the response or none if not applicable to the
+ // response's mime type. This may be a derived value.
+ std::string charset;
+
+ // An opaque string carrying security information pertaining to this
+ // response. This may include information about the SSL connection used.
+ std::string security_info;
+
+ // Content length if available. -1 if not available
+ int64 content_length;
+
+ // The appcache this response was loaded from, or kNoCacheId.
+ int64 appcache_id;
+
+ // The manifest url of the appcache this response was loaded from.
+ // Note: this value is only populated for main resource requests.
+ GURL appcache_manifest_url;
+
+ // Connection identifier from the underlying network stack. In case there
+ // is no associated connection, contains 0.
+ uint32 connection_id;
+
+ // Determines whether physical connection reused.
+ bool connection_reused;
+
+ // Detailed timing information used by the WebTiming, HAR and Developer
+ // Tools.
+ LoadTimingInfo load_timing;
+
+ // True if the response was delivered using SPDY.
+ bool was_fetched_via_spdy;
+
+ // True if the response was delivered after NPN is negotiated.
+ bool was_npn_negotiated;
+
+ // True if response could use alternate protocol. However, browser will
+ // ignore the alternate protocol when spdy is not enabled on browser side.
+ bool was_alternate_protocol_available;
+
+ // True if the response was fetched via an explicit proxy (as opposed to a
+ // transparent proxy). The proxy could be any type of proxy, HTTP or SOCKS.
+ // Note: we cannot tell if a transparent proxy may have been involved.
+ bool was_fetched_via_proxy;
+ };
+
+ // See the SyncLoad method declared below. (The name of this struct is not
+ // suffixed with "Info" because it also contains the response data.)
+ struct SyncLoadResponse : ResponseInfo {
+ SyncLoadResponse();
+ ~SyncLoadResponse();
+
+ // The response status.
+ URLRequestStatus status;
+
+ // The final URL of the response. This may differ from the request URL in
+ // the case of a server redirect.
+ GURL url;
+
+ // The response data.
+ std::string data;
+ };
+
+ // Generated by the bridge. This is implemented by our custom resource loader
+ // within webkit. The Peer and it's bridge should have identical lifetimes
+ // as they represent each end of a communication channel.
+ //
+ // These callbacks mirror URLRequest::Delegate and the order and conditions
+ // in which they will be called are identical. See url_request.h for more
+ // information.
+ class Peer {
+ public:
+ virtual ~Peer() {}
+
+ // Called as upload progress is made.
+ // note: only for requests with LOAD_ENABLE_UPLOAD_PROGRESS set
+ virtual void OnUploadProgress(uint64 position, uint64 size) = 0;
+
+ // Called when a redirect occurs. The implementation may return false to
+ // suppress the redirect. The given ResponseInfo provides complete
+ // information about the redirect, and new_url is the URL that will be
+ // loaded if this method returns true. If this method returns true, the
+ // output parameter *has_new_first_party_for_cookies indicates whether the
+ // output parameter *new_first_party_for_cookies contains the new URL that
+ // should be consulted for the third-party cookie blocking policy.
+ virtual bool OnReceivedRedirect(const GURL& new_url,
+ const ResponseInfo& info,
+ bool* has_new_first_party_for_cookies,
+ GURL* new_first_party_for_cookies) = 0;
+
+ // Called when response headers are available (after all redirects have
+ // been followed). |content_filtered| is set to true if the contents is
+ // altered or replaced (usually for security reasons when the resource is
+ // deemed unsafe).
+ virtual void OnReceivedResponse(const ResponseInfo& info,
+ bool content_filtered) = 0;
+
+ // Called when a chunk of response data is available. This method may
+ // be called multiple times or not at all if an error occurs.
+ virtual void OnReceivedData(const char* data, int len) = 0;
+
+ // Called when metadata generated by the renderer is retrieved from the
+ // cache. This method may be called zero or one times.
+ virtual void OnReceivedCachedMetadata(const char* data, int len) { }
+
+ // Called when the response is complete. This method signals completion of
+ // the resource load.ff
+ virtual void OnCompletedRequest(const URLRequestStatus& status,
+ const std::string& security_info) = 0;
+
+ // Returns the URL of the request, which allows us to display it in
+ // debugging situations.
+ virtual GURL GetURLForDebugging() const = 0;
+ };
+
+ // use Create() for construction, but anybody can delete at any time,
+ // INCLUDING during processing of callbacks.
+ virtual ~ResourceLoaderBridge();
+
+ // Call this method to make a new instance.
+ //
+ // For HTTP(S) POST requests, the AppendDataToUpload and AppendFileToUpload
+ // methods may be called to construct the body of the request.
+ static ResourceLoaderBridge* Create(const RequestInfo& request_info);
+
+ // Call this method before calling Start() to append a chunk of binary data
+ // to the request body. May only be used with HTTP(S) POST requests.
+ virtual void AppendDataToUpload(const char* data, int data_len) = 0;
+
+ // Call this method before calling Start() to append the contents of a file
+ // to the request body. May only be used with HTTP(S) POST requests.
+ void AppendFileToUpload(const FilePath& file_path) {
+ AppendFileRangeToUpload(file_path, 0, kuint64max, base::Time());
+ }
+
+ // Call this method before calling Start() to append the contents of a file
+ // to the request body. May only be used with HTTP(S) POST requests.
+ virtual void AppendFileRangeToUpload(
+ const FilePath& file_path,
+ uint64 offset,
+ uint64 length,
+ const base::Time& expected_modification_time) = 0;
+
+ // Call this method before calling Start() to assign an upload identifier to
+ // this request. This is used to enable caching of POST responses. A value
+ // of 0 implies the unspecified identifier.
+ virtual void SetUploadIdentifier(int64 identifier) = 0;
+
+ // Call this method to initiate the request. If this method succeeds, then
+ // the peer's methods will be called asynchronously to report various events.
+ virtual bool Start(Peer* peer) = 0;
+
+ // Call this method to cancel a request that is in progress. This method
+ // causes the request to immediately transition into the 'done' state. The
+ // OnCompletedRequest method will be called asynchronously; this assumes
+ // the peer is still valid.
+ virtual void Cancel() = 0;
+
+ // Call this method to suspend or resume a load that is in progress. This
+ // method may only be called after a successful call to the Start method.
+ virtual void SetDefersLoading(bool value) = 0;
+
+ // Call this method to load the resource synchronously (i.e., in one shot).
+ // This is an alternative to the Start method. Be warned that this method
+ // will block the calling thread until the resource is fully downloaded or an
+ // error occurs. It could block the calling thread for a long time, so only
+ // use this if you really need it! There is also no way for the caller to
+ // interrupt this method. Errors are reported via the status field of the
+ // response parameter.
+ virtual void SyncLoad(SyncLoadResponse* response) = 0;
+
+ protected:
+ // construction must go through Create()
+ ResourceLoaderBridge();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ResourceLoaderBridge);
+};
+
+} // namespace webkit_glue
+
+#endif // WEBKIT_GLUE_RESOURCE_LOADER_BRIDGE_H_