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

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

Issue 2201853002: Blink handle selection handle visibility (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl format Created 4 years, 2 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
6 * Copyright (C) 2015 Google Inc. All rights reserved. 6 * Copyright (C) 2015 Google Inc. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 130
131 DCHECK(!m_frame->document()->needsLayoutTreeUpdate()); 131 DCHECK(!m_frame->document()->needsLayoutTreeUpdate());
132 Node* innerNode = event.innerNode(); 132 Node* innerNode = event.innerNode();
133 if (!(innerNode && innerNode->layoutObject() && m_mouseDownMayStartSelect)) 133 if (!(innerNode && innerNode->layoutObject() && m_mouseDownMayStartSelect))
134 return false; 134 return false;
135 135
136 // Extend the selection if the Shift key is down, unless the click is in a 136 // Extend the selection if the Shift key is down, unless the click is in a
137 // link or image. 137 // link or image.
138 bool extendSelection = isExtendingSelection(event); 138 bool extendSelection = isExtendingSelection(event);
139 139
140 // Don't restart the selection when the mouse is pressed on an
141 // existing selection so we can allow for text dragging.
142 if (FrameView* view = m_frame->view()) {
143 LayoutPoint vPoint = view->rootFrameToContents(event.event().position());
144 if (!extendSelection && selection().contains(vPoint)) {
145 m_mouseDownWasSingleClickInSelection = true;
146 return false;
147 }
148 }
149
150 VisiblePositionInFlatTree visiblePos = 140 VisiblePositionInFlatTree visiblePos =
151 visiblePositionOfHitTestResult(event.hitTestResult()); 141 visiblePositionOfHitTestResult(event.hitTestResult());
152 if (visiblePos.isNull()) 142 if (visiblePos.isNull())
153 visiblePos = createVisiblePosition( 143 visiblePos = createVisiblePosition(
154 PositionInFlatTree::firstPositionInOrBeforeNode(innerNode)); 144 PositionInFlatTree::firstPositionInOrBeforeNode(innerNode));
155 PositionInFlatTree pos = visiblePos.deepEquivalent(); 145 PositionInFlatTree pos = visiblePos.deepEquivalent();
156 146
157 VisibleSelectionInFlatTree newSelection = 147 VisibleSelectionInFlatTree newSelection =
158 selection().visibleSelection<EditingInFlatTreeStrategy>(); 148 selection().visibleSelection<EditingInFlatTreeStrategy>();
159 TextGranularity granularity = CharacterGranularity; 149 TextGranularity granularity = CharacterGranularity;
160 150
151 // Don't restart the selection when the mouse is pressed on an
152 // existing selection so we can allow for text dragging.
153 if (!extendSelection && selection().contains(event.hitTestResult())) {
154 m_mouseDownWasSingleClickInSelection = true;
155 if (!event.event().fromTouch())
156 return false;
157
158 if (!selection().isHandleVisible()) {
159 updateSelectionForMouseDownDispatchingSelectStart(
160 innerNode, newSelection, granularity, HandleVisibility::Visible);
161 return false;
162 }
163 }
164
161 if (extendSelection && !newSelection.isNone()) { 165 if (extendSelection && !newSelection.isNone()) {
162 // Note: "fast/events/shift-click-user-select-none.html" makes
163 // |pos.isNull()| true.
164 SelectionInFlatTree::Builder builder; 166 SelectionInFlatTree::Builder builder;
165 if (pos.isNotNull()) 167 if (pos.isNotNull())
166 builder.collapse(pos); 168 builder.collapse(pos);
167 const VisibleSelectionInFlatTree& selectionInUserSelectAll = 169 const VisibleSelectionInFlatTree& selectionInUserSelectAll =
168 expandSelectionToRespectUserSelectAll( 170 expandSelectionToRespectUserSelectAll(
169 innerNode, createVisibleSelection(builder.build())); 171 innerNode, createVisibleSelection(builder.build()));
170 if (selectionInUserSelectAll.isRange()) { 172 if (selectionInUserSelectAll.isRange()) {
171 if (selectionInUserSelectAll.start().compareTo(newSelection.start()) < 0) 173 if (selectionInUserSelectAll.start().compareTo(newSelection.start()) < 0)
172 pos = selectionInUserSelectAll.start(); 174 pos = selectionInUserSelectAll.start();
173 else if (newSelection.end().compareTo(selectionInUserSelectAll.end()) < 0) 175 else if (newSelection.end().compareTo(selectionInUserSelectAll.end()) < 0)
(...skipping 25 matching lines...) Expand all
199 if (visiblePos.isNull()) { 201 if (visiblePos.isNull()) {
200 newSelection = VisibleSelectionInFlatTree(); 202 newSelection = VisibleSelectionInFlatTree();
201 } else { 203 } else {
202 SelectionInFlatTree::Builder builder; 204 SelectionInFlatTree::Builder builder;
203 builder.collapse(visiblePos.toPositionWithAffinity()); 205 builder.collapse(visiblePos.toPositionWithAffinity());
204 newSelection = expandSelectionToRespectUserSelectAll( 206 newSelection = expandSelectionToRespectUserSelectAll(
205 innerNode, createVisibleSelection(builder.build())); 207 innerNode, createVisibleSelection(builder.build()));
206 } 208 }
207 } 209 }
208 210
211 bool isHandleVisible = false;
212 if (newSelection.isContentEditable()) {
213 bool isTextBoxEmpty =
214 VisibleSelection::selectionFromContentsOfNode(innerNode).isCaret();
yosin_UTC9 2016/10/19 06:33:05 nit: VisibleSelection::selectionFromContentsOfNode
amaralp 2016/10/21 03:47:18 Done.
215 bool notLeftClick = event.event().pointerProperties().button !=
yosin_UTC9 2016/10/19 06:33:05 nit: s/bool/const bool/
amaralp 2016/10/21 03:47:18 Done.
216 WebPointerProperties::Button::Left;
217 if (!isTextBoxEmpty || notLeftClick)
218 isHandleVisible = event.event().fromTouch();
219 }
220
209 // Updating the selection is considered side-effect of the event and so it 221 // Updating the selection is considered side-effect of the event and so it
210 // doesn't impact the handled state. 222 // doesn't impact the handled state.
211 updateSelectionForMouseDownDispatchingSelectStart(innerNode, newSelection, 223 updateSelectionForMouseDownDispatchingSelectStart(
212 granularity); 224 innerNode, newSelection, granularity, isHandleVisible
225 ? HandleVisibility::Visible
226 : HandleVisibility::NotVisible);
213 return false; 227 return false;
214 } 228 }
215 229
216 void SelectionController::updateSelectionForMouseDrag( 230 void SelectionController::updateSelectionForMouseDrag(
217 const HitTestResult& hitTestResult, 231 const HitTestResult& hitTestResult,
218 Node* mousePressNode, 232 Node* mousePressNode,
219 const LayoutPoint& dragStartPos, 233 const LayoutPoint& dragStartPos,
220 const IntPoint& lastKnownMousePosition) { 234 const IntPoint& lastKnownMousePosition) {
221 if (!m_mouseDownMayStartSelect) 235 if (!m_mouseDownMayStartSelect)
222 return; 236 return;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 newSelection.expandUsingGranularity(selection().granularity()); 346 newSelection.expandUsingGranularity(selection().granularity());
333 347
334 selection().setNonDirectionalSelectionIfNeeded( 348 selection().setNonDirectionalSelectionIfNeeded(
335 newSelection, selection().granularity(), 349 newSelection, selection().granularity(),
336 FrameSelection::AdjustEndpointsAtBidiBoundary); 350 FrameSelection::AdjustEndpointsAtBidiBoundary);
337 } 351 }
338 352
339 bool SelectionController::updateSelectionForMouseDownDispatchingSelectStart( 353 bool SelectionController::updateSelectionForMouseDownDispatchingSelectStart(
340 Node* targetNode, 354 Node* targetNode,
341 const VisibleSelectionInFlatTree& selection, 355 const VisibleSelectionInFlatTree& selection,
342 TextGranularity granularity) { 356 TextGranularity granularity,
357 HandleVisibility visibility) {
343 if (targetNode && targetNode->layoutObject() && 358 if (targetNode && targetNode->layoutObject() &&
344 !targetNode->layoutObject()->isSelectable()) 359 !targetNode->layoutObject()->isSelectable())
345 return false; 360 return false;
346 361
347 if (dispatchSelectStart(targetNode) != DispatchEventResult::NotCanceled) 362 if (dispatchSelectStart(targetNode) != DispatchEventResult::NotCanceled)
348 return false; 363 return false;
349 364
350 // |dispatchSelectStart()| can change document hosted by |m_frame|. 365 // |dispatchSelectStart()| can change document hosted by |m_frame|.
351 if (!this->selection().isAvailable()) 366 if (!this->selection().isAvailable())
352 return false; 367 return false;
353 368
354 if (!selection.isValidFor(this->selection().document())) 369 if (!selection.isValidFor(this->selection().document()))
355 return false; 370 return false;
356 371
357 if (selection.isRange()) { 372 if (selection.isRange()) {
358 m_selectionState = SelectionState::ExtendedSelection; 373 m_selectionState = SelectionState::ExtendedSelection;
359 } else { 374 } else {
360 granularity = CharacterGranularity; 375 granularity = CharacterGranularity;
361 m_selectionState = SelectionState::PlacedCaret; 376 m_selectionState = SelectionState::PlacedCaret;
362 } 377 }
363 378
364 this->selection().setNonDirectionalSelectionIfNeeded(selection, granularity); 379 this->selection().setNonDirectionalSelectionIfNeeded(
380 selection, granularity, FrameSelection::DoNotAdjustEndpoints, visibility);
365 381
366 return true; 382 return true;
367 } 383 }
368 384
369 void SelectionController::selectClosestWordFromHitTestResult( 385 void SelectionController::selectClosestWordFromHitTestResult(
370 const HitTestResult& result, 386 const HitTestResult& result,
371 AppendTrailingWhitespace appendTrailingWhitespace, 387 AppendTrailingWhitespace appendTrailingWhitespace,
372 SelectInputEventType selectInputEventType) { 388 SelectInputEventType selectInputEventType) {
373 Node* innerNode = result.innerNode(); 389 Node* innerNode = result.innerNode();
374 VisibleSelectionInFlatTree newSelection; 390 VisibleSelectionInFlatTree newSelection;
(...skipping 12 matching lines...) Expand all
387 403
388 const VisiblePositionInFlatTree& pos = 404 const VisiblePositionInFlatTree& pos =
389 visiblePositionOfHitTestResult(adjustedHitTestResult); 405 visiblePositionOfHitTestResult(adjustedHitTestResult);
390 if (pos.isNotNull()) { 406 if (pos.isNotNull()) {
391 SelectionInFlatTree::Builder builder; 407 SelectionInFlatTree::Builder builder;
392 builder.collapse(pos.toPositionWithAffinity()); 408 builder.collapse(pos.toPositionWithAffinity());
393 newSelection = createVisibleSelection(builder.build()); 409 newSelection = createVisibleSelection(builder.build());
394 newSelection.expandUsingGranularity(WordGranularity); 410 newSelection.expandUsingGranularity(WordGranularity);
395 } 411 }
396 412
413 HandleVisibility visibility = HandleVisibility::NotVisible;
yosin_UTC9 2016/10/19 06:33:05 Better to use |handleVisibility|, name |visibility
amaralp 2016/10/21 03:47:18 Done.
397 if (selectInputEventType == SelectInputEventType::Touch) { 414 if (selectInputEventType == SelectInputEventType::Touch) {
398 // If node doesn't have text except space, tab or line break, do not 415 // If node doesn't have text except space, tab or line break, do not
399 // select that 'empty' area. 416 // select that 'empty' area.
400 EphemeralRangeInFlatTree range(newSelection.start(), newSelection.end()); 417 EphemeralRangeInFlatTree range(newSelection.start(), newSelection.end());
401 const String& str = 418 const String& str =
402 plainText(range, hasEditableStyle(*innerNode) 419 plainText(range, hasEditableStyle(*innerNode)
403 ? TextIteratorEmitsObjectReplacementCharacter 420 ? TextIteratorEmitsObjectReplacementCharacter
404 : TextIteratorDefaultBehavior); 421 : TextIteratorDefaultBehavior);
405 if (str.isEmpty() || str.simplifyWhiteSpace().containsOnlyWhitespace()) 422 if (str.isEmpty() || str.simplifyWhiteSpace().containsOnlyWhitespace())
406 return; 423 return;
407 424
408 if (newSelection.rootEditableElement() && 425 if (newSelection.rootEditableElement() &&
409 pos.deepEquivalent() == 426 pos.deepEquivalent() ==
410 VisiblePositionInFlatTree::lastPositionInNode( 427 VisiblePositionInFlatTree::lastPositionInNode(
411 newSelection.rootEditableElement()) 428 newSelection.rootEditableElement())
412 .deepEquivalent()) 429 .deepEquivalent())
413 return; 430 return;
431 visibility = HandleVisibility::Visible;
414 } 432 }
415 433
416 if (appendTrailingWhitespace == AppendTrailingWhitespace::ShouldAppend && 434 if (appendTrailingWhitespace == AppendTrailingWhitespace::ShouldAppend &&
417 newSelection.isRange()) 435 newSelection.isRange())
418 newSelection.appendTrailingWhitespace(); 436 newSelection.appendTrailingWhitespace();
419 437
420 updateSelectionForMouseDownDispatchingSelectStart( 438 updateSelectionForMouseDownDispatchingSelectStart(
421 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), 439 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection),
422 WordGranularity); 440 WordGranularity, visibility);
423 } 441 }
424 442
425 void SelectionController::selectClosestMisspellingFromHitTestResult( 443 void SelectionController::selectClosestMisspellingFromHitTestResult(
426 const HitTestResult& result, 444 const HitTestResult& result,
427 AppendTrailingWhitespace appendTrailingWhitespace) { 445 AppendTrailingWhitespace appendTrailingWhitespace) {
428 Node* innerNode = result.innerNode(); 446 Node* innerNode = result.innerNode();
429 VisibleSelectionInFlatTree newSelection; 447 VisibleSelectionInFlatTree newSelection;
430 448
431 if (!innerNode || !innerNode->layoutObject()) 449 if (!innerNode || !innerNode->layoutObject())
432 return; 450 return;
(...skipping 13 matching lines...) Expand all
446 newSelection = createVisibleSelection(start, end); 464 newSelection = createVisibleSelection(start, end);
447 } 465 }
448 } 466 }
449 467
450 if (appendTrailingWhitespace == AppendTrailingWhitespace::ShouldAppend && 468 if (appendTrailingWhitespace == AppendTrailingWhitespace::ShouldAppend &&
451 newSelection.isRange()) 469 newSelection.isRange())
452 newSelection.appendTrailingWhitespace(); 470 newSelection.appendTrailingWhitespace();
453 471
454 updateSelectionForMouseDownDispatchingSelectStart( 472 updateSelectionForMouseDownDispatchingSelectStart(
455 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), 473 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection),
456 WordGranularity); 474 WordGranularity, HandleVisibility::NotVisible);
457 } 475 }
458 476
459 void SelectionController::selectClosestWordFromMouseEvent( 477 void SelectionController::selectClosestWordFromMouseEvent(
460 const MouseEventWithHitTestResults& result) { 478 const MouseEventWithHitTestResults& result) {
461 if (!m_mouseDownMayStartSelect) 479 if (!m_mouseDownMayStartSelect)
462 return; 480 return;
463 481
464 AppendTrailingWhitespace appendTrailingWhitespace = 482 AppendTrailingWhitespace appendTrailingWhitespace =
465 (result.event().clickCount() == 2 && 483 (result.event().clickCount() == 2 &&
466 m_frame->editor().isSelectTrailingWhitespaceEnabled()) 484 m_frame->editor().isSelectTrailingWhitespaceEnabled())
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 Element* URLElement = result.hitTestResult().URLElement(); 520 Element* URLElement = result.hitTestResult().URLElement();
503 const VisiblePositionInFlatTree pos = 521 const VisiblePositionInFlatTree pos =
504 visiblePositionOfHitTestResult(result.hitTestResult()); 522 visiblePositionOfHitTestResult(result.hitTestResult());
505 if (pos.isNotNull() && 523 if (pos.isNotNull() &&
506 pos.deepEquivalent().anchorNode()->isDescendantOf(URLElement)) 524 pos.deepEquivalent().anchorNode()->isDescendantOf(URLElement))
507 newSelection = 525 newSelection =
508 VisibleSelectionInFlatTree::selectionFromContentsOfNode(URLElement); 526 VisibleSelectionInFlatTree::selectionFromContentsOfNode(URLElement);
509 527
510 updateSelectionForMouseDownDispatchingSelectStart( 528 updateSelectionForMouseDownDispatchingSelectStart(
511 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), 529 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection),
512 WordGranularity); 530 WordGranularity, HandleVisibility::NotVisible);
513 } 531 }
514 532
515 bool SelectionController::handleMousePressEventDoubleClick( 533 bool SelectionController::handleMousePressEventDoubleClick(
516 const MouseEventWithHitTestResults& event) { 534 const MouseEventWithHitTestResults& event) {
517 TRACE_EVENT0("blink", 535 TRACE_EVENT0("blink",
518 "SelectionController::handleMousePressEventDoubleClick"); 536 "SelectionController::handleMousePressEventDoubleClick");
519 537
520 if (!selection().isAvailable()) 538 if (!selection().isAvailable())
521 return false; 539 return false;
522 540
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 VisibleSelectionInFlatTree newSelection; 582 VisibleSelectionInFlatTree newSelection;
565 const VisiblePositionInFlatTree& pos = 583 const VisiblePositionInFlatTree& pos =
566 visiblePositionOfHitTestResult(event.hitTestResult()); 584 visiblePositionOfHitTestResult(event.hitTestResult());
567 if (pos.isNotNull()) { 585 if (pos.isNotNull()) {
568 SelectionInFlatTree::Builder builder; 586 SelectionInFlatTree::Builder builder;
569 builder.collapse(pos.toPositionWithAffinity()); 587 builder.collapse(pos.toPositionWithAffinity());
570 newSelection = createVisibleSelection(builder.build()); 588 newSelection = createVisibleSelection(builder.build());
571 newSelection.expandUsingGranularity(ParagraphGranularity); 589 newSelection.expandUsingGranularity(ParagraphGranularity);
572 } 590 }
573 591
592 bool isHandleVisible = event.event().fromTouch() && newSelection.isRange();
593
574 return updateSelectionForMouseDownDispatchingSelectStart( 594 return updateSelectionForMouseDownDispatchingSelectStart(
575 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection), 595 innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection),
576 ParagraphGranularity); 596 ParagraphGranularity, isHandleVisible ? HandleVisibility::Visible
597 : HandleVisibility::NotVisible);
577 } 598 }
578 599
579 void SelectionController::handleMousePressEvent( 600 void SelectionController::handleMousePressEvent(
580 const MouseEventWithHitTestResults& event) { 601 const MouseEventWithHitTestResults& event) {
581 // If we got the event back, that must mean it wasn't prevented, 602 // If we got the event back, that must mean it wasn't prevented,
582 // so it's allowed to start a drag or selection if it wasn't in a scrollbar. 603 // so it's allowed to start a drag or selection if it wasn't in a scrollbar.
583 m_mouseDownMayStartSelect = 604 m_mouseDownMayStartSelect =
584 (canMouseDownStartSelect(event.innerNode()) || isLinkSelection(event)) && 605 (canMouseDownStartSelect(event.innerNode()) || isLinkSelection(event)) &&
585 !event.scrollbar(); 606 !event.scrollbar();
586 m_mouseDownWasSingleClickInSelection = false; 607 m_mouseDownWasSingleClickInSelection = false;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 pos.deepEquivalent().parentAnchoredEquivalent()), 785 pos.deepEquivalent().parentAnchoredEquivalent()),
765 DocumentMarker::MisspellingMarkers()) 786 DocumentMarker::MisspellingMarkers())
766 .size() > 0; 787 .size() > 0;
767 } 788 }
768 789
769 void SelectionController::sendContextMenuEvent( 790 void SelectionController::sendContextMenuEvent(
770 const MouseEventWithHitTestResults& mev, 791 const MouseEventWithHitTestResults& mev,
771 const LayoutPoint& position) { 792 const LayoutPoint& position) {
772 if (!selection().isAvailable()) 793 if (!selection().isAvailable())
773 return; 794 return;
774 if (selection().contains(position) || mev.scrollbar() || 795 if (selection().contains(mev.hitTestResult()) || mev.scrollbar() ||
775 // FIXME: In the editable case, word selection sometimes selects content 796 // FIXME: In the editable case, word selection sometimes selects content
776 // that isn't underneath the mouse. 797 // that isn't underneath the mouse.
777 // If the selection is non-editable, we do word selection to make it 798 // If the selection is non-editable, we do word selection to make it
778 // easier to use the contextual menu items available for text selections. 799 // easier to use the contextual menu items available for text selections.
779 // But only if we're above text. 800 // But only if we're above text.
780 !(selection().isContentEditable() || 801 !(selection().isContentEditable() ||
781 (mev.innerNode() && mev.innerNode()->isTextNode()))) 802 (mev.innerNode() && mev.innerNode()->isTextNode())))
782 return; 803 return;
783 804
784 // Context menu events are always allowed to perform a selection. 805 // Context menu events are always allowed to perform a selection.
785 AutoReset<bool> mouseDownMayStartSelectChange(&m_mouseDownMayStartSelect, 806 AutoReset<bool> mouseDownMayStartSelectChange(&m_mouseDownMayStartSelect,
786 true); 807 true);
787 808
788 if (hitTestResultIsMisspelled(mev.hitTestResult())) 809 if (hitTestResultIsMisspelled(mev.hitTestResult()))
789 return selectClosestMisspellingFromMouseEvent(mev); 810 return selectClosestMisspellingFromMouseEvent(mev);
790 811
791 if (!m_frame->editor().behavior().shouldSelectOnContextualMenuClick()) 812 if (!m_frame->editor().behavior().shouldSelectOnContextualMenuClick())
792 return; 813 return;
793 814
794 selectClosestWordOrLinkFromMouseEvent(mev); 815 selectClosestWordOrLinkFromMouseEvent(mev);
795 } 816 }
796 817
797 void SelectionController::passMousePressEventToSubframe( 818 void SelectionController::passMousePressEventToSubframe(
798 const MouseEventWithHitTestResults& mev) { 819 const MouseEventWithHitTestResults& mev) {
799 // If we're clicking into a frame that is selected, the frame will appear 820 // If we're clicking into a frame that is selected, the frame will appear
800 // greyed out even though we're clicking on the selection. This looks 821 // greyed out even though we're clicking on the selection. This looks
801 // really strange (having the whole frame be greyed out), so we deselect the 822 // really strange (having the whole frame be greyed out), so we deselect the
802 // selection. 823 // selection.
803 IntPoint p = m_frame->view()->rootFrameToContents(mev.event().position()); 824 if (!selection().contains(mev.hitTestResult()))
804 if (!selection().contains(p))
805 return; 825 return;
806 826
807 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets 827 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
808 // needs to be audited. See http://crbug.com/590369 for more details. 828 // needs to be audited. See http://crbug.com/590369 for more details.
809 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); 829 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
810 830
811 const VisiblePositionInFlatTree& visiblePos = 831 const VisiblePositionInFlatTree& visiblePos =
812 visiblePositionOfHitTestResult(mev.hitTestResult()); 832 visiblePositionOfHitTestResult(mev.hitTestResult());
813 if (visiblePos.isNull()) { 833 if (visiblePos.isNull()) {
814 selection().setSelection(VisibleSelectionInFlatTree()); 834 selection().setSelection(VisibleSelectionInFlatTree());
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 return event.event().altKey() && event.isOverLink(); 872 return event.event().altKey() && event.isOverLink();
853 } 873 }
854 874
855 bool isExtendingSelection(const MouseEventWithHitTestResults& event) { 875 bool isExtendingSelection(const MouseEventWithHitTestResults& event) {
856 bool isMouseDownOnLinkOrImage = 876 bool isMouseDownOnLinkOrImage =
857 event.isOverLink() || event.hitTestResult().image(); 877 event.isOverLink() || event.hitTestResult().image();
858 return event.event().shiftKey() && !isMouseDownOnLinkOrImage; 878 return event.event().shiftKey() && !isMouseDownOnLinkOrImage;
859 } 879 }
860 880
861 } // namespace blink 881 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698