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 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 if (!hitTestResult.isOverWidget()) | 1032 if (!hitTestResult.isOverWidget()) |
1033 return 0; | 1033 return 0; |
1034 return subframeForTargetNode(hitTestResult.targetNode()); | 1034 return subframeForTargetNode(hitTestResult.targetNode()); |
1035 } | 1035 } |
1036 | 1036 |
1037 static bool isSubmitImage(Node* node) | 1037 static bool isSubmitImage(Node* node) |
1038 { | 1038 { |
1039 return isHTMLInputElement(node) && toHTMLInputElement(node)->isImageButton()
; | 1039 return isHTMLInputElement(node) && toHTMLInputElement(node)->isImageButton()
; |
1040 } | 1040 } |
1041 | 1041 |
1042 // Returns true if the node's editable block is not current focused for editing | 1042 bool EventHandler::useHandCursor(Node* node, bool isOverLink) |
1043 static bool nodeIsNotBeingEdited(Node* node, LocalFrame* frame) | |
1044 { | |
1045 return frame->selection().rootEditableElement() != node->rootEditableElement
(); | |
1046 } | |
1047 | |
1048 bool EventHandler::useHandCursor(Node* node, bool isOverLink, bool shiftKey) | |
1049 { | 1043 { |
1050 if (!node) | 1044 if (!node) |
1051 return false; | 1045 return false; |
1052 | 1046 |
1053 bool editable = node->rendererIsEditable(); | 1047 return ((isOverLink || isSubmitImage(node)) && !node->rendererIsEditable()); |
1054 bool editableLinkEnabled = false; | |
1055 | |
1056 // If the link is editable, then we need to check the settings to see whethe
r or not the link should be followed | |
1057 if (editable) { | |
1058 ASSERT(m_frame->settings()); | |
1059 switch (m_frame->settings()->editableLinkBehavior()) { | |
1060 default: | |
1061 case EditableLinkDefaultBehavior: | |
1062 case EditableLinkAlwaysLive: | |
1063 editableLinkEnabled = true; | |
1064 break; | |
1065 | |
1066 case EditableLinkNeverLive: | |
1067 editableLinkEnabled = false; | |
1068 break; | |
1069 | |
1070 case EditableLinkLiveWhenNotFocused: | |
1071 editableLinkEnabled = nodeIsNotBeingEdited(node, m_frame) || shiftKe
y; | |
1072 break; | |
1073 | |
1074 case EditableLinkOnlyLiveWithShiftKey: | |
1075 editableLinkEnabled = shiftKey; | |
1076 break; | |
1077 } | |
1078 } | |
1079 | |
1080 return ((isOverLink || isSubmitImage(node)) && (!editable || editableLinkEna
bled)); | |
1081 } | 1048 } |
1082 | 1049 |
1083 void EventHandler::cursorUpdateTimerFired(Timer<EventHandler>*) | 1050 void EventHandler::cursorUpdateTimerFired(Timer<EventHandler>*) |
1084 { | 1051 { |
1085 ASSERT(m_frame); | 1052 ASSERT(m_frame); |
1086 ASSERT(m_frame->document()); | 1053 ASSERT(m_frame->document()); |
1087 | 1054 |
1088 updateCursor(); | 1055 updateCursor(); |
1089 } | 1056 } |
1090 | 1057 |
1091 void EventHandler::updateCursor() | 1058 void EventHandler::updateCursor() |
1092 { | 1059 { |
1093 if (m_mousePositionIsUnknown) | 1060 if (m_mousePositionIsUnknown) |
1094 return; | 1061 return; |
1095 | 1062 |
1096 FrameView* view = m_frame->view(); | 1063 FrameView* view = m_frame->view(); |
1097 if (!view || !view->shouldSetCursor()) | 1064 if (!view || !view->shouldSetCursor()) |
1098 return; | 1065 return; |
1099 | 1066 |
1100 RenderView* renderView = view->renderView(); | 1067 RenderView* renderView = view->renderView(); |
1101 if (!renderView) | 1068 if (!renderView) |
1102 return; | 1069 return; |
1103 | 1070 |
1104 bool shiftKey; | |
1105 bool ctrlKey; | |
1106 bool altKey; | |
1107 bool metaKey; | |
1108 PlatformKeyboardEvent::getCurrentModifierState(shiftKey, ctrlKey, altKey, me
taKey); | |
1109 | |
1110 m_frame->document()->updateLayout(); | 1071 m_frame->document()->updateLayout(); |
1111 | 1072 |
1112 HitTestRequest request(HitTestRequest::ReadOnly); | 1073 HitTestRequest request(HitTestRequest::ReadOnly); |
1113 HitTestResult result(view->windowToContents(m_lastKnownMousePosition)); | 1074 HitTestResult result(view->windowToContents(m_lastKnownMousePosition)); |
1114 renderView->hitTest(request, result); | 1075 renderView->hitTest(request, result); |
1115 | 1076 |
1116 OptionalCursor optionalCursor = selectCursor(result, shiftKey); | 1077 OptionalCursor optionalCursor = selectCursor(result); |
1117 if (optionalCursor.isCursorChange()) { | 1078 if (optionalCursor.isCursorChange()) { |
1118 m_currentMouseCursor = optionalCursor.cursor(); | 1079 m_currentMouseCursor = optionalCursor.cursor(); |
1119 view->setCursor(m_currentMouseCursor); | 1080 view->setCursor(m_currentMouseCursor); |
1120 } | 1081 } |
1121 } | 1082 } |
1122 | 1083 |
1123 OptionalCursor EventHandler::selectCursor(const HitTestResult& result, bool shif
tKey) | 1084 OptionalCursor EventHandler::selectCursor(const HitTestResult& result) |
1124 { | 1085 { |
1125 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) | 1086 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) |
1126 return NoCursorChange; | 1087 return NoCursorChange; |
1127 | 1088 |
1128 Page* page = m_frame->page(); | 1089 Page* page = m_frame->page(); |
1129 if (!page) | 1090 if (!page) |
1130 return NoCursorChange; | 1091 return NoCursorChange; |
1131 #if OS(WIN) | 1092 #if OS(WIN) |
1132 if (panScrollInProgress()) | 1093 if (panScrollInProgress()) |
1133 return NoCursorChange; | 1094 return NoCursorChange; |
1134 #endif | 1095 #endif |
1135 | 1096 |
1136 Node* node = result.innerPossiblyPseudoNode(); | 1097 Node* node = result.innerPossiblyPseudoNode(); |
1137 if (!node) | 1098 if (!node) |
1138 return selectAutoCursor(result, node, iBeamCursor(), shiftKey); | 1099 return selectAutoCursor(result, node, iBeamCursor()); |
1139 | 1100 |
1140 RenderObject* renderer = node->renderer(); | 1101 RenderObject* renderer = node->renderer(); |
1141 RenderStyle* style = renderer ? renderer->style() : 0; | 1102 RenderStyle* style = renderer ? renderer->style() : 0; |
1142 | 1103 |
1143 if (renderer) { | 1104 if (renderer) { |
1144 Cursor overrideCursor; | 1105 Cursor overrideCursor; |
1145 switch (renderer->getCursor(roundedIntPoint(result.localPoint()), overri
deCursor)) { | 1106 switch (renderer->getCursor(roundedIntPoint(result.localPoint()), overri
deCursor)) { |
1146 case SetCursorBasedOnStyle: | 1107 case SetCursorBasedOnStyle: |
1147 break; | 1108 break; |
1148 case SetCursor: | 1109 case SetCursor: |
(...skipping 30 matching lines...) Expand all Loading... |
1179 if (scale < minimumCursorScale) | 1140 if (scale < minimumCursorScale) |
1180 continue; | 1141 continue; |
1181 return Cursor(image, hotSpot, scale); | 1142 return Cursor(image, hotSpot, scale); |
1182 } | 1143 } |
1183 } | 1144 } |
1184 | 1145 |
1185 switch (style ? style->cursor() : CURSOR_AUTO) { | 1146 switch (style ? style->cursor() : CURSOR_AUTO) { |
1186 case CURSOR_AUTO: { | 1147 case CURSOR_AUTO: { |
1187 bool horizontalText = !style || style->isHorizontalWritingMode(); | 1148 bool horizontalText = !style || style->isHorizontalWritingMode(); |
1188 const Cursor& iBeam = horizontalText ? iBeamCursor() : verticalTextCurso
r(); | 1149 const Cursor& iBeam = horizontalText ? iBeamCursor() : verticalTextCurso
r(); |
1189 return selectAutoCursor(result, node, iBeam, shiftKey); | 1150 return selectAutoCursor(result, node, iBeam); |
1190 } | 1151 } |
1191 case CURSOR_CROSS: | 1152 case CURSOR_CROSS: |
1192 return crossCursor(); | 1153 return crossCursor(); |
1193 case CURSOR_POINTER: | 1154 case CURSOR_POINTER: |
1194 return handCursor(); | 1155 return handCursor(); |
1195 case CURSOR_MOVE: | 1156 case CURSOR_MOVE: |
1196 return moveCursor(); | 1157 return moveCursor(); |
1197 case CURSOR_ALL_SCROLL: | 1158 case CURSOR_ALL_SCROLL: |
1198 return moveCursor(); | 1159 return moveCursor(); |
1199 case CURSOR_E_RESIZE: | 1160 case CURSOR_E_RESIZE: |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1255 case CURSOR_WEBKIT_ZOOM_OUT: | 1216 case CURSOR_WEBKIT_ZOOM_OUT: |
1256 return zoomOutCursor(); | 1217 return zoomOutCursor(); |
1257 case CURSOR_WEBKIT_GRAB: | 1218 case CURSOR_WEBKIT_GRAB: |
1258 return grabCursor(); | 1219 return grabCursor(); |
1259 case CURSOR_WEBKIT_GRABBING: | 1220 case CURSOR_WEBKIT_GRABBING: |
1260 return grabbingCursor(); | 1221 return grabbingCursor(); |
1261 } | 1222 } |
1262 return pointerCursor(); | 1223 return pointerCursor(); |
1263 } | 1224 } |
1264 | 1225 |
1265 OptionalCursor EventHandler::selectAutoCursor(const HitTestResult& result, Node*
node, const Cursor& iBeam, bool shiftKey) | 1226 OptionalCursor EventHandler::selectAutoCursor(const HitTestResult& result, Node*
node, const Cursor& iBeam) |
1266 { | 1227 { |
1267 bool editable = (node && node->rendererIsEditable()); | 1228 bool editable = (node && node->rendererIsEditable()); |
1268 | 1229 |
1269 if (useHandCursor(node, result.isOverLink(), shiftKey)) | 1230 if (useHandCursor(node, result.isOverLink())) |
1270 return handCursor(); | 1231 return handCursor(); |
1271 | 1232 |
1272 bool inResizer = false; | 1233 bool inResizer = false; |
1273 RenderObject* renderer = node ? node->renderer() : 0; | 1234 RenderObject* renderer = node ? node->renderer() : 0; |
1274 if (renderer && m_frame->view()) { | 1235 if (renderer && m_frame->view()) { |
1275 RenderLayer* layer = renderer->enclosingLayer(); | 1236 RenderLayer* layer = renderer->enclosingLayer(); |
1276 inResizer = layer->scrollableArea() && layer->scrollableArea()->isPointI
nResizeControl(result.roundedPointInMainFrame(), ResizerForPointer); | 1237 inResizer = layer->scrollableArea() && layer->scrollableArea()->isPointI
nResizeControl(result.roundedPointInMainFrame(), ResizerForPointer); |
1277 } | 1238 } |
1278 | 1239 |
1279 // During selection, use an I-beam no matter what we're over. | 1240 // During selection, use an I-beam no matter what we're over. |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1585 updateMouseEventTargetNode(mev.targetNode(), mouseEvent, true); | 1546 updateMouseEventTargetNode(mev.targetNode(), mouseEvent, true); |
1586 | 1547 |
1587 // Event dispatch in updateMouseEventTargetNode may have caused the subf
rame of the target | 1548 // Event dispatch in updateMouseEventTargetNode may have caused the subf
rame of the target |
1588 // node to be detached from its FrameView, in which case the event shoul
d not be passed. | 1549 // node to be detached from its FrameView, in which case the event shoul
d not be passed. |
1589 if (newSubframe->view()) | 1550 if (newSubframe->view()) |
1590 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(),
hoveredNode); | 1551 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(),
hoveredNode); |
1591 } else { | 1552 } else { |
1592 if (scrollbar && !m_mousePressed) | 1553 if (scrollbar && !m_mousePressed) |
1593 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo
rms that support visual feedback on scrollbar hovering. | 1554 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo
rms that support visual feedback on scrollbar hovering. |
1594 if (FrameView* view = m_frame->view()) { | 1555 if (FrameView* view = m_frame->view()) { |
1595 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult(), mo
useEvent.shiftKey()); | 1556 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); |
1596 if (optionalCursor.isCursorChange()) { | 1557 if (optionalCursor.isCursorChange()) { |
1597 m_currentMouseCursor = optionalCursor.cursor(); | 1558 m_currentMouseCursor = optionalCursor.cursor(); |
1598 view->setCursor(m_currentMouseCursor); | 1559 view->setCursor(m_currentMouseCursor); |
1599 } | 1560 } |
1600 } | 1561 } |
1601 } | 1562 } |
1602 | 1563 |
1603 m_lastMouseMoveEventSubframe = newSubframe; | 1564 m_lastMouseMoveEventSubframe = newSubframe; |
1604 | 1565 |
1605 if (swallowEvent) | 1566 if (swallowEvent) |
(...skipping 2429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4035 unsigned EventHandler::accessKeyModifiers() | 3996 unsigned EventHandler::accessKeyModifiers() |
4036 { | 3997 { |
4037 #if OS(MACOSX) | 3998 #if OS(MACOSX) |
4038 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; | 3999 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; |
4039 #else | 4000 #else |
4040 return PlatformEvent::AltKey; | 4001 return PlatformEvent::AltKey; |
4041 #endif | 4002 #endif |
4042 } | 4003 } |
4043 | 4004 |
4044 } // namespace WebCore | 4005 } // namespace WebCore |
OLD | NEW |