1/*
2 * Copyright (C) 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2012 Google Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
15 * its contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#pragma once
31
32#include "DOMWindowProperty.h"
33#include "ExceptionOr.h"
34#include <wtf/Forward.h>
35#include <wtf/RefCounted.h>
36#include <wtf/RefPtr.h>
37
38namespace WebCore {
39
40class Node;
41class Position;
42class Range;
43class VisibleSelection;
44
45class DOMSelection : public RefCounted<DOMSelection>, public DOMWindowProperty {
46public:
47 static Ref<DOMSelection> create(DOMWindow& window) { return adoptRef(*new DOMSelection(window)); }
48
49 Node* baseNode() const;
50 Node* extentNode() const;
51 unsigned baseOffset() const;
52 unsigned extentOffset() const;
53 String type() const;
54 void setBaseAndExtent(Node* baseNode, unsigned baseOffset, Node* extentNode, unsigned extentOffset);
55 void setPosition(Node*, unsigned offset);
56 void modify(const String& alter, const String& direction, const String& granularity);
57
58 // The anchor and focus are the start and end of the selection, and
59 // reflect the direction in which the selection was made by the user.
60 // The base and extent are different, because they don't reflect expansion.
61 Node* anchorNode() const;
62 unsigned anchorOffset() const;
63 Node* focusNode() const;
64 unsigned focusOffset() const;
65 bool isCollapsed() const;
66 unsigned rangeCount() const;
67 void collapse(Node*, unsigned offset);
68 ExceptionOr<void> collapseToEnd();
69 ExceptionOr<void> collapseToStart();
70 ExceptionOr<void> extend(Node&, unsigned offset);
71 ExceptionOr<Ref<Range>> getRangeAt(unsigned);
72 void removeAllRanges();
73 void addRange(Range&);
74 void deleteFromDocument();
75 bool containsNode(Node&, bool partlyContained) const;
76 void selectAllChildren(Node&);
77
78 String toString();
79
80 void empty();
81
82private:
83 explicit DOMSelection(DOMWindow&);
84
85 // Convenience method for accessors, caller must null-check frame().
86 const VisibleSelection& visibleSelection() const;
87
88 Node* shadowAdjustedNode(const Position&) const;
89 unsigned shadowAdjustedOffset(const Position&) const;
90
91 bool isValidForPosition(Node*) const;
92};
93
94} // namespace WebCore
95