Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp

Issue 2333813002: Introduce WebInputMethodController to blink (Closed)
Patch Set: Removed an unsued enum form WebInputMethodController Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2014 Google Inc. All rights reserved. 2 * Copyright (C) 2014 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 #include "public/web/WebAutofillClient.h" 57 #include "public/web/WebAutofillClient.h"
58 #include "public/web/WebPlugin.h" 58 #include "public/web/WebPlugin.h"
59 #include "public/web/WebRange.h" 59 #include "public/web/WebRange.h"
60 #include "public/web/WebWidgetClient.h" 60 #include "public/web/WebWidgetClient.h"
61 #include "web/CompositionUnderlineVectorBuilder.h" 61 #include "web/CompositionUnderlineVectorBuilder.h"
62 #include "web/CompositorMutatorImpl.h" 62 #include "web/CompositorMutatorImpl.h"
63 #include "web/CompositorProxyClientImpl.h" 63 #include "web/CompositorProxyClientImpl.h"
64 #include "web/ContextMenuAllowedScope.h" 64 #include "web/ContextMenuAllowedScope.h"
65 #include "web/WebDevToolsAgentImpl.h" 65 #include "web/WebDevToolsAgentImpl.h"
66 #include "web/WebInputEventConversion.h" 66 #include "web/WebInputEventConversion.h"
67 #include "web/WebInputMethodControllerImpl.h"
67 #include "web/WebLocalFrameImpl.h" 68 #include "web/WebLocalFrameImpl.h"
68 #include "web/WebPluginContainerImpl.h" 69 #include "web/WebPluginContainerImpl.h"
69 #include "web/WebRemoteFrameImpl.h" 70 #include "web/WebRemoteFrameImpl.h"
70 #include "web/WebViewFrameWidget.h" 71 #include "web/WebViewFrameWidget.h"
71 #include "wtf/AutoReset.h" 72 #include "wtf/AutoReset.h"
72 #include "wtf/PtrUtil.h" 73 #include "wtf/PtrUtil.h"
73 #include <memory> 74 #include <memory>
74 75
75 namespace blink { 76 namespace blink {
76 77
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 void WebFrameWidgetImpl::setBaseBackgroundColor(WebColor color) 401 void WebFrameWidgetImpl::setBaseBackgroundColor(WebColor color)
401 { 402 {
402 if (m_baseBackgroundColor == color) 403 if (m_baseBackgroundColor == color)
403 return; 404 return;
404 405
405 m_baseBackgroundColor = color; 406 m_baseBackgroundColor = color;
406 407
407 m_localRoot->frameView()->setBaseBackgroundColor(color); 408 m_localRoot->frameView()->setBaseBackgroundColor(color);
408 } 409 }
409 410
411 WebInputMethodControllerImpl* WebFrameWidgetImpl::getActiveWebInputMethodControl ler() const
412 {
413 return WebInputMethodControllerImpl::fromFrame(focusedLocalFrameAvailableFor Ime());
414 }
415
410 void WebFrameWidgetImpl::scheduleAnimation() 416 void WebFrameWidgetImpl::scheduleAnimation()
411 { 417 {
412 if (m_layerTreeView) { 418 if (m_layerTreeView) {
413 m_layerTreeView->setNeedsBeginFrame(); 419 m_layerTreeView->setNeedsBeginFrame();
414 return; 420 return;
415 } 421 }
416 if (m_client) 422 if (m_client)
417 m_client->scheduleAnimation(); 423 m_client->scheduleAnimation();
418 } 424 }
419 425
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 } 499 }
494 500
495 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This 501 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This
496 // code needs to be refactored (http://crbug.com/629721). 502 // code needs to be refactored (http://crbug.com/629721).
497 bool WebFrameWidgetImpl::setComposition( 503 bool WebFrameWidgetImpl::setComposition(
498 const WebString& text, 504 const WebString& text,
499 const WebVector<WebCompositionUnderline>& underlines, 505 const WebVector<WebCompositionUnderline>& underlines,
500 int selectionStart, 506 int selectionStart,
501 int selectionEnd) 507 int selectionEnd)
502 { 508 {
503 LocalFrame* focused = focusedLocalFrameAvailableForIme(); 509 if (!getActiveWebInputMethodController())
504 if (!focused)
505 return false; 510 return false;
506 511 return getActiveWebInputMethodController()->setComposition(text, underlines, selectionStart, selectionEnd);
507 if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused))
508 return plugin->setComposition(text, underlines, selectionStart, selectio nEnd);
509
510 // The input focus has been moved to another WebWidget object.
511 // We should use this |editor| object only to complete the ongoing
512 // composition.
513 InputMethodController& inputMethodController = focused->inputMethodControlle r();
514 if (!focused->editor().canEdit() && !inputMethodController.hasComposition())
515 return false;
516
517 // We should verify the parent node of this IME composition node are
518 // editable because JavaScript may delete a parent node of the composition
519 // node. In this case, WebKit crashes while deleting texts from the parent
520 // node, which doesn't exist any longer.
521 const EphemeralRange range = inputMethodController.compositionEphemeralRange ();
522 if (range.isNotNull()) {
523 Node* node = range.startPosition().computeContainerNode();
524 focused->document()->updateStyleAndLayoutTree();
525 if (!node || !hasEditableStyle(*node))
526 return false;
527 }
528
529 // A keypress event is canceled. If an ongoing composition exists, then the
530 // keydown event should have arisen from a handled key (e.g., backspace).
531 // In this case we ignore the cancellation and continue; otherwise (no
532 // ongoing composition) we exit and signal success only for attempts to
533 // clear the composition.
534 if (m_suppressNextKeypressEvent && !inputMethodController.hasComposition())
535 return text.isEmpty();
536
537 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
538
539 // When the range of composition underlines overlap with the range between
540 // selectionStart and selectionEnd, WebKit somehow won't paint the selection
541 // at all (see InlineTextBox::paint() function in InlineTextBox.cpp).
542 // But the selection range actually takes effect.
543 inputMethodController.setComposition(String(text),
544 CompositionUnderlineVectorBuilder(underlines),
545 selectionStart, selectionEnd);
546
547 return text.isEmpty() || inputMethodController.hasComposition();
548 } 512 }
549 513
550 // TODO(ekaramad):These methods are almost duplicated in WebViewImpl as well. 514 // TODO(ekaramad):These methods are almost duplicated in WebViewImpl as well.
551 // This code needs to be refactored (http://crbug.com/629721). 515 // This code needs to be refactored (http://crbug.com/629721).
552 bool WebFrameWidgetImpl::commitText(const WebString& text, int relativeCaretPosi tion) 516 bool WebFrameWidgetImpl::commitText(const WebString& text, int relativeCaretPosi tion)
553 { 517 {
554 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); 518 if (!getActiveWebInputMethodController())
555 LocalFrame* focused = focusedLocalFrameAvailableForIme();
556 if (!focused)
557 return false; 519 return false;
558 520 return getActiveWebInputMethodController()->commitText(text, relativeCaretPo sition);
559 if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused))
560 return plugin->commitText(text, relativeCaretPosition);
561
562 return focused->inputMethodController().commitText(text, relativeCaretPositi on);
563 } 521 }
564 522
523 // TODO(ekaramad):These methods are almost duplicated in WebViewImpl as well.
524 // This code needs to be refactored (http://crbug.com/629721).
565 bool WebFrameWidgetImpl::finishComposingText(ConfirmCompositionBehavior selectio nBehavior) 525 bool WebFrameWidgetImpl::finishComposingText(ConfirmCompositionBehavior selectio nBehavior)
566 { 526 {
567 LocalFrame* focused = focusedLocalFrameAvailableForIme(); 527 if (!getActiveWebInputMethodController())
568 if (!focused)
569 return false; 528 return false;
570 529 return getActiveWebInputMethodController()->finishComposingText(selectionBeh avior);
571 if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused))
572 return plugin->finishComposingText(selectionBehavior);
573
574 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
575 // needs to be audited. See http://crbug.com/590369 for more details.
576 focused->document()->updateStyleAndLayoutIgnorePendingStylesheets();
577
578 return focused->inputMethodController().finishComposingText(selectionBehavio r == KeepSelection ? InputMethodController::KeepSelection : InputMethodControlle r::DoNotKeepSelection);
579 } 530 }
580 531
581 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This 532 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This
582 // code needs to be refactored (http://crbug.com/629721). 533 // code needs to be refactored (http://crbug.com/629721).
583 WebRange WebFrameWidgetImpl::compositionRange() 534 WebRange WebFrameWidgetImpl::compositionRange()
584 { 535 {
585 LocalFrame* focused = focusedLocalFrameAvailableForIme(); 536 LocalFrame* focused = focusedLocalFrameAvailableForIme();
586 if (!focused) 537 if (!focused)
587 return WebRange(); 538 return WebRange();
588 539
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after
1478 } 1429 }
1479 1430
1480 LocalFrame* WebFrameWidgetImpl::focusedLocalFrameAvailableForIme() const 1431 LocalFrame* WebFrameWidgetImpl::focusedLocalFrameAvailableForIme() const
1481 { 1432 {
1482 if (!m_imeAcceptEvents) 1433 if (!m_imeAcceptEvents)
1483 return nullptr; 1434 return nullptr;
1484 return focusedLocalFrameInWidget(); 1435 return focusedLocalFrameInWidget();
1485 } 1436 }
1486 1437
1487 } // namespace blink 1438 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698