Commit 80f9997d authored by Hiroki Nakagawa's avatar Hiroki Nakagawa Committed by Commit Bot

Prerender: Replace WebPrerenderRelType with mojom::PrerenderRelType

For code simplification, this CL replaces WebPrerenderRelType with
mojom::PrerenderRelType.

Before this change, WebPrerenderRelType was represented as bit-field.
This is because it was allowed to specify both "prerender"[1] and
"next"[2] types at the same time in the link rel attribute like
<link rel="prefetch next">. However, in that case, "prerender" is just
prioritized[3], so it was unnecessary to keep both the types in the
bit-field.

Therefore this CL introduces the mojom::PrerenderRelType as enum instead
of bit-field. This would make code simpler and more readable.

[1] https://html.spec.whatwg.org/C/#link-type-prerender
[2] https://html.spec.whatwg.org/C/#link-type-next
[3] https://source.chromium.org/chromium/chromium/src/+/master:components/prerender/browser/prerender_manager.cc;l=177;drc=ee49bcdf8e3a7764fa22b8e9d1ec1d0c9332870f

Bug: n/a
Change-Id: Ida2957a659c7578930bdeac136c72ebc8cacb8b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2409890Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807396}
parent 2ef1b641
...@@ -53,7 +53,6 @@ ...@@ -53,7 +53,6 @@
#include "net/http/http_cache.h" #include "net/http/http_cache.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/prerender/prerender_rel_type.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -149,8 +148,6 @@ int DummyPrerenderContents::g_next_route_id_ = 0; ...@@ -149,8 +148,6 @@ int DummyPrerenderContents::g_next_route_id_ = 0;
const gfx::Size kDefaultViewSize(640, 480); const gfx::Size kDefaultViewSize(640, 480);
const uint32_t kDefaultRelTypes = blink::kPrerenderRelTypePrerender;
} // namespace } // namespace
class UnitTestPrerenderManager : public PrerenderManager { class UnitTestPrerenderManager : public PrerenderManager {
...@@ -401,10 +398,9 @@ class PrerenderTest : public testing::Test { ...@@ -401,10 +398,9 @@ class PrerenderTest : public testing::Test {
const GURL& initiator_url, const GURL& initiator_url,
int render_process_id, int render_process_id,
int render_view_id) { int render_view_id) {
blink::mojom::PrerenderAttributesPtr attributes = auto attributes = blink::mojom::PrerenderAttributes::New();
blink::mojom::PrerenderAttributes::New();
attributes->url = url; attributes->url = url;
attributes->rel_types = kDefaultRelTypes; attributes->rel_type = blink::mojom::PrerenderRelType::kPrerender;
attributes->referrer = blink::mojom::Referrer::New( attributes->referrer = blink::mojom::Referrer::New(
initiator_url, network::mojom::ReferrerPolicy::kDefault); initiator_url, network::mojom::ReferrerPolicy::kDefault);
attributes->initiator_origin = url::Origin::Create(initiator_url); attributes->initiator_origin = url::Origin::Create(initiator_url);
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "content/public/common/referrer.h" #include "content/public/common/referrer.h"
#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/associated_remote.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/common/prerender/prerender_rel_type.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "url/gurl.h" #include "url/gurl.h"
#include "url/origin.h" #include "url/origin.h"
...@@ -86,7 +85,7 @@ class PrerenderLinkManager::LinkPrerender { ...@@ -86,7 +85,7 @@ class PrerenderLinkManager::LinkPrerender {
int launcher_render_process_id; int launcher_render_process_id;
int launcher_render_view_id; int launcher_render_view_id;
GURL url; GURL url;
uint32_t rel_types; blink::mojom::PrerenderRelType rel_type;
content::Referrer referrer; content::Referrer referrer;
url::Origin initiator_origin; url::Origin initiator_origin;
gfx::Size size; gfx::Size size;
...@@ -124,7 +123,7 @@ PrerenderLinkManager::LinkPrerender::LinkPrerender( ...@@ -124,7 +123,7 @@ PrerenderLinkManager::LinkPrerender::LinkPrerender(
: launcher_render_process_id(launcher_render_process_id), : launcher_render_process_id(launcher_render_process_id),
launcher_render_view_id(launcher_render_view_id), launcher_render_view_id(launcher_render_view_id),
url(attributes->url), url(attributes->url),
rel_types(attributes->rel_types), rel_type(attributes->rel_type),
referrer(content::Referrer(*attributes->referrer)), referrer(content::Referrer(*attributes->referrer)),
initiator_origin(attributes->initiator_origin), initiator_origin(attributes->initiator_origin),
size(attributes->view_size), size(attributes->view_size),
...@@ -336,7 +335,7 @@ void PrerenderLinkManager::StartPrerenders() { ...@@ -336,7 +335,7 @@ void PrerenderLinkManager::StartPrerenders() {
manager_->AddPrerenderFromLinkRelPrerender( manager_->AddPrerenderFromLinkRelPrerender(
pending_prerender->launcher_render_process_id, pending_prerender->launcher_render_process_id,
pending_prerender->launcher_render_view_id, pending_prerender->url, pending_prerender->launcher_render_view_id, pending_prerender->url,
pending_prerender->rel_types, pending_prerender->referrer, pending_prerender->rel_type, pending_prerender->referrer,
pending_prerender->initiator_origin, pending_prerender->size); pending_prerender->initiator_origin, pending_prerender->size);
if (!handle) { if (!handle) {
// This prerender couldn't be launched, it's gone. // This prerender couldn't be launched, it's gone.
......
...@@ -52,7 +52,6 @@ ...@@ -52,7 +52,6 @@
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "net/http/http_cache.h" #include "net/http/http_cache.h"
#include "net/http/http_request_headers.h" #include "net/http/http_request_headers.h"
#include "third_party/blink/public/common/prerender/prerender_rel_type.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
using content::BrowserThread; using content::BrowserThread;
...@@ -170,13 +169,20 @@ PrerenderManager::AddPrerenderFromLinkRelPrerender( ...@@ -170,13 +169,20 @@ PrerenderManager::AddPrerenderFromLinkRelPrerender(
int process_id, int process_id,
int route_id, int route_id,
const GURL& url, const GURL& url,
const uint32_t rel_types, blink::mojom::PrerenderRelType rel_type,
const content::Referrer& referrer, const content::Referrer& referrer,
const url::Origin& initiator_origin, const url::Origin& initiator_origin,
const gfx::Size& size) { const gfx::Size& size) {
Origin origin = rel_types & blink::kPrerenderRelTypePrerender Origin origin = ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN;
? ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN switch (rel_type) {
: ORIGIN_LINK_REL_NEXT; case blink::mojom::PrerenderRelType::kPrerender:
origin = ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN;
break;
case blink::mojom::PrerenderRelType::kNext:
origin = ORIGIN_LINK_REL_NEXT;
break;
}
SessionStorageNamespace* session_storage_namespace = nullptr; SessionStorageNamespace* session_storage_namespace = nullptr;
// Unit tests pass in a process_id == -1. // Unit tests pass in a process_id == -1.
if (process_id != -1) { if (process_id != -1) {
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "components/prerender/common/prerender_final_status.h" #include "components/prerender/common/prerender_final_status.h"
#include "components/prerender/common/prerender_origin.h" #include "components/prerender/common/prerender_origin.h"
#include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/render_process_host_observer.h"
#include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
#include "url/gurl.h" #include "url/gurl.h"
#include "url/origin.h" #include "url/origin.h"
...@@ -110,7 +111,7 @@ class PrerenderManager : public content::RenderProcessHostObserver, ...@@ -110,7 +111,7 @@ class PrerenderManager : public content::RenderProcessHostObserver,
int process_id, int process_id,
int route_id, int route_id,
const GURL& url, const GURL& url,
uint32_t rel_types, blink::mojom::PrerenderRelType rel_type,
const content::Referrer& referrer, const content::Referrer& referrer,
const url::Origin& initiator_origin, const url::Origin& initiator_origin,
const gfx::Size& size); const gfx::Size& size);
......
...@@ -162,7 +162,6 @@ source_set("headers") { ...@@ -162,7 +162,6 @@ source_set("headers") {
"peerconnection/peer_connection_tracker_mojom_traits.h", "peerconnection/peer_connection_tracker_mojom_traits.h",
"peerconnection/webrtc_ip_handling_policy.h", "peerconnection/webrtc_ip_handling_policy.h",
"permissions/permission_utils.h", "permissions/permission_utils.h",
"prerender/prerender_rel_type.h",
"scheduler/web_scheduler_tracked_feature.h", "scheduler/web_scheduler_tracked_feature.h",
"security/security_style.h", "security/security_style.h",
"security_context/insecure_request_policy.h", "security_context/insecure_request_policy.h",
......
// Copyright 2019 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_PRERENDER_PRERENDER_REL_TYPE_H_
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_PRERENDER_PRERENDER_REL_TYPE_H_
namespace blink {
// WebPrerenderRelType is a bitfield since multiple rel attributes can be set on
// the same prerender.
enum WebPrerenderRelType {
kPrerenderRelTypePrerender = 0x1,
kPrerenderRelTypeNext = 0x2,
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_PRERENDER_PRERENDER_REL_TYPE_H_
...@@ -40,9 +40,17 @@ interface PrerenderHandle { ...@@ -40,9 +40,17 @@ interface PrerenderHandle {
Abandon(); Abandon();
}; };
enum PrerenderRelType {
// https://html.spec.whatwg.org/C/#link-type-prerender
kPrerender,
// https://html.spec.whatwg.org/C/#link-type-next
kNext,
};
struct PrerenderAttributes { struct PrerenderAttributes {
url.mojom.Url url; url.mojom.Url url;
uint32 rel_types; PrerenderRelType rel_type;
blink.mojom.Referrer referrer; blink.mojom.Referrer referrer;
url.mojom.Origin initiator_origin; url.mojom.Origin initiator_origin;
gfx.mojom.Size view_size; gfx.mojom.Size view_size;
......
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/receiver_set.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/common/prerender/prerender_rel_type.h"
#include "third_party/blink/public/mojom/prerender/prerender.mojom-blink.h" #include "third_party/blink/public/mojom/prerender/prerender.mojom-blink.h"
#include "third_party/blink/public/platform/web_cache.h" #include "third_party/blink/public/platform/web_cache.h"
#include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_string.h"
...@@ -79,7 +78,9 @@ class MockPrerender : public mojom::blink::PrerenderHandle { ...@@ -79,7 +78,9 @@ class MockPrerender : public mojom::blink::PrerenderHandle {
~MockPrerender() override = default; ~MockPrerender() override = default;
const KURL& Url() const { return attributes_->url; } const KURL& Url() const { return attributes_->url; }
uint32_t RelTypes() const { return attributes_->rel_types; } mojom::blink::PrerenderRelType RelType() const {
return attributes_->rel_type;
}
// Returns the number of times |Cancel| was called. // Returns the number of times |Cancel| was called.
size_t CancelCount() const { return cancel_count_; } size_t CancelCount() const { return cancel_count_; }
...@@ -260,8 +261,7 @@ TEST_F(PrerenderingTest, SinglePrerender) { ...@@ -260,8 +261,7 @@ TEST_F(PrerenderingTest, SinglePrerender) {
PrerenderProcessor()->ReleasePrerender(); PrerenderProcessor()->ReleasePrerender();
EXPECT_TRUE(prerender); EXPECT_TRUE(prerender);
EXPECT_EQ(KURL("http://prerender.com/"), prerender->Url()); EXPECT_EQ(KURL("http://prerender.com/"), prerender->Url());
EXPECT_EQ(static_cast<unsigned>(kPrerenderRelTypePrerender), EXPECT_EQ(mojom::blink::PrerenderRelType::kPrerender, prerender->RelType());
prerender->RelTypes());
EXPECT_EQ(1u, PrerenderProcessor()->AddCount()); EXPECT_EQ(1u, PrerenderProcessor()->AddCount());
EXPECT_EQ(0u, prerender->CancelCount()); EXPECT_EQ(0u, prerender->CancelCount());
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include "third_party/blink/renderer/core/loader/link_loader.h" #include "third_party/blink/renderer/core/loader/link_loader.h"
#include "third_party/blink/public/common/prerender/prerender_rel_type.h"
#include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame.h"
...@@ -57,20 +56,23 @@ class WebPrescientNetworking; ...@@ -57,20 +56,23 @@ class WebPrescientNetworking;
namespace { namespace {
unsigned PrerenderRelTypesFromRelAttribute( // Decide the prerender type based on the link rel attribute. Returns
// base::nullopt if the attribute doesn't indicate the prerender type.
base::Optional<mojom::blink::PrerenderRelType> PrerenderRelTypeFromRelAttribute(
const LinkRelAttribute& rel_attribute, const LinkRelAttribute& rel_attribute,
Document& document) { Document& document) {
unsigned result = 0; base::Optional<mojom::blink::PrerenderRelType> rel_type;
if (rel_attribute.IsLinkPrerender()) { if (rel_attribute.IsLinkPrerender()) {
result |= kPrerenderRelTypePrerender;
UseCounter::Count(document, WebFeature::kLinkRelPrerender); UseCounter::Count(document, WebFeature::kLinkRelPrerender);
rel_type = mojom::blink::PrerenderRelType::kPrerender;
} }
if (rel_attribute.IsLinkNext()) { if (rel_attribute.IsLinkNext()) {
result |= kPrerenderRelTypeNext;
UseCounter::Count(document, WebFeature::kLinkRelNext); UseCounter::Count(document, WebFeature::kLinkRelNext);
// Prioritize mojom::blink::PrerenderRelType::kPrerender.
if (!rel_type)
rel_type = mojom::blink::PrerenderRelType::kNext;
} }
return rel_type;
return result;
} }
} // namespace } // namespace
...@@ -194,15 +196,16 @@ bool LinkLoader::LoadLink(const LinkLoadParameters& params, ...@@ -194,15 +196,16 @@ bool LinkLoader::LoadLink(const LinkLoadParameters& params,
PreloadHelper::ModulePreloadIfNeeded( PreloadHelper::ModulePreloadIfNeeded(
params, document, nullptr /* viewport_description */, this); params, document, nullptr /* viewport_description */, this);
if (const unsigned prerender_rel_types = base::Optional<mojom::blink::PrerenderRelType> prerender_rel_type =
PrerenderRelTypesFromRelAttribute(params.rel, document)) { PrerenderRelTypeFromRelAttribute(params.rel, document);
if (prerender_rel_type) {
if (!prerender_) { if (!prerender_) {
prerender_ = PrerenderHandle::Create(document, this, params.href, prerender_ = PrerenderHandle::Create(document, this, params.href,
prerender_rel_types); *prerender_rel_type);
} else if (prerender_->Url() != params.href) { } else if (prerender_->Url() != params.href) {
prerender_->Cancel(); prerender_->Cancel();
prerender_ = PrerenderHandle::Create(document, this, params.href, prerender_ = PrerenderHandle::Create(document, this, params.href,
prerender_rel_types); *prerender_rel_type);
} }
// TODO(gavinp): Handle changes to rel types of existing prerenders. // TODO(gavinp): Handle changes to rel types of existing prerenders.
} else if (prerender_) { } else if (prerender_) {
......
...@@ -42,10 +42,11 @@ ...@@ -42,10 +42,11 @@
namespace blink { namespace blink {
// static // static
PrerenderHandle* PrerenderHandle::Create(Document& document, PrerenderHandle* PrerenderHandle::Create(
PrerenderClient* client, Document& document,
const KURL& url, PrerenderClient* client,
const unsigned prerender_rel_types) { const KURL& url,
mojom::blink::PrerenderRelType prerender_rel_type) {
// Prerenders are unlike requests in most ways (for instance, they pass down // Prerenders are unlike requests in most ways (for instance, they pass down
// fragments, and they don't return data), but they do have referrers. // fragments, and they don't return data), but they do have referrers.
...@@ -56,10 +57,9 @@ PrerenderHandle* PrerenderHandle::Create(Document& document, ...@@ -56,10 +57,9 @@ PrerenderHandle* PrerenderHandle::Create(Document& document,
Referrer referrer = SecurityPolicy::GenerateReferrer( Referrer referrer = SecurityPolicy::GenerateReferrer(
context->GetReferrerPolicy(), url, context->OutgoingReferrer()); context->GetReferrerPolicy(), url, context->OutgoingReferrer());
mojom::blink::PrerenderAttributesPtr attributes = auto attributes = mojom::blink::PrerenderAttributes::New();
mojom::blink::PrerenderAttributes::New();
attributes->url = url; attributes->url = url;
attributes->rel_types = prerender_rel_types; attributes->rel_type = prerender_rel_type;
attributes->referrer = mojom::blink::Referrer::New( attributes->referrer = mojom::blink::Referrer::New(
KURL(NullURL(), referrer.referrer), referrer.referrer_policy); KURL(NullURL(), referrer.referrer), referrer.referrer_policy);
attributes->initiator_origin = context->GetSecurityOrigin(); attributes->initiator_origin = context->GetSecurityOrigin();
......
...@@ -53,10 +53,11 @@ class PrerenderHandle final : public GarbageCollected<PrerenderHandle>, ...@@ -53,10 +53,11 @@ class PrerenderHandle final : public GarbageCollected<PrerenderHandle>,
USING_PRE_FINALIZER(PrerenderHandle, Dispose); USING_PRE_FINALIZER(PrerenderHandle, Dispose);
public: public:
static PrerenderHandle* Create(Document&, static PrerenderHandle* Create(
PrerenderClient*, Document&,
const KURL&, PrerenderClient*,
unsigned prerender_rel_types); const KURL&,
mojom::blink::PrerenderRelType prerender_rel_type);
using PassKey = util::PassKey<PrerenderHandle>; using PassKey = util::PassKey<PrerenderHandle>;
PrerenderHandle(PassKey, PrerenderHandle(PassKey,
......
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