Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Unified Diff: headless/public/util/generic_url_request_job.cc

Issue 2815003003: Headless (breaking change): A better GenericURLRequestJob::Delegate API (Closed)
Patch Set: Changes for Sami Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: headless/public/util/generic_url_request_job.cc
diff --git a/headless/public/util/generic_url_request_job.cc b/headless/public/util/generic_url_request_job.cc
index 83d9f8f8685d0f7a95f870ee185ece260126f905..b618913e47f9bbbbf055efffd45cd8424a1c0c62 100644
--- a/headless/public/util/generic_url_request_job.cc
+++ b/headless/public/util/generic_url_request_job.cc
@@ -8,10 +8,14 @@
#include <algorithm>
#include "base/logging.h"
+#include "content/public/browser/devtools_agent_host.h"
+#include "content/public/browser/resource_request_info.h"
+#include "content/public/browser/web_contents.h"
#include "headless/public/util/url_request_dispatcher.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "net/base/upload_bytes_element_reader.h"
#include "net/cookies/cookie_store.h"
#include "net/http/http_response_headers.h"
#include "net/url_request/url_request_context.h"
@@ -42,6 +46,8 @@ GenericURLRequestJob::GenericURLRequestJob(
url_fetcher_(std::move(url_fetcher)),
origin_task_runner_(base::ThreadTaskRunnerHandle::Get()),
delegate_(delegate),
+ request_resource_info_(
+ content::ResourceRequestInfo::ForRequest(request_)),
weak_factory_(this) {}
GenericURLRequestJob::~GenericURLRequestJob() {
@@ -53,67 +59,21 @@ void GenericURLRequestJob::SetExtraRequestHeaders(
DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
extra_request_headers_ = headers;
- if (extra_request_headers_.GetHeader(kDevtoolsRequestId,
- &devtools_request_id_)) {
- extra_request_headers_.RemoveHeader(kDevtoolsRequestId);
- }
+ // TODO(alexclarke): Remove kDevtoolsRequestId
+ extra_request_headers_.RemoveHeader(kDevtoolsRequestId);
}
void GenericURLRequestJob::Start() {
- DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
- if (!delegate_->BlockOrRewriteRequest(
- request_->url(), devtools_request_id_, request_->method(),
- request_->referrer(),
- base::Bind(&GenericURLRequestJob::OnRewriteResult,
- weak_factory_.GetWeakPtr(), origin_task_runner_))) {
- PrepareCookies(request_->url(), request_->method(),
- url::Origin(request_->first_party_for_cookies()));
- }
-}
-
-// static
-void GenericURLRequestJob::OnRewriteResult(
- base::WeakPtr<GenericURLRequestJob> weak_this,
- const scoped_refptr<base::SingleThreadTaskRunner>& origin_task_runner,
- RewriteResult result,
- const GURL& url,
- const std::string& method) {
- if (!origin_task_runner->RunsTasksOnCurrentThread()) {
- origin_task_runner->PostTask(
- FROM_HERE,
- base::Bind(&GenericURLRequestJob::OnRewriteResultOnOriginThread,
- weak_this, result, url, method));
- return;
- }
- if (weak_this)
- weak_this->OnRewriteResultOnOriginThread(result, url, method);
+ PrepareCookies(request_->url(), request_->method(),
+ url::Origin(request_->first_party_for_cookies()),
+ base::Bind(&Delegate::OnPendingRequest,
+ base::Unretained(delegate_), this));
}
-void GenericURLRequestJob::OnRewriteResultOnOriginThread(
- RewriteResult result,
- const GURL& url,
- const std::string& method) {
- DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
- switch (result) {
- case RewriteResult::kAllow:
- // Note that we use the rewritten url for selecting cookies.
- // Also, rewriting does not affect the request initiator.
- PrepareCookies(url, method, url::Origin(url));
- break;
- case RewriteResult::kDeny:
- DispatchStartError(net::ERR_FILE_NOT_FOUND);
- break;
- case RewriteResult::kFailure:
- DispatchStartError(net::ERR_UNEXPECTED);
- break;
- default:
- DCHECK(false);
- }
-};
-
void GenericURLRequestJob::PrepareCookies(const GURL& rewritten_url,
const std::string& method,
- const url::Origin& site_for_cookies) {
+ const url::Origin& site_for_cookies,
+ const base::Closure& done_callback) {
DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
net::CookieStore* cookie_store = request_->context()->cookie_store();
net::CookieOptions options;
@@ -138,12 +98,14 @@ void GenericURLRequestJob::PrepareCookies(const GURL& rewritten_url,
cookie_store->GetCookieListWithOptionsAsync(
rewritten_url, options,
base::Bind(&GenericURLRequestJob::OnCookiesAvailable,
- weak_factory_.GetWeakPtr(), rewritten_url, method));
+ weak_factory_.GetWeakPtr(), rewritten_url, method,
+ done_callback));
}
void GenericURLRequestJob::OnCookiesAvailable(
const GURL& rewritten_url,
const std::string& method,
+ const base::Closure& done_callback,
const net::CookieList& cookie_list) {
DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
// TODO(alexclarke): Set user agent.
@@ -155,23 +117,13 @@ void GenericURLRequestJob::OnCookiesAvailable(
extra_request_headers_.SetHeader(net::HttpRequestHeaders::kReferer,
request_->referrer());
- // The resource may have been supplied in the request.
- const HttpResponse* matched_resource = delegate_->MaybeMatchResource(
- rewritten_url, devtools_request_id_, method, extra_request_headers_);
-
- if (matched_resource) {
- OnFetchCompleteExtractHeaders(
- matched_resource->final_url, matched_resource->http_response_code,
- matched_resource->response_data, matched_resource->response_data_size);
- } else {
- url_fetcher_->StartFetch(rewritten_url, method, extra_request_headers_,
- devtools_request_id_, this);
- }
+ done_callback.Run();
}
void GenericURLRequestJob::OnFetchStartError(net::Error error) {
DCHECK(origin_task_runner_->RunsTasksOnCurrentThread());
DispatchStartError(error);
+ delegate_->OnResourceLoadFailed(this, error);
}
void GenericURLRequestJob::OnFetchComplete(
@@ -189,11 +141,8 @@ void GenericURLRequestJob::OnFetchComplete(
DispatchHeadersComplete();
- std::string mime_type;
- GetMimeType(&mime_type);
-
- delegate_->OnResourceLoadComplete(final_url, devtools_request_id_, mime_type,
- http_response_code);
+ delegate_->OnResourceLoadComplete(this, final_url, http_response_code,
+ response_headers_, body_, body_size_);
}
int GenericURLRequestJob::ReadRawData(net::IOBuffer* buf, int buf_size) {
@@ -236,4 +185,145 @@ void GenericURLRequestJob::GetLoadTimingInfo(
load_timing_info->receive_headers_end = response_time_;
}
+const net::URLRequest* GenericURLRequestJob::GetURLRequest() const {
+ return request_;
+}
+
+int GenericURLRequestJob::GetFrameTreeNodeId() const {
+ return request_resource_info_->GetFrameTreeNodeId();
+}
+
+std::string GenericURLRequestJob::GetDevToolsAgentHostId() const {
+ return content::DevToolsAgentHost::GetOrCreateFor(
+ request_resource_info_->GetWebContentsGetterForRequest().Run())
+ ->GetId();
+}
+
+Request::ResourceType GenericURLRequestJob::GetResourceType() const {
+ switch (request_resource_info_->GetResourceType()) {
+ case content::RESOURCE_TYPE_MAIN_FRAME:
+ return Request::ResourceType::MAIN_FRAME;
+ case content::RESOURCE_TYPE_SUB_FRAME:
+ return Request::ResourceType::SUB_FRAME;
+ case content::RESOURCE_TYPE_STYLESHEET:
+ return Request::ResourceType::STYLESHEET;
+ case content::RESOURCE_TYPE_SCRIPT:
+ return Request::ResourceType::SCRIPT;
+ case content::RESOURCE_TYPE_IMAGE:
+ return Request::ResourceType::IMAGE;
+ case content::RESOURCE_TYPE_FONT_RESOURCE:
+ return Request::ResourceType::FONT_RESOURCE;
+ case content::RESOURCE_TYPE_SUB_RESOURCE:
+ return Request::ResourceType::SUB_RESOURCE;
+ case content::RESOURCE_TYPE_OBJECT:
+ return Request::ResourceType::OBJECT;
+ case content::RESOURCE_TYPE_MEDIA:
+ return Request::ResourceType::MEDIA;
+ case content::RESOURCE_TYPE_WORKER:
+ return Request::ResourceType::WORKER;
+ case content::RESOURCE_TYPE_SHARED_WORKER:
+ return Request::ResourceType::SHARED_WORKER;
+ case content::RESOURCE_TYPE_PREFETCH:
+ return Request::ResourceType::PREFETCH;
+ case content::RESOURCE_TYPE_FAVICON:
+ return Request::ResourceType::FAVICON;
+ case content::RESOURCE_TYPE_XHR:
+ return Request::ResourceType::XHR;
+ case content::RESOURCE_TYPE_PING:
+ return Request::ResourceType::PING;
+ case content::RESOURCE_TYPE_SERVICE_WORKER:
+ return Request::ResourceType::SERVICE_WORKER;
+ case content::RESOURCE_TYPE_CSP_REPORT:
+ return Request::ResourceType::CSP_REPORT;
+ case content::RESOURCE_TYPE_PLUGIN_RESOURCE:
+ return Request::ResourceType::PLUGIN_RESOURCE;
+ default:
+ NOTREACHED() << "Unrecognized resource type";
+ return Request::ResourceType::MAIN_FRAME;
+ }
+}
+
+namespace {
+std::string GetUploadData(net::URLRequest* request) {
+ if (!request->has_upload())
+ return "";
+
+ const net::UploadDataStream* stream = request->get_upload();
+ if (!stream->GetElementReaders())
+ return "";
+
+ DCHECK_EQ(1u, stream->GetElementReaders()->size());
+ const net::UploadBytesElementReader* reader =
+ (*stream->GetElementReaders())[0]->AsBytesReader();
+ return std::string(reader->bytes(), reader->length());
+}
+} // namespace
+
+const Request* GenericURLRequestJob::GetRequest() const {
+ return this;
+}
+
+void GenericURLRequestJob::AllowRequest() {
+ if (!origin_task_runner_->RunsTasksOnCurrentThread()) {
+ origin_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&GenericURLRequestJob::AllowRequest,
+ weak_factory_.GetWeakPtr()));
+ return;
+ }
+
+ url_fetcher_->StartFetch(request_->url(), request_->method(),
+ GetUploadData(request_), extra_request_headers_,
+ this);
+}
+
+void GenericURLRequestJob::BlockRequest(net::Error error) {
+ if (!origin_task_runner_->RunsTasksOnCurrentThread()) {
+ origin_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&GenericURLRequestJob::BlockRequest,
+ weak_factory_.GetWeakPtr(), error));
+ return;
+ }
+
+ DispatchStartError(error);
+}
+
+void GenericURLRequestJob::ModifyRequest(
+ const GURL& url,
+ const std::string& method,
+ const std::string& post_data,
+ const net::HttpRequestHeaders& request_headers) {
+ if (!origin_task_runner_->RunsTasksOnCurrentThread()) {
+ origin_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&GenericURLRequestJob::ModifyRequest,
+ weak_factory_.GetWeakPtr(), url, method,
+ post_data, request_headers));
+ return;
+ }
+
+ extra_request_headers_ = request_headers;
+ PrepareCookies(
+ request_->url(), request_->method(),
+ url::Origin(request_->first_party_for_cookies()),
+ base::Bind(&URLFetcher::StartFetch, base::Unretained(url_fetcher_.get()),
+ url, method, post_data, request_headers, this));
+}
+
+void GenericURLRequestJob::MockResponse(
+ std::unique_ptr<MockResponseData> mock_response) {
+ if (!origin_task_runner_->RunsTasksOnCurrentThread()) {
+ origin_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&GenericURLRequestJob::MockResponse,
+ weak_factory_.GetWeakPtr(),
+ base::Passed(std::move(mock_response))));
+ return;
+ }
+
+ mock_response_ = std::move(mock_response);
+
+ OnFetchCompleteExtractHeaders(request_->url(),
+ mock_response_->http_response_code,
+ mock_response_->response_data.data(),
+ mock_response_->response_data.size());
+}
+
} // namespace headless
« no previous file with comments | « headless/public/util/generic_url_request_job.h ('k') | headless/public/util/generic_url_request_job_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698