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.
This commit is contained in:
Andreas Kling 2020-04-07 22:56:13 +02:00
parent 53f63058b9
commit 7382b27c22
Notes: sideshowbarker 2024-07-19 07:49:11 +09:00
6 changed files with 71 additions and 6 deletions

View file

@ -52,14 +52,16 @@
#include <LibWeb/HtmlView.h>
#include <LibWeb/Layout/LayoutDocument.h>
#include <LibWeb/Layout/LayoutTreeBuilder.h>
#include <LibWeb/Origin.h>
#include <LibWeb/Parser/CSSParser.h>
#include <stdio.h>
namespace Web {
Document::Document()
Document::Document(const URL& url)
: ParentNode(*this, NodeType::DOCUMENT_NODE)
, m_style_resolver(make<StyleResolver>(*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())

View file

@ -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();

View file

@ -45,6 +45,7 @@ class LayoutDocument;
class LayoutNode;
class MouseEvent;
class Node;
class Origin;
class Selector;
class StyleResolver;
class StyleRule;

View file

@ -315,8 +315,7 @@ void HtmlView::reload()
static RefPtr<Document> 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);

55
Libraries/LibWeb/Origin.h Normal file
View file

@ -0,0 +1,55 @@
/*
* Copyright (c) 2020, 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 <AK/String.h>
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 };
};
}

View file

@ -386,8 +386,7 @@ RefPtr<DocumentFragment> parse_html_fragment(Document& document, const StringVie
RefPtr<Document> 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))