|
@@ -651,118 +651,128 @@ JS::GCPtr<DOM::Node> BrowsingContext::currently_focused_area()
|
|
|
return candidate;
|
|
|
}
|
|
|
|
|
|
-BrowsingContext* BrowsingContext::choose_a_browsing_context(StringView name, bool)
|
|
|
+
|
|
|
+BrowsingContext::ChosenBrowsingContext BrowsingContext::choose_a_browsing_context(StringView name, bool no_opener)
|
|
|
{
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
JS::GCPtr<BrowsingContext> chosen = nullptr;
|
|
|
|
|
|
-
|
|
|
+
|
|
|
+ auto window_type = WindowType::ExistingOrNone;
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ auto sandboxing_flag_set = active_document()->active_sandboxing_flag_set();
|
|
|
|
|
|
|
|
|
- if (name.is_empty() || name.equals_ignoring_case("_self"sv))
|
|
|
+ if (name.is_empty() || name.equals_ignoring_case("_self"sv)) {
|
|
|
chosen = this;
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if (name.equals_ignoring_case("_parent"sv)) {
|
|
|
+
|
|
|
+
|
|
|
+ else if (name.equals_ignoring_case("_parent"sv)) {
|
|
|
if (auto parent = this->parent())
|
|
|
chosen = parent;
|
|
|
else
|
|
|
chosen = this;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if (name.equals_ignoring_case("_top"sv)) {
|
|
|
+
|
|
|
+
|
|
|
+ else if (name.equals_ignoring_case("_top"sv)) {
|
|
|
chosen = &top_level_browsing_context();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if (!name.equals_ignoring_case("_blank"sv)) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ else if (!name.equals_ignoring_case("_blank"sv)) {
|
|
|
+ dbgln("FIXME: Find matching browser context for name {}", name);
|
|
|
chosen = this;
|
|
|
} else {
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- dbgln("FIXME: Create a new browsing context!");
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ VERIFY(m_page);
|
|
|
+ if (!active_window()->has_transient_activation() && m_page->should_block_pop_ups()) {
|
|
|
+
|
|
|
+ dbgln("Pop-up blocked!");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ else if (sandboxing_flag_set.flags & SandboxingFlagSet::SandboxedAuxiliaryNavigation) {
|
|
|
+
|
|
|
+ dbgln("Pop-up blocked!");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ else if (true) {
|
|
|
+
|
|
|
+ window_type = WindowType::NewAndUnrestricted;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 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) {
|
|
|
+
|
|
|
+ auto* current_document = top_level_browsing_context().active_document();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (!current_document->origin().is_same_origin(current_document->relevant_settings_object().top_level_origin)) {
|
|
|
+ no_opener = true;
|
|
|
+ name = "_blank"sv;
|
|
|
+ window_type = WindowType::NewWithNoOpener;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (no_opener) {
|
|
|
+ chosen = HTML::BrowsingContext::create_a_new_top_level_browsing_context(*m_page);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ else {
|
|
|
+
|
|
|
+
|
|
|
+ chosen = HTML::BrowsingContext::create_a_new_top_level_browsing_context(*m_page);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (!name.equals_ignoring_case("_blank"sv))
|
|
|
+ chosen->set_name(name);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ else if (false) {
|
|
|
+
|
|
|
+ chosen = *this;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ else if (false) {
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
- return chosen;
|
|
|
+ return { chosen, window_type };
|
|
|
}
|
|
|
|
|
|
|