Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / renderer / tizen / xwalk_render_view_ext_tizen.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "xwalk/runtime/renderer/tizen/xwalk_render_view_ext_tizen.h"
6
7 #include <string>
8
9 #include "base/bind.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "content/public/renderer/render_frame.h"
12 #include "content/public/renderer/render_view.h"
13 #include "third_party/WebKit/public/web/WebDocument.h"
14 #include "third_party/WebKit/public/web/WebLocalFrame.h"
15 #include "third_party/WebKit/public/web/WebScriptSource.h"
16 #include "third_party/WebKit/public/web/WebView.h"
17 #include "ui/events/keycodes/keyboard_codes_posix.h"
18 #include "xwalk/runtime/common/xwalk_common_messages.h"
19
20 namespace {
21 std::string GenerateEventJs(const std::string& name) {
22   std::string result;
23   std::string defineJs =
24     "var event = new Event('tizenhwkey');"
25     "function defineProps(val) {"
26     "  Object.defineProperty(event, 'keyName', {"
27     "    enumerable: false,"
28     "    configurable: false,"
29     "    writable: false,"
30     "    value: val"
31     "  });"
32     "}";
33   std::string nameJs = "defineProps('" + name + "');";
34   std::string dispatchJs = "document.dispatchEvent(event);";
35   result += defineJs;
36   result += nameJs;
37   result += dispatchJs;
38
39   return result;
40 }
41 }  // namespace
42
43 namespace xwalk {
44
45 XWalkRenderViewExtTizen::XWalkRenderViewExtTizen(
46     content::RenderView* render_view)
47     : content::RenderViewObserver(render_view) {
48   render_view_ = render_view;
49   DCHECK(render_view_);
50 }
51
52 XWalkRenderViewExtTizen::~XWalkRenderViewExtTizen() {
53 }
54
55 // static
56 void XWalkRenderViewExtTizen::RenderViewCreated(
57     content::RenderView* render_view) {
58   new XWalkRenderViewExtTizen(render_view);  // |render_view| takes ownership.
59 }
60
61 bool XWalkRenderViewExtTizen::OnMessageReceived(const IPC::Message& message) {
62   bool handled = true;
63   IPC_BEGIN_MESSAGE_MAP(XWalkRenderViewExtTizen, message)
64     IPC_MESSAGE_HANDLER(ViewMsg_HWKeyPressed,
65                         OnHWKeyPressed)
66     IPC_MESSAGE_UNHANDLED(handled = false)
67   IPC_END_MESSAGE_MAP()
68   return handled;
69 }
70
71 void XWalkRenderViewExtTizen::OnHWKeyPressed(int keycode) {
72   std::string event_name;
73   if (keycode == ui::VKEY_BACK) {
74     event_name = "back";
75   } else if (keycode == ui::VKEY_HOME) {
76     event_name = "menu";
77   } else {
78     LOG(INFO) << "Unknown input key code, only support 'back' & 'menu'"
79                   "at present.";
80     return;
81   }
82
83   content::RenderFrame* render_frame = render_view_->GetMainRenderFrame();
84   blink::WebLocalFrame* web_frame = render_frame->GetWebFrame();
85   blink::WebScriptSource source =
86       blink::WebScriptSource(base::ASCIIToUTF16(GenerateEventJs(event_name)));
87   web_frame->executeScript(source);
88 }
89
90 }  // namespace xwalk