Index: chrome/browser/prerender/prerender_test_utils.cc |
diff --git a/chrome/browser/prerender/prerender_test_utils.cc b/chrome/browser/prerender/prerender_test_utils.cc |
index 3f830e5733b62d03fdc3cafea9cebe8bb8395457..3f5a6627df7a17a1442cec4df3dcf24b41b7b35b 100644 |
--- a/chrome/browser/prerender/prerender_test_utils.cc |
+++ b/chrome/browser/prerender/prerender_test_utils.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/prerender/prerender_test_utils.h" |
#include "base/command_line.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/prerender/prerender_manager.h" |
#include "chrome/browser/prerender/prerender_manager_factory.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -13,6 +14,8 @@ |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/common/pref_names.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "chrome/test/base/ui_test_utils.h" |
#include "components/prefs/pref_service.h" |
#include "content/public/browser/notification_details.h" |
#include "content/public/browser/notification_source.h" |
@@ -24,6 +27,7 @@ |
#include "net/url_request/url_request_filter.h" |
#include "ppapi/shared_impl/ppapi_switches.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/l10n/l10n_util.h" |
using content::BrowserThread; |
using content::RenderViewHost; |
@@ -63,7 +67,7 @@ class MockHTTPJob : public net::URLRequestMockHTTPJob { |
base::Closure start_callback_; |
}; |
-// Protocol handler which counts the number of requests that start. |
+// URLRequestInterceptor which counts the number of requests that start. |
class CountingInterceptor : public net::URLRequestInterceptor { |
public: |
CountingInterceptor(const base::FilePath& file, |
@@ -206,6 +210,8 @@ void FakeSafeBrowsingDatabaseManager::OnCheckBrowseURLDone(const GURL& gurl, |
sb_check.OnSafeBrowsingResult(); |
} |
+TestPrerenderContents::DestroyObserver::~DestroyObserver() {} |
+ |
TestPrerenderContents::TestPrerenderContents( |
PrerenderManager* prerender_manager, |
Profile* profile, |
@@ -271,6 +277,23 @@ bool TestPrerenderContents::CheckURL(const GURL& url) { |
return true; |
} |
+void TestPrerenderContents::AddDestroyObserver( |
+ std::unique_ptr<DestroyObserver> observer) { |
+ if (final_status() != FINAL_STATUS_MAX) { |
+ // This contents has already been destroyed, so update the observer |
+ // immediately. |
+ observer->OnDestroy(final_status()); |
+ } |
+ destroy_observers_.push_back(std::move(observer)); |
+} |
+ |
+void TestPrerenderContents::Destroy(FinalStatus reason) { |
+ for (const auto& observer : destroy_observers_) { |
+ observer->OnDestroy(reason); |
+ } |
+ PrerenderContents::Destroy(reason); |
+} |
+ |
void TestPrerenderContents::OnRenderViewHostCreated( |
RenderViewHost* new_render_view_host) { |
// Used to make sure the RenderViewHost is hidden and, if used, |
@@ -307,6 +330,34 @@ void TestPrerenderContents::Observe( |
PrerenderContents::Observe(type, source, details); |
} |
+DestructionWaiter::DestructionWaiter(TestPrerenderContents* prerender_contents, |
+ FinalStatus expected_final_status) |
+ : expected_final_status_(expected_final_status), |
+ saw_correct_status_(false) { |
+ prerender_contents->AddDestroyObserver( |
+ base::MakeUnique<DestructionMarker>(this)); |
+} |
+ |
+bool DestructionWaiter::WaitForDestroy() { |
+ if (!saw_correct_status_) { |
+ wait_loop_.Run(); |
+ } |
+ return saw_correct_status_; |
+} |
+ |
+void DestructionWaiter::MarkDestruction(FinalStatus reason) { |
+ saw_correct_status_ = (reason == expected_final_status_); |
+ wait_loop_.Quit(); |
+} |
+ |
+DestructionWaiter::DestructionMarker::DestructionMarker( |
+ DestructionWaiter* waiter) |
+ : waiter_(waiter) {} |
+ |
+void DestructionWaiter::DestructionMarker::OnDestroy(FinalStatus reason) { |
+ waiter_->MarkDestruction(reason); |
+} |
+ |
TestPrerender::TestPrerender() |
: contents_(nullptr), number_of_loads_(0), expected_number_of_loads_(0) {} |
@@ -432,6 +483,15 @@ PrerenderInProcessBrowserTest::GetSessionStorageNamespace() const { |
return web_contents->GetController().GetDefaultSessionStorageNamespace(); |
} |
+std::string PrerenderInProcessBrowserTest::MakeAbsolute( |
+ const std::string& path) { |
+ CHECK(!path.empty()); |
+ if (path.front() == '/') { |
+ return path; |
+ } |
+ return "/" + path; |
+} |
+ |
bool PrerenderInProcessBrowserTest::UrlIsInPrerenderManager( |
const std::string& html_file) const { |
return UrlIsInPrerenderManager(embedded_test_server()->GetURL(html_file)); |
@@ -464,19 +524,10 @@ std::unique_ptr<TestPrerender> PrerenderInProcessBrowserTest::PrerenderTestURL( |
const std::string& html_file, |
FinalStatus expected_final_status, |
int expected_number_of_loads) { |
- GURL url = embedded_test_server()->GetURL(html_file); |
+ GURL url = src_server()->GetURL(MakeAbsolute(html_file)); |
return PrerenderTestURL(url, expected_final_status, expected_number_of_loads); |
} |
-ScopedVector<TestPrerender> PrerenderInProcessBrowserTest::PrerenderTestURL( |
- const std::string& html_file, |
- const std::vector<FinalStatus>& expected_final_status_queue, |
- int expected_number_of_loads) { |
- GURL url = embedded_test_server()->GetURL(html_file); |
- return PrerenderTestURLImpl(url, expected_final_status_queue, |
- expected_number_of_loads); |
-} |
- |
std::unique_ptr<TestPrerender> PrerenderInProcessBrowserTest::PrerenderTestURL( |
const GURL& url, |
FinalStatus expected_final_status, |
@@ -491,6 +542,15 @@ std::unique_ptr<TestPrerender> PrerenderInProcessBrowserTest::PrerenderTestURL( |
return std::unique_ptr<TestPrerender>(prerenders[0]); |
} |
+ScopedVector<TestPrerender> PrerenderInProcessBrowserTest::PrerenderTestURL( |
+ const std::string& html_file, |
+ const std::vector<FinalStatus>& expected_final_status_queue, |
+ int expected_number_of_loads) { |
+ GURL url = src_server()->GetURL(MakeAbsolute(html_file)); |
+ return PrerenderTestURLImpl(url, expected_final_status_queue, |
+ expected_number_of_loads); |
+} |
+ |
void PrerenderInProcessBrowserTest::SetUpInProcessBrowserTestFixture() { |
safe_browsing_factory_->SetTestDatabaseManager( |
new test_utils::FakeSafeBrowsingDatabaseManager()); |
@@ -523,15 +583,59 @@ void PrerenderInProcessBrowserTest::SetUpOnMainThread() { |
ASSERT_TRUE(safe_browsing_factory_->test_safe_browsing_service()); |
} |
+void PrerenderInProcessBrowserTest::UseHttpsSrcServer( |
+ std::function<void(net::EmbeddedTestServer*)> startup) { |
+ if (https_src_server_) |
+ return; |
+ https_src_server_.reset( |
+ new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS)); |
+ https_src_server_->ServeFilesFromSourceDirectory("chrome/test/data"); |
+ startup(https_src_server_.get()); |
+ CHECK(https_src_server_->Start()); |
+} |
+ |
+base::string16 PrerenderInProcessBrowserTest::MatchTaskManagerTab( |
+ const char* page_title) { |
+ return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX, |
+ base::ASCIIToUTF16(page_title)); |
+} |
+ |
+base::string16 PrerenderInProcessBrowserTest::MatchTaskManagerPrerender( |
+ const char* page_title) { |
+ return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX, |
+ base::ASCIIToUTF16(page_title)); |
+} |
+ |
+ScopedVector<TestPrerender> |
+PrerenderInProcessBrowserTest::NavigateWithPrerenders( |
+ GURL loader_url, |
+ const std::vector<FinalStatus>& expected_final_status_queue, |
+ int expected_number_of_loads) { |
+ CHECK(!expected_final_status_queue.empty()); |
+ ScopedVector<TestPrerender> prerenders; |
+ for (size_t i = 0; i < expected_final_status_queue.size(); i++) { |
+ prerenders.push_back( |
+ prerender_contents_factory() |
+ ->ExpectPrerenderContents(expected_final_status_queue[i]) |
+ .release()); |
+ } |
+ |
+ // Navigate to the loader URL and then wait for the first prerender to be |
+ // created. |
+ ui_test_utils::NavigateToURL(current_browser(), loader_url); |
+ prerenders.get().at(0)->WaitForCreate(); |
+ prerenders.get().at(0)->WaitForLoads(expected_number_of_loads); |
+ |
+ return prerenders; |
+} |
+ |
void CreateCountingInterceptorOnIO( |
const GURL& url, |
const base::FilePath& file, |
const base::WeakPtr<RequestCounter>& counter) { |
CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
- std::unique_ptr<net::URLRequestInterceptor> request_interceptor( |
- new CountingInterceptor(file, counter)); |
net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
- url, std::move(request_interceptor)); |
+ url, base::MakeUnique<CountingInterceptor>(file, counter)); |
} |
void CreateMockInterceptorOnIO(const GURL& url, const base::FilePath& file) { |