[IME] Enable Text Composition logic 97/286597/4
authorGajendra N <gajendra.n@samsung.com>
Tue, 10 Jan 2023 09:06:28 +0000 (14:36 +0530)
committerBot Blink <blinkbot@samsung.com>
Wed, 11 Jan 2023 10:49:03 +0000 (10:49 +0000)
This patch adds necessary changes to enable text composition flow
for English and Korean key down and up inputs from HW:KB and IME.

IMContextEfl is notified after a keyevent is processed at the Blink
side, after which |ui::Event| is created and composition is confirmed.

References:
https://review.tizen.org/gerrit/281341
https://review.tizen.org/gerrit/281934
https://review.tizen.org/gerrit/286244

Change-Id: I640aa403ba5d9fd003ce06d0d08f0a792b909686
Signed-off-by: Gajendra N <gajendra.n@samsung.com>
23 files changed:
content/browser/renderer_host/render_widget_host_impl.cc
content/browser/renderer_host/render_widget_host_impl.h
content/browser/renderer_host/render_widget_host_view_aura.cc
content/browser/renderer_host/render_widget_host_view_aura.h
content/browser/renderer_host/render_widget_host_view_base.h
content/public/test/fake_render_widget_host.h
third_party/blink/public/mojom/BUILD.gn
third_party/blink/public/mojom/page/widget.mojom
third_party/blink/renderer/core/dom/events/event_dispatcher.cc
third_party/blink/renderer/core/editing/editor_key_bindings.cc
third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
third_party/blink/renderer/core/frame/web_frame_widget_impl.h
third_party/blink/renderer/platform/widget/input/widget_base_input_handler.cc
third_party/blink/renderer/platform/widget/widget_base_client.h
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc
tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h
tizen_src/chromium_impl/ui/ozone/platform/efl/efl_event_handler.cc
tizen_src/chromium_impl/ui/ozone/platform/efl/im_context_efl.h
tizen_src/ewk/efl_integration/eweb_view.cc
ui/events/blink/web_input_event.cc
ui/events/event.cc
ui/events/event_utils.h
ui/events/events_default.cc

index 0133090585389abafc843d7f7258d3d2281a5b54..db4f1c95bf068b8224b3e238a656a89d799fbe3d 100644 (file)
@@ -3830,6 +3830,15 @@ gfx::Size RenderWidgetHostImpl::GetRootWidgetViewportSize() {
   return root_view->GetVisibleViewportSize();
 }
 
+#if BUILDFLAG(IS_EFL)
+void RenderWidgetHostImpl::HandleKeyEvent(blink::WebInputEvent::Type type,
+                                          bool processed) {
+  if (!view_)
+    return;
+  view_->DidHandleKeyEvent(type, processed);
+}
+#endif
+
 // This method was copied from RenderWidget::ConvertWindowToViewport() when
 // porting drag-and-drop calls to Mojo, so that RenderWidgetHostImpl bypasses
 // RenderWidget to talk the the WebFrameWidget and needs to perform the scale
index 688c6b226d83996e29f5aebc542163fe6b53e77a..b2df2f8377323ceebe4efb60413b0dde1f62f334 100644 (file)
@@ -1023,6 +1023,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl
                      const gfx::Rect& drag_obj_rect_in_dip,
                      blink::mojom::DragEventSourceInfoPtr event_info) override;
 
+#if BUILDFLAG(IS_EFL)
+  void HandleKeyEvent(blink::WebInputEvent::Type type, bool processed) override;
+#endif
+
   // When the RenderWidget is destroyed and recreated, this resets states in the
   // browser to match the clean start for the renderer side.
   void ResetStateForCreatedRenderWidget(
index 7c900c47f07768b2300c36750bac52fab3197e3a..297f4dc47f8309ff17ed83c5ba337ec662de4f2c 100644 (file)
@@ -562,6 +562,22 @@ void RenderWidgetHostViewAura::NotifySwap(const uint32_t texture_id) {
   if (offscreen_helper_)
     offscreen_helper_->NotifySwap(texture_id);
 }
+
+void RenderWidgetHostViewAura::DidHandleKeyEvent(
+    blink::WebInputEvent::Type input_event_type,
+    bool processed) {
+  if (offscreen_helper_)
+    offscreen_helper_->DidHandleKeyEvent(input_event_type, processed);
+}
+
+void RenderWidgetHostViewAura::SelectionChanged(const std::u16string& text,
+                                                size_t offset,
+                                                const gfx::Range& range) {
+  RenderWidgetHostViewBase::SelectionChanged(text, offset, range);
+
+  if (offscreen_helper_)
+    offscreen_helper_->SelectionChanged(text, offset, range);
+}
 #endif
 
 void RenderWidgetHostViewAura::EnsureSurfaceSynchronizedForWebTest() {
index 99e32324592b37d6750a00d80d0092397ced2e50..f106b680b5ab0f95ee74aa4e047201b0853becca 100644 (file)
@@ -410,6 +410,11 @@ class CONTENT_EXPORT RenderWidgetHostViewAura
     return offscreen_helper_.get();
   }
   void NotifySwap(const uint32_t texture_id);
+  void DidHandleKeyEvent(blink::WebInputEvent::Type input_event,
+                         bool processed) override;
+  void SelectionChanged(const std::u16string& text,
+                        size_t offset,
+                        const gfx::Range& range) override;
 #endif
 
  protected:
index 467eaa32808b3144ae74876328cfa175ef2693b0..ec2b115776e0cbddf45675e444e67f56b78fdb95 100644 (file)
@@ -564,6 +564,11 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView {
   // RenderWidgetHostView.
   VisibleTimeRequestTrigger* GetVisibleTimeRequestTrigger();
 
+#if BUILDFLAG(IS_EFL)
+  virtual void DidHandleKeyEvent(blink::WebInputEvent::Type input_event,
+                                 bool processed) {}
+#endif
+
  protected:
   explicit RenderWidgetHostViewBase(RenderWidgetHost* host);
   ~RenderWidgetHostViewBase() override;
index 6996124a6ee00bbca6b3594c4a5d19b0cb040413..bc98834f49c1b17e16e273e567d09f66e235e4d5 100644 (file)
@@ -39,6 +39,11 @@ class FakeRenderWidgetHost : public blink::mojom::FrameWidgetHost,
             mojo::PendingAssociatedReceiver<blink::mojom::Widget>>
   BindNewWidgetInterfaces();
 
+#if BUILDFLAG(IS_EFL)
+  void HandleKeyEvent(blink::WebInputEvent::Type type,
+                      bool processed) override {}
+#endif
+
   // blink::mojom::FrameWidgetHost overrides.
   void AnimateDoubleTapZoomInMainFrame(const gfx::Point& tap_point,
                                        const gfx::Rect& rect_to_zoom) override;
index f0c2655a1999029d511fefe87dfb1e8eea90693e..0adc86b8125595ac4dead7fce069ba5251c53d8b 100644 (file)
@@ -1094,6 +1094,11 @@ mojom("mojom_core") {
     "//url/mojom:url_mojom_origin",
   ]
 
+  enabled_features = []
+  if (use_efl) {
+    enabled_features += [ "is_efl" ]
+  }
+
   if (is_android) {
     # Direct deps (instead of transitive deps) are necessary for java targets.
     public_deps += [
index 9cf30401cc62100644bb4d65d510b286ffbcdb97..9a04ae796cd7f101335ec7ba16050b3da333c0b3 100644 (file)
@@ -23,6 +23,9 @@ import "ui/gfx/geometry/mojom/geometry.mojom";
 [EnableIf=is_mac]
 import "ui/base/mojom/attributed_string.mojom";
 
+[EnableIf=is_efl]
+import "third_party/blink/public/mojom/input/input_event.mojom";
+
 // Implemented in Blink, this interface defines frame-widget-specific methods that
 // will be invoked from the browser process (e.g. blink::WebFrameWidget).
 interface FrameWidget {
@@ -195,6 +198,9 @@ interface FrameWidgetHost {
                 gfx.mojom.Vector2d cursor_offset_in_dip,
                 gfx.mojom.Rect drag_obj_rect_in_dip,
                 DragEventSourceInfo event_info);
+
+  [EnableIf=is_efl]
+  HandleKeyEvent(EventType type, bool processed);
 };
 
 // Implemented in Browser, this interface defines popup-widget-specific methods
index f68d422e68bb2c75f3e65470245518386db9ae65..3f0ee2c939baab52ccc64ccf4b5248090ff75767 100644 (file)
@@ -396,6 +396,15 @@ inline void EventDispatcher::DispatchEventPostProcess(
     }
   }
 
+#if BUILDFLAG(IS_TIZEN_TV)
+  if (event_->IsKeyboardEvent()) {
+    if (event_->defaultPrevented())
+      LOG(INFO) << "Keyboard event been defaultPrevented";
+    if (event_->DefaultHandled())
+      LOG(INFO) << "Keyboard event been DefaultHandled";
+  }
+#endif
+
   // Call default event handlers. While the DOM does have a concept of
   // preventing default handling, the detail of which handlers are called is an
   // internal implementation detail and not part of the DOM.
index 3b09fcfbca9a9790d04f94b65732e7ff12b563b6..93468d559093679e1f81acdaf42742e5deefe4f2 100644 (file)
@@ -41,7 +41,8 @@ namespace blink {
 
 bool Editor::HandleEditingKeyboardEvent(KeyboardEvent* evt) {
   const WebKeyboardEvent* key_event = evt->KeyEvent();
-  if (!key_event)
+  // do not treat this as text input if it's a system key event
+  if (!key_event || key_event->is_system_key)
     return false;
 
   String command_name = Behavior().InterpretKeyEvent(*evt);
index 2779b0a23477d33e747cb0d97079b463b1060652..5e5704a3b3980eb3afebea9b9bd9b0cf0d85926a 100644 (file)
@@ -4498,4 +4498,11 @@ void WebFrameWidgetImpl::NotifyZoomLevelChanged(LocalFrame* root) {
   }
 }
 
+#if BUILDFLAG(IS_EFL)
+void WebFrameWidgetImpl::NotifyKeyEvent(WebInputEvent::Type type,
+                                        bool processed) {
+  GetAssociatedFrameWidgetHost()->HandleKeyEvent(type, processed);
+}
+#endif
+
 }  // namespace blink
index 30e106d5b8d4786187c941c835ee553dec8b29f5..72528ee2f523c3cabf52bda2e6e27a5e46870a68 100644 (file)
@@ -632,6 +632,10 @@ class CORE_EXPORT WebFrameWidgetImpl
   // Ask compositor to create the shared memory for smoothness ukm region.
   base::ReadOnlySharedMemoryRegion CreateSharedMemoryForSmoothnessUkm();
 
+#if BUILDFLAG(IS_EFL)
+  void NotifyKeyEvent(WebInputEvent::Type type, bool processed) override;
+#endif
+
  protected:
   // WidgetBaseClient overrides:
   void ScheduleAnimation() override;
index ffb556061f40ffd5e0e4baf343bdbd96e87ebc0a..36665fff06f267bb35338eb965b63ccc837b837f 100644 (file)
@@ -448,6 +448,19 @@ void WidgetBaseInputHandler::HandleInputEvent(
     }
   }
 
+#if BUILDFLAG(IS_EFL)
+  if (WebInputEvent::IsKeyboardEventType(input_event.GetType())) {
+    // This message is called for every IME key input.
+    // The current status of processing the input event is used to
+    // properly manage 'CommitQueue' or 'PreeditQueue' on impl side:
+    // If the event is not processed, 'ConfirmComposition' or 'SetComposition'
+    // is called for IME composition, and then pops event queue.
+    // If the event is processed instead, impl side just pops the queue.
+    widget_->client()->NotifyKeyEvent(
+        input_event.GetType(), processed != WebInputEventResult::kNotHandled);
+  }
+#endif
+
   // Handling |input_event| is finished and further down, we might start
   // handling injected scroll events. So, stop monitoring EventMetrics for
   // |input_event| to avoid nested monitors.
index 34569f6ab8209e68c1f134cff06e463346e8551d..9f8a3914ee254a956b96325bf94d71c96643c7f4 100644 (file)
@@ -233,6 +233,10 @@ class WidgetBaseClient {
   // Whether to use ScrollPredictor to resample scroll events. This is false for
   // web_tests to ensure that scroll deltas are not timing-dependent.
   virtual bool AllowsScrollResampling() { return true; }
+
+#if BUILDFLAG(IS_EFL)
+  virtual void NotifyKeyEvent(WebInputEvent::Type type, bool processed) {}
+#endif
 };
 
 }  // namespace blink
index 2ef4049839d658639b56cb0aecae57d9fb7544f0..ef0542edcf4128f95b3cae5e77ff70175ddf0767 100644 (file)
@@ -469,6 +469,29 @@ void RWHVAuraOffscreenHelperEfl::OnMouseOrTouchEvent(ui::Event* event) {
   }
 }
 
+void RWHVAuraOffscreenHelperEfl::DidHandleKeyEvent(
+    blink::WebInputEvent::Type input_event_type,
+    bool processed) {
+  if (!GetIMContextEfl())
+    return;
+
+  bool is_keydown = false;
+  switch (input_event_type) {
+    case blink::WebInputEvent::Type::kRawKeyDown:
+    case blink::WebInputEvent::Type::kKeyDown:
+      is_keydown = true;
+    case blink::WebInputEvent::Type::kKeyUp:
+      GetIMContextEfl()->HandleKeyEvent(is_keydown, processed);
+  }
+}
+
+void RWHVAuraOffscreenHelperEfl::SelectionChanged(const std::u16string& text,
+                                                  size_t offset,
+                                                  const gfx::Range& range) {
+  if (range.start() == range.end() && GetIMContextEfl())
+    GetIMContextEfl()->SetCaretPosition(range.start());
+}
+
 void RWHVAuraOffscreenHelperEfl::EvasToBlinkCords(int x,
                                                   int y,
                                                   int* view_x,
index 661f6da3055f9688b676dc21c8600544bc3b46ce..35fc17cf5757a27c69fa145b5950eb87b78d75e0 100644 (file)
 #include "base/containers/id_map.h"
 #include "base/timer/timer.h"
 #include "content/common/cursors/webcursor.h"
+#include "third_party/blink/public/common/input/web_input_event.h"
 #include "ui/base/ime/mojom/text_input_state.mojom-forward.h"
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/size_f.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/range/range.h"
 
 namespace ui {
 class EflEventHandler;
@@ -67,6 +69,11 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl {
 
   RenderWidgetHostViewAura* rwhva() { return rwhv_aura_; }
   void OnMouseOrTouchEvent(ui::Event* event);
+  void DidHandleKeyEvent(blink::WebInputEvent::Type input_event_type,
+                         bool processed);
+  void SelectionChanged(const std::u16string& text,
+                        size_t offset,
+                        const gfx::Range& range);
   void EvasToBlinkCords(int x, int y, int* view_x, int* view_y);
 
   Evas_Object* ewk_view() const;
index 7f18a4ad4575d302f9c27c0056ead6d05b98e264..3031154ff4f87a0b7507d98ce60ff97d81dc9f9e 100644 (file)
@@ -9,7 +9,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "content/public/browser/native_web_keyboard_event.h"
 #include "tizen/system_info.h"
 #include "ui/base/ime/linux/linux_input_method_context_factory.h"
 #include "ui/events/base_event_utils.h"
index e849cc2da6358e7f3075eda583ad9d889283db95..7a6ad99696a6ec28f28cf0b1251d71a62b82dd35 100644 (file)
@@ -10,7 +10,6 @@
 #include <queue>
 
 #include "build/build_config.h"
-#include "content/public/browser/native_web_keyboard_event.h"
 #include "ui/base/ime/composition_text.h"
 #include "ui/base/ime/text_input_mode.h"
 #include "ui/base/ime/text_input_type.h"
index 15c34bc5af4cca71cefaec65a0e657b75499ae3e..28ae038ddc009010c10d7a614c87401106969070 100644 (file)
@@ -1381,16 +1381,15 @@ bool EWebView::GetSelectionRange(Eina_Rectangle* left_rect,
 }
 
 Eina_Bool EWebView::ClearSelection() {
-#if !defined(USE_AURA)
-  if (!rwhv())
+  if (!rwhva())
     return EINA_FALSE;
 
   ResetContextMenuController();
-  rwhv()->SelectionChanged(std::u16string(), 0, gfx::Range());
+  rwhva()->SelectionChanged(std::u16string(), 0, gfx::Range());
 
   if (GetSelectionController())
     return GetSelectionController()->ClearSelectionViaEWebView();
-#endif
+
   return EINA_FALSE;
 }
 
index d2cfb3c8efe3318b1cb25fcd7ea1bfb4013d0c6e..bacbcac5e8bf882372842cb42c14bb8d1b885f9d 100644 (file)
@@ -92,6 +92,10 @@ blink::WebKeyboardEvent MakeWebKeyboardEventFromUiEvent(const KeyEvent& event) {
   webkit_event.unmodified_text[0] = event.GetUnmodifiedText();
   webkit_event.text[0] = event.GetText();
 
+#if BUILDFLAG(IS_EFL)
+  webkit_event.is_system_key = event.is_system_key;
+#endif
+
   return webkit_event;
 }
 
index d242c5a0e2bc7c3cee02567d8c4fb78b19f0ca7b..faf8d8e7585b0ca1c214581fccd08da2b58457d8 100644 (file)
@@ -821,6 +821,9 @@ KeyEvent::KeyEvent(const PlatformEvent& native_event, int event_flags)
       scan_code_(ScanCodeFromNative(native_event)),
 #endif  // defined(USE_OZONE)
       code_(CodeFromNative(native_event)),
+#if BUILDFLAG(IS_EFL)
+      is_system_key(IsSystemKeyFromNative(native_event)),
+#endif
       is_char_(IsCharFromNative(native_event)) {
 #if defined(USE_OZONE)
   DCHECK(native_event->IsKeyEvent());
@@ -942,7 +945,12 @@ void KeyEvent::ApplyLayout() const {
     VLOG(2) << "DomCode::NONE keycode=" << key_code_;
     code = UsLayoutKeyboardCodeToDomCode(key_code_);
     if (code == DomCode::NONE) {
+#if !BUILDFLAG(IS_TIZEN_TV)
+      // Setting DomKey::UNIDENTIFIED to |key_| will result in 'Unidentified'
+      // value for |event.key| in JS layer. Instead, it is better to display
+      // empty value '', as expected by VD.
       key_ = DomKey::UNIDENTIFIED;
+#endif
       return;
     }
   }
index ad05117b4b3e04c831ec446a8f08ed6c247ee39a..0fa0079a7af5a59442350086654d3de38ad6e3ba 100644 (file)
@@ -116,6 +116,11 @@ KeyboardCodeFromNative(const PlatformEvent& native_event);
 // keyboard) from a native event.
 EVENTS_EXPORT DomCode CodeFromNative(const PlatformEvent& native_event);
 
+#if BUILDFLAG(IS_EFL)
+// Returns the |is_system_key| value from a native event.
+EVENTS_EXPORT bool IsSystemKeyFromNative(const PlatformEvent& native_event);
+#endif
+
 // Returns true if the keyboard event is a character event rather than
 // a keystroke event.
 EVENTS_EXPORT bool IsCharFromNative(const PlatformEvent& native_event);
index 531e707fb14bdba1f6a4a67b41c74d3b01c65e7e..be759cb523909188da6c6a6ae9c9b56f24a7b227 100644 (file)
@@ -83,6 +83,14 @@ DomCode CodeFromNative(const PlatformEvent& native_event) {
   return event->code();
 }
 
+#if BUILDFLAG(IS_EFL)
+bool IsSystemKeyFromNative(const PlatformEvent& native_event) {
+  const ui::KeyEvent* event = static_cast<const ui::KeyEvent*>(native_event);
+  DCHECK(event->IsKeyEvent());
+  return event->is_system_key;
+}
+#endif
+
 bool IsCharFromNative(const PlatformEvent& native_event) {
   const ui::KeyEvent* event = static_cast<const ui::KeyEvent*>(native_event);
   DCHECK(event->IsKeyEvent());