| 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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 } | 328 } |
| 329 | 329 |
| 330 static void setSelectionIfNeeded(FrameSelection& selection, const VisibleSelecti
on& newSelection) | 330 static void setSelectionIfNeeded(FrameSelection& selection, const VisibleSelecti
on& newSelection) |
| 331 { | 331 { |
| 332 if (selection.selection() != newSelection) | 332 if (selection.selection() != newSelection) |
| 333 selection.setSelection(newSelection); | 333 selection.setSelection(newSelection); |
| 334 } | 334 } |
| 335 | 335 |
| 336 static inline bool dispatchSelectStart(Node* node) | 336 static inline bool dispatchSelectStart(Node* node) |
| 337 { | 337 { |
| 338 if (!node || !node->renderer()) | 338 if (!node || !node->layoutObject()) |
| 339 return true; | 339 return true; |
| 340 | 340 |
| 341 return node->dispatchEvent(Event::createCancelableBubble(EventTypeNames::sel
ectstart)); | 341 return node->dispatchEvent(Event::createCancelableBubble(EventTypeNames::sel
ectstart)); |
| 342 } | 342 } |
| 343 | 343 |
| 344 static VisibleSelection expandSelectionToRespectUserSelectAll(Node* targetNode,
const VisibleSelection& selection) | 344 static VisibleSelection expandSelectionToRespectUserSelectAll(Node* targetNode,
const VisibleSelection& selection) |
| 345 { | 345 { |
| 346 Node* rootUserSelectAll = Position::rootUserSelectAllForNode(targetNode); | 346 Node* rootUserSelectAll = Position::rootUserSelectAllForNode(targetNode); |
| 347 if (!rootUserSelectAll) | 347 if (!rootUserSelectAll) |
| 348 return selection; | 348 return selection; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 372 m_frame->selection().setNonDirectionalSelectionIfNeeded(selection, granulari
ty); | 372 m_frame->selection().setNonDirectionalSelectionIfNeeded(selection, granulari
ty); |
| 373 | 373 |
| 374 return true; | 374 return true; |
| 375 } | 375 } |
| 376 | 376 |
| 377 void EventHandler::selectClosestWordFromHitTestResult(const HitTestResult& resul
t, AppendTrailingWhitespace appendTrailingWhitespace) | 377 void EventHandler::selectClosestWordFromHitTestResult(const HitTestResult& resul
t, AppendTrailingWhitespace appendTrailingWhitespace) |
| 378 { | 378 { |
| 379 Node* innerNode = result.innerNode(); | 379 Node* innerNode = result.innerNode(); |
| 380 VisibleSelection newSelection; | 380 VisibleSelection newSelection; |
| 381 | 381 |
| 382 if (innerNode && innerNode->renderer()) { | 382 if (innerNode && innerNode->layoutObject()) { |
| 383 VisiblePosition pos(innerNode->renderer()->positionForPoint(result.local
Point())); | 383 VisiblePosition pos(innerNode->layoutObject()->positionForPoint(result.l
ocalPoint())); |
| 384 if (pos.isNotNull()) { | 384 if (pos.isNotNull()) { |
| 385 newSelection = VisibleSelection(pos); | 385 newSelection = VisibleSelection(pos); |
| 386 newSelection.expandUsingGranularity(WordGranularity); | 386 newSelection.expandUsingGranularity(WordGranularity); |
| 387 } | 387 } |
| 388 | 388 |
| 389 if (appendTrailingWhitespace == ShouldAppendTrailingWhitespace && newSel
ection.isRange()) | 389 if (appendTrailingWhitespace == ShouldAppendTrailingWhitespace && newSel
ection.isRange()) |
| 390 newSelection.appendTrailingWhitespace(); | 390 newSelection.appendTrailingWhitespace(); |
| 391 | 391 |
| 392 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); | 392 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); |
| 393 } | 393 } |
| 394 } | 394 } |
| 395 | 395 |
| 396 void EventHandler::selectClosestMisspellingFromHitTestResult(const HitTestResult
& result, AppendTrailingWhitespace appendTrailingWhitespace) | 396 void EventHandler::selectClosestMisspellingFromHitTestResult(const HitTestResult
& result, AppendTrailingWhitespace appendTrailingWhitespace) |
| 397 { | 397 { |
| 398 Node* innerNode = result.innerNode(); | 398 Node* innerNode = result.innerNode(); |
| 399 VisibleSelection newSelection; | 399 VisibleSelection newSelection; |
| 400 | 400 |
| 401 if (innerNode && innerNode->renderer()) { | 401 if (innerNode && innerNode->layoutObject()) { |
| 402 VisiblePosition pos(innerNode->renderer()->positionForPoint(result.local
Point())); | 402 VisiblePosition pos(innerNode->layoutObject()->positionForPoint(result.l
ocalPoint())); |
| 403 Position start = pos.deepEquivalent(); | 403 Position start = pos.deepEquivalent(); |
| 404 Position end = pos.deepEquivalent(); | 404 Position end = pos.deepEquivalent(); |
| 405 if (pos.isNotNull()) { | 405 if (pos.isNotNull()) { |
| 406 DocumentMarkerVector markers = innerNode->document().markers().marke
rsInRange(makeRange(pos, pos).get(), DocumentMarker::MisspellingMarkers()); | 406 DocumentMarkerVector markers = innerNode->document().markers().marke
rsInRange(makeRange(pos, pos).get(), DocumentMarker::MisspellingMarkers()); |
| 407 if (markers.size() == 1) { | 407 if (markers.size() == 1) { |
| 408 start.moveToOffset(markers[0]->startOffset()); | 408 start.moveToOffset(markers[0]->startOffset()); |
| 409 end.moveToOffset(markers[0]->endOffset()); | 409 end.moveToOffset(markers[0]->endOffset()); |
| 410 newSelection = VisibleSelection(start, end); | 410 newSelection = VisibleSelection(start, end); |
| 411 } | 411 } |
| 412 } | 412 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 434 } | 434 } |
| 435 } | 435 } |
| 436 | 436 |
| 437 void EventHandler::selectClosestWordOrLinkFromMouseEvent(const MouseEventWithHit
TestResults& result) | 437 void EventHandler::selectClosestWordOrLinkFromMouseEvent(const MouseEventWithHit
TestResults& result) |
| 438 { | 438 { |
| 439 if (!result.hitTestResult().isLiveLink()) | 439 if (!result.hitTestResult().isLiveLink()) |
| 440 return selectClosestWordFromMouseEvent(result); | 440 return selectClosestWordFromMouseEvent(result); |
| 441 | 441 |
| 442 Node* innerNode = result.innerNode(); | 442 Node* innerNode = result.innerNode(); |
| 443 | 443 |
| 444 if (innerNode && innerNode->renderer() && m_mouseDownMayStartSelect) { | 444 if (innerNode && innerNode->layoutObject() && m_mouseDownMayStartSelect) { |
| 445 VisibleSelection newSelection; | 445 VisibleSelection newSelection; |
| 446 Element* URLElement = result.hitTestResult().URLElement(); | 446 Element* URLElement = result.hitTestResult().URLElement(); |
| 447 VisiblePosition pos(innerNode->renderer()->positionForPoint(result.local
Point())); | 447 VisiblePosition pos(innerNode->layoutObject()->positionForPoint(result.l
ocalPoint())); |
| 448 if (pos.isNotNull() && pos.deepEquivalent().deprecatedNode()->isDescenda
ntOf(URLElement)) | 448 if (pos.isNotNull() && pos.deepEquivalent().deprecatedNode()->isDescenda
ntOf(URLElement)) |
| 449 newSelection = VisibleSelection::selectionFromContentsOfNode(URLElem
ent); | 449 newSelection = VisibleSelection::selectionFromContentsOfNode(URLElem
ent); |
| 450 | 450 |
| 451 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); | 451 updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSelec
tionToRespectUserSelectAll(innerNode, newSelection), WordGranularity); |
| 452 } | 452 } |
| 453 } | 453 } |
| 454 | 454 |
| 455 bool EventHandler::handleMousePressEventDoubleClick(const MouseEventWithHitTestR
esults& event) | 455 bool EventHandler::handleMousePressEventDoubleClick(const MouseEventWithHitTestR
esults& event) |
| 456 { | 456 { |
| 457 TRACE_EVENT0("blink", "EventHandler::handleMousePressEventDoubleClick"); | 457 TRACE_EVENT0("blink", "EventHandler::handleMousePressEventDoubleClick"); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 473 } | 473 } |
| 474 | 474 |
| 475 bool EventHandler::handleMousePressEventTripleClick(const MouseEventWithHitTestR
esults& event) | 475 bool EventHandler::handleMousePressEventTripleClick(const MouseEventWithHitTestR
esults& event) |
| 476 { | 476 { |
| 477 TRACE_EVENT0("blink", "EventHandler::handleMousePressEventTripleClick"); | 477 TRACE_EVENT0("blink", "EventHandler::handleMousePressEventTripleClick"); |
| 478 | 478 |
| 479 if (event.event().button() != LeftButton) | 479 if (event.event().button() != LeftButton) |
| 480 return false; | 480 return false; |
| 481 | 481 |
| 482 Node* innerNode = event.innerNode(); | 482 Node* innerNode = event.innerNode(); |
| 483 if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect)) | 483 if (!(innerNode && innerNode->layoutObject() && m_mouseDownMayStartSelect)) |
| 484 return false; | 484 return false; |
| 485 | 485 |
| 486 VisibleSelection newSelection; | 486 VisibleSelection newSelection; |
| 487 VisiblePosition pos(innerNode->renderer()->positionForPoint(event.localPoint
())); | 487 VisiblePosition pos(innerNode->layoutObject()->positionForPoint(event.localP
oint())); |
| 488 if (pos.isNotNull()) { | 488 if (pos.isNotNull()) { |
| 489 newSelection = VisibleSelection(pos); | 489 newSelection = VisibleSelection(pos); |
| 490 newSelection.expandUsingGranularity(ParagraphGranularity); | 490 newSelection.expandUsingGranularity(ParagraphGranularity); |
| 491 } | 491 } |
| 492 | 492 |
| 493 return updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSe
lectionToRespectUserSelectAll(innerNode, newSelection), ParagraphGranularity); | 493 return updateSelectionForMouseDownDispatchingSelectStart(innerNode, expandSe
lectionToRespectUserSelectAll(innerNode, newSelection), ParagraphGranularity); |
| 494 } | 494 } |
| 495 | 495 |
| 496 static int textDistance(const Position& start, const Position& end) | 496 static int textDistance(const Position& start, const Position& end) |
| 497 { | 497 { |
| 498 RefPtrWillBeRawPtr<Range> range = Range::create(*start.document(), start, en
d); | 498 RefPtrWillBeRawPtr<Range> range = Range::create(*start.document(), start, en
d); |
| 499 return TextIterator::rangeLength(range.get(), true); | 499 return TextIterator::rangeLength(range.get(), true); |
| 500 } | 500 } |
| 501 | 501 |
| 502 bool EventHandler::handleMousePressEventSingleClick(const MouseEventWithHitTestR
esults& event) | 502 bool EventHandler::handleMousePressEventSingleClick(const MouseEventWithHitTestR
esults& event) |
| 503 { | 503 { |
| 504 TRACE_EVENT0("blink", "EventHandler::handleMousePressEventSingleClick"); | 504 TRACE_EVENT0("blink", "EventHandler::handleMousePressEventSingleClick"); |
| 505 | 505 |
| 506 m_frame->document()->updateLayoutIgnorePendingStylesheets(); | 506 m_frame->document()->updateLayoutIgnorePendingStylesheets(); |
| 507 Node* innerNode = event.innerNode(); | 507 Node* innerNode = event.innerNode(); |
| 508 if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect)) | 508 if (!(innerNode && innerNode->layoutObject() && m_mouseDownMayStartSelect)) |
| 509 return false; | 509 return false; |
| 510 | 510 |
| 511 // Extend the selection if the Shift key is down, unless the click is in a l
ink. | 511 // Extend the selection if the Shift key is down, unless the click is in a l
ink. |
| 512 bool extendSelection = event.event().shiftKey() && !event.isOverLink(); | 512 bool extendSelection = event.event().shiftKey() && !event.isOverLink(); |
| 513 | 513 |
| 514 // Don't restart the selection when the mouse is pressed on an | 514 // Don't restart the selection when the mouse is pressed on an |
| 515 // existing selection so we can allow for text dragging. | 515 // existing selection so we can allow for text dragging. |
| 516 if (FrameView* view = m_frame->view()) { | 516 if (FrameView* view = m_frame->view()) { |
| 517 LayoutPoint vPoint = view->windowToContents(event.event().position()); | 517 LayoutPoint vPoint = view->windowToContents(event.event().position()); |
| 518 if (!extendSelection && m_frame->selection().contains(vPoint)) { | 518 if (!extendSelection && m_frame->selection().contains(vPoint)) { |
| 519 m_mouseDownWasSingleClickInSelection = true; | 519 m_mouseDownWasSingleClickInSelection = true; |
| 520 return false; | 520 return false; |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 | 523 |
| 524 VisiblePosition visiblePos(innerNode->renderer()->positionForPoint(event.loc
alPoint())); | 524 VisiblePosition visiblePos(innerNode->layoutObject()->positionForPoint(event
.localPoint())); |
| 525 if (visiblePos.isNull()) | 525 if (visiblePos.isNull()) |
| 526 visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOW
NSTREAM); | 526 visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOW
NSTREAM); |
| 527 Position pos = visiblePos.deepEquivalent(); | 527 Position pos = visiblePos.deepEquivalent(); |
| 528 | 528 |
| 529 VisibleSelection newSelection = m_frame->selection().selection(); | 529 VisibleSelection newSelection = m_frame->selection().selection(); |
| 530 TextGranularity granularity = CharacterGranularity; | 530 TextGranularity granularity = CharacterGranularity; |
| 531 | 531 |
| 532 if (extendSelection && newSelection.isCaretOrRange()) { | 532 if (extendSelection && newSelection.isCaretOrRange()) { |
| 533 VisibleSelection selectionInUserSelectAll(expandSelectionToRespectUserSe
lectAll(innerNode, VisibleSelection(VisiblePosition(pos)))); | 533 VisibleSelection selectionInUserSelectAll(expandSelectionToRespectUserSe
lectAll(innerNode, VisibleSelection(VisiblePosition(pos)))); |
| 534 if (selectionInUserSelectAll.isRange()) { | 534 if (selectionInUserSelectAll.isRange()) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 562 newSelection = expandSelectionToRespectUserSelectAll(innerNode, VisibleS
election(visiblePos)); | 562 newSelection = expandSelectionToRespectUserSelectAll(innerNode, VisibleS
election(visiblePos)); |
| 563 } | 563 } |
| 564 | 564 |
| 565 // Updating the selection is considered side-effect of the event and so it d
oesn't impact the handled state. | 565 // Updating the selection is considered side-effect of the event and so it d
oesn't impact the handled state. |
| 566 updateSelectionForMouseDownDispatchingSelectStart(innerNode, newSelection, g
ranularity); | 566 updateSelectionForMouseDownDispatchingSelectStart(innerNode, newSelection, g
ranularity); |
| 567 return false; | 567 return false; |
| 568 } | 568 } |
| 569 | 569 |
| 570 static inline bool canMouseDownStartSelect(Node* node) | 570 static inline bool canMouseDownStartSelect(Node* node) |
| 571 { | 571 { |
| 572 if (!node || !node->renderer()) | 572 if (!node || !node->layoutObject()) |
| 573 return true; | 573 return true; |
| 574 | 574 |
| 575 if (!node->canStartSelection()) | 575 if (!node->canStartSelection()) |
| 576 return false; | 576 return false; |
| 577 | 577 |
| 578 return true; | 578 return true; |
| 579 } | 579 } |
| 580 | 580 |
| 581 bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve
nt) | 581 bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve
nt) |
| 582 { | 582 { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 if (!m_mousePressed) | 665 if (!m_mousePressed) |
| 666 return false; | 666 return false; |
| 667 | 667 |
| 668 if (handleDrag(event, DragInitiator::Mouse)) | 668 if (handleDrag(event, DragInitiator::Mouse)) |
| 669 return true; | 669 return true; |
| 670 | 670 |
| 671 Node* targetNode = event.innerNode(); | 671 Node* targetNode = event.innerNode(); |
| 672 if (!targetNode) | 672 if (!targetNode) |
| 673 return false; | 673 return false; |
| 674 | 674 |
| 675 LayoutObject* renderer = targetNode->renderer(); | 675 LayoutObject* renderer = targetNode->layoutObject(); |
| 676 if (!renderer) { | 676 if (!renderer) { |
| 677 Node* parent = NodeRenderingTraversal::parent(*targetNode); | 677 Node* parent = NodeRenderingTraversal::parent(*targetNode); |
| 678 if (!parent) | 678 if (!parent) |
| 679 return false; | 679 return false; |
| 680 | 680 |
| 681 renderer = parent->renderer(); | 681 renderer = parent->layoutObject(); |
| 682 if (!renderer || !renderer->isListBox()) | 682 if (!renderer || !renderer->isListBox()) |
| 683 return false; | 683 return false; |
| 684 } | 684 } |
| 685 | 685 |
| 686 m_mouseDownMayStartDrag = false; | 686 m_mouseDownMayStartDrag = false; |
| 687 | 687 |
| 688 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) { | 688 if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) { |
| 689 if (AutoscrollController* controller = autoscrollController()) { | 689 if (AutoscrollController* controller = autoscrollController()) { |
| 690 controller->startAutoscrollForSelection(renderer); | 690 controller->startAutoscrollForSelection(renderer); |
| 691 m_mouseDownMayStartAutoscroll = false; | 691 m_mouseDownMayStartAutoscroll = false; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 if (targetPosition.isNull()) | 732 if (targetPosition.isNull()) |
| 733 return; | 733 return; |
| 734 | 734 |
| 735 // Restart the selection if this is the first mouse move. This work is usual
ly | 735 // Restart the selection if this is the first mouse move. This work is usual
ly |
| 736 // done in handleMousePressEvent, but not if the mouse press was on an exist
ing selection. | 736 // done in handleMousePressEvent, but not if the mouse press was on an exist
ing selection. |
| 737 VisibleSelection newSelection = m_frame->selection().selection(); | 737 VisibleSelection newSelection = m_frame->selection().selection(); |
| 738 | 738 |
| 739 // Special case to limit selection to the containing block for SVG text. | 739 // Special case to limit selection to the containing block for SVG text. |
| 740 // FIXME: Isn't there a better non-SVG-specific way to do this? | 740 // FIXME: Isn't there a better non-SVG-specific way to do this? |
| 741 if (Node* selectionBaseNode = newSelection.base().deprecatedNode()) | 741 if (Node* selectionBaseNode = newSelection.base().deprecatedNode()) |
| 742 if (LayoutObject* selectionBaseRenderer = selectionBaseNode->renderer()) | 742 if (LayoutObject* selectionBaseRenderer = selectionBaseNode->layoutObjec
t()) |
| 743 if (selectionBaseRenderer->isSVGText()) | 743 if (selectionBaseRenderer->isSVGText()) |
| 744 if (target->renderer()->containingBlock() != selectionBaseRender
er->containingBlock()) | 744 if (target->layoutObject()->containingBlock() != selectionBaseRe
nderer->containingBlock()) |
| 745 return; | 745 return; |
| 746 | 746 |
| 747 if (m_selectionInitiationState == HaveNotStartedSelection && !dispatchSelect
Start(target)) | 747 if (m_selectionInitiationState == HaveNotStartedSelection && !dispatchSelect
Start(target)) |
| 748 return; | 748 return; |
| 749 | 749 |
| 750 if (m_selectionInitiationState != ExtendedSelection) { | 750 if (m_selectionInitiationState != ExtendedSelection) { |
| 751 // Always extend selection here because it's caused by a mouse drag | 751 // Always extend selection here because it's caused by a mouse drag |
| 752 m_selectionInitiationState = ExtendedSelection; | 752 m_selectionInitiationState = ExtendedSelection; |
| 753 newSelection = VisibleSelection(targetPosition); | 753 newSelection = VisibleSelection(targetPosition); |
| 754 } | 754 } |
| 755 | 755 |
| 756 if (RuntimeEnabledFeatures::userSelectAllEnabled()) { | 756 if (RuntimeEnabledFeatures::userSelectAllEnabled()) { |
| 757 Node* rootUserSelectAllForMousePressNode = Position::rootUserSelectAllFo
rNode(m_mousePressNode.get()); | 757 Node* rootUserSelectAllForMousePressNode = Position::rootUserSelectAllFo
rNode(m_mousePressNode.get()); |
| 758 if (rootUserSelectAllForMousePressNode && rootUserSelectAllForMousePress
Node == Position::rootUserSelectAllForNode(target)) { | 758 if (rootUserSelectAllForMousePressNode && rootUserSelectAllForMousePress
Node == Position::rootUserSelectAllForNode(target)) { |
| 759 newSelection.setBase(positionBeforeNode(rootUserSelectAllForMousePre
ssNode).upstream(CanCrossEditingBoundary)); | 759 newSelection.setBase(positionBeforeNode(rootUserSelectAllForMousePre
ssNode).upstream(CanCrossEditingBoundary)); |
| 760 newSelection.setExtent(positionAfterNode(rootUserSelectAllForMousePr
essNode).downstream(CanCrossEditingBoundary)); | 760 newSelection.setExtent(positionAfterNode(rootUserSelectAllForMousePr
essNode).downstream(CanCrossEditingBoundary)); |
| 761 } else { | 761 } else { |
| 762 // Reset base for user select all when base is inside user-select-al
l area and extent < base. | 762 // Reset base for user select all when base is inside user-select-al
l area and extent < base. |
| 763 if (rootUserSelectAllForMousePressNode && comparePositions(target->r
enderer()->positionForPoint(hitTestResult.localPoint()), m_mousePressNode->rende
rer()->positionForPoint(m_dragStartPos)) < 0) | 763 if (rootUserSelectAllForMousePressNode && comparePositions(target->l
ayoutObject()->positionForPoint(hitTestResult.localPoint()), m_mousePressNode->l
ayoutObject()->positionForPoint(m_dragStartPos)) < 0) |
| 764 newSelection.setBase(positionAfterNode(rootUserSelectAllForMouse
PressNode).downstream(CanCrossEditingBoundary)); | 764 newSelection.setBase(positionAfterNode(rootUserSelectAllForMouse
PressNode).downstream(CanCrossEditingBoundary)); |
| 765 | 765 |
| 766 Node* rootUserSelectAllForTarget = Position::rootUserSelectAllForNod
e(target); | 766 Node* rootUserSelectAllForTarget = Position::rootUserSelectAllForNod
e(target); |
| 767 if (rootUserSelectAllForTarget && m_mousePressNode->renderer() && co
mparePositions(target->renderer()->positionForPoint(hitTestResult.localPoint()),
m_mousePressNode->renderer()->positionForPoint(m_dragStartPos)) < 0) | 767 if (rootUserSelectAllForTarget && m_mousePressNode->layoutObject() &
& comparePositions(target->layoutObject()->positionForPoint(hitTestResult.localP
oint()), m_mousePressNode->layoutObject()->positionForPoint(m_dragStartPos)) < 0
) |
| 768 newSelection.setExtent(positionBeforeNode(rootUserSelectAllForTa
rget).upstream(CanCrossEditingBoundary)); | 768 newSelection.setExtent(positionBeforeNode(rootUserSelectAllForTa
rget).upstream(CanCrossEditingBoundary)); |
| 769 else if (rootUserSelectAllForTarget && m_mousePressNode->renderer()) | 769 else if (rootUserSelectAllForTarget && m_mousePressNode->layoutObjec
t()) |
| 770 newSelection.setExtent(positionAfterNode(rootUserSelectAllForTar
get).downstream(CanCrossEditingBoundary)); | 770 newSelection.setExtent(positionAfterNode(rootUserSelectAllForTar
get).downstream(CanCrossEditingBoundary)); |
| 771 else | 771 else |
| 772 newSelection.setExtent(targetPosition); | 772 newSelection.setExtent(targetPosition); |
| 773 } | 773 } |
| 774 } else { | 774 } else { |
| 775 newSelection.setExtent(targetPosition); | 775 newSelection.setExtent(targetPosition); |
| 776 } | 776 } |
| 777 | 777 |
| 778 if (m_frame->selection().granularity() != CharacterGranularity) | 778 if (m_frame->selection().granularity() != CharacterGranularity) |
| 779 newSelection.expandUsingGranularity(m_frame->selection().granularity()); | 779 newSelection.expandUsingGranularity(m_frame->selection().granularity()); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 802 // press and it's not a context menu click. We do this so when clicking | 802 // press and it's not a context menu click. We do this so when clicking |
| 803 // on the selection, the selection goes away. However, if we are | 803 // on the selection, the selection goes away. However, if we are |
| 804 // editing, place the caret. | 804 // editing, place the caret. |
| 805 if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != Ex
tendedSelection | 805 if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != Ex
tendedSelection |
| 806 && m_dragStartPos == event.event().position() | 806 && m_dragStartPos == event.event().position() |
| 807 && m_frame->selection().isRange() | 807 && m_frame->selection().isRange() |
| 808 && event.event().button() != RightButton) { | 808 && event.event().button() != RightButton) { |
| 809 VisibleSelection newSelection; | 809 VisibleSelection newSelection; |
| 810 Node* node = event.innerNode(); | 810 Node* node = event.innerNode(); |
| 811 bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBr
owsingEnabled(); | 811 bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBr
owsingEnabled(); |
| 812 if (node && node->renderer() && (caretBrowsing || node->hasEditableStyle
())) { | 812 if (node && node->layoutObject() && (caretBrowsing || node->hasEditableS
tyle())) { |
| 813 VisiblePosition pos = VisiblePosition(node->renderer()->positionForP
oint(event.localPoint())); | 813 VisiblePosition pos = VisiblePosition(node->layoutObject()->position
ForPoint(event.localPoint())); |
| 814 newSelection = VisibleSelection(pos); | 814 newSelection = VisibleSelection(pos); |
| 815 } | 815 } |
| 816 | 816 |
| 817 setSelectionIfNeeded(m_frame->selection(), newSelection); | 817 setSelectionIfNeeded(m_frame->selection(), newSelection); |
| 818 | 818 |
| 819 handled = true; | 819 handled = true; |
| 820 } | 820 } |
| 821 | 821 |
| 822 m_frame->selection().notifyRendererOfSelectionChange(UserTriggered); | 822 m_frame->selection().notifyRendererOfSelectionChange(UserTriggered); |
| 823 | 823 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 return false; | 910 return false; |
| 911 | 911 |
| 912 Node* node = startNode; | 912 Node* node = startNode; |
| 913 | 913 |
| 914 if (!node) | 914 if (!node) |
| 915 node = m_frame->document()->focusedElement(); | 915 node = m_frame->document()->focusedElement(); |
| 916 | 916 |
| 917 if (!node) | 917 if (!node) |
| 918 node = m_mousePressNode.get(); | 918 node = m_mousePressNode.get(); |
| 919 | 919 |
| 920 if (!node || !node->renderer()) | 920 if (!node || !node->layoutObject()) |
| 921 return false; | 921 return false; |
| 922 | 922 |
| 923 bool rootLayerScrolls = m_frame->settings() && m_frame->settings()->rootLaye
rScrolls(); | 923 bool rootLayerScrolls = m_frame->settings() && m_frame->settings()->rootLaye
rScrolls(); |
| 924 LayoutBox* curBox = node->renderer()->enclosingBox(); | 924 LayoutBox* curBox = node->layoutObject()->enclosingBox(); |
| 925 while (curBox && (rootLayerScrolls || !curBox->isLayoutView())) { | 925 while (curBox && (rootLayerScrolls || !curBox->isLayoutView())) { |
| 926 ScrollDirection physicalDirection = toPhysicalDirection( | 926 ScrollDirection physicalDirection = toPhysicalDirection( |
| 927 direction, curBox->isHorizontalWritingMode(), curBox->style()->isFli
ppedBlocksWritingMode()); | 927 direction, curBox->isHorizontalWritingMode(), curBox->style()->isFli
ppedBlocksWritingMode()); |
| 928 | 928 |
| 929 // If we're at the stopNode, we should try to scroll it but we shouldn't
bubble past it | 929 // If we're at the stopNode, we should try to scroll it but we shouldn't
bubble past it |
| 930 bool shouldStopBubbling = stopNode && *stopNode && curBox->node() == *st
opNode; | 930 bool shouldStopBubbling = stopNode && *stopNode && curBox->node() == *st
opNode; |
| 931 bool didScroll = curBox->scroll(physicalDirection, granularity, delta); | 931 bool didScroll = curBox->scroll(physicalDirection, granularity, delta); |
| 932 | 932 |
| 933 if (didScroll && stopNode) | 933 if (didScroll && stopNode) |
| 934 *stopNode = curBox->node(); | 934 *stopNode = curBox->node(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 965 IntPoint EventHandler::lastKnownMousePosition() const | 965 IntPoint EventHandler::lastKnownMousePosition() const |
| 966 { | 966 { |
| 967 return m_lastKnownMousePosition; | 967 return m_lastKnownMousePosition; |
| 968 } | 968 } |
| 969 | 969 |
| 970 static LocalFrame* subframeForTargetNode(Node* node) | 970 static LocalFrame* subframeForTargetNode(Node* node) |
| 971 { | 971 { |
| 972 if (!node) | 972 if (!node) |
| 973 return nullptr; | 973 return nullptr; |
| 974 | 974 |
| 975 LayoutObject* renderer = node->renderer(); | 975 LayoutObject* renderer = node->layoutObject(); |
| 976 if (!renderer || !renderer->isLayoutPart()) | 976 if (!renderer || !renderer->isLayoutPart()) |
| 977 return nullptr; | 977 return nullptr; |
| 978 | 978 |
| 979 Widget* widget = toLayoutPart(renderer)->widget(); | 979 Widget* widget = toLayoutPart(renderer)->widget(); |
| 980 if (!widget || !widget->isFrameView()) | 980 if (!widget || !widget->isFrameView()) |
| 981 return nullptr; | 981 return nullptr; |
| 982 | 982 |
| 983 return &toFrameView(widget)->frame(); | 983 return &toFrameView(widget)->frame(); |
| 984 } | 984 } |
| 985 | 985 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1047 return NoCursorChange; | 1047 return NoCursorChange; |
| 1048 #if OS(WIN) | 1048 #if OS(WIN) |
| 1049 if (panScrollInProgress()) | 1049 if (panScrollInProgress()) |
| 1050 return NoCursorChange; | 1050 return NoCursorChange; |
| 1051 #endif | 1051 #endif |
| 1052 | 1052 |
| 1053 Node* node = result.innerPossiblyPseudoNode(); | 1053 Node* node = result.innerPossiblyPseudoNode(); |
| 1054 if (!node) | 1054 if (!node) |
| 1055 return selectAutoCursor(result, node, iBeamCursor()); | 1055 return selectAutoCursor(result, node, iBeamCursor()); |
| 1056 | 1056 |
| 1057 LayoutObject* renderer = node->renderer(); | 1057 LayoutObject* renderer = node->layoutObject(); |
| 1058 LayoutStyle* style = renderer ? renderer->style() : nullptr; | 1058 LayoutStyle* style = renderer ? renderer->style() : nullptr; |
| 1059 | 1059 |
| 1060 if (renderer) { | 1060 if (renderer) { |
| 1061 Cursor overrideCursor; | 1061 Cursor overrideCursor; |
| 1062 switch (renderer->getCursor(roundedIntPoint(result.localPoint()), overri
deCursor)) { | 1062 switch (renderer->getCursor(roundedIntPoint(result.localPoint()), overri
deCursor)) { |
| 1063 case SetCursorBasedOnStyle: | 1063 case SetCursorBasedOnStyle: |
| 1064 break; | 1064 break; |
| 1065 case SetCursor: | 1065 case SetCursor: |
| 1066 return overrideCursor; | 1066 return overrideCursor; |
| 1067 case DoNotSetCursor: | 1067 case DoNotSetCursor: |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1181 } | 1181 } |
| 1182 | 1182 |
| 1183 OptionalCursor EventHandler::selectAutoCursor(const HitTestResult& result, Node*
node, const Cursor& iBeam) | 1183 OptionalCursor EventHandler::selectAutoCursor(const HitTestResult& result, Node*
node, const Cursor& iBeam) |
| 1184 { | 1184 { |
| 1185 bool editable = (node && node->hasEditableStyle()); | 1185 bool editable = (node && node->hasEditableStyle()); |
| 1186 | 1186 |
| 1187 if (useHandCursor(node, result.isOverLink())) | 1187 if (useHandCursor(node, result.isOverLink())) |
| 1188 return handCursor(); | 1188 return handCursor(); |
| 1189 | 1189 |
| 1190 bool inResizer = false; | 1190 bool inResizer = false; |
| 1191 LayoutObject* renderer = node ? node->renderer() : nullptr; | 1191 LayoutObject* renderer = node ? node->layoutObject() : nullptr; |
| 1192 if (renderer && m_frame->view()) { | 1192 if (renderer && m_frame->view()) { |
| 1193 Layer* layer = renderer->enclosingLayer(); | 1193 Layer* layer = renderer->enclosingLayer(); |
| 1194 inResizer = layer->scrollableArea() && layer->scrollableArea()->isPointI
nResizeControl(result.roundedPointInMainFrame(), ResizerForPointer); | 1194 inResizer = layer->scrollableArea() && layer->scrollableArea()->isPointI
nResizeControl(result.roundedPointInMainFrame(), ResizerForPointer); |
| 1195 } | 1195 } |
| 1196 | 1196 |
| 1197 // During selection, use an I-beam no matter what we're over. | 1197 // During selection, use an I-beam no matter what we're over. |
| 1198 // If a drag may be starting or we're capturing mouse events for a particula
r node, don't treat this as a selection. | 1198 // If a drag may be starting or we're capturing mouse events for a particula
r node, don't treat this as a selection. |
| 1199 if (m_mousePressed && m_mouseDownMayStartSelect | 1199 if (m_mousePressed && m_mouseDownMayStartSelect |
| 1200 && !m_mouseDownMayStartDrag | 1200 && !m_mouseDownMayStartDrag |
| 1201 && m_frame->selection().isCaretOrRange() | 1201 && m_frame->selection().isCaretOrRange() |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1278 // away from the current page (e.g. the click was on a hyperlink). See <
rdar://problem/6095023>. | 1278 // away from the current page (e.g. the click was on a hyperlink). See <
rdar://problem/6095023>. |
| 1279 invalidateClick(); | 1279 invalidateClick(); |
| 1280 return true; | 1280 return true; |
| 1281 } | 1281 } |
| 1282 #endif | 1282 #endif |
| 1283 | 1283 |
| 1284 m_clickCount = mouseEvent.clickCount(); | 1284 m_clickCount = mouseEvent.clickCount(); |
| 1285 m_clickNode = mev.innerNode()->isTextNode() ? NodeRenderingTraversal::paren
t(*mev.innerNode()) : mev.innerNode(); | 1285 m_clickNode = mev.innerNode()->isTextNode() ? NodeRenderingTraversal::paren
t(*mev.innerNode()) : mev.innerNode(); |
| 1286 | 1286 |
| 1287 if (FrameView* view = m_frame->view()) { | 1287 if (FrameView* view = m_frame->view()) { |
| 1288 Layer* layer = mev.innerNode()->renderer() ? mev.innerNode()->renderer()
->enclosingLayer() : nullptr; | 1288 Layer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->layout
Object()->enclosingLayer() : nullptr; |
| 1289 IntPoint p = view->windowToContents(mouseEvent.position()); | 1289 IntPoint p = view->windowToContents(mouseEvent.position()); |
| 1290 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint
InResizeControl(p, ResizerForPointer)) { | 1290 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint
InResizeControl(p, ResizerForPointer)) { |
| 1291 m_resizeScrollableArea = layer->scrollableArea(); | 1291 m_resizeScrollableArea = layer->scrollableArea(); |
| 1292 m_resizeScrollableArea->setInResizeMode(true); | 1292 m_resizeScrollableArea->setInResizeMode(true); |
| 1293 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset
FromResizeCorner(p)); | 1293 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset
FromResizeCorner(p)); |
| 1294 invalidateClick(); | 1294 invalidateClick(); |
| 1295 return true; | 1295 return true; |
| 1296 } | 1296 } |
| 1297 } | 1297 } |
| 1298 | 1298 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1329 } | 1329 } |
| 1330 | 1330 |
| 1331 return swallowEvent; | 1331 return swallowEvent; |
| 1332 } | 1332 } |
| 1333 | 1333 |
| 1334 static Layer* layerForNode(Node* node) | 1334 static Layer* layerForNode(Node* node) |
| 1335 { | 1335 { |
| 1336 if (!node) | 1336 if (!node) |
| 1337 return nullptr; | 1337 return nullptr; |
| 1338 | 1338 |
| 1339 LayoutObject* renderer = node->renderer(); | 1339 LayoutObject* renderer = node->layoutObject(); |
| 1340 if (!renderer) | 1340 if (!renderer) |
| 1341 return nullptr; | 1341 return nullptr; |
| 1342 | 1342 |
| 1343 Layer* layer = renderer->enclosingLayer(); | 1343 Layer* layer = renderer->enclosingLayer(); |
| 1344 if (!layer) | 1344 if (!layer) |
| 1345 return nullptr; | 1345 return nullptr; |
| 1346 | 1346 |
| 1347 return layer; | 1347 return layer; |
| 1348 } | 1348 } |
| 1349 | 1349 |
| (...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2006 if (m_latchedWheelEventNode) | 2006 if (m_latchedWheelEventNode) |
| 2007 m_latchedWheelEventNode = nullptr; | 2007 m_latchedWheelEventNode = nullptr; |
| 2008 if (m_previousWheelScrolledNode) | 2008 if (m_previousWheelScrolledNode) |
| 2009 m_previousWheelScrolledNode = nullptr; | 2009 m_previousWheelScrolledNode = nullptr; |
| 2010 | 2010 |
| 2011 isOverWidget = result.isOverWidget(); | 2011 isOverWidget = result.isOverWidget(); |
| 2012 } | 2012 } |
| 2013 | 2013 |
| 2014 if (node) { | 2014 if (node) { |
| 2015 // Figure out which view to send the event to. | 2015 // Figure out which view to send the event to. |
| 2016 LayoutObject* target = node->renderer(); | 2016 LayoutObject* target = node->layoutObject(); |
| 2017 | 2017 |
| 2018 if (isOverWidget && target && target->isLayoutPart()) { | 2018 if (isOverWidget && target && target->isLayoutPart()) { |
| 2019 Widget* widget = toLayoutPart(target)->widget(); | 2019 Widget* widget = toLayoutPart(target)->widget(); |
| 2020 if (widget && passWheelEventToWidget(event, *widget)) | 2020 if (widget && passWheelEventToWidget(event, *widget)) |
| 2021 RETURN_WHEEL_EVENT_HANDLED(); | 2021 RETURN_WHEEL_EVENT_HANDLED(); |
| 2022 } | 2022 } |
| 2023 | 2023 |
| 2024 if (node && !node->dispatchWheelEvent(event)) | 2024 if (node && !node->dispatchWheelEvent(event)) |
| 2025 RETURN_WHEEL_EVENT_HANDLED(); | 2025 RETURN_WHEEL_EVENT_HANDLED(); |
| 2026 } | 2026 } |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2397 if (m_longTapShouldInvokeContextMenu) { | 2397 if (m_longTapShouldInvokeContextMenu) { |
| 2398 m_longTapShouldInvokeContextMenu = false; | 2398 m_longTapShouldInvokeContextMenu = false; |
| 2399 return sendContextMenuEventForGesture(targetedEvent); | 2399 return sendContextMenuEventForGesture(targetedEvent); |
| 2400 } | 2400 } |
| 2401 #endif | 2401 #endif |
| 2402 return false; | 2402 return false; |
| 2403 } | 2403 } |
| 2404 | 2404 |
| 2405 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor
mGestureEvent& gestureEvent) { | 2405 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor
mGestureEvent& gestureEvent) { |
| 2406 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) { | 2406 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) { |
| 2407 Layer* layer = eventTarget->renderer() ? eventTarget->renderer()->enclos
ingLayer() : nullptr; | 2407 Layer* layer = eventTarget->layoutObject() ? eventTarget->layoutObject()
->enclosingLayer() : nullptr; |
| 2408 IntPoint p = m_frame->view()->windowToContents(gestureEvent.position()); | 2408 IntPoint p = m_frame->view()->windowToContents(gestureEvent.position()); |
| 2409 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint
InResizeControl(p, ResizerForTouch)) { | 2409 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint
InResizeControl(p, ResizerForTouch)) { |
| 2410 m_resizeScrollableArea = layer->scrollableArea(); | 2410 m_resizeScrollableArea = layer->scrollableArea(); |
| 2411 m_resizeScrollableArea->setInResizeMode(true); | 2411 m_resizeScrollableArea->setInResizeMode(true); |
| 2412 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset
FromResizeCorner(p)); | 2412 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset
FromResizeCorner(p)); |
| 2413 return true; | 2413 return true; |
| 2414 } | 2414 } |
| 2415 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate) { | 2415 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate) { |
| 2416 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { | 2416 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { |
| 2417 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne
r); | 2417 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne
r); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2444 return false; | 2444 return false; |
| 2445 | 2445 |
| 2446 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent(
gestureEvent); | 2446 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent(
gestureEvent); |
| 2447 } | 2447 } |
| 2448 | 2448 |
| 2449 bool EventHandler::handleGestureScrollEnd(const PlatformGestureEvent& gestureEve
nt) { | 2449 bool EventHandler::handleGestureScrollEnd(const PlatformGestureEvent& gestureEve
nt) { |
| 2450 RefPtrWillBeRawPtr<Node> node = m_scrollGestureHandlingNode; | 2450 RefPtrWillBeRawPtr<Node> node = m_scrollGestureHandlingNode; |
| 2451 clearGestureScrollNodes(); | 2451 clearGestureScrollNodes(); |
| 2452 | 2452 |
| 2453 if (node) | 2453 if (node) |
| 2454 passScrollGestureEventToWidget(gestureEvent, node->renderer()); | 2454 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); |
| 2455 | 2455 |
| 2456 return false; | 2456 return false; |
| 2457 } | 2457 } |
| 2458 | 2458 |
| 2459 bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureE
vent) | 2459 bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureE
vent) |
| 2460 { | 2460 { |
| 2461 Document* document = m_frame->document(); | 2461 Document* document = m_frame->document(); |
| 2462 if (!document->layoutView()) | 2462 if (!document->layoutView()) |
| 2463 return false; | 2463 return false; |
| 2464 | 2464 |
| 2465 FrameView* view = m_frame->view(); | 2465 FrameView* view = m_frame->view(); |
| 2466 if (!view) | 2466 if (!view) |
| 2467 return false; | 2467 return false; |
| 2468 | 2468 |
| 2469 // If there's no renderer on the node, send the event to the nearest ancesto
r with a renderer. | 2469 // If there's no renderer on the node, send the event to the nearest ancesto
r with a renderer. |
| 2470 // Needed for <option> and <optgroup> elements so we can touch scroll <selec
t>s | 2470 // Needed for <option> and <optgroup> elements so we can touch scroll <selec
t>s |
| 2471 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->renderer
()) | 2471 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutOb
ject()) |
| 2472 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado
wHostNode(); | 2472 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado
wHostNode(); |
| 2473 | 2473 |
| 2474 if (!m_scrollGestureHandlingNode) | 2474 if (!m_scrollGestureHandlingNode) |
| 2475 return false; | 2475 return false; |
| 2476 | 2476 |
| 2477 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->re
nderer()); | 2477 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la
youtObject()); |
| 2478 | 2478 |
| 2479 if (m_frame->isMainFrame()) | 2479 if (m_frame->isMainFrame()) |
| 2480 m_frame->host()->topControls().scrollBegin(); | 2480 m_frame->host()->topControls().scrollBegin(); |
| 2481 | 2481 |
| 2482 return true; | 2482 return true; |
| 2483 } | 2483 } |
| 2484 | 2484 |
| 2485 static bool scrollAreaOnBothAxes(const FloatSize& delta, ScrollableArea& view) | 2485 static bool scrollAreaOnBothAxes(const FloatSize& delta, ScrollableArea& view) |
| 2486 { | 2486 { |
| 2487 bool scrolledHorizontal = view.scroll(ScrollLeft, ScrollByPrecisePixel, delt
a.width()); | 2487 bool scrolledHorizontal = view.scroll(ScrollLeft, ScrollByPrecisePixel, delt
a.width()); |
| 2488 bool scrolledVertical = view.scroll(ScrollUp, ScrollByPrecisePixel, delta.he
ight()); | 2488 bool scrolledVertical = view.scroll(ScrollUp, ScrollByPrecisePixel, delta.he
ight()); |
| 2489 return scrolledHorizontal || scrolledVertical; | 2489 return scrolledHorizontal || scrolledVertical; |
| 2490 } | 2490 } |
| 2491 | 2491 |
| 2492 bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture
Event) | 2492 bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture
Event) |
| 2493 { | 2493 { |
| 2494 ASSERT(gestureEvent.type() == PlatformEvent::GestureScrollUpdate); | 2494 ASSERT(gestureEvent.type() == PlatformEvent::GestureScrollUpdate); |
| 2495 | 2495 |
| 2496 FloatSize delta(gestureEvent.deltaX(), gestureEvent.deltaY()); | 2496 FloatSize delta(gestureEvent.deltaX(), gestureEvent.deltaY()); |
| 2497 if (delta.isZero()) | 2497 if (delta.isZero()) |
| 2498 return false; | 2498 return false; |
| 2499 | 2499 |
| 2500 Node* node = m_scrollGestureHandlingNode.get(); | 2500 Node* node = m_scrollGestureHandlingNode.get(); |
| 2501 if (node) { | 2501 if (node) { |
| 2502 LayoutObject* renderer = node->renderer(); | 2502 LayoutObject* renderer = node->layoutObject(); |
| 2503 if (!renderer) | 2503 if (!renderer) |
| 2504 return false; | 2504 return false; |
| 2505 | 2505 |
| 2506 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 2506 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); |
| 2507 | 2507 |
| 2508 Node* stopNode = nullptr; | 2508 Node* stopNode = nullptr; |
| 2509 | 2509 |
| 2510 // Try to send the event to the correct view. | 2510 // Try to send the event to the correct view. |
| 2511 if (passScrollGestureEventToWidget(gestureEvent, renderer)) { | 2511 if (passScrollGestureEventToWidget(gestureEvent, renderer)) { |
| 2512 if (gestureEvent.preventPropagation()) | 2512 if (gestureEvent.preventPropagation()) |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3310 { | 3310 { |
| 3311 // The DataTransfer would only be non-empty if we missed a dragEnd. | 3311 // The DataTransfer would only be non-empty if we missed a dragEnd. |
| 3312 // Clear it anyway, just to make sure it gets numbified. | 3312 // Clear it anyway, just to make sure it gets numbified. |
| 3313 clearDragDataTransfer(); | 3313 clearDragDataTransfer(); |
| 3314 | 3314 |
| 3315 dragState().m_dragDataTransfer = createDraggingDataTransfer(); | 3315 dragState().m_dragDataTransfer = createDraggingDataTransfer(); |
| 3316 | 3316 |
| 3317 // Check to see if this a DOM based drag, if it is get the DOM specified dra
g | 3317 // Check to see if this a DOM based drag, if it is get the DOM specified dra
g |
| 3318 // image and offset | 3318 // image and offset |
| 3319 if (dragState().m_dragType == DragSourceActionDHTML) { | 3319 if (dragState().m_dragType == DragSourceActionDHTML) { |
| 3320 if (LayoutObject* renderer = dragState().m_dragSrc->renderer()) { | 3320 if (LayoutObject* renderer = dragState().m_dragSrc->layoutObject()) { |
| 3321 FloatPoint absPos = renderer->localToAbsolute(FloatPoint(), UseTrans
forms); | 3321 FloatPoint absPos = renderer->localToAbsolute(FloatPoint(), UseTrans
forms); |
| 3322 IntSize delta = m_mouseDownPos - roundedIntPoint(absPos); | 3322 IntSize delta = m_mouseDownPos - roundedIntPoint(absPos); |
| 3323 dragState().m_dragDataTransfer->setDragImageElement(dragState().m_dr
agSrc.get(), IntPoint(delta)); | 3323 dragState().m_dragDataTransfer->setDragImageElement(dragState().m_dr
agSrc.get(), IntPoint(delta)); |
| 3324 } else { | 3324 } else { |
| 3325 // The renderer has disappeared, this can happen if the onStartDrag
handler has hidden | 3325 // The renderer has disappeared, this can happen if the onStartDrag
handler has hidden |
| 3326 // the element in some way. In this case we just kill the drag. | 3326 // the element in some way. In this case we just kill the drag. |
| 3327 return false; | 3327 return false; |
| 3328 } | 3328 } |
| 3329 } | 3329 } |
| 3330 | 3330 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3477 | 3477 |
| 3478 void EventHandler::defaultEscapeEventHandler(KeyboardEvent* event) | 3478 void EventHandler::defaultEscapeEventHandler(KeyboardEvent* event) |
| 3479 { | 3479 { |
| 3480 if (HTMLDialogElement* dialog = m_frame->document()->activeModalDialog()) | 3480 if (HTMLDialogElement* dialog = m_frame->document()->activeModalDialog()) |
| 3481 dialog->dispatchEvent(Event::createCancelable(EventTypeNames::cancel)); | 3481 dialog->dispatchEvent(Event::createCancelable(EventTypeNames::cancel)); |
| 3482 } | 3482 } |
| 3483 | 3483 |
| 3484 void EventHandler::capsLockStateMayHaveChanged() | 3484 void EventHandler::capsLockStateMayHaveChanged() |
| 3485 { | 3485 { |
| 3486 if (Element* element = m_frame->document()->focusedElement()) { | 3486 if (Element* element = m_frame->document()->focusedElement()) { |
| 3487 if (LayoutObject* r = element->renderer()) { | 3487 if (LayoutObject* r = element->layoutObject()) { |
| 3488 if (r->isTextField()) | 3488 if (r->isTextField()) |
| 3489 toLayoutTextControlSingleLine(r)->capsLockStateMayHaveChanged(); | 3489 toLayoutTextControlSingleLine(r)->capsLockStateMayHaveChanged(); |
| 3490 } | 3490 } |
| 3491 } | 3491 } |
| 3492 } | 3492 } |
| 3493 | 3493 |
| 3494 void EventHandler::setFrameWasScrolledByUser() | 3494 void EventHandler::setFrameWasScrolledByUser() |
| 3495 { | 3495 { |
| 3496 if (FrameView* view = m_frame->view()) | 3496 if (FrameView* view = m_frame->view()) |
| 3497 view->setWasScrolledByUser(true); | 3497 view->setWasScrolledByUser(true); |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3817 return action1 & action2; | 3817 return action1 & action2; |
| 3818 } | 3818 } |
| 3819 | 3819 |
| 3820 TouchAction EventHandler::computeEffectiveTouchAction(const Node& node) | 3820 TouchAction EventHandler::computeEffectiveTouchAction(const Node& node) |
| 3821 { | 3821 { |
| 3822 // Start by permitting all actions, then walk the elements supporting | 3822 // Start by permitting all actions, then walk the elements supporting |
| 3823 // touch-action from the target node up to the nearest scrollable ancestor | 3823 // touch-action from the target node up to the nearest scrollable ancestor |
| 3824 // and exclude any prohibited actions. | 3824 // and exclude any prohibited actions. |
| 3825 TouchAction effectiveTouchAction = TouchActionAuto; | 3825 TouchAction effectiveTouchAction = TouchActionAuto; |
| 3826 for (const Node* curNode = &node; curNode; curNode = NodeRenderingTraversal:
:parent(*curNode)) { | 3826 for (const Node* curNode = &node; curNode; curNode = NodeRenderingTraversal:
:parent(*curNode)) { |
| 3827 if (LayoutObject* renderer = curNode->renderer()) { | 3827 if (LayoutObject* renderer = curNode->layoutObject()) { |
| 3828 if (renderer->supportsTouchAction()) { | 3828 if (renderer->supportsTouchAction()) { |
| 3829 TouchAction action = renderer->style()->touchAction(); | 3829 TouchAction action = renderer->style()->touchAction(); |
| 3830 effectiveTouchAction = intersectTouchAction(action, effectiveTou
chAction); | 3830 effectiveTouchAction = intersectTouchAction(action, effectiveTou
chAction); |
| 3831 if (effectiveTouchAction == TouchActionNone) | 3831 if (effectiveTouchAction == TouchActionNone) |
| 3832 break; | 3832 break; |
| 3833 } | 3833 } |
| 3834 | 3834 |
| 3835 // If we've reached an ancestor that supports a touch action, search
no further. | 3835 // If we've reached an ancestor that supports a touch action, search
no further. |
| 3836 if (renderer->isBox() && toLayoutBox(renderer)->scrollsOverflow()) | 3836 if (renderer->isBox() && toLayoutBox(renderer)->scrollsOverflow()) |
| 3837 break; | 3837 break; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3849 | 3849 |
| 3850 bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& m
ev, LocalFrame* subframe) | 3850 bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& m
ev, LocalFrame* subframe) |
| 3851 { | 3851 { |
| 3852 // If we're clicking into a frame that is selected, the frame will appear | 3852 // If we're clicking into a frame that is selected, the frame will appear |
| 3853 // greyed out even though we're clicking on the selection. This looks | 3853 // greyed out even though we're clicking on the selection. This looks |
| 3854 // really strange (having the whole frame be greyed out), so we deselect the | 3854 // really strange (having the whole frame be greyed out), so we deselect the |
| 3855 // selection. | 3855 // selection. |
| 3856 IntPoint p = m_frame->view()->windowToContents(mev.event().position()); | 3856 IntPoint p = m_frame->view()->windowToContents(mev.event().position()); |
| 3857 if (m_frame->selection().contains(p)) { | 3857 if (m_frame->selection().contains(p)) { |
| 3858 VisiblePosition visiblePos( | 3858 VisiblePosition visiblePos( |
| 3859 mev.innerNode()->renderer()->positionForPoint(mev.localPoint())); | 3859 mev.innerNode()->layoutObject()->positionForPoint(mev.localPoint()))
; |
| 3860 VisibleSelection newSelection(visiblePos); | 3860 VisibleSelection newSelection(visiblePos); |
| 3861 m_frame->selection().setSelection(newSelection); | 3861 m_frame->selection().setSelection(newSelection); |
| 3862 } | 3862 } |
| 3863 | 3863 |
| 3864 subframe->eventHandler().handleMousePressEvent(mev.event()); | 3864 subframe->eventHandler().handleMousePressEvent(mev.event()); |
| 3865 return true; | 3865 return true; |
| 3866 } | 3866 } |
| 3867 | 3867 |
| 3868 bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& me
v, LocalFrame* subframe, HitTestResult* hoveredNode) | 3868 bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& me
v, LocalFrame* subframe, HitTestResult* hoveredNode) |
| 3869 { | 3869 { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3919 | 3919 |
| 3920 // If it's in the direction to hide the top controls, only consume when the
frame can also scroll. | 3920 // If it's in the direction to hide the top controls, only consume when the
frame can also scroll. |
| 3921 if (m_frame->view()->scrollPosition().y() < m_frame->view()->maximumScrollPo
sition().y()) | 3921 if (m_frame->view()->scrollPosition().y() < m_frame->view()->maximumScrollPo
sition().y()) |
| 3922 return true; | 3922 return true; |
| 3923 | 3923 |
| 3924 return false; | 3924 return false; |
| 3925 } | 3925 } |
| 3926 | 3926 |
| 3927 | 3927 |
| 3928 } // namespace blink | 3928 } // namespace blink |
| OLD | NEW |