LibWeb: Add Document.createRange()
Also tidy up DOM::Range a little bit while we're here, and unify the way we create them to use a delegating constructors.
This commit is contained in:
parent
ff018607a1
commit
9194a97cbe
Notes:
sideshowbarker
2024-07-18 22:01:22 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/9194a97cbeb
6 changed files with 42 additions and 21 deletions
|
@ -1093,10 +1093,12 @@ void generate_prototype_implementation(const IDL::Interface& interface)
|
||||||
#include <LibWeb/Bindings/ImageDataWrapper.h>
|
#include <LibWeb/Bindings/ImageDataWrapper.h>
|
||||||
#include <LibWeb/Bindings/NodeWrapperFactory.h>
|
#include <LibWeb/Bindings/NodeWrapperFactory.h>
|
||||||
#include <LibWeb/Bindings/PerformanceTimingWrapper.h>
|
#include <LibWeb/Bindings/PerformanceTimingWrapper.h>
|
||||||
|
#include <LibWeb/Bindings/RangeWrapper.h>
|
||||||
#include <LibWeb/Bindings/TextWrapper.h>
|
#include <LibWeb/Bindings/TextWrapper.h>
|
||||||
#include <LibWeb/Bindings/WindowObject.h>
|
#include <LibWeb/Bindings/WindowObject.h>
|
||||||
#include <LibWeb/DOM/Element.h>
|
#include <LibWeb/DOM/Element.h>
|
||||||
#include <LibWeb/DOM/EventListener.h>
|
#include <LibWeb/DOM/EventListener.h>
|
||||||
|
#include <LibWeb/DOM/Range.h>
|
||||||
#include <LibWeb/DOM/Window.h>
|
#include <LibWeb/DOM/Window.h>
|
||||||
#include <LibWeb/HTML/EventHandler.h>
|
#include <LibWeb/HTML/EventHandler.h>
|
||||||
#include <LibWeb/HTML/HTMLElement.h>
|
#include <LibWeb/HTML/HTMLElement.h>
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include <LibWeb/DOM/ElementFactory.h>
|
#include <LibWeb/DOM/ElementFactory.h>
|
||||||
#include <LibWeb/DOM/Event.h>
|
#include <LibWeb/DOM/Event.h>
|
||||||
#include <LibWeb/DOM/ExceptionOr.h>
|
#include <LibWeb/DOM/ExceptionOr.h>
|
||||||
|
#include <LibWeb/DOM/Range.h>
|
||||||
#include <LibWeb/DOM/Text.h>
|
#include <LibWeb/DOM/Text.h>
|
||||||
#include <LibWeb/DOM/Window.h>
|
#include <LibWeb/DOM/Window.h>
|
||||||
#include <LibWeb/Dump.h>
|
#include <LibWeb/Dump.h>
|
||||||
|
@ -587,6 +588,11 @@ NonnullRefPtr<Comment> Document::create_comment(const String& data)
|
||||||
return adopt(*new Comment(*this, data));
|
return adopt(*new Comment(*this, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NonnullRefPtr<Range> Document::create_range()
|
||||||
|
{
|
||||||
|
return Range::create(*this);
|
||||||
|
}
|
||||||
|
|
||||||
void Document::set_pending_parsing_blocking_script(Badge<HTML::HTMLScriptElement>, HTML::HTMLScriptElement* script)
|
void Document::set_pending_parsing_blocking_script(Badge<HTML::HTMLScriptElement>, HTML::HTMLScriptElement* script)
|
||||||
{
|
{
|
||||||
m_pending_parsing_blocking_script = script;
|
m_pending_parsing_blocking_script = script;
|
||||||
|
|
|
@ -162,6 +162,7 @@ public:
|
||||||
NonnullRefPtr<DocumentFragment> create_document_fragment();
|
NonnullRefPtr<DocumentFragment> create_document_fragment();
|
||||||
NonnullRefPtr<Text> create_text_node(const String& data);
|
NonnullRefPtr<Text> create_text_node(const String& data);
|
||||||
NonnullRefPtr<Comment> create_comment(const String& data);
|
NonnullRefPtr<Comment> create_comment(const String& data);
|
||||||
|
NonnullRefPtr<Range> create_range();
|
||||||
|
|
||||||
void set_pending_parsing_blocking_script(Badge<HTML::HTMLScriptElement>, HTML::HTMLScriptElement*);
|
void set_pending_parsing_blocking_script(Badge<HTML::HTMLScriptElement>, HTML::HTMLScriptElement*);
|
||||||
HTML::HTMLScriptElement* pending_parsing_blocking_script() { return m_pending_parsing_blocking_script; }
|
HTML::HTMLScriptElement* pending_parsing_blocking_script() { return m_pending_parsing_blocking_script; }
|
||||||
|
|
|
@ -27,6 +27,7 @@ interface Document : Node {
|
||||||
DocumentFragment createDocumentFragment();
|
DocumentFragment createDocumentFragment();
|
||||||
Text createTextNode(DOMString data);
|
Text createTextNode(DOMString data);
|
||||||
Comment createComment(DOMString data);
|
Comment createComment(DOMString data);
|
||||||
|
Range createRange();
|
||||||
|
|
||||||
readonly attribute DOMString compatMode;
|
readonly attribute DOMString compatMode;
|
||||||
readonly attribute DocumentType? doctype;
|
readonly attribute DocumentType? doctype;
|
||||||
|
|
|
@ -31,11 +31,27 @@
|
||||||
|
|
||||||
namespace Web::DOM {
|
namespace Web::DOM {
|
||||||
|
|
||||||
Range::Range(Window& window)
|
NonnullRefPtr<Range> Range::create(Window& window)
|
||||||
: m_start_container(window.document())
|
{
|
||||||
, m_start_offset(0)
|
return Range::create(window.document());
|
||||||
, m_end_container(window.document())
|
}
|
||||||
, m_end_offset(0)
|
|
||||||
|
NonnullRefPtr<Range> Range::create(Document& document)
|
||||||
|
{
|
||||||
|
return adopt(*new Range(document));
|
||||||
|
}
|
||||||
|
|
||||||
|
NonnullRefPtr<Range> Range::create(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset)
|
||||||
|
{
|
||||||
|
return adopt(*new Range(start_container, start_offset, end_container, end_offset));
|
||||||
|
}
|
||||||
|
NonnullRefPtr<Range> Range::create_with_global_object(Bindings::WindowObject& window)
|
||||||
|
{
|
||||||
|
return Range::create(window.impl());
|
||||||
|
}
|
||||||
|
|
||||||
|
Range::Range(Document& document)
|
||||||
|
: Range(document, 0, document, 0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,28 +39,22 @@ class Range final
|
||||||
public:
|
public:
|
||||||
using WrapperType = Bindings::RangeWrapper;
|
using WrapperType = Bindings::RangeWrapper;
|
||||||
|
|
||||||
static NonnullRefPtr<Range> create(Window& window)
|
static NonnullRefPtr<Range> create(Document&);
|
||||||
{
|
static NonnullRefPtr<Range> create(Window&);
|
||||||
return adopt(*new Range(window));
|
static NonnullRefPtr<Range> create(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset);
|
||||||
}
|
static NonnullRefPtr<Range> create_with_global_object(Bindings::WindowObject&);
|
||||||
static NonnullRefPtr<Range> create(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset)
|
|
||||||
{
|
|
||||||
return adopt(*new Range(start_container, start_offset, end_container, end_offset));
|
|
||||||
}
|
|
||||||
static NonnullRefPtr<Range> create_with_global_object(Bindings::WindowObject& window)
|
|
||||||
{
|
|
||||||
return Range::create(window.impl());
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: There are a ton of methods missing here.
|
// FIXME: There are a ton of methods missing here.
|
||||||
|
|
||||||
Node* start_container() { return m_start_container; }
|
Node* start_container() { return m_start_container; }
|
||||||
unsigned start_offset() { return m_start_offset; }
|
const Node* start_container() const { return m_start_container; }
|
||||||
|
unsigned start_offset() const { return m_start_offset; }
|
||||||
|
|
||||||
Node* end_container() { return m_end_container; }
|
Node* end_container() { return m_end_container; }
|
||||||
unsigned end_offset() { return m_end_offset; }
|
const Node* end_container() const { return m_end_container; }
|
||||||
|
unsigned end_offset() const { return m_end_offset; }
|
||||||
|
|
||||||
bool collapsed()
|
bool collapsed() const
|
||||||
{
|
{
|
||||||
return start_container() == end_container() && start_offset() == end_offset();
|
return start_container() == end_container() && start_offset() == end_offset();
|
||||||
}
|
}
|
||||||
|
@ -82,7 +76,8 @@ public:
|
||||||
NonnullRefPtr<Range> clone_range() const;
|
NonnullRefPtr<Range> clone_range() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit Range(Window&);
|
explicit Range(Document&);
|
||||||
|
|
||||||
Range(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset);
|
Range(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset);
|
||||||
|
|
||||||
NonnullRefPtr<Node> m_start_container;
|
NonnullRefPtr<Node> m_start_container;
|
||||||
|
|
Loading…
Add table
Reference in a new issue