mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-18 08:20:44 +00:00
LibWeb/CSS: Parse and use CSS URL request modifiers
This commit is contained in:
parent
09b508d8e8
commit
de6df6f403
Notes:
github-actions[bot]
2025-05-03 22:23:41 +00:00
Author: https://github.com/AtkinsSJ
Commit: de6df6f403
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4569
Reviewed-by: https://github.com/tcl3 ✅
10 changed files with 337 additions and 89 deletions
|
@ -138,6 +138,10 @@
|
||||||
"upper-latin",
|
"upper-latin",
|
||||||
"upper-roman"
|
"upper-roman"
|
||||||
],
|
],
|
||||||
|
"cross-origin-modifier-value": [
|
||||||
|
"anonymous",
|
||||||
|
"use-credentials"
|
||||||
|
],
|
||||||
"cursor": [
|
"cursor": [
|
||||||
"auto",
|
"auto",
|
||||||
"default",
|
"default",
|
||||||
|
@ -502,6 +506,16 @@
|
||||||
"top",
|
"top",
|
||||||
"bottom"
|
"bottom"
|
||||||
],
|
],
|
||||||
|
"referrer-policy-modifier-value": [
|
||||||
|
"no-referrer",
|
||||||
|
"no-referrer-when-downgrade",
|
||||||
|
"same-origin",
|
||||||
|
"origin",
|
||||||
|
"strict-origin",
|
||||||
|
"origin-when-cross-origin",
|
||||||
|
"strict-origin-when-cross-origin",
|
||||||
|
"unsafe-url"
|
||||||
|
],
|
||||||
"repeat": [
|
"repeat": [
|
||||||
"no-repeat",
|
"no-repeat",
|
||||||
"repeat",
|
"repeat",
|
||||||
|
|
|
@ -55,10 +55,15 @@ static WebIDL::ExceptionOr<GC::Ref<Fetch::Infrastructure::Request>> fetch_a_styl
|
||||||
request->set_client(&environment_settings);
|
request->set_client(&environment_settings);
|
||||||
request->set_referrer(environment_settings.api_base_url());
|
request->set_referrer(environment_settings.api_base_url());
|
||||||
|
|
||||||
// 5. Apply any URL request modifier steps that apply to this request.
|
// 5. If corsMode is "no-cors", set req’s credentials mode to "include".
|
||||||
// FIXME: No specs seem to define these yet. When they do, implement them.
|
if (cors_mode == CorsMode::NoCors)
|
||||||
|
request->set_credentials_mode(Fetch::Infrastructure::Request::CredentialsMode::Include);
|
||||||
|
|
||||||
// 6. If req’s mode is "cors", set req’s referrer to sheet’s location. [CSSOM]
|
// 6. Apply any URL request modifier steps that apply to this request.
|
||||||
|
if (auto const* css_url = url_value.get_pointer<CSS::URL>())
|
||||||
|
apply_request_modifiers_from_url_value(*css_url, request);
|
||||||
|
|
||||||
|
// 7. If req’s mode is "cors", set req’s referrer to sheet’s location. [CSSOM]
|
||||||
if (request->mode() == Fetch::Infrastructure::Request::Mode::CORS) {
|
if (request->mode() == Fetch::Infrastructure::Request::Mode::CORS) {
|
||||||
auto location = sheet_or_document.visit(
|
auto location = sheet_or_document.visit(
|
||||||
[](GC::Ref<CSSStyleSheet> const& sheet) { return sheet->location().value(); },
|
[](GC::Ref<CSSStyleSheet> const& sheet) { return sheet->location().value(); },
|
||||||
|
@ -66,11 +71,11 @@ static WebIDL::ExceptionOr<GC::Ref<Fetch::Infrastructure::Request>> fetch_a_styl
|
||||||
request->set_referrer(move(location));
|
request->set_referrer(move(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7. If sheet’s origin-clean flag is set, set req’s initiator type to "css". [CSSOM]
|
// 8. If sheet’s origin-clean flag is set, set req’s initiator type to "css". [CSSOM]
|
||||||
if (auto* sheet = sheet_or_document.get_pointer<GC::Ref<CSSStyleSheet>>(); sheet && (*sheet)->is_origin_clean())
|
if (auto* sheet = sheet_or_document.get_pointer<GC::Ref<CSSStyleSheet>>(); sheet && (*sheet)->is_origin_clean())
|
||||||
request->set_initiator_type(Fetch::Infrastructure::Request::InitiatorType::CSS);
|
request->set_initiator_type(Fetch::Infrastructure::Request::InitiatorType::CSS);
|
||||||
|
|
||||||
// 8. Fetch req, with processresponseconsumebody set to processResponse.
|
// 9. Fetch req, with processresponseconsumebody set to processResponse.
|
||||||
// NB: Implemented by caller.
|
// NB: Implemented by caller.
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
@ -131,4 +136,13 @@ GC::Ptr<HTML::SharedResourceRequest> fetch_an_external_image_for_a_stylesheet(St
|
||||||
return shared_resource_request;
|
return shared_resource_request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://drafts.csswg.org/css-values-5/#apply-request-modifiers-from-url-value
|
||||||
|
void apply_request_modifiers_from_url_value(URL const& url, GC::Ref<Fetch::Infrastructure::Request> request)
|
||||||
|
{
|
||||||
|
// To apply request modifiers from URL value given a request req and a <url> url, call the URL request modifier
|
||||||
|
// steps for url’s <request-url-modifier>s in sequence given req.
|
||||||
|
for (auto const& request_url_modifier : url.request_url_modifiers())
|
||||||
|
request_url_modifier.modify_request(request);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,4 +30,7 @@ WebIDL::ExceptionOr<GC::Ref<Fetch::Infrastructure::FetchController>> fetch_a_sty
|
||||||
// https://drafts.csswg.org/css-images-4/#fetch-an-external-image-for-a-stylesheet
|
// https://drafts.csswg.org/css-images-4/#fetch-an-external-image-for-a-stylesheet
|
||||||
GC::Ptr<HTML::SharedResourceRequest> fetch_an_external_image_for_a_stylesheet(StyleResourceURL const&, StyleSheetOrDocument);
|
GC::Ptr<HTML::SharedResourceRequest> fetch_an_external_image_for_a_stylesheet(StyleResourceURL const&, StyleSheetOrDocument);
|
||||||
|
|
||||||
|
// https://drafts.csswg.org/css-values-5/#apply-request-modifiers-from-url-value
|
||||||
|
void apply_request_modifiers_from_url_value(URL const&, GC::Ref<Fetch::Infrastructure::Request>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,6 +77,7 @@
|
||||||
"alpha",
|
"alpha",
|
||||||
"alternate",
|
"alternate",
|
||||||
"alternate-reverse",
|
"alternate-reverse",
|
||||||
|
"anonymous",
|
||||||
"anywhere",
|
"anywhere",
|
||||||
"appworkspace",
|
"appworkspace",
|
||||||
"auto",
|
"auto",
|
||||||
|
@ -311,6 +312,8 @@
|
||||||
"no-historical-ligatures",
|
"no-historical-ligatures",
|
||||||
"no-open-quote",
|
"no-open-quote",
|
||||||
"no-preference",
|
"no-preference",
|
||||||
|
"no-referrer",
|
||||||
|
"no-referrer-when-downgrade",
|
||||||
"no-repeat",
|
"no-repeat",
|
||||||
"none",
|
"none",
|
||||||
"nonzero",
|
"nonzero",
|
||||||
|
@ -331,6 +334,8 @@
|
||||||
"optimizespeed",
|
"optimizespeed",
|
||||||
"optional",
|
"optional",
|
||||||
"ordinal",
|
"ordinal",
|
||||||
|
"origin",
|
||||||
|
"origin-when-cross-origin",
|
||||||
"outset",
|
"outset",
|
||||||
"outside",
|
"outside",
|
||||||
"overlay",
|
"overlay",
|
||||||
|
@ -383,6 +388,7 @@
|
||||||
"running",
|
"running",
|
||||||
"s-resize",
|
"s-resize",
|
||||||
"safe",
|
"safe",
|
||||||
|
"same-origin",
|
||||||
"sans-serif",
|
"sans-serif",
|
||||||
"saturation",
|
"saturation",
|
||||||
"scale-down",
|
"scale-down",
|
||||||
|
@ -430,6 +436,8 @@
|
||||||
"sticky",
|
"sticky",
|
||||||
"stretch",
|
"stretch",
|
||||||
"strict",
|
"strict",
|
||||||
|
"strict-origin",
|
||||||
|
"strict-origin-when-cross-origin",
|
||||||
"stroke-box",
|
"stroke-box",
|
||||||
"style",
|
"style",
|
||||||
"sub",
|
"sub",
|
||||||
|
@ -474,12 +482,14 @@
|
||||||
"unicase",
|
"unicase",
|
||||||
"unicode",
|
"unicode",
|
||||||
"unsafe",
|
"unsafe",
|
||||||
|
"unsafe-url",
|
||||||
"unset",
|
"unset",
|
||||||
"up",
|
"up",
|
||||||
"upper-alpha",
|
"upper-alpha",
|
||||||
"upper-latin",
|
"upper-latin",
|
||||||
"upper-roman",
|
"upper-roman",
|
||||||
"uppercase",
|
"uppercase",
|
||||||
|
"use-credentials",
|
||||||
"vertical-lr",
|
"vertical-lr",
|
||||||
"vertical-rl",
|
"vertical-rl",
|
||||||
"vertical-text",
|
"vertical-text",
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include <AK/Debug.h>
|
#include <AK/Debug.h>
|
||||||
#include <AK/GenericLexer.h>
|
#include <AK/GenericLexer.h>
|
||||||
|
#include <AK/QuickSort.h>
|
||||||
#include <AK/TemporaryChange.h>
|
#include <AK/TemporaryChange.h>
|
||||||
#include <LibWeb/CSS/FontFace.h>
|
#include <LibWeb/CSS/FontFace.h>
|
||||||
#include <LibWeb/CSS/Parser/Parser.h>
|
#include <LibWeb/CSS/Parser/Parser.h>
|
||||||
|
@ -2697,29 +2698,105 @@ RefPtr<CSSStyleValue const> Parser::parse_easing_value(TokenStream<ComponentValu
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://drafts.csswg.org/css-values-4/#url-value
|
||||||
Optional<URL> Parser::parse_url_function(TokenStream<ComponentValue>& tokens)
|
Optional<URL> Parser::parse_url_function(TokenStream<ComponentValue>& tokens)
|
||||||
{
|
{
|
||||||
|
// <url> = <url()> | <src()>
|
||||||
|
// <url()> = url( <string> <url-modifier>* ) | <url-token>
|
||||||
|
// <src()> = src( <string> <url-modifier>* )
|
||||||
|
// FIXME: Also parse src() function
|
||||||
auto transaction = tokens.begin_transaction();
|
auto transaction = tokens.begin_transaction();
|
||||||
auto const& component_value = tokens.consume_a_token();
|
auto const& component_value = tokens.consume_a_token();
|
||||||
|
|
||||||
|
// <url-token>
|
||||||
if (component_value.is(Token::Type::Url)) {
|
if (component_value.is(Token::Type::Url)) {
|
||||||
transaction.commit();
|
transaction.commit();
|
||||||
return URL { component_value.token().url().to_string() };
|
return URL { component_value.token().url().to_string() };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <url()> = url( <string> <url-modifier>* )
|
||||||
if (component_value.is_function("url"sv)) {
|
if (component_value.is_function("url"sv)) {
|
||||||
auto const& function_values = component_value.function().value;
|
auto const& function_values = component_value.function().value;
|
||||||
// FIXME: Handle url-modifiers. https://www.w3.org/TR/css-values-4/#url-modifiers
|
TokenStream url_tokens { function_values };
|
||||||
for (size_t i = 0; i < function_values.size(); ++i) {
|
|
||||||
auto const& value = function_values[i];
|
url_tokens.discard_whitespace();
|
||||||
if (value.is(Token::Type::Whitespace))
|
auto url_string = url_tokens.consume_a_token();
|
||||||
continue;
|
if (!url_string.is(Token::Type::String))
|
||||||
if (value.is(Token::Type::String)) {
|
return {};
|
||||||
transaction.commit();
|
url_tokens.discard_whitespace();
|
||||||
return URL { value.token().string().to_string() };
|
|
||||||
|
// NB: Currently <request-url-modifier> is the only kind of <url-modifier>
|
||||||
|
// https://drafts.csswg.org/css-values-5/#request-url-modifiers
|
||||||
|
// <request-url-modifier> = <crossorigin-modifier> | <integrity-modifier> | <referrerpolicy-modifier>
|
||||||
|
Vector<RequestURLModifier> request_url_modifiers;
|
||||||
|
// AD-HOC: This isn't mentioned in the spec, but WPT expects modifiers to be unique (one per type).
|
||||||
|
// Spec issue: https://github.com/w3c/csswg-drafts/issues/12151
|
||||||
|
while (url_tokens.has_next_token()) {
|
||||||
|
auto& modifier_token = url_tokens.consume_a_token();
|
||||||
|
if (modifier_token.is_function("crossorigin"sv)) {
|
||||||
|
// Reject duplicates
|
||||||
|
if (request_url_modifiers.first_matching([](auto& modifier) { return modifier.type() == RequestURLModifier::Type::CrossOrigin; }).has_value())
|
||||||
|
return {};
|
||||||
|
// <crossorigin-modifier> = crossorigin(anonymous | use-credentials)
|
||||||
|
TokenStream modifier_tokens { modifier_token.function().value };
|
||||||
|
modifier_tokens.discard_whitespace();
|
||||||
|
if (!modifier_tokens.next_token().is(Token::Type::Ident))
|
||||||
|
return {};
|
||||||
|
auto maybe_keyword = keyword_from_string(modifier_tokens.consume_a_token().token().ident());
|
||||||
|
modifier_tokens.discard_whitespace();
|
||||||
|
if (!maybe_keyword.has_value() || modifier_tokens.has_next_token())
|
||||||
|
return {};
|
||||||
|
if (auto value = keyword_to_cross_origin_modifier_value(*maybe_keyword); value.has_value()) {
|
||||||
|
request_url_modifiers.append(RequestURLModifier::create_cross_origin(value.release_value()));
|
||||||
|
} else {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
} else if (modifier_token.is_function("integrity"sv)) {
|
||||||
|
// Reject duplicates
|
||||||
|
if (request_url_modifiers.first_matching([](auto& modifier) { return modifier.type() == RequestURLModifier::Type::Integrity; }).has_value())
|
||||||
|
return {};
|
||||||
|
// <integrity-modifier> = integrity(<string>)
|
||||||
|
TokenStream modifier_tokens { modifier_token.function().value };
|
||||||
|
modifier_tokens.discard_whitespace();
|
||||||
|
auto& maybe_string = modifier_tokens.consume_a_token();
|
||||||
|
modifier_tokens.discard_whitespace();
|
||||||
|
if (!maybe_string.is(Token::Type::String) || modifier_tokens.has_next_token())
|
||||||
|
return {};
|
||||||
|
request_url_modifiers.append(RequestURLModifier::create_integrity(maybe_string.token().string()));
|
||||||
|
} else if (modifier_token.is_function("referrerpolicy"sv)) {
|
||||||
|
// Reject duplicates
|
||||||
|
if (request_url_modifiers.first_matching([](auto& modifier) { return modifier.type() == RequestURLModifier::Type::ReferrerPolicy; }).has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// <referrerpolicy-modifier> = (no-referrer | no-referrer-when-downgrade | same-origin | origin | strict-origin | origin-when-cross-origin | strict-origin-when-cross-origin | unsafe-url)
|
||||||
|
TokenStream modifier_tokens { modifier_token.function().value };
|
||||||
|
modifier_tokens.discard_whitespace();
|
||||||
|
if (!modifier_tokens.next_token().is(Token::Type::Ident))
|
||||||
|
return {};
|
||||||
|
auto maybe_keyword = keyword_from_string(modifier_tokens.consume_a_token().token().ident());
|
||||||
|
modifier_tokens.discard_whitespace();
|
||||||
|
if (!maybe_keyword.has_value() || modifier_tokens.has_next_token())
|
||||||
|
return {};
|
||||||
|
if (auto value = keyword_to_referrer_policy_modifier_value(*maybe_keyword); value.has_value()) {
|
||||||
|
request_url_modifiers.append(RequestURLModifier::create_referrer_policy(value.release_value()));
|
||||||
|
} else {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dbgln_if(CSS_PARSER_DEBUG, "Unrecognized URL modifier: {}", modifier_token.to_debug_string());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
break;
|
url_tokens.discard_whitespace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AD-HOC: This isn't mentioned in the spec, but WPT expects modifiers to be sorted alphabetically.
|
||||||
|
// Spec issue: https://github.com/w3c/csswg-drafts/issues/12151
|
||||||
|
quick_sort(request_url_modifiers, [](RequestURLModifier const& a, RequestURLModifier const& b) {
|
||||||
|
return to_underlying(a.type()) < to_underlying(b.type());
|
||||||
|
});
|
||||||
|
|
||||||
|
transaction.commit();
|
||||||
|
return URL { url_string.token().string().to_string(), move(request_url_modifiers) };
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -6,11 +6,13 @@
|
||||||
|
|
||||||
#include <LibWeb/CSS/Serialize.h>
|
#include <LibWeb/CSS/Serialize.h>
|
||||||
#include <LibWeb/CSS/URL.h>
|
#include <LibWeb/CSS/URL.h>
|
||||||
|
#include <LibWeb/Fetch/Infrastructure/HTTP/Requests.h>
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
|
||||||
URL::URL(String url)
|
URL::URL(String url, Vector<RequestURLModifier> request_url_modifiers)
|
||||||
: m_url(move(url))
|
: m_url(move(url))
|
||||||
|
, m_request_url_modifiers(move(request_url_modifiers))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +23,12 @@ String URL::to_string() const
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.append("url("sv);
|
builder.append("url("sv);
|
||||||
serialize_a_string(builder, m_url);
|
serialize_a_string(builder, m_url);
|
||||||
|
|
||||||
|
// AD-HOC: Serialize the RequestURLModifiers
|
||||||
|
// Spec issue: https://github.com/w3c/csswg-drafts/issues/12057
|
||||||
|
for (auto const& modifier : m_request_url_modifiers)
|
||||||
|
builder.appendff(" {}", modifier.to_string());
|
||||||
|
|
||||||
builder.append(')');
|
builder.append(')');
|
||||||
|
|
||||||
return builder.to_string_without_validation();
|
return builder.to_string_without_validation();
|
||||||
|
@ -28,4 +36,99 @@ String URL::to_string() const
|
||||||
|
|
||||||
bool URL::operator==(URL const&) const = default;
|
bool URL::operator==(URL const&) const = default;
|
||||||
|
|
||||||
|
RequestURLModifier RequestURLModifier::create_cross_origin(CrossOriginModifierValue value)
|
||||||
|
{
|
||||||
|
return RequestURLModifier { Type::CrossOrigin, value };
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestURLModifier RequestURLModifier::create_integrity(FlyString value)
|
||||||
|
{
|
||||||
|
return RequestURLModifier { Type::Integrity, move(value) };
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestURLModifier RequestURLModifier::create_referrer_policy(ReferrerPolicyModifierValue value)
|
||||||
|
{
|
||||||
|
return RequestURLModifier { Type::ReferrerPolicy, value };
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestURLModifier::RequestURLModifier(Type type, Value value)
|
||||||
|
: m_type(type)
|
||||||
|
, m_value(move(value))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void RequestURLModifier::modify_request(GC::Ref<Fetch::Infrastructure::Request> request) const
|
||||||
|
{
|
||||||
|
switch (m_type) {
|
||||||
|
case Type::CrossOrigin: {
|
||||||
|
// https://drafts.csswg.org/css-values-5/#typedef-request-url-modifier-crossorigin-modifier
|
||||||
|
// The URL request modifier steps for this modifier given request req are:
|
||||||
|
|
||||||
|
// 1. Set req’s mode to "cors".
|
||||||
|
request->set_mode(Fetch::Infrastructure::Request::Mode::CORS);
|
||||||
|
|
||||||
|
// 2. If the given value is use-credentials, set req’s credentials mode to "include".
|
||||||
|
if (m_value == CrossOriginModifierValue::UseCredentials) {
|
||||||
|
request->set_credentials_mode(Fetch::Infrastructure::Request::CredentialsMode::Include);
|
||||||
|
}
|
||||||
|
// 3. Otherwise, set req’s credentials mode to "same-origin".
|
||||||
|
else {
|
||||||
|
request->set_credentials_mode(Fetch::Infrastructure::Request::CredentialsMode::SameOrigin);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Type::Integrity: {
|
||||||
|
// https://drafts.csswg.org/css-values-5/#typedef-request-url-modifier-integrity-modifier
|
||||||
|
|
||||||
|
// The URL request modifier steps for this modifier given request req are to set request’s integrity metadata to
|
||||||
|
// the given <string>.
|
||||||
|
request->set_integrity_metadata(m_value.get<FlyString>().to_string());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Type::ReferrerPolicy: {
|
||||||
|
// https://drafts.csswg.org/css-values-5/#typedef-request-url-modifier-referrerpolicy-modifier
|
||||||
|
// The URL request modifier steps for this modifier given request req are to set request’s referrer policy to the
|
||||||
|
// ReferrerPolicy that matches the given value.
|
||||||
|
auto referrer_policy = [](ReferrerPolicyModifierValue value) {
|
||||||
|
switch (value) {
|
||||||
|
case ReferrerPolicyModifierValue::NoReferrer:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::NoReferrer;
|
||||||
|
case ReferrerPolicyModifierValue::NoReferrerWhenDowngrade:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::NoReferrerWhenDowngrade;
|
||||||
|
case ReferrerPolicyModifierValue::SameOrigin:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::SameOrigin;
|
||||||
|
case ReferrerPolicyModifierValue::Origin:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::Origin;
|
||||||
|
case ReferrerPolicyModifierValue::StrictOrigin:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::StrictOrigin;
|
||||||
|
case ReferrerPolicyModifierValue::OriginWhenCrossOrigin:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::OriginWhenCrossOrigin;
|
||||||
|
case ReferrerPolicyModifierValue::StrictOriginWhenCrossOrigin:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::StrictOriginWhenCrossOrigin;
|
||||||
|
case ReferrerPolicyModifierValue::UnsafeUrl:
|
||||||
|
return ReferrerPolicy::ReferrerPolicy::UnsafeURL;
|
||||||
|
}
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}(m_value.get<ReferrerPolicyModifierValue>());
|
||||||
|
request->set_referrer_policy(referrer_policy);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String RequestURLModifier::to_string() const
|
||||||
|
{
|
||||||
|
switch (m_type) {
|
||||||
|
case Type::CrossOrigin:
|
||||||
|
return MUST(String::formatted("crossorigin({})", CSS::to_string(m_value.get<CrossOriginModifierValue>())));
|
||||||
|
case Type::Integrity:
|
||||||
|
return MUST(String::formatted("integrity({})", serialize_a_string(m_value.get<FlyString>())));
|
||||||
|
case Type::ReferrerPolicy:
|
||||||
|
return MUST(String::formatted("referrerpolicy({})", CSS::to_string(m_value.get<ReferrerPolicyModifierValue>())));
|
||||||
|
}
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RequestURLModifier::operator==(RequestURLModifier const&) const = default;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,21 +7,51 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <AK/String.h>
|
#include <AK/String.h>
|
||||||
|
#include <AK/Vector.h>
|
||||||
|
#include <LibGC/Ptr.h>
|
||||||
|
#include <LibWeb/CSS/Enums.h>
|
||||||
|
|
||||||
namespace Web::CSS {
|
namespace Web::CSS {
|
||||||
|
// https://drafts.csswg.org/css-values-5/#request-url-modifiers
|
||||||
|
class RequestURLModifier {
|
||||||
|
public:
|
||||||
|
enum class Type : u8 {
|
||||||
|
CrossOrigin,
|
||||||
|
Integrity,
|
||||||
|
ReferrerPolicy,
|
||||||
|
};
|
||||||
|
|
||||||
|
static RequestURLModifier create_cross_origin(CrossOriginModifierValue);
|
||||||
|
static RequestURLModifier create_integrity(FlyString);
|
||||||
|
static RequestURLModifier create_referrer_policy(ReferrerPolicyModifierValue);
|
||||||
|
|
||||||
|
~RequestURLModifier() = default;
|
||||||
|
void modify_request(GC::Ref<Fetch::Infrastructure::Request>) const;
|
||||||
|
Type type() const { return m_type; }
|
||||||
|
String to_string() const;
|
||||||
|
bool operator==(RequestURLModifier const&) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
using Value = Variant<CrossOriginModifierValue, ReferrerPolicyModifierValue, FlyString>;
|
||||||
|
RequestURLModifier(Type, Value);
|
||||||
|
Type m_type;
|
||||||
|
Value m_value;
|
||||||
|
};
|
||||||
|
|
||||||
// https://drafts.csswg.org/css-values-4/#urls
|
// https://drafts.csswg.org/css-values-4/#urls
|
||||||
class URL {
|
class URL {
|
||||||
public:
|
public:
|
||||||
URL(String url);
|
URL(String url, Vector<RequestURLModifier> = {});
|
||||||
|
|
||||||
String const& url() const { return m_url; }
|
String const& url() const { return m_url; }
|
||||||
|
Vector<RequestURLModifier> const& request_url_modifiers() const { return m_request_url_modifiers; }
|
||||||
|
|
||||||
String to_string() const;
|
String to_string() const;
|
||||||
bool operator==(URL const&) const;
|
bool operator==(URL const&) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
String m_url;
|
String m_url;
|
||||||
|
Vector<RequestURLModifier> m_request_url_modifiers;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,28 +2,27 @@ Harness status: OK
|
||||||
|
|
||||||
Found 23 tests
|
Found 23 tests
|
||||||
|
|
||||||
1 Pass
|
23 Pass
|
||||||
22 Fail
|
|
||||||
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png")'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png")'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(use-credentials))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(use-credentials))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar"))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar"))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity(""))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity(""))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer-when-downgrade))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer-when-downgrade))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(same-origin))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(same-origin))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(origin))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(origin))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(strict-origin))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(strict-origin))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(origin-when-cross-origin))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(origin-when-cross-origin))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(strict-origin-when-cross-origin))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(strict-origin-when-cross-origin))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(unsafe-url))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(unsafe-url))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous) integrity("sha384-foobar"))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous) integrity("sha384-foobar"))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar") crossorigin(anonymous))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar") crossorigin(anonymous))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar") referrerpolicy(no-referrer))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar") referrerpolicy(no-referrer))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) integrity("sha384-foobar"))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) integrity("sha384-foobar"))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous) referrerpolicy(no-referrer))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous) referrerpolicy(no-referrer))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) crossorigin(anonymous))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) crossorigin(anonymous))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous) integrity("sha384-foobar") referrerpolicy(no-referrer))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" crossorigin(anonymous) integrity("sha384-foobar") referrerpolicy(no-referrer))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar") referrerpolicy(no-referrer) crossorigin(anonymous))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" integrity("sha384-foobar") referrerpolicy(no-referrer) crossorigin(anonymous))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) crossorigin(anonymous) integrity("sha384-foobar"))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) crossorigin(anonymous) integrity("sha384-foobar"))'
|
||||||
Fail Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) integrity("sha384-foobar") crossorigin(anonymous))'
|
Pass Property background-image value 'url("http://wpt.live:80/css/support/1x1-green.png" referrerpolicy(no-referrer) integrity("sha384-foobar") crossorigin(anonymous))'
|
|
@ -2,34 +2,33 @@ Harness status: OK
|
||||||
|
|
||||||
Found 29 tests
|
Found 29 tests
|
||||||
|
|
||||||
6 Pass
|
29 Pass
|
||||||
23 Fail
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin())" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin())" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(,))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(,))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous,))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous,))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(,anonymous))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(,anonymous))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous foobar))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous foobar))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) cross-origin(anonymous))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) cross-origin(anonymous))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) cross-origin(use-credentials))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) cross-origin(use-credentials))" should not set the property value
|
|
||||||
Pass e.style['background-image'] = "url(crossorigin(anonymous) \"http://wpt.live:80/css/support/1x1-green.png\")" should not set the property value
|
Pass e.style['background-image'] = "url(crossorigin(anonymous) \"http://wpt.live:80/css/support/1x1-green.png\")" should not set the property value
|
||||||
Pass e.style['background-image'] = "\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous)" should not set the property value
|
Pass e.style['background-image'] = "\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous)" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity())" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity())" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(,))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(,))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\",))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\",))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(,\"sha384-foobar\"))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(,\"sha384-foobar\"))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\" foobar))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\" foobar))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(sha384-foobar))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(sha384-foobar))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") integrity(\"sha384-foobar\"))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") integrity(\"sha384-foobar\"))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") integrity(\"sha384-barbaz\"))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") integrity(\"sha384-barbaz\"))" should not set the property value
|
||||||
Pass e.style['background-image'] = "url(integrity(\"sha384-foobar\") \"http://wpt.live:80/css/support/1x1-green.png\")" should not set the property value
|
Pass e.style['background-image'] = "url(integrity(\"sha384-foobar\") \"http://wpt.live:80/css/support/1x1-green.png\")" should not set the property value
|
||||||
Pass e.style['background-image'] = "\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\")" should not set the property value
|
Pass e.style['background-image'] = "\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\")" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy())" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy())" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(,))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(,))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer,))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer,))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(,no-referrer))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(,no-referrer))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer foobar))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer foobar))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer same-origin))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer same-origin))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) referrerpolicy(no-referrer))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) referrerpolicy(no-referrer))" should not set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) referrerpolicy(same-origin))" should not set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) referrerpolicy(same-origin))" should not set the property value
|
||||||
Pass e.style['background-image'] = "url(referrerpolicy(no-referrer) \"http://wpt.live:80/css/support/1x1-green.png\")" should not set the property value
|
Pass e.style['background-image'] = "url(referrerpolicy(no-referrer) \"http://wpt.live:80/css/support/1x1-green.png\")" should not set the property value
|
||||||
Pass e.style['background-image'] = "\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer)" should not set the property value
|
Pass e.style['background-image'] = "\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer)" should not set the property value
|
|
@ -2,28 +2,27 @@ Harness status: OK
|
||||||
|
|
||||||
Found 23 tests
|
Found 23 tests
|
||||||
|
|
||||||
1 Pass
|
23 Pass
|
||||||
22 Fail
|
|
||||||
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\")" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\")" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(use-credentials))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(use-credentials))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\"))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\"))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"\"))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"\"))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer-when-downgrade))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer-when-downgrade))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(same-origin))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(same-origin))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(origin))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(origin))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(strict-origin))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(strict-origin))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(origin-when-cross-origin))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(origin-when-cross-origin))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(strict-origin-when-cross-origin))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(strict-origin-when-cross-origin))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(unsafe-url))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(unsafe-url))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) integrity(\"sha384-foobar\"))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) integrity(\"sha384-foobar\"))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") crossorigin(anonymous))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") crossorigin(anonymous))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") referrerpolicy(no-referrer))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") referrerpolicy(no-referrer))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) integrity(\"sha384-foobar\"))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) integrity(\"sha384-foobar\"))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) referrerpolicy(no-referrer))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) referrerpolicy(no-referrer))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) crossorigin(anonymous))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) crossorigin(anonymous))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) integrity(\"sha384-foobar\") referrerpolicy(no-referrer))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" crossorigin(anonymous) integrity(\"sha384-foobar\") referrerpolicy(no-referrer))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") referrerpolicy(no-referrer) crossorigin(anonymous))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" integrity(\"sha384-foobar\") referrerpolicy(no-referrer) crossorigin(anonymous))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) crossorigin(anonymous) integrity(\"sha384-foobar\"))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) crossorigin(anonymous) integrity(\"sha384-foobar\"))" should set the property value
|
||||||
Fail e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) integrity(\"sha384-foobar\") crossorigin(anonymous))" should set the property value
|
Pass e.style['background-image'] = "url(\"http://wpt.live:80/css/support/1x1-green.png\" referrerpolicy(no-referrer) integrity(\"sha384-foobar\") crossorigin(anonymous))" should set the property value
|
Loading…
Add table
Add a link
Reference in a new issue