Chromium Code Reviews| 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 2613d684f3773d15e91d2251abbd2152cc64ca04..861c35381b075a4fa6906896d68d92fa45365c92 100644 |
| --- a/chrome/browser/devtools/devtools_sanity_browsertest.cc |
| +++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc |
| @@ -64,6 +64,9 @@ |
| #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/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" |
| @@ -94,6 +97,9 @@ 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[] = "files/devtools/image.png"; |
| const char kSlowTestPage[] = |
| "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2"; |
| const char kSharedWorkerTestPage[] = |
| @@ -165,6 +171,61 @@ void SwitchToExtensionPanel(DevToolsWindow* window, |
| SwitchToPanel(window, (prefix + panel_name).c_str()); |
| } |
| +class PushTimesMockURLRequestJob : public net::URLRequestHttpJob { |
|
mmenke
2016/04/08 16:21:36
I'd rather this not inherit from URLRequestHttpJob
caseq
2016/04/08 22:39:28
Done. Note I also took a liberty to nuke another s
|
| + public: |
| + PushTimesMockURLRequestJob(net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) |
| + : net::URLRequestHttpJob(request, |
| + network_delegate, |
| + request->context()->http_user_agent_settings()) { |
| + } |
| + |
| + void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const override { |
| + net::URLRequestHttpJob::GetLoadTimingInfo(load_timing_info); |
| + if (push_end_.is_null()) |
| + push_end_ = base::TimeTicks::Now(); |
| + load_timing_info->push_start = |
| + request()->creation_time() - base::TimeDelta::FromMilliseconds(10); |
| + load_timing_info->push_end = push_end_; |
| + } |
| + |
| + private: |
| + mutable base::TimeTicks push_end_; |
| + DISALLOW_COPY_AND_ASSIGN(PushTimesMockURLRequestJob); |
| +}; |
| + |
| +class TestInterceptor : public net::URLRequestInterceptor { |
| + public: |
| + explicit TestInterceptor(const GURL& url) : url_(url) {} |
| + |
| + // Registers |this| with the URLRequestFilter, which takes ownership of it. |
| + void Register() { |
|
mmenke
2016/04/08 16:21:36
Suggest making this static, and having it create t
caseq
2016/04/08 22:39:28
Done.
|
| + EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
| + url_, scoped_ptr<net::URLRequestInterceptor>(this)); |
|
mmenke
2016/04/08 16:21:36
scoped_ptr<net::URLRequestInterceptor> -> make_sco
caseq
2016/04/08 22:39:28
Done.
|
| + } |
| + |
| + // Unregisters |this| with the URLRequestFilter, which should then delete |
| + // |this|. |
| + void Unregister() { |
|
mmenke
2016/04/08 16:21:36
Again, suggest making this static. Does mean you'
caseq
2016/04/08 22:39:28
Done.
|
| + EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + net::URLRequestFilter::GetInstance()->RemoveUrlHandler(url_); |
| + } |
| + |
| + // net::URLRequestJobFactory::ProtocolHandler implementation: |
| + net::URLRequestJob* MaybeInterceptRequest( |
| + net::URLRequest* request, |
| + net::NetworkDelegate* network_delegate) const override { |
| + EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + return new PushTimesMockURLRequestJob(request, network_delegate); |
| + } |
| + |
| + private: |
| + GURL url_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(TestInterceptor); |
| +}; |
| + |
| } // namespace |
| class DevToolsSanityTest : public InProcessBrowserTest { |
| @@ -942,6 +1003,23 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) { |
| RunTest("testNetworkRawHeadersText", kChunkedTestPage); |
| } |
| +// Tests raw headers text. |
| +IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkPushTime) { |
| + OpenDevToolsWindow(kPushTestPage, false); |
| + GURL push_url = spawned_test_server()->GetURL(kPushTestResource); |
| + TestInterceptor* test_interceptor = new TestInterceptor(push_url); |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| + base::Bind(&TestInterceptor::Register, |
| + base::Unretained(test_interceptor))); |
| + |
| + DispatchOnTestSuite(window_, "testPushTimes", push_url.spec().c_str()); |
|
mmenke
2016/04/08 16:21:36
Can we check that the push time is less that send_
caseq
2016/04/08 22:39:28
That's exactly what happens in testPushTime() -- h
mmenke
2016/04/11 17:45:52
Wait....So a chrome/browser/devtools/ test is usin
caseq
2016/04/13 21:48:45
It's been this way since about the time we introdu
mmenke
2016/04/14 15:50:33
The question isn't what's common, or what we expec
mmenke
2016/04/14 15:50:33
Happy to defer to him on that, but he should take
|
| + |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| + base::Bind(&TestInterceptor::Unregister, |
| + base::Unretained(test_interceptor))); |
| + CloseDevToolsWindow(); |
| +} |
| + |
| // Tests that console messages are not duplicated on navigation back. |
| #if defined(OS_WIN) |
| // Flaking on windows swarm try runs: crbug.com/409285. |