From 7382b27c220327470a84a2e920277be93224a6d3 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 7 Apr 2020 22:56:13 +0200 Subject: LibWeb: Add Origin concept (protocol, host, port tuple) Every Document now has an Origin, found via Document::origin(). It's based on the URL of the document. This will be used to implement things like the same-origin policy. --- Libraries/LibWeb/DOM/Document.cpp | 11 ++++++- Libraries/LibWeb/DOM/Document.h | 4 ++- Libraries/LibWeb/Forward.h | 1 + Libraries/LibWeb/HtmlView.cpp | 3 +- Libraries/LibWeb/Origin.h | 55 ++++++++++++++++++++++++++++++++++ Libraries/LibWeb/Parser/HTMLParser.cpp | 3 +- 6 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 Libraries/LibWeb/Origin.h diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 43c881ce8f..6162deaac2 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -52,14 +52,16 @@ #include #include #include +#include #include #include namespace Web { -Document::Document() +Document::Document(const URL& url) : ParentNode(*this, NodeType::DOCUMENT_NODE) , m_style_resolver(make(*this)) + , m_url(url) , m_window(Window::create_with_document(*this)) { m_style_update_timer = Core::Timer::create_single_shot(0, [this] { @@ -71,6 +73,13 @@ Document::~Document() { } +Origin Document::origin() const +{ + if (!m_url.is_valid()) + return {}; + return { m_url.protocol(), m_url.host(), m_url.port() }; +} + void Document::schedule_style_update() { if (m_style_update_timer->is_active()) diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 18110088ad..66161a8742 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -48,12 +48,14 @@ class Document public: using WrapperType = Bindings::DocumentWrapper; - Document(); + explicit Document(const URL& = {}); virtual ~Document() override; void set_url(const URL& url) { m_url = url; } const URL& url() const { return m_url; } + Origin origin() const; + URL complete_url(const String&) const; void fixup(); diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index 230c112208..8322c32b85 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -45,6 +45,7 @@ class LayoutDocument; class LayoutNode; class MouseEvent; class Node; +class Origin; class Selector; class StyleResolver; class StyleRule; diff --git a/Libraries/LibWeb/HtmlView.cpp b/Libraries/LibWeb/HtmlView.cpp index 60c177c569..34f45597ba 100644 --- a/Libraries/LibWeb/HtmlView.cpp +++ b/Libraries/LibWeb/HtmlView.cpp @@ -315,8 +315,7 @@ void HtmlView::reload() static RefPtr create_image_document(const ByteBuffer& data, const URL& url) { - auto document = adopt(*new Document); - document->set_url(url); + auto document = adopt(*new Document(url)); auto bitmap = Gfx::load_png_from_memory(data.data(), data.size()); ASSERT(bitmap); diff --git a/Libraries/LibWeb/Origin.h b/Libraries/LibWeb/Origin.h new file mode 100644 index 0000000000..5ec3d12a3d --- /dev/null +++ b/Libraries/LibWeb/Origin.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020, Andreas Kling + * 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 + +namespace Web { + +class Origin { +public: + Origin() {} + Origin(const String& protocol, const String& host, u16 port) + : m_protocol(protocol) + , m_host(host) + , m_port(port) + { + } + + bool is_null() const { return m_protocol.is_null() && m_host.is_null() && !m_port; } + + const String& protocol() const { return m_protocol; } + const String& host() const { return m_host; } + u16 port() const { return m_port; } + +private: + String m_protocol; + String m_host; + u16 m_port { 0 }; +}; + +} diff --git a/Libraries/LibWeb/Parser/HTMLParser.cpp b/Libraries/LibWeb/Parser/HTMLParser.cpp index 359121ab46..91afd58f50 100644 --- a/Libraries/LibWeb/Parser/HTMLParser.cpp +++ b/Libraries/LibWeb/Parser/HTMLParser.cpp @@ -386,8 +386,7 @@ RefPtr parse_html_fragment(Document& document, const StringVie RefPtr parse_html_document(const StringView& html, const URL& url) { - auto document = adopt(*new Document); - document->set_url(url); + auto document = adopt(*new Document(url)); document->set_source(html); if (!parse_html_document(html, *document, *document)) -- cgit v1.2.3