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 @@
#include "components/autofill/core/common/autofill_features.h"
#include "components/network_session_configurator/common/network_switches.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/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
......@@ -64,6 +65,7 @@
#include "content/public/test/test_utils.h"
#include "net/base/net_errors.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/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_request_status.h"
......@@ -292,6 +294,11 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
~AutofillInteractiveTestBase() override {}
// InProcessBrowserTest:
void SetUp() override {
ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
InProcessBrowserTest::SetUp();
}
void SetUpOnMainThread() override {
https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK);
https_server_.ServeFilesFromSourceDirectory("chrome/test/data");
......@@ -312,9 +319,14 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5);
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.
host_resolver()->AddRule("*", "127.0.0.1");
ASSERT_TRUE(embedded_test_server()->Start());
embedded_test_server()->StartAcceptingConnections();
}
void TearDownOnMainThread() override {
......@@ -409,11 +421,7 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
color));
}
void SimulateURLFetch(bool success) {
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
net::Error error = success ? net::OK : net::ERR_FAILED;
void SimulateURLFetch() {
std::string script =
" var google = {};"
"google.translate = (function() {"
......@@ -442,11 +450,13 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
"})();"
"cr.googleTranslate.onTranslateElementLoad();";
fetcher->set_url(fetcher->GetOriginalURL());
fetcher->set_status(net::URLRequestStatus::FromError(error));
fetcher->set_response_code(success ? 200 : 500);
fetcher->SetResponseString(script);
fetcher->delegate()->OnURLFetchComplete(fetcher);
controllable_http_response_->WaitForRequest();
controllable_http_response_->Send(
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/javascript\r\n"
"\r\n");
controllable_http_response_->Send(script);
controllable_http_response_->Done();
}
void FocusFieldByName(const std::string& name) {
......@@ -709,6 +719,9 @@ class AutofillInteractiveTestBase : public InProcessBrowserTest {
base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<net::test_server::ControllableHttpResponse>
controllable_http_response_;
DISALLOW_COPY_AND_ASSIGN(AutofillInteractiveTestBase);
};
......@@ -722,6 +735,14 @@ class AutofillInteractiveTest : public AutofillInteractiveTestBase,
protected:
AutofillInteractiveTest() : AutofillInteractiveTestBase(GetParam()) {}
~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.
......@@ -1857,7 +1878,7 @@ IN_PROC_BROWSER_TEST_P(AutofillInteractiveTest, MAYBE_AutofillAfterTranslate) {
// Simulate the translate script being retrieved.
// Pass fake google.translate lib as the translate script.
SimulateURLFetch(true);
SimulateURLFetch();
// Simulate the render notifying the translation has been done.
translation_observer.Wait();
......
......@@ -16,9 +16,10 @@
#include "chrome/test/base/ui_test_utils.h"
#include "components/translate/core/browser/translate_error_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 "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
#include "url/gurl.h"
namespace {
......@@ -201,16 +202,17 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest {
content::NotificationService::AllSources()));
}
void SimulateURLFetch(const std::string& script, bool success) {
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
net::Error error = success ? net::OK : net::ERR_FAILED;
fetcher->set_url(fetcher->GetOriginalURL());
fetcher->set_status(net::URLRequestStatus::FromError(error));
fetcher->set_response_code(success ? 200 : 500);
fetcher->SetResponseString(script);
fetcher->delegate()->OnURLFetchComplete(fetcher);
std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
const net::test_server::HttpRequest& request) {
if (request.GetURL().path() != "/mock_translate_script.js")
return nullptr;
std::unique_ptr<net::test_server::BasicHttpResponse> http_response(
new net::test_server::BasicHttpResponse);
http_response->set_code(net::HTTP_OK);
http_response->set_content(script_);
http_response->set_content_type("text/javascript");
return std::move(http_response);
}
void OnTranslateError(const translate::TranslateErrorDetails& details) {
......@@ -234,11 +236,27 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest {
void SetUpOnMainThread() override {
ResetObserver();
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:
net::TestURLFetcherFactory url_fetcher_factory_;
command_line->AppendSwitchASCII(
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_;
std::unique_ptr<
......@@ -252,12 +270,12 @@ class TranslateManagerBrowserTest : public InProcessBrowserTest {
std::unique_ptr<LangageDetectionObserver> language_detected_signal_;
std::unique_ptr<content::WindowedNotificationObserver>
page_translated_signal_;
std::string script_;
};
// Tests that the CLD (Compact Language Detection) works properly.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) {
ASSERT_TRUE(embedded_test_server()->Start());
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
// The InProcessBrowserTest opens a new tab, let's wait for that first.
......@@ -294,8 +312,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageLanguageDetection) {
// HTML attribute. For all other languages, the HTML attribute should be used.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageLanguageDetectionConflict) {
ASSERT_TRUE(embedded_test_server()->Start());
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
// The InProcessBrowserTest opens a new tab, let's wait for that first.
......@@ -338,7 +354,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test that the translation was successful.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestValidScript);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -367,8 +383,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) {
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestValidScript, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -378,7 +392,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationSuccess) {
// Test if there was an error during translation.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestValidScript);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -406,8 +420,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) {
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestValidScript, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -419,7 +431,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest, PageTranslationError) {
// Test if there was an error during translate library initialization.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationInitializationError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestScriptInitializationError);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -448,8 +460,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestScriptInitializationError, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -461,7 +471,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test the checks translate lib never gets ready and throws timeout.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationTimeoutError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestScriptTimeout);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -490,8 +500,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestScriptTimeout, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -503,7 +511,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test the checks if both source and target languages mentioned are identical.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationIdenticalLanguagesError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestScriptIdenticalLanguages);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -530,8 +538,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetTranslateManager();
manager->TranslatePage("aa", "en", true);
SimulateURLFetch(kTestScriptIdenticalLanguages, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -543,7 +549,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test if there was an error during translatePage script execution.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationUnexpectedScriptError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestScriptUnexpectedScriptError);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -572,8 +578,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestScriptUnexpectedScriptError, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -585,7 +589,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test if securityOrigin mentioned in url is valid.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationBadOriginError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestScriptBadOrigin);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -614,8 +618,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestScriptBadOrigin, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......@@ -626,7 +628,7 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
// Test if there was an error during script load.
IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
PageTranslationScriptLoadError) {
ASSERT_TRUE(embedded_test_server()->Start());
SetTranslateScript(kTestScriptLoadError);
ChromeTranslateClient* chrome_translate_client = GetChromeTranslateClient();
......@@ -655,8 +657,6 @@ IN_PROC_BROWSER_TEST_F(TranslateManagerBrowserTest,
chrome_translate_client->GetLanguageState().original_language(), "en",
true);
SimulateURLFetch(kTestScriptLoadError, true);
// Wait for NOTIFICATION_PAGE_TRANSLATED notification.
WaitUntilPageTranslated();
......
......@@ -65,6 +65,8 @@
#include "net/url_request/url_fetcher_delegate.h"
#include "net/url_request/url_request_status.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 "third_party/blink/public/web/web_context_menu_data.h"
#include "url/gurl.h"
......@@ -215,6 +217,9 @@ class TranslateManagerRenderViewHostTest
: pref_callback_(
base::Bind(&TranslateManagerRenderViewHostTest::OnPreferenceChanged,
base::Unretained(this))),
test_shared_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)),
infobar_observer_(this) {}
#if !defined(USE_AURA)
......@@ -472,8 +477,7 @@ class TranslateManagerRenderViewHostTest
translate::TranslateDownloadManager::GetInstance();
download_manager->ClearTranslateScriptForTesting();
download_manager->SetTranslateScriptExpirationDelay(60 * 60 * 1000);
download_manager->set_request_context(new net::TestURLRequestContextGetter(
base::ThreadTaskRunnerHandle::Get()));
download_manager->set_url_loader_factory(test_shared_loader_factory_);
InfoBarService::CreateForWebContents(web_contents());
ChromeTranslateClient::CreateForWebContents(web_contents());
......@@ -492,21 +496,20 @@ class TranslateManagerRenderViewHostTest
}
void SimulateTranslateScriptURLFetch(bool success) {
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(
translate::TranslateScript::kFetcherId);
ASSERT_TRUE(fetcher);
net::Error error = success ? net::OK : net::ERR_FAILED;
fetcher->set_url(fetcher->GetOriginalURL());
fetcher->set_status(net::URLRequestStatus::FromError(error));
fetcher->set_response_code(success ? 200 : 500);
fetcher->delegate()->OnURLFetchComplete(fetcher);
GURL url = translate::TranslateDownloadManager::GetInstance()
->script()
->GetTranslateScriptURL();
test_url_loader_factory_.AddResponse(
url.spec(), std::string(),
success ? net::HTTP_OK : net::HTTP_INTERNAL_SERVER_ERROR);
base::RunLoop().RunUntilIdle();
test_url_loader_factory_.ClearResponses();
}
void SimulateSupportedLanguagesURLFetch(
bool success,
const std::vector<std::string>& languages) {
net::Error error = success ? net::OK : net::ERR_FAILED;
std::string data;
if (success) {
data = base::StringPrintf(
......@@ -521,14 +524,17 @@ class TranslateManagerRenderViewHostTest
}
data += "}}";
}
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(
translate::TranslateLanguageList::kFetcherId);
ASSERT_TRUE(fetcher != NULL);
fetcher->set_url(fetcher->GetOriginalURL());
fetcher->set_status(net::URLRequestStatus::FromError(error));
fetcher->set_response_code(success ? 200 : 500);
fetcher->SetResponseString(data);
fetcher->delegate()->OnURLFetchComplete(fetcher);
GURL url = translate::TranslateDownloadManager::GetInstance()
->language_list()
->LanguageFetchURLForTesting();
EXPECT_TRUE(test_url_loader_factory_.IsPending(url.spec()));
test_url_loader_factory_.AddResponse(
url.spec(), data,
success ? net::HTTP_OK : net::HTTP_INTERNAL_SERVER_ERROR);
EXPECT_FALSE(test_url_loader_factory_.IsPending(url.spec()));
base::RunLoop().RunUntilIdle();
test_url_loader_factory_.ClearResponses();
}
void SetPrefObserverExpectation(const char* path) {
......@@ -538,7 +544,8 @@ class TranslateManagerRenderViewHostTest
PrefChangeRegistrar::NamedChangeCallback pref_callback_;
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.
// WARNING: the pointers point to deleted objects, use only for comparison.
......@@ -1695,8 +1702,8 @@ TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) {
EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
bubble->GetViewState());
// Simulate the translate script being retrieved (it only needs to be done
// once in the test as it is cached).
// Set up a simulation of the translate script being retrieved (it only
// needs to be done once in the test as it is cached).
SimulateTranslateScriptURLFetch(true);
// Simulate the render notifying the translation has been done.
......
......@@ -52,8 +52,6 @@ void TranslateService::Initialize() {
g_translate_service->OnResourceRequestsAllowed();
translate::TranslateDownloadManager* download_manager =
translate::TranslateDownloadManager::GetInstance();
download_manager->set_request_context(
g_browser_process->system_request_context());
SystemNetworkContextManager* system_network_context_manager =
g_browser_process->system_network_context_manager();
// Manager will be null if called from InitializeForTesting.
......@@ -73,7 +71,7 @@ void TranslateService::Shutdown(bool cleanup_pending_fetcher) {
download_manager->Shutdown();
} else {
// 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 @@
#include "chrome/browser/ui/views/translate/translate_bubble_view.h"
#include "chrome/common/chrome_paths.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 "components/language/core/browser/url_language_histogram.h"
#include "components/translate/core/browser/translate_manager.h"
......@@ -33,8 +32,7 @@
#include "components/translate/core/common/translate_switches.h"
#include "content/public/browser/notification_service.h"
#include "content/public/test/browser_test_utils.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "net/test/embedded_test_server/controllable_http_response.h"
#include "url/gurl.h"
namespace {
......@@ -84,11 +82,31 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest {
void SetUp() override {
set_open_about_blank_on_browser_launch(true);
translate::TranslateManager::SetIgnoreMissingKeyForTesting(true);
ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
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 TearDownOnMainThread() override {
EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
InProcessBrowserTest::TearDownOnMainThread();
}
protected:
void InitInIncognitoMode(const bool incognito) {
browser_ = incognito ? CreateIncognitoBrowser() : browser();
......@@ -174,7 +192,6 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest {
private:
Browser* browser_;
net::TestURLFetcherFactory url_fetcher_factory_;
// Language detection sometimes fires early with an "und" detected code. This
// callback is used to wait until language detection succeeds.
......@@ -187,16 +204,18 @@ class TranslateLanguageBrowserTest : public InProcessBrowserTest {
}
void SimulateURLFetch() {
net::TestURLFetcher* const fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
fetcher->set_url(fetcher->GetOriginalURL());
fetcher->set_status(net::URLRequestStatus::FromError(net::OK));
fetcher->set_response_code(200);
fetcher->SetResponseString(kTestValidScript);
fetcher->delegate()->OnURLFetchComplete(fetcher);
controllable_http_response_->WaitForRequest();
controllable_http_response_->Send(
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/javascript\r\n"
"\r\n");
controllable_http_response_->Send(kTestValidScript);
controllable_http_response_->Done();
}
std::unique_ptr<net::test_server::ControllableHttpResponse>
controllable_http_response_;
DISALLOW_COPY_AND_ASSIGN(TranslateLanguageBrowserTest);
};
......
......@@ -124,6 +124,8 @@ source_set("unit_tests") {
"//components/variations",
"//net:test_support",
"//services/metrics/public/cpp:ukm_builders",
"//services/network:test_support",
"//services/network/public/cpp:cpp",
"//testing/gtest",
"//third_party/metrics_proto",
"//ui/base",
......
......@@ -3,6 +3,7 @@ include_rules = [
"+components/metrics",
"+components/assist_ranker",
"+services/metrics/public",
"+services/network/test",
]
specific_include_rules = {
......
......@@ -26,7 +26,7 @@ void TranslateDownloadManager::Shutdown() {
DCHECK(sequence_checker_.CalledOnValidSequence());
language_list_.reset();
script_.reset();
request_context_ = nullptr;
url_loader_factory_ = nullptr;
}
// static
......
......@@ -28,17 +28,6 @@ class TranslateDownloadManager {
// Returns the singleton instance.
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.
// Should be set before this class can be used.
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory() {
......@@ -120,7 +109,6 @@ class TranslateDownloadManager {
std::unique_ptr<TranslateScript> script_;
std::string application_locale_;
scoped_refptr<net::URLRequestContextGetter> request_context_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
};
......
......@@ -248,6 +248,14 @@ TranslateLanguageList::RegisterEventCallback(const EventCallback& callback) {
return callback_list_.Add(callback);
}
bool TranslateLanguageList::HasOngoingLanguageListLoadingForTesting() {
return language_list_fetcher_->state() == TranslateURLFetcher::REQUESTING;
}
GURL TranslateLanguageList::LanguageFetchURLForTesting() {
return AddApiKeyToUrl(AddHostLocaleToUrl(TranslateLanguageUrl()));
}
// static
void TranslateLanguageList::DisableUpdate() {
update_is_disabled = true;
......
......@@ -66,6 +66,10 @@ class TranslateLanguageList {
std::unique_ptr<EventCallbackList::Subscription> RegisterEventCallback(
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.
static void DisableUpdate();
......
......@@ -7,15 +7,15 @@
#include <string>
#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_task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/translate/core/browser/translate_download_manager.h"
#include "components/translate/core/browser/translate_url_util.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "net/url_request/url_request_status.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/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
......@@ -31,10 +31,13 @@ TEST(TranslateLanguageListTest, SetSupportedLanguages) {
"}");
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();
manager->set_application_locale("en");
manager->set_request_context(new net::TestURLRequestContextGetter(
base::ThreadTaskRunnerHandle::Get()));
manager->set_url_loader_factory(test_shared_loader_factory);
EXPECT_TRUE(manager->language_list()->SetSupportedLanguages(language_list));
std::vector<std::string> results;
......@@ -114,11 +117,23 @@ TEST(TranslateLanguageListTest, GetSupportedLanguages) {
TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) {
// Set up fake network 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_request_context(
new net::TestURLRequestContextGetter(
base::ThreadTaskRunnerHandle::Get()));
TranslateDownloadManager::GetInstance()->set_url_loader_factory(
test_shared_loader_factory);
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.
std::vector<std::string> languages;
......@@ -126,24 +141,21 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) {
language_list.SetResourceRequestsAllowed(true);
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.
const GURL expected_url =
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.
fetcher->set_status(net::URLRequestStatus());
fetcher->set_response_code(net::HTTP_OK);
fetcher->SetResponseString(R"({"tl" : {"it" : "Italian"}})");
fetcher->delegate()->OnURLFetchComplete(fetcher);
test_url_loader_factory.AddResponse(expected_url.spec(),
R"({"tl" : {"it" : "Italian"}})");
loop.Run();
// 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.
languages.clear();
......@@ -156,11 +168,13 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesFetch) {
TEST(TranslateLanguageListTest, GetSupportedLanguagesNoFetch) {
// Set up fake network 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_request_context(
new net::TestURLRequestContextGetter(
base::ThreadTaskRunnerHandle::Get()));
TranslateDownloadManager::GetInstance()->set_url_loader_factory(
test_shared_loader_factory);
// Populate supported languages.
std::vector<std::string> languages;
......@@ -170,10 +184,9 @@ TEST(TranslateLanguageListTest, GetSupportedLanguagesNoFetch) {
&languages);
// Since translate is disabled by policy, we should *not* have scheduled a
// language list fetch.
net::TestURLFetcher* const fetcher =
url_fetcher_factory.GetFetcherByID(TranslateLanguageList::kFetcherId);
ASSERT_EQ(nullptr, fetcher);
// language list load.
EXPECT_FALSE(language_list.HasOngoingLanguageListLoadingForTesting());
EXPECT_TRUE(test_url_loader_factory.pending_requests()->empty());
}
} // namespace translate
......@@ -48,6 +48,7 @@ class TranslateScript {
// to translate it).
void Request(const RequestCallback& callback);
// Returns the URL to be used to load the translate script.
static GURL GetTranslateScriptURL();
private:
......
......@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "base/test/bind_test_util.h"
#include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
......@@ -16,8 +17,8 @@
#include "net/base/load_flags.h"
#include "net/base/url_util.h"
#include "net/http/http_request_headers.h"
#include "net/url_request/test_url_fetcher_factory.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/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
......@@ -25,15 +26,18 @@ namespace translate {
class TranslateScriptTest : public testing::Test {
public:
TranslateScriptTest() {}
TranslateScriptTest()
: test_shared_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)) {}
protected:
void SetUp() override {
script_.reset(new TranslateScript);
TranslateDownloadManager::GetInstance()->set_application_locale("en");
TranslateDownloadManager::GetInstance()->set_request_context(
new net::TestURLRequestContextGetter(
base::ThreadTaskRunnerHandle::Get()));
auto* translate_download_manager = TranslateDownloadManager::GetInstance();
translate_download_manager->set_application_locale("en");
translate_download_manager->set_url_loader_factory(
test_shared_loader_factory_);
}
void TearDown() override { script_.reset(); }
......@@ -43,8 +47,8 @@ class TranslateScriptTest : public testing::Test {
base::Bind(&TranslateScriptTest::OnComplete, base::Unretained(this)));
}
net::TestURLFetcher* GetTestURLFetcher() {
return url_fetcher_factory_.GetFetcherByID(TranslateScript::kFetcherId);
network::TestURLLoaderFactory* GetTestURLLoaderFactory() {
return &test_url_loader_factory_;
}
private:
......@@ -57,24 +61,29 @@ class TranslateScriptTest : public testing::Test {
// The translate script.
std::unique_ptr<TranslateScript> script_;
// Factory to create programmatic URL fetchers.
net::TestURLFetcherFactory url_fetcher_factory_;
// Factory to create programmatic URL loaders.
network::TestURLLoaderFactory test_url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
DISALLOW_COPY_AND_ASSIGN(TranslateScriptTest);
};
TEST_F(TranslateScriptTest, CheckScriptParameters) {
network::ResourceRequest last_resource_request;
GetTestURLLoaderFactory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
last_resource_request = request;
}));
Request();
net::TestURLFetcher* fetcher = GetTestURLFetcher();
ASSERT_TRUE(fetcher);
GURL expected_url(TranslateScript::kScriptURL);
GURL url = fetcher->GetOriginalURL();
GURL url = last_resource_request.url;
EXPECT_TRUE(url.is_valid());
EXPECT_EQ(expected_url.GetOrigin().spec(), url.GetOrigin().spec());
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,
load_flags & net::LOAD_DO_NOT_SEND_COOKIES);
EXPECT_EQ(net::LOAD_DO_NOT_SAVE_COOKIES,
......@@ -82,8 +91,7 @@ TEST_F(TranslateScriptTest, CheckScriptParameters) {
std::string expected_extra_headers =
base::StringPrintf("%s\r\n\r\n", TranslateScript::kRequestHeader);
net::HttpRequestHeaders extra_headers;
fetcher->GetExtraRequestHeaders(&extra_headers);
net::HttpRequestHeaders extra_headers = last_resource_request.headers;
EXPECT_EQ(expected_extra_headers, extra_headers.ToString());
std::string always_use_ssl;
......@@ -121,12 +129,16 @@ TEST_F(TranslateScriptTest, CheckScriptURL) {
command_line->AppendSwitchASCII(translate::switches::kTranslateScriptURL,
script_url);
network::ResourceRequest last_resource_request;
GetTestURLLoaderFactory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
last_resource_request = request;
}));
Request();
net::TestURLFetcher* fetcher = GetTestURLFetcher();
ASSERT_TRUE(fetcher);
GURL expected_url(script_url);
GURL url = fetcher->GetOriginalURL();
GURL url = last_resource_request.url;
EXPECT_TRUE(url.is_valid());
EXPECT_EQ(expected_url.GetOrigin().spec(), url.GetOrigin().spec());
EXPECT_EQ(expected_url.path(), url.path());
......
......@@ -10,8 +10,8 @@
#include "net/base/load_flags.h"
#include "net/http/http_status_code.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_status.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/simple_url_loader.h"
namespace translate {
......@@ -46,10 +46,10 @@ bool TranslateURLFetcher::Request(const GURL& url,
// If the TranslateDownloadManager's request context getter is nullptr then
// shutdown is in progress. Abort the request, which can't proceed with a
// null request_context_getter.
scoped_refptr<net::URLRequestContextGetter> request_context_getter =
TranslateDownloadManager::GetInstance()->request_context();
if (request_context_getter == nullptr)
// null url_loader_factory.
network::mojom::URLLoaderFactory* url_loader_factory =
TranslateDownloadManager::GetInstance()->url_loader_factory().get();
if (!url_loader_factory)
return false;
net::NetworkTrafficAnnotationTag traffic_annotation =
......@@ -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
// 106 (net::ERR_INTERNET_DISCONNECTED) and so on.
// TranslateLanguageList handles network status, and implements retry.
fetcher_->SetMaxRetriesOn5xx(max_retry_on_5xx_);
if (!extra_request_header_.empty())
fetcher_->SetExtraRequestHeaders(extra_request_header_);
fetcher_->Start();
if (max_retry_on_5xx_) {
simple_loader_->SetRetryOptions(
max_retry_on_5xx_, network::SimpleURLLoader::RetryMode::RETRY_ON_5XX);
}
simple_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory,
base::BindOnce(&TranslateURLFetcher::OnSimpleLoaderComplete,
base::Unretained(this)));
return true;
}
void TranslateURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
DCHECK(fetcher_.get() == source);
void TranslateURLFetcher::OnSimpleLoaderComplete(
std::unique_ptr<std::string> response_body) {
std::string data;
if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS &&
source->GetResponseCode() == net::HTTP_OK) {
if (response_body) {
DCHECK_EQ(net::OK, simple_loader_->NetError());
data = std::move(*response_body);
state_ = COMPLETED;
source->GetResponseAsString(&data);
} else {
state_ = FAILED;
}
// Transfer URLFetcher's ownership before invoking a callback.
std::unique_ptr<const net::URLFetcher> delete_ptr(fetcher_.release());
simple_loader_.reset();
std::move(callback_).Run(id_, state_ == COMPLETED, data);
}
......
......@@ -9,14 +9,17 @@
#include "base/callback.h"
#include "base/macros.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h"
namespace network {
class SimpleURLLoader;
}
namespace translate {
// Downloads raw Translate data such as the Translate script and the language
// list.
class TranslateURLFetcher : public net::URLFetcherDelegate {
class TranslateURLFetcher {
public:
// Callback type for Request().
using Callback = base::OnceCallback<void(int, bool, const std::string&)>;
......@@ -30,7 +33,7 @@ class TranslateURLFetcher : public net::URLFetcherDelegate {
};
explicit TranslateURLFetcher(int id);
~TranslateURLFetcher() override;
~TranslateURLFetcher();
int max_retry_on_5xx() {
return max_retry_on_5xx_;
......@@ -55,27 +58,27 @@ class TranslateURLFetcher : public net::URLFetcherDelegate {
// Gets internal state.
State state() { return state_; }
// net::URLFetcherDelegate implementation:
void OnURLFetchComplete(const net::URLFetcher* source) override;
private:
void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
// URL to send the request.
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_;
// Internal state.
enum State state_;
// URLFetcher instance.
std::unique_ptr<net::URLFetcher> fetcher_;
// SimpleURLLoader instance.
std::unique_ptr<network::SimpleURLLoader> simple_loader_;
// Callback passed at Request(). It will be invoked when an asynchronous
// fetch operation is finished.
// load operation is finished.
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_;
// Max number how many times to retry on the server error
......
......@@ -36,8 +36,8 @@ void TranslateServiceIOS::Initialize() {
g_translate_service->OnResourceRequestsAllowed();
translate::TranslateDownloadManager* download_manager =
translate::TranslateDownloadManager::GetInstance();
download_manager->set_request_context(
GetApplicationContext()->GetSystemURLRequestContext());
download_manager->set_url_loader_factory(
GetApplicationContext()->GetSharedURLLoaderFactory());
download_manager->set_application_locale(
GetApplicationContext()->GetApplicationLocale());
}
......
......@@ -28,6 +28,8 @@ include_rules = [
"+ios/web_view",
"+net",
"+services/identity/public/cpp",
"+services/network/public/cpp",
"+services/network/public/mojom",
"+third_party/ocmock",
"+ui/base",
"+ui/gfx",
......
......@@ -20,6 +20,7 @@
#include "ios/web_view/cwv_web_view_features.h"
#include "ios/web_view/internal/app/web_view_io_thread.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"
namespace ios_web_view {
......@@ -48,6 +49,14 @@ void ApplicationContext::SaveState() {
if (local_state_) {
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() {
......@@ -103,6 +112,31 @@ net::URLRequestContextGetter* ApplicationContext::GetSystemURLRequestContext() {
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() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!application_locale_.empty());
......
......@@ -10,6 +10,8 @@
#include "base/macros.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 {
template <typename T>
......@@ -20,6 +22,14 @@ namespace net {
class URLRequestContextGetter;
}
namespace network {
class SharedURLLoaderFactory;
class WeakWrapperSharedURLLoaderFactory;
namespace mojom {
class NetworkContext;
}
} // namespace network
namespace net_log {
class ChromeNetLog;
}
......@@ -41,6 +51,9 @@ class ApplicationContext {
// Gets the URL request context associated with this application.
net::URLRequestContextGetter* GetSystemURLRequestContext();
scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory();
network::mojom::NetworkContext* GetSystemNetworkContext();
// Gets the locale used by the application.
const std::string& GetApplicationLocale();
......@@ -77,6 +90,14 @@ class ApplicationContext {
std::unique_ptr<WebViewIOThread> web_view_io_thread_;
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);
};
......
......@@ -47,9 +47,10 @@ void WebViewTranslateService::Initialize() {
// Initialize translate.
translate::TranslateDownloadManager* download_manager =
translate::TranslateDownloadManager::GetInstance();
download_manager->set_request_context(
download_manager->set_url_loader_factory(
ios_web_view::ApplicationContext::GetInstance()
->GetSystemURLRequestContext());
->GetSharedURLLoaderFactory()
.get());
download_manager->set_application_locale(
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