diff options
author | Andreas Kling <kling@serenityos.org> | 2021-04-03 11:43:08 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-04-03 11:57:32 +0200 |
commit | dcfc357860a365c190599fca6891d845b61e6a5b (patch) | |
tree | 804b1b60515b50b67acc4f77dfa760fb6c1d964a /Userland/Libraries | |
parent | 8e3e3a71cb20ba4a743cd4ad2dcec49a31f35733 (diff) | |
download | serenity-dcfc357860a365c190599fca6891d845b61e6a5b.zip |
LibWeb: Add a FrameHostElement for frame/iframe common functionality
A FrameHostElement is an HTML element (<frame> or <iframe>) that may
have a content frame that participates in the frame tree.
This basically just moves code from <iframe> to a separate base class
so we can share it with <frame> once we implement <frame>.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r-- | Userland/Libraries/LibWeb/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp | 66 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/FrameHostElement.h | 52 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp | 35 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h | 18 |
5 files changed, 124 insertions, 48 deletions
diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 4f57a2c46b..fc6adc0552 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -64,6 +64,7 @@ set(SOURCES HTML/AttributeNames.cpp HTML/CanvasRenderingContext2D.cpp HTML/EventNames.cpp + HTML/FrameHostElement.cpp HTML/GlobalEventHandlers.cpp HTML/HTMLAnchorElement.cpp HTML/HTMLAreaElement.cpp diff --git a/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp b/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp new file mode 100644 index 0000000000..b4d8a55c17 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/FrameHostElement.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <LibWeb/DOM/Document.h> +#include <LibWeb/DOM/Event.h> +#include <LibWeb/HTML/FrameHostElement.h> +#include <LibWeb/Origin.h> +#include <LibWeb/Page/Frame.h> + +namespace Web::HTML { + +FrameHostElement::FrameHostElement(DOM::Document& document, QualifiedName qualified_name) + : HTMLElement(document, move(qualified_name)) +{ +} + +FrameHostElement::~FrameHostElement() +{ +} + +Origin FrameHostElement::content_origin() const +{ + if (!m_content_frame || !m_content_frame->document()) + return {}; + return m_content_frame->document()->origin(); +} + +bool FrameHostElement::may_access_from_origin(const Origin& origin) const +{ + return origin.is_same(content_origin()); +} + +const DOM::Document* FrameHostElement::content_document() const +{ + return m_content_frame ? m_content_frame->document() : nullptr; +} + +void FrameHostElement::content_frame_did_load(Badge<FrameLoader>) +{ + dispatch_event(DOM::Event::create(EventNames::load)); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/FrameHostElement.h b/Userland/Libraries/LibWeb/HTML/FrameHostElement.h new file mode 100644 index 0000000000..24b6675563 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/FrameHostElement.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include <LibWeb/HTML/HTMLElement.h> + +namespace Web::HTML { + +class FrameHostElement : public HTMLElement { +public: + FrameHostElement(DOM::Document&, QualifiedName); + virtual ~FrameHostElement() override; + + Frame* content_frame() { return m_content_frame; } + const Frame* content_frame() const { return m_content_frame; } + + const DOM::Document* content_document() const; + + Origin content_origin() const; + bool may_access_from_origin(const Origin&) const; + + void content_frame_did_load(Badge<FrameLoader>); + +protected: + RefPtr<Frame> m_content_frame; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp index 06b942e076..c183fa6074 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,25 +24,16 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <LibWeb/Bindings/WindowObject.h> #include <LibWeb/DOM/Document.h> -#include <LibWeb/DOM/Event.h> -#include <LibWeb/DOM/Window.h> -#include <LibWeb/Dump.h> -#include <LibWeb/HTML/EventNames.h> -#include <LibWeb/HTML/HTMLFormElement.h> #include <LibWeb/HTML/HTMLIFrameElement.h> -#include <LibWeb/HTML/Parser/HTMLDocumentParser.h> -#include <LibWeb/InProcessWebView.h> #include <LibWeb/Layout/FrameBox.h> -#include <LibWeb/Loader/ResourceLoader.h> #include <LibWeb/Origin.h> #include <LibWeb/Page/Frame.h> namespace Web::HTML { HTMLIFrameElement::HTMLIFrameElement(DOM::Document& document, QualifiedName qualified_name) - : HTMLElement(document, move(qualified_name)) + : FrameHostElement(document, move(qualified_name)) { VERIFY(document.frame()); m_content_frame = Frame::create_subframe(*this, document.frame()->main_frame()); @@ -81,26 +72,4 @@ void HTMLIFrameElement::load_src(const String& value) m_content_frame->loader().load(url, FrameLoader::Type::IFrame); } -Origin HTMLIFrameElement::content_origin() const -{ - if (!m_content_frame || !m_content_frame->document()) - return {}; - return m_content_frame->document()->origin(); -} - -bool HTMLIFrameElement::may_access_from_origin(const Origin& origin) const -{ - return origin.is_same(content_origin()); -} - -const DOM::Document* HTMLIFrameElement::content_document() const -{ - return m_content_frame ? m_content_frame->document() : nullptr; -} - -void HTMLIFrameElement::content_frame_did_load(Badge<FrameLoader>) -{ - dispatch_event(DOM::Event::create(EventNames::load)); -} - } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h index e3cd3bb882..1039c7d0ed 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLIFrameElement.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,11 +26,11 @@ #pragma once -#include <LibWeb/HTML/HTMLElement.h> +#include <LibWeb/HTML/FrameHostElement.h> namespace Web::HTML { -class HTMLIFrameElement final : public HTMLElement { +class HTMLIFrameElement final : public FrameHostElement { public: using WrapperType = Bindings::HTMLIFrameElementWrapper; @@ -39,22 +39,10 @@ public: virtual RefPtr<Layout::Node> create_layout_node() override; - Frame* content_frame() { return m_content_frame; } - const Frame* content_frame() const { return m_content_frame; } - - const DOM::Document* content_document() const; - - Origin content_origin() const; - bool may_access_from_origin(const Origin&) const; - - void content_frame_did_load(Badge<FrameLoader>); - private: virtual void parse_attribute(const FlyString& name, const String& value) override; void load_src(const String&); - - RefPtr<Frame> m_content_frame; }; } |