| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2007 Google Inc. All Rights Reserved. | 2 * Copyright 2007 Google Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Portions Copyright (C) 2006 Apple Computer, Inc. All rights reserved. | 4 * Portions Copyright (C) 2006 Apple Computer, Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * ***** BEGIN LICENSE BLOCK ***** | 6 * ***** BEGIN LICENSE BLOCK ***** |
| 7 * | 7 * |
| 8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
| 9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
| 10 * are met: | 10 * are met: |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 if (event.button == WebMouseEvent::BUTTON_RIGHT) | 473 if (event.button == WebMouseEvent::BUTTON_RIGHT) |
| 474 MouseContextMenu(event); | 474 MouseContextMenu(event); |
| 475 } | 475 } |
| 476 | 476 |
| 477 void WebViewImpl::MouseWheel(const WebMouseWheelEvent& event) { | 477 void WebViewImpl::MouseWheel(const WebMouseWheelEvent& event) { |
| 478 MakePlatformWheelEvent platform_event(main_frame()->frameview(), event); | 478 MakePlatformWheelEvent platform_event(main_frame()->frameview(), event); |
| 479 main_frame()->frame()->eventHandler()->handleWheelEvent(platform_event); | 479 main_frame()->frame()->eventHandler()->handleWheelEvent(platform_event); |
| 480 } | 480 } |
| 481 | 481 |
| 482 bool WebViewImpl::KeyEvent(const WebKeyboardEvent& event) { | 482 bool WebViewImpl::KeyEvent(const WebKeyboardEvent& event) { |
| 483 DCHECK((event.type == WebInputEvent::KEY_DOWN) || | 483 DCHECK((event.type == WebInputEvent::RAW_KEY_DOWN) || |
| 484 (event.type == WebInputEvent::KEY_DOWN) || |
| 484 (event.type == WebInputEvent::KEY_UP)); | 485 (event.type == WebInputEvent::KEY_UP)); |
| 485 | 486 |
| 486 // Please refer to the comments explaining the suppress_next_keypress_event_ | 487 // Please refer to the comments explaining the suppress_next_keypress_event_ |
| 487 // member. | 488 // member. |
| 488 // The suppress_next_keypress_event_ is set if the KeyDown is handled by | 489 // The suppress_next_keypress_event_ is set if the KeyDown is handled by |
| 489 // Webkit. A keyDown event is typically associated with a keyPress(char) | 490 // Webkit. A keyDown event is typically associated with a keyPress(char) |
| 490 // event and a keyUp event. We reset this flag here as this is a new keyDown | 491 // event and a keyUp event. We reset this flag here as this is a new keyDown |
| 491 // event. | 492 // event. |
| 492 suppress_next_keypress_event_ = false; | 493 suppress_next_keypress_event_ = false; |
| 493 | 494 |
| 494 // Give autocomplete a chance to consume the key events it is interested in. | 495 // Give autocomplete a chance to consume the key events it is interested in. |
| 495 if (AutocompleteHandleKeyEvent(event)) | 496 if (AutocompleteHandleKeyEvent(event)) |
| 496 return true; | 497 return true; |
| 497 | 498 |
| 498 Frame* frame = GetFocusedWebCoreFrame(); | 499 Frame* frame = GetFocusedWebCoreFrame(); |
| 499 if (!frame) | 500 if (!frame) |
| 500 return false; | 501 return false; |
| 501 | 502 |
| 502 EventHandler* handler = frame->eventHandler(); | 503 EventHandler* handler = frame->eventHandler(); |
| 503 if (!handler) | 504 if (!handler) |
| 504 return KeyEventDefault(event); | 505 return KeyEventDefault(event); |
| 505 | 506 |
| 506 #if defined(OS_WIN) | 507 #if defined(OS_WIN) |
| 507 // TODO(pinkerton): figure out these keycodes on non-windows | 508 // TODO(pinkerton): figure out these keycodes on non-windows |
| 508 if (((event.modifiers == 0) && (event.key_code == VK_APPS)) || | 509 if (((event.modifiers == 0) && (event.windows_key_code == VK_APPS)) || |
| 509 ((event.modifiers == WebInputEvent::SHIFT_KEY) && | 510 ((event.modifiers == WebInputEvent::SHIFT_KEY) && |
| 510 (event.key_code == VK_F10))) { | 511 (event.windows_key_code == VK_F10))) { |
| 511 SendContextMenuEvent(event); | 512 SendContextMenuEvent(event); |
| 512 return true; | 513 return true; |
| 513 } | 514 } |
| 514 #endif | 515 #endif |
| 515 | 516 |
| 516 MakePlatformKeyboardEvent evt(event); | 517 MakePlatformKeyboardEvent evt(event); |
| 517 | 518 |
| 518 #if !defined(OS_MACOSX) | 519 if (WebInputEvent::RAW_KEY_DOWN == event.type) { |
| 519 if (WebInputEvent::KEY_DOWN == event.type) { | 520 if (handler->keyEvent(evt) && !evt.isSystemKey()) { |
| 520 MakePlatformKeyboardEvent evt_rawkeydown = evt; | |
| 521 evt_rawkeydown.SetKeyType(WebCore::PlatformKeyboardEvent::RawKeyDown); | |
| 522 if (handler->keyEvent(evt_rawkeydown) && !evt_rawkeydown.isSystemKey()) { | |
| 523 suppress_next_keypress_event_ = true; | 521 suppress_next_keypress_event_ = true; |
| 524 return true; | 522 return true; |
| 525 } | 523 } |
| 526 } else { | 524 } else { |
| 527 if (handler->keyEvent(evt)) { | 525 if (handler->keyEvent(evt)) { |
| 528 return true; | 526 return true; |
| 529 } | 527 } |
| 530 } | 528 } |
| 531 #else | |
| 532 // Windows and Cocoa handle events in rather different ways. On Windows, | |
| 533 // you get two events: WM_KEYDOWN/WM_KEYUP and WM_CHAR. In | |
| 534 // PlatformKeyboardEvent, RawKeyDown represents the raw messages. When | |
| 535 // processing them, we don't process text editing events, since we'll be | |
| 536 // getting the data soon enough. In Cocoa, we get one event with both the | |
| 537 // raw and processed data. Therefore we need to keep the type as KeyDown, so | |
| 538 // that we'll know that this is the only time we'll have the event and that | |
| 539 // we need to do our thing. | |
| 540 if (handler->keyEvent(evt)) { | |
| 541 return true; | |
| 542 } | |
| 543 #endif | |
| 544 | 529 |
| 545 return KeyEventDefault(event); | 530 return KeyEventDefault(event); |
| 546 } | 531 } |
| 547 | 532 |
| 548 bool WebViewImpl::AutocompleteHandleKeyEvent(const WebKeyboardEvent& event) { | 533 bool WebViewImpl::AutocompleteHandleKeyEvent(const WebKeyboardEvent& event) { |
| 549 if (!autocomplete_popup_showing_ || | 534 if (!autocomplete_popup_showing_ || |
| 550 // Home and End should be left to the text field to process. | 535 // Home and End should be left to the text field to process. |
| 551 event.key_code == base::VKEY_HOME || event.key_code == base::VKEY_END) { | 536 event.windows_key_code == base::VKEY_HOME || |
| 537 event.windows_key_code == base::VKEY_END) { |
| 552 return false; | 538 return false; |
| 553 } | 539 } |
| 554 | 540 |
| 555 if (!autocomplete_popup_->isInterestedInEventForKey(event.key_code)) | 541 if (!autocomplete_popup_->isInterestedInEventForKey(event.windows_key_code)) |
| 556 return false; | 542 return false; |
| 557 | 543 |
| 558 if (autocomplete_popup_->handleKeyEvent(MakePlatformKeyboardEvent(event))) { | 544 if (autocomplete_popup_->handleKeyEvent(MakePlatformKeyboardEvent(event))) { |
| 559 #if defined(OS_WIN) | 545 #if defined(OS_WIN) |
| 560 // We need to ignore the next CHAR event after this otherwise pressing | 546 // We need to ignore the next CHAR event after this otherwise pressing |
| 561 // enter when selecting an item in the menu will go to the page. | 547 // enter when selecting an item in the menu will go to the page. |
| 562 if (WebInputEvent::KEY_DOWN == event.type) | 548 if (WebInputEvent::RAW_KEY_DOWN == event.type) |
| 563 suppress_next_keypress_event_ = true; | 549 suppress_next_keypress_event_ = true; |
| 564 #endif | 550 #endif |
| 565 return true; | 551 return true; |
| 566 } | 552 } |
| 567 | 553 |
| 568 return false; | 554 return false; |
| 569 } | 555 } |
| 570 | 556 |
| 571 bool WebViewImpl::CharEvent(const WebKeyboardEvent& event) { | 557 bool WebViewImpl::CharEvent(const WebKeyboardEvent& event) { |
| 572 DCHECK(event.type == WebInputEvent::CHAR); | 558 DCHECK(event.type == WebInputEvent::CHAR); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 | 672 |
| 687 bool WebViewImpl::KeyEventDefault(const WebKeyboardEvent& event) { | 673 bool WebViewImpl::KeyEventDefault(const WebKeyboardEvent& event) { |
| 688 Frame* frame = GetFocusedWebCoreFrame(); | 674 Frame* frame = GetFocusedWebCoreFrame(); |
| 689 if (!frame) | 675 if (!frame) |
| 690 return false; | 676 return false; |
| 691 | 677 |
| 692 switch (event.type) { | 678 switch (event.type) { |
| 693 case WebInputEvent::CHAR: { | 679 case WebInputEvent::CHAR: { |
| 694 #if defined(OS_WIN) | 680 #if defined(OS_WIN) |
| 695 // TODO(pinkerton): hook this up for non-win32 | 681 // TODO(pinkerton): hook this up for non-win32 |
| 696 if (event.key_code == VK_SPACE) { | 682 if (event.windows_key_code == VK_SPACE) { |
| 697 int key_code = ((event.modifiers & WebInputEvent::SHIFT_KEY) ? | 683 int key_code = ((event.modifiers & WebInputEvent::SHIFT_KEY) ? |
| 698 VK_PRIOR : VK_NEXT); | 684 VK_PRIOR : VK_NEXT); |
| 699 return ScrollViewWithKeyboard(key_code); | 685 return ScrollViewWithKeyboard(key_code); |
| 700 } | 686 } |
| 701 #endif | 687 #endif |
| 702 break; | 688 break; |
| 703 } | 689 } |
| 704 | 690 |
| 705 case WebInputEvent::KEY_DOWN: { | 691 case WebInputEvent::RAW_KEY_DOWN: { |
| 706 if (event.modifiers == WebInputEvent::CTRL_KEY) { | 692 if (event.modifiers == WebInputEvent::CTRL_KEY) { |
| 707 switch (event.key_code) { | 693 switch (event.windows_key_code) { |
| 708 case 'A': | 694 case 'A': |
| 709 GetFocusedFrame()->SelectAll(); | 695 GetFocusedFrame()->SelectAll(); |
| 710 return true; | 696 return true; |
| 711 #if defined(OS_WIN) | 697 #if defined(OS_WIN) |
| 712 case VK_INSERT: | 698 case VK_INSERT: |
| 713 #endif | 699 #endif |
| 714 case 'C': | 700 case 'C': |
| 715 GetFocusedFrame()->Copy(); | 701 GetFocusedFrame()->Copy(); |
| 716 return true; | 702 return true; |
| 717 // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl | 703 // Match FF behavior in the sense that Ctrl+home/end are the only Ctrl |
| 718 // key combinations which affect scrolling. Safari is buggy in the | 704 // key combinations which affect scrolling. Safari is buggy in the |
| 719 // sense that it scrolls the page for all Ctrl+scrolling key | 705 // sense that it scrolls the page for all Ctrl+scrolling key |
| 720 // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc. | 706 // combinations. For e.g. Ctrl+pgup/pgdn/up/down, etc. |
| 721 #if defined(OS_WIN) | 707 #if defined(OS_WIN) |
| 722 case VK_HOME: | 708 case VK_HOME: |
| 723 case VK_END: | 709 case VK_END: |
| 724 #endif | 710 #endif |
| 725 break; | 711 break; |
| 726 default: | 712 default: |
| 727 return false; | 713 return false; |
| 728 } | 714 } |
| 729 } | 715 } |
| 730 #if defined(OS_WIN) | 716 #if defined(OS_WIN) |
| 731 if (!event.system_key) { | 717 if (!event.system_key) { |
| 732 return ScrollViewWithKeyboard(event.key_code); | 718 return ScrollViewWithKeyboard(event.windows_key_code); |
| 733 } | 719 } |
| 734 #endif | 720 #endif |
| 735 break; | 721 break; |
| 736 } | 722 } |
| 737 | 723 |
| 738 default: | 724 default: |
| 739 break; | 725 break; |
| 740 } | 726 } |
| 741 return false; | 727 return false; |
| 742 } | 728 } |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 | 953 |
| 968 case WebInputEvent::MOUSE_DOWN: | 954 case WebInputEvent::MOUSE_DOWN: |
| 969 case WebInputEvent::MOUSE_DOUBLE_CLICK: | 955 case WebInputEvent::MOUSE_DOUBLE_CLICK: |
| 970 MouseDown(*static_cast<const WebMouseEvent*>(input_event)); | 956 MouseDown(*static_cast<const WebMouseEvent*>(input_event)); |
| 971 break; | 957 break; |
| 972 | 958 |
| 973 case WebInputEvent::MOUSE_UP: | 959 case WebInputEvent::MOUSE_UP: |
| 974 MouseUp(*static_cast<const WebMouseEvent*>(input_event)); | 960 MouseUp(*static_cast<const WebMouseEvent*>(input_event)); |
| 975 break; | 961 break; |
| 976 | 962 |
| 963 case WebInputEvent::RAW_KEY_DOWN: |
| 977 case WebInputEvent::KEY_DOWN: | 964 case WebInputEvent::KEY_DOWN: |
| 978 case WebInputEvent::KEY_UP: | 965 case WebInputEvent::KEY_UP: |
| 979 handled = KeyEvent(*static_cast<const WebKeyboardEvent*>(input_event)); | 966 handled = KeyEvent(*static_cast<const WebKeyboardEvent*>(input_event)); |
| 980 break; | 967 break; |
| 981 | 968 |
| 982 case WebInputEvent::CHAR: | 969 case WebInputEvent::CHAR: |
| 983 handled = CharEvent(*static_cast<const WebKeyboardEvent*>(input_event)); | 970 handled = CharEvent(*static_cast<const WebKeyboardEvent*>(input_event)); |
| 984 break; | 971 break; |
| 985 default: | 972 default: |
| 986 handled = false; | 973 handled = false; |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1225 } | 1212 } |
| 1226 } | 1213 } |
| 1227 | 1214 |
| 1228 void WebViewImpl::SetInitialFocus(bool reverse) { | 1215 void WebViewImpl::SetInitialFocus(bool reverse) { |
| 1229 if (page_.get()) { | 1216 if (page_.get()) { |
| 1230 // So RestoreFocus does not focus anything when it is called. | 1217 // So RestoreFocus does not focus anything when it is called. |
| 1231 ReleaseFocusReferences(); | 1218 ReleaseFocusReferences(); |
| 1232 | 1219 |
| 1233 // Since we don't have a keyboard event, we'll create one. | 1220 // Since we don't have a keyboard event, we'll create one. |
| 1234 WebKeyboardEvent keyboard_event; | 1221 WebKeyboardEvent keyboard_event; |
| 1235 keyboard_event.type = WebInputEvent::KEY_DOWN; | 1222 keyboard_event.type = WebInputEvent::RAW_KEY_DOWN; |
| 1236 if (reverse) | 1223 if (reverse) |
| 1237 keyboard_event.modifiers = WebInputEvent::SHIFT_KEY; | 1224 keyboard_event.modifiers = WebInputEvent::SHIFT_KEY; |
| 1238 // VK_TAB which is only defined on Windows. | 1225 // VK_TAB which is only defined on Windows. |
| 1239 keyboard_event.key_code = 0x09; | 1226 keyboard_event.windows_key_code = 0x09; |
| 1240 MakePlatformKeyboardEvent platform_event(keyboard_event); | 1227 MakePlatformKeyboardEvent platform_event(keyboard_event); |
| 1241 // We have to set the key type explicitly to avoid an assert in the | 1228 // We have to set the key type explicitly to avoid an assert in the |
| 1242 // KeyboardEvent constructor. | 1229 // KeyboardEvent constructor. |
| 1243 platform_event.SetKeyType(PlatformKeyboardEvent::RawKeyDown); | |
| 1244 RefPtr<KeyboardEvent> webkit_event = KeyboardEvent::create(platform_event, | 1230 RefPtr<KeyboardEvent> webkit_event = KeyboardEvent::create(platform_event, |
| 1245 NULL); | 1231 NULL); |
| 1246 page()->focusController()->setInitialFocus( | 1232 page()->focusController()->setInitialFocus( |
| 1247 reverse ? WebCore::FocusDirectionBackward : | 1233 reverse ? WebCore::FocusDirectionBackward : |
| 1248 WebCore::FocusDirectionForward, | 1234 WebCore::FocusDirectionForward, |
| 1249 webkit_event.get()); | 1235 webkit_event.get()); |
| 1250 } | 1236 } |
| 1251 } | 1237 } |
| 1252 | 1238 |
| 1253 // Releases references used to restore focus. | 1239 // Releases references used to restore focus. |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 Frame* frame = page_->focusController()->focusedFrame(); | 1698 Frame* frame = page_->focusController()->focusedFrame(); |
| 1713 if (!frame) | 1699 if (!frame) |
| 1714 return NULL; | 1700 return NULL; |
| 1715 | 1701 |
| 1716 Document* document = frame->document(); | 1702 Document* document = frame->document(); |
| 1717 if (!document) | 1703 if (!document) |
| 1718 return NULL; | 1704 return NULL; |
| 1719 | 1705 |
| 1720 return document->focusedNode(); | 1706 return document->focusedNode(); |
| 1721 } | 1707 } |
| OLD | NEW |