Fix incorrect key code in JS key press event
authorPiotr Grad <p.grad@samsung.com>
Fri, 20 Feb 2015 08:47:57 +0000 (09:47 +0100)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
Platform was sending ascii code instead of utf8 code.
Used cached value for utf8 code passed by platform in
ime preedit and commit callbacks.

Bug: http://168.219.209.56/jira/browse/TNEF-235
Reviewed by: Jaesik Chang, Marcin Kolibabka, Marcin Krakowiak

Change-Id: I812c4fefefe7e45ab5b762940e751ee8eec5fbc7
Signed-off-by: Piotr Grad <p.grad@samsung.com>
Signed-off-by: Tomasz Weglarski <t.weglarski@samsung.com>
tizen_src/impl/browser/renderer_host/im_context_efl.cc
tizen_src/impl/browser/renderer_host/im_context_efl.h
tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.cc
tizen_src/impl/browser/renderer_host/web_event_factory_efl.cc
tizen_src/impl/browser/renderer_host/web_event_factory_efl.h

index 9bc48b3..8c3651a 100644 (file)
@@ -100,12 +100,19 @@ IMContextEfl::~IMContextEfl() {
   ecore_imf_context_del(context_);
 }
 
-void IMContextEfl::HandleKeyDownEvent(const Evas_Event_Key_Down* event, bool* wasFiltered) {
+void IMContextEfl::HandleKeyDownEvent(const Evas_Event_Key_Down* event,
+    bool* wasFiltered, std::string* utf8_key) {
 #if USE_IM_COMPOSITING
   Ecore_IMF_Event im_event;
   is_handling_keydown_ = true;
+  utf8_key_ = event->keyname;
   ecore_imf_evas_event_key_down_wrap(const_cast<Evas_Event_Key_Down*>(event), &im_event.key_down);
   *wasFiltered = ecore_imf_context_filter_event(context_, ECORE_IMF_EVENT_KEY_DOWN, &im_event);
+  // In November 2003, UTF-8 was restricted by RFC 3629 to end at U+10FFFF,
+  // in order to match the constraints of the UTF-16 character encoding.
+  // This removed all 5- and 6-byte sequences, and about half of the 4-byte
+  // sequences. So that we are copying 4 bytes to get first char data.
+  *utf8_key = utf8_key_.substr(0, 4);
   is_handling_keydown_ = false;
 #endif
 }
@@ -351,6 +358,7 @@ void IMContextEfl::OnCommit(void* event_info) {
 
   char* text = static_cast<char*>(event_info);
 
+  utf8_key_ = text;
   base::string16 text16 = base::UTF8ToUTF16(text);
   // Only add commit to queue, till we dont know if key event
   // should be handled. It can be default prevented for exactly.
@@ -401,6 +409,7 @@ void IMContextEfl::OnPreeditChanged(void* data, Ecore_IMF_Context* context, void
   if (!buffer)
       return;
 
+  utf8_key_ = buffer;
   // Add empty commit to stop processing commits.
   commit_queue_.push(base::string16());
 
index 6434eac..2e40234 100644 (file)
@@ -30,7 +30,8 @@ class IMContextEfl {
 
   ~IMContextEfl();
 
-  void HandleKeyDownEvent(const Evas_Event_Key_Down* event, bool* wasFiltered);
+  void HandleKeyDownEvent(const Evas_Event_Key_Down* event, bool* wasFiltered,
+      std::string* utf8_key);
   void HandleKeyUpEvent(const Evas_Event_Key_Up* event, bool* wasFiltered);
 
   void UpdateInputMethodType(ui::TextInputType, ui::TextInputMode,
@@ -117,6 +118,7 @@ class IMContextEfl {
 
   bool is_handling_keydown_;
   bool is_ime_ctx_reset_;
+  std::string utf8_key_;
 };
 
 } // namespace content
index 10acbd4..95ff7ec 100644 (file)
@@ -698,9 +698,13 @@ void RenderWidgetHostViewEfl::FocusedNodeChanged(bool is_editable_node) {
       controller->SetCaretSelectionStatus(false);
       controller->HideHandleAndContextMenu();
     }
-    if (im_context_ && im_context_->IsShow() &&
-      ClipboardHelperEfl::GetInstance()->IsClipboardWindowOpened()) {
-      ClipboardHelperEfl::GetInstance()->CloseClipboardWindow();
+    if (im_context_) {
+      if (im_context_->IsShow() &&
+          ClipboardHelperEfl::GetInstance()->IsClipboardWindowOpened()) {
+        ClipboardHelperEfl::GetInstance()->CloseClipboardWindow();
+      }
+      im_context_->ResetIMFContext();
+      im_context_->ClearQueues();
     }
   }
 }
@@ -1154,8 +1158,6 @@ void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Mouse_Wheel* even
 }
 
 void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Key_Down* event) {
-  bool wasFiltered = false;
-
   if (WebEventFactoryEfl::isHardwareBackKey(event) && disambiguation_popup_) {
     disambiguation_popup_->Dismiss();
   }
@@ -1189,8 +1191,13 @@ void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Key_Down* event)
     if (!strcmp(event->key, "Return")) {
       im_context_->CancelComposition();
     }
-    im_context_->HandleKeyDownEvent(event, &wasFiltered);
-    NativeWebKeyboardEvent n_event = WebEventFactoryEfl::toWebKeyboardEvent(evas_, event);
+
+    bool wasFiltered = false;
+    std::string utf8_key = event->string ? event->string : "";
+    im_context_->HandleKeyDownEvent(event, &wasFiltered, &utf8_key);
+
+    NativeWebKeyboardEvent n_event = WebEventFactoryEfl::toWebKeyboardEvent(
+        evas_, event, event->string ? utf8_key.c_str() : 0);
 
     // When upper case letter is entered there are two events
     // Shift + letter key
@@ -1203,36 +1210,40 @@ void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Key_Down* event)
 
     // Do not forward keyevent now if there is fake key event
     // handling at the moment to preserve orders of events as in Webkit
-    if (im_context_->GetPreeditQueue().empty() ||
-        keyupev_queue_.empty()) {
+    if (im_context_->GetPreeditQueue().empty() || keyupev_queue_.empty()) {
       host_->ForwardKeyboardEvent(n_event);
     } else {
       NativeWebKeyboardEvent *n_event_ptr = new NativeWebKeyboardEvent();
 
       n_event_ptr->timeStampSeconds = n_event.timeStampSeconds;
-      n_event_ptr->modifiers = n_event.modifiers;
       n_event_ptr->type = n_event.type;
-      n_event_ptr->nativeKeyCode = n_event.nativeKeyCode;
+      n_event_ptr->modifiers = n_event.modifiers;
       n_event_ptr->windowsKeyCode = n_event.windowsKeyCode;
+      n_event_ptr->nativeKeyCode = n_event.nativeKeyCode;
       n_event_ptr->isSystemKey = n_event.isSystemKey;
-      n_event_ptr->unmodifiedText[0] = n_event.unmodifiedText[0];
-      n_event_ptr->text[0] = n_event.text[0];
+      memcpy(n_event_ptr->text, n_event.text,
+          sizeof(n_event_ptr->text));
+      memcpy(n_event_ptr->unmodifiedText, n_event.unmodifiedText,
+          sizeof(n_event_ptr->unmodifiedText));
+      memcpy(n_event_ptr->keyIdentifier, n_event.keyIdentifier,
+          sizeof(n_event_ptr->keyIdentifier));
 
       keydownev_queue_.push(n_event_ptr);
     }
 
     keyupev_queue_.push(n_event.windowsKeyCode);
-  } else
+  } else {
     host_->ForwardKeyboardEvent(WebEventFactoryEfl::toWebKeyboardEvent(evas_, event));
+  }
 }
 
 void RenderWidgetHostViewEfl::HandleEvasEvent(const Evas_Event_Key_Up* event) {
-  bool wasFiltered = false;
-  if (im_context_)
+  if (im_context_) {
+    bool wasFiltered = false;
     im_context_->HandleKeyUpEvent(event, &wasFiltered);
-
-  if (!im_context_)
+  } else {
     host_->ForwardKeyboardEvent(WebEventFactoryEfl::toWebKeyboardEvent(evas_, event));
+  }
 }
 
 #if defined(OS_TIZEN)
@@ -1730,9 +1741,11 @@ void RenderWidgetHostViewEfl::HandlePreeditQueue(bool processed) {
     return;
 
   if (!im_context_->GetPreeditQueue().empty()) {
-    if (!processed)
+    if (!processed) {
       SetComposition(im_context_->GetPreeditQueue().front());
-
+    } else {
+      im_context_->ResetIMFContext();
+    }
     im_context_->PreeditQueuePop();
   }
 }
index 76d23ab..e83b228 100644 (file)
@@ -207,16 +207,6 @@ static int NativeKeyCodeFromEflKey(const char* key) {
   return XKeysymToKeycode((Display*)ecore_x_display_get(), XStringToKeysym(key));
 }
 
-static int CharacterFromEflString(const char* string) {
-  if (string) {
-    base::string16 result;
-    base::UTF8ToUTF16(string, strlen(string), &result);
-    return result.length() == 1 ? result[0] : 0;
-  }
-
-  return 0;
-}
-
 // From
 // third_party/blink/Source/blink/chromium/src/gtk/WebInputEventFactory.cpp:
 static blink::WebUChar GetControlCharacter(int windows_key_code, bool shift) {
@@ -389,8 +379,9 @@ blink::WebMouseWheelEvent WebEventFactoryEfl::toWebMouseEvent(Evas* evas, Evas_O
   return webKitEvent;
 }
 
-static content::NativeWebKeyboardEvent WebKeyEvent(unsigned int timestamp, const Evas_Modifier* modifiers, const char* key,
-                                                   const char* string, bool pressed) {
+static content::NativeWebKeyboardEvent WebKeyEvent(
+    unsigned int timestamp, const Evas_Modifier* modifiers, const char* key,
+    const char* string, bool pressed) {
   content::NativeWebKeyboardEvent webKitEvent;
   webKitEvent.timeStampSeconds =  (double)timestamp / 1000;
   webKitEvent.modifiers = EvasToWebModifiers(modifiers);
@@ -399,10 +390,24 @@ static content::NativeWebKeyboardEvent WebKeyEvent(unsigned int timestamp, const
   webKitEvent.nativeKeyCode = NativeKeyCodeFromEflKey(key);
   webKitEvent.windowsKeyCode = WindowsKeyCodeFromEflKey(key);
 
-  if (webKitEvent.windowsKeyCode == ui::VKEY_RETURN)
-      webKitEvent.unmodifiedText[0] = '\r';
-  else
-    webKitEvent.unmodifiedText[0] = CharacterFromEflString(string);
+  if (webKitEvent.windowsKeyCode == ui::VKEY_RETURN) {
+    memset(webKitEvent.unmodifiedText, 0,
+        sizeof(webKitEvent.unmodifiedText));
+    webKitEvent.unmodifiedText[0] = '\r';
+  } else {
+    if (string) {
+      base::string16 utf16str = base::UTF8ToUTF16(string);
+      size_t size = base::c16len(utf16str.data());
+      base::c16memcpy(webKitEvent.unmodifiedText, utf16str.data(),
+          std::min(size, NativeWebKeyboardEvent::textLengthCap));
+      if (size > NativeWebKeyboardEvent::textLengthCap) {
+        LOG(WARNING) << "Truncated value was copied into unmodifiedText field.";
+      }
+    } else {
+      memset(webKitEvent.unmodifiedText, 0,
+          sizeof(webKitEvent.unmodifiedText));
+    }
+  }
 
   if (webKitEvent.modifiers & blink::WebInputEvent::ControlKey) {
     webKitEvent.text[0] =
@@ -410,7 +415,8 @@ static content::NativeWebKeyboardEvent WebKeyEvent(unsigned int timestamp, const
             webKitEvent.windowsKeyCode,
             webKitEvent.modifiers & blink::WebInputEvent::ShiftKey);
   } else {
-    webKitEvent.text[0] = webKitEvent.unmodifiedText[0];
+    memcpy(webKitEvent.text, webKitEvent.unmodifiedText,
+        sizeof(webKitEvent.text));
   }
 
   webKitEvent.setKeyIdentifierFromWindowsKeyCode();
@@ -418,16 +424,19 @@ static content::NativeWebKeyboardEvent WebKeyEvent(unsigned int timestamp, const
   return webKitEvent;
 }
 
-content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*, const Evas_Event_Key_Down* ev) {
-  return WebKeyEvent(ev->timestamp, ev->modifiers, ev->key, ev->string, true);
+content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*,
+    const Evas_Event_Key_Down* ev, const char* utf8) {
+  return WebKeyEvent(ev->timestamp,
+      ev->modifiers, ev->key, utf8 ? utf8 : ev->string, true);
 }
 
-content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*, const Evas_Event_Key_Up* ev) {
+content::NativeWebKeyboardEvent WebEventFactoryEfl::toWebKeyboardEvent(Evas*,
+    const Evas_Event_Key_Up* ev) {
   return WebKeyEvent(ev->timestamp, ev->modifiers, ev->key, ev->string, false);
 }
 
 static ui::EventType EvasTouchEventTypeToUI(Evas_Touch_Point_State evas_touch) {
-  switch(evas_touch) {
+  switch (evas_touch) {
     case EVAS_TOUCH_POINT_DOWN:
       return ui::ET_TOUCH_PRESSED;
     case EVAS_TOUCH_POINT_MOVE:
index 2d12469..5a92a14 100644 (file)
@@ -20,14 +20,21 @@ namespace content {
 
 class WebEventFactoryEfl {
  public:
-  static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*, const Evas_Event_Mouse_Down*, float scale_factor);
-  static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,  const Evas_Event_Mouse_Up*, float scale_factor);
-  static blink::WebMouseEvent toWebMouseEvent(Evas*,  Evas_Object*, const Evas_Event_Mouse_Move*, float scale_factor);
-  static blink::WebMouseWheelEvent toWebMouseEvent(Evas*,  Evas_Object*, const Evas_Event_Mouse_Wheel*, float scale_factor);
-  static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*, const Evas_Event_Key_Down*);
-  static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*, const Evas_Event_Key_Up*);
-
-  static ui::TouchEvent toUITouchEvent(const tizen_webview::Touch_Point*, Evas_Object* evas_object, float scale_factor);
+  static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,
+      const Evas_Event_Mouse_Down*, float scale_factor);
+  static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,
+      const Evas_Event_Mouse_Up*, float scale_factor);
+  static blink::WebMouseEvent toWebMouseEvent(Evas*, Evas_Object*,
+      const Evas_Event_Mouse_Move*, float scale_factor);
+  static blink::WebMouseWheelEvent toWebMouseEvent(Evas*, Evas_Object*,
+      const Evas_Event_Mouse_Wheel*, float scale_factor);
+  static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*,
+      const Evas_Event_Key_Down*, const char* utf8 = NULL);
+  static content::NativeWebKeyboardEvent toWebKeyboardEvent(Evas*,
+      const Evas_Event_Key_Up*);
+
+  static ui::TouchEvent toUITouchEvent(const tizen_webview::Touch_Point*,
+      Evas_Object* evas_object, float scale_factor);
   static bool isHardwareBackKey(const Evas_Event_Key_Down* event);
 };