diff options
Diffstat (limited to 'chromium/chrome/browser/resources/chromeos/chromevox/braille/liblouis.js')
-rw-r--r-- | chromium/chrome/browser/resources/chromeos/chromevox/braille/liblouis.js | 334 |
1 files changed, 0 insertions, 334 deletions
diff --git a/chromium/chrome/browser/resources/chromeos/chromevox/braille/liblouis.js b/chromium/chrome/browser/resources/chromeos/chromevox/braille/liblouis.js deleted file mode 100644 index 0b8a2ee0006..00000000000 --- a/chromium/chrome/browser/resources/chromeos/chromevox/braille/liblouis.js +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright 2014 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. - -/** - * @fileoverview JavaScript shim for the liblouis Native Client wrapper. - */ - -goog.provide('cvox.LibLouis'); - - -/** - * Encapsulates a liblouis Native Client instance in the page. - * @constructor - * @param {string} nmfPath Path to .nmf file for the module. - * @param {string=} opt_tablesDir Path to tables directory. - */ -cvox.LibLouis = function(nmfPath, opt_tablesDir) { - /** - * Path to .nmf file for the module. - * @private {string} - */ - this.nmfPath_ = nmfPath; - - /** - * Path to translation tables. - * @private {?string} - */ - this.tablesDir_ = goog.isDef(opt_tablesDir) ? opt_tablesDir : null; - - /** - * Native Client <embed> element. - * {@code null} when no <embed> is attached to the DOM. - * @private {HTMLEmbedElement} - */ - this.embedElement_ = null; - - /** - * Pending RPC callbacks. Maps from message IDs to callbacks. - * @private {!Object<function(!Object)>} - */ - this.pendingRpcCallbacks_ = {}; - - /** - * Next message ID to be used. Incremented with each sent message. - * @private {number} - */ - this.nextMessageId_ = 1; -}; - - -/** - * Set to {@code true} to enable debug logging of RPC messages. - * @type {boolean} - */ -cvox.LibLouis.DEBUG = false; - - -/** - * Attaches the Native Client wrapper to the DOM as a child of the provided - * element, assumed to already be in the document. - * @param {!Element} elem Desired parent element of the instance. - */ -cvox.LibLouis.prototype.attachToElement = function(elem) { - if (this.isAttached()) { - throw Error('Instance already attached'); - } - - var embed = document.createElement('embed'); - embed.src = this.nmfPath_; - embed.type = 'application/x-nacl'; - embed.width = 0; - embed.height = 0; - if (!goog.isNull(this.tablesDir_)) { - embed.setAttribute('tablesdir', this.tablesDir_); - } - embed.addEventListener('load', goog.bind(this.onInstanceLoad_, this), - false /* useCapture */); - embed.addEventListener('error', goog.bind(this.onInstanceError_, this), - false /* useCapture */); - embed.addEventListener('message', goog.bind(this.onInstanceMessage_, this), - false /* useCapture */); - elem.appendChild(embed); - this.embedElement_ = /** @type {!HTMLEmbedElement} */ (embed); -}; - - -/** - * Detaches the Native Client instance from the DOM. - */ -cvox.LibLouis.prototype.detach = function() { - if (!this.isAttached()) { - throw Error('cannot detach unattached instance'); - } - - this.embedElement_.parentNode.removeChild(this.embedElement_); - this.embedElement_ = null; - for (var id in this.pendingRpcCallbacks_) { - this.pendingRpcCallbacks_[id]({}); - } - this.pendingRpcCallbacks_ = {}; -}; - - -/** - * Determines whether the Native Client instance is attached. - * @return {boolean} {@code true} if the <embed> element is attached to the DOM. - */ -cvox.LibLouis.prototype.isAttached = function() { - return this.embedElement_ !== null; -}; - - -/** - * Returns a translator for the desired table, asynchronously. - * This object must be attached to a document when requesting a translator. - * @param {string} tableNames Comma separated list of braille table names for - * liblouis. - * @param {function(cvox.LibLouis.Translator)} callback - * Callback which will receive the translator, or {@code null} on failure. - */ -cvox.LibLouis.prototype.getTranslator = function(tableNames, callback) { - if (!this.isAttached()) { - callback(null /* translator */); - return; - } - this.rpc_('CheckTable', { 'table_names': tableNames }, function(reply) { - if (reply['success']) { - var translator = new cvox.LibLouis.Translator(this, tableNames); - callback(translator); - } else { - callback(null /* translator */); - } - }.bind(this)); -}; - - -/** - * Dispatches a message to the remote end and returns the reply asynchronously. - * A message ID will be automatically assigned (as a side-effect). - * @param {string} command Command name to be sent. - * @param {!Object} message JSONable message to be sent. - * @param {function(!Object)} callback Callback to receive the reply. - * @private - */ -cvox.LibLouis.prototype.rpc_ = - function(command, message, callback) { - if (!this.isAttached()) { - throw Error('Cannot send RPC: liblouis instance not loaded'); - } - var messageId = '' + this.nextMessageId_++; - message['message_id'] = messageId; - message['command'] = command; - var json = JSON.stringify(message); - if (cvox.LibLouis.DEBUG) { - window.console.debug('RPC -> ' + json); - } - this.embedElement_.postMessage(json); - this.pendingRpcCallbacks_[messageId] = callback; -}; - - -/** - * Invoked when the Native Client instance successfully loads. - * @param {Event} e Event dispatched after loading. - * @private - */ -cvox.LibLouis.prototype.onInstanceLoad_ = function(e) { - window.console.info('loaded liblouis Native Client instance'); -}; - - -/** - * Invoked when the Native Client instance fails to load. - * @param {Event} e Event dispatched after loading failure. - * @private - */ -cvox.LibLouis.prototype.onInstanceError_ = function(e) { - window.console.error('failed to load liblouis Native Client instance'); - this.detach(); -}; - - -/** - * Invoked when the Native Client instance posts a message. - * @param {Event} e Event dispatched after the message was posted. - * @private - */ -cvox.LibLouis.prototype.onInstanceMessage_ = function(e) { - if (cvox.LibLouis.DEBUG) { - window.console.debug('RPC <- ' + e.data); - } - var message = /** @type {!Object} */ (JSON.parse(e.data)); - var messageId = message['in_reply_to']; - if (!goog.isDef(messageId)) { - window.console.warn('liblouis Native Client module sent message with no ID', - message); - return; - } - if (goog.isDef(message['error'])) { - window.console.error('liblouis Native Client error', message['error']); - } - var callback = this.pendingRpcCallbacks_[messageId]; - if (goog.isDef(callback)) { - delete this.pendingRpcCallbacks_[messageId]; - callback(message); - } -}; - - -/** - * Braille translator which uses a Native Client instance of liblouis. - * @constructor - * @param {!cvox.LibLouis} instance The instance wrapper. - * @param {string} tableNames Comma separated list of Table names to be passed - * to liblouis. - */ -cvox.LibLouis.Translator = function(instance, tableNames) { - /** - * The instance wrapper. - * @private {!cvox.LibLouis} - */ - this.instance_ = instance; - - /** - * The table name. - * @private {string} - */ - this.tableNames_ = tableNames; -}; - - -/** - * Translates text into braille cells. - * @param {string} text Text to be translated. - * @param {function(ArrayBuffer, Array<number>, Array<number>)} callback - * Callback for result. Takes 3 parameters: the resulting cells, - * mapping from text to braille positions and mapping from braille to - * text positions. If translation fails for any reason, all parameters are - * {@code null}. - */ -cvox.LibLouis.Translator.prototype.translate = function(text, callback) { - if (!this.instance_.isAttached()) { - callback(null /*cells*/, null /*textToBraille*/, null /*brailleToText*/); - return; - } - var message = { 'table_names': this.tableNames_, 'text': text }; - this.instance_.rpc_('Translate', message, function(reply) { - var cells = null; - var textToBraille = null; - var brailleToText = null; - if (reply['success'] && goog.isString(reply['cells'])) { - cells = cvox.LibLouis.Translator.decodeHexString_(reply['cells']); - if (goog.isDef(reply['text_to_braille'])) { - textToBraille = reply['text_to_braille']; - } - if (goog.isDef(reply['braille_to_text'])) { - brailleToText = reply['braille_to_text']; - } - } else if (text.length > 0) { - // TODO(plundblad): The nacl wrapper currently returns an error - // when translating an empty string. Address that and always log here. - console.error('Braille translation error for ' + JSON.stringify(message)); - } - callback(cells, textToBraille, brailleToText); - }); -}; - - -/** - * Translates braille cells into text. - * @param {!ArrayBuffer} cells Cells to be translated. - * @param {function(?string)} callback Callback for result. - */ -cvox.LibLouis.Translator.prototype.backTranslate = - function(cells, callback) { - if (!this.instance_.isAttached()) { - callback(null /*text*/); - return; - } - if (cells.byteLength == 0) { - // liblouis doesn't handle empty input, so handle that trivially - // here. - callback(''); - return; - } - var message = { - 'table_names': this.tableNames_, - 'cells': cvox.LibLouis.Translator.encodeHexString_(cells) - }; - this.instance_.rpc_('BackTranslate', message, function(reply) { - if (reply['success'] && goog.isString(reply['text'])) { - callback(reply['text']); - } else { - callback(null /* text */); - } - }); -}; - - -/** - * Decodes a hexadecimal string to an {@code ArrayBuffer}. - * @param {string} hex Hexadecimal string. - * @return {!ArrayBuffer} Decoded binary data. - * @private - */ -cvox.LibLouis.Translator.decodeHexString_ = function(hex) { - if (!/^([0-9a-f]{2})*$/i.test(hex)) { - throw Error('invalid hexadecimal string'); - } - var array = new Uint8Array(hex.length / 2); - var idx = 0; - for (var i = 0; i < hex.length; i += 2) { - array[idx++] = parseInt(hex.substring(i, i + 2), 16); - } - return array.buffer; -}; - - -/** - * Encodes an {@code ArrayBuffer} in hexadecimal. - * @param {!ArrayBuffer} arrayBuffer Binary data. - * @return {string} Hexadecimal string. - * @private - */ -cvox.LibLouis.Translator.encodeHexString_ = function(arrayBuffer) { - var array = new Uint8Array(arrayBuffer); - var hex = ''; - for (var i = 0; i < array.length; i++) { - var b = array[i]; - hex += (b < 0x10 ? '0' : '') + b.toString(16); - } - return hex; -}; |