diff options
author | mbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-11 21:34:46 +0000 |
---|---|---|
committer | mbelshe@google.com <mbelshe@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-11 21:34:46 +0000 |
commit | 9fc38b3ac8e8c9cfad867a1177d5b295a7646b57 (patch) | |
tree | db1f4d7ba7b87cf2f006f608448ba92ba596fe64 | |
parent | e1c16492b1113c01e7467eaa526a01db85bf6470 (diff) | |
download | chromium_src-9fc38b3ac8e8c9cfad867a1177d5b295a7646b57.zip chromium_src-9fc38b3ac8e8c9cfad867a1177d5b295a7646b57.tar.gz chromium_src-9fc38b3ac8e8c9cfad867a1177d5b295a7646b57.tar.bz2 |
Enable JS detection of whether SPDY was used to load a web page.
Augments the loadTimes() API with a new field, "wasFetchedViaSpdy".
BUG=31615
TEST=flip_network_transaction_unittest
Review URL: http://codereview.chromium.org/518039
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35943 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 4 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_dispatcher_host.cc | 2 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 6 | ||||
-rw-r--r-- | chrome/renderer/loadtimes_extension_bindings.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/navigation_state.h | 9 | ||||
-rw-r--r-- | net/flip/flip_network_transaction_unittest.cc | 4 | ||||
-rw-r--r-- | net/flip/flip_session.cc | 14 | ||||
-rw-r--r-- | net/http/http_response_info.cc | 7 | ||||
-rw-r--r-- | net/http/http_response_info.h | 3 | ||||
-rw-r--r-- | net/url_request/url_request.h | 5 | ||||
-rw-r--r-- | webkit/glue/resource_loader_bridge.cc | 1 | ||||
-rw-r--r-- | webkit/glue/resource_loader_bridge.h | 3 | ||||
-rw-r--r-- | webkit/glue/weburlloader_impl.cc | 1 |
13 files changed, 55 insertions, 8 deletions
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 1363afd..f1a48f1 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -12,6 +12,7 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/json/json_reader.h" +#include "base/stats_counters.h" #include "base/string_util.h" #include "base/time.h" #include "base/waitable_event.h" @@ -1066,6 +1067,9 @@ void RenderViewHost::OnMsgDidLoadResourceFromMemoryCache( const std::string& frame_origin, const std::string& main_frame_origin, const std::string& security_info) { + static StatsCounter cache("WebKit.CacheHit"); + cache.Increment(); + RenderViewHostDelegate::Resource* resource_delegate = delegate_->GetResourceDelegate(); if (resource_delegate) { diff --git a/chrome/browser/renderer_host/resource_dispatcher_host.cc b/chrome/browser/renderer_host/resource_dispatcher_host.cc index 417ceb1..997b90c 100644 --- a/chrome/browser/renderer_host/resource_dispatcher_host.cc +++ b/chrome/browser/renderer_host/resource_dispatcher_host.cc @@ -238,6 +238,8 @@ void PopulateResourceResponse(URLRequest* request, response->response_head.filter_policy = filter_policy; response->response_head.content_length = request->GetExpectedContentSize(); request->GetMimeType(&response->response_head.mime_type); + response->response_head.was_fetched_via_spdy = + request->was_fetched_via_spdy(); appcache::AppCacheInterceptor::GetExtraResponseInfo( request, &response->response_head.appcache_id, diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h index e21c415..fc4a994 100644 --- a/chrome/common/render_messages.h +++ b/chrome/common/render_messages.h @@ -1339,6 +1339,7 @@ struct ParamTraits<webkit_glue::ResourceLoaderBridge::ResponseInfo> { WriteParam(m, p.content_length); WriteParam(m, p.appcache_id); WriteParam(m, p.appcache_manifest_url); + WriteParam(m, p.was_fetched_via_spdy); } static bool Read(const Message* m, void** iter, param_type* r) { return @@ -1350,7 +1351,8 @@ struct ParamTraits<webkit_glue::ResourceLoaderBridge::ResponseInfo> { ReadParam(m, iter, &r->security_info) && ReadParam(m, iter, &r->content_length) && ReadParam(m, iter, &r->appcache_id) && - ReadParam(m, iter, &r->appcache_manifest_url); + ReadParam(m, iter, &r->appcache_manifest_url) && + ReadParam(m, iter, &r->was_fetched_via_spdy); } static void Log(const param_type& p, std::wstring* l) { l->append(L"("); @@ -1371,6 +1373,8 @@ struct ParamTraits<webkit_glue::ResourceLoaderBridge::ResponseInfo> { LogParam(p.appcache_id, l); l->append(L", "); LogParam(p.appcache_manifest_url, l); + l->append(L", "); + LogParam(p.was_fetched_via_spdy, l); l->append(L")"); } }; diff --git a/chrome/renderer/loadtimes_extension_bindings.cc b/chrome/renderer/loadtimes_extension_bindings.cc index 8688a56..33d46d7 100644 --- a/chrome/renderer/loadtimes_extension_bindings.cc +++ b/chrome/renderer/loadtimes_extension_bindings.cc @@ -128,7 +128,9 @@ class LoadTimesExtensionWrapper : public v8::Extension { load_times->Set( v8::String::New("navigationType"), v8::String::New(GetNavigationType(data_source->navigationType()))); - + load_times->Set( + v8::String::New("wasFetchedViaSpdy"), + v8::Boolean::New(navigation_state->was_fetched_via_spdy())); return load_times; } } diff --git a/chrome/renderer/navigation_state.h b/chrome/renderer/navigation_state.h index 90c1270..61f63ac 100644 --- a/chrome/renderer/navigation_state.h +++ b/chrome/renderer/navigation_state.h @@ -190,6 +190,10 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { return cache_policy_override_set_; } + // Indicator if SPDY was used as part of this page load. + void set_was_fetched_via_spdy(bool value) { was_fetched_via_spdy_ = value; } + bool was_fetched_via_spdy() const { return was_fetched_via_spdy_; } + private: NavigationState(PageTransition::Type transition_type, const base::Time& request_time, @@ -204,7 +208,8 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { postpone_loading_data_(false), cache_policy_override_set_(false), cache_policy_override_(WebKit::WebURLRequest::UseProtocolCachePolicy), - user_script_idle_scheduler_(NULL) { + user_script_idle_scheduler_(NULL), + was_fetched_via_spdy_(false) { } PageTransition::Type transition_type_; @@ -232,6 +237,8 @@ class NavigationState : public WebKit::WebDataSource::ExtraData { scoped_ptr<UserScriptIdleScheduler> user_script_idle_scheduler_; + bool was_fetched_via_spdy_; + DISALLOW_COPY_AND_ASSIGN(NavigationState); }; diff --git a/net/flip/flip_network_transaction_unittest.cc b/net/flip/flip_network_transaction_unittest.cc index 77ed06c..0a6a8f2 100644 --- a/net/flip/flip_network_transaction_unittest.cc +++ b/net/flip/flip_network_transaction_unittest.cc @@ -293,6 +293,7 @@ class FlipNetworkTransactionTest : public PlatformTest { const HttpResponseInfo* response = trans->GetResponseInfo(); EXPECT_TRUE(response->headers != NULL); + EXPECT_TRUE(response->was_fetched_via_spdy); out.status_line = response->headers->GetStatusLine(); out.response_info = *response; // Make a copy so we can verify. @@ -673,7 +674,6 @@ TEST_F(FlipNetworkTransactionTest, InvalidSynReply) { } } -// TODO(mbelshe): This test is broken right now and we need to fix it! TEST_F(FlipNetworkTransactionTest, DISABLED_ServerPush) { // Reply with the X-Associated-Content header. static const unsigned char syn_reply[] = { @@ -887,8 +887,6 @@ TEST_F(FlipNetworkTransactionTest, PartialWrite) { EXPECT_EQ("hello!", out.response_data); } -// Disabled due to flaky mac (and possibly linux) valgrind errors. -// http://crbug.com/29471 TEST_F(FlipNetworkTransactionTest, DISABLED_ConnectFailure) { MockConnect connects[] = { MockConnect(true, ERR_NAME_NOT_RESOLVED), diff --git a/net/flip/flip_session.cc b/net/flip/flip_session.cc index 73cf834..3812108 100644 --- a/net/flip/flip_session.cc +++ b/net/flip/flip_session.cc @@ -54,7 +54,13 @@ namespace net { namespace { -const int kReadBufferSize = 32 * 1024; +#ifdef WIN32 +// We use an artificially small buffer size on windows because the async IO +// system will artifiially delay IO completions when we use large buffers. +const int kReadBufferSize = 2 * 1024; +#else +const int kReadBufferSize = 8 * 1024; +#endif // Convert a FlipHeaderBlock into an HttpResponseInfo. // |headers| input parameter with the FlipHeaderBlock. @@ -115,6 +121,7 @@ bool FlipHeadersToHttpResponse(const flip::FlipHeaderBlock& headers, } response->headers = new HttpResponseHeaders(raw_headers); + response->was_fetched_via_spdy = true; return true; } @@ -198,7 +205,8 @@ FlipSession::FlipSession(const std::string& host, HttpNetworkSession* session) streams_initiated_count_(0), streams_pushed_count_(0), streams_pushed_and_claimed_count_(0), - streams_abandoned_count_(0) { + streams_abandoned_count_(0), + bytes_received_(0) { // TODO(mbelshe): consider randomization of the stream_hi_water_mark. flip_framer_.set_visitor(this); @@ -531,6 +539,8 @@ void FlipSession::OnReadComplete(int bytes_read) { return; } + bytes_received_ += bytes_read; + char *data = read_buffer_->data(); while (bytes_read && flip_framer_.error_code() == flip::FlipFramer::FLIP_NO_ERROR) { diff --git a/net/http/http_response_info.cc b/net/http/http_response_info.cc index cf6a363..873d017 100644 --- a/net/http/http_response_info.cc +++ b/net/http/http_response_info.cc @@ -38,6 +38,9 @@ enum { // This bit is set if the request was cancelled before completion. RESPONSE_INFO_TRUNCATED = 1 << 12, + // This bit is set if the response was received via SPDY. + RESPONSE_INFO_WAS_SPDY = 1 << 13, + // TODO(darin): Add other bits to indicate alternate request methods. // For now, we don't support storing those. }; @@ -103,6 +106,8 @@ bool HttpResponseInfo::InitFromPickle(const Pickle& pickle, return false; } + was_fetched_via_spdy = (flags & RESPONSE_INFO_WAS_SPDY) != 0; + *response_truncated = (flags & RESPONSE_INFO_TRUNCATED) ? true : false; return true; @@ -122,6 +127,8 @@ void HttpResponseInfo::Persist(Pickle* pickle, flags |= RESPONSE_INFO_HAS_VARY_DATA; if (response_truncated) flags |= RESPONSE_INFO_TRUNCATED; + if (was_fetched_via_spdy) + flags |= RESPONSE_INFO_WAS_SPDY; pickle->WriteInt(flags); pickle->WriteInt64(request_time.ToInternalValue()); diff --git a/net/http/http_response_info.h b/net/http/http_response_info.h index 432ad87..a3e0123f 100644 --- a/net/http/http_response_info.h +++ b/net/http/http_response_info.h @@ -31,6 +31,9 @@ class HttpResponseInfo { // reloading previously visited pages (without going over the network). bool was_cached; + // True if the request was fetched over a SPDY channel. + bool was_fetched_via_spdy; + // The time at which the request was made that resulted in this response. // For cached responses, this is the last time the cache entry was validated. base::Time request_time; diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h index 1b73b95..e586e28 100644 --- a/net/url_request/url_request.h +++ b/net/url_request/url_request.h @@ -362,6 +362,11 @@ class URLRequest { // Indicate if this response was fetched from disk cache. bool was_cached() const { return response_info_.was_cached; } + // Returns true if the URLRequest was delivered with SPDY. + bool was_fetched_via_spdy() const { + return response_info_.was_fetched_via_spdy; + } + // Get all response headers, as a HttpResponseHeaders object. See comments // in HttpResponseHeaders class as to the format of the data. net::HttpResponseHeaders* response_headers() const; diff --git a/webkit/glue/resource_loader_bridge.cc b/webkit/glue/resource_loader_bridge.cc index 8b22508..2dccfac 100644 --- a/webkit/glue/resource_loader_bridge.cc +++ b/webkit/glue/resource_loader_bridge.cc @@ -24,6 +24,7 @@ ResourceLoaderBridge::RequestInfo::~RequestInfo() { ResourceLoaderBridge::ResponseInfo::ResponseInfo() { content_length = -1; appcache_id = appcache::kNoCacheId; + was_fetched_via_spdy = false; } ResourceLoaderBridge::ResponseInfo::~ResponseInfo() { diff --git a/webkit/glue/resource_loader_bridge.h b/webkit/glue/resource_loader_bridge.h index 95ed6ac..a1ede6c 100644 --- a/webkit/glue/resource_loader_bridge.h +++ b/webkit/glue/resource_loader_bridge.h @@ -121,6 +121,9 @@ class ResourceLoaderBridge { // 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; + + // True if the response was delivered using SPDY. + bool was_fetched_via_spdy; }; // See the SyncLoad method declared below. (The name of this struct is not diff --git a/webkit/glue/weburlloader_impl.cc b/webkit/glue/weburlloader_impl.cc index 55f022c..ebfb11d 100644 --- a/webkit/glue/weburlloader_impl.cc +++ b/webkit/glue/weburlloader_impl.cc @@ -164,6 +164,7 @@ void PopulateURLResponse( response->setSecurityInfo(info.security_info); response->setAppCacheID(info.appcache_id); response->setAppCacheManifestURL(info.appcache_manifest_url); + response->setWasFetchedViaSPDY(info.was_fetched_via_spdy); const net::HttpResponseHeaders* headers = info.headers; if (!headers) |