Commit 8919fe48 authored by mek's avatar mek Committed by Commit bot

Implement URL and Origin typemaps/struct traits for blink.

Review-Url: https://codereview.chromium.org/2000253006
Cr-Commit-Position: refs/heads/master@{#396952}
parent 66797e1d
......@@ -6,7 +6,10 @@ variant = "blink"
for_blink = true
_typemap_imports = [ "//mojo/public/cpp/bindings/tests/blink_typemaps.gni" ]
_typemap_imports = [
"//mojo/public/cpp/bindings/tests/blink_typemaps.gni",
"//third_party/WebKit/Source/platform/mojo/blink_typemaps.gni",
]
_typemaps = []
foreach(typemap_import, _typemap_imports) {
......
......@@ -292,7 +292,11 @@ group("make_platform_generated") {
# blink_platform target in blink_platform.gyp
component("platform") {
visibility = [] # Allow re-assignment of list.
visibility = [ "//third_party/WebKit/*" ]
visibility = [
"//third_party/WebKit/*",
"//url/mojo:url_mojom_origin_blink_cpp_sources",
"//url/mojo:url_mojom_gurl_blink_cpp_sources",
]
output_name = "blink_platform"
sources = platform_files
......@@ -565,6 +569,7 @@ test("blink_platform_unittests") {
"//ui/gfx",
"//ui/gfx/geometry",
"//url",
"//url/mojo:test_url_mojom_gurl_blink",
]
data_deps = [
......
......@@ -160,6 +160,7 @@
'<(DEPTH)/ui/gfx/gfx.gyp:gfx',
'<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
'<(DEPTH)/url/url.gyp:url_lib',
'<(DEPTH)/url/url.gyp:url_interfaces_mojom_for_blink',
'<(DEPTH)/v8/src/v8.gyp:v8',
'<(libjpeg_gyp_path):libjpeg',
],
......
......@@ -1217,6 +1217,7 @@
'image-decoders/webp/WEBPImageDecoderTest.cpp',
'inspector_protocol/ParserTest.cpp',
'mac/VersionUtilMacTest.mm',
'mojo/KURLSecurityOriginTest.cpp',
'network/EncodedFormDataTest.cpp',
'network/HTTPParsersTest.cpp',
'network/LinkHeaderTest.cpp',
......
......@@ -82,6 +82,8 @@
'<(DEPTH)/ui/gfx/gfx.gyp:gfx',
'<(DEPTH)/ui/gfx/gfx.gyp:gfx_geometry',
'<(DEPTH)/url/url.gyp:url_lib',
'<(DEPTH)/url/url.gyp:url_interfaces_mojom_for_blink',
'<(DEPTH)/url/url.gyp:url_test_interfaces_mojom_for_blink',
'blink_platform.gyp:blink_platform',
],
'defines': [
......
......@@ -2,6 +2,8 @@ include_rules = [
# To whitelist base/ stuff Blink is allowed to include, we list up all
# directories and files instead of writing 'base/'.
"+base/bind.h",
"+base/message_loop/message_loop.h",
"+mojo/public/cpp/bindings/binding.h",
"+mojo/public/cpp/bindings/callback.h",
"+mojo/public/cpp/bindings/wtf_array.h",
]
# Copyright 2016 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.
mojom = "//url/mojo/url.mojom"
public_headers = [ "//third_party/WebKit/Source/platform/weborigin/KURL.h" ]
traits_headers = [ "//third_party/WebKit/Source/platform/mojo/KURLStructTraits.h" ]
deps = [
"//third_party/WebKit/Source/platform",
]
type_mappings = [ "url.mojom.Url=::blink::KURL" ]
// Copyright 2016 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 "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/mojo/url_test.mojom-blink.h"
#include "url/url_constants.h"
namespace blink {
namespace {
class UrlTestImpl : public url::mojom::blink::UrlTest {
public:
explicit UrlTestImpl(url::mojom::blink::UrlTestRequest request)
: m_binding(this, std::move(request))
{
}
// UrlTest:
void BounceUrl(const KURL& in, const BounceUrlCallback& callback) override
{
callback.Run(in);
}
void BounceOrigin(const RefPtr<SecurityOrigin>& in,
const BounceOriginCallback& callback) override
{
callback.Run(in);
}
private:
mojo::Binding<UrlTest> m_binding;
};
} // namespace
// Mojo version of chrome IPC test in url/ipc/url_param_traits_unittest.cc.
TEST(KURLSecurityOriginStructTraitsTest, Basic)
{
base::MessageLoop messageLoop;
url::mojom::blink::UrlTestPtr proxy;
UrlTestImpl impl(GetProxy(&proxy));
const char* serializeCases[] = {
"http://www.google.com/",
"http://user:pass@host.com:888/foo;bar?baz#nop",
};
for (const char* testCase : serializeCases) {
KURL input(KURL(), testCase);
KURL output;
EXPECT_TRUE(proxy->BounceUrl(input, &output));
// We want to test each component individually to make sure its range was
// correctly serialized and deserialized, not just the spec.
EXPECT_EQ(input.getString(), output.getString());
EXPECT_EQ(input.isValid(), output.isValid());
EXPECT_EQ(input.protocol(), output.protocol());
EXPECT_EQ(input.user(), output.user());
EXPECT_EQ(input.pass(), output.pass());
EXPECT_EQ(input.host(), output.host());
EXPECT_EQ(input.port(), output.port());
EXPECT_EQ(input.path(), output.path());
EXPECT_EQ(input.query(), output.query());
EXPECT_EQ(input.fragmentIdentifier(), output.fragmentIdentifier());
}
// Test an excessively long GURL.
{
const std::string url = std::string("http://example.org/").append(url::kMaxURLChars + 1, 'a');
KURL input(KURL(), url.c_str());
KURL output;
EXPECT_TRUE(proxy->BounceUrl(input, &output));
EXPECT_TRUE(output.isEmpty());
}
// Test basic Origin serialization.
RefPtr<SecurityOrigin> nonUnique = SecurityOrigin::create("http", "www.google.com", 80);
RefPtr<SecurityOrigin> output;
EXPECT_TRUE(proxy->BounceOrigin(nonUnique, &output));
EXPECT_TRUE(nonUnique->isSameSchemeHostPort(output.get()));
EXPECT_FALSE(nonUnique->isUnique());
RefPtr<SecurityOrigin> unique = SecurityOrigin::createUnique();
EXPECT_TRUE(proxy->BounceOrigin(unique, &output));
EXPECT_TRUE(output->isUnique());
}
} // namespace url
// Copyright 2016 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 KURLStructTraits_h
#define KURLStructTraits_h
#include "platform/weborigin/KURL.h"
#include "url/mojo/url.mojom-blink.h"
#include "url/url_constants.h"
#include "wtf/text/WTFString.h"
namespace mojo {
template <>
struct StructTraits<url::mojom::blink::Url, ::blink::KURL> {
static WTF::String url(const ::blink::KURL& blinkUrl)
{
if (!blinkUrl.isValid() || blinkUrl.getString().length() > url::kMaxURLChars) {
return emptyString();
}
return blinkUrl.getString();
}
static bool Read(url::mojom::blink::UrlDataView data, ::blink::KURL* out)
{
WTF::String urlString;
if (!data.ReadUrl(&urlString))
return false;
if (urlString.length() > url::kMaxURLChars)
return false;
*out = ::blink::KURL(::blink::KURL(), urlString);
if (!urlString.isEmpty() && !out->isValid())
return false;
return true;
}
};
}
#endif // KURLStructTraits_h
# Changes to IPC serialization require a security review to avoid introducing
# new sandbox escapes.
per-file *StructTraits.h=set noparent
per-file *StructTraits.h=dcheng@chromium.org
per-file *StructTraits.h=inferno@chromium.org
per-file *StructTraits.h=jln@chromium.org
per-file *StructTraits.h=jschuh@chromium.org
per-file *StructTraits.h=kenrb@chromium.org
per-file *StructTraits.h=mkwst@chromium.org
per-file *StructTraits.h=nasko@chromium.org
per-file *StructTraits.h=palmer@chromium.org
per-file *StructTraits.h=tsepez@chromium.org
per-file *StructTraits.h=wfh@chromium.org
# Copyright 2016 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.
mojom = "//url/mojo/origin.mojom"
public_headers = [ "//third_party/WebKit/Source/platform/weborigin/SecurityOrigin.h" ]
traits_headers = [ "//third_party/WebKit/Source/platform/mojo/SecurityOriginStructTraits.h" ]
deps = [
"//third_party/WebKit/Source/platform",
]
type_mappings = [ "url.mojom.Origin=RefPtr<::blink::SecurityOrigin>" ]
// Copyright 2016 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 SecurityOriginStructTraits_h
#define SecurityOriginStructTraits_h
#include "platform/weborigin/SecurityOrigin.h"
#include "url/mojo/origin.mojom-blink.h"
#include "wtf/text/WTFString.h"
namespace mojo {
template <>
struct StructTraits<url::mojom::blink::Origin, RefPtr<::blink::SecurityOrigin>> {
static WTF::String scheme(const RefPtr<::blink::SecurityOrigin>& origin)
{
return origin->protocol();
}
static WTF::String host(const RefPtr<::blink::SecurityOrigin>& origin)
{
return origin->host();
}
static uint16_t port(const RefPtr<::blink::SecurityOrigin>& origin)
{
return origin->port();
}
static bool unique(const RefPtr<::blink::SecurityOrigin>& origin)
{
return origin->isUnique();
}
static bool Read(url::mojom::blink::OriginDataView data, RefPtr<::blink::SecurityOrigin>* out)
{
if (data.unique()) {
*out = ::blink::SecurityOrigin::createUnique();
} else {
WTF::String scheme;
WTF::String host;
if (!data.ReadScheme(&scheme) || !data.ReadHost(&host))
return false;
*out = ::blink::SecurityOrigin::create(scheme, host, data.port());
}
// If a unique origin was created, but the unique flag wasn't set, then
// the values provided to 'create' were invalid.
if (!data.unique() && (*out)->isUnique())
return false;
return true;
}
};
}
#endif // SecurityOriginStructTraits_h
# Copyright 2016 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.
typemaps = [
"//third_party/WebKit/Source/platform/mojo/KURL.typemap",
"//third_party/WebKit/Source/platform/mojo/SecurityOrigin.typemap",
]
......@@ -134,6 +134,23 @@
'includes': [ '../mojo/mojom_bindings_generator_explicit.gypi' ],
},
{
'target_name': 'url_interfaces_mojom_for_blink',
'type': 'none',
'variables': {
'for_blink': 'true',
'mojom_files': [
'mojo/origin.mojom',
'mojo/url.mojom',
],
'mojom_typemaps': [
'../third_party/WebKit/Source/platform/mojo/KURL.typemap',
'../third_party/WebKit/Source/platform/mojo/SecurityOrigin.typemap',
],
},
'includes': [ '../mojo/mojom_bindings_generator_explicit.gypi' ],
},
{
# GN version: //url/mojo:url_mojom_gurl and //url/mojo:url_mojom_origin
'target_name': 'url_mojom',
'type': 'static_library',
'export_dependent_settings': [
......@@ -146,6 +163,20 @@
],
},
{
# GN version: //url/mojo:url_mojom_gurl_blink and //url/mojo:url_mojom_origin_blink
'target_name': 'url_mojom_for_blink',
'type': 'static_library',
'export_dependent_settings': [
'../mojo/mojo_public.gyp:mojo_cpp_bindings',
],
'dependencies': [
'../mojo/mojo_public.gyp:mojo_cpp_bindings',
'url_interfaces_mojom_for_blink',
'url_lib',
],
},
{
# GN version: //url/mojo:test_url_mojom_gurl
'target_name': 'url_test_interfaces_mojom',
'type': 'none',
'variables': {
......@@ -162,6 +193,25 @@
'../mojo/mojo_public.gyp:mojo_cpp_bindings',
],
},
{
# GN version: //url/mojo:test_url_mojom_gurl_blink
'target_name': 'url_test_interfaces_mojom_for_blink',
'type': 'none',
'variables': {
'for_blink': 'true',
'mojom_files': [
'mojo/url_test.mojom',
],
'mojom_typemaps': [
'../third_party/WebKit/Source/platform/mojo/KURL.typemap',
'../third_party/WebKit/Source/platform/mojo/SecurityOrigin.typemap',
],
},
'includes': [ '../mojo/mojom_bindings_generator_explicit.gypi' ],
'dependencies': [
'../mojo/mojo_public.gyp:mojo_cpp_bindings',
],
},
{
'target_name': 'url_test_mojom',
'type': 'static_library',
......
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