| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
| 3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
| 4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
| 5 * 2000 Simon Hausmann <hausmann@kde.org> | 5 * 2000 Simon Hausmann <hausmann@kde.org> |
| 6 * 2000 Stefan Schimanski <1Stein@gmx.de> | 6 * 2000 Stefan Schimanski <1Stein@gmx.de> |
| 7 * 2001 George Staikos <staikos@kde.org> | 7 * 2001 George Staikos <staikos@kde.org> |
| 8 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 8 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
| 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> | 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> |
| 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 m_script.updateDocument(); | 276 m_script.updateDocument(); |
| 277 } | 277 } |
| 278 | 278 |
| 279 Settings* Frame::settings() const | 279 Settings* Frame::settings() const |
| 280 { | 280 { |
| 281 return m_page ? m_page->settings() : 0; | 281 return m_page ? m_page->settings() : 0; |
| 282 } | 282 } |
| 283 | 283 |
| 284 String Frame::selectedText() const | 284 String Frame::selectedText() const |
| 285 { | 285 { |
| 286 return plainText(selection()->toRange().get()); | 286 return plainText(selection()->toNormalizedRange().get()); |
| 287 } | 287 } |
| 288 | 288 |
| 289 IntRect Frame::firstRectForRange(Range* range) const | 289 IntRect Frame::firstRectForRange(Range* range) const |
| 290 { | 290 { |
| 291 int extraWidthToEndOfLine = 0; | 291 int extraWidthToEndOfLine = 0; |
| 292 ExceptionCode ec = 0; | 292 ExceptionCode ec = 0; |
| 293 ASSERT(range->startContainer(ec)); | 293 ASSERT(range->startContainer(ec)); |
| 294 ASSERT(range->endContainer(ec)); | 294 ASSERT(range->endContainer(ec)); |
| 295 | 295 |
| 296 InlineBox* startInlineBox; | 296 InlineBox* startInlineBox; |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 m_doc->updateStyleSelector(); | 835 m_doc->updateStyleSelector(); |
| 836 } | 836 } |
| 837 | 837 |
| 838 bool Frame::shouldChangeSelection(const Selection& newSelection) const | 838 bool Frame::shouldChangeSelection(const Selection& newSelection) const |
| 839 { | 839 { |
| 840 return shouldChangeSelection(selection()->selection(), newSelection, newSele
ction.affinity(), false); | 840 return shouldChangeSelection(selection()->selection(), newSelection, newSele
ction.affinity(), false); |
| 841 } | 841 } |
| 842 | 842 |
| 843 bool Frame::shouldChangeSelection(const Selection& oldSelection, const Selection
& newSelection, EAffinity affinity, bool stillSelecting) const | 843 bool Frame::shouldChangeSelection(const Selection& oldSelection, const Selection
& newSelection, EAffinity affinity, bool stillSelecting) const |
| 844 { | 844 { |
| 845 return editor()->client()->shouldChangeSelectedRange(oldSelection.toRange().
get(), newSelection.toRange().get(), | 845 return editor()->client()->shouldChangeSelectedRange(oldSelection.toNormaliz
edRange().get(), newSelection.toNormalizedRange().get(), |
| 846 affinity, stillSelectin
g); | 846 affinity, stillSelectin
g); |
| 847 } | 847 } |
| 848 | 848 |
| 849 bool Frame::shouldDeleteSelection(const Selection& selection) const | 849 bool Frame::shouldDeleteSelection(const Selection& selection) const |
| 850 { | 850 { |
| 851 return editor()->client()->shouldDeleteRange(selection.toRange().get()); | 851 return editor()->client()->shouldDeleteRange(selection.toNormalizedRange().g
et()); |
| 852 } | 852 } |
| 853 | 853 |
| 854 bool Frame::isContentEditable() const | 854 bool Frame::isContentEditable() const |
| 855 { | 855 { |
| 856 if (m_editor.clientIsEditable()) | 856 if (m_editor.clientIsEditable()) |
| 857 return true; | 857 return true; |
| 858 if (!m_doc) | 858 if (!m_doc) |
| 859 return false; | 859 return false; |
| 860 return m_doc->inDesignMode(); | 860 return m_doc->inDesignMode(); |
| 861 } | 861 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 PassRefPtr<CSSComputedStyleDeclaration> Frame::selectionComputedStyle(Node*& nod
eToRemove) const | 953 PassRefPtr<CSSComputedStyleDeclaration> Frame::selectionComputedStyle(Node*& nod
eToRemove) const |
| 954 { | 954 { |
| 955 nodeToRemove = 0; | 955 nodeToRemove = 0; |
| 956 | 956 |
| 957 if (!document()) | 957 if (!document()) |
| 958 return 0; | 958 return 0; |
| 959 | 959 |
| 960 if (selection()->isNone()) | 960 if (selection()->isNone()) |
| 961 return 0; | 961 return 0; |
| 962 | 962 |
| 963 RefPtr<Range> range(selection()->toRange()); | 963 RefPtr<Range> range(selection()->toNormalizedRange()); |
| 964 Position pos = range->editingStartPosition(); | 964 Position pos = range->editingStartPosition(); |
| 965 | 965 |
| 966 Element *elem = pos.element(); | 966 Element *elem = pos.element(); |
| 967 if (!elem) | 967 if (!elem) |
| 968 return 0; | 968 return 0; |
| 969 | 969 |
| 970 RefPtr<Element> styleElement = elem; | 970 RefPtr<Element> styleElement = elem; |
| 971 ExceptionCode ec = 0; | 971 ExceptionCode ec = 0; |
| 972 | 972 |
| 973 if (m_typingStyle) { | 973 if (m_typingStyle) { |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 IntRect selectionRect = root->selectionBounds(clipToVisibleContent); | 1200 IntRect selectionRect = root->selectionBounds(clipToVisibleContent); |
| 1201 return clipToVisibleContent ? intersection(selectionRect, view->visibleConte
ntRect()) : selectionRect; | 1201 return clipToVisibleContent ? intersection(selectionRect, view->visibleConte
ntRect()) : selectionRect; |
| 1202 } | 1202 } |
| 1203 | 1203 |
| 1204 void Frame::selectionTextRects(Vector<FloatRect>& rects, bool clipToVisibleConte
nt) const | 1204 void Frame::selectionTextRects(Vector<FloatRect>& rects, bool clipToVisibleConte
nt) const |
| 1205 { | 1205 { |
| 1206 RenderView* root = contentRenderer(); | 1206 RenderView* root = contentRenderer(); |
| 1207 if (!root) | 1207 if (!root) |
| 1208 return; | 1208 return; |
| 1209 | 1209 |
| 1210 RefPtr<Range> selectedRange = selection()->toRange(); | 1210 RefPtr<Range> selectedRange = selection()->toNormalizedRange(); |
| 1211 | 1211 |
| 1212 Vector<IntRect> intRects; | 1212 Vector<IntRect> intRects; |
| 1213 selectedRange->addLineBoxRects(intRects, true); | 1213 selectedRange->addLineBoxRects(intRects, true); |
| 1214 | 1214 |
| 1215 unsigned size = intRects.size(); | 1215 unsigned size = intRects.size(); |
| 1216 FloatRect visibleContentRect = m_view->visibleContentRect(); | 1216 FloatRect visibleContentRect = m_view->visibleContentRect(); |
| 1217 for (unsigned i = 0; i < size; ++i) | 1217 for (unsigned i = 0; i < size; ++i) |
| 1218 if (clipToVisibleContent) | 1218 if (clipToVisibleContent) |
| 1219 rects.append(intersection(intRects[i], visibleContentRect)); | 1219 rects.append(intersection(intRects[i], visibleContentRect)); |
| 1220 else | 1220 else |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1254 if (n->hasTagName(formTag)) | 1254 if (n->hasTagName(formTag)) |
| 1255 return static_cast<HTMLFormElement*>(n); | 1255 return static_cast<HTMLFormElement*>(n); |
| 1256 else if (n->isHTMLElement() && static_cast<Element*>(n)->isFormControlEl
ement()) | 1256 else if (n->isHTMLElement() && static_cast<Element*>(n)->isFormControlEl
ement()) |
| 1257 return static_cast<HTMLFormControlElement*>(n)->form(); | 1257 return static_cast<HTMLFormControlElement*>(n)->form(); |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 // try walking forward in the node tree to find a form element | 1260 // try walking forward in the node tree to find a form element |
| 1261 return start ? scanForForm(start) : 0; | 1261 return start ? scanForForm(start) : 0; |
| 1262 } | 1262 } |
| 1263 | 1263 |
| 1264 // FIXME: should this go in SelectionController? | |
| 1265 void Frame::revealSelection(const RenderLayer::ScrollAlignment& alignment) const | 1264 void Frame::revealSelection(const RenderLayer::ScrollAlignment& alignment) const |
| 1266 { | 1265 { |
| 1267 IntRect rect; | 1266 IntRect rect; |
| 1268 | 1267 |
| 1269 switch (selection()->state()) { | 1268 switch (selection()->selectionType()) { |
| 1270 case Selection::NONE: | 1269 case Selection::NoSelection: |
| 1271 return; | 1270 return; |
| 1272 | 1271 case Selection::CaretSelection: |
| 1273 case Selection::CARET: | |
| 1274 rect = selection()->absoluteCaretBounds(); | 1272 rect = selection()->absoluteCaretBounds(); |
| 1275 break; | 1273 break; |
| 1276 | 1274 case Selection::RangeSelection: |
| 1277 case Selection::RANGE: | |
| 1278 rect = enclosingIntRect(selectionBounds(false)); | 1275 rect = enclosingIntRect(selectionBounds(false)); |
| 1279 break; | 1276 break; |
| 1280 } | 1277 } |
| 1281 | 1278 |
| 1282 Position start = selection()->start(); | 1279 Position start = selection()->start(); |
| 1283 | |
| 1284 ASSERT(start.node()); | 1280 ASSERT(start.node()); |
| 1285 if (start.node() && start.node()->renderer()) { | 1281 if (start.node() && start.node()->renderer()) { |
| 1286 // FIXME: This code only handles scrolling the startContainer's layer, b
ut | 1282 // FIXME: This code only handles scrolling the startContainer's layer, b
ut |
| 1287 // the selection rect could intersect more than just that. | 1283 // the selection rect could intersect more than just that. |
| 1288 // See <rdar://problem/4799899>. | 1284 // See <rdar://problem/4799899>. |
| 1289 if (RenderLayer *layer = start.node()->renderer()->enclosingLayer()) | 1285 if (RenderLayer* layer = start.node()->renderer()->enclosingLayer()) |
| 1290 layer->scrollRectToVisible(rect, false, alignment, alignment); | 1286 layer->scrollRectToVisible(rect, false, alignment, alignment); |
| 1291 } | 1287 } |
| 1292 } | 1288 } |
| 1293 | 1289 |
| 1294 void Frame::revealCaret(const RenderLayer::ScrollAlignment& alignment) const | 1290 void Frame::revealCaret(const RenderLayer::ScrollAlignment& alignment) const |
| 1295 { | 1291 { |
| 1296 if (selection()->isNone()) | 1292 if (selection()->isNone()) |
| 1297 return; | 1293 return; |
| 1298 | 1294 |
| 1299 Position extent = selection()->extent(); | 1295 Position extent = selection()->extent(); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1424 if (forward) | 1420 if (forward) |
| 1425 searchRange->setEnd(shadowTreeRoot, shadowTreeRoot->childNodeCount()
, ec); | 1421 searchRange->setEnd(shadowTreeRoot, shadowTreeRoot->childNodeCount()
, ec); |
| 1426 else | 1422 else |
| 1427 searchRange->setStart(shadowTreeRoot, 0, ec); | 1423 searchRange->setStart(shadowTreeRoot, 0, ec); |
| 1428 } | 1424 } |
| 1429 | 1425 |
| 1430 RefPtr<Range> resultRange(findPlainText(searchRange.get(), target, forward,
caseFlag)); | 1426 RefPtr<Range> resultRange(findPlainText(searchRange.get(), target, forward,
caseFlag)); |
| 1431 // If we started in the selection and the found range exactly matches the ex
isting selection, find again. | 1427 // If we started in the selection and the found range exactly matches the ex
isting selection, find again. |
| 1432 // Build a selection with the found range to remove collapsed whitespace. | 1428 // Build a selection with the found range to remove collapsed whitespace. |
| 1433 // Compare ranges instead of selection objects to ignore the way that the cu
rrent selection was made. | 1429 // Compare ranges instead of selection objects to ignore the way that the cu
rrent selection was made. |
| 1434 if (startInSelection && *Selection(resultRange.get()).toRange() == *selectio
n.toRange()) { | 1430 if (startInSelection && *Selection(resultRange.get()).toNormalizedRange() ==
*selection.toNormalizedRange()) { |
| 1435 searchRange = rangeOfContents(document()); | 1431 searchRange = rangeOfContents(document()); |
| 1436 if (forward) | 1432 if (forward) |
| 1437 setStart(searchRange.get(), selection.visibleEnd()); | 1433 setStart(searchRange.get(), selection.visibleEnd()); |
| 1438 else | 1434 else |
| 1439 setEnd(searchRange.get(), selection.visibleStart()); | 1435 setEnd(searchRange.get(), selection.visibleStart()); |
| 1440 | 1436 |
| 1441 if (shadowTreeRoot) { | 1437 if (shadowTreeRoot) { |
| 1442 ExceptionCode ec = 0; | 1438 ExceptionCode ec = 0; |
| 1443 if (forward) | 1439 if (forward) |
| 1444 searchRange->setEnd(shadowTreeRoot, shadowTreeRoot->childNodeCou
nt(), ec); | 1440 searchRange->setEnd(shadowTreeRoot, shadowTreeRoot->childNodeCou
nt(), ec); |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1738 if (isContinuousGrammarCheckingEnabled) { | 1734 if (isContinuousGrammarCheckingEnabled) { |
| 1739 Selection oldSelectedSentence = Selection(startOfSentenc
e(oldStart), endOfSentence(oldStart)); | 1735 Selection oldSelectedSentence = Selection(startOfSentenc
e(oldStart), endOfSentence(oldStart)); |
| 1740 if (oldSelectedSentence != newSelectedSentence) | 1736 if (oldSelectedSentence != newSelectedSentence) |
| 1741 editor()->markBadGrammar(oldSelectedSentence); | 1737 editor()->markBadGrammar(oldSelectedSentence); |
| 1742 } | 1738 } |
| 1743 } | 1739 } |
| 1744 } | 1740 } |
| 1745 | 1741 |
| 1746 // This only erases markers that are in the first unit (word or sent
ence) of the selection. | 1742 // This only erases markers that are in the first unit (word or sent
ence) of the selection. |
| 1747 // Perhaps peculiar, but it matches AppKit. | 1743 // Perhaps peculiar, but it matches AppKit. |
| 1748 if (RefPtr<Range> wordRange = newAdjacentWords.toRange()) | 1744 if (RefPtr<Range> wordRange = newAdjacentWords.toNormalizedRange()) |
| 1749 document()->removeMarkers(wordRange.get(), DocumentMarker::Spell
ing); | 1745 document()->removeMarkers(wordRange.get(), DocumentMarker::Spell
ing); |
| 1750 if (RefPtr<Range> sentenceRange = newSelectedSentence.toRange()) | 1746 if (RefPtr<Range> sentenceRange = newSelectedSentence.toNormalizedRa
nge()) |
| 1751 document()->removeMarkers(sentenceRange.get(), DocumentMarker::G
rammar); | 1747 document()->removeMarkers(sentenceRange.get(), DocumentMarker::G
rammar); |
| 1752 } | 1748 } |
| 1753 | 1749 |
| 1754 // When continuous spell checking is off, existing markers disappear aft
er the selection changes. | 1750 // When continuous spell checking is off, existing markers disappear aft
er the selection changes. |
| 1755 if (!isContinuousSpellCheckingEnabled) | 1751 if (!isContinuousSpellCheckingEnabled) |
| 1756 document()->removeMarkers(DocumentMarker::Spelling); | 1752 document()->removeMarkers(DocumentMarker::Spelling); |
| 1757 if (!isContinuousGrammarCheckingEnabled) | 1753 if (!isContinuousGrammarCheckingEnabled) |
| 1758 document()->removeMarkers(DocumentMarker::Grammar); | 1754 document()->removeMarkers(DocumentMarker::Grammar); |
| 1759 } | 1755 } |
| 1760 | 1756 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1826 frameView->setParentVisible(true); | 1822 frameView->setParentVisible(true); |
| 1827 | 1823 |
| 1828 if (ownerRenderer()) | 1824 if (ownerRenderer()) |
| 1829 ownerRenderer()->setWidget(frameView); | 1825 ownerRenderer()->setWidget(frameView); |
| 1830 | 1826 |
| 1831 if (HTMLFrameOwnerElement* owner = ownerElement()) | 1827 if (HTMLFrameOwnerElement* owner = ownerElement()) |
| 1832 view()->setCanHaveScrollbars(owner->scrollingMode() != ScrollbarAlwaysOf
f); | 1828 view()->setCanHaveScrollbars(owner->scrollingMode() != ScrollbarAlwaysOf
f); |
| 1833 } | 1829 } |
| 1834 | 1830 |
| 1835 } // namespace WebCore | 1831 } // namespace WebCore |
| OLD | NEW |