OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // The Mac interface forwards most of these commands to the application layer, | 5 // The Mac interface forwards most of these commands to the application layer, |
6 // and I'm not really sure what to do about most of them. | 6 // and I'm not really sure what to do about most of them. |
7 | 7 |
8 #include "config.h" | 8 #include "config.h" |
9 #pragma warning(push, 0) | 9 #pragma warning(push, 0) |
10 #include "Document.h" | 10 #include "Document.h" |
11 #include "EditCommand.h" | 11 #include "EditCommand.h" |
12 #include "Editor.h" | 12 #include "Editor.h" |
13 #include "EventHandler.h" | 13 #include "EventHandler.h" |
14 #include "EventNames.h" | 14 #include "EventNames.h" |
15 #include "HTMLInputElement.h" | 15 #include "HTMLInputElement.h" |
16 #include "Frame.h" | 16 #include "Frame.h" |
17 #include "KeyboardEvent.h" | 17 #include "KeyboardEvent.h" |
18 #include "PlatformKeyboardEvent.h" | 18 #include "PlatformKeyboardEvent.h" |
19 #include "PlatformString.h" | 19 #include "PlatformString.h" |
20 #pragma warning(pop) | 20 #pragma warning(pop) |
21 | 21 |
22 #undef LOG | 22 #undef LOG |
23 | |
24 #include "base/string_util.h" | 23 #include "base/string_util.h" |
25 #include "webkit/glue/editor_client_impl.h" | 24 #include "webkit/glue/editor_client_impl.h" |
26 #include "webkit/glue/glue_util.h" | 25 #include "webkit/glue/glue_util.h" |
27 #include "webkit/glue/webkit_glue.h" | 26 #include "webkit/glue/webkit_glue.h" |
28 #include "webkit/glue/webview.h" | 27 #include "webkit/glue/webview.h" |
29 #include "webkit/glue/webview_impl.h" | 28 #include "webkit/glue/webview_impl.h" |
30 | 29 |
31 // The notImplemented() from NotImplemented.h is now being dragged in via | |
32 // webview_impl.h. We want the one from LogWin.h instead. | |
33 #undef notImplemented | |
34 #include "LogWin.h" | |
35 | |
36 // Arbitrary depth limit for the undo stack, to keep it from using | 30 // Arbitrary depth limit for the undo stack, to keep it from using |
37 // unbounded memory. This is the maximum number of distinct undoable | 31 // unbounded memory. This is the maximum number of distinct undoable |
38 // actions -- unbroken stretches of typed characters are coalesced | 32 // actions -- unbroken stretches of typed characters are coalesced |
39 // into a single action. | 33 // into a single action. |
40 static const size_t kMaximumUndoStackDepth = 1000; | 34 static const size_t kMaximumUndoStackDepth = 1000; |
41 | 35 |
42 namespace { | 36 namespace { |
43 | 37 |
44 // Record an editor command from the keyDownEntries[] below. We ignore the | 38 // Record an editor command from the keyDownEntries[] below. We ignore the |
45 // Move* and Insert* commands because they're not that interesting. | 39 // Move* and Insert* commands because they're not that interesting. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 | 92 |
99 bool EditorClientImpl::isContinuousSpellCheckingEnabled() { | 93 bool EditorClientImpl::isContinuousSpellCheckingEnabled() { |
100 // Spell check everything if possible. | 94 // Spell check everything if possible. |
101 // FIXME(brettw) This should be modified to do reasonable defaults depending | 95 // FIXME(brettw) This should be modified to do reasonable defaults depending |
102 // on input type, and probably also allow the user to turn spellchecking on | 96 // on input type, and probably also allow the user to turn spellchecking on |
103 // for individual fields. | 97 // for individual fields. |
104 return true; | 98 return true; |
105 } | 99 } |
106 | 100 |
107 void EditorClientImpl::toggleContinuousSpellChecking() { | 101 void EditorClientImpl::toggleContinuousSpellChecking() { |
108 notImplemented(); | 102 NOTIMPLEMENTED(); |
109 } | 103 } |
110 | 104 |
111 bool EditorClientImpl::isGrammarCheckingEnabled() { | 105 bool EditorClientImpl::isGrammarCheckingEnabled() { |
112 notImplemented(); | |
113 return false; | 106 return false; |
114 } | 107 } |
115 | 108 |
116 void EditorClientImpl::toggleGrammarChecking() { | 109 void EditorClientImpl::toggleGrammarChecking() { |
117 notImplemented(); | 110 NOTIMPLEMENTED(); |
118 } | 111 } |
119 | 112 |
120 int EditorClientImpl::spellCheckerDocumentTag() { | 113 int EditorClientImpl::spellCheckerDocumentTag() { |
121 notImplemented(); | 114 NOTIMPLEMENTED(); |
122 return 0; | 115 return 0; |
123 } | 116 } |
124 | 117 |
125 bool EditorClientImpl::isEditable() { | 118 bool EditorClientImpl::isEditable() { |
126 notImplemented(); | |
127 return false; | 119 return false; |
128 } | 120 } |
129 | 121 |
130 bool EditorClientImpl::shouldBeginEditing(WebCore::Range* range) { | 122 bool EditorClientImpl::shouldBeginEditing(WebCore::Range* range) { |
131 if (use_editor_delegate_) { | 123 if (use_editor_delegate_) { |
132 WebViewDelegate* d = web_view_->delegate(); | 124 WebViewDelegate* d = web_view_->delegate(); |
133 if (d) | 125 if (d) |
134 return d->ShouldBeginEditing(web_view_, Describe(range)); | 126 return d->ShouldBeginEditing(web_view_, Describe(range)); |
135 } | 127 } |
136 return true; | 128 return true; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 WebViewDelegate* d = web_view_->delegate(); | 211 WebViewDelegate* d = web_view_->delegate(); |
220 if (d) | 212 if (d) |
221 return d->ShouldApplyStyle(web_view_, Describe(style), Describe(range)); | 213 return d->ShouldApplyStyle(web_view_, Describe(style), Describe(range)); |
222 } | 214 } |
223 return true; | 215 return true; |
224 } | 216 } |
225 | 217 |
226 bool EditorClientImpl::shouldMoveRangeAfterDelete( | 218 bool EditorClientImpl::shouldMoveRangeAfterDelete( |
227 WebCore::Range* /*range*/, | 219 WebCore::Range* /*range*/, |
228 WebCore::Range* /*rangeToBeReplaced*/) { | 220 WebCore::Range* /*rangeToBeReplaced*/) { |
229 notImplemented(); | 221 NOTIMPLEMENTED(); |
230 return true; | 222 return true; |
231 } | 223 } |
232 | 224 |
233 void EditorClientImpl::didBeginEditing() { | 225 void EditorClientImpl::didBeginEditing() { |
234 if (use_editor_delegate_) { | 226 if (use_editor_delegate_) { |
235 WebViewDelegate* d = web_view_->delegate(); | 227 WebViewDelegate* d = web_view_->delegate(); |
236 if (d) | 228 if (d) |
237 d->DidBeginEditing(); | 229 d->DidBeginEditing(); |
238 } | 230 } |
239 } | 231 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 | 267 |
276 void EditorClientImpl::didEndEditing() { | 268 void EditorClientImpl::didEndEditing() { |
277 if (use_editor_delegate_) { | 269 if (use_editor_delegate_) { |
278 WebViewDelegate* d = web_view_->delegate(); | 270 WebViewDelegate* d = web_view_->delegate(); |
279 if (d) | 271 if (d) |
280 d->DidEndEditing(); | 272 d->DidEndEditing(); |
281 } | 273 } |
282 } | 274 } |
283 | 275 |
284 void EditorClientImpl::didWriteSelectionToPasteboard() { | 276 void EditorClientImpl::didWriteSelectionToPasteboard() { |
285 notImplemented(); | 277 NOTIMPLEMENTED(); |
286 } | 278 } |
287 | 279 |
288 void EditorClientImpl::didSetSelectionTypesForPasteboard() { | 280 void EditorClientImpl::didSetSelectionTypesForPasteboard() { |
289 notImplemented(); | 281 NOTIMPLEMENTED(); |
290 } | 282 } |
291 | 283 |
292 void EditorClientImpl::registerCommandForUndo( | 284 void EditorClientImpl::registerCommandForUndo( |
293 PassRefPtr<WebCore::EditCommand> command) { | 285 PassRefPtr<WebCore::EditCommand> command) { |
294 if (undo_stack_.size() == kMaximumUndoStackDepth) | 286 if (undo_stack_.size() == kMaximumUndoStackDepth) |
295 undo_stack_.pop_front(); // drop oldest item off the far end | 287 undo_stack_.pop_front(); // drop oldest item off the far end |
296 if (!in_redo_) | 288 if (!in_redo_) |
297 redo_stack_.clear(); | 289 redo_stack_.clear(); |
298 undo_stack_.push_back(command); | 290 undo_stack_.push_back(command); |
299 } | 291 } |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 // | 547 // |
556 // End of code block subject to Apple, Inc. copyright | 548 // End of code block subject to Apple, Inc. copyright |
557 // | 549 // |
558 | 550 |
559 void EditorClientImpl::handleKeyboardEvent(WebCore::KeyboardEvent* evt) { | 551 void EditorClientImpl::handleKeyboardEvent(WebCore::KeyboardEvent* evt) { |
560 if (handleEditingKeyboardEvent(evt)) | 552 if (handleEditingKeyboardEvent(evt)) |
561 evt->setDefaultHandled(); | 553 evt->setDefaultHandled(); |
562 } | 554 } |
563 | 555 |
564 void EditorClientImpl::handleInputMethodKeydown(WebCore::KeyboardEvent* keyEvent
) { | 556 void EditorClientImpl::handleInputMethodKeydown(WebCore::KeyboardEvent* keyEvent
) { |
565 notImplemented(); | 557 NOTIMPLEMENTED(); |
566 } | 558 } |
567 | 559 |
568 void EditorClientImpl::textFieldDidBeginEditing(WebCore::Element*) { | 560 void EditorClientImpl::textFieldDidBeginEditing(WebCore::Element*) { |
569 notImplemented(); | 561 NOTIMPLEMENTED(); |
570 } | 562 } |
571 | 563 |
572 void EditorClientImpl::textFieldDidEndEditing(WebCore::Element*) { | 564 void EditorClientImpl::textFieldDidEndEditing(WebCore::Element*) { |
573 // Notification that focus was lost. | 565 // Notification that focus was lost. |
574 // Be careful with this, it's also sent when the page is being closed. | 566 // Be careful with this, it's also sent when the page is being closed. |
575 notImplemented(); | 567 NOTIMPLEMENTED(); |
576 } | 568 } |
577 | 569 |
578 void EditorClientImpl::textDidChangeInTextField(WebCore::Element* element) { | 570 void EditorClientImpl::textDidChangeInTextField(WebCore::Element* element) { |
579 // Track the element so we can blur/focus it in respondToChangedContents | 571 // Track the element so we can blur/focus it in respondToChangedContents |
580 // so that the selected range is properly set. (See respondToChangedContents). | 572 // so that the selected range is properly set. (See respondToChangedContents). |
581 if (static_cast<WebCore::HTMLInputElement*>(element)->autofilled()) | 573 if (static_cast<WebCore::HTMLInputElement*>(element)->autofilled()) |
582 pending_inline_autocompleted_element_ = element; | 574 pending_inline_autocompleted_element_ = element; |
583 } | 575 } |
584 | 576 |
585 bool EditorClientImpl::doTextFieldCommandFromEvent(WebCore::Element*, | 577 bool EditorClientImpl::doTextFieldCommandFromEvent(WebCore::Element*, |
586 WebCore::KeyboardEvent*) { | 578 WebCore::KeyboardEvent*) { |
587 // The Mac code appears to use this method as a hook to implement special | 579 // The Mac code appears to use this method as a hook to implement special |
588 // keyboard commands specific to Safari's auto-fill implementation. We | 580 // keyboard commands specific to Safari's auto-fill implementation. We |
589 // just return false to allow the default action. | 581 // just return false to allow the default action. |
590 return false; | 582 return false; |
591 } | 583 } |
592 | 584 |
593 void EditorClientImpl::textWillBeDeletedInTextField(WebCore::Element*) { | 585 void EditorClientImpl::textWillBeDeletedInTextField(WebCore::Element*) { |
594 notImplemented(); | 586 NOTIMPLEMENTED(); |
595 } | 587 } |
596 | 588 |
597 void EditorClientImpl::textDidChangeInTextArea(WebCore::Element*) { | 589 void EditorClientImpl::textDidChangeInTextArea(WebCore::Element*) { |
598 notImplemented(); | 590 NOTIMPLEMENTED(); |
599 } | 591 } |
600 | 592 |
601 #if defined(OS_MACOSX) | 593 #if defined(OS_MACOSX) |
602 // TODO(pinkerton): implement these when we get to copy/paste | 594 // TODO(pinkerton): implement these when we get to copy/paste |
603 NSData* EditorClientImpl::dataForArchivedSelection(WebCore::Frame*) { | 595 NSData* EditorClientImpl::dataForArchivedSelection(WebCore::Frame*) { |
604 notImplemented(); | 596 NOTIMPLEMENTED(); |
605 } | 597 } |
606 | 598 |
607 NSString* EditorClientImpl::userVisibleString(NSURL*) { | 599 NSString* EditorClientImpl::userVisibleString(NSURL*) { |
608 notImplemented(); | 600 NOTIMPLEMENTED(); |
609 } | 601 } |
610 | 602 |
611 #ifdef BUILDING_ON_TIGER | 603 #ifdef BUILDING_ON_TIGER |
612 NSArray* EditorClientImpl::pasteboardTypesForSelection(WebCore::Frame*) { | 604 NSArray* EditorClientImpl::pasteboardTypesForSelection(WebCore::Frame*) { |
613 notImplemented(); | 605 NOTIMPLEMENTED(); |
614 } | 606 } |
615 #endif | 607 #endif |
616 #endif | 608 #endif |
617 | 609 |
618 void EditorClientImpl::ignoreWordInSpellDocument(const WebCore::String&) { | 610 void EditorClientImpl::ignoreWordInSpellDocument(const WebCore::String&) { |
619 notImplemented(); | 611 NOTIMPLEMENTED(); |
620 } | 612 } |
621 | 613 |
622 void EditorClientImpl::learnWord(const WebCore::String&) { | 614 void EditorClientImpl::learnWord(const WebCore::String&) { |
623 notImplemented(); | 615 NOTIMPLEMENTED(); |
624 } | 616 } |
625 | 617 |
626 void EditorClientImpl::checkSpellingOfString(const UChar* str, int length, | 618 void EditorClientImpl::checkSpellingOfString(const UChar* str, int length, |
627 int* misspellingLocation, | 619 int* misspellingLocation, |
628 int* misspellingLength) { | 620 int* misspellingLength) { |
629 // SpellCheckWord will write (0, 0) into the output vars, which is what our | 621 // SpellCheckWord will write (0, 0) into the output vars, which is what our |
630 // caller expects if the word is spelled correctly. | 622 // caller expects if the word is spelled correctly. |
631 int spell_location = -1; | 623 int spell_location = -1; |
632 int spell_length = 0; | 624 int spell_length = 0; |
633 WebViewDelegate* d = web_view_->delegate(); | 625 WebViewDelegate* d = web_view_->delegate(); |
(...skipping 11 matching lines...) Expand all Loading... |
645 if (misspellingLocation) | 637 if (misspellingLocation) |
646 *misspellingLocation = spell_location; | 638 *misspellingLocation = spell_location; |
647 if (misspellingLength) | 639 if (misspellingLength) |
648 *misspellingLength = spell_length; | 640 *misspellingLength = spell_length; |
649 } | 641 } |
650 | 642 |
651 void EditorClientImpl::checkGrammarOfString(const UChar*, int length, | 643 void EditorClientImpl::checkGrammarOfString(const UChar*, int length, |
652 WTF::Vector<WebCore::GrammarDetail>&
, | 644 WTF::Vector<WebCore::GrammarDetail>&
, |
653 int* badGrammarLocation, | 645 int* badGrammarLocation, |
654 int* badGrammarLength) { | 646 int* badGrammarLength) { |
655 notImplemented(); | 647 NOTIMPLEMENTED(); |
656 if (badGrammarLocation) | 648 if (badGrammarLocation) |
657 *badGrammarLocation = 0; | 649 *badGrammarLocation = 0; |
658 if (badGrammarLength) | 650 if (badGrammarLength) |
659 *badGrammarLength = 0; | 651 *badGrammarLength = 0; |
660 } | 652 } |
661 | 653 |
662 void EditorClientImpl::updateSpellingUIWithGrammarString(const WebCore::String&, | 654 void EditorClientImpl::updateSpellingUIWithGrammarString(const WebCore::String&, |
663 const WebCore::GrammarD
etail& detail) { | 655 const WebCore::GrammarD
etail& detail) { |
664 notImplemented(); | 656 NOTIMPLEMENTED(); |
665 } | 657 } |
666 | 658 |
667 void EditorClientImpl::updateSpellingUIWithMisspelledWord(const WebCore::String&
) { | 659 void EditorClientImpl::updateSpellingUIWithMisspelledWord(const WebCore::String&
) { |
668 notImplemented(); | 660 NOTIMPLEMENTED(); |
669 } | 661 } |
670 | 662 |
671 void EditorClientImpl::showSpellingUI(bool show) { | 663 void EditorClientImpl::showSpellingUI(bool show) { |
672 notImplemented(); | 664 NOTIMPLEMENTED(); |
673 } | 665 } |
674 | 666 |
675 bool EditorClientImpl::spellingUIIsShowing() { | 667 bool EditorClientImpl::spellingUIIsShowing() { |
676 return false; | 668 return false; |
677 } | 669 } |
678 | 670 |
679 void EditorClientImpl::getGuessesForWord(const WebCore::String&, | 671 void EditorClientImpl::getGuessesForWord(const WebCore::String&, |
680 WTF::Vector<WebCore::String>& guesses)
{ | 672 WTF::Vector<WebCore::String>& guesses)
{ |
681 notImplemented(); | 673 NOTIMPLEMENTED(); |
682 } | 674 } |
683 | 675 |
684 void EditorClientImpl::setInputMethodState(bool enabled) { | 676 void EditorClientImpl::setInputMethodState(bool enabled) { |
685 WebViewDelegate* d = web_view_->delegate(); | 677 WebViewDelegate* d = web_view_->delegate(); |
686 if (d) { | 678 if (d) { |
687 d->SetInputMethodState(enabled); | 679 d->SetInputMethodState(enabled); |
688 } | 680 } |
689 } | 681 } |
690 | 682 |
691 | 683 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
764 return L"(UNKNOWN AFFINITY)"; | 756 return L"(UNKNOWN AFFINITY)"; |
765 } | 757 } |
766 | 758 |
767 std::wstring EditorClientImpl::Describe(WebCore::CSSStyleDeclaration* style) { | 759 std::wstring EditorClientImpl::Describe(WebCore::CSSStyleDeclaration* style) { |
768 // TODO(pamg): Implement me. It's not clear what WebKit produces for this | 760 // TODO(pamg): Implement me. It's not clear what WebKit produces for this |
769 // (their [style description] method), and none of the layout tests provide | 761 // (their [style description] method), and none of the layout tests provide |
770 // an example. But because none of them use it, it's not yet important. | 762 // an example. But because none of them use it, it's not yet important. |
771 return std::wstring(); | 763 return std::wstring(); |
772 } | 764 } |
773 | 765 |
OLD | NEW |