Index: chrome/browser/devtools/devtools_sanity_browsertest.cc |
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc |
index 5144111dcb448e53d70caea6f5a726b34e761137..ac3e29216261edd8504933af37dcb742018f7e4c 100644 |
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc |
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc |
@@ -8,6 +8,7 @@ |
#include "base/cancelable_callback.h" |
#include "base/command_line.h" |
#include "base/compiler_specific.h" |
+#include "base/files/file_path.h" |
#include "base/location.h" |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
@@ -64,9 +65,14 @@ |
#include "extensions/common/value_builder.h" |
#include "net/dns/mock_host_resolver.h" |
#include "net/test/spawned_test_server/spawned_test_server.h" |
+#include "net/test/url_request/url_request_mock_http_job.h" |
+#include "net/url_request/url_request_context.h" |
+#include "net/url_request/url_request_filter.h" |
+#include "net/url_request/url_request_http_job.h" |
#include "third_party/WebKit/public/web/WebInputEvent.h" |
#include "ui/compositor/compositor_switches.h" |
#include "ui/gl/gl_switches.h" |
+#include "url/gurl.h" |
using app_modal::AppModalDialog; |
using app_modal::JavaScriptAppModalDialog; |
@@ -94,6 +100,10 @@ const char kNavigateBackTestPage[] = |
const char kWindowOpenTestPage[] = "files/devtools/window_open.html"; |
const char kLatencyInfoTestPage[] = "files/devtools/latency_info.html"; |
const char kChunkedTestPage[] = "chunked"; |
+const char kPushTestPage[] = "files/devtools/push_test_page.html"; |
+// The resource is not really pushed, but mock url request job pretends it is. |
+const char kPushTestResource[] = "devtools/image.png"; |
+const char kPushUseNullEndTime[] = "pushUseNullEndTime"; |
const char kSlowTestPage[] = |
"chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2"; |
const char kSharedWorkerTestPage[] = |
@@ -165,6 +175,83 @@ void SwitchToExtensionPanel(DevToolsWindow* window, |
SwitchToPanel(window, (prefix + panel_name).c_str()); |
} |
+class PushTimesMockURLRequestJob : public net::URLRequestMockHTTPJob { |
+ public: |
+ PushTimesMockURLRequestJob(net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate, |
+ base::FilePath file_path) |
+ : net::URLRequestMockHTTPJob( |
+ request, |
+ network_delegate, |
+ file_path, |
+ BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( |
+ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)) {} |
+ |
+ void Start() override { |
+ load_timing_info_.socket_reused = true; |
+ load_timing_info_.request_start_time = base::Time::Now(); |
+ load_timing_info_.request_start = base::TimeTicks::Now(); |
+ load_timing_info_.send_start = base::TimeTicks::Now(); |
+ load_timing_info_.send_end = base::TimeTicks::Now(); |
+ load_timing_info_.receive_headers_end = base::TimeTicks::Now(); |
+ |
+ net::URLRequestMockHTTPJob::Start(); |
+ } |
+ |
+ void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const override { |
+ load_timing_info_.push_start = load_timing_info_.request_start - |
+ base::TimeDelta::FromMilliseconds(100); |
+ if (load_timing_info_.push_end.is_null() && |
+ request()->url().query() != kPushUseNullEndTime) { |
+ load_timing_info_.push_end = base::TimeTicks::Now(); |
+ } |
+ *load_timing_info = load_timing_info_; |
+ } |
+ |
+ private: |
+ mutable net::LoadTimingInfo load_timing_info_; |
+ DISALLOW_COPY_AND_ASSIGN(PushTimesMockURLRequestJob); |
+}; |
+ |
+class TestInterceptor : public net::URLRequestInterceptor { |
+ public: |
+ // Creates TestInterceptor and registers it with the URLRequestFilter, |
+ // which takes ownership of it. |
+ static void Register(const GURL& url, const base::FilePath& file_path) { |
+ EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ net::URLRequestFilter::GetInstance()->AddHostnameInterceptor( |
+ url.scheme(), url.host(), |
+ make_scoped_ptr(new TestInterceptor(url, file_path))); |
+ } |
+ |
+ // Unregisters previously created TestInterceptor, which should delete it. |
+ static void Unregister(const GURL& url) { |
+ EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(url.scheme(), |
+ url.host()); |
+ } |
+ |
+ // net::URLRequestJobFactory::ProtocolHandler implementation: |
+ net::URLRequestJob* MaybeInterceptRequest( |
+ net::URLRequest* request, |
+ net::NetworkDelegate* network_delegate) const override { |
+ EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (request->url().path() != url_.path()) |
+ return nullptr; |
+ return new PushTimesMockURLRequestJob(request, network_delegate, |
+ file_path_); |
+ } |
+ |
+ private: |
+ TestInterceptor(const GURL& url, const base::FilePath& file_path) |
+ : url_(url), file_path_(file_path) {} |
+ |
+ const GURL url_; |
+ const base::FilePath file_path_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestInterceptor); |
+}; |
+ |
} // namespace |
class DevToolsSanityTest : public InProcessBrowserTest { |
@@ -942,6 +1029,24 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) { |
RunTest("testNetworkRawHeadersText", kChunkedTestPage); |
} |
+IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkPushTime) { |
+ OpenDevToolsWindow(kPushTestPage, false); |
+ GURL push_url = spawned_test_server()->GetURL(kPushTestResource); |
+ base::FilePath file_path = |
+ spawned_test_server()->document_root().AppendASCII(kPushTestResource); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&TestInterceptor::Register, push_url, file_path)); |
+ |
+ DispatchOnTestSuite(window_, "testPushTimes", push_url.spec().c_str()); |
+ |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ base::Bind(&TestInterceptor::Unregister, push_url)); |
+ |
+ CloseDevToolsWindow(); |
+} |
+ |
// Tests that console messages are not duplicated on navigation back. |
#if defined(OS_WIN) |
// Flaking on windows swarm try runs: crbug.com/409285. |