diff options
author | asynts <asynts@gmail.com> | 2020-12-06 19:51:55 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-12-09 21:05:06 +0100 |
commit | 10f9c850902f221f9e4cbc2123cfc107f52d113c (patch) | |
tree | 994b1266f8cbf6e49392da234261e26af51a950f /Libraries/LibWeb/DOM/Range.cpp | |
parent | 4df0eeaa3dba7ec1fa651657435a4754d5cd4108 (diff) | |
download | serenity-10f9c850902f221f9e4cbc2123cfc107f52d113c.zip |
LibWeb: Make DOM::Range more suitable for JS.
Diffstat (limited to 'Libraries/LibWeb/DOM/Range.cpp')
-rw-r--r-- | Libraries/LibWeb/DOM/Range.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/Libraries/LibWeb/DOM/Range.cpp b/Libraries/LibWeb/DOM/Range.cpp new file mode 100644 index 0000000000..94e8162b5a --- /dev/null +++ b/Libraries/LibWeb/DOM/Range.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020, the SerenityOS developers. + * 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/Node.h> +#include <LibWeb/DOM/Range.h> + +namespace Web::DOM { + +Range::Range(Document& document) + : m_start_container(document) + , m_start_offset(0) + , m_end_container(document) + , m_end_offset(0) +{ +} + +Range::Range(Node& start_container, size_t start_offset, Node& end_container, size_t end_offset) + : m_start_container(start_container) + , m_start_offset(start_offset) + , m_end_container(end_container) + , m_end_offset(end_offset) +{ +} + +NonnullRefPtr<Range> Range::clone_range() const +{ + return adopt(*new Range(const_cast<Node&>(*m_start_container), m_start_offset, const_cast<Node&>(*m_end_container), m_end_offset)); +} + +NonnullRefPtr<Range> Range::inverted() const +{ + return adopt(*new Range(const_cast<Node&>(*m_end_container), m_end_offset, const_cast<Node&>(*m_start_container), m_start_offset)); +} + +NonnullRefPtr<Range> Range::normalized() const +{ + if (m_start_container.ptr() == m_end_container.ptr()) { + if (m_start_offset <= m_end_offset) + return clone_range(); + + return inverted(); + } + + if (m_start_container->is_before(m_end_container)) + return clone_range(); + + return inverted(); +} + +} |