Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(489)

Side by Side Diff: third_party/WebKit/Source/core/editing/DOMSelection.cpp

Issue 2778963002: Return EphemeralRange instead of Range in DOMSelection::createRangeFromSelectionEditor (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/editing/DOMSelection.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2012 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 return 1; 217 return 1;
218 if (frame() 218 if (frame()
219 ->selection() 219 ->selection()
220 .computeVisibleSelectionInDOMTreeDeprecated() 220 .computeVisibleSelectionInDOMTreeDeprecated()
221 .isNone()) 221 .isNone())
222 return 0; 222 return 0;
223 // Any selection can be adjusted to Range for Document. 223 // Any selection can be adjusted to Range for Document.
224 if (isSelectionOfDocument()) 224 if (isSelectionOfDocument())
225 return 1; 225 return 1;
226 // In ShadowRoot, we need to try adjustment. 226 // In ShadowRoot, we need to try adjustment.
227 return createRangeFromSelectionEditor() ? 1 : 0; 227 if (createRangeFromSelectionEditor().isNotNull())
yosin_UTC9 2017/03/28 07:04:31 nit: I prefer using "?:" as original return creat
yoichio 2017/03/28 09:32:51 New early-return follows above early returns of 1
228 return 1;
229 return 0;
228 } 230 }
229 231
230 // https://www.w3.org/TR/selection-api/#dom-selection-collapse 232 // https://www.w3.org/TR/selection-api/#dom-selection-collapse
231 void DOMSelection::collapse(Node* node, 233 void DOMSelection::collapse(Node* node,
232 unsigned offset, 234 unsigned offset,
233 ExceptionState& exceptionState) { 235 ExceptionState& exceptionState) {
234 if (!isAvailable()) 236 if (!isAvailable())
235 return; 237 return;
236 238
237 // 1. If node is null, this method must behave identically as 239 // 1. If node is null, this method must behave identically as
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 IndexSizeError, String::number(index) + " is not a valid index."); 525 IndexSizeError, String::number(index) + " is not a valid index.");
524 return nullptr; 526 return nullptr;
525 } 527 }
526 528
527 // If you're hitting this, you've added broken multi-range selection support 529 // If you're hitting this, you've added broken multi-range selection support
528 DCHECK_EQ(rangeCount(), 1u); 530 DCHECK_EQ(rangeCount(), 1u);
529 531
530 if (Range* cachedRange = documentCachedRange()) 532 if (Range* cachedRange = documentCachedRange())
531 return cachedRange; 533 return cachedRange;
532 534
533 Range* range = createRangeFromSelectionEditor(); 535 Range* range = createRange(createRangeFromSelectionEditor());
534 cacheRangeIfSelectionOfDocument(range); 536 cacheRangeIfSelectionOfDocument(range);
535 return range; 537 return range;
536 } 538 }
537 539
538 Range* DOMSelection::primaryRangeOrNull() const { 540 Range* DOMSelection::primaryRangeOrNull() const {
539 return rangeCount() > 0 ? getRangeAt(0, ASSERT_NO_EXCEPTION) : nullptr; 541 return rangeCount() > 0 ? getRangeAt(0, ASSERT_NO_EXCEPTION) : nullptr;
540 } 542 }
541 543
542 Range* DOMSelection::createRangeFromSelectionEditor() const { 544 EphemeralRange DOMSelection::createRangeFromSelectionEditor() const {
543 const VisibleSelection& selection = visibleSelection(); 545 const VisibleSelection& selection = visibleSelection();
544 const Position& anchor = blink::anchorPosition(selection); 546 const Position& anchor = blink::anchorPosition(selection);
545 if (isSelectionOfDocument() && !anchor.anchorNode()->isInShadowTree()) 547 if (isSelectionOfDocument() && !anchor.anchorNode()->isInShadowTree())
546 return createRange(firstEphemeralRangeOf(selection)); 548 return firstEphemeralRangeOf(selection);
547 549
548 Node* const node = shadowAdjustedNode(anchor); 550 Node* const anchorNode = shadowAdjustedNode(anchor);
549 if (!node) // crbug.com/595100 551 if (!anchorNode) // crbug.com/595100
550 return nullptr; 552 return EphemeralRange();
553
551 const Position& focus = focusPosition(selection); 554 const Position& focus = focusPosition(selection);
552 if (!selection.isBaseFirst()) { 555 const Position shadowAdjustedFocus =
553 return Range::create(*anchor.document(), shadowAdjustedNode(focus), 556 Position(shadowAdjustedNode(focus), shadowAdjustedOffset(focus));
554 shadowAdjustedOffset(focus), node, 557 const Position shadowAdjustedAnchor =
555 shadowAdjustedOffset(anchor)); 558 Position(anchorNode, shadowAdjustedOffset(anchor));
556 } 559 if (selection.isBaseFirst())
557 return Range::create(*anchor.document(), node, shadowAdjustedOffset(anchor), 560 return EphemeralRange(shadowAdjustedAnchor, shadowAdjustedFocus);
558 shadowAdjustedNode(focus), shadowAdjustedOffset(focus)); 561 return EphemeralRange(shadowAdjustedFocus, shadowAdjustedAnchor);
559 } 562 }
560 563
561 bool DOMSelection::isSelectionOfDocument() const { 564 bool DOMSelection::isSelectionOfDocument() const {
562 return m_treeScope == m_treeScope->document(); 565 return m_treeScope == m_treeScope->document();
563 } 566 }
564 567
565 void DOMSelection::cacheRangeIfSelectionOfDocument(Range* range) const { 568 void DOMSelection::cacheRangeIfSelectionOfDocument(Range* range) const {
566 if (!isSelectionOfDocument()) 569 if (!isSelectionOfDocument())
567 return; 570 return;
568 if (!frame()) 571 if (!frame())
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 m_treeScope->document().addConsoleMessage( 822 m_treeScope->document().addConsoleMessage(
820 ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); 823 ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message));
821 } 824 }
822 825
823 DEFINE_TRACE(DOMSelection) { 826 DEFINE_TRACE(DOMSelection) {
824 visitor->trace(m_treeScope); 827 visitor->trace(m_treeScope);
825 ContextClient::trace(visitor); 828 ContextClient::trace(visitor);
826 } 829 }
827 830
828 } // namespace blink 831 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/DOMSelection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698