2021-04-03 11:43:08 +02:00
/*
* Copyright ( c ) 2020 - 2021 , Andreas Kling < kling @ serenityos . org >
2022-02-14 22:03:16 +00:00
* Copyright ( c ) 2022 , Linus Groh < linusg @ serenityos . org >
2021-04-03 11:43:08 +02:00
*
2021-04-22 01:24:48 -07:00
* SPDX - License - Identifier : BSD - 2 - Clause
2021-04-03 11:43:08 +02:00
*/
# include <LibWeb/DOM/Document.h>
# include <LibWeb/DOM/Event.h>
2021-11-18 15:01:28 +01:00
# include <LibWeb/HTML/BrowsingContext.h>
2021-05-31 13:59:28 +01:00
# include <LibWeb/HTML/BrowsingContextContainer.h>
2022-07-12 20:37:43 +01:00
# include <LibWeb/HTML/Origin.h>
2021-09-12 02:10:43 +02:00
# include <LibWeb/Page/Page.h>
2021-04-03 11:43:08 +02:00
namespace Web : : HTML {
2022-02-18 21:00:52 +01:00
BrowsingContextContainer : : BrowsingContextContainer ( DOM : : Document & document , DOM : : QualifiedName qualified_name )
2021-04-03 11:43:08 +02:00
: HTMLElement ( document , move ( qualified_name ) )
{
}
2022-03-14 13:21:51 -06:00
BrowsingContextContainer : : ~ BrowsingContextContainer ( ) = default ;
2021-04-03 11:43:08 +02:00
2022-03-23 20:13:34 -04:00
// https://html.spec.whatwg.org/multipage/browsers.html#creating-a-new-nested-browsing-context
void BrowsingContextContainer : : create_new_nested_browsing_context ( )
2021-04-03 16:45:14 +02:00
{
2022-03-23 20:13:34 -04:00
// 1. Let group be element's node document's browsing context's top-level browsing context's group.
// FIXME: We do not have a concept of "browsing context groups" yet.
auto * group = document ( ) . browsing_context ( ) ;
if ( ! group )
2021-04-03 16:45:14 +02:00
return ;
2022-03-23 20:13:34 -04:00
VERIFY ( group - > page ( ) ) ;
// 2. Let browsingContext be the result of creating a new browsing context with element's node document, element, and group.
// 3. Set element's nested browsing context to browsingContext.
m_nested_browsing_context = BrowsingContext : : create_nested ( * group - > page ( ) , * this ) ;
group - > append_child ( * m_nested_browsing_context ) ;
m_nested_browsing_context - > set_frame_nesting_levels ( group - > frame_nesting_levels ( ) ) ;
m_nested_browsing_context - > register_frame_nesting ( document ( ) . url ( ) ) ;
// 4. If element has a name attribute, then set browsingContext's name to the value of this attribute.
if ( auto name = attribute ( HTML : : AttributeNames : : name ) ; ! name . is_empty ( ) )
m_nested_browsing_context - > set_name ( name ) ;
2021-04-03 16:45:14 +02:00
}
2022-03-23 20:13:34 -04:00
// https://html.spec.whatwg.org/multipage/window-object.html#a-browsing-context-is-discarded
void BrowsingContextContainer : : discard_nested_browsing_context ( )
2022-03-09 18:10:32 +01:00
{
2022-03-23 20:13:34 -04:00
// 1. Discard all Document objects for all the entries in browsingContext's session history.
2022-03-09 18:10:32 +01:00
if ( m_nested_browsing_context & & m_nested_browsing_context - > parent ( ) )
m_nested_browsing_context - > parent ( ) - > remove_child ( * m_nested_browsing_context ) ;
2022-03-23 20:13:34 -04:00
// 2. If browsingContext is a top-level browsing context, then remove browsingContext.
// NOTE: We skip this here because this is by definition a nested browsing context, not top-level.
2022-03-09 18:10:32 +01:00
}
2022-02-14 22:03:16 +00:00
// https://html.spec.whatwg.org/multipage/browsers.html#concept-bcc-content-document
const DOM : : Document * BrowsingContextContainer : : content_document ( ) const
2021-04-03 11:43:08 +02:00
{
2022-02-14 22:03:16 +00:00
// 1. If container's nested browsing context is null, then return null.
if ( m_nested_browsing_context = = nullptr )
return nullptr ;
2021-04-03 11:43:08 +02:00
2022-02-14 22:03:16 +00:00
// 2. Let context be container's nested browsing context.
auto const & context = * m_nested_browsing_context ;
2021-04-03 11:43:08 +02:00
2022-02-14 22:03:16 +00:00
// 3. Let document be context's active document.
auto const * document = context . active_document ( ) ;
2022-03-23 20:13:34 -04:00
// FIXME: This should not be here, as we're expected to have a document at this point.
2022-03-20 18:41:03 +01:00
if ( ! document )
return nullptr ;
2022-02-14 22:03:16 +00:00
VERIFY ( document ) ;
VERIFY ( m_document ) ;
// 4. If document's origin and container's node document's origin are not same origin-domain, then return null.
if ( ! document - > origin ( ) . is_same_origin_domain ( m_document - > origin ( ) ) )
return nullptr ;
// 5. Return document.
return document ;
2021-04-03 11:43:08 +02:00
}
2022-02-16 22:51:25 +00:00
DOM : : Document const * BrowsingContextContainer : : content_document_without_origin_check ( ) const
{
if ( ! m_nested_browsing_context )
return nullptr ;
return m_nested_browsing_context - > active_document ( ) ;
}
2022-03-24 22:08:06 +02:00
// https://html.spec.whatwg.org/multipage/embedded-content-other.html#dom-media-getsvgdocument
const DOM : : Document * BrowsingContextContainer : : get_svg_document ( ) const
{
// 1. Let document be this element's content document.
auto const * document = content_document ( ) ;
// 2. If document is non-null and was created by the page load processing model for XML files section because the computed type of the resource in the navigate algorithm was image/svg+xml, then return document.
if ( document & & document - > content_type ( ) = = " image/svg+xml " sv )
return document ;
// 3. Return null.
return nullptr ;
}
2021-04-03 11:43:08 +02:00
}