Commit 61a972c3 authored by Antonio Gomes's avatar Antonio Gomes Committed by Commit Bot

Migrate TranslateURLFetcher to SimpleURLLoader

URLFetcher et al will stop working in the browser process with advent
of Network Service, and SimpleURLLoader is the replacement API
for most clients. CL migrates TranslateURLFetcher to the new API.

Additionally, various unittests were also updated to use the new
TestURLLoaderFactory and EmbeddedTestServer machinery.

As a bonus, the CL allows us to get of URLRequestContextGetter
references throughout the TranslateURLFetcher path, including
TranslateLanguageList, TranslateScript, etc.

Since TestURLFetcherFactory allowed us to retrieve the actual
URLFetcher object (given an known 'id'), and SimpleURLLoader does
not, some helper methods were introduced, in order to verify the
state of the objects at a certain moment of the execution flow,
eg LanguageFetchURLForTesting and HasOngoingLanguageListLoadingForTesting.

Last, in a follow up CL, I will change the nomenclature used
throughout these files, from "fetcher" to "loader".

Bug: 773295,844971
Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;master.tryserver.chromium.linux:linux_mojo;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: Ica404dded4fab79a0035df825f12d2b1bb06329e
Reviewed-on: https://chromium-review.googlesource.com/1085947Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Reviewed-by: default avatarSebastien Seguin-Gagnon <sebsg@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Reviewed-by: default avatarDavid Roger <droger@chromium.org>
Commit-Queue: Antonio Gomes <tonikitoo@igalia.com>
Cr-Commit-Position: refs/heads/master@{#567002}
parent 7f644bdf
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_features.h"
#include "components/network_session_configurator/common/network_switches.h" #include "components/network_session_configurator/common/network_switches.h"
#include "components/translate/core/browser/translate_manager.h" #include "components/translate/core/browser/translate_manager.h"
#include "components/translate/core/common/translate_switches.h"
#include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_controller.h"
#include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_registrar.h"
...@@ -64,6 +65,7 @@ ...@@ -64,6 +65,7 @@
#include "content/public/test/test_utils.h" #include "content/public/test/test_utils.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/controllable_http_response.h"
#include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_request_status.h" #include "net/url_request/url_request_status.h"
...@@ -292,6 +294,11 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest { ...@@ -292,6 +294,11 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
~AutofillInteractiveTestBase() override {} ~AutofillInteractiveTestBase() override {}
// InProcessBrowserTest: // InProcessBrowserTest:
void SetUp() override {
ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
InProcessBrowserTest::SetUp();
}
void SetUpOnMainThread() override { void SetUpOnMainThread() override {
https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
https_server_.ServeFilesFromSourceDirectory("chrome/test/data"); https_server_.ServeFilesFromSourceDirectory("chrome/test/data");
...@@ -312,9 +319,14 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest { ...@@ -312,9 +319,14 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5); reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5);
ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(reset_mouse)); ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(reset_mouse));
controllable_http_response_ =
std::make_unique<net::test_server::ControllableHttpResponse>(
embedded_test_server(), "/mock_translate_script.js",
true /*relative_url_is_prefix*/);
// Ensure that |embedded_test_server()| serves both domains used below. // Ensure that |embedded_test_server()| serves both domains used below.
host_resolver()->AddRule("*", "127.0.0.1"); host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->Start()); embedded_test_server()->StartAcceptingConnections();
} }
void TearDownOnMainThread() override { void TearDownOnMainThread() override {
...@@ -409,11 +421,7 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest { ...@@ -409,11 +421,7 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
color)); color));
} }
void SimulateURLFetch(bool success) { void SimulateURLFetch() {
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
net::Error error = success ? net::OK : net::ERR_FAILED;
std::string script = std::string script =
" var google = {};" " var google = {};"
"google.translate = (function() {" "google.translate = (function() {"
...@@ -442,11 +450,13 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest { ...@@ -442,11 +450,13 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
"})();" "})();"
"cr.googleTranslate.onTranslateElementLoad();"; "cr.googleTranslate.onTranslateElementLoad();";
fetcher->set_url(fetcher->GetOriginalURL()); controllable_http_response_->WaitForRequest();
fetcher->set_status(net::URLRequestStatus::FromError(error)); controllable_http_response_->Send(
fetcher->set_response_code(success ? 200 : 500); "HTTP/1.1 200 OK\r\n"
fetcher->SetResponseString(script); "Content-Type: text/javascript\r\n"
fetcher->delegate()->OnURLFetchComplete(fetcher); "\r\n");
controllable_http_response_->Send(script);
controllable_http_response_->Done();
} }
void FocusFieldByName(const std::string& name) { void FocusFieldByName(const std::string& name) {
...@@ -709,6 +719,9 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest { ...@@ -709,6 +719,9 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
base::test::ScopedFeatureList scoped_feature_list_; base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<net::test_server::ControllableHttpResponse>
controllable_http_response_;
DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTestBase); DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTestBase);
}; };
...@@ -722,6 +735,14 @@ class AutofillInteractiveTest : public AutofillInteractiveTestBase, ...@@ -722,6 +735,14 @@ class AutofillInteractiveTest : public AutofillInteractiveTestBase,
protected: protected:
AutofillInteractiveTest() : AutofillInteractiveTestBase(GetParam()) {} AutofillInteractiveTest() : AutofillInteractiveTestBase(GetParam()) {}
~AutofillInteractiveTest() override = default; ~AutofillInteractiveTest() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
AutofillInteractiveTestBase::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(
translate::switches::kTranslateScriptURL,
embedded_test_server()->GetURL("/mock_translate_script.js").spec());
}
}; };
// Test that basic form fill is working. // Test that basic form fill is working.
...@@ -1857,7 +1878,7 @@ IN_PROC_BROWSER_TEST_P(AutofillInteractiveTest, MAYBE_AutofillAfterTranslate) { ...@@ -1857,7 +1878,7 @@ IN_PROC_BROWSER_TEST_P(AutofillInteractiveTest, MAYBE_AutofillAfterTranslate) {
// Simulate the translate script being retrieved. // Simulate the translate script being retrieved.
// Pass fake google.translate lib as the translate script. // Pass fake google.translate lib as the translate script.
SimulateURLFetch(true); SimulateURLFetch();
// Simulate the render notifying the translation has been done. // Simulate the render notifying the translation has been done.
translation_observer.Wait(); translation_observer.Wait();
......
...@@ -16,9 +16,10 @@ ...@@ -16,9 +16,10 @@
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "components/translate/core/browser/translate_error_details.h" #include "components/translate/core/browser/translate_error_details.h"
#include "components/translate/core/common/language_detection_details.h" #include "components/translate/core/common/language_detection_details.h"
#include "components/translate/core/common/translate_switches.h"
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "net/test/embedded_test_server/http_request.h"
#include "net/url_request/url_fetcher_delegate.h" #include "net/test/embedded_test_server/http_response.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace { namespace {
...@@ -201,16 +202,17 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest { ...@@ -201,16 +202,17 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest {
content::NotificationService::AllSources())); content::NotificationService::AllSources()));
} }
void SimulateURLFetch(const std::string& script, bool success) { std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); const net::test_server::HttpRequest& request) {
ASSERT_TRUE(fetcher); if (request.GetURL().path() != "/mock_translate_script.js")
net::Error error = success ? net::OK : net::ERR_FAILED; return nullptr;
fetcher->set_url(fetcher->GetOriginalURL()); std::unique_ptr<net::test_server::BasicHttpResponse> http_response(
fetcher->set_status(net::URLRequestStatus::FromError(error)); new net::test_server::BasicHttpResponse);
fetcher->set_response_code(success ? 200 : 500); http_response->set_code(net::HTTP_OK);
fetcher->SetResponseString(script); http_response->set_content(script_);
fetcher->delegate()->OnURLFetchComplete(fetcher); http_response->set_content_type("text/javascript");
return std::move(http_response);
} }
void OnTranslateError(const translate::TranslateErrorDetails& details) { void OnTranslateError(const translate::TranslateErrorDetails& details) {
...@@ -234,11 +236,27 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest { ...@@ -234,11 +236,27 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest {
void SetUpOnMainThread() override { void SetUpOnMainThread() override {
ResetObserver(); ResetObserver();
error_type_ = translate::TranslateErrors::NONE; error_type_ = translate::TranslateErrors::NONE;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
&TranslateManagerBrowserTest::HandleRequest, base::Unretained(this)));
embedded_test_server()->StartAcceptingConnections();
} }
void SetUpCommandLine(base::CommandLine* command_line) override {
ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
private: command_line->AppendSwitchASCII(
net::TestURLFetcherFactory url_fetcher_factory_; translate::switches::kTranslateScriptURL,
embedded_test_server()->GetURL("/mock_translate_script.js").spec());
}
void TearDownOnMainThread() override {
EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
InProcessBrowserTest::TearDownOnMainThread();
}
void SetTranslateScript(const std::string& script) { script_ = script; }
private:
translate::TranslateErrors::Type error_type_; translate::TranslateErrors::Type error_type_;
std::unique_ptr< std::unique_ptr<
...@@ -252,12 +270,12 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest { ...@@ -252,12 +270,12 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest {
std::unique_ptr<LangageDetectionObserver> language_detected_signal_; std::unique_ptr<LangageDetectionObserver> language_detected_signal_;
std::unique_ptr<content::WindowedNotificationObserver> std::unique_ptr<content::WindowedNotificationObserver>
page_translated_signal_; page_translated_signal_;
std::string script_;
}; };
// Tests that the CLD (Compact Language Detection) works properly. // Tests that the CLD (Compact Language Detection) works properly.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) { IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) {
ASSERT_TRUE(embedded_test_server()->Start());
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
// The InProcessBrowserTest opens a new tab, let's wait for that first. // The InProcessBrowserTest opens a new tab, let's wait for that first.
...@@ -294,8 +312,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) { ...@@ -294,8 +312,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) {
// HTML attribute. For all other languages, the HTML attribute should be used. // HTML attribute. For all other languages, the HTML attribute should be used.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageLanguageDetectionConflict) { PageLanguageDetectionConflict) {
ASSERT_TRUE(embedded_test_server()->Start());
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
// The InProcessBrowserTest opens a new tab, let's wait for that first. // The InProcessBrowserTest opens a new tab, let's wait for that first.
...@@ -338,7 +354,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -338,7 +354,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test that the translation was successful. // Test that the translation was successful.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) { IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestValidScript);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -367,8 +383,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) { ...@@ -367,8 +383,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) {
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestValidScript, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -378,7 +392,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) { ...@@ -378,7 +392,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) {
// Test if there was an error during translation. // Test if there was an error during translation.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) { IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestValidScript);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -406,8 +420,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) { ...@@ -406,8 +420,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) {
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestValidScript, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -419,7 +431,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) { ...@@ -419,7 +431,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) {
// Test if there was an error during translate library initialization. // Test if there was an error during translate library initialization.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationInitializationError) { PageTranslationInitializationError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestScriptInitializationError);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -448,8 +460,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -448,8 +460,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestScriptInitializationError, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -461,7 +471,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -461,7 +471,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test the checks translate lib never gets ready and throws timeout. // Test the checks translate lib never gets ready and throws timeout.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationTimeoutError) { PageTranslationTimeoutError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestScriptTimeout);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -490,8 +500,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -490,8 +500,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestScriptTimeout, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -503,7 +511,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -503,7 +511,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test the checks if both source and target languages mentioned are identical. // Test the checks if both source and target languages mentioned are identical.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationIdenticalLanguagesError) { PageTranslationIdenticalLanguagesError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestScriptIdenticalLanguages);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -530,8 +538,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -530,8 +538,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetTranslateManager(); chrome_translate_client->GetTranslateManager();
manager->TranslatePage("aa", "en", true); manager->TranslatePage("aa", "en", true);
SimulateURLFetch(kTestScriptIdenticalLanguages, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -543,7 +549,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -543,7 +549,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test if there was an error during translatePage script execution. // Test if there was an error during translatePage script execution.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationUnexpectedScriptError) { PageTranslationUnexpectedScriptError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestScriptUnexpectedScriptError);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -572,8 +578,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -572,8 +578,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestScriptUnexpectedScriptError, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -585,7 +589,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -585,7 +589,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test if securityOrigin mentioned in url is valid. // Test if securityOrigin mentioned in url is valid.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationBadOriginError) { PageTranslationBadOriginError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestScriptBadOrigin);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -614,8 +618,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -614,8 +618,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestScriptBadOrigin, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
...@@ -626,7 +628,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -626,7 +628,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test if there was an error during script load. // Test if there was an error during script load.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationScriptLoadError) { PageTranslationScriptLoadError) {
ASSERT_TRUE(embedded_test_server()->Start()); SetTranslateScript(kTestScriptLoadError);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient(); ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
...@@ -655,8 +657,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, ...@@ -655,8 +657,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en", chrome_translate_client->GetLanguageState().original_language(), "en",
true); true);
SimulateURLFetch(kTestScriptLoadError, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification. // Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated(); WaitUntilPageTranslated();
......
...@@ -65,6 +65,8 @@ ...@@ -65,6 +65,8 @@
#include "net/url_request/url_fetcher_delegate.h" #include "net/url_request/url_fetcher_delegate.h"
#include "net/url_request/url_request_status.h" #include "net/url_request/url_request_status.h"
#include "net/url_request/url_request_test_util.h" #include "net/url_request/url_request_test_util.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "third_party/blink/public/web/web_context_menu_data.h" #include "third_party/blink/public/web/web_context_menu_data.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -215,6 +217,9 @@ class TranslateManagerRenderViewHostTest ...@@ -215,6 +217,9 @@ class TranslateManagerRenderViewHostTest
: pref_callback_( : pref_callback_(
base::Bind(&TranslateManagerRenderViewHostTest::OnPreferenceChanged, base::Bind(&TranslateManagerRenderViewHostTest::OnPreferenceChanged,
base::Unretained(this))), base::Unretained(this))),
test_shared_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)),
infobar_observer_(this) {} infobar_observer_(this) {}
#if !defined(USE_AURA) #if !defined(USE_AURA)
...@@ -472,8 +477,7 @@ class TranslateManagerRenderViewHostTest ...@@ -472,8 +477,7 @@ class TranslateManagerRenderViewHostTest
translate::TranslateDownloadManager::GetInstance(); translate::TranslateDownloadManager::GetInstance();
download_manager->ClearTranslateScriptForTesting(); download_manager->ClearTranslateScriptForTesting();
download_manager->SetTranslateScriptExpirationDelay(60 * 60 * 1000); download_manager->SetTranslateScriptExpirationDelay(60 * 60 * 1000);
download_manager->set_request_context(new net::TestURLRequestContextGetter( download_manager->set_url_loader_factory(test_shared_loader_factory_);
base::ThreadTaskRunnerHandle::Get()));
InfoBarService::CreateForWebContents(web_contents()); InfoBarService::CreateForWebContents(web_contents());
ChromeTranslateClient::CreateForWebContents(web_contents()); ChromeTranslateClient::CreateForWebContents(web_contents());
...@@ -492,21 +496,20 @@ class TranslateManagerRenderViewHostTest ...@@ -492,21 +496,20 @@ class TranslateManagerRenderViewHostTest
} }
void SimulateTranslateScriptURLFetch(bool success) { void SimulateTranslateScriptURLFetch(bool success) {
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( GURL url = translate::TranslateDownloadManager::GetInstance()
translate::TranslateScript::kFetcherId); ->script()
ASSERT_TRUE(fetcher); ->GetTranslateScriptURL();
net::Error error = success ? net::OK : net::ERR_FAILED; test_url_loader_factory_.AddResponse(
fetcher->set_url(fetcher->GetOriginalURL()); url.spec(), std::string(),
fetcher->set_status(net::URLRequestStatus::FromError(error)); success ? net::HTTP_OK : net::HTTP_INTERNAL_SERVER_ERROR);
fetcher->set_response_code(success ? 200 : 500); base::RunLoop().RunUntilIdle();
fetcher->delegate()->OnURLFetchComplete(fetcher);
test_url_loader_factory_.ClearResponses();
} }
void SimulateSupportedLanguagesURLFetch( void SimulateSupportedLanguagesURLFetch(
bool success, bool success,
const std::vector<std::string>& languages) { const std::vector<std::string>& languages) {
net::Error error = success ? net::OK : net::ERR_FAILED;
std::string data; std::string data;
if (success) { if (success) {
data = base::StringPrintf( data = base::StringPrintf(
...@@ -521,14 +524,17 @@ class TranslateManagerRenderViewHostTest ...@@ -521,14 +524,17 @@ class TranslateManagerRenderViewHostTest
} }
data += "}}"; data += "}}";
} }
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( GURL url = translate::TranslateDownloadManager::GetInstance()
translate::TranslateLanguageList::kFetcherId); ->language_list()
ASSERT_TRUE(fetcher != NULL); ->LanguageFetchURLForTesting();
fetcher->set_url(fetcher->GetOriginalURL()); EXPECT_TRUE(test_url_loader_factory_.IsPending(url.spec()));
fetcher->set_status(net::URLRequestStatus::FromError(error)); test_url_loader_factory_.AddResponse(
fetcher->set_response_code(success ? 200 : 500); url.spec(), data,
fetcher->SetResponseString(data); success ? net::HTTP_OK : net::HTTP_INTERNAL_SERVER_ERROR);
fetcher->delegate()->OnURLFetchComplete(fetcher); EXPECT_FALSE(test_url_loader_factory_.IsPending(url.spec()));
base::RunLoop().RunUntilIdle();
test_url_loader_factory_.ClearResponses();
} }
void SetPrefObserverExpectation(const char* path) { void SetPrefObserverExpectation(const char* path) {
...@@ -538,7 +544,8 @@ class TranslateManagerRenderViewHostTest ...@@ -538,7 +544,8 @@ class TranslateManagerRenderViewHostTest
PrefChangeRegistrar::NamedChangeCallback pref_callback_; PrefChangeRegistrar::NamedChangeCallback pref_callback_;
private: private:
net::TestURLFetcherFactory url_fetcher_factory_; network::TestURLLoaderFactory test_url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
// The infobars that have been removed. // The infobars that have been removed.
// WARNING: the pointers point to deleted objects, use only for comparison. // WARNING: the pointers point to deleted objects, use only for comparison.
...@@ -1695,8 +1702,8 @@ TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) { ...@@ -1695,8 +1702,8 @@ TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) {
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING, EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
bubble->GetViewState()); bubble->GetViewState());
// Simulate the translate script being retrieved (it only needs to be done // Set up a simulation of the translate script being retrieved (it only
// once in the test as it is cached). // needs to be done once in the test as it is cached).
SimulateTranslateScriptURLFetch(true); SimulateTranslateScriptURLFetch(true);
// Simulate the render notifying the translation has been done. // Simulate the render notifying the translation has been done.
......
...@@ -52,8 +52,6 @@ void TranslateService::Initialize() { ...@@ -52,8 +52,6 @@ void TranslateService::Initialize() {
g_translate_service->OnResourceRequestsAllowed(); g_translate_service->OnResourceRequestsAllowed();
translate::TranslateDownloadManager* download_manager = translate::TranslateDownloadManager* download_manager =
translate::TranslateDownloadManager::GetInstance(); translate::TranslateDownloadManager::GetInstance();
download_manager->set_request_context(
g_browser_process->system_request_context());
SystemNetworkContextManager* system_network_context_manager = SystemNetworkContextManager* system_network_context_manager =
g_browser_process->system_network_context_manager(); g_browser_process->system_network_context_manager();
// Manager will be null if called from InitializeForTesting. // Manager will be null if called from InitializeForTesting.
...@@ -73,7 +71,7 @@ void TranslateService::Shutdown(bool cleanup_pending_fetcher) { ...@@ -73,7 +71,7 @@ void TranslateService::Shutdown(bool cleanup_pending_fetcher) {
download_manager->Shutdown(); download_manager->Shutdown();
} else { } else {
// This path is only used by browser tests. // This path is only used by browser tests.
download_manager->set_request_context(NULL); download_manager->set_url_loader_factory(nullptr);
} }
} }
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include "chrome/browser/ui/views/translate/translate_bubble_view.h" #include "chrome/browser/ui/views/translate/translate_bubble_view.h"
#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_paths.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/test_switches.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "components/language/core/browser/url_language_histogram.h" #include "components/language/core/browser/url_language_histogram.h"
#include "components/translate/core/browser/translate_manager.h" #include "components/translate/core/browser/translate_manager.h"
...@@ -33,8 +32,7 @@ ...@@ -33,8 +32,7 @@
#include "components/translate/core/common/translate_switches.h" #include "components/translate/core/common/translate_switches.h"
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "net/test/embedded_test_server/controllable_http_response.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace { namespace {
...@@ -84,11 +82,31 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest { ...@@ -84,11 +82,31 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest {
void SetUp() override { void SetUp() override {
set_open_about_blank_on_browser_launch(true); set_open_about_blank_on_browser_launch(true);
translate::TranslateManager::SetIgnoreMissingKeyForTesting(true); translate::TranslateManager::SetIgnoreMissingKeyForTesting(true);
ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
InProcessBrowserTest::SetUp(); InProcessBrowserTest::SetUp();
} }
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitchASCII(
translate::switches::kTranslateScriptURL,
embedded_test_server()->GetURL("/mock_translate_script.js").spec());
}
void SetUpOnMainThread() override {
controllable_http_response_ =
std::make_unique<net::test_server::ControllableHttpResponse>(
embedded_test_server(), "/mock_translate_script.js",
true /*relative_url_is_prefix*/);
embedded_test_server()->StartAcceptingConnections();
}
void TearDown() override { InProcessBrowserTest::TearDown(); } void TearDown() override { InProcessBrowserTest::TearDown(); }
void TearDownOnMainThread() override {
EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
InProcessBrowserTest::TearDownOnMainThread();
}
protected: protected:
void InitInIncognitoMode(const bool incognito) { void InitInIncognitoMode(const bool incognito) {
browser_ = incognito ? CreateIncognitoBrowser() : browser(); browser_ = incognito ? CreateIncognitoBrowser() : browser();
...@@ -174,7 +192,6 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest { ...@@ -174,7 +192,6 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest {
private: private:
Browser* browser_; Browser* browser_;
net::TestURLFetcherFactory url_fetcher_factory_;
// Language detection sometimes fires early with an "und" detected code. This // Language detection sometimes fires early with an "und" detected code. This
// callback is used to wait until language detection succeeds. // callback is used to wait until language detection succeeds.
...@@ -187,16 +204,18 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest { ...@@ -187,16 +204,18 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest {
} }
void SimulateURLFetch() { void SimulateURLFetch() {
net::TestURLFetcher* const fetcher = url_fetcher_factory_.GetFetcherByID(0); controllable_http_response_->WaitForRequest();
ASSERT_TRUE(fetcher); controllable_http_response_->Send(
"HTTP/1.1 200 OK\r\n"
fetcher->set_url(fetcher->GetOriginalURL()); "Content-Type: text/javascript\r\n"
fetcher->set_status(net::URLRequestStatus::FromError(net::OK)); "\r\n");
fetcher->set_response_code(200); controllable_http_response_->Send(kTestValidScript);
fetcher->SetResponseString(kTestValidScript); controllable_http_response_->Done();
fetcher->delegate()->OnURLFetchComplete(fetcher);
} }
std::unique_ptr<net::test_server::ControllableHttpResponse>
controllable_http_response_;
DISALLOW_COPY_AND_ASSIGN(TranslateLanguageBrowserTest); DISALLOW_COPY_AND_ASSIGN(TranslateLanguageBrowserTest);
}; };
......
...@@ -124,6 +124,8 @@ source_set("unit_tests") { ...@@ -124,6 +124,8 @@ source_set("unit_tests") {
"//components/variations", "//components/variations",
"//net:test_support", "//net:test_support",
"//services/metrics/public/cpp:ukm_builders", "//services/metrics/public/cpp:ukm_builders",
"//services/network:test_support",
"//services/network/public/cpp:cpp",
"//testing/gtest", "//testing/gtest",
"//third_party/metrics_proto", "//third_party/metrics_proto",
"//ui/base", "//ui/base",
......
...@@ -3,6 +3,7 @@ include_rules = [ ...@@ -3,6 +3,7 @@ include_rules = [
"+components/metrics", "+components/metrics",
"+components/assist_ranker", "+components/assist_ranker",
"+services/metrics/public", "+services/metrics/public",
"+services/network/test",
] ]
specific_include_rules = { specific_include_rules = {
......
...@@ -26,7 +26,7 @@ void TranslateDownloadManager::Shutdown() { ...@@ -26,7 +26,7 @@ void TranslateDownloadManager::Shutdown() {
DCHECK(sequence_checker_.CalledOnValidSequence()); DCHECK(sequence_checker_.CalledOnValidSequence());
language_list_.reset(); language_list_.reset();
script_.reset(); script_.reset();
request_context_ = nullptr; url_loader_factory_ = nullptr;
} }
// static // static
......
...@@ -28,17 +28,6 @@ class TranslateDownloadManager { ...@@ -28,17 +28,6 @@ class TranslateDownloadManager {
// Returns the singleton instance. // Returns the singleton instance.
static TranslateDownloadManager* GetInstance(); static TranslateDownloadManager* GetInstance();
// The request context used to download the resources.
// Should be set before this class can be used.
net::URLRequestContextGetter* request_context() {
DCHECK(sequence_checker_.CalledOnValidSequence());
return request_context_.get();
}
void set_request_context(net::URLRequestContextGetter* context) {
DCHECK(sequence_checker_.CalledOnValidSequence());
request_context_ = context;
}
// The URL loader factory used to download the resources. // The URL loader factory used to download the resources.
// Should be set before this class can be used. // Should be set before this class can be used.
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory() { scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory() {
...@@ -120,7 +109,6 @@ class TranslateDownloadManager { ...@@ -120,7 +109,6 @@ class TranslateDownloadManager {
std::unique_ptr<TranslateScript> script_; std::unique_ptr<TranslateScript> script_;
std::string application_locale_; std::string application_locale_;
scoped_refptr<net::URLRequestContextGetter> request_context_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
}; };
......
...@@ -248,6 +248,14 @@ TranslateLanguageList::RegisterEventCallback(const EventCallback& callback) { ...@@ -248,6 +248,14 @@ TranslateLanguageList::RegisterEventCallback(const EventCallback& callback) {
return callback_list_.Add(callback); return callback_list_.Add(callback);
} }
bool TranslateLanguageList::HasOngoingLanguageListLoadingForTesting() {
return language_list_fetcher_->state() == TranslateURLFetcher::REQUESTING;
}
GURL TranslateLanguageList::LanguageFetchURLForTesting() {
return AddApiKeyToUrl(AddHostLocaleToUrl(TranslateLanguageUrl()));
}
// static // static
void TranslateLanguageList::DisableUpdate() { void TranslateLanguageList::DisableUpdate() {
update_is_disabled = true; update_is_disabled = true;
......
...@@ -66,6 +66,10 @@ class TranslateLanguageList { ...@@ -66,6 +66,10 @@ class TranslateLanguageList {
std::unique_ptr<EventCallbackList::Subscription> RegisterEventCallback( std::unique_ptr<EventCallbackList::Subscription> RegisterEventCallback(
const EventCallback& callback); const EventCallback& callback);
// Helper methods used by specific unit tests.
GURL LanguageFetchURLForTesting();
bool HasOngoingLanguageListLoadingForTesting();
// Disables the language list updater. This is used only for testing now. // Disables the language list updater. This is used only for testing now.
static void DisableUpdate(); static void DisableUpdate();
......
...@@ -7,15 +7,15 @@ ...@@ -7,15 +7,15 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "base/run_loop.h"
#include "base/test/bind_test_util.h"
#include "base/test/scoped_command_line.h" #include "base/test/scoped_command_line.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_url_util.h" #include "components/translate/core/browser/translate_url_util.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "net/url_request/url_fetcher_delegate.h" #include "services/network/test/test_url_loader_factory.h"
#include "net/url_request/url_request_status.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -31,10 +31,13 @@ TEST(TranslateLanguageListTest, SetSupportedLanguages) { ...@@ -31,10 +31,13 @@ TEST(TranslateLanguageListTest, SetSupportedLanguages) {
"}"); "}");
base::test::ScopedTaskEnvironment scoped_task_environment; base::test::ScopedTaskEnvironment scoped_task_environment;
network::TestURLLoaderFactory test_url_loader_factory;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory);
TranslateDownloadManager* manager = TranslateDownloadManager::GetInstance(); TranslateDownloadManager* manager = TranslateDownloadManager::GetInstance();
manager->set_application_locale("en"); manager->set_application_locale("en");
manager->set_request_context(new net::TestURLRequestContextGetter( manager->set_url_loader_factory(test_shared_loader_factory);
base::ThreadTaskRunnerHandle::Get()));
EXPECT_TRUE(manager->language_list()->SetSupportedLanguages(language_list)); EXPECT_TRUE(manager->language_list()->SetSupportedLanguages(language_list));
std::vector<std::string> results; std::vector<std::string> results;
...@@ -114,11 +117,23 @@ TEST(TranslateLanguageListTest, GetSupportedLanguages) { ...@@ -114,11 +117,23 @@ TEST(TranslateLanguageListTest, GetSupportedLanguages) {
TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) { TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) {
// Set up fake network environment. // Set up fake network environment.
base::test::ScopedTaskEnvironment scoped_task_environment; base::test::ScopedTaskEnvironment scoped_task_environment;
net::TestURLFetcherFactory url_fetcher_factory; network::TestURLLoaderFactory test_url_loader_factory;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory);
TranslateDownloadManager::GetInstance()->set_application_locale("en"); TranslateDownloadManager::GetInstance()->set_application_locale("en");
TranslateDownloadManager::GetInstance()->set_request_context( TranslateDownloadManager::GetInstance()->set_url_loader_factory(
new net::TestURLRequestContextGetter( test_shared_loader_factory);
base::ThreadTaskRunnerHandle::Get()));
GURL actual_url;
base::RunLoop loop;
// Since translate is allowed by policy, we will schedule a language list
// load. Intercept to ensure the URL is correct.
test_url_loader_factory.SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
actual_url = request.url;
loop.Quit();
}));
// Populate supported languages. // Populate supported languages.
std::vector<std::string> languages; std::vector<std::string> languages;
...@@ -126,24 +141,21 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) { ...@@ -126,24 +141,21 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) {
language_list.SetResourceRequestsAllowed(true); language_list.SetResourceRequestsAllowed(true);
language_list.GetSupportedLanguages(true /* translate_allowed */, &languages); language_list.GetSupportedLanguages(true /* translate_allowed */, &languages);
// Since translate is allowed by policy, we should have also scheduled a
// language list fetch.
net::TestURLFetcher* const fetcher =
url_fetcher_factory.GetFetcherByID(TranslateLanguageList::kFetcherId);
ASSERT_NE(nullptr, fetcher);
// Check that the correct URL is requested. // Check that the correct URL is requested.
const GURL expected_url = const GURL expected_url =
AddApiKeyToUrl(AddHostLocaleToUrl(language_list.TranslateLanguageUrl())); AddApiKeyToUrl(AddHostLocaleToUrl(language_list.TranslateLanguageUrl()));
const GURL actual_url = fetcher->GetOriginalURL();
EXPECT_TRUE(actual_url.is_valid());
EXPECT_EQ(expected_url.spec(), actual_url.spec());
// Simulate fetch completion with just Italian in the supported language list. // Simulate fetch completion with just Italian in the supported language list.
fetcher->set_status(net::URLRequestStatus()); test_url_loader_factory.AddResponse(expected_url.spec(),
fetcher->set_response_code(net::HTTP_OK); R"({"tl" : {"it" : "Italian"}})");
fetcher->SetResponseString(R"({"tl" : {"it" : "Italian"}})"); loop.Run();
fetcher->delegate()->OnURLFetchComplete(fetcher);
// Spin an extra loop so that we ensure the SimpleURLLoader fixture callback
// is called.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(actual_url.is_valid());
EXPECT_EQ(expected_url.spec(), actual_url.spec());
// Check that the language list has been updated correctly. // Check that the language list has been updated correctly.
languages.clear(); languages.clear();
...@@ -156,11 +168,13 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) { ...@@ -156,11 +168,13 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) {
TEST(TranslateLanguageListTest, GetSupportedLanguagesNoFetch) { TEST(TranslateLanguageListTest, GetSupportedLanguagesNoFetch) {
// Set up fake network environment. // Set up fake network environment.
base::test::ScopedTaskEnvironment scoped_task_environment; base::test::ScopedTaskEnvironment scoped_task_environment;
net::TestURLFetcherFactory url_fetcher_factory; network::TestURLLoaderFactory test_url_loader_factory;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory);
TranslateDownloadManager::GetInstance()->set_application_locale("en"); TranslateDownloadManager::GetInstance()->set_application_locale("en");
TranslateDownloadManager::GetInstance()->set_request_context( TranslateDownloadManager::GetInstance()->set_url_loader_factory(
new net::TestURLRequestContextGetter( test_shared_loader_factory);
base::ThreadTaskRunnerHandle::Get()));
// Populate supported languages. // Populate supported languages.
std::vector<std::string> languages; std::vector<std::string> languages;
...@@ -170,10 +184,9 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesNoFetch) { ...@@ -170,10 +184,9 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesNoFetch) {
&languages); &languages);
// Since translate is disabled by policy, we should *not* have scheduled a // Since translate is disabled by policy, we should *not* have scheduled a
// language list fetch. // language list load.
net::TestURLFetcher* const fetcher = EXPECT_FALSE(language_list.HasOngoingLanguageListLoadingForTesting());
url_fetcher_factory.GetFetcherByID(TranslateLanguageList::kFetcherId); EXPECT_TRUE(test_url_loader_factory.pending_requests()->empty());
ASSERT_EQ(nullptr, fetcher);
} }
} // namespace translate } // namespace translate
...@@ -48,6 +48,7 @@ class TranslateScript { ...@@ -48,6 +48,7 @@ class TranslateScript {
// to translate it). // to translate it).
void Request(const RequestCallback& callback); void Request(const RequestCallback& callback);
// Returns the URL to be used to load the translate script.
static GURL GetTranslateScriptURL(); static GURL GetTranslateScriptURL();
private: private:
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/test/bind_test_util.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h" #include "build/build_config.h"
...@@ -16,8 +17,8 @@ ...@@ -16,8 +17,8 @@
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/base/url_util.h" #include "net/base/url_util.h"
#include "net/http/http_request_headers.h" #include "net/http/http_request_headers.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "net/url_request/url_request_test_util.h" #include "services/network/test/test_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -25,15 +26,18 @@ namespace translate { ...@@ -25,15 +26,18 @@ namespace translate {
class TranslateScriptTest : public testing::Test { class TranslateScriptTest : public testing::Test {
public: public:
TranslateScriptTest() {} TranslateScriptTest()
: test_shared_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)) {}
protected: protected:
void SetUp() override { void SetUp() override {
script_.reset(new TranslateScript); script_.reset(new TranslateScript);
TranslateDownloadManager::GetInstance()->set_application_locale("en"); auto* translate_download_manager = TranslateDownloadManager::GetInstance();
TranslateDownloadManager::GetInstance()->set_request_context( translate_download_manager->set_application_locale("en");
new net::TestURLRequestContextGetter( translate_download_manager->set_url_loader_factory(
base::ThreadTaskRunnerHandle::Get())); test_shared_loader_factory_);
} }
void TearDown() override { script_.reset(); } void TearDown() override { script_.reset(); }
...@@ -43,8 +47,8 @@ class TranslateScriptTest : public testing::Test { ...@@ -43,8 +47,8 @@ class TranslateScriptTest : public testing::Test {
base::Bind(&TranslateScriptTest::OnComplete, base::Unretained(this))); base::Bind(&TranslateScriptTest::OnComplete, base::Unretained(this)));
} }
net::TestURLFetcher* GetTestURLFetcher() { network::TestURLLoaderFactory* GetTestURLLoaderFactory() {
return url_fetcher_factory_.GetFetcherByID(TranslateScript::kFetcherId); return &test_url_loader_factory_;
} }
private: private:
...@@ -57,24 +61,29 @@ class TranslateScriptTest : public testing::Test { ...@@ -57,24 +61,29 @@ class TranslateScriptTest : public testing::Test {
// The translate script. // The translate script.
std::unique_ptr<TranslateScript> script_; std::unique_ptr<TranslateScript> script_;
// Factory to create programmatic URL fetchers. // Factory to create programmatic URL loaders.
net::TestURLFetcherFactory url_fetcher_factory_; network::TestURLLoaderFactory test_url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
DISALLOW_COPY_AND_ASSIGN(TranslateScriptTest); DISALLOW_COPY_AND_ASSIGN(TranslateScriptTest);
}; };
TEST_F(TranslateScriptTest, CheckScriptParameters) { TEST_F(TranslateScriptTest, CheckScriptParameters) {
network::ResourceRequest last_resource_request;
GetTestURLLoaderFactory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
last_resource_request = request;
}));
Request(); Request();
net::TestURLFetcher* fetcher = GetTestURLFetcher();
ASSERT_TRUE(fetcher);
GURL expected_url(TranslateScript::kScriptURL); GURL expected_url(TranslateScript::kScriptURL);
GURL url = fetcher->GetOriginalURL(); GURL url = last_resource_request.url;
EXPECT_TRUE(url.is_valid()); EXPECT_TRUE(url.is_valid());
EXPECT_EQ(expected_url.GetOrigin().spec(), url.GetOrigin().spec()); EXPECT_EQ(expected_url.GetOrigin().spec(), url.GetOrigin().spec());
EXPECT_EQ(expected_url.path(), url.path()); EXPECT_EQ(expected_url.path(), url.path());
int load_flags = fetcher->GetLoadFlags(); int load_flags = last_resource_request.load_flags;
EXPECT_EQ(net::LOAD_DO_NOT_SEND_COOKIES, EXPECT_EQ(net::LOAD_DO_NOT_SEND_COOKIES,
load_flags & net::LOAD_DO_NOT_SEND_COOKIES); load_flags & net::LOAD_DO_NOT_SEND_COOKIES);
EXPECT_EQ(net::LOAD_DO_NOT_SAVE_COOKIES, EXPECT_EQ(net::LOAD_DO_NOT_SAVE_COOKIES,
...@@ -82,8 +91,7 @@ TEST_F(TranslateScriptTest, CheckScriptParameters) { ...@@ -82,8 +91,7 @@ TEST_F(TranslateScriptTest, CheckScriptParameters) {
std::string expected_extra_headers = std::string expected_extra_headers =
base::StringPrintf("%s\r\n\r\n", TranslateScript::kRequestHeader); base::StringPrintf("%s\r\n\r\n", TranslateScript::kRequestHeader);
net::HttpRequestHeaders extra_headers; net::HttpRequestHeaders extra_headers = last_resource_request.headers;
fetcher->GetExtraRequestHeaders(&extra_headers);
EXPECT_EQ(expected_extra_headers, extra_headers.ToString()); EXPECT_EQ(expected_extra_headers, extra_headers.ToString());
std::string always_use_ssl; std::string always_use_ssl;
...@@ -121,12 +129,16 @@ TEST_F(TranslateScriptTest, CheckScriptURL) { ...@@ -121,12 +129,16 @@ TEST_F(TranslateScriptTest, CheckScriptURL) {
command_line->AppendSwitchASCII(translate::switches::kTranslateScriptURL, command_line->AppendSwitchASCII(translate::switches::kTranslateScriptURL,
script_url); script_url);
network::ResourceRequest last_resource_request;
GetTestURLLoaderFactory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
last_resource_request = request;
}));
Request(); Request();
net::TestURLFetcher* fetcher = GetTestURLFetcher();
ASSERT_TRUE(fetcher);
GURL expected_url(script_url); GURL expected_url(script_url);
GURL url = fetcher->GetOriginalURL(); GURL url = last_resource_request.url;
EXPECT_TRUE(url.is_valid()); EXPECT_TRUE(url.is_valid());
EXPECT_EQ(expected_url.GetOrigin().spec(), url.GetOrigin().spec()); EXPECT_EQ(expected_url.GetOrigin().spec(), url.GetOrigin().spec());
EXPECT_EQ(expected_url.path(), url.path()); EXPECT_EQ(expected_url.path(), url.path());
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.h"
#include "net/traffic_annotation/network_traffic_annotation.h" #include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_fetcher.h" #include "services/network/public/cpp/resource_request.h"
#include "net/url_request/url_request_status.h" #include "services/network/public/cpp/simple_url_loader.h"
namespace translate { namespace translate {
...@@ -46,10 +46,10 @@ bool TranslateURLFetcher::Request(const GURL& url, ...@@ -46,10 +46,10 @@ bool TranslateURLFetcher::Request(const GURL& url,
// If the TranslateDownloadManager's request context getter is nullptr then // If the TranslateDownloadManager's request context getter is nullptr then
// shutdown is in progress. Abort the request, which can't proceed with a // shutdown is in progress. Abort the request, which can't proceed with a
// null request_context_getter. // null url_loader_factory.
scoped_refptr<net::URLRequestContextGetter> request_context_getter = network::mojom::URLLoaderFactory* url_loader_factory =
TranslateDownloadManager::GetInstance()->request_context(); TranslateDownloadManager::GetInstance()->url_loader_factory().get();
if (request_context_getter == nullptr) if (!url_loader_factory)
return false; return false;
net::NetworkTrafficAnnotationTag traffic_annotation = net::NetworkTrafficAnnotationTag traffic_annotation =
...@@ -89,41 +89,45 @@ bool TranslateURLFetcher::Request(const GURL& url, ...@@ -89,41 +89,45 @@ bool TranslateURLFetcher::Request(const GURL& url,
} }
} }
})"); })");
// Create and initialize the URL fetcher.
fetcher_ = net::URLFetcher::Create(id_, url_, net::URLFetcher::GET, this,
traffic_annotation);
data_use_measurement::DataUseUserData::AttachToFetcher(
fetcher_.get(), data_use_measurement::DataUseUserData::TRANSLATE);
fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
net::LOAD_DO_NOT_SAVE_COOKIES);
fetcher_->SetRequestContext(request_context_getter.get());
// Create and initialize URL loader.
auto resource_request = std::make_unique<network::ResourceRequest>();
resource_request->url = url_;
resource_request->load_flags =
net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES;
if (!extra_request_header_.empty())
resource_request->headers.AddHeadersFromString(extra_request_header_);
simple_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
traffic_annotation);
// Set retry parameter for HTTP status code 5xx. This doesn't work against // Set retry parameter for HTTP status code 5xx. This doesn't work against
// 106 (net::ERR_INTERNET_DISCONNECTED) and so on. // 106 (net::ERR_INTERNET_DISCONNECTED) and so on.
// TranslateLanguageList handles network status, and implements retry. // TranslateLanguageList handles network status, and implements retry.
fetcher_->SetMaxRetriesOn5xx(max_retry_on_5xx_); if (max_retry_on_5xx_) {
if (!extra_request_header_.empty()) simple_loader_->SetRetryOptions(
fetcher_->SetExtraRequestHeaders(extra_request_header_); max_retry_on_5xx_, network::SimpleURLLoader::RetryMode::RETRY_ON_5XX);
}
fetcher_->Start();
simple_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory,
base::BindOnce(&TranslateURLFetcher::OnSimpleLoaderComplete,
base::Unretained(this)));
return true; return true;
} }
void TranslateURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) { void TranslateURLFetcher::OnSimpleLoaderComplete(
DCHECK(fetcher_.get() == source); std::unique_ptr<std::string> response_body) {
std::string data; std::string data;
if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS && if (response_body) {
source->GetResponseCode() == net::HTTP_OK) { DCHECK_EQ(net::OK, simple_loader_->NetError());
data = std::move(*response_body);
state_ = COMPLETED; state_ = COMPLETED;
source->GetResponseAsString(&data);
} else { } else {
state_ = FAILED; state_ = FAILED;
} }
// Transfer URLFetcher's ownership before invoking a callback. simple_loader_.reset();
std::unique_ptr<const net::URLFetcher> delete_ptr(fetcher_.release());
std::move(callback_).Run(id_, state_ == COMPLETED, data); std::move(callback_).Run(id_, state_ == COMPLETED, data);
} }
......
...@@ -9,14 +9,17 @@ ...@@ -9,14 +9,17 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace network {
class SimpleURLLoader;
}
namespace translate { namespace translate {
// Downloads raw Translate data such as the Translate script and the language // Downloads raw Translate data such as the Translate script and the language
// list. // list.
class TranslateURLFetcher : public net::URLFetcherDelegate { class TranslateURLFetcher {
public: public:
// Callback type for Request(). // Callback type for Request().
using Callback = base::OnceCallback<void(int, bool, const std::string&)>; using Callback = base::OnceCallback<void(int, bool, const std::string&)>;
...@@ -30,7 +33,7 @@ class TranslateURLFetcher : public net::URLFetcherDelegate { ...@@ -30,7 +33,7 @@ class TranslateURLFetcher : public net::URLFetcherDelegate {
}; };
explicit TranslateURLFetcher(int id); explicit TranslateURLFetcher(int id);
~TranslateURLFetcher() override; ~TranslateURLFetcher();
int max_retry_on_5xx() { int max_retry_on_5xx() {
return max_retry_on_5xx_; return max_retry_on_5xx_;
...@@ -55,27 +58,27 @@ class TranslateURLFetcher : public net::URLFetcherDelegate { ...@@ -55,27 +58,27 @@ class TranslateURLFetcher : public net::URLFetcherDelegate {
// Gets internal state. // Gets internal state.
State state() { return state_; } State state() { return state_; }
// net::URLFetcherDelegate implementation:
void OnURLFetchComplete(const net::URLFetcher* source) override;
private: private:
void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
// URL to send the request. // URL to send the request.
GURL url_; GURL url_;
// ID which is assigned to the URLFetcher. // ID which is assigned to the request.
// TODO(tonikitoo): Get rid of this, after migrating to SimpleURLLoader.
const int id_; const int id_;
// Internal state. // Internal state.
enum State state_; enum State state_;
// URLFetcher instance. // SimpleURLLoader instance.
std::unique_ptr<net::URLFetcher> fetcher_; std::unique_ptr<network::SimpleURLLoader> simple_loader_;
// Callback passed at Request(). It will be invoked when an asynchronous // Callback passed at Request(). It will be invoked when an asynchronous
// fetch operation is finished. // load operation is finished.
Callback callback_; Callback callback_;
// Counts how many times did it try to fetch the language list. // Counts how many times did it try to load the language list.
int retry_count_; int retry_count_;
// Max number how many times to retry on the server error // Max number how many times to retry on the server error
......
...@@ -36,8 +36,8 @@ void TranslateServiceIOS::Initialize() { ...@@ -36,8 +36,8 @@ void TranslateServiceIOS::Initialize() {
g_translate_service->OnResourceRequestsAllowed(); g_translate_service->OnResourceRequestsAllowed();
translate::TranslateDownloadManager* download_manager = translate::TranslateDownloadManager* download_manager =
translate::TranslateDownloadManager::GetInstance(); translate::TranslateDownloadManager::GetInstance();
download_manager->set_request_context( download_manager->set_url_loader_factory(
GetApplicationContext()->GetSystemURLRequestContext()); GetApplicationContext()->GetSharedURLLoaderFactory());
download_manager->set_application_locale( download_manager->set_application_locale(
GetApplicationContext()->GetApplicationLocale()); GetApplicationContext()->GetApplicationLocale());
} }
......
...@@ -28,6 +28,8 @@ include_rules = [ ...@@ -28,6 +28,8 @@ include_rules = [
"+ios/web_view", "+ios/web_view",
"+net", "+net",
"+services/identity/public/cpp", "+services/identity/public/cpp",
"+services/network/public/cpp",
"+services/network/public/mojom",
"+third_party/ocmock", "+third_party/ocmock",
"+ui/base", "+ui/base",
"+ui/gfx", "+ui/gfx",
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "ios/web_view/cwv_web_view_features.h" #include "ios/web_view/cwv_web_view_features.h"
#include "ios/web_view/internal/app/web_view_io_thread.h" #include "ios/web_view/internal/app/web_view_io_thread.h"
#include "net/socket/client_socket_pool_manager.h" #include "net/socket/client_socket_pool_manager.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "ui/base/l10n/l10n_util_mac.h" #include "ui/base/l10n/l10n_util_mac.h"
namespace ios_web_view { namespace ios_web_view {
...@@ -48,6 +49,14 @@ void ApplicationContext::SaveState() { ...@@ -48,6 +49,14 @@ void ApplicationContext::SaveState() {
if (local_state_) { if (local_state_) {
local_state_->CommitPendingWrite(); local_state_->CommitPendingWrite();
} }
if (shared_url_loader_factory_)
shared_url_loader_factory_->Detach();
if (network_context_) {
web::WebThread::DeleteSoon(web::WebThread::IO, FROM_HERE,
network_context_owner_.release());
}
} }
void ApplicationContext::PostDestroyThreads() { void ApplicationContext::PostDestroyThreads() {
...@@ -103,6 +112,31 @@ net::URLRequestContextGetter* ApplicationContext::GetSystemURLRequestContext() { ...@@ -103,6 +112,31 @@ net::URLRequestContextGetter* ApplicationContext::GetSystemURLRequestContext() {
return web_view_io_thread_->system_url_request_context_getter(); return web_view_io_thread_->system_url_request_context_getter();
} }
scoped_refptr<network::SharedURLLoaderFactory>
ApplicationContext::GetSharedURLLoaderFactory() {
if (!url_loader_factory_) {
auto url_loader_factory_params =
network::mojom::URLLoaderFactoryParams::New();
url_loader_factory_params->process_id = network::mojom::kBrowserProcessId;
url_loader_factory_params->is_corb_enabled = false;
GetSystemNetworkContext()->CreateURLLoaderFactory(
mojo::MakeRequest(&url_loader_factory_),
std::move(url_loader_factory_params));
shared_url_loader_factory_ =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
url_loader_factory_.get());
}
return shared_url_loader_factory_;
}
network::mojom::NetworkContext* ApplicationContext::GetSystemNetworkContext() {
if (!network_context_) {
network_context_owner_ = std::make_unique<web::NetworkContextOwner>(
GetSystemURLRequestContext(), &network_context_);
}
return network_context_.get();
}
const std::string& ApplicationContext::GetApplicationLocale() { const std::string& ApplicationContext::GetApplicationLocale() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!application_locale_.empty()); DCHECK(!application_locale_.empty());
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/sequence_checker.h" #include "base/sequence_checker.h"
#include "ios/web/public/network_context_owner.h"
#include "services/network/public/mojom/network_service.mojom.h"
namespace base { namespace base {
template <typename T> template <typename T>
...@@ -20,6 +22,14 @@ namespace net { ...@@ -20,6 +22,14 @@ namespace net {
class URLRequestContextGetter; class URLRequestContextGetter;
} }
namespace network {
class SharedURLLoaderFactory;
class WeakWrapperSharedURLLoaderFactory;
namespace mojom {
class NetworkContext;
}
} // namespace network
namespace net_log { namespace net_log {
class ChromeNetLog; class ChromeNetLog;
} }
...@@ -41,6 +51,9 @@ class ApplicationContext { ...@@ -41,6 +51,9 @@ class ApplicationContext {
// Gets the URL request context associated with this application. // Gets the URL request context associated with this application.
net::URLRequestContextGetter* GetSystemURLRequestContext(); net::URLRequestContextGetter* GetSystemURLRequestContext();
scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory();
network::mojom::NetworkContext* GetSystemNetworkContext();
// Gets the locale used by the application. // Gets the locale used by the application.
const std::string& GetApplicationLocale(); const std::string& GetApplicationLocale();
...@@ -77,6 +90,14 @@ class ApplicationContext { ...@@ -77,6 +90,14 @@ class ApplicationContext {
std::unique_ptr<WebViewIOThread> web_view_io_thread_; std::unique_ptr<WebViewIOThread> web_view_io_thread_;
std::string application_locale_; std::string application_locale_;
network::mojom::NetworkContextPtr network_context_;
network::mojom::URLLoaderFactoryPtr url_loader_factory_;
scoped_refptr<network::WeakWrapperSharedURLLoaderFactory>
shared_url_loader_factory_;
// Created on the UI thread, destroyed on the IO thread.
std::unique_ptr<web::NetworkContextOwner> network_context_owner_;
DISALLOW_COPY_AND_ASSIGN(ApplicationContext); DISALLOW_COPY_AND_ASSIGN(ApplicationContext);
}; };
......
...@@ -47,9 +47,10 @@ void WebViewTranslateService::Initialize() { ...@@ -47,9 +47,10 @@ void WebViewTranslateService::Initialize() {
// Initialize translate. // Initialize translate.
translate::TranslateDownloadManager* download_manager = translate::TranslateDownloadManager* download_manager =
translate::TranslateDownloadManager::GetInstance(); translate::TranslateDownloadManager::GetInstance();
download_manager->set_request_context( download_manager->set_url_loader_factory(
ios_web_view::ApplicationContext::GetInstance() ios_web_view::ApplicationContext::GetInstance()
->GetSystemURLRequestContext()); ->GetSharedURLLoaderFactory()
.get());
download_manager->set_application_locale( download_manager->set_application_locale(
ios_web_view::ApplicationContext::GetInstance()->GetApplicationLocale()); ios_web_view::ApplicationContext::GetInstance()->GetApplicationLocale());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment