mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 18:17:44 +00:00
LibWeb: Add facilities to serialize EnvironmentSettingsObjects
This will be used to transfer information about the parent context to DedicatedWorkers and future out-of-process Worker/Worklet implementations for fetching purposes. In order to properly check same-origin and other policies, we need to know more about the outside settings than we were previously passing to the WebWorker process.
This commit is contained in:
parent
c79bac70f4
commit
4d22358e05
11 changed files with 198 additions and 5 deletions
|
@ -133,10 +133,12 @@ source_set("HTML") {
|
||||||
"NavigatorBeacon.cpp",
|
"NavigatorBeacon.cpp",
|
||||||
"NavigatorID.cpp",
|
"NavigatorID.cpp",
|
||||||
"Numbers.cpp",
|
"Numbers.cpp",
|
||||||
|
"Origin.cpp",
|
||||||
"PageTransitionEvent.cpp",
|
"PageTransitionEvent.cpp",
|
||||||
"Path2D.cpp",
|
"Path2D.cpp",
|
||||||
"Plugin.cpp",
|
"Plugin.cpp",
|
||||||
"PluginArray.cpp",
|
"PluginArray.cpp",
|
||||||
|
"PolicyContainers.cpp",
|
||||||
"PotentialCORSRequest.cpp",
|
"PotentialCORSRequest.cpp",
|
||||||
"PromiseRejectionEvent.cpp",
|
"PromiseRejectionEvent.cpp",
|
||||||
"SelectItem.cpp",
|
"SelectItem.cpp",
|
||||||
|
|
|
@ -9,6 +9,7 @@ source_set("Scripting") {
|
||||||
"ModuleMap.cpp",
|
"ModuleMap.cpp",
|
||||||
"ModuleScript.cpp",
|
"ModuleScript.cpp",
|
||||||
"Script.cpp",
|
"Script.cpp",
|
||||||
|
"SerializedEnvironmentSettingsObject.cpp",
|
||||||
"TemporaryExecutionContext.cpp",
|
"TemporaryExecutionContext.cpp",
|
||||||
"WindowEnvironmentSettingsObject.cpp",
|
"WindowEnvironmentSettingsObject.cpp",
|
||||||
"WorkerEnvironmentSettingsObject.cpp",
|
"WorkerEnvironmentSettingsObject.cpp",
|
||||||
|
|
|
@ -366,7 +366,9 @@ set(SOURCES
|
||||||
HTML/NavigatorBeacon.cpp
|
HTML/NavigatorBeacon.cpp
|
||||||
HTML/NavigatorID.cpp
|
HTML/NavigatorID.cpp
|
||||||
HTML/Numbers.cpp
|
HTML/Numbers.cpp
|
||||||
|
HTML/Origin.cpp
|
||||||
HTML/PageTransitionEvent.cpp
|
HTML/PageTransitionEvent.cpp
|
||||||
|
HTML/PolicyContainers.cpp
|
||||||
HTML/Parser/Entities.cpp
|
HTML/Parser/Entities.cpp
|
||||||
HTML/Parser/HTMLEncodingDetection.cpp
|
HTML/Parser/HTMLEncodingDetection.cpp
|
||||||
HTML/Parser/HTMLParser.cpp
|
HTML/Parser/HTMLParser.cpp
|
||||||
|
@ -389,6 +391,7 @@ set(SOURCES
|
||||||
HTML/Scripting/TemporaryExecutionContext.cpp
|
HTML/Scripting/TemporaryExecutionContext.cpp
|
||||||
HTML/Scripting/WindowEnvironmentSettingsObject.cpp
|
HTML/Scripting/WindowEnvironmentSettingsObject.cpp
|
||||||
HTML/Scripting/WorkerEnvironmentSettingsObject.cpp
|
HTML/Scripting/WorkerEnvironmentSettingsObject.cpp
|
||||||
|
HTML/Scripting/SerializedEnvironmentSettingsObject.cpp
|
||||||
HTML/SelectedFile.cpp
|
HTML/SelectedFile.cpp
|
||||||
HTML/SelectItem.cpp
|
HTML/SelectItem.cpp
|
||||||
HTML/SessionHistoryEntry.cpp
|
HTML/SessionHistoryEntry.cpp
|
||||||
|
|
32
Userland/Libraries/LibWeb/HTML/Origin.cpp
Normal file
32
Userland/Libraries/LibWeb/HTML/Origin.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibIPC/Decoder.h>
|
||||||
|
#include <LibIPC/Encoder.h>
|
||||||
|
#include <LibWeb/HTML/Origin.h>
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
template<>
|
||||||
|
ErrorOr<void> encode(Encoder& encoder, Web::HTML::Origin const& origin)
|
||||||
|
{
|
||||||
|
TRY(encoder.encode<ByteString>(origin.scheme()));
|
||||||
|
TRY(encoder.encode(origin.host()));
|
||||||
|
TRY(encoder.encode(origin.port()));
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<Web::HTML::Origin> decode(Decoder& decoder)
|
||||||
|
{
|
||||||
|
auto scheme = TRY(decoder.decode<ByteString>());
|
||||||
|
auto host = TRY(decoder.decode<URL::Host>());
|
||||||
|
u16 port = TRY(decoder.decode<u16>());
|
||||||
|
|
||||||
|
return Web::HTML::Origin { move(scheme), move(host), port };
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -10,6 +10,7 @@
|
||||||
#include <AK/ByteString.h>
|
#include <AK/ByteString.h>
|
||||||
#include <AK/URL.h>
|
#include <AK/URL.h>
|
||||||
#include <AK/URLParser.h>
|
#include <AK/URLParser.h>
|
||||||
|
#include <LibIPC/Forward.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
|
||||||
|
@ -132,3 +133,11 @@ struct Traits<Web::HTML::Origin> : public DefaultTraits<Web::HTML::Origin> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace AK
|
} // namespace AK
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
template<>
|
||||||
|
ErrorOr<void> encode(Encoder&, Web::HTML::Origin const&);
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<Web::HTML::Origin> decode(Decoder&);
|
||||||
|
}
|
||||||
|
|
29
Userland/Libraries/LibWeb/HTML/PolicyContainers.cpp
Normal file
29
Userland/Libraries/LibWeb/HTML/PolicyContainers.cpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibIPC/Decoder.h>
|
||||||
|
#include <LibIPC/Encoder.h>
|
||||||
|
#include <LibWeb/HTML/PolicyContainers.h>
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<void> encode(IPC::Encoder& encoder, Web::HTML::PolicyContainer const& policy_container)
|
||||||
|
{
|
||||||
|
TRY(encode(encoder, policy_container.referrer_policy));
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<Web::HTML::PolicyContainer> decode(IPC::Decoder& decoder)
|
||||||
|
{
|
||||||
|
auto referrer_policy = TRY(decoder.decode<Web::ReferrerPolicy::ReferrerPolicy>());
|
||||||
|
|
||||||
|
return Web::HTML::PolicyContainer { .referrer_policy = referrer_policy };
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <LibIPC/Forward.h>
|
||||||
#include <LibWeb/ReferrerPolicy/ReferrerPolicy.h>
|
#include <LibWeb/ReferrerPolicy/ReferrerPolicy.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
@ -25,3 +26,11 @@ struct PolicyContainer {
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
template<>
|
||||||
|
ErrorOr<void> encode(IPC::Encoder&, Web::HTML::PolicyContainer const&);
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<Web::HTML::PolicyContainer> decode(IPC::Decoder&);
|
||||||
|
}
|
||||||
|
|
|
@ -489,4 +489,22 @@ bool is_non_secure_context(Environment const& environment)
|
||||||
return !is_secure_context(environment);
|
return !is_secure_context(environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SerializedEnvironmentSettingsObject EnvironmentSettingsObject::serialize()
|
||||||
|
{
|
||||||
|
SerializedEnvironmentSettingsObject object;
|
||||||
|
|
||||||
|
object.id = this->id;
|
||||||
|
object.creation_url = this->creation_url;
|
||||||
|
object.top_level_creation_url = this->top_level_creation_url;
|
||||||
|
object.top_level_origin = this->top_level_origin;
|
||||||
|
|
||||||
|
object.api_url_character_encoding = api_url_character_encoding();
|
||||||
|
object.api_base_url = api_base_url();
|
||||||
|
object.origin = origin();
|
||||||
|
object.policy_container = policy_container();
|
||||||
|
object.cross_origin_isolated_capability = cross_origin_isolated_capability();
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <LibWeb/HTML/EventLoop/EventLoop.h>
|
#include <LibWeb/HTML/EventLoop/EventLoop.h>
|
||||||
#include <LibWeb/HTML/Origin.h>
|
#include <LibWeb/HTML/Origin.h>
|
||||||
#include <LibWeb/HTML/Scripting/ModuleMap.h>
|
#include <LibWeb/HTML/Scripting/ModuleMap.h>
|
||||||
|
#include <LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
|
||||||
|
@ -40,11 +41,6 @@ struct Environment {
|
||||||
bool execution_ready { false };
|
bool execution_ready { false };
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class CanUseCrossOriginIsolatedAPIs {
|
|
||||||
No,
|
|
||||||
Yes,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class RunScriptDecision {
|
enum class RunScriptDecision {
|
||||||
Run,
|
Run,
|
||||||
DoNotRun,
|
DoNotRun,
|
||||||
|
@ -115,6 +111,8 @@ struct EnvironmentSettingsObject
|
||||||
|
|
||||||
void disallow_further_import_maps();
|
void disallow_further_import_maps();
|
||||||
|
|
||||||
|
SerializedEnvironmentSettingsObject serialize();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit EnvironmentSettingsObject(NonnullOwnPtr<JS::ExecutionContext>);
|
explicit EnvironmentSettingsObject(NonnullOwnPtr<JS::ExecutionContext>);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibIPC/Decoder.h>
|
||||||
|
#include <LibIPC/Encoder.h>
|
||||||
|
#include <LibWeb/HTML/Scripting/SerializedEnvironmentSettingsObject.h>
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<void> encode(Encoder& encoder, Web::HTML::SerializedEnvironmentSettingsObject const& object)
|
||||||
|
{
|
||||||
|
TRY(encoder.encode(object.id));
|
||||||
|
TRY(encoder.encode(object.creation_url));
|
||||||
|
TRY(encoder.encode(object.top_level_creation_url));
|
||||||
|
TRY(encoder.encode(object.top_level_origin));
|
||||||
|
TRY(encoder.encode(object.api_url_character_encoding));
|
||||||
|
TRY(encoder.encode(object.api_base_url));
|
||||||
|
TRY(encoder.encode(object.origin));
|
||||||
|
TRY(encoder.encode(object.policy_container));
|
||||||
|
TRY(encoder.encode(object.cross_origin_isolated_capability));
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<Web::HTML::SerializedEnvironmentSettingsObject> decode(Decoder& decoder)
|
||||||
|
{
|
||||||
|
Web::HTML::SerializedEnvironmentSettingsObject object {};
|
||||||
|
|
||||||
|
object.id = TRY(decoder.decode<String>());
|
||||||
|
object.creation_url = TRY(decoder.decode<URL>());
|
||||||
|
object.top_level_creation_url = TRY(decoder.decode<URL>());
|
||||||
|
object.top_level_origin = TRY(decoder.decode<Web::HTML::Origin>());
|
||||||
|
object.api_url_character_encoding = TRY(decoder.decode<String>());
|
||||||
|
object.api_base_url = TRY(decoder.decode<URL>());
|
||||||
|
object.origin = TRY(decoder.decode<Web::HTML::Origin>());
|
||||||
|
object.policy_container = TRY(decoder.decode<Web::HTML::PolicyContainer>());
|
||||||
|
object.cross_origin_isolated_capability = TRY(decoder.decode<Web::HTML::CanUseCrossOriginIsolatedAPIs>());
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/String.h>
|
||||||
|
#include <AK/URL.h>
|
||||||
|
#include <LibIPC/Forward.h>
|
||||||
|
#include <LibWeb/HTML/Origin.h>
|
||||||
|
#include <LibWeb/HTML/PolicyContainers.h>
|
||||||
|
|
||||||
|
namespace Web::HTML {
|
||||||
|
|
||||||
|
enum class CanUseCrossOriginIsolatedAPIs {
|
||||||
|
No,
|
||||||
|
Yes,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SerializedEnvironmentSettingsObject {
|
||||||
|
String id;
|
||||||
|
URL creation_url;
|
||||||
|
URL top_level_creation_url;
|
||||||
|
Origin top_level_origin;
|
||||||
|
|
||||||
|
String api_url_character_encoding;
|
||||||
|
URL api_base_url;
|
||||||
|
Origin origin;
|
||||||
|
PolicyContainer policy_container;
|
||||||
|
CanUseCrossOriginIsolatedAPIs cross_origin_isolated_capability;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<void> encode(Encoder&, Web::HTML::SerializedEnvironmentSettingsObject const&);
|
||||||
|
|
||||||
|
template<>
|
||||||
|
ErrorOr<Web::HTML::SerializedEnvironmentSettingsObject> decode(Decoder&);
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue