LibWeb: Convert SandboxingFlagSet into a enum class
Instead of having a nested enum within a struct, use the macro AK_ENUM_BITWISE_OPERATORS to add all the convienent has_flag free functions and such for ease of use.
This commit is contained in:
parent
967cb86c5b
commit
d97b09693e
Notes:
sideshowbarker
2024-07-18 03:35:30 +09:00
Author: https://github.com/ADKaster Commit: https://github.com/SerenityOS/serenity/commit/d97b09693e Pull-request: https://github.com/SerenityOS/serenity/pull/20822
9 changed files with 39 additions and 41 deletions
|
@ -133,7 +133,7 @@ static JS::NonnullGCPtr<HTML::BrowsingContext> obtain_a_browsing_context_to_use_
|
||||||
// cross-origin isolation mode to either "logical" or "concrete". The choice of which is implementation-defined.
|
// cross-origin isolation mode to either "logical" or "concrete". The choice of which is implementation-defined.
|
||||||
|
|
||||||
// 5. If sandboxFlags is not empty, then:
|
// 5. If sandboxFlags is not empty, then:
|
||||||
if (!sandbox_flags.is_empty()) {
|
if (!is_empty(sandbox_flags)) {
|
||||||
// 1. Assert navigationCOOP's value is "unsafe-none".
|
// 1. Assert navigationCOOP's value is "unsafe-none".
|
||||||
VERIFY(navigation_coop.value == HTML::CrossOriginOpenerPolicyValue::UnsafeNone);
|
VERIFY(navigation_coop.value == HTML::CrossOriginOpenerPolicyValue::UnsafeNone);
|
||||||
|
|
||||||
|
@ -2535,7 +2535,7 @@ HTML::SourceSnapshotParams Document::snapshot_source_snapshot_params() const
|
||||||
return HTML::SourceSnapshotParams {
|
return HTML::SourceSnapshotParams {
|
||||||
.has_transient_activation = verify_cast<HTML::Window>(HTML::relevant_global_object(*this)).has_transient_activation(),
|
.has_transient_activation = verify_cast<HTML::Window>(HTML::relevant_global_object(*this)).has_transient_activation(),
|
||||||
.sandboxing_flags = m_active_sandboxing_flag_set,
|
.sandboxing_flags = m_active_sandboxing_flag_set,
|
||||||
.allows_downloading = (m_active_sandboxing_flag_set.flags & HTML::SandboxingFlagSet::SandboxedDownloads) != HTML::SandboxingFlagSet::SandboxedDownloads,
|
.allows_downloading = !has_flag(m_active_sandboxing_flag_set, HTML::SandboxingFlagSet::SandboxedDownloads),
|
||||||
.fetch_client = relevant_settings_object(),
|
.fetch_client = relevant_settings_object(),
|
||||||
.source_policy_container = m_policy_container
|
.source_policy_container = m_policy_container
|
||||||
};
|
};
|
||||||
|
@ -3475,7 +3475,7 @@ void Document::shared_declarative_refresh_steps(StringView input, JS::GCPtr<HTML
|
||||||
// flag set, then navigate document's node navigable to urlRecord using document, with historyHandling set to
|
// flag set, then navigate document's node navigable to urlRecord using document, with historyHandling set to
|
||||||
// "replace".
|
// "replace".
|
||||||
m_active_refresh_timer = Core::Timer::create_single_shot(time * 1000, [this, has_meta_element = !!meta_element, url_record = move(url_record)]() {
|
m_active_refresh_timer = Core::Timer::create_single_shot(time * 1000, [this, has_meta_element = !!meta_element, url_record = move(url_record)]() {
|
||||||
if (has_meta_element && active_sandboxing_flag_set().flags & HTML::SandboxingFlagSet::SandboxedAutomaticFeatures)
|
if (has_meta_element && has_flag(active_sandboxing_flag_set(), HTML::SandboxingFlagSet::SandboxedAutomaticFeatures))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// FIXME: Use navigables when they're used for all navigation (otherwise, navigable() would be null in some cases)
|
// FIXME: Use navigables when they're used for all navigation (otherwise, navigable() would be null in some cases)
|
||||||
|
|
|
@ -457,7 +457,7 @@ struct EnvironmentSettingsObject;
|
||||||
struct NavigationParams;
|
struct NavigationParams;
|
||||||
struct POSTResource;
|
struct POSTResource;
|
||||||
struct PolicyContainer;
|
struct PolicyContainer;
|
||||||
struct SandboxingFlagSet;
|
enum class SandboxingFlagSet;
|
||||||
struct SerializedFormData;
|
struct SerializedFormData;
|
||||||
struct SessionHistoryEntry;
|
struct SessionHistoryEntry;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ static bool url_matches_about_blank(AK::URL const& url)
|
||||||
HTML::Origin determine_the_origin(BrowsingContext const& browsing_context, Optional<AK::URL> url, SandboxingFlagSet sandbox_flags, Optional<HTML::Origin> invocation_origin)
|
HTML::Origin determine_the_origin(BrowsingContext const& browsing_context, Optional<AK::URL> url, SandboxingFlagSet sandbox_flags, Optional<HTML::Origin> invocation_origin)
|
||||||
{
|
{
|
||||||
// 1. If sandboxFlags has its sandboxed origin browsing context flag set, then return a new opaque origin.
|
// 1. If sandboxFlags has its sandboxed origin browsing context flag set, then return a new opaque origin.
|
||||||
if (sandbox_flags.flags & SandboxingFlagSet::SandboxedOrigin) {
|
if (has_flag(sandbox_flags, SandboxingFlagSet::SandboxedOrigin)) {
|
||||||
return HTML::Origin {};
|
return HTML::Origin {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ HTML::Origin determine_the_origin(BrowsingContext const& browsing_context, Optio
|
||||||
HTML::Origin determine_the_origin(AK::URL const& url, SandboxingFlagSet sandbox_flags, Optional<HTML::Origin> source_origin, Optional<HTML::Origin> container_origin)
|
HTML::Origin determine_the_origin(AK::URL const& url, SandboxingFlagSet sandbox_flags, Optional<HTML::Origin> source_origin, Optional<HTML::Origin> container_origin)
|
||||||
{
|
{
|
||||||
// 1. If sandboxFlags has its sandboxed origin browsing context flag set, then return a new opaque origin.
|
// 1. If sandboxFlags has its sandboxed origin browsing context flag set, then return a new opaque origin.
|
||||||
if (sandbox_flags.flags & SandboxingFlagSet::SandboxedOrigin) {
|
if (has_flag(sandbox_flags, SandboxingFlagSet::SandboxedOrigin)) {
|
||||||
return HTML::Origin {};
|
return HTML::Origin {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ JS::NonnullGCPtr<BrowsingContext> BrowsingContext::create_a_new_browsing_context
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: 4. Let sandboxFlags be the result of determining the creation sandboxing flags given browsingContext and embedded.
|
// FIXME: 4. Let sandboxFlags be the result of determining the creation sandboxing flags given browsingContext and embedded.
|
||||||
SandboxingFlagSet sandbox_flags;
|
SandboxingFlagSet sandbox_flags = {};
|
||||||
|
|
||||||
// 5. Let origin be the result of determining the origin given browsingContext, about:blank, sandboxFlags, and browsingContext's creator origin.
|
// 5. Let origin be the result of determining the origin given browsingContext, about:blank, sandboxFlags, and browsingContext's creator origin.
|
||||||
auto origin = determine_the_origin(*browsing_context, AK::URL("about:blank"), sandbox_flags, browsing_context->m_creator_origin);
|
auto origin = determine_the_origin(*browsing_context, AK::URL("about:blank"), sandbox_flags, browsing_context->m_creator_origin);
|
||||||
|
@ -311,7 +311,7 @@ WebIDL::ExceptionOr<BrowsingContext::BrowsingContextAndDocument> BrowsingContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: 5. Let sandboxFlags be the result of determining the creation sandboxing flags given browsingContext and embedder.
|
// FIXME: 5. Let sandboxFlags be the result of determining the creation sandboxing flags given browsingContext and embedder.
|
||||||
SandboxingFlagSet sandbox_flags;
|
SandboxingFlagSet sandbox_flags = {};
|
||||||
|
|
||||||
// 6. Let origin be the result of determining the origin given about:blank, sandboxFlags, creatorOrigin, and null.
|
// 6. Let origin be the result of determining the origin given about:blank, sandboxFlags, creatorOrigin, and null.
|
||||||
auto origin = determine_the_origin(AK::URL("about:blank"sv), sandbox_flags, creator_origin, {});
|
auto origin = determine_the_origin(AK::URL("about:blank"sv), sandbox_flags, creator_origin, {});
|
||||||
|
@ -890,7 +890,7 @@ BrowsingContext::ChosenBrowsingContext BrowsingContext::choose_a_browsing_contex
|
||||||
}
|
}
|
||||||
|
|
||||||
// --> If sandboxingFlagSet has the sandboxed auxiliary navigation browsing context flag set
|
// --> If sandboxingFlagSet has the sandboxed auxiliary navigation browsing context flag set
|
||||||
else if (sandboxing_flag_set.flags & SandboxingFlagSet::SandboxedAuxiliaryNavigation) {
|
else if (has_flag(sandboxing_flag_set, SandboxingFlagSet::SandboxedAuxiliaryNavigation)) {
|
||||||
// FIXME: The user agent may report to a developer console that a popup has been blocked.
|
// FIXME: The user agent may report to a developer console that a popup has been blocked.
|
||||||
dbgln("Pop-up blocked!");
|
dbgln("Pop-up blocked!");
|
||||||
}
|
}
|
||||||
|
@ -1445,7 +1445,7 @@ bool BrowsingContext::is_allowed_to_navigate(BrowsingContext const& other) const
|
||||||
// and A's active document's active sandboxing flag set has its sandboxed top-level navigation with user activation browsing context flag set,
|
// and A's active document's active sandboxing flag set has its sandboxed top-level navigation with user activation browsing context flag set,
|
||||||
// then return false.
|
// then return false.
|
||||||
if (active_window()->has_transient_activation()
|
if (active_window()->has_transient_activation()
|
||||||
&& active_document()->active_sandboxing_flag_set().flags & SandboxingFlagSet::SandboxedTopLevelNavigationWithUserActivation) {
|
&& has_flag(active_document()->active_sandboxing_flag_set(), SandboxingFlagSet::SandboxedTopLevelNavigationWithUserActivation)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1453,7 +1453,7 @@ bool BrowsingContext::is_allowed_to_navigate(BrowsingContext const& other) const
|
||||||
// and A's active document's active sandboxing flag set has its sandboxed top-level navigation without user activation browsing context flag set,
|
// and A's active document's active sandboxing flag set has its sandboxed top-level navigation without user activation browsing context flag set,
|
||||||
// then return false.
|
// then return false.
|
||||||
if (!active_window()->has_transient_activation()
|
if (!active_window()->has_transient_activation()
|
||||||
&& active_document()->active_sandboxing_flag_set().flags & SandboxingFlagSet::SandboxedTopLevelNavigationWithoutUserActivation) {
|
&& has_flag(active_document()->active_sandboxing_flag_set(), SandboxingFlagSet::SandboxedTopLevelNavigationWithoutUserActivation)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1466,7 +1466,7 @@ bool BrowsingContext::is_allowed_to_navigate(BrowsingContext const& other) const
|
||||||
if (other.is_top_level()
|
if (other.is_top_level()
|
||||||
&& &other != this
|
&& &other != this
|
||||||
&& !other.is_ancestor_of(*this)
|
&& !other.is_ancestor_of(*this)
|
||||||
&& active_document()->active_sandboxing_flag_set().flags & SandboxingFlagSet::SandboxedNavigation
|
&& has_flag(active_document()->active_sandboxing_flag_set(), SandboxingFlagSet::SandboxedNavigation)
|
||||||
&& this != other.the_one_permitted_sandboxed_navigator()) {
|
&& this != other.the_one_permitted_sandboxed_navigator()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ WebIDL::ExceptionOr<void> HTMLFormElement::submit_form(JS::NonnullGCPtr<HTMLElem
|
||||||
auto* form_browsing_context = form_document->browsing_context();
|
auto* form_browsing_context = form_document->browsing_context();
|
||||||
|
|
||||||
// 4. If form document's active sandboxing flag set has its sandboxed forms browsing context flag set, then return.
|
// 4. If form document's active sandboxing flag set has its sandboxed forms browsing context flag set, then return.
|
||||||
if (form_document->active_sandboxing_flag_set().flags & HTML::SandboxingFlagSet::Flag::SandboxedForms)
|
if (has_flag(form_document->active_sandboxing_flag_set(), HTML::SandboxingFlagSet::SandboxedForms))
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
// 5. If the submitted from submit() method flag is not set, then:
|
// 5. If the submitted from submit() method flag is not set, then:
|
||||||
|
|
|
@ -1655,7 +1655,7 @@ bool HTMLMediaElement::is_eligible_for_autoplay() const
|
||||||
has_attribute(HTML::AttributeNames::autoplay) &&
|
has_attribute(HTML::AttributeNames::autoplay) &&
|
||||||
|
|
||||||
// Its node document's active sandboxing flag set does not have the sandboxed automatic features browsing context flag set.
|
// Its node document's active sandboxing flag set does not have the sandboxed automatic features browsing context flag set.
|
||||||
(document().active_sandboxing_flag_set().flags & SandboxingFlagSet::SandboxedAutomaticFeatures) == 0 &&
|
!has_flag(document().active_sandboxing_flag_set(), SandboxingFlagSet::SandboxedAutomaticFeatures) &&
|
||||||
|
|
||||||
// Its node document is allowed to use the "autoplay" feature.
|
// Its node document is allowed to use the "autoplay" feature.
|
||||||
document().is_allowed_to_use_feature(DOM::PolicyControlledFeature::Autoplay));
|
document().is_allowed_to_use_feature(DOM::PolicyControlledFeature::Autoplay));
|
||||||
|
|
|
@ -490,7 +490,7 @@ static WebIDL::ExceptionOr<Optional<NavigationParams>> create_navigation_params_
|
||||||
JS::GCPtr<Fetch::Infrastructure::FetchController> fetch_controller = nullptr;
|
JS::GCPtr<Fetch::Infrastructure::FetchController> fetch_controller = nullptr;
|
||||||
|
|
||||||
// 13. Let finalSandboxFlags be an empty sandboxing flag set.
|
// 13. Let finalSandboxFlags be an empty sandboxing flag set.
|
||||||
SandboxingFlagSet final_sandbox_flags;
|
SandboxingFlagSet final_sandbox_flags = {};
|
||||||
|
|
||||||
// 16. Let locationURL be null.
|
// 16. Let locationURL be null.
|
||||||
ErrorOr<Optional<AK::URL>> location_url { OptionalNone {} };
|
ErrorOr<Optional<AK::URL>> location_url { OptionalNone {} };
|
||||||
|
|
|
@ -36,7 +36,7 @@ struct NavigationParams {
|
||||||
PolicyContainer policy_container;
|
PolicyContainer policy_container;
|
||||||
|
|
||||||
// a sandboxing flag set to impose on the new Document
|
// a sandboxing flag set to impose on the new Document
|
||||||
SandboxingFlagSet final_sandboxing_flag_set;
|
SandboxingFlagSet final_sandboxing_flag_set = {};
|
||||||
|
|
||||||
// a cross-origin opener policy to use for the new Document
|
// a cross-origin opener policy to use for the new Document
|
||||||
CrossOriginOpenerPolicy cross_origin_opener_policy;
|
CrossOriginOpenerPolicy cross_origin_opener_policy;
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/EnumBits.h>
|
||||||
#include <AK/Types.h>
|
#include <AK/Types.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/origin.html#sandboxing-flag-set
|
// https://html.spec.whatwg.org/multipage/origin.html#sandboxing-flag-set
|
||||||
struct SandboxingFlagSet {
|
enum class SandboxingFlagSet {
|
||||||
enum Flag {
|
|
||||||
SandboxedNavigation = 1u << 0u,
|
SandboxedNavigation = 1u << 0u,
|
||||||
SandboxedAuxiliaryNavigation = 1u << 1u,
|
SandboxedAuxiliaryNavigation = 1u << 1u,
|
||||||
SandboxedTopLevelNavigationWithoutUserActivation = 1u << 2u,
|
SandboxedTopLevelNavigationWithoutUserActivation = 1u << 2u,
|
||||||
|
@ -30,11 +30,9 @@ struct SandboxingFlagSet {
|
||||||
SandboxedPresentation = 1u << 14u,
|
SandboxedPresentation = 1u << 14u,
|
||||||
SandboxedDownloads = 1u << 15u,
|
SandboxedDownloads = 1u << 15u,
|
||||||
SandboxedCustomProtocols = 1u << 16u,
|
SandboxedCustomProtocols = 1u << 16u,
|
||||||
};
|
|
||||||
|
|
||||||
bool is_empty() const { return flags == 0; }
|
|
||||||
|
|
||||||
u32 flags { 0 };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AK_ENUM_BITWISE_OPERATORS(SandboxingFlagSet);
|
||||||
|
inline bool is_empty(SandboxingFlagSet s) { return (to_underlying(s) & 0x1FFU) == 0; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ struct SourceSnapshotParams {
|
||||||
bool has_transient_activation;
|
bool has_transient_activation;
|
||||||
|
|
||||||
// a sandboxing flag set
|
// a sandboxing flag set
|
||||||
SandboxingFlagSet sandboxing_flags;
|
SandboxingFlagSet sandboxing_flags = {};
|
||||||
|
|
||||||
// a boolean
|
// a boolean
|
||||||
bool allows_downloading;
|
bool allows_downloading;
|
||||||
|
|
Loading…
Add table
Reference in a new issue