1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:47:35 +00:00

LibWeb+LibWebView+WebContent: Add APIs to manage an autoplay allowlist

The spec defines a Permissions Policy to control some browser behaviors
on a per-origin basis. Management of these permissions live in their own
spec: https://w3c.github.io/webappsec-permissions-policy/

This implements a somewhat ad-hoc Permissions Policy for autoplaying
media elements. We will need to implement the entire policy spec for
this to be more general.
This commit is contained in:
Timothy Flynn 2023-04-17 13:21:19 -04:00 committed by Andreas Kling
parent 6131e621d6
commit 7966fc4780
12 changed files with 209 additions and 0 deletions

View file

@ -72,6 +72,7 @@
#include <LibWeb/Layout/Viewport.h>
#include <LibWeb/Namespace.h>
#include <LibWeb/Page/Page.h>
#include <LibWeb/PermissionsPolicy/AutoplayAllowlist.h>
#include <LibWeb/Platform/Timer.h>
#include <LibWeb/SVG/TagNames.h>
#include <LibWeb/Selection/Selection.h>
@ -2398,6 +2399,31 @@ void Document::unload(bool recursive_flag, Optional<DocumentUnloadTimingInfo> un
m_unload_counter -= 1;
}
// https://html.spec.whatwg.org/multipage/iframe-embed-object.html#allowed-to-use
bool Document::is_allowed_to_use_feature(PolicyControlledFeature feature) const
{
// 1. If document's browsing context is null, then return false.
if (browsing_context() == nullptr)
return false;
// 2. If document is not fully active, then return false.
if (!is_fully_active())
return false;
// 3. If the result of running is feature enabled in document for origin on feature, document, and document's origin
// is "Enabled", then return true.
// FIXME: This is ad-hoc. Implement the Permissions Policy specification.
switch (feature) {
case PolicyControlledFeature::Autoplay:
if (PermissionsPolicy::AutoplayAllowlist::the().is_allowed_for_origin(*this, origin()) == PermissionsPolicy::Decision::Enabled)
return true;
break;
}
// 4. Return false.
return false;
}
void Document::did_stop_being_active_document_in_browsing_context(Badge<HTML::BrowsingContext>)
{
tear_down_layout_tree();