blob: 5b239c6ad9f125ae0a86be4a261efc6642436091 [file] [log] [blame]
// Copyright (c) 2012 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.
// Custom binding for the input ime API. Only injected into the
// v8 contexts for extensions which have permission for the API.
var appWindowNatives = requireNative('app_window_natives');
var keyEventHandled;
bindingUtil.registerEventArgumentMassager('input.ime.onKeyEvent',
function(args, dispatch) {
var keyData = args[1];
var result = undefined;
try {
// dispatch() is weird - it returns an object {results: array<results>} iff
// there is at least one result value that !== undefined. Since onKeyEvent
// has a maximum of one listener, we know that any result we find is the one
// we're interested in.
var dispatchResult = dispatch(args);
if (dispatchResult && dispatchResult.results)
result = dispatchResult.results[0];
} catch (e) {
result = false;
console.error('Error in event handler for onKeyEvent: ' + e.stack);
}
if (result !== undefined) {
keyEventHandled(keyData.requestId, !!result);
}
});
apiBridge.registerCustomHook(function(api) {
keyEventHandled = api.compiledApi.keyEventHandled;
// TODO(shuchen): override onKeyEvent.addListener only for compatibility.
// This should be removed after the IME extension doesn't rely on the
// additional "async" parameter.
var originalAddListener = api.compiledApi.onKeyEvent.addListener;
api.compiledApi.onKeyEvent.addListener = function(cb, opt_extraInfo) {
$Function.call(originalAddListener, this, cb);
};
api.apiFunctions.setCustomCallback('createWindow',
function(name, request, callback, windowParams) {
if (!callback) {
return;
}
var view;
if (windowParams && windowParams.frameId) {
view = appWindowNatives.GetFrame(
windowParams.frameId, false /* notifyBrowser */);
view.id = windowParams.frameId;
}
callback(view);
});
});