Introduce SWRouterNotCondition to DB and mojo
This CL adds structures to support Conditional Syntax on ServiceWorker
Static Routing API. Some existing structures defined by mojo and
database objects are changed to have `NotCondition` objects.
Explainer: https://github.com/WICG/service-worker-static-routing-api/blob/main/final-form.md
Design Doc: https://docs.google.com/document/d/1B2D8w_2M4j9CZC1VccBOAhfCdiRP3yPCSV5UKKDhU70/
Bug: 1485792
Change-Id: I6237b5af5a5b1103309f4355dfcfd82fe591b7f8
Fuchsia-Binary-Size: Size increase is unavoidable because we add new structures in protobuf and mojo. We also exported symbols, which we did not do by mistake.
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5125493
Reviewed-by: Takashi Nakayama <tnak@chromium.org>
Commit-Queue: Yoshisato Yanagisawa <yyanagisawa@chromium.org>
Reviewed-by: Takashi Toyoshima <toyoshim@chromium.org>
Reviewed-by: Shunya Shishido <sisidovski@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1271991}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
f85d4975c7
commit
dc5507234a
components/services/storage/service_worker
content
browser
service_worker
common
third_party/blink
common
service_worker
public
common
mojom
service_worker
renderer
modules
service_worker
@ -408,8 +408,8 @@ bool WriteToBlinkCondition(
|
||||
const ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition&
|
||||
condition,
|
||||
blink::ServiceWorkerRouterCondition& out) {
|
||||
auto&& [out_url_pattern, out_request, out_running_status, out_or_condition] =
|
||||
out.get();
|
||||
auto&& [out_url_pattern, out_request, out_running_status, out_or_condition,
|
||||
out_not_condition] = out.get();
|
||||
switch (condition.condition_case()) {
|
||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::
|
||||
CONDITION_NOT_SET:
|
||||
@ -733,9 +733,37 @@ bool WriteToBlinkCondition(
|
||||
out_or_condition = std::move(or_condition);
|
||||
break;
|
||||
}
|
||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::
|
||||
kNotCondition: {
|
||||
if (out_not_condition) {
|
||||
// Duplicated `not` condition found
|
||||
return false;
|
||||
}
|
||||
if (!condition.has_not_condition()) {
|
||||
return false;
|
||||
}
|
||||
blink::ServiceWorkerRouterNotCondition not_condition;
|
||||
const auto& pb_o = condition.not_condition().object();
|
||||
blink::ServiceWorkerRouterCondition blink_condition;
|
||||
for (const auto& pb_c : pb_o.conditions()) {
|
||||
if (!WriteToBlinkCondition(pb_c, blink_condition)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (blink_condition.IsEmpty()) {
|
||||
return false;
|
||||
}
|
||||
not_condition.condition =
|
||||
std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||
std::move(blink_condition));
|
||||
|
||||
out_not_condition = std::move(not_condition);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!out.IsValid()) {
|
||||
DLOG(ERROR) << "out is not valid";
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -781,8 +809,8 @@ class AddConditionHelper {
|
||||
void WriteConditionToProtoWithHelper(
|
||||
const blink::ServiceWorkerRouterCondition& condition,
|
||||
AddConditionHelper& out) {
|
||||
const auto& [url_pattern, request, running_status, or_condition] =
|
||||
condition.get();
|
||||
const auto& [url_pattern, request, running_status, or_condition,
|
||||
not_condition] = condition.get();
|
||||
if (url_pattern) {
|
||||
auto* out_c = out.add_condition();
|
||||
ServiceWorkerRegistrationData::RouterRules::RuleV1::Condition::URLPattern*
|
||||
@ -1030,6 +1058,12 @@ void WriteConditionToProtoWithHelper(
|
||||
WriteConditionToProtoWithHelper(c, pb_o);
|
||||
}
|
||||
}
|
||||
if (not_condition) {
|
||||
auto* out_c = out.add_condition();
|
||||
AddConditionHelper pb_o(out_c->mutable_not_condition()->mutable_object());
|
||||
CHECK(not_condition->condition);
|
||||
WriteConditionToProtoWithHelper(*not_condition->condition, pb_o);
|
||||
}
|
||||
}
|
||||
|
||||
void WriteConditionToProto(
|
||||
@ -2477,8 +2511,10 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
||||
DCHECK(out);
|
||||
ServiceWorkerRegistrationData data;
|
||||
if (!data.ParseFromString(serialized))
|
||||
if (!data.ParseFromString(serialized)) {
|
||||
DLOG(ERROR) << "Failed to parse serialized data.";
|
||||
return Status::kErrorCorrupted;
|
||||
}
|
||||
|
||||
GURL scope_url(data.scope_url());
|
||||
GURL script_url(data.script_url());
|
||||
@ -2719,6 +2755,8 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
||||
if (data.router_rules().version() !=
|
||||
service_worker_internals::kRouterRuleVersion) {
|
||||
// Unknown route version.
|
||||
DLOG(ERROR) << "Router version '" << data.router_rules().version()
|
||||
<< "' is not valid.";
|
||||
return Status::kErrorCorrupted;
|
||||
}
|
||||
blink::ServiceWorkerRouterRules router_rules;
|
||||
@ -2727,6 +2765,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
||||
blink::ServiceWorkerRouterCondition condition;
|
||||
for (const auto& c : r.condition()) {
|
||||
if (!WriteToBlinkCondition(c, condition)) {
|
||||
DLOG(ERROR) << "Failed to write to blink condition.";
|
||||
return Status::kErrorCorrupted;
|
||||
}
|
||||
}
|
||||
@ -2736,6 +2775,7 @@ ServiceWorkerDatabase::Status ServiceWorkerDatabase::ParseRegistrationData(
|
||||
switch (s.source_case()) {
|
||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Source::
|
||||
SOURCE_NOT_SET:
|
||||
DLOG(ERROR) << "Source not set.";
|
||||
return Status::kErrorCorrupted;
|
||||
case ServiceWorkerRegistrationData::RouterRules::RuleV1::Source::
|
||||
kNetworkSource:
|
||||
|
@ -185,6 +185,9 @@ message ServiceWorkerRegistrationData {
|
||||
message OrCondition {
|
||||
repeated ConditionObject objects = 1;
|
||||
}
|
||||
message NotCondition {
|
||||
required ConditionObject object = 1;
|
||||
}
|
||||
// TODO(crbug.com/1492871): Make this a `message` to fit WebIDL
|
||||
oneof condition {
|
||||
// Used for representing URLPattern.
|
||||
@ -196,6 +199,9 @@ message ServiceWorkerRegistrationData {
|
||||
// Used for representing 'or' condition.
|
||||
// The `_condition` suffix is to avoid conflicts with keywords in C++
|
||||
OrCondition or_condition = 4;
|
||||
// Used for representing 'not' condition.
|
||||
// The `_condition` suffix is to avoid conflicts with keywords in C++
|
||||
NotCondition not_condition = 5;
|
||||
}
|
||||
}
|
||||
message Source {
|
||||
|
@ -3649,6 +3649,28 @@ TEST(ServiceWorkerDatabaseTest, RouterRulesStoreRestore) {
|
||||
store_and_restore(router_rules);
|
||||
}
|
||||
|
||||
// `not` condition
|
||||
{
|
||||
blink::ServiceWorkerRouterRules router_rules;
|
||||
blink::ServiceWorkerRouterRule rule;
|
||||
blink::ServiceWorkerRouterNotCondition not_condition;
|
||||
{
|
||||
not_condition.condition =
|
||||
std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||
blink::ServiceWorkerRouterCondition::WithRequest({}));
|
||||
}
|
||||
rule.condition =
|
||||
blink::ServiceWorkerRouterCondition::WithNotCondition(not_condition);
|
||||
|
||||
blink::ServiceWorkerRouterSource source;
|
||||
source.type = network::mojom::ServiceWorkerRouterSourceType::kNetwork;
|
||||
source.network_source = blink::ServiceWorkerRouterNetworkSource{};
|
||||
rule.sources.emplace_back(source);
|
||||
router_rules.rules.emplace_back(rule);
|
||||
|
||||
store_and_restore(router_rules);
|
||||
}
|
||||
|
||||
// empty request
|
||||
{
|
||||
blink::ServiceWorkerRouterRules router_rules;
|
||||
@ -3711,7 +3733,8 @@ TEST(ServiceWorkerDatabaseTest, RouterRulesStoreRestore) {
|
||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||
RunningStatusEnum::kRunning;
|
||||
}
|
||||
rule.condition = {url_pattern, request, running_status, std::nullopt};
|
||||
rule.condition = {url_pattern, request, running_status, std::nullopt,
|
||||
std::nullopt};
|
||||
}
|
||||
|
||||
blink::ServiceWorkerRouterSource source;
|
||||
|
@ -2093,14 +2093,16 @@ TEST_P(ServiceWorkerVersionStaticRouterTest, SetRouterEvaluator) {
|
||||
auto first_rule = version->router_evaluator()->rules().rules[0];
|
||||
auto second_rule = version->router_evaluator()->rules().rules[1];
|
||||
auto&& [first_url_pattern, first_request, first_running_status,
|
||||
first_or_condition] = first_rule.condition.get();
|
||||
first_or_condition, first_not_condition] =
|
||||
first_rule.condition.get();
|
||||
EXPECT_EQ(first_running_status->status,
|
||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||
RunningStatusEnum::kRunning);
|
||||
EXPECT_EQ(first_rule.sources.begin()->type,
|
||||
network::mojom::ServiceWorkerRouterSourceType::kNetwork);
|
||||
auto&& [second_url_pattern, second_request, second_running_status,
|
||||
second_or_condition] = second_rule.condition.get();
|
||||
second_or_condition, second_not_condition] =
|
||||
second_rule.condition.get();
|
||||
EXPECT_EQ(second_running_status->status,
|
||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||
RunningStatusEnum::kNotRunning);
|
||||
|
@ -196,8 +196,8 @@ base::Value OrConditionToValue(
|
||||
base::Value ConditionToValue(
|
||||
const blink::ServiceWorkerRouterCondition& condition) {
|
||||
base::Value::Dict out_c;
|
||||
const auto& [url_pattern, request, running_status, or_condition] =
|
||||
condition.get();
|
||||
const auto& [url_pattern, request, running_status, or_condition,
|
||||
not_condition] = condition.get();
|
||||
if (url_pattern) {
|
||||
base::Value::Dict url_pattern_value;
|
||||
#define TO_VALUE(type, type_name) \
|
||||
@ -360,13 +360,14 @@ bool BaseCondition::Set(const blink::ServiceWorkerRouterCondition& condition) {
|
||||
RecordSetupError(ServiceWorkerRouterEvaluatorErrorEnums::kEmptyCondition);
|
||||
return false;
|
||||
}
|
||||
const auto& [url_pattern, request, running_status, or_condition] =
|
||||
condition.get();
|
||||
const auto& [url_pattern, request, running_status, or_condition,
|
||||
not_condition] = condition.get();
|
||||
|
||||
CHECK(!or_condition);
|
||||
CHECK(!not_condition);
|
||||
|
||||
non_url_pattern_condition_ = {std::nullopt, request, running_status,
|
||||
std::nullopt};
|
||||
std::nullopt, std::nullopt};
|
||||
if (running_status) {
|
||||
need_running_status_ = true;
|
||||
}
|
||||
@ -437,9 +438,10 @@ bool BaseCondition::MatchNonUrlPatternConditions(
|
||||
const network::ResourceRequest& request,
|
||||
std::optional<blink::EmbeddedWorkerStatus> running_status) const {
|
||||
const auto& [url_pattern, request_pattern, running_status_pattern,
|
||||
or_condition] = non_url_pattern_condition_.get();
|
||||
or_condition, not_condition] = non_url_pattern_condition_.get();
|
||||
CHECK(!url_pattern);
|
||||
CHECK(!or_condition);
|
||||
CHECK(!not_condition);
|
||||
if (request_pattern && !MatchRequestCondition(*request_pattern, request)) {
|
||||
return false;
|
||||
}
|
||||
|
@ -1232,7 +1232,8 @@ TEST(ServiceWorkerRouterEvaluator, ToValueBasicSimpleRule) {
|
||||
blink::ServiceWorkerRouterRunningStatusCondition::
|
||||
RunningStatusEnum::kRunning;
|
||||
}
|
||||
rule.condition = {url_pattern, request, running_status, std::nullopt};
|
||||
rule.condition = {url_pattern, request, running_status, std::nullopt,
|
||||
std::nullopt};
|
||||
}
|
||||
{
|
||||
blink::ServiceWorkerRouterSource source;
|
||||
|
@ -18,6 +18,32 @@ bool ServiceWorkerRouterOrCondition::operator==(
|
||||
return conditions == other.conditions;
|
||||
}
|
||||
|
||||
ServiceWorkerRouterNotCondition::ServiceWorkerRouterNotCondition() = default;
|
||||
ServiceWorkerRouterNotCondition::~ServiceWorkerRouterNotCondition() = default;
|
||||
ServiceWorkerRouterNotCondition::ServiceWorkerRouterNotCondition(
|
||||
const ServiceWorkerRouterNotCondition& other) {
|
||||
*this = other;
|
||||
}
|
||||
ServiceWorkerRouterNotCondition::ServiceWorkerRouterNotCondition(
|
||||
ServiceWorkerRouterNotCondition&&) = default;
|
||||
|
||||
ServiceWorkerRouterNotCondition& ServiceWorkerRouterNotCondition::operator=(
|
||||
const ServiceWorkerRouterNotCondition& other) {
|
||||
if (other.condition) {
|
||||
condition =
|
||||
std::make_unique<ServiceWorkerRouterCondition>(*other.condition);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
ServiceWorkerRouterNotCondition& ServiceWorkerRouterNotCondition::operator=(
|
||||
ServiceWorkerRouterNotCondition&&) = default;
|
||||
|
||||
bool ServiceWorkerRouterNotCondition::operator==(
|
||||
const ServiceWorkerRouterNotCondition& other) const {
|
||||
// Returns false unless both have their value.
|
||||
return condition && other.condition && *condition == *other.condition;
|
||||
}
|
||||
|
||||
bool ServiceWorkerRouterCondition::operator==(
|
||||
const ServiceWorkerRouterCondition& other) const {
|
||||
return get() == other.get();
|
||||
|
@ -30,6 +30,19 @@ bool StructTraits<blink::mojom::ServiceWorkerRouterOrConditionDataView,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool StructTraits<blink::mojom::ServiceWorkerRouterNotConditionDataView,
|
||||
blink::ServiceWorkerRouterNotCondition>::
|
||||
Read(blink::mojom::ServiceWorkerRouterNotConditionDataView data,
|
||||
blink::ServiceWorkerRouterNotCondition* out) {
|
||||
blink::ServiceWorkerRouterCondition condition;
|
||||
if (!data.ReadCondition(&condition)) {
|
||||
return false;
|
||||
}
|
||||
out->condition = std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||
std::move(condition));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool StructTraits<blink::mojom::ServiceWorkerRouterRequestConditionDataView,
|
||||
blink::ServiceWorkerRouterRequestCondition>::
|
||||
Read(blink::mojom::ServiceWorkerRouterRequestConditionDataView data,
|
||||
@ -50,7 +63,8 @@ bool StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
||||
blink::ServiceWorkerRouterCondition>::
|
||||
Read(blink::mojom::ServiceWorkerRouterConditionDataView data,
|
||||
blink::ServiceWorkerRouterCondition* out) {
|
||||
auto&& [url_pattern, request, running_status, or_condition] = out->get();
|
||||
auto&& [url_pattern, request, running_status, or_condition, not_condition] =
|
||||
out->get();
|
||||
if (!data.ReadUrlPattern(&url_pattern)) {
|
||||
return false;
|
||||
}
|
||||
@ -63,6 +77,9 @@ bool StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
||||
if (!data.ReadOrCondition(&or_condition)) {
|
||||
return false;
|
||||
}
|
||||
if (!data.ReadNotCondition(¬_condition)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
9
third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
vendored
9
third_party/blink/common/service_worker/service_worker_router_rule_mojom_traits_unittest.cc
vendored
@ -59,7 +59,14 @@ TEST(ServiceWorkerRouterRulesTest, SimpleRoundTrip) {
|
||||
or_condition.conditions = std::vector(
|
||||
3, blink::ServiceWorkerRouterCondition::WithRequest({}));
|
||||
}
|
||||
rule.condition = {url_pattern, request, running_status, or_condition};
|
||||
blink::ServiceWorkerRouterNotCondition not_condition;
|
||||
{
|
||||
not_condition.condition =
|
||||
std::make_unique<blink::ServiceWorkerRouterCondition>(
|
||||
blink::ServiceWorkerRouterCondition::WithRequest({}));
|
||||
}
|
||||
rule.condition = {url_pattern, request, running_status, or_condition,
|
||||
not_condition};
|
||||
}
|
||||
{
|
||||
blink::ServiceWorkerRouterSource source;
|
||||
|
@ -5,6 +5,7 @@
|
||||
#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_SERVICE_WORKER_SERVICE_WORKER_ROUTER_RULE_H_
|
||||
#define THIRD_PARTY_BLINK_PUBLIC_COMMON_SERVICE_WORKER_SERVICE_WORKER_ROUTER_RULE_H_
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <vector>
|
||||
|
||||
@ -28,7 +29,7 @@ static constexpr int kServiceWorkerRouterConditionMaxRecursionDepth = 10;
|
||||
// TODO(crbug.com/1503017): set this value by discussing in spec proposal.
|
||||
static constexpr size_t kServiceWorkerMaxRouterSize = 256;
|
||||
|
||||
struct ServiceWorkerRouterRequestCondition {
|
||||
struct BLINK_COMMON_EXPORT ServiceWorkerRouterRequestCondition {
|
||||
// https://fetch.spec.whatwg.org/#concept-request-method
|
||||
// Technically, it can be an arbitrary string, but Chromium would set
|
||||
// k*Method in net/http/http_request_headers.h
|
||||
@ -41,7 +42,7 @@ struct ServiceWorkerRouterRequestCondition {
|
||||
bool operator==(const ServiceWorkerRouterRequestCondition& other) const;
|
||||
};
|
||||
|
||||
struct ServiceWorkerRouterRunningStatusCondition {
|
||||
struct BLINK_COMMON_EXPORT ServiceWorkerRouterRunningStatusCondition {
|
||||
enum class RunningStatusEnum {
|
||||
kRunning = 0,
|
||||
// This includes kStarting and kStopping in addition to kStopped.
|
||||
@ -58,12 +59,26 @@ struct ServiceWorkerRouterRunningStatusCondition {
|
||||
}
|
||||
};
|
||||
|
||||
struct ServiceWorkerRouterOrCondition {
|
||||
struct BLINK_COMMON_EXPORT ServiceWorkerRouterOrCondition {
|
||||
std::vector<ServiceWorkerRouterCondition> conditions;
|
||||
|
||||
bool operator==(const ServiceWorkerRouterOrCondition& other) const;
|
||||
};
|
||||
|
||||
struct BLINK_COMMON_EXPORT ServiceWorkerRouterNotCondition {
|
||||
std::unique_ptr<ServiceWorkerRouterCondition> condition;
|
||||
|
||||
ServiceWorkerRouterNotCondition();
|
||||
~ServiceWorkerRouterNotCondition();
|
||||
ServiceWorkerRouterNotCondition(const ServiceWorkerRouterNotCondition&);
|
||||
ServiceWorkerRouterNotCondition& operator=(
|
||||
const ServiceWorkerRouterNotCondition&);
|
||||
ServiceWorkerRouterNotCondition(ServiceWorkerRouterNotCondition&&);
|
||||
ServiceWorkerRouterNotCondition& operator=(ServiceWorkerRouterNotCondition&&);
|
||||
|
||||
bool operator==(const ServiceWorkerRouterNotCondition& other) const;
|
||||
};
|
||||
|
||||
// TODO(crbug.com/1371756): implement other conditions in the proposal.
|
||||
class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
||||
// We use aggregated getter/setter in this class in order to emit errors on
|
||||
@ -73,12 +88,14 @@ class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
||||
std::tuple<std::optional<SafeUrlPattern>&,
|
||||
std::optional<ServiceWorkerRouterRequestCondition>&,
|
||||
std::optional<ServiceWorkerRouterRunningStatusCondition>&,
|
||||
std::optional<ServiceWorkerRouterOrCondition>&>;
|
||||
std::optional<ServiceWorkerRouterOrCondition>&,
|
||||
std::optional<ServiceWorkerRouterNotCondition>&>;
|
||||
using MemberConstRef = std::tuple<
|
||||
const std::optional<SafeUrlPattern>&,
|
||||
const std::optional<ServiceWorkerRouterRequestCondition>&,
|
||||
const std::optional<ServiceWorkerRouterRunningStatusCondition>&,
|
||||
const std::optional<ServiceWorkerRouterOrCondition>&>;
|
||||
const std::optional<ServiceWorkerRouterOrCondition>&,
|
||||
const std::optional<ServiceWorkerRouterNotCondition>&>;
|
||||
|
||||
ServiceWorkerRouterCondition() = default;
|
||||
ServiceWorkerRouterCondition(const ServiceWorkerRouterCondition&) = default;
|
||||
@ -93,48 +110,67 @@ class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
||||
const std::optional<ServiceWorkerRouterRequestCondition>& request,
|
||||
const std::optional<ServiceWorkerRouterRunningStatusCondition>&
|
||||
running_status,
|
||||
const std::optional<ServiceWorkerRouterOrCondition>& or_condition)
|
||||
const std::optional<ServiceWorkerRouterOrCondition>& or_condition,
|
||||
const std::optional<ServiceWorkerRouterNotCondition>& not_condition)
|
||||
: url_pattern_(url_pattern),
|
||||
request_(request),
|
||||
running_status_(running_status),
|
||||
or_condition_(or_condition) {}
|
||||
or_condition_(or_condition),
|
||||
not_condition_(not_condition) {}
|
||||
|
||||
// Returns tuple: suggest using structured bindings on the caller side.
|
||||
MemberRef get() {
|
||||
return {url_pattern_, request_, running_status_, or_condition_};
|
||||
return {url_pattern_, request_, running_status_, or_condition_,
|
||||
not_condition_};
|
||||
}
|
||||
MemberConstRef get() const {
|
||||
return {url_pattern_, request_, running_status_, or_condition_};
|
||||
return {url_pattern_, request_, running_status_, or_condition_,
|
||||
not_condition_};
|
||||
}
|
||||
|
||||
bool IsEmpty() const {
|
||||
return !(url_pattern_ || request_ || running_status_ || or_condition_);
|
||||
return !(url_pattern_ || request_ || running_status_ || or_condition_ ||
|
||||
not_condition_);
|
||||
}
|
||||
|
||||
bool IsOrConditionExclusive() const {
|
||||
return or_condition_.has_value() !=
|
||||
(url_pattern_ || request_ || running_status_);
|
||||
(url_pattern_ || request_ || running_status_ || not_condition_);
|
||||
}
|
||||
bool IsNotConditionExclusive() const {
|
||||
return not_condition_.has_value() !=
|
||||
(url_pattern_ || request_ || running_status_ || or_condition_);
|
||||
}
|
||||
|
||||
bool IsValid() const { return !IsEmpty() && IsOrConditionExclusive(); }
|
||||
bool IsValid() const {
|
||||
return !IsEmpty() && IsOrConditionExclusive() && IsNotConditionExclusive();
|
||||
}
|
||||
|
||||
bool operator==(const ServiceWorkerRouterCondition& other) const;
|
||||
|
||||
static ServiceWorkerRouterCondition WithUrlPattern(
|
||||
const SafeUrlPattern& url_pattern) {
|
||||
return {url_pattern, std::nullopt, std::nullopt, std::nullopt};
|
||||
return {url_pattern, std::nullopt, std::nullopt, std::nullopt,
|
||||
std::nullopt};
|
||||
}
|
||||
static ServiceWorkerRouterCondition WithRequest(
|
||||
const ServiceWorkerRouterRequestCondition& request) {
|
||||
return {std::nullopt, request, std::nullopt, std::nullopt};
|
||||
return {std::nullopt, request, std::nullopt, std::nullopt, std::nullopt};
|
||||
}
|
||||
static ServiceWorkerRouterCondition WithRunningStatus(
|
||||
const ServiceWorkerRouterRunningStatusCondition& running_status) {
|
||||
return {std::nullopt, std::nullopt, running_status, std::nullopt};
|
||||
return {std::nullopt, std::nullopt, running_status, std::nullopt,
|
||||
std::nullopt};
|
||||
}
|
||||
static ServiceWorkerRouterCondition WithOrCondition(
|
||||
const ServiceWorkerRouterOrCondition& or_condition) {
|
||||
return {std::nullopt, std::nullopt, std::nullopt, or_condition};
|
||||
return {std::nullopt, std::nullopt, std::nullopt, or_condition,
|
||||
std::nullopt};
|
||||
}
|
||||
static ServiceWorkerRouterCondition WithNotCondition(
|
||||
const ServiceWorkerRouterNotCondition& not_condition) {
|
||||
return {std::nullopt, std::nullopt, std::nullopt, std::nullopt,
|
||||
not_condition};
|
||||
}
|
||||
|
||||
private:
|
||||
@ -150,6 +186,10 @@ class BLINK_COMMON_EXPORT ServiceWorkerRouterCondition {
|
||||
// `Or` condition to be used for matching
|
||||
// We need `_condition` suffix to avoid conflict with reserved keywords in C++
|
||||
std::optional<ServiceWorkerRouterOrCondition> or_condition_;
|
||||
|
||||
// `Not` condition to be used for matching
|
||||
// We need `_condition` suffix to avoid conflict with reserved keywords in C++
|
||||
std::optional<ServiceWorkerRouterNotCondition> not_condition_;
|
||||
};
|
||||
|
||||
// Network source structure.
|
||||
|
21
third_party/blink/public/common/service_worker/service_worker_router_rule_mojom_traits.h
vendored
21
third_party/blink/public/common/service_worker/service_worker_router_rule_mojom_traits.h
vendored
@ -117,6 +117,20 @@ struct BLINK_COMMON_EXPORT
|
||||
blink::ServiceWorkerRouterOrCondition* out);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct BLINK_COMMON_EXPORT
|
||||
StructTraits<blink::mojom::ServiceWorkerRouterNotConditionDataView,
|
||||
blink::ServiceWorkerRouterNotCondition> {
|
||||
static const blink::ServiceWorkerRouterCondition& condition(
|
||||
const blink::ServiceWorkerRouterNotCondition& data) {
|
||||
CHECK(data.condition);
|
||||
return *data.condition;
|
||||
}
|
||||
|
||||
static bool Read(blink::mojom::ServiceWorkerRouterNotConditionDataView data,
|
||||
blink::ServiceWorkerRouterNotCondition* out);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct BLINK_COMMON_EXPORT
|
||||
StructTraits<blink::mojom::ServiceWorkerRouterConditionDataView,
|
||||
@ -147,6 +161,13 @@ struct BLINK_COMMON_EXPORT
|
||||
data.get());
|
||||
}
|
||||
|
||||
static const std::optional<blink::ServiceWorkerRouterNotCondition>&
|
||||
not_condition(const blink::ServiceWorkerRouterCondition& data) {
|
||||
return std::get<
|
||||
const std::optional<blink::ServiceWorkerRouterNotCondition>&>(
|
||||
data.get());
|
||||
}
|
||||
|
||||
static bool Read(blink::mojom::ServiceWorkerRouterConditionDataView data,
|
||||
blink::ServiceWorkerRouterCondition* out);
|
||||
};
|
||||
|
@ -58,6 +58,13 @@ struct ServiceWorkerRouterOrCondition {
|
||||
array<ServiceWorkerRouterCondition> conditions;
|
||||
};
|
||||
|
||||
// This represents a not condition to match.
|
||||
// See:
|
||||
// https://github.com/WICG/service-worker-static-routing-api/blob/main/final-form.md
|
||||
struct ServiceWorkerRouterNotCondition {
|
||||
ServiceWorkerRouterCondition condition;
|
||||
};
|
||||
|
||||
// This represents a condition of the router rule.
|
||||
// https://github.com/yoshisatoyanagisawa/service-worker-static-routing-api
|
||||
// TODO(crbug.com/1371756): implement other conditions in the full picture.
|
||||
@ -67,6 +74,7 @@ struct ServiceWorkerRouterCondition {
|
||||
ServiceWorkerRouterRequestCondition? request;
|
||||
ServiceWorkerRouterRunningStatusCondition? running_status;
|
||||
ServiceWorkerRouterOrCondition? or_condition;
|
||||
ServiceWorkerRouterNotCondition? not_condition;
|
||||
};
|
||||
|
||||
// This is used for specifying the source is network.
|
||||
|
2
third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
vendored
2
third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
vendored
@ -200,7 +200,7 @@ std::optional<ServiceWorkerRouterCondition> RouterConditionToBlink(
|
||||
}
|
||||
}
|
||||
blink::ServiceWorkerRouterCondition ret(url_pattern, request, running_status,
|
||||
or_condition);
|
||||
or_condition, std::nullopt);
|
||||
if (ret.IsEmpty()) {
|
||||
// At least one condition should exist per rule.
|
||||
exception_state.ThrowTypeError(
|
||||
|
Reference in New Issue
Block a user