Mojo: Generalize blink::URLRequest -> mojo::URLRequest conversion, and use it

to initialize requests in WebURLLoaderImpl.

BUG=394645

Review URL: https://codereview.chromium.org/453133002

Cr-Commit-Position: refs/heads/master@{#289176}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289176 0039d316-1c4b-4281-b951-d872f2087c98
parent c058c296
...@@ -48,6 +48,8 @@ ...@@ -48,6 +48,8 @@
'services/html_viewer/blink_input_events_type_converters.h', 'services/html_viewer/blink_input_events_type_converters.h',
'services/html_viewer/blink_platform_impl.cc', 'services/html_viewer/blink_platform_impl.cc',
'services/html_viewer/blink_platform_impl.h', 'services/html_viewer/blink_platform_impl.h',
'services/html_viewer/blink_url_request_type_converters.cc',
'services/html_viewer/blink_url_request_type_converters.h',
'services/html_viewer/html_viewer.cc', 'services/html_viewer/html_viewer.cc',
'services/html_viewer/html_document_view.cc', 'services/html_viewer/html_document_view.cc',
'services/html_viewer/html_document_view.h', 'services/html_viewer/html_document_view.h',
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "mojo/services/html_viewer/blink_url_request_type_converters.h"
#include "base/strings/string_util.h"
#include "mojo/public/cpp/system/data_pipe.h"
#include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
#include "third_party/WebKit/public/platform/WebURLRequest.h"
namespace mojo {
namespace {
// Ripped from web_url_loader_impl.cc.
class HeaderFlattener : public blink::WebHTTPHeaderVisitor {
public:
HeaderFlattener() : has_accept_header_(false) {}
virtual void visitHeader(const blink::WebString& name,
const blink::WebString& value) {
// Headers are latin1.
const std::string& name_latin1 = name.latin1();
const std::string& value_latin1 = value.latin1();
// Skip over referrer headers found in the header map because we already
// pulled it out as a separate parameter.
if (LowerCaseEqualsASCII(name_latin1, "referer"))
return;
if (LowerCaseEqualsASCII(name_latin1, "accept"))
has_accept_header_ = true;
buffer_.push_back(name_latin1 + ": " + value_latin1);
}
Array<String> GetBuffer() {
// In some cases, WebKit doesn't add an Accept header, but not having the
// header confuses some web servers. See bug 808613.
if (!has_accept_header_) {
buffer_.push_back("Accept: */*");
has_accept_header_ = true;
}
return buffer_.Pass();
}
private:
Array<String> buffer_;
bool has_accept_header_;
};
void AddRequestBody(URLRequest* url_request,
const blink::WebURLRequest& request) {
if (request.httpBody().isNull())
return;
uint32_t i = 0;
blink::WebHTTPBody::Element element;
while (request.httpBody().elementAt(i++, element)) {
switch (element.type) {
case blink::WebHTTPBody::Element::TypeData:
if (!element.data.isEmpty()) {
// WebKit sometimes gives up empty data to append. These aren't
// necessary so we just optimize those out here.
uint32_t num_bytes = static_cast<uint32_t>(element.data.size());
MojoCreateDataPipeOptions options;
options.struct_size = sizeof(MojoCreateDataPipeOptions);
options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
options.element_num_bytes = 1;
options.capacity_num_bytes = num_bytes;
DataPipe data_pipe(options);
url_request->body.push_back(
data_pipe.consumer_handle.Pass());
WriteDataRaw(data_pipe.producer_handle.get(),
element.data.data(),
&num_bytes,
MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
}
break;
case blink::WebHTTPBody::Element::TypeFile:
case blink::WebHTTPBody::Element::TypeFileSystemURL:
case blink::WebHTTPBody::Element::TypeBlob:
// TODO(mpcomplete): handle these.
NOTIMPLEMENTED();
break;
default:
NOTREACHED();
}
}
}
} // namespace
URLRequestPtr TypeConverter<URLRequestPtr, blink::WebURLRequest>::ConvertFrom(
const blink::WebURLRequest& request) {
URLRequestPtr url_request(URLRequest::New());
url_request->url = request.url().string().utf8();
url_request->method = request.httpMethod().utf8();
HeaderFlattener flattener;
request.visitHTTPHeaderFields(&flattener);
url_request->headers = flattener.GetBuffer().Pass();
AddRequestBody(url_request.get(), request);
return url_request.Pass();
}
} // namespace mojo
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MOJO_SERVICES_HTML_VIEWER_BLINK_URL_REQUEST_TYPE_CONVERTERS_H_
#define MOJO_SERVICES_HTML_VIEWER_BLINK_URL_REQUEST_TYPE_CONVERTERS_H_
#include "mojo/services/public/interfaces/network/url_loader.mojom.h"
namespace blink {
class WebURLRequest;
}
namespace mojo {
template<>
class TypeConverter<URLRequestPtr, blink::WebURLRequest> {
public:
static URLRequestPtr ConvertFrom(const blink::WebURLRequest& request);
};
} // namespace mojo
#endif // MOJO_SERVICES_HTML_VIEWER_BLINK_URL_REQUEST_TYPE_CONVERTERS_H_
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/thread_task_runner_handle.h" #include "base/thread_task_runner_handle.h"
#include "mojo/public/cpp/system/data_pipe.h" #include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/services/html_viewer/blink_input_events_type_converters.h" #include "mojo/services/html_viewer/blink_input_events_type_converters.h"
#include "mojo/services/html_viewer/blink_url_request_type_converters.h"
#include "mojo/services/html_viewer/webstoragenamespace_impl.h" #include "mojo/services/html_viewer/webstoragenamespace_impl.h"
#include "mojo/services/html_viewer/weburlloader_impl.h" #include "mojo/services/html_viewer/weburlloader_impl.h"
#include "mojo/services/public/cpp/view_manager/view.h" #include "mojo/services/public/cpp/view_manager/view.h"
...@@ -32,83 +33,6 @@ ...@@ -32,83 +33,6 @@
namespace mojo { namespace mojo {
namespace { namespace {
// Ripped from web_url_loader_impl.cc. Why is everything so complicated?
class HeaderFlattener : public blink::WebHTTPHeaderVisitor {
public:
HeaderFlattener() : has_accept_header_(false) {}
virtual void visitHeader(const blink::WebString& name,
const blink::WebString& value) {
// Headers are latin1.
const std::string& name_latin1 = name.latin1();
const std::string& value_latin1 = value.latin1();
// Skip over referrer headers found in the header map because we already
// pulled it out as a separate parameter.
if (LowerCaseEqualsASCII(name_latin1, "referer"))
return;
if (LowerCaseEqualsASCII(name_latin1, "accept"))
has_accept_header_ = true;
buffer_.push_back(name_latin1 + ": " + value_latin1);
}
Array<String> GetBuffer() {
// In some cases, WebKit doesn't add an Accept header, but not having the
// header confuses some web servers. See bug 808613.
if (!has_accept_header_) {
buffer_.push_back("Accept: */*");
has_accept_header_ = true;
}
return buffer_.Pass();
}
private:
Array<String> buffer_;
bool has_accept_header_;
};
void AddRequestBody(NavigationDetails* nav_details,
const blink::WebURLRequest& request) {
if (request.httpBody().isNull())
return;
uint32_t i = 0;
blink::WebHTTPBody::Element element;
while (request.httpBody().elementAt(i++, element)) {
switch (element.type) {
case blink::WebHTTPBody::Element::TypeData:
if (!element.data.isEmpty()) {
// WebKit sometimes gives up empty data to append. These aren't
// necessary so we just optimize those out here.
uint32_t num_bytes = static_cast<uint32_t>(element.data.size());
MojoCreateDataPipeOptions options;
options.struct_size = sizeof(MojoCreateDataPipeOptions);
options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
options.element_num_bytes = 1;
options.capacity_num_bytes = num_bytes;
DataPipe data_pipe(options);
nav_details->request->body.push_back(
data_pipe.consumer_handle.Pass());
WriteDataRaw(data_pipe.producer_handle.get(),
element.data.data(),
&num_bytes,
MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
}
break;
case blink::WebHTTPBody::Element::TypeFile:
case blink::WebHTTPBody::Element::TypeFileSystemURL:
case blink::WebHTTPBody::Element::TypeBlob:
// TODO(mpcomplete): handle these.
NOTIMPLEMENTED();
break;
default:
NOTREACHED();
}
}
}
void ConfigureSettings(blink::WebSettings* settings) { void ConfigureSettings(blink::WebSettings* settings) {
settings->setAcceleratedCompositingEnabled(false); settings->setAcceleratedCompositingEnabled(false);
settings->setCookieEnabled(true); settings->setCookieEnabled(true);
...@@ -235,14 +159,7 @@ blink::WebNavigationPolicy HTMLDocumentView::decidePolicyForNavigation( ...@@ -235,14 +159,7 @@ blink::WebNavigationPolicy HTMLDocumentView::decidePolicyForNavigation(
return default_policy; return default_policy;
NavigationDetailsPtr nav_details(NavigationDetails::New()); NavigationDetailsPtr nav_details(NavigationDetails::New());
nav_details->request->url = request.url().string().utf8(); nav_details->request = URLRequest::From(request);
nav_details->request->method = request.httpMethod().utf8();
HeaderFlattener flattener;
request.visitHTTPHeaderFields(&flattener);
nav_details->request->headers = flattener.GetBuffer().Pass();
AddRequestBody(nav_details.get(), request);
navigator_host_->RequestNavigate( navigator_host_->RequestNavigate(
root_->id(), root_->id(),
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/logging.h" #include "base/logging.h"
#include "base/thread_task_runner_handle.h" #include "base/thread_task_runner_handle.h"
#include "mojo/common/common_type_converters.h" #include "mojo/common/common_type_converters.h"
#include "mojo/services/html_viewer/blink_url_request_type_converters.h"
#include "mojo/services/public/interfaces/network/network_service.mojom.h" #include "mojo/services/public/interfaces/network/network_service.mojom.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "third_party/WebKit/public/platform/WebURLError.h" #include "third_party/WebKit/public/platform/WebURLError.h"
...@@ -65,11 +66,8 @@ void WebURLLoaderImpl::loadAsynchronously(const blink::WebURLRequest& request, ...@@ -65,11 +66,8 @@ void WebURLLoaderImpl::loadAsynchronously(const blink::WebURLRequest& request,
client_ = client; client_ = client;
url_ = request.url(); url_ = request.url();
URLRequestPtr url_request(URLRequest::New()); URLRequestPtr url_request = URLRequest::From(request);
url_request->url = String::From(url_);
url_request->method = request.httpMethod().utf8();
url_request->auto_follow_redirects = false; url_request->auto_follow_redirects = false;
// TODO(darin): Copy other fields.
if (request.extraData()) { if (request.extraData()) {
WebURLRequestExtraData* extra_data = WebURLRequestExtraData* extra_data =
......
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