| Index: content/browser/service_worker/service_worker_browsertest.cc
|
| diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
|
| index 6129a10d67b9406c7036a95cc9b07ad3e7b66c3f..dda9572e0f216d339fda5c9838c54f601b47f8f7 100644
|
| --- a/content/browser/service_worker/service_worker_browsertest.cc
|
| +++ b/content/browser/service_worker/service_worker_browsertest.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include <stddef.h>
|
| #include <stdint.h>
|
| +#include <map>
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| @@ -31,19 +32,24 @@
|
| #include "content/common/service_worker/service_worker_types.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/content_browser_client.h"
|
| #include "content/public/browser/navigation_entry.h"
|
| #include "content/public/browser/render_process_host.h"
|
| +#include "content/public/browser/render_view_host.h"
|
| #include "content/public/browser/storage_partition.h"
|
| #include "content/public/browser/web_contents.h"
|
| +#include "content/public/common/content_client.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "content/public/common/referrer.h"
|
| #include "content/public/common/security_style.h"
|
| #include "content/public/common/ssl_status.h"
|
| +#include "content/public/common/web_preferences.h"
|
| #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/shell/browser/shell.h"
|
| #include "content/shell/browser/shell_content_browser_client.h"
|
| +#include "content/test/test_content_browser_client.h"
|
| #include "net/test/embedded_test_server/embedded_test_server.h"
|
| #include "net/test/embedded_test_server/http_request.h"
|
| #include "net/test/embedded_test_server/http_response.h"
|
| @@ -194,6 +200,25 @@ scoped_ptr<net::test_server::HttpResponse> VerifyServiceWorkerHeaderInRequest(
|
| return std::move(http_response);
|
| }
|
|
|
| +scoped_ptr<net::test_server::HttpResponse> VerifySaveDataHeaderInRequest(
|
| + const net::test_server::HttpRequest& request) {
|
| + auto it = request.headers.find("Save-Data");
|
| + EXPECT_NE(request.headers.end(), it);
|
| + EXPECT_EQ("on", it->second);
|
| +
|
| + scoped_ptr<net::test_server::BasicHttpResponse> http_response(
|
| + new net::test_server::BasicHttpResponse());
|
| + http_response->set_content_type("text/javascript");
|
| + return std::move(http_response);
|
| +}
|
| +
|
| +scoped_ptr<net::test_server::HttpResponse> VerifySaveDataHeaderNotInRequest(
|
| + const net::test_server::HttpRequest& request) {
|
| + auto it = request.headers.find("Save-Data");
|
| + EXPECT_EQ(request.headers.end(), it);
|
| + return make_scoped_ptr(new net::test_server::BasicHttpResponse());
|
| +}
|
| +
|
| // The ImportsBustMemcache test requires that the imported script
|
| // would naturally be cached in blink's memcache, but the embedded
|
| // test server doesn't produce headers that allow the blink's memcache
|
| @@ -1002,6 +1027,128 @@ IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
|
| ASSERT_FALSE(blob_data_handle);
|
| }
|
|
|
| +class MockContentBrowserClient : public TestContentBrowserClient {
|
| + public:
|
| + MockContentBrowserClient()
|
| + : TestContentBrowserClient(), data_saver_enabled_(false) {}
|
| +
|
| + ~MockContentBrowserClient() override {}
|
| +
|
| + void set_data_saver_enabled(bool enabled) { data_saver_enabled_ = enabled; }
|
| +
|
| + // ContentBrowserClient overrides:
|
| + bool IsDataSaverEnabled(BrowserContext* context) override {
|
| + return data_saver_enabled_;
|
| + }
|
| +
|
| + void OverrideWebkitPrefs(RenderViewHost* render_view_host,
|
| + WebPreferences* prefs) override {
|
| + prefs->data_saver_enabled = data_saver_enabled_;
|
| + }
|
| +
|
| + private:
|
| + bool data_saver_enabled_;
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchWithSaveData) {
|
| + embedded_test_server()->RegisterRequestHandler(
|
| + base::Bind(&VerifySaveDataHeaderInRequest));
|
| + MockContentBrowserClient content_browser_client;
|
| + content_browser_client.set_data_saver_enabled(true);
|
| + ContentBrowserClient* old_client =
|
| + SetBrowserClientForTesting(&content_browser_client);
|
| + InstallTestHelper("/service_worker/fetch_in_install.js", SERVICE_WORKER_OK);
|
| + SetBrowserClientForTesting(old_client);
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
|
| + RequestWorkerScriptWithSaveData) {
|
| + embedded_test_server()->RegisterRequestHandler(
|
| + base::Bind(&VerifySaveDataHeaderInRequest));
|
| + MockContentBrowserClient content_browser_client;
|
| + content_browser_client.set_data_saver_enabled(true);
|
| + ContentBrowserClient* old_client =
|
| + SetBrowserClientForTesting(&content_browser_client);
|
| + InstallTestHelper("/service_worker/generated_sw.js", SERVICE_WORKER_OK);
|
| + SetBrowserClientForTesting(old_client);
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchWithoutSaveData) {
|
| + embedded_test_server()->RegisterRequestHandler(
|
| + base::Bind(&VerifySaveDataHeaderNotInRequest));
|
| + MockContentBrowserClient content_browser_client;
|
| + ContentBrowserClient* old_client =
|
| + SetBrowserClientForTesting(&content_browser_client);
|
| + InstallTestHelper("/service_worker/fetch_in_install.js", SERVICE_WORKER_OK);
|
| + SetBrowserClientForTesting(old_client);
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, FetchPageWithSaveData) {
|
| + const char kPageUrl[] = "/service_worker/handle_fetch.html";
|
| + const char kWorkerUrl[] = "/service_worker/add_save_data_to_title.js";
|
| + MockContentBrowserClient content_browser_client;
|
| + content_browser_client.set_data_saver_enabled(true);
|
| + ContentBrowserClient* old_client =
|
| + SetBrowserClientForTesting(&content_browser_client);
|
| + shell()->web_contents()->GetRenderViewHost()->OnWebkitPreferencesChanged();
|
| + scoped_refptr<WorkerActivatedObserver> observer =
|
| + new WorkerActivatedObserver(wrapper());
|
| + observer->Init();
|
| + public_context()->RegisterServiceWorker(
|
| + embedded_test_server()->GetURL(kPageUrl),
|
| + embedded_test_server()->GetURL(kWorkerUrl),
|
| + base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
|
| + observer->Wait();
|
| +
|
| + const base::string16 title1 = base::ASCIIToUTF16("save-data=on");
|
| + TitleWatcher title_watcher1(shell()->web_contents(), title1);
|
| + NavigateToURL(shell(), embedded_test_server()->GetURL(kPageUrl));
|
| + EXPECT_EQ(title1, title_watcher1.WaitAndGetTitle());
|
| +
|
| + SetBrowserClientForTesting(old_client);
|
| + shell()->Close();
|
| +
|
| + base::RunLoop run_loop;
|
| + public_context()->UnregisterServiceWorker(
|
| + embedded_test_server()->GetURL(kPageUrl),
|
| + base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest,
|
| + FetchPageWithSaveDataPassThroughOnFetch) {
|
| + const char kPageUrl[] = "/service_worker/pass_through_fetch.html";
|
| + const char kWorkerUrl[] = "/service_worker/fetch_event_pass_through.js";
|
| + MockContentBrowserClient content_browser_client;
|
| + content_browser_client.set_data_saver_enabled(true);
|
| + ContentBrowserClient* old_client =
|
| + SetBrowserClientForTesting(&content_browser_client);
|
| + shell()->web_contents()->GetRenderViewHost()->OnWebkitPreferencesChanged();
|
| + scoped_refptr<WorkerActivatedObserver> observer =
|
| + new WorkerActivatedObserver(wrapper());
|
| + observer->Init();
|
| + public_context()->RegisterServiceWorker(
|
| + embedded_test_server()->GetURL(kPageUrl),
|
| + embedded_test_server()->GetURL(kWorkerUrl),
|
| + base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing)));
|
| + observer->Wait();
|
| +
|
| + embedded_test_server()->RegisterRequestHandler(
|
| + base::Bind(&VerifySaveDataHeaderInRequest));
|
| +
|
| + NavigateToURLBlockUntilNavigationsComplete(
|
| + shell(), embedded_test_server()->GetURL(kPageUrl), 1);
|
| +
|
| + SetBrowserClientForTesting(old_client);
|
| + shell()->Close();
|
| +
|
| + base::RunLoop run_loop;
|
| + public_context()->UnregisterServiceWorker(
|
| + embedded_test_server()->GetURL(kPageUrl),
|
| + base::Bind(&ExpectResultAndRun, true, run_loop.QuitClosure()));
|
| + run_loop.Run();
|
| +}
|
| +
|
| IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, Reload) {
|
| const char kPageUrl[] = "/service_worker/reload.html";
|
| const char kWorkerUrl[] = "/service_worker/fetch_event_reload.js";
|
|
|