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

Unified Diff: chrome/browser/extensions/extension_input_ui_api.cc

Issue 6869024: Add IME UI related extension API. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Rebase Created 9 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/extension_input_ui_api.h ('k') | chrome/browser/extensions/extension_service.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_input_ui_api.cc
diff --git a/chrome/browser/extensions/extension_input_ui_api.cc b/chrome/browser/extensions/extension_input_ui_api.cc
new file mode 100644
index 0000000000000000000000000000000000000000..11f7c14a04a40735be2e6f24b3d5e60b45de5cb7
--- /dev/null
+++ b/chrome/browser/extensions/extension_input_ui_api.cc
@@ -0,0 +1,351 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_input_ui_api.h"
+
+#include <string>
+
+#include "base/json/json_writer.h"
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_event_router.h"
+#include "chrome/browser/profiles/profile.h"
+#include "third_party/cros/chromeos_cros_api.h"
+#include "third_party/cros/chromeos_input_method_ui.h"
+
+namespace events {
+
+const char kOnUpdateAuxiliaryText[] =
+ "experimental.inputUI.onUpdateAuxiliaryText";
+const char kOnUpdateLookupTable[] = "experimental.inputUI.onUpdateLookupTable";
+const char kOnSetCursorLocation[] = "experimental.inputUI.onSetCursorLocation";
+
+} // namespace events
+
+class InputUiController {
+ public:
+ explicit InputUiController(ExtensionInputUiEventRouter* router);
+ ~InputUiController();
+
+ void CandidateClicked(int index, int button, int flags);
+ void CursorUp();
+ void CursorDown();
+ void PageUp();
+ void PageDown();
+
+ private:
+ // The function is called when |HideAuxiliaryText| signal is received in
+ // libcros. |ui_controller| is a void pointer to this object.
+ static void OnHideAuxiliaryText(void* ui_controller);
+
+ // The function is called when |HideLookupTable| signal is received in
+ // libcros. |ui_controller| is a void pointer to this object.
+ static void OnHideLookupTable(void* ui_controller);
+
+ // The function is called when |SetCursorLocation| signal is received
+ // in libcros. |ui_controller| is a void pointer to this object.
+ static void OnSetCursorLocation(void* ui_controller,
+ int x,
+ int y,
+ int width,
+ int height);
+
+ // The function is called when |UpdateAuxiliaryText| signal is received
+ // in libcros. |ui_controller| is a void pointer to this object.
+ static void OnUpdateAuxiliaryText(void* ui_controller,
+ const std::string& utf8_text,
+ bool visible);
+
+ // The function is called when |UpdateLookupTable| signal is received
+ // in libcros. |ui_controller| is a void pointer to this object.
+ static void OnUpdateLookupTable(void* ui_controller,
+ const chromeos::InputMethodLookupTable& lookup_table);
+
+ // This function is called by libcros when ibus connects or disconnects.
+ // |ui_controller| is a void pointer to this object.
+ static void OnConnectionChange(void* ui_controller, bool connected);
+
+ ExtensionInputUiEventRouter* router_;
+ chromeos::InputMethodUiStatusConnection* ui_status_connection_;
+
+ DISALLOW_COPY_AND_ASSIGN(InputUiController);
+};
+
+InputUiController::InputUiController(
+ ExtensionInputUiEventRouter* router) :
+ router_(router),
+ ui_status_connection_(NULL) {
+ std::string error;
+ chromeos::LoadLibcros(NULL, error);
+
+ chromeos::InputMethodUiStatusMonitorFunctions functions;
+ functions.hide_auxiliary_text =
+ &InputUiController::OnHideAuxiliaryText;
+ functions.hide_lookup_table =
+ &InputUiController::OnHideLookupTable;
+ functions.set_cursor_location =
+ &InputUiController::OnSetCursorLocation;
+ functions.update_auxiliary_text =
+ &InputUiController::OnUpdateAuxiliaryText;
+ functions.update_lookup_table =
+ &InputUiController::OnUpdateLookupTable;
+ ui_status_connection_ = chromeos::MonitorInputMethodUiStatus(functions, this);
+
+ if (!ui_status_connection_)
+ LOG(ERROR) << "chromeos::MonitorInputMethodUiStatus() failed!";
+}
+
+InputUiController::~InputUiController() {
+ chromeos::DisconnectInputMethodUiStatus(ui_status_connection_);
+}
+
+void InputUiController::CandidateClicked(
+ int index, int button, int flags) {
+ chromeos::NotifyCandidateClicked(ui_status_connection_, index, button, flags);
+}
+
+void InputUiController::CursorUp() {
+ chromeos::NotifyCursorUp(ui_status_connection_);
+}
+
+void InputUiController::CursorDown() {
+ chromeos::NotifyCursorDown(ui_status_connection_);
+}
+
+void InputUiController::PageUp() {
+ chromeos::NotifyPageUp(ui_status_connection_);
+}
+
+void InputUiController::PageDown() {
+ chromeos::NotifyPageDown(ui_status_connection_);
+}
+
+void InputUiController::OnHideAuxiliaryText(
+ void* ui_controller) {
+ InputUiController *self = static_cast<InputUiController*>(ui_controller);
+ self->router_->OnHideAuxiliaryText();
+}
+
+void InputUiController::OnHideLookupTable(
+ void* ui_controller) {
+ InputUiController *self = static_cast<InputUiController*>(ui_controller);
+ self->router_->OnHideLookupTable();
+}
+
+void InputUiController::OnSetCursorLocation(
+ void* ui_controller,
+ int x, int y, int width, int height) {
+ InputUiController *self = static_cast<InputUiController*>(ui_controller);
+ self->router_->OnSetCursorLocation(x, y, width, height);
+}
+
+void InputUiController::OnUpdateAuxiliaryText(
+ void* ui_controller,
+ const std::string& utf8_text,
+ bool visible) {
+ InputUiController *self = static_cast<InputUiController*>(ui_controller);
+ if (!visible) {
+ self->router_->OnHideAuxiliaryText();
+ } else {
+ self->router_->OnUpdateAuxiliaryText(utf8_text);
+ }
+}
+
+void InputUiController::OnUpdateLookupTable(
+ void* ui_controller,
+ const chromeos::InputMethodLookupTable& lookup_table) {
+ InputUiController *self = static_cast<InputUiController*>(ui_controller);
+ self->router_->OnUpdateLookupTable(lookup_table);
+}
+
+ExtensionInputUiEventRouter*
+ExtensionInputUiEventRouter::GetInstance() {
+ return Singleton<ExtensionInputUiEventRouter>::get();
+}
+
+ExtensionInputUiEventRouter::ExtensionInputUiEventRouter()
+ : profile_(NULL),
+ ui_controller_(NULL) {
+}
+
+ExtensionInputUiEventRouter::~ExtensionInputUiEventRouter() {
+}
+
+void ExtensionInputUiEventRouter::Init() {
+ if (ui_controller_.get() == NULL) {
+ ui_controller_.reset(new InputUiController(this));
+ }
+}
+
+void ExtensionInputUiEventRouter::Register(
+ Profile* profile, const std::string& extension_id) {
+ profile_ = profile;
+ extension_id_ = extension_id;
+}
+
+void ExtensionInputUiEventRouter::CandidateClicked(Profile* profile,
+ const std::string& extension_id, int index, int button) {
+ if (profile_ != profile || extension_id_ != extension_id) {
+ DLOG(WARNING) << "called from unregistered extension";
+ }
+ ui_controller_->CandidateClicked(index, button, 0);
+}
+
+void ExtensionInputUiEventRouter::CursorUp(Profile* profile,
+ const std::string& extension_id) {
+ if (profile_ != profile || extension_id_ != extension_id) {
+ DLOG(WARNING) << "called from unregistered extension";
+ }
+ ui_controller_->CursorUp();
+}
+
+void ExtensionInputUiEventRouter::CursorDown(Profile* profile,
+ const std::string& extension_id) {
+ if (profile_ != profile || extension_id_ != extension_id) {
+ DLOG(WARNING) << "called from unregistered extension";
+ }
+ ui_controller_->CursorDown();
+}
+
+void ExtensionInputUiEventRouter::PageUp(Profile* profile,
+ const std::string& extension_id) {
+ if (profile_ != profile || extension_id_ != extension_id) {
+ DLOG(WARNING) << "called from unregistered extension";
+ }
+ ui_controller_->PageUp();
+}
+
+void ExtensionInputUiEventRouter::PageDown(Profile* profile,
+ const std::string& extension_id) {
+ if (profile_ != profile || extension_id_ != extension_id) {
+ DLOG(WARNING) << "called from unregistered extension";
+ }
+ ui_controller_->PageDown();
+}
+
+void ExtensionInputUiEventRouter::OnHideAuxiliaryText() {
+ OnUpdateAuxiliaryText("");
+}
+
+void ExtensionInputUiEventRouter::OnHideLookupTable() {
+ if (profile_ == NULL || extension_id_.empty())
+ return;
+
+ DictionaryValue* dict = new DictionaryValue();
+ dict->SetBoolean("visible", false);
+
+ ListValue *candidates = new ListValue();
+ dict->Set("candidates", candidates);
+
+ ListValue args;
+ args.Append(dict);
+
+ std::string json_args;
+ base::JSONWriter::Write(&args, false, &json_args);
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ extension_id_, events::kOnUpdateLookupTable, json_args, profile_, GURL());
+}
+
+void ExtensionInputUiEventRouter::OnSetCursorLocation(
+ int x, int y, int width, int height) {
+
+ if (profile_ == NULL || extension_id_.empty())
+ return;
+
+ ListValue args;
+ args.Append(Value::CreateIntegerValue(x));
+ args.Append(Value::CreateIntegerValue(y));
+ args.Append(Value::CreateIntegerValue(width));
+ args.Append(Value::CreateIntegerValue(height));
+
+ std::string json_args;
+ base::JSONWriter::Write(&args, false, &json_args);
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ extension_id_, events::kOnSetCursorLocation, json_args, profile_, GURL());
+}
+
+void ExtensionInputUiEventRouter::OnUpdateAuxiliaryText(
+ const std::string& utf8_text) {
+ if (profile_ == NULL || extension_id_.empty())
+ return;
+
+ ListValue args;
+ args.Append(Value::CreateStringValue(utf8_text));
+
+ std::string json_args;
+ base::JSONWriter::Write(&args, false, &json_args);
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ extension_id_, events::kOnUpdateAuxiliaryText, json_args, profile_, GURL());
+}
+
+void ExtensionInputUiEventRouter::OnUpdateLookupTable(
+ const chromeos::InputMethodLookupTable& lookup_table) {
+ if (profile_ == NULL || extension_id_.empty())
+ return;
+
+ DictionaryValue* dict = new DictionaryValue();
+ dict->SetBoolean("visible", lookup_table.visible);
+
+ if (lookup_table.visible) {
+ }
+
+ ListValue *candidates = new ListValue();
+ for (size_t i = 0; i < lookup_table.candidates.size(); i++) {
+ candidates->Append(Value::CreateStringValue(lookup_table.candidates[i]));
+ }
+
+ dict->Set("candidates", candidates);
+
+ ListValue args;
+ args.Append(dict);
+
+ std::string json_args;
+ base::JSONWriter::Write(&args, false, &json_args);
+ profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ extension_id_, events::kOnUpdateLookupTable, json_args, profile_, GURL());
+}
+
+bool RegisterInputUiFunction::RunImpl() {
+ ExtensionInputUiEventRouter::GetInstance()->Register(
+ profile(), extension_id());
+ return true;
+}
+
+bool CandidateClickedInputUiFunction::RunImpl() {
+ int index = 0;
+ int button = 0;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &index));
+ EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &button));
+
+ ExtensionInputUiEventRouter::GetInstance()->CandidateClicked(
+ profile(), extension_id(), index, button);
+
+ return true;
+}
+
+bool CursorUpInputUiFunction::RunImpl() {
+ ExtensionInputUiEventRouter::GetInstance()->CursorUp(
+ profile(), extension_id());
+ return true;
+}
+
+bool CursorDownInputUiFunction::RunImpl() {
+ ExtensionInputUiEventRouter::GetInstance()->CursorDown(
+ profile(), extension_id());
+ return true;
+}
+
+bool PageUpInputUiFunction::RunImpl() {
+ ExtensionInputUiEventRouter::GetInstance()->PageUp(
+ profile(), extension_id());
+ return true;
+}
+
+bool PageDownInputUiFunction::RunImpl() {
+ ExtensionInputUiEventRouter::GetInstance()->PageDown(
+ profile(), extension_id());
+ return true;
+}
+
« no previous file with comments | « chrome/browser/extensions/extension_input_ui_api.h ('k') | chrome/browser/extensions/extension_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698