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 @@
#include "net/http/http_cache.h"
#include "testing/gmock/include/gmock/gmock.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/size.h"
#include "url/gurl.h"
......@@ -149,8 +148,6 @@ int DummyPrerenderContents::g_next_route_id_ = 0;
const gfx::Size kDefaultViewSize(640, 480);
const uint32_t kDefaultRelTypes = blink::kPrerenderRelTypePrerender;
} // namespace
class UnitTestPrerenderManager : public PrerenderManager {
......@@ -401,10 +398,9 @@ class PrerenderTest : public testing::Test {
const GURL& initiator_url,
int render_process_id,
int render_view_id) {
blink::mojom::PrerenderAttributesPtr attributes =
blink::mojom::PrerenderAttributes::New();
auto attributes = blink::mojom::PrerenderAttributes::New();
attributes->url = url;
attributes->rel_types = kDefaultRelTypes;
attributes->rel_type = blink::mojom::PrerenderRelType::kPrerender;
attributes->referrer = blink::mojom::Referrer::New(
initiator_url, network::mojom::ReferrerPolicy::kDefault);
attributes->initiator_origin = url::Origin::Create(initiator_url);
......
......@@ -23,7 +23,6 @@
#include "content/public/common/referrer.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/prerender/prerender_rel_type.h"
#include "ui/gfx/geometry/size.h"
#include "url/gurl.h"
#include "url/origin.h"
......@@ -86,7 +85,7 @@ class PrerenderLinkManager::LinkPrerender {
int launcher_render_process_id;
int launcher_render_view_id;
GURL url;
uint32_t rel_types;
blink::mojom::PrerenderRelType rel_type;
content::Referrer referrer;
url::Origin initiator_origin;
gfx::Size size;
......@@ -124,7 +123,7 @@ PrerenderLinkManager::LinkPrerender::LinkPrerender(
: launcher_render_process_id(launcher_render_process_id),
launcher_render_view_id(launcher_render_view_id),
url(attributes->url),
rel_types(attributes->rel_types),
rel_type(attributes->rel_type),
referrer(content::Referrer(*attributes->referrer)),
initiator_origin(attributes->initiator_origin),
size(attributes->view_size),
......@@ -336,7 +335,7 @@ void PrerenderLinkManager::StartPrerenders() {
manager_->AddPrerenderFromLinkRelPrerender(
pending_prerender->launcher_render_process_id,
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);
if (!handle) {
// This prerender couldn't be launched, it's gone.
......
......@@ -52,7 +52,6 @@
#include "content/public/common/url_constants.h"
#include "net/http/http_cache.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"
using content::BrowserThread;
......@@ -170,13 +169,20 @@ PrerenderManager::AddPrerenderFromLinkRelPrerender(
int process_id,
int route_id,
const GURL& url,
const uint32_t rel_types,
blink::mojom::PrerenderRelType rel_type,
const content::Referrer& referrer,
const url::Origin& initiator_origin,
const gfx::Size& size) {
Origin origin = rel_types & blink::kPrerenderRelTypePrerender
? ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN
: ORIGIN_LINK_REL_NEXT;
Origin origin = ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN;
switch (rel_type) {
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;
// Unit tests pass in a process_id == -1.
if (process_id != -1) {
......
......@@ -26,6 +26,7 @@
#include "components/prerender/common/prerender_final_status.h"
#include "components/prerender/common/prerender_origin.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/origin.h"
......@@ -110,7 +111,7 @@ class PrerenderManager : public content::RenderProcessHostObserver,
int process_id,
int route_id,
const GURL& url,
uint32_t rel_types,
blink::mojom::PrerenderRelType rel_type,
const content::Referrer& referrer,
const url::Origin& initiator_origin,
const gfx::Size& size);
......
......@@ -162,7 +162,6 @@ source_set("headers") {
"peerconnection/peer_connection_tracker_mojom_traits.h",
"peerconnection/webrtc_ip_handling_policy.h",
"permissions/permission_utils.h",
"prerender/prerender_rel_type.h",
"scheduler/web_scheduler_tracked_feature.h",
"security/security_style.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 {
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 {
url.mojom.Url url;
uint32 rel_types;
PrerenderRelType rel_type;
blink.mojom.Referrer referrer;
url.mojom.Origin initiator_origin;
gfx.mojom.Size view_size;
......
......@@ -36,7 +36,6 @@
#include "mojo/public/cpp/bindings/receiver_set.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/prerender/prerender_rel_type.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_string.h"
......@@ -79,7 +78,9 @@ class MockPrerender : public mojom::blink::PrerenderHandle {
~MockPrerender() override = default;
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.
size_t CancelCount() const { return cancel_count_; }
......@@ -260,8 +261,7 @@ TEST_F(PrerenderingTest, SinglePrerender) {
PrerenderProcessor()->ReleasePrerender();
EXPECT_TRUE(prerender);
EXPECT_EQ(KURL("http://prerender.com/"), prerender->Url());
EXPECT_EQ(static_cast<unsigned>(kPrerenderRelTypePrerender),
prerender->RelTypes());
EXPECT_EQ(mojom::blink::PrerenderRelType::kPrerender, prerender->RelType());
EXPECT_EQ(1u, PrerenderProcessor()->AddCount());
EXPECT_EQ(0u, prerender->CancelCount());
......
......@@ -31,7 +31,6 @@
#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/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
......@@ -57,20 +56,23 @@ class WebPrescientNetworking;
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,
Document& document) {
unsigned result = 0;
base::Optional<mojom::blink::PrerenderRelType> rel_type;
if (rel_attribute.IsLinkPrerender()) {
result |= kPrerenderRelTypePrerender;
UseCounter::Count(document, WebFeature::kLinkRelPrerender);
rel_type = mojom::blink::PrerenderRelType::kPrerender;
}
if (rel_attribute.IsLinkNext()) {
result |= kPrerenderRelTypeNext;
UseCounter::Count(document, WebFeature::kLinkRelNext);
// Prioritize mojom::blink::PrerenderRelType::kPrerender.
if (!rel_type)
rel_type = mojom::blink::PrerenderRelType::kNext;
}
return result;
return rel_type;
}
} // namespace
......@@ -194,15 +196,16 @@ bool LinkLoader::LoadLink(const LinkLoadParameters& params,
PreloadHelper::ModulePreloadIfNeeded(
params, document, nullptr /* viewport_description */, this);
if (const unsigned prerender_rel_types =
PrerenderRelTypesFromRelAttribute(params.rel, document)) {
base::Optional<mojom::blink::PrerenderRelType> prerender_rel_type =
PrerenderRelTypeFromRelAttribute(params.rel, document);
if (prerender_rel_type) {
if (!prerender_) {
prerender_ = PrerenderHandle::Create(document, this, params.href,
prerender_rel_types);
*prerender_rel_type);
} else if (prerender_->Url() != params.href) {
prerender_->Cancel();
prerender_ = PrerenderHandle::Create(document, this, params.href,
prerender_rel_types);
*prerender_rel_type);
}
// TODO(gavinp): Handle changes to rel types of existing prerenders.
} else if (prerender_) {
......
......@@ -42,10 +42,11 @@
namespace blink {
// static
PrerenderHandle* PrerenderHandle::Create(Document& document,
PrerenderClient* client,
const KURL& url,
const unsigned prerender_rel_types) {
PrerenderHandle* PrerenderHandle::Create(
Document& document,
PrerenderClient* client,
const KURL& url,
mojom::blink::PrerenderRelType prerender_rel_type) {
// Prerenders are unlike requests in most ways (for instance, they pass down
// fragments, and they don't return data), but they do have referrers.
......@@ -56,10 +57,9 @@ PrerenderHandle* PrerenderHandle::Create(Document& document,
Referrer referrer = SecurityPolicy::GenerateReferrer(
context->GetReferrerPolicy(), url, context->OutgoingReferrer());
mojom::blink::PrerenderAttributesPtr attributes =
mojom::blink::PrerenderAttributes::New();
auto attributes = mojom::blink::PrerenderAttributes::New();
attributes->url = url;
attributes->rel_types = prerender_rel_types;
attributes->rel_type = prerender_rel_type;
attributes->referrer = mojom::blink::Referrer::New(
KURL(NullURL(), referrer.referrer), referrer.referrer_policy);
attributes->initiator_origin = context->GetSecurityOrigin();
......
......@@ -53,10 +53,11 @@ class PrerenderHandle final : public GarbageCollected<PrerenderHandle>,
USING_PRE_FINALIZER(PrerenderHandle, Dispose);
public:
static PrerenderHandle* Create(Document&,
PrerenderClient*,
const KURL&,
unsigned prerender_rel_types);
static PrerenderHandle* Create(
Document&,
PrerenderClient*,
const KURL&,
mojom::blink::PrerenderRelType prerender_rel_type);
using PassKey = util::PassKey<PrerenderHandle>;
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