OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. |
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) | 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
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 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 } | 413 } |
414 | 414 |
415 m_frame->selection()->setNonDirectionalSelectionIfNeeded(selection, granular
ity); | 415 m_frame->selection()->setNonDirectionalSelectionIfNeeded(selection, granular
ity); |
416 | 416 |
417 return true; | 417 return true; |
418 } | 418 } |
419 | 419 |
420 void EventHandler::selectClosestWordFromHitTestResult(const HitTestResult& resul
t, AppendTrailingWhitespace appendTrailingWhitespace) | 420 void EventHandler::selectClosestWordFromHitTestResult(const HitTestResult& resul
t, AppendTrailingWhitespace appendTrailingWhitespace) |
421 { | 421 { |
422 Node* innerNode = result.targetNode(); | 422 Node* innerNode = result.targetNode(); |
| 423 RenderObject* renderer = result.renderer(); |
423 VisibleSelection newSelection; | 424 VisibleSelection newSelection; |
424 | 425 |
425 if (innerNode && innerNode->renderer()) { | 426 if (innerNode && renderer) { |
426 VisiblePosition pos(innerNode->renderer()->positionForPoint(result.local
Point())); | 427 VisiblePosition pos(renderer->positionForPoint(result.localPoint())); |
427 if (pos.isNotNull()) { | 428 if (pos.isNotNull()) { |
428 newSelection = VisibleSelection(pos); | 429 newSelection = VisibleSelection(pos); |
429 newSelection.expandUsingGranularity(WordGranularity); | 430 newSelection.expandUsingGranularity(WordGranularity); |
430 } | 431 } |
431 | 432 |
432 if (appendTrailingWhitespace == ShouldAppendTrailingWhitespace && newSel
ection.isRange()) | 433 if (appendTrailingWhitespace == ShouldAppendTrailingWhitespace && newSel
ection.isRange()) |
433 newSelection.appendTrailingWhitespace(); | 434 newSelection.appendTrailingWhitespace(); |
434 | 435 |
435 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); | 436 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); |
436 } | 437 } |
437 } | 438 } |
438 | 439 |
439 void EventHandler::selectClosestMisspellingFromHitTestResult(const HitTestResult
& result, AppendTrailingWhitespace appendTrailingWhitespace) | 440 void EventHandler::selectClosestMisspellingFromHitTestResult(const HitTestResult
& result, AppendTrailingWhitespace appendTrailingWhitespace) |
440 { | 441 { |
441 Node* innerNode = result.targetNode(); | 442 Node* innerNode = result.targetNode(); |
| 443 RenderObject* renderer = result.renderer(); |
442 VisibleSelection newSelection; | 444 VisibleSelection newSelection; |
443 | 445 |
444 if (innerNode && innerNode->renderer()) { | 446 if (innerNode && renderer) { |
445 VisiblePosition pos(innerNode->renderer()->positionForPoint(result.local
Point())); | 447 VisiblePosition pos(renderer->positionForPoint(result.localPoint())); |
446 Position start = pos.deepEquivalent(); | 448 Position start = pos.deepEquivalent(); |
447 Position end = pos.deepEquivalent(); | 449 Position end = pos.deepEquivalent(); |
448 if (pos.isNotNull()) { | 450 if (pos.isNotNull()) { |
449 Vector<DocumentMarker*> markers = innerNode->document()->markers()->
markersInRange( | 451 Vector<DocumentMarker*> markers = innerNode->document()->markers()->
markersInRange( |
450 makeRange(pos, pos).get(), DocumentMarker::Spelling | DocumentMa
rker::Grammar); | 452 makeRange(pos, pos).get(), DocumentMarker::Spelling | DocumentMa
rker::Grammar); |
451 if (markers.size() == 1) { | 453 if (markers.size() == 1) { |
452 start.moveToOffset(markers[0]->startOffset()); | 454 start.moveToOffset(markers[0]->startOffset()); |
453 end.moveToOffset(markers[0]->endOffset()); | 455 end.moveToOffset(markers[0]->endOffset()); |
454 newSelection = VisibleSelection(start, end); | 456 newSelection = VisibleSelection(start, end); |
455 } | 457 } |
(...skipping 21 matching lines...) Expand all Loading... |
477 (result.event().clickCount() == 2 && m_frame->editor()->isSelectTrai
lingWhitespaceEnabled()) ? ShouldAppendTrailingWhitespace : DontAppendTrailingWh
itespace); | 479 (result.event().clickCount() == 2 && m_frame->editor()->isSelectTrai
lingWhitespaceEnabled()) ? ShouldAppendTrailingWhitespace : DontAppendTrailingWh
itespace); |
478 } | 480 } |
479 } | 481 } |
480 | 482 |
481 void EventHandler::selectClosestWordOrLinkFromMouseEvent(const MouseEventWithHit
TestResults& result) | 483 void EventHandler::selectClosestWordOrLinkFromMouseEvent(const MouseEventWithHit
TestResults& result) |
482 { | 484 { |
483 if (!result.hitTestResult().isLiveLink()) | 485 if (!result.hitTestResult().isLiveLink()) |
484 return selectClosestWordFromMouseEvent(result); | 486 return selectClosestWordFromMouseEvent(result); |
485 | 487 |
486 Node* innerNode = result.targetNode(); | 488 Node* innerNode = result.targetNode(); |
| 489 RenderObject* renderer = result.hitTestResult().renderer(); |
487 | 490 |
488 if (innerNode && innerNode->renderer() && m_mouseDownMayStartSelect) { | 491 if (innerNode && renderer && m_mouseDownMayStartSelect) { |
489 VisibleSelection newSelection; | 492 VisibleSelection newSelection; |
490 Element* URLElement = result.hitTestResult().URLElement(); | 493 Element* URLElement = result.hitTestResult().URLElement(); |
491 VisiblePosition pos(innerNode->renderer()->positionForPoint(result.local
Point())); | 494 VisiblePosition pos(renderer->positionForPoint(result.localPoint())); |
492 if (pos.isNotNull() && pos.deepEquivalent().deprecatedNode()->isDescenda
ntOf(URLElement)) | 495 if (pos.isNotNull() && pos.deepEquivalent().deprecatedNode()->isDescenda
ntOf(URLElement)) |
493 newSelection = VisibleSelection::selectionFromContentsOfNode(URLElem
ent); | 496 newSelection = VisibleSelection::selectionFromContentsOfNode(URLElem
ent); |
494 | 497 |
495 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); | 498 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); |
496 } | 499 } |
497 } | 500 } |
498 | 501 |
499 bool EventHandler::handleMousePressEventDoubleClick(const MouseEventWithHitTestR
esults& event) | 502 bool EventHandler::handleMousePressEventDoubleClick(const MouseEventWithHitTestR
esults& event) |
500 { | 503 { |
501 if (event.event().button() != LeftButton) | 504 if (event.event().button() != LeftButton) |
(...skipping 11 matching lines...) Expand all Loading... |
513 | 516 |
514 return true; | 517 return true; |
515 } | 518 } |
516 | 519 |
517 bool EventHandler::handleMousePressEventTripleClick(const MouseEventWithHitTestR
esults& event) | 520 bool EventHandler::handleMousePressEventTripleClick(const MouseEventWithHitTestR
esults& event) |
518 { | 521 { |
519 if (event.event().button() != LeftButton) | 522 if (event.event().button() != LeftButton) |
520 return false; | 523 return false; |
521 | 524 |
522 Node* innerNode = event.targetNode(); | 525 Node* innerNode = event.targetNode(); |
523 if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect)) | 526 RenderObject* renderer = event.hitTestResult().renderer(); |
| 527 if (!(innerNode && renderer && m_mouseDownMayStartSelect)) |
524 return false; | 528 return false; |
525 | 529 |
526 VisibleSelection newSelection; | 530 VisibleSelection newSelection; |
527 VisiblePosition pos(innerNode->renderer()->positionForPoint(event.localPoint
())); | 531 VisiblePosition pos(renderer->positionForPoint(event.localPoint())); |
528 if (pos.isNotNull()) { | 532 if (pos.isNotNull()) { |
529 newSelection = VisibleSelection(pos); | 533 newSelection = VisibleSelection(pos); |
530 newSelection.expandUsingGranularity(ParagraphGranularity); | 534 newSelection.expandUsingGranularity(ParagraphGranularity); |
531 } | 535 } |
532 | 536 |
533 return updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSe
lectionToRespectUserSelectAll(innerNode, newSelection), ParagraphGranularity); | 537 return updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSe
lectionToRespectUserSelectAll(innerNode, newSelection), ParagraphGranularity); |
534 } | 538 } |
535 | 539 |
536 static int textDistance(const Position& start, const Position& end) | 540 static int textDistance(const Position& start, const Position& end) |
537 { | 541 { |
538 RefPtr<Range> range = Range::create(start.anchorNode()->document(), start,
end); | 542 RefPtr<Range> range = Range::create(start.anchorNode()->document(), start,
end); |
539 return TextIterator::rangeLength(range.get(), true); | 543 return TextIterator::rangeLength(range.get(), true); |
540 } | 544 } |
541 | 545 |
542 bool EventHandler::handleMousePressEventSingleClick(const MouseEventWithHitTestR
esults& event) | 546 bool EventHandler::handleMousePressEventSingleClick(const MouseEventWithHitTestR
esults& event) |
543 { | 547 { |
544 m_frame->document()->updateLayoutIgnorePendingStylesheets(); | 548 m_frame->document()->updateLayoutIgnorePendingStylesheets(); |
545 Node* innerNode = event.targetNode(); | 549 Node* innerNode = event.targetNode(); |
546 if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect)) | 550 RenderObject* renderer = event.hitTestResult().renderer(); |
| 551 if (!(innerNode && renderer && m_mouseDownMayStartSelect)) |
547 return false; | 552 return false; |
548 | 553 |
549 // Extend the selection if the Shift key is down, unless the click is in a l
ink. | 554 // Extend the selection if the Shift key is down, unless the click is in a l
ink. |
550 bool extendSelection = event.event().shiftKey() && !event.isOverLink(); | 555 bool extendSelection = event.event().shiftKey() && !event.isOverLink(); |
551 | 556 |
552 // Don't restart the selection when the mouse is pressed on an | 557 // Don't restart the selection when the mouse is pressed on an |
553 // existing selection so we can allow for text dragging. | 558 // existing selection so we can allow for text dragging. |
554 if (FrameView* view = m_frame->view()) { | 559 if (FrameView* view = m_frame->view()) { |
555 LayoutPoint vPoint = view->windowToContents(event.event().position()); | 560 LayoutPoint vPoint = view->windowToContents(event.event().position()); |
556 if (!extendSelection && m_frame->selection()->contains(vPoint)) { | 561 if (!extendSelection && m_frame->selection()->contains(vPoint)) { |
557 m_mouseDownWasSingleClickInSelection = true; | 562 m_mouseDownWasSingleClickInSelection = true; |
558 return false; | 563 return false; |
559 } | 564 } |
560 } | 565 } |
561 | 566 |
562 VisiblePosition visiblePos(innerNode->renderer()->positionForPoint(event.loc
alPoint())); | 567 VisiblePosition visiblePos(renderer->positionForPoint(event.localPoint())); |
563 if (visiblePos.isNull()) | 568 if (visiblePos.isNull()) |
564 visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOW
NSTREAM); | 569 visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOW
NSTREAM); |
565 Position pos = visiblePos.deepEquivalent(); | 570 Position pos = visiblePos.deepEquivalent(); |
566 | 571 |
567 VisibleSelection newSelection = m_frame->selection()->selection(); | 572 VisibleSelection newSelection = m_frame->selection()->selection(); |
568 TextGranularity granularity = CharacterGranularity; | 573 TextGranularity granularity = CharacterGranularity; |
569 | 574 |
570 if (extendSelection && newSelection.isCaretOrRange()) { | 575 if (extendSelection && newSelection.isCaretOrRange()) { |
571 VisibleSelection selectionInUserSelectAll = expandSelectionToRespectUser
SelectAll(innerNode, VisibleSelection(pos)); | 576 VisibleSelection selectionInUserSelectAll = expandSelectionToRespectUser
SelectAll(innerNode, VisibleSelection(pos)); |
572 if (selectionInUserSelectAll.isRange()) { | 577 if (selectionInUserSelectAll.isRange()) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 if (!m_mousePressed) | 687 if (!m_mousePressed) |
683 return false; | 688 return false; |
684 | 689 |
685 if (handleDrag(event, ShouldCheckDragHysteresis)) | 690 if (handleDrag(event, ShouldCheckDragHysteresis)) |
686 return true; | 691 return true; |
687 | 692 |
688 Node* targetNode = event.targetNode(); | 693 Node* targetNode = event.targetNode(); |
689 if (event.event().button() != LeftButton || !targetNode) | 694 if (event.event().button() != LeftButton || !targetNode) |
690 return false; | 695 return false; |
691 | 696 |
692 RenderObject* renderer = targetNode->renderer(); | 697 RenderObject* renderer = event.hitTestResult().renderer(); |
693 if (!renderer) { | 698 if (!renderer) { |
694 Node* parent = EventPathWalker::parent(targetNode); | 699 Node* parent = EventPathWalker::parent(targetNode); |
695 if (!parent) | 700 if (!parent) |
696 return false; | 701 return false; |
697 | 702 |
698 renderer = parent->renderer(); | 703 renderer = parent->renderer(); |
699 if (!renderer || !renderer->isListBox()) | 704 if (!renderer || !renderer->isListBox()) |
700 return false; | 705 return false; |
701 } | 706 } |
702 | 707 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 | 742 |
738 void EventHandler::updateSelectionForMouseDrag(const HitTestResult& hitTestResul
t) | 743 void EventHandler::updateSelectionForMouseDrag(const HitTestResult& hitTestResul
t) |
739 { | 744 { |
740 if (!m_mouseDownMayStartSelect) | 745 if (!m_mouseDownMayStartSelect) |
741 return; | 746 return; |
742 | 747 |
743 Node* target = hitTestResult.targetNode(); | 748 Node* target = hitTestResult.targetNode(); |
744 if (!target) | 749 if (!target) |
745 return; | 750 return; |
746 | 751 |
| 752 RenderObject* targetRenderer = hitTestResult.renderer(); |
747 VisiblePosition targetPosition = m_frame->selection()->selection().visiblePo
sitionRespectingEditingBoundary(hitTestResult.localPoint(), target); | 753 VisiblePosition targetPosition = m_frame->selection()->selection().visiblePo
sitionRespectingEditingBoundary(hitTestResult.localPoint(), target); |
748 // Don't modify the selection if we're not on a node. | 754 // Don't modify the selection if we're not on a node. |
749 if (targetPosition.isNull()) | 755 if (targetPosition.isNull()) |
750 return; | 756 return; |
751 | 757 |
752 // Restart the selection if this is the first mouse move. This work is usual
ly | 758 // Restart the selection if this is the first mouse move. This work is usual
ly |
753 // done in handleMousePressEvent, but not if the mouse press was on an exist
ing selection. | 759 // done in handleMousePressEvent, but not if the mouse press was on an exist
ing selection. |
754 VisibleSelection newSelection = m_frame->selection()->selection(); | 760 VisibleSelection newSelection = m_frame->selection()->selection(); |
755 | 761 |
756 // Special case to limit selection to the containing block for SVG text. | 762 // Special case to limit selection to the containing block for SVG text. |
757 // FIXME: Isn't there a better non-SVG-specific way to do this? | 763 // FIXME: Isn't there a better non-SVG-specific way to do this? |
758 if (Node* selectionBaseNode = newSelection.base().deprecatedNode()) | 764 if (Node* selectionBaseNode = newSelection.base().deprecatedNode()) |
759 if (RenderObject* selectionBaseRenderer = selectionBaseNode->renderer()) | 765 if (RenderObject* selectionBaseRenderer = selectionBaseNode->renderer()) |
760 if (selectionBaseRenderer->isSVGText()) | 766 if (selectionBaseRenderer->isSVGText()) |
761 if (target->renderer()->containingBlock() != selectionBaseRender
er->containingBlock()) | 767 if (targetRenderer->containingBlock() != selectionBaseRenderer->
containingBlock()) |
762 return; | 768 return; |
763 | 769 |
764 if (m_selectionInitiationState == HaveNotStartedSelection && !dispatchSelect
Start(target)) | 770 if (m_selectionInitiationState == HaveNotStartedSelection && !dispatchSelect
Start(target)) |
765 return; | 771 return; |
766 | 772 |
767 if (m_selectionInitiationState != ExtendedSelection) { | 773 if (m_selectionInitiationState != ExtendedSelection) { |
768 // Always extend selection here because it's caused by a mouse drag | 774 // Always extend selection here because it's caused by a mouse drag |
769 m_selectionInitiationState = ExtendedSelection; | 775 m_selectionInitiationState = ExtendedSelection; |
770 newSelection = VisibleSelection(targetPosition); | 776 newSelection = VisibleSelection(targetPosition); |
771 } | 777 } |
772 | 778 |
773 #if ENABLE(USERSELECT_ALL) | 779 #if ENABLE(USERSELECT_ALL) |
774 Node* rootUserSelectAllForMousePressNode = Position::rootUserSelectAllForNod
e(m_mousePressNode.get()); | 780 Node* rootUserSelectAllForMousePressNode = Position::rootUserSelectAllForNod
e(m_mousePressNode.get()); |
775 if (rootUserSelectAllForMousePressNode && rootUserSelectAllForMousePressNode
== Position::rootUserSelectAllForNode(target)) { | 781 if (rootUserSelectAllForMousePressNode && rootUserSelectAllForMousePressNode
== Position::rootUserSelectAllForNode(target)) { |
776 newSelection.setBase(positionBeforeNode(rootUserSelectAllForMousePressNo
de).upstream(CanCrossEditingBoundary)); | 782 newSelection.setBase(positionBeforeNode(rootUserSelectAllForMousePressNo
de).upstream(CanCrossEditingBoundary)); |
777 newSelection.setExtent(positionAfterNode(rootUserSelectAllForMousePressN
ode).downstream(CanCrossEditingBoundary)); | 783 newSelection.setExtent(positionAfterNode(rootUserSelectAllForMousePressN
ode).downstream(CanCrossEditingBoundary)); |
778 } else { | 784 } else { |
779 // Reset base for user select all when base is inside user-select-all ar
ea and extent < base. | 785 // Reset base for user select all when base is inside user-select-all ar
ea and extent < base. |
780 if (rootUserSelectAllForMousePressNode && comparePositions(target->rende
rer()->positionForPoint(hitTestResult.localPoint()), m_mousePressNode->renderer(
)->positionForPoint(m_dragStartPos)) < 0) | 786 if (rootUserSelectAllForMousePressNode && comparePositions(targetRendere
r->positionForPoint(hitTestResult.localPoint()), m_mousePressNode->renderer()->p
ositionForPoint(m_dragStartPos)) < 0) |
781 newSelection.setBase(positionAfterNode(rootUserSelectAllForMousePres
sNode).downstream(CanCrossEditingBoundary)); | 787 newSelection.setBase(positionAfterNode(rootUserSelectAllForMousePres
sNode).downstream(CanCrossEditingBoundary)); |
782 | 788 |
783 Node* rootUserSelectAllForTarget = Position::rootUserSelectAllForNode(ta
rget); | 789 Node* rootUserSelectAllForTarget = Position::rootUserSelectAllForNode(ta
rget); |
784 if (rootUserSelectAllForTarget && m_mousePressNode->renderer() && compar
ePositions(target->renderer()->positionForPoint(hitTestResult.localPoint()), m_m
ousePressNode->renderer()->positionForPoint(m_dragStartPos)) < 0) | 790 if (rootUserSelectAllForTarget && m_mousePressNode->renderer() && compar
ePositions(targetRenderer->positionForPoint(hitTestResult.localPoint()), m_mouse
PressNode->renderer()->positionForPoint(m_dragStartPos)) < 0) |
785 newSelection.setExtent(positionBeforeNode(rootUserSelectAllForTarget
).upstream(CanCrossEditingBoundary)); | 791 newSelection.setExtent(positionBeforeNode(rootUserSelectAllForTarget
).upstream(CanCrossEditingBoundary)); |
786 else if (rootUserSelectAllForTarget && m_mousePressNode->renderer()) | 792 else if (rootUserSelectAllForTarget && m_mousePressNode->renderer()) |
787 newSelection.setExtent(positionAfterNode(rootUserSelectAllForTarget)
.downstream(CanCrossEditingBoundary)); | 793 newSelection.setExtent(positionAfterNode(rootUserSelectAllForTarget)
.downstream(CanCrossEditingBoundary)); |
788 else | 794 else |
789 newSelection.setExtent(targetPosition); | 795 newSelection.setExtent(targetPosition); |
790 } | 796 } |
791 #else | 797 #else |
792 newSelection.setExtent(targetPosition); | 798 newSelection.setExtent(targetPosition); |
793 #endif | 799 #endif |
794 | 800 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 // Clear the selection if the mouse didn't move after the last mouse | 843 // Clear the selection if the mouse didn't move after the last mouse |
838 // press and it's not a context menu click. We do this so when clicking | 844 // press and it's not a context menu click. We do this so when clicking |
839 // on the selection, the selection goes away. However, if we are | 845 // on the selection, the selection goes away. However, if we are |
840 // editing, place the caret. | 846 // editing, place the caret. |
841 if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != Ex
tendedSelection | 847 if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != Ex
tendedSelection |
842 && m_dragStartPos == event.event().position() | 848 && m_dragStartPos == event.event().position() |
843 && m_frame->selection()->isRange() | 849 && m_frame->selection()->isRange() |
844 && event.event().button() != RightButton) { | 850 && event.event().button() != RightButton) { |
845 VisibleSelection newSelection; | 851 VisibleSelection newSelection; |
846 Node* node = event.targetNode(); | 852 Node* node = event.targetNode(); |
| 853 RenderObject* renderer = event.hitTestResult().renderer(); |
847 bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBr
owsingEnabled(); | 854 bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBr
owsingEnabled(); |
848 if (node && (caretBrowsing || node->rendererIsEditable()) && node->rende
rer()) { | 855 if (node && (caretBrowsing || node->rendererIsEditable()) && renderer) |
849 VisiblePosition pos = VisiblePosition(node->renderer()->positionForP
oint(event.localPoint())); | 856 newSelection = VisibleSelection(VisiblePosition(renderer->positionFo
rPoint(event.localPoint()))); |
850 newSelection = VisibleSelection(pos); | |
851 } | |
852 | 857 |
853 setSelectionIfNeeded(m_frame->selection(), newSelection); | 858 setSelectionIfNeeded(m_frame->selection(), newSelection); |
854 | 859 |
855 handled = true; | 860 handled = true; |
856 } | 861 } |
857 | 862 |
858 m_frame->selection()->notifyRendererOfSelectionChange(UserTriggered); | 863 m_frame->selection()->notifyRendererOfSelectionChange(UserTriggered); |
859 | 864 |
860 m_frame->selection()->selectFrameElementInParentIfFullySelected(); | 865 m_frame->selection()->selectFrameElementInParentIfFullySelected(); |
861 | 866 |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 | 1114 |
1110 Page* page = m_frame->page(); | 1115 Page* page = m_frame->page(); |
1111 if (!page) | 1116 if (!page) |
1112 return NoCursorChange; | 1117 return NoCursorChange; |
1113 #if OS(WINDOWS) | 1118 #if OS(WINDOWS) |
1114 if (panScrollInProgress()) | 1119 if (panScrollInProgress()) |
1115 return NoCursorChange; | 1120 return NoCursorChange; |
1116 #endif | 1121 #endif |
1117 | 1122 |
1118 Node* node = event.targetNode(); | 1123 Node* node = event.targetNode(); |
1119 RenderObject* renderer = node ? node->renderer() : 0; | 1124 RenderObject* renderer = event.hitTestResult().renderer(); |
1120 RenderStyle* style = renderer ? renderer->style() : 0; | 1125 RenderStyle* style = renderer ? renderer->style() : 0; |
1121 bool horizontalText = !style || style->isHorizontalWritingMode(); | 1126 bool horizontalText = !style || style->isHorizontalWritingMode(); |
1122 const Cursor& iBeam = horizontalText ? iBeamCursor() : verticalTextCursor(); | 1127 const Cursor& iBeam = horizontalText ? iBeamCursor() : verticalTextCursor(); |
1123 | 1128 |
1124 // During selection, use an I-beam no matter what we're over. | 1129 // During selection, use an I-beam no matter what we're over. |
1125 // If a drag may be starting or we're capturing mouse events for a particula
r node, don't treat this as a selection. | 1130 // If a drag may be starting or we're capturing mouse events for a particula
r node, don't treat this as a selection. |
1126 if (m_mousePressed && m_mouseDownMayStartSelect | 1131 if (m_mousePressed && m_mouseDownMayStartSelect |
1127 && !m_mouseDownMayStartDrag | 1132 && !m_mouseDownMayStartDrag |
1128 && m_frame->selection()->isCaretOrRange() && !m_capturingMouseEventsNode
) | 1133 && m_frame->selection()->isCaretOrRange() && !m_capturingMouseEventsNode
) |
1129 return iBeam; | 1134 return iBeam; |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1336 if (isPanScrollInProgress) { | 1341 if (isPanScrollInProgress) { |
1337 // We invalidate the click when exiting pan scrolling so that we don't i
nadvertently navigate | 1342 // We invalidate the click when exiting pan scrolling so that we don't i
nadvertently navigate |
1338 // away from the current page (e.g. the click was on a hyperlink). See <
rdar://problem/6095023>. | 1343 // away from the current page (e.g. the click was on a hyperlink). See <
rdar://problem/6095023>. |
1339 invalidateClick(); | 1344 invalidateClick(); |
1340 return true; | 1345 return true; |
1341 } | 1346 } |
1342 #endif | 1347 #endif |
1343 | 1348 |
1344 m_clickCount = mouseEvent.clickCount(); | 1349 m_clickCount = mouseEvent.clickCount(); |
1345 m_clickNode = mev.targetNode(); | 1350 m_clickNode = mev.targetNode(); |
| 1351 RenderObject* clickRenderer = mev.hitTestResult().renderer(); |
1346 | 1352 |
1347 if (FrameView* view = m_frame->view()) { | 1353 if (FrameView* view = m_frame->view()) { |
1348 RenderLayer* layer = m_clickNode->renderer() ? m_clickNode->renderer()->
enclosingLayer() : 0; | 1354 RenderLayer* layer = clickRenderer ? clickRenderer->enclosingLayer() : 0
; |
1349 IntPoint p = view->windowToContents(mouseEvent.position()); | 1355 IntPoint p = view->windowToContents(mouseEvent.position()); |
1350 if (layer && layer->isPointInResizeControl(p, RenderLayer::ResizerForPoi
nter)) { | 1356 if (layer && layer->isPointInResizeControl(p, RenderLayer::ResizerForPoi
nter)) { |
1351 layer->setInResizeMode(true); | 1357 layer->setInResizeMode(true); |
1352 m_resizeLayer = layer; | 1358 m_resizeLayer = layer; |
1353 m_offsetFromResizeCorner = layer->offsetFromResizeCorner(p); | 1359 m_offsetFromResizeCorner = layer->offsetFromResizeCorner(p); |
1354 invalidateClick(); | 1360 invalidateClick(); |
1355 return true; | 1361 return true; |
1356 } | 1362 } |
1357 } | 1363 } |
1358 | 1364 |
(...skipping 2451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3810 // the event via an EventTargetNode dispatch when this returns false. | 3816 // the event via an EventTargetNode dispatch when this returns false. |
3811 if (!widget->isFrameView()) | 3817 if (!widget->isFrameView()) |
3812 return false; | 3818 return false; |
3813 | 3819 |
3814 return toFrameView(widget)->frame()->eventHandler()->handleWheelEvent(wheelE
vent); | 3820 return toFrameView(widget)->frame()->eventHandler()->handleWheelEvent(wheelE
vent); |
3815 } | 3821 } |
3816 | 3822 |
3817 bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestR
esults& event) | 3823 bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestR
esults& event) |
3818 { | 3824 { |
3819 // Figure out which view to send the event to. | 3825 // Figure out which view to send the event to. |
3820 if (!event.targetNode() || !event.targetNode()->renderer() || !event.targetN
ode()->renderer()->isWidget()) | 3826 if (!event.targetNode() || !event.hitTestResult().renderer() || !event.hitTe
stResult().renderer()->isWidget()) |
3821 return false; | 3827 return false; |
3822 return false; | 3828 return false; |
3823 } | 3829 } |
3824 | 3830 |
3825 PassRefPtr<Clipboard> EventHandler::createDraggingClipboard() const | 3831 PassRefPtr<Clipboard> EventHandler::createDraggingClipboard() const |
3826 { | 3832 { |
3827 RefPtr<ChromiumDataObject> dataObject = ChromiumDataObject::create(); | 3833 RefPtr<ChromiumDataObject> dataObject = ChromiumDataObject::create(); |
3828 return ClipboardChromium::create(Clipboard::DragAndDrop, dataObject.get(), C
lipboardWritable, m_frame); | 3834 return ClipboardChromium::create(Clipboard::DragAndDrop, dataObject.get(), C
lipboardWritable, m_frame); |
3829 } | 3835 } |
3830 | 3836 |
3831 void EventHandler::focusDocumentView() | 3837 void EventHandler::focusDocumentView() |
3832 { | 3838 { |
3833 Page* page = m_frame->page(); | 3839 Page* page = m_frame->page(); |
3834 if (!page) | 3840 if (!page) |
3835 return; | 3841 return; |
3836 page->focusController()->setFocusedFrame(m_frame); | 3842 page->focusController()->setFocusedFrame(m_frame); |
3837 } | 3843 } |
3838 | 3844 |
3839 unsigned EventHandler::accessKeyModifiers() | 3845 unsigned EventHandler::accessKeyModifiers() |
3840 { | 3846 { |
3841 #if OS(DARWIN) | 3847 #if OS(DARWIN) |
3842 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; | 3848 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; |
3843 #else | 3849 #else |
3844 return PlatformEvent::AltKey; | 3850 return PlatformEvent::AltKey; |
3845 #endif | 3851 #endif |
3846 } | 3852 } |
3847 | 3853 |
3848 } // namespace WebCore | 3854 } // namespace WebCore |
OLD | NEW |