#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/input_method/input_method_engine.h"
#include "chrome/browser/extensions/extension_function_registry.h"
-#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/input_ime.h"
#include "chrome/common/extensions/api/input_ime/input_components_handler.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_source.h"
#include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_system.h"
namespace input_ime = extensions::api::input_ime;
namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled;
if (profile_ == NULL || extension_id_.empty())
return;
- std::string request_id =
- extensions::InputImeEventRouter::GetInstance()->AddRequest(engine_id,
- key_data);
+ extensions::InputImeEventRouter* ime_event_router =
+ extensions::InputImeEventRouter::GetInstance();
+
+ const std::string request_id =
+ ime_event_router->AddRequest(engine_id, key_data);
+
+ // If there is no listener for the event, no need to dispatch the event to
+ // extension. Instead, releases the key event for default system behavior.
+ if (!HasKeyEventListener()) {
+ ime_event_router->OnKeyEventHandled(extension_id_, request_id, false);
+ return;
+ }
input_ime::KeyboardEvent key_data_value;
key_data_value.type = input_ime::KeyboardEvent::ParseType(event.type);
key_data_value.request_id = request_id;
+ if (!event.extension_id.empty())
+ key_data_value.extension_id.reset(new std::string(event.extension_id));
key_data_value.key = event.key;
key_data_value.code = event.code;
key_data_value.alt_key.reset(new bool(event.alt_key));
}
private:
+ bool HasKeyEventListener() const {
+ return extensions::ExtensionSystem::Get(profile_)
+ ->event_router()
+ ->ExtensionHasEventListener(extension_id_,
+ input_ime::OnKeyEvent::kEventName);
+ }
+
Profile* profile_;
std::string extension_id_;
std::string engine_id_;