Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 , m_isCaretBlinkingSuspended(false) | 100 , m_isCaretBlinkingSuspended(false) |
| 101 , m_focused(frame && frame->page() && frame->page()->focusController().focus edFrame() == frame) | 101 , m_focused(frame && frame->page() && frame->page()->focusController().focus edFrame() == frame) |
| 102 , m_shouldShowBlockCursor(false) | 102 , m_shouldShowBlockCursor(false) |
| 103 { | 103 { |
| 104 if (shouldAlwaysUseDirectionalSelection(m_frame)) | 104 if (shouldAlwaysUseDirectionalSelection(m_frame)) |
| 105 m_selection.setIsDirectional(true); | 105 m_selection.setIsDirectional(true); |
| 106 } | 106 } |
| 107 | 107 |
| 108 FrameSelection::~FrameSelection() | 108 FrameSelection::~FrameSelection() |
| 109 { | 109 { |
| 110 stopObservingVisibleSelectionChangeIfNecessary(); | 110 stopObservingVisibleSelectionChangeIfNecessary(); |
|
haraken
2014/05/28 15:35:25
This destructor touches m_selection, which is an o
sof
2014/05/28 22:06:06
Yes, the observer clearing is not needed at all wi
| |
| 111 } | 111 } |
| 112 | 112 |
| 113 Element* FrameSelection::rootEditableElementOrDocumentElement() const | 113 Element* FrameSelection::rootEditableElementOrDocumentElement() const |
| 114 { | 114 { |
| 115 Element* selectionRoot = m_selection.rootEditableElement(); | 115 Element* selectionRoot = m_selection.rootEditableElement(); |
| 116 return selectionRoot ? selectionRoot : m_frame->document()->documentElement( ); | 116 return selectionRoot ? selectionRoot : m_frame->document()->documentElement( ); |
| 117 } | 117 } |
| 118 | 118 |
| 119 Node* FrameSelection::rootEditableElementOrTreeScopeRootNode() const | 119 Node* FrameSelection::rootEditableElementOrTreeScopeRootNode() const |
| 120 { | 120 { |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 927 } | 927 } |
| 928 | 928 |
| 929 static bool isBoundary(TextGranularity granularity) | 929 static bool isBoundary(TextGranularity granularity) |
| 930 { | 930 { |
| 931 return granularity == LineBoundary || granularity == ParagraphBoundary || gr anularity == DocumentBoundary; | 931 return granularity == LineBoundary || granularity == ParagraphBoundary || gr anularity == DocumentBoundary; |
| 932 } | 932 } |
| 933 | 933 |
| 934 bool FrameSelection::modify(EAlteration alter, SelectionDirection direction, Tex tGranularity granularity, EUserTriggered userTriggered) | 934 bool FrameSelection::modify(EAlteration alter, SelectionDirection direction, Tex tGranularity granularity, EUserTriggered userTriggered) |
| 935 { | 935 { |
| 936 if (userTriggered == UserTriggered) { | 936 if (userTriggered == UserTriggered) { |
| 937 FrameSelection trialFrameSelection; | 937 OwnPtrWillBeRawPtr<FrameSelection> trialFrameSelection = FrameSelection: :create(); |
| 938 trialFrameSelection.setSelection(m_selection); | 938 trialFrameSelection->setSelection(m_selection); |
| 939 trialFrameSelection.modify(alter, direction, granularity, NotUserTrigger ed); | 939 trialFrameSelection->modify(alter, direction, granularity, NotUserTrigge red); |
| 940 | 940 |
| 941 if (trialFrameSelection.selection().isRange() && m_selection.isCaret() & & !dispatchSelectStart()) | 941 if (trialFrameSelection->selection().isRange() && m_selection.isCaret() && !dispatchSelectStart()) |
| 942 return false; | 942 return false; |
| 943 } | 943 } |
| 944 | 944 |
| 945 willBeModified(alter, direction); | 945 willBeModified(alter, direction); |
| 946 | 946 |
| 947 bool wasRange = m_selection.isRange(); | 947 bool wasRange = m_selection.isRange(); |
| 948 VisiblePosition originalStartPosition = m_selection.visibleStart(); | 948 VisiblePosition originalStartPosition = m_selection.visibleStart(); |
| 949 VisiblePosition position; | 949 VisiblePosition position; |
| 950 switch (direction) { | 950 switch (direction) { |
| 951 case DirectionRight: | 951 case DirectionRight: |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1041 y = rect.y() + rect.height() / 2; | 1041 y = rect.y() + rect.height() / 2; |
| 1042 return true; | 1042 return true; |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 bool FrameSelection::modify(EAlteration alter, unsigned verticalDistance, Vertic alDirection direction, EUserTriggered userTriggered, CursorAlignOnScroll align) | 1045 bool FrameSelection::modify(EAlteration alter, unsigned verticalDistance, Vertic alDirection direction, EUserTriggered userTriggered, CursorAlignOnScroll align) |
| 1046 { | 1046 { |
| 1047 if (!verticalDistance) | 1047 if (!verticalDistance) |
| 1048 return false; | 1048 return false; |
| 1049 | 1049 |
| 1050 if (userTriggered == UserTriggered) { | 1050 if (userTriggered == UserTriggered) { |
| 1051 FrameSelection trialFrameSelection; | 1051 OwnPtrWillBeRawPtr<FrameSelection> trialFrameSelection = FrameSelection: :create(); |
| 1052 trialFrameSelection.setSelection(m_selection); | 1052 trialFrameSelection->setSelection(m_selection); |
| 1053 trialFrameSelection.modify(alter, verticalDistance, direction, NotUserTr iggered); | 1053 trialFrameSelection->modify(alter, verticalDistance, direction, NotUserT riggered); |
| 1054 } | 1054 } |
| 1055 | 1055 |
| 1056 willBeModified(alter, direction == DirectionUp ? DirectionBackward : Directi onForward); | 1056 willBeModified(alter, direction == DirectionUp ? DirectionBackward : Directi onForward); |
| 1057 | 1057 |
| 1058 VisiblePosition pos; | 1058 VisiblePosition pos; |
| 1059 LayoutUnit xPos = 0; | 1059 LayoutUnit xPos = 0; |
| 1060 switch (alter) { | 1060 switch (alter) { |
| 1061 case AlterationMove: | 1061 case AlterationMove: |
| 1062 pos = VisiblePosition(direction == DirectionUp ? m_selection.start() : m _selection.end(), m_selection.affinity()); | 1062 pos = VisiblePosition(direction == DirectionUp ? m_selection.start() : m _selection.end(), m_selection.affinity()); |
| 1063 xPos = lineDirectionPointForBlockDirectionNavigation(direction == Direct ionUp ? START : END); | 1063 xPos = lineDirectionPointForBlockDirectionNavigation(direction == Direct ionUp ? START : END); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1363 Document* document = m_frame->document(); | 1363 Document* document = m_frame->document(); |
| 1364 | 1364 |
| 1365 if (isHTMLSelectElement(document->focusedElement())) { | 1365 if (isHTMLSelectElement(document->focusedElement())) { |
| 1366 HTMLSelectElement* selectElement = toHTMLSelectElement(document->focused Element()); | 1366 HTMLSelectElement* selectElement = toHTMLSelectElement(document->focused Element()); |
| 1367 if (selectElement->canSelectAll()) { | 1367 if (selectElement->canSelectAll()) { |
| 1368 selectElement->selectAll(); | 1368 selectElement->selectAll(); |
| 1369 return; | 1369 return; |
| 1370 } | 1370 } |
| 1371 } | 1371 } |
| 1372 | 1372 |
| 1373 RefPtr<Node> root = nullptr; | 1373 RefPtrWillBeRawPtr<Node> root = nullptr; |
| 1374 Node* selectStartTarget = 0; | 1374 Node* selectStartTarget = 0; |
| 1375 if (isContentEditable()) { | 1375 if (isContentEditable()) { |
| 1376 root = highestEditableRoot(m_selection.start()); | 1376 root = highestEditableRoot(m_selection.start()); |
| 1377 if (Node* shadowRoot = m_selection.nonBoundaryShadowTreeRootNode()) | 1377 if (Node* shadowRoot = m_selection.nonBoundaryShadowTreeRootNode()) |
| 1378 selectStartTarget = shadowRoot->shadowHost(); | 1378 selectStartTarget = shadowRoot->shadowHost(); |
| 1379 else | 1379 else |
| 1380 selectStartTarget = root.get(); | 1380 selectStartTarget = root.get(); |
| 1381 } else { | 1381 } else { |
| 1382 root = m_selection.nonBoundaryShadowTreeRootNode(); | 1382 root = m_selection.nonBoundaryShadowTreeRootNode(); |
| 1383 if (root) | 1383 if (root) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1441 if (m_selection.start().isNotNull() && m_selection.end().isNotNull()) { | 1441 if (m_selection.start().isNotNull() && m_selection.end().isNotNull()) { |
| 1442 if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache()) | 1442 if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache()) |
| 1443 cache->selectionChanged(m_selection.start().containerNode()); | 1443 cache->selectionChanged(m_selection.start().containerNode()); |
| 1444 } | 1444 } |
| 1445 } | 1445 } |
| 1446 | 1446 |
| 1447 void FrameSelection::focusedOrActiveStateChanged() | 1447 void FrameSelection::focusedOrActiveStateChanged() |
| 1448 { | 1448 { |
| 1449 bool activeAndFocused = isFocusedAndActive(); | 1449 bool activeAndFocused = isFocusedAndActive(); |
| 1450 | 1450 |
| 1451 RefPtr<Document> document = m_frame->document(); | 1451 RefPtrWillBeRawPtr<Document> document = m_frame->document(); |
| 1452 document->updateRenderTreeIfNeeded(); | 1452 document->updateRenderTreeIfNeeded(); |
| 1453 | 1453 |
| 1454 // Because RenderObject::selectionBackgroundColor() and | 1454 // Because RenderObject::selectionBackgroundColor() and |
| 1455 // RenderObject::selectionForegroundColor() check if the frame is active, | 1455 // RenderObject::selectionForegroundColor() check if the frame is active, |
| 1456 // we have to update places those colors were painted. | 1456 // we have to update places those colors were painted. |
| 1457 if (RenderView* view = document->renderView()) | 1457 if (RenderView* view = document->renderView()) |
| 1458 view->repaintSelection(); | 1458 view->repaintSelection(); |
| 1459 | 1459 |
| 1460 // Caret appears in the active frame. | 1460 // Caret appears in the active frame. |
| 1461 if (activeAndFocused) | 1461 if (activeAndFocused) |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1856 m_selection.formatForDebugger(buffer, length); | 1856 m_selection.formatForDebugger(buffer, length); |
| 1857 } | 1857 } |
| 1858 | 1858 |
| 1859 void FrameSelection::showTreeForThis() const | 1859 void FrameSelection::showTreeForThis() const |
| 1860 { | 1860 { |
| 1861 m_selection.showTreeForThis(); | 1861 m_selection.showTreeForThis(); |
| 1862 } | 1862 } |
| 1863 | 1863 |
| 1864 #endif | 1864 #endif |
| 1865 | 1865 |
| 1866 void FrameSelection::trace(Visitor* visitor) | |
| 1867 { | |
| 1868 visitor->trace(m_selection); | |
| 1869 visitor->trace(m_originalBase); | |
| 1870 visitor->trace(m_logicalRange); | |
| 1871 visitor->trace(m_previousCaretNode); | |
| 1872 visitor->trace(m_typingStyle); | |
| 1873 } | |
| 1874 | |
| 1866 } | 1875 } |
| 1867 | 1876 |
| 1868 #ifndef NDEBUG | 1877 #ifndef NDEBUG |
| 1869 | 1878 |
| 1870 void showTree(const WebCore::FrameSelection& sel) | 1879 void showTree(const WebCore::FrameSelection& sel) |
| 1871 { | 1880 { |
| 1872 sel.showTreeForThis(); | 1881 sel.showTreeForThis(); |
| 1873 } | 1882 } |
| 1874 | 1883 |
| 1875 void showTree(const WebCore::FrameSelection* sel) | 1884 void showTree(const WebCore::FrameSelection* sel) |
| 1876 { | 1885 { |
| 1877 if (sel) | 1886 if (sel) |
| 1878 sel->showTreeForThis(); | 1887 sel->showTreeForThis(); |
| 1879 } | 1888 } |
| 1880 | 1889 |
| 1881 #endif | 1890 #endif |
| OLD | NEW |