LibWeb: Remove unused BrowsingContext functions and data members

This aligns it better with the current state of the spec.

There's still some functions and data members that need moved into
Navigable or TraversableNavigable, but we can leave those for the next
cleanup PR.
This commit is contained in:
Andrew Kaster 2024-02-04 03:56:00 -07:00 committed by Andrew Kaster
parent 9645daaf6c
commit 888e67992a
Notes: sideshowbarker 2024-07-17 02:38:39 +09:00
2 changed files with 21 additions and 231 deletions

View File

@ -24,7 +24,6 @@
#include <LibWeb/HTML/Window.h>
#include <LibWeb/HTML/WindowProxy.h>
#include <LibWeb/HighResolutionTime/TimeOrigin.h>
#include <LibWeb/Infra/Strings.h>
#include <LibWeb/Layout/BreakNode.h>
#include <LibWeb/Layout/Viewport.h>
#include <LibWeb/Namespace.h>
@ -124,7 +123,7 @@ WebIDL::ExceptionOr<BrowsingContext::BrowsingContextAndDocument> BrowsingContext
auto& vm = group->vm();
// 1. Let browsingContext be a new browsing context.
JS::NonnullGCPtr<BrowsingContext> browsing_context = *vm.heap().allocate_without_realm<BrowsingContext>(page, nullptr);
JS::NonnullGCPtr<BrowsingContext> browsing_context = *vm.heap().allocate_without_realm<BrowsingContext>(page);
// 2. Let unsafeContextCreationTime be the unsafe shared current time.
[[maybe_unused]] auto unsafe_context_creation_time = HighResolutionTime::unsafe_shared_current_time();
@ -273,10 +272,9 @@ WebIDL::ExceptionOr<BrowsingContext::BrowsingContextAndDocument> BrowsingContext
return BrowsingContext::BrowsingContextAndDocument { browsing_context, document };
}
BrowsingContext::BrowsingContext(JS::NonnullGCPtr<Page> page, HTML::NavigableContainer* container)
BrowsingContext::BrowsingContext(JS::NonnullGCPtr<Page> page)
: m_page(page)
, m_event_handler({}, *this)
, m_container(container)
{
m_cursor_blink_timer = Core::Timer::create_repeating(500, [this] {
if (!is_focused_context())
@ -295,9 +293,6 @@ void BrowsingContext::visit_edges(Cell::Visitor& visitor)
Base::visit_edges(visitor);
visitor.visit(m_page);
for (auto& entry : m_session_history)
visitor.visit(entry);
visitor.visit(m_container);
visitor.visit(m_cursor_position);
visitor.visit(m_window_proxy);
visitor.visit(m_group);
@ -306,6 +301,7 @@ void BrowsingContext::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_last_child);
visitor.visit(m_next_sibling);
visitor.visit(m_previous_sibling);
visitor.visit(m_opener_browsing_context);
m_event_handler.visit_edges(visitor);
}
@ -372,28 +368,6 @@ JS::GCPtr<BrowsingContext> BrowsingContext::top_level_browsing_context() const
return navigable->active_browsing_context();
}
CSSPixelRect BrowsingContext::to_top_level_rect(CSSPixelRect const& a_rect)
{
auto rect = a_rect;
rect.set_location(to_top_level_position(a_rect.location()));
return rect;
}
CSSPixelPoint BrowsingContext::to_top_level_position(CSSPixelPoint a_position)
{
auto position = a_position;
for (auto ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
if (ancestor->is_top_level())
break;
if (!ancestor->container())
return {};
if (!ancestor->container()->paintable())
return {};
position.translate_by(ancestor->container()->paintable()->box_type_agnostic_position());
}
return position;
}
void BrowsingContext::set_cursor_position(JS::NonnullGCPtr<DOM::Position> position)
{
if (m_cursor_position && m_cursor_position->equals(position))
@ -506,150 +480,6 @@ JS::GCPtr<DOM::Node> BrowsingContext::currently_focused_area()
return candidate;
}
// https://html.spec.whatwg.org/#the-rules-for-choosing-a-browsing-context-given-a-browsing-context-name
BrowsingContext::ChosenBrowsingContext BrowsingContext::choose_a_browsing_context(StringView name, TokenizedFeature::NoOpener no_opener, ActivateTab)
{
// The rules for choosing a browsing context, given a browsing context name name, a browsing context current, and
// a boolean noopener are as follows:
JS::GCPtr<BrowsingContext> matching_name_in_tree = nullptr;
top_level_browsing_context()->for_each_in_subtree([&](auto& context) {
if (context.name() == name) {
matching_name_in_tree = &context;
return IterationDecision::Break;
}
return IterationDecision::Continue;
});
// 1. Let chosen be null.
JS::GCPtr<BrowsingContext> chosen = nullptr;
// 2. Let windowType be "existing or none".
auto window_type = WindowType::ExistingOrNone;
// 3. Let sandboxingFlagSet be current's active document's active sandboxing flag set.
auto sandboxing_flag_set = active_document()->active_sandboxing_flag_set();
// 4. If name is the empty string or an ASCII case-insensitive match for "_self", then set chosen to current.
if (name.is_empty() || Infra::is_ascii_case_insensitive_match(name, "_self"sv)) {
chosen = this;
}
// 5. Otherwise, if name is an ASCII case-insensitive match for "_parent", set chosen to current's parent browsing
// context, if any, and current otherwise.
else if (Infra::is_ascii_case_insensitive_match(name, "_parent"sv)) {
if (auto parent = this->parent())
chosen = parent;
else
chosen = this;
}
// 6. Otherwise, if name is an ASCII case-insensitive match for "_top", set chosen to current's top-level browsing
// context, if any, and current otherwise.
else if (Infra::is_ascii_case_insensitive_match(name, "_top"sv)) {
chosen = top_level_browsing_context();
}
// 7. Otherwise, if name is not an ASCII case-insensitive match for "_blank", there exists a browsing context
// whose name is the same as name, current is familiar with that browsing context, and the user agent
// determines that the two browsing contexts are related enough that it is ok if they reach each other,
// set chosen to that browsing context. If there are multiple matching browsing contexts, the user agent
// should set chosen to one in some arbitrary consistent manner, such as the most recently opened, most
// recently focused, or more closely related.
else if (!Infra::is_ascii_case_insensitive_match(name, "_blank"sv) && matching_name_in_tree) {
chosen = matching_name_in_tree;
} else {
// 8. Otherwise, a new browsing context is being requested, and what happens depends on the user agent's
// configuration and abilities — it is determined by the rules given for the first applicable option from
// the following list:
// --> If current's active window does not have transient activation and the user agent has been configured to
// not show popups (i.e., the user agent has a "popup blocker" enabled)
VERIFY(m_page);
if (!active_window()->has_transient_activation() && m_page->should_block_pop_ups()) {
// FIXME: The user agent may inform the user that a popup has been blocked.
dbgln("Pop-up blocked!");
}
// --> If sandboxingFlagSet has the sandboxed auxiliary navigation browsing context flag set
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.
dbgln("Pop-up blocked!");
}
// --> If the user agent has been configured such that in this instance it will create a new browsing context
else if (true) { // FIXME: When is this the case?
// 1. Set windowType to "new and unrestricted".
window_type = WindowType::NewAndUnrestricted;
// 2. If current's top-level browsing context's active document's cross-origin opener policy's value is
// "same-origin" or "same-origin-plus-COEP", then:
if (top_level_browsing_context()->active_document()->cross_origin_opener_policy().value == CrossOriginOpenerPolicyValue::SameOrigin || top_level_browsing_context()->active_document()->cross_origin_opener_policy().value == CrossOriginOpenerPolicyValue::SameOriginPlusCOEP) {
// 1. Let currentDocument be current's active document.
auto* current_document = top_level_browsing_context()->active_document();
// 2. If currentDocument's origin is not same origin with currentDocument's relevant settings object's
// top-level origin, then set noopener to true, name to "_blank", and windowType to "new with no opener".
if (!current_document->origin().is_same_origin(current_document->relevant_settings_object().top_level_origin)) {
no_opener = TokenizedFeature::NoOpener::Yes;
name = "_blank"sv;
window_type = WindowType::NewWithNoOpener;
}
}
// 3. If noopener is true, then set chosen to the result of creating a new top-level browsing context.
if (no_opener == TokenizedFeature::NoOpener::Yes) {
// FIXME: This is completely wrong, but all of this should be removed in favor of choose_a_navigable
chosen = this;
}
// 4. Otherwise:
else {
// 1. Set chosen to the result of creating a new auxiliary browsing context with current.
// FIXME: We have no concept of auxiliary browsing context
chosen = HTML::create_a_new_top_level_browsing_context_and_document(*m_page).release_value_but_fixme_should_propagate_errors().browsing_context;
// 2. If sandboxingFlagSet's sandboxed navigation browsing context flag is set, then current must be
// set as chosen's one permitted sandboxed navigator.
// FIXME: We have no concept of one permitted sandboxed navigator
}
// 5. If sandboxingFlagSet's sandbox propagates to auxiliary browsing contexts flag is set, then all the
// flags that are set in sandboxingFlagSet must be set in chosen's popup sandboxing flag set.
// FIXME: Our BrowsingContexts do not have SandboxingFlagSets yet, only documents do
// 6. If name is not an ASCII case-insensitive match for "_blank", then set chosen's name to name.
if (!Infra::is_ascii_case_insensitive_match(name, "_blank"sv))
chosen->set_name(String::from_utf8(name).release_value_but_fixme_should_propagate_errors());
}
// --> If the user agent has been configured such that in this instance t will reuse current
else if (false) { // FIXME: When is this the case?
// Set chosen to current.
chosen = *this;
}
// --> If the user agent has been configured such that in this instance it will not find a browsing context
else if (false) { // FIXME: When is this the case?
// Do nothing.
}
}
// 9. Return chosen and windowType.
return { chosen.ptr(), window_type };
}
// https://html.spec.whatwg.org/multipage/dom.html#still-on-its-initial-about:blank-document
bool BrowsingContext::still_on_its_initial_about_blank_document() const
{
// A browsing context browsingContext is still on its initial about:blank Document
// if browsingContext's session history's size is 1
// and browsingContext's session history[0]'s document's is initial about:blank is true.
return m_session_history.size() == 1
&& m_session_history[0]->document_state->document()
&& m_session_history[0]->document_state->document()->is_initial_about_blank();
}
DOM::Document const* BrowsingContext::active_document() const
{
auto* window = active_window();

View File

@ -121,25 +121,6 @@ public:
JS::GCPtr<BrowsingContext> top_level_browsing_context() const;
enum class WindowType {
ExistingOrNone,
NewAndUnrestricted,
NewWithNoOpener,
};
struct ChosenBrowsingContext {
JS::GCPtr<BrowsingContext> browsing_context;
WindowType window_type;
};
ChosenBrowsingContext choose_a_browsing_context(StringView name, TokenizedFeature::NoOpener no_opener, ActivateTab = ActivateTab::Yes);
HTML::NavigableContainer* container() { return m_container; }
HTML::NavigableContainer const* container() const { return m_container; }
CSSPixelPoint to_top_level_position(CSSPixelPoint);
CSSPixelRect to_top_level_rect(CSSPixelRect const&);
JS::GCPtr<DOM::Position> cursor_position() const { return m_cursor_position; }
void set_cursor_position(JS::NonnullGCPtr<DOM::Position>);
bool increment_cursor_position_offset();
@ -154,14 +135,6 @@ public:
JS::GCPtr<DOM::Node> currently_focused_area();
Vector<JS::NonnullGCPtr<SessionHistoryEntry>>& session_history() { return m_session_history; }
Vector<JS::NonnullGCPtr<SessionHistoryEntry>> const& session_history() const { return m_session_history; }
size_t session_history_index() const { return *m_session_history_index; }
// https://html.spec.whatwg.org/multipage/dom.html#still-on-its-initial-about:blank-document
bool still_on_its_initial_about_blank_document() const;
BrowsingContextGroup* group();
void set_group(BrowsingContextGroup*);
@ -178,11 +151,8 @@ public:
void set_is_popup(TokenizedFeature::Popup is_popup) { m_is_popup = is_popup; }
String const& name() const { return m_name; }
void set_name(String name) { m_name = move(name); }
private:
explicit BrowsingContext(JS::NonnullGCPtr<Page>, HTML::NavigableContainer*);
explicit BrowsingContext(JS::NonnullGCPtr<Page>);
virtual void visit_edges(Cell::Visitor&) override;
@ -190,41 +160,31 @@ private:
JS::NonnullGCPtr<Page> m_page;
// FIXME: Move EventHandler to Navigable
Web::EventHandler m_event_handler;
// https://html.spec.whatwg.org/multipage/history.html#current-entry
SessionHistoryEntry& current_entry() { return m_session_history[*m_session_history_index]; }
SessionHistoryEntry const& current_entry() const { return m_session_history[*m_session_history_index]; }
Optional<size_t> m_session_history_index { 0 };
// https://html.spec.whatwg.org/multipage/history.html#session-history
Vector<JS::NonnullGCPtr<SessionHistoryEntry>> m_session_history;
// https://html.spec.whatwg.org/multipage/browsers.html#creator-url
Optional<AK::URL> m_creator_url;
// https://html.spec.whatwg.org/multipage/browsers.html#creator-base-url
Optional<AK::URL> m_creator_base_url;
// https://html.spec.whatwg.org/multipage/browsers.html#creator-origin
Optional<HTML::Origin> m_creator_origin;
JS::GCPtr<HTML::NavigableContainer> m_container;
// https://w3c.github.io/webdriver/#dfn-window-handles
String m_window_handle;
// https://html.spec.whatwg.org/multipage/browsers.html#browsing-context
// https://html.spec.whatwg.org/multipage/document-sequences.html#browsing-context
JS::GCPtr<HTML::WindowProxy> m_window_proxy;
// https://html.spec.whatwg.org/multipage/browsers.html#is-popup
TokenizedFeature::Popup m_is_popup { TokenizedFeature::Popup::No };
// https://html.spec.whatwg.org/multipage/browsers.html#opener-browsing-context
JS::GCPtr<BrowsingContext> m_opener_browsing_context;
String m_name;
// https://html.spec.whatwg.org/multipage/document-sequences.html#opener-origin-at-creation
Optional<HTML::Origin> m_opener_origin_at_creation;
// https://html.spec.whatwg.org/multipage/browsers.html#is-popup
TokenizedFeature::Popup m_is_popup { TokenizedFeature::Popup::No };
// https://html.spec.whatwg.org/multipage/document-sequences.html#is-auxiliary
bool m_is_auxiliary { false };
// https://html.spec.whatwg.org/multipage/document-sequences.html#browsing-context-initial-url
Optional<AK::URL> m_initial_url;
// https://html.spec.whatwg.org/multipage/document-sequences.html#virtual-browsing-context-group-id
u64 m_virtual_browsing_context_group_id = { 0 };
// FIXME: Move cursor tracking to Navigable
JS::GCPtr<DOM::Position> m_cursor_position;
RefPtr<Core::Timer> m_cursor_blink_timer;
bool m_cursor_blink_state { false };