OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/prerender/prerender_test_utils.h" | 5 #include "chrome/browser/prerender/prerender_test_utils.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
| 13 #include "base/callback.h" |
13 #include "base/command_line.h" | 14 #include "base/command_line.h" |
14 #include "base/strings/string_split.h" | 15 #include "base/strings/string_split.h" |
15 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
16 #include "chrome/browser/loader/chrome_resource_dispatcher_host_delegate.h" | 17 #include "chrome/browser/loader/chrome_resource_dispatcher_host_delegate.h" |
17 #include "chrome/browser/prerender/prerender_manager.h" | 18 #include "chrome/browser/prerender/prerender_manager.h" |
18 #include "chrome/browser/prerender/prerender_manager_factory.h" | 19 #include "chrome/browser/prerender/prerender_manager_factory.h" |
19 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/safe_browsing/local_database_manager.h" | 21 #include "chrome/browser/safe_browsing/local_database_manager.h" |
21 #include "chrome/browser/ui/browser.h" | 22 #include "chrome/browser/ui/browser.h" |
22 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 23 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 content::BrowserThread::UI, FROM_HERE, | 99 content::BrowserThread::UI, FROM_HERE, |
99 base::Bind(&RequestCounter::RequestStarted, counter_)); | 100 base::Bind(&RequestCounter::RequestStarted, counter_)); |
100 } | 101 } |
101 | 102 |
102 private: | 103 private: |
103 base::FilePath file_; | 104 base::FilePath file_; |
104 base::WeakPtr<RequestCounter> counter_; | 105 base::WeakPtr<RequestCounter> counter_; |
105 mutable base::WeakPtrFactory<CountingInterceptor> weak_factory_; | 106 mutable base::WeakPtrFactory<CountingInterceptor> weak_factory_; |
106 }; | 107 }; |
107 | 108 |
108 // URLRequestInterceptor which asserts that the request is prefetch only. Pings | 109 class CountingInterceptorWithCallback : public net::URLRequestInterceptor { |
109 // |counter| after the flag is checked. | |
110 class PrefetchOnlyInterceptor : public net::URLRequestInterceptor { | |
111 public: | 110 public: |
112 explicit PrefetchOnlyInterceptor(const base::WeakPtr<RequestCounter>& counter) | 111 // Inserts the interceptor object to intercept requests to |url|. Can be |
113 : counter_(counter) {} | 112 // called on any thread. Assumes that |counter| lives on the UI thread. The |
114 ~PrefetchOnlyInterceptor() override {} | 113 // |callback_io| will be called on IO thread with the net::URLrequest |
| 114 // provided. |
| 115 static void Initialize(const GURL& url, |
| 116 RequestCounter* counter, |
| 117 base::Callback<void(net::URLRequest*)> callback_io) { |
| 118 content::BrowserThread::PostTask( |
| 119 content::BrowserThread::IO, FROM_HERE, |
| 120 base::Bind(&CountingInterceptorWithCallback::CreateAndAddOnIO, url, |
| 121 counter->AsWeakPtr(), callback_io)); |
| 122 } |
115 | 123 |
| 124 // net::URLRequestInterceptor: |
116 net::URLRequestJob* MaybeInterceptRequest( | 125 net::URLRequestJob* MaybeInterceptRequest( |
117 net::URLRequest* request, | 126 net::URLRequest* request, |
118 net::NetworkDelegate* network_delegate) const override { | 127 net::NetworkDelegate* network_delegate) const override { |
119 EXPECT_TRUE(request->load_flags() & net::LOAD_PREFETCH); | 128 // Run the callback. |
| 129 callback_.Run(request); |
| 130 |
| 131 // Ping the request counter. |
120 content::BrowserThread::PostTask( | 132 content::BrowserThread::PostTask( |
121 content::BrowserThread::UI, FROM_HERE, | 133 content::BrowserThread::UI, FROM_HERE, |
122 base::Bind(&RequestCounter::RequestStarted, counter_)); | 134 base::Bind(&RequestCounter::RequestStarted, counter_)); |
123 return nullptr; | 135 return nullptr; |
124 } | 136 } |
125 | 137 |
126 private: | 138 private: |
| 139 CountingInterceptorWithCallback( |
| 140 const base::WeakPtr<RequestCounter>& counter, |
| 141 base::Callback<void(net::URLRequest*)> callback) |
| 142 : callback_(callback), counter_(counter) {} |
| 143 |
| 144 static void CreateAndAddOnIO( |
| 145 const GURL& url, |
| 146 const base::WeakPtr<RequestCounter>& counter, |
| 147 base::Callback<void(net::URLRequest*)> callback_io) { |
| 148 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 149 // Create the object with base::WrapUnique to restrict access to the |
| 150 // constructor. |
| 151 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
| 152 url, base::WrapUnique( |
| 153 new CountingInterceptorWithCallback(counter, callback_io))); |
| 154 } |
| 155 |
| 156 base::Callback<void(net::URLRequest*)> callback_; |
127 base::WeakPtr<RequestCounter> counter_; | 157 base::WeakPtr<RequestCounter> counter_; |
| 158 |
| 159 DISALLOW_COPY_AND_ASSIGN(CountingInterceptorWithCallback); |
128 }; | 160 }; |
129 | 161 |
130 // URLRequestJob (and associated handler) which hangs. | 162 // URLRequestJob (and associated handler) which hangs. |
131 class HangingURLRequestJob : public net::URLRequestJob { | 163 class HangingURLRequestJob : public net::URLRequestJob { |
132 public: | 164 public: |
133 HangingURLRequestJob(net::URLRequest* request, | 165 HangingURLRequestJob(net::URLRequest* request, |
134 net::NetworkDelegate* network_delegate) | 166 net::NetworkDelegate* network_delegate) |
135 : net::URLRequestJob(request, network_delegate) { | 167 : net::URLRequestJob(request, network_delegate) { |
136 } | 168 } |
137 | 169 |
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 | 746 |
715 void CreateCountingInterceptorOnIO( | 747 void CreateCountingInterceptorOnIO( |
716 const GURL& url, | 748 const GURL& url, |
717 const base::FilePath& file, | 749 const base::FilePath& file, |
718 const base::WeakPtr<RequestCounter>& counter) { | 750 const base::WeakPtr<RequestCounter>& counter) { |
719 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 751 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
720 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 752 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
721 url, base::MakeUnique<CountingInterceptor>(file, counter)); | 753 url, base::MakeUnique<CountingInterceptor>(file, counter)); |
722 } | 754 } |
723 | 755 |
724 void CreatePrefetchOnlyInterceptorOnIO( | 756 void InterceptRequestAndCount( |
725 const GURL& url, | 757 const GURL& url, |
726 const base::WeakPtr<RequestCounter>& counter) { | 758 RequestCounter* counter, |
727 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 759 base::Callback<void(net::URLRequest*)> callback_io) { |
728 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 760 CountingInterceptorWithCallback::Initialize(url, counter, callback_io); |
729 url, base::MakeUnique<PrefetchOnlyInterceptor>(counter)); | |
730 } | 761 } |
731 | 762 |
732 void CreateMockInterceptorOnIO(const GURL& url, const base::FilePath& file) { | 763 void CreateMockInterceptorOnIO(const GURL& url, const base::FilePath& file) { |
733 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | 764 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
734 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 765 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
735 url, net::URLRequestMockHTTPJob::CreateInterceptorForSingleFile( | 766 url, net::URLRequestMockHTTPJob::CreateInterceptorForSingleFile( |
736 file, content::BrowserThread::GetBlockingPool())); | 767 file, content::BrowserThread::GetBlockingPool())); |
737 } | 768 } |
738 | 769 |
739 void CreateHangingFirstRequestInterceptorOnIO( | 770 void CreateHangingFirstRequestInterceptorOnIO( |
740 const GURL& url, const base::FilePath& file, base::Closure callback) { | 771 const GURL& url, const base::FilePath& file, base::Closure callback) { |
741 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 772 CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
742 std::unique_ptr<net::URLRequestInterceptor> interceptor( | 773 std::unique_ptr<net::URLRequestInterceptor> interceptor( |
743 new HangingFirstRequestInterceptor(file, callback)); | 774 new HangingFirstRequestInterceptor(file, callback)); |
744 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 775 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
745 url, std::move(interceptor)); | 776 url, std::move(interceptor)); |
746 } | 777 } |
747 | 778 |
748 } // namespace test_utils | 779 } // namespace test_utils |
749 | 780 |
750 } // namespace prerender | 781 } // namespace prerender |
OLD | NEW |