Commit cf1ab83a authored by Antonio Gomes's avatar Antonio Gomes Committed by Commit Bot

[ios] Migrate URLFetcherBlockAdapter to using SimpleURLLoader

URLFetcher will stop working with advent of Network Service, and
SimpleURLLoader is the replacement API for most clients.
This CL migrates iOS' URLFetcherBlockAdapter and its respective
unittests away from URLFetcher.

BUG=879771

Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Change-Id: I3f99811c3bc6b3fdb136d448ec93e76d37ecfd1d
Reviewed-on: https://chromium-review.googlesource.com/1232073
Commit-Queue: Antonio Gomes <tonikitoo@igalia.com>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#592272}
parent f8389372
......@@ -529,6 +529,7 @@ source_set("ios_web_webui_unittests") {
"//ios/web/test:test_constants",
"//ios/web/test:test_support",
"//net:test_support",
"//services/network:test_support",
"//services/service_manager/public/cpp",
"//testing/gmock",
"//testing/gtest",
......
......@@ -23,6 +23,7 @@
#import "ios/web/webui/crw_web_ui_page_builder.h"
#import "ios/web/webui/url_fetcher_block_adapter.h"
#import "net/base/mac/url_conversions.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -204,7 +205,7 @@ const char kScriptCommandPrefix[] = "webui";
fetcherForURL:(const GURL&)URL
completionHandler:(web::URLFetcherBlockAdapterCompletion)handler {
return std::make_unique<web::URLFetcherBlockAdapter>(
URL, _webState->GetBrowserState()->GetRequestContext(), handler);
URL, _webState->GetBrowserState()->GetSharedURLLoaderFactory(), handler);
}
@end
......@@ -63,9 +63,9 @@ class MockURLFetcherBlockAdapter : public URLFetcherBlockAdapter {
public:
MockURLFetcherBlockAdapter(
const GURL& url,
net::URLRequestContextGetter* request_context,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
URLFetcherBlockAdapterCompletion completion_handler)
: URLFetcherBlockAdapter(url, request_context, completion_handler),
: URLFetcherBlockAdapter(url, url_loader_factory, completion_handler),
url_(url),
completion_handler_([completion_handler copy]) {}
......
......@@ -10,50 +10,49 @@
#include <memory>
#include "base/mac/scoped_block.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "base/memory/scoped_refptr.h"
#include "url/gurl.h"
namespace net {
class URLFetcher;
class URLRequestContextGetter;
} // namespace net
namespace network {
class SharedURLLoaderFactory;
class SimpleURLLoader;
}; // namespace network
namespace web {
// Class for use of URLFetcher from Objective-C with a completion handler block.
// Class for use of URLLoader from Objective-C with a completion handler block.
class URLFetcherBlockAdapter;
// Block type for URLFetcherBlockAdapter callbacks.
typedef void (^URLFetcherBlockAdapterCompletion)(NSData*,
URLFetcherBlockAdapter*);
// Class to manage retrieval of WebUI resources.
class URLFetcherBlockAdapter : public net::URLFetcherDelegate {
class URLFetcherBlockAdapter {
public:
// Creates URLFetcherBlockAdapter for resource at |url| with
// |request_context|.
// |completion_handler| is called with results of the fetch.
URLFetcherBlockAdapter(
const GURL& url,
net::URLRequestContextGetter* request_context,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
web::URLFetcherBlockAdapterCompletion completion_handler);
~URLFetcherBlockAdapter() override;
virtual ~URLFetcherBlockAdapter();
// Starts the fetch.
virtual void Start();
protected:
// net::URLFetcherDelegate implementation.
void OnURLFetchComplete(const net::URLFetcher* source) override;
void OnURLLoadComplete(std::unique_ptr<std::string> response_body);
private:
// The URL to fetch.
const GURL url_;
// The request context.
net::URLRequestContextGetter* request_context_;
// The URL loader factory.
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
// Callback for resource load.
base::mac::ScopedBlock<web::URLFetcherBlockAdapterCompletion>
completion_handler_;
// URLFetcher for retrieving data from net stack.
std::unique_ptr<net::URLFetcher> fetcher_;
// URLLoader for retrieving data from net stack.
std::unique_ptr<network::SimpleURLLoader> url_loader_;
};
} // namespace web
......
......@@ -5,8 +5,8 @@
#import "ios/web/webui/url_fetcher_block_adapter.h"
#include "base/logging.h"
#include "net/url_request/url_fetcher.h"
#include "net/url_request/url_request_context_getter.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/simple_url_loader.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
......@@ -16,27 +16,39 @@ namespace web {
URLFetcherBlockAdapter::URLFetcherBlockAdapter(
const GURL& url,
net::URLRequestContextGetter* request_context,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
web::URLFetcherBlockAdapterCompletion completion_handler)
: url_(url),
request_context_(request_context),
completion_handler_([completion_handler copy]) {
}
url_loader_factory_(std::move(url_loader_factory)),
completion_handler_([completion_handler copy]) {}
URLFetcherBlockAdapter::~URLFetcherBlockAdapter() {
}
void URLFetcherBlockAdapter::Start() {
fetcher_ = net::URLFetcher::Create(url_, net::URLFetcher::GET, this);
fetcher_->SetRequestContext(request_context_);
fetcher_->Start();
auto resource_request = std::make_unique<network::ResourceRequest>();
resource_request->url = url_;
url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
NO_TRAFFIC_ANNOTATION_YET);
url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory_.get(),
base::BindOnce(&URLFetcherBlockAdapter::OnURLLoadComplete,
base::Unretained(this)));
}
void URLFetcherBlockAdapter::OnURLFetchComplete(const net::URLFetcher* source) {
void URLFetcherBlockAdapter::OnURLLoadComplete(
std::unique_ptr<std::string> response_body) {
std::string response;
if (!source->GetResponseAsString(&response)) {
DLOG(WARNING) << "String for resource URL not found" << source->GetURL();
if (!response_body) {
DLOG(WARNING) << "String for resource URL not found"
<< url_loader_->GetFinalURL();
} else {
response = *response_body;
}
url_loader_.reset();
NSData* data =
[NSData dataWithBytes:response.c_str() length:response.length()];
completion_handler_.get()(data, this);
......
......@@ -8,12 +8,12 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/strings/sys_string_conversions.h"
#include "base/test/scoped_task_environment.h"
#include "net/url_request/test_url_fetcher_factory.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"
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"
#include "url/gurl.h"
......@@ -46,11 +46,16 @@ TEST_F(URLFetcherBlockAdapterTest, FetchTextResource) {
^(NSData* data, web::URLFetcherBlockAdapter* fetcher) {
EXPECT_NSEQ(expected_data, data);
};
web::URLFetcherBlockAdapter web_ui_fetcher(test_url, nil, completion_handler);
net::FakeURLFetcher fake_fetcher(test_url, &web_ui_fetcher, response,
net::HTTP_OK,
net::URLRequestStatus::SUCCESS);
fake_fetcher.Start();
network::TestURLLoaderFactory test_url_loader_factory;
auto test_shared_url_loader_factory =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory);
web::URLFetcherBlockAdapter web_ui_fetcher(
test_url, test_shared_url_loader_factory, completion_handler);
web_ui_fetcher.Start();
test_url_loader_factory.AddResponse(test_url.spec(), response);
base::RunLoop().RunUntilIdle();
}
......@@ -67,13 +72,18 @@ TEST_F(URLFetcherBlockAdapterTest, FetchPNGResource) {
^(NSData* data, URLFetcherBlockAdapter* fetcher) {
EXPECT_NSEQ(expected_data, data);
};
web::URLFetcherBlockAdapter web_ui_fetcher(test_url, nil, completion_handler);
network::TestURLLoaderFactory test_url_loader_factory;
auto test_shared_url_loader_factory =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory);
web::URLFetcherBlockAdapter web_ui_fetcher(
test_url, test_shared_url_loader_factory, completion_handler);
std::string response;
EXPECT_TRUE(ReadFileToString(favicon_path, &response));
net::FakeURLFetcher fake_fetcher(test_url, &web_ui_fetcher, response,
net::HTTP_OK,
net::URLRequestStatus::SUCCESS);
fake_fetcher.Start();
web_ui_fetcher.Start();
test_url_loader_factory.AddResponse(test_url.spec(), response);
base::RunLoop().RunUntilIdle();
}
......
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