Index: content/browser/loader/resource_dispatcher_host_browsertest.cc |
diff --git a/content/browser/loader/resource_dispatcher_host_browsertest.cc b/content/browser/loader/resource_dispatcher_host_browsertest.cc |
index 9b871671c6ad4ce28b8dd7c584e4818b59a5307d..f82fe7cabc52158b243ade7aebb6b2affcfe324d 100644 |
--- a/content/browser/loader/resource_dispatcher_host_browsertest.cc |
+++ b/content/browser/loader/resource_dispatcher_host_browsertest.cc |
@@ -2,7 +2,10 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
#include "base/memory/ref_counted.h" |
+#include "base/run_loop.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -18,6 +21,7 @@ |
#include "content/public/test/browser_test_utils.h" |
#include "content/public/test/content_browser_test.h" |
#include "content/public/test/content_browser_test_utils.h" |
+#include "content/public/test/test_navigation_observer.h" |
#include "content/public/test/test_utils.h" |
#include "content/shell/browser/shell.h" |
#include "content/shell/browser/shell_content_browser_client.h" |
@@ -28,6 +32,8 @@ |
#include "net/test/embedded_test_server/http_response.h" |
#include "net/test/url_request/url_request_failed_job.h" |
#include "net/test/url_request/url_request_mock_http_job.h" |
+#include "net/url_request/url_request.h" |
+#include "url/gurl.h" |
using base::ASCIIToUTF16; |
@@ -533,4 +539,215 @@ IN_PROC_BROWSER_TEST_F(ResourceDispatcherHostBrowserTest, |
delegate.page_transition() & ui::PAGE_TRANSITION_CLIENT_REDIRECT); |
} |
+namespace { |
+ |
+// Checks whether the given urls are requested, and that IsUsingLofi() returns |
+// the appropriate value when the Lo-Fi state is set. |
+class LoFiModeResourceDispatcherHostDelegate |
+ : public ResourceDispatcherHostDelegate { |
+ public: |
+ LoFiModeResourceDispatcherHostDelegate(const GURL& main_frame_url, |
+ const GURL& subresource_url, |
+ const GURL& iframe_url) |
+ : main_frame_url_(main_frame_url), |
+ subresource_url_(subresource_url), |
+ iframe_url_(iframe_url), |
+ main_frame_url_seen_(false), |
+ subresource_url_seen_(false), |
+ iframe_url_seen_(false), |
+ use_lofi_(false), |
+ should_enable_lofi_mode_called_(false) {} |
+ |
+ ~LoFiModeResourceDispatcherHostDelegate() override {} |
+ |
+ // ResourceDispatcherHostDelegate implementation: |
+ void RequestBeginning(net::URLRequest* request, |
+ ResourceContext* resource_context, |
+ AppCacheService* appcache_service, |
+ ResourceType resource_type, |
+ ScopedVector<ResourceThrottle>* throttles) override { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
+ if (request->url() != main_frame_url_ && request->url() != subresource_url_ |
+ && request->url() != iframe_url_) |
+ return; |
+ if (request->url() == main_frame_url_) { |
+ EXPECT_FALSE(main_frame_url_seen_); |
+ main_frame_url_seen_ = true; |
+ } else if (request->url() == subresource_url_) { |
+ EXPECT_TRUE(main_frame_url_seen_); |
+ EXPECT_FALSE(subresource_url_seen_); |
+ subresource_url_seen_ = true; |
+ } else if (request->url() == iframe_url_) { |
+ EXPECT_TRUE(main_frame_url_seen_); |
+ EXPECT_FALSE(iframe_url_seen_); |
+ iframe_url_seen_ = true; |
+ } |
+ EXPECT_EQ(use_lofi_, info->IsUsingLoFi()); |
+ } |
+ |
+ void SetDelegate() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ ResourceDispatcherHost::Get()->SetDelegate(this); |
+ } |
+ |
+ bool ShouldEnableLoFiMode( |
+ const net::URLRequest& request, |
+ content::ResourceContext* resource_context) override { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ EXPECT_FALSE(should_enable_lofi_mode_called_); |
+ should_enable_lofi_mode_called_ = true; |
+ EXPECT_EQ(main_frame_url_, request.url()); |
+ return use_lofi_; |
+ } |
+ |
+ void Reset(bool use_lofi) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ main_frame_url_seen_ = false; |
+ subresource_url_seen_ = false; |
+ iframe_url_seen_ = false; |
+ use_lofi_ = use_lofi; |
+ should_enable_lofi_mode_called_ = false; |
+ } |
+ |
+ void CheckResourcesRequested(bool should_enable_lofi_mode_called) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ EXPECT_EQ(should_enable_lofi_mode_called, should_enable_lofi_mode_called_); |
+ EXPECT_TRUE(main_frame_url_seen_); |
+ EXPECT_TRUE(subresource_url_seen_); |
+ EXPECT_TRUE(iframe_url_seen_); |
+ } |
+ |
+ private: |
+ const GURL main_frame_url_; |
+ const GURL subresource_url_; |
+ const GURL iframe_url_; |
+ |
+ bool main_frame_url_seen_; |
+ bool subresource_url_seen_; |
+ bool iframe_url_seen_; |
+ bool use_lofi_; |
+ bool should_enable_lofi_mode_called_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LoFiModeResourceDispatcherHostDelegate); |
+}; |
+ |
+} // namespace |
+ |
+class LoFiResourceDispatcherHostBrowserTest : public ContentBrowserTest { |
+ public: |
+ ~LoFiResourceDispatcherHostBrowserTest() override {} |
+ |
+ protected: |
+ void SetUpOnMainThread() override { |
+ ContentBrowserTest::SetUpOnMainThread(); |
+ |
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
+ |
+ delegate_.reset(new LoFiModeResourceDispatcherHostDelegate( |
+ embedded_test_server()->GetURL("/page_with_iframe.html"), |
+ embedded_test_server()->GetURL("/image.jpg"), |
+ embedded_test_server()->GetURL("/title1.html"))); |
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&LoFiModeResourceDispatcherHostDelegate::SetDelegate, |
+ base::Unretained(delegate_.get()))); |
+ } |
+ |
+ void Reset(bool use_lofi) { |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, FROM_HERE, |
+ base::Bind(&LoFiModeResourceDispatcherHostDelegate::Reset, |
+ base::Unretained(delegate_.get()), use_lofi)); |
+ } |
+ |
+ void CheckResourcesRequested( |
+ bool should_enable_lofi_mode_called) { |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, FROM_HERE, |
+ base::Bind( |
+ &LoFiModeResourceDispatcherHostDelegate::CheckResourcesRequested, |
+ base::Unretained(delegate_.get()), should_enable_lofi_mode_called)); |
+ } |
+ |
+ private: |
+ scoped_ptr<LoFiModeResourceDispatcherHostDelegate> delegate_; |
+}; |
+ |
+// Test that navigating with ShouldEnableLoFiMode returning true fetches the |
+// resources with LOFI_ON. |
+IN_PROC_BROWSER_TEST_F(LoFiResourceDispatcherHostBrowserTest, |
+ ShouldEnableLoFiModeOn) { |
+ // Navigate with ShouldEnableLoFiMode returning true. |
+ Reset(true); |
+ NavigateToURLBlockUntilNavigationsComplete( |
+ shell(), embedded_test_server()->GetURL("/page_with_iframe.html"), 1); |
+ CheckResourcesRequested(true); |
+} |
+ |
+// Test that navigating with ShouldEnableLoFiMode returning false fetches the |
+// resources with LOFI_OFF. |
+IN_PROC_BROWSER_TEST_F(LoFiResourceDispatcherHostBrowserTest, |
+ ShouldEnableLoFiModeOff) { |
+ // Navigate with ShouldEnableLoFiMode returning false. |
+ NavigateToURLBlockUntilNavigationsComplete( |
+ shell(), embedded_test_server()->GetURL("/page_with_iframe.html"), 1); |
+ CheckResourcesRequested(true); |
+} |
+ |
+// Test that reloading calls ShouldEnableLoFiMode again and changes the Lo-Fi |
+// state. |
+IN_PROC_BROWSER_TEST_F(LoFiResourceDispatcherHostBrowserTest, |
+ ShouldEnableLoFiModeReload) { |
+ // Navigate with ShouldEnableLoFiMode returning false. |
+ NavigateToURLBlockUntilNavigationsComplete( |
+ shell(), embedded_test_server()->GetURL("/page_with_iframe.html"), 1); |
+ CheckResourcesRequested(true); |
+ |
+ // Reload. ShouldEnableLoFiMode should be called. |
+ Reset(true); |
+ ReloadBlockUntilNavigationsComplete(shell(), 1); |
+ CheckResourcesRequested(true); |
+} |
+ |
+// Test that navigating backwards calls ShouldEnableLoFiMode again and changes |
+// the Lo-Fi state. |
+IN_PROC_BROWSER_TEST_F(LoFiResourceDispatcherHostBrowserTest, |
+ ShouldEnableLoFiModeNavigateBackThenForward) { |
+ // Navigate with ShouldEnableLoFiMode returning false. |
+ NavigateToURLBlockUntilNavigationsComplete( |
+ shell(), embedded_test_server()->GetURL("/page_with_iframe.html"), 1); |
+ CheckResourcesRequested(true); |
+ |
+ // Go to a different page. |
+ NavigateToURLBlockUntilNavigationsComplete(shell(), GURL("about:blank"), 1); |
+ |
+ // Go back with ShouldEnableLoFiMode returning true. |
+ Reset(true); |
+ TestNavigationObserver tab_observer(shell()->web_contents(), 1); |
+ shell()->GoBackOrForward(-1); |
+ tab_observer.Wait(); |
+ CheckResourcesRequested(true); |
+} |
+ |
+// Test that reloading with Lo-Fi disabled doesn't call ShouldEnableLoFiMode and |
+// already has LOFI_OFF. |
+IN_PROC_BROWSER_TEST_F(LoFiResourceDispatcherHostBrowserTest, |
+ ShouldEnableLoFiModeReloadDisableLoFi) { |
+ // Navigate with ShouldEnableLoFiMode returning true. |
+ Reset(true); |
+ NavigateToURLBlockUntilNavigationsComplete( |
+ shell(), embedded_test_server()->GetURL("/page_with_iframe.html"), 1); |
+ CheckResourcesRequested(true); |
+ |
+ // Reload with Lo-Fi disabled. |
+ Reset(false); |
+ TestNavigationObserver tab_observer(shell()->web_contents(), 1); |
+ shell()->web_contents()->GetController().ReloadDisableLoFi(true); |
+ tab_observer.Wait(); |
+ CheckResourcesRequested(false); |
+} |
+ |
} // namespace content |