| Index: chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
|
| diff --git a/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
|
| index 24b28b42e341882f2c9e0797f639cec845eb6724..18baad777cc21c49b455e767887d48184a448ad9 100644
|
| --- a/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
|
| +++ b/chrome/browser/resources/chromeos/chromevox/braille/expanding_braille_translator.js
|
| @@ -9,6 +9,7 @@
|
|
|
| goog.provide('cvox.ExpandingBrailleTranslator');
|
|
|
| +goog.require('cvox.ExtraCellsSpan');
|
| goog.require('cvox.LibLouis');
|
| goog.require('cvox.Spannable');
|
| goog.require('cvox.ValueSelectionSpan');
|
| @@ -88,7 +89,12 @@ cvox.ExpandingBrailleTranslator.ExpansionType = {
|
| cvox.ExpandingBrailleTranslator.prototype.translate =
|
| function(text, expansionType, callback) {
|
| var expandRanges = this.findExpandRanges_(text, expansionType);
|
| - if (expandRanges.length == 0) {
|
| + var extraCellsSpans = text.getSpansInstanceOf(cvox.ExtraCellsSpan)
|
| + .filter(function(span) { return span.cells.byteLength > 0;});
|
| + var extraCellsPositions = extraCellsSpans.map(function(span) {
|
| + return text.getSpanStart(span);
|
| + });
|
| + if (expandRanges.length == 0 && extraCellsSpans.length == 0) {
|
| this.defaultTranslator_.translate(
|
| text.toString(),
|
| cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_(
|
| @@ -97,8 +103,28 @@ cvox.ExpandingBrailleTranslator.prototype.translate =
|
| }
|
|
|
| var chunks = [];
|
| + function maybeAddChunkToTranslate(translator, start, end) {
|
| + if (start < end)
|
| + chunks.push({translator: translator, start: start, end: end});
|
| + }
|
| + function addExtraCellsChunk(pos, cells) {
|
| + var chunk = {translator: null,
|
| + start: pos,
|
| + end: pos,
|
| + cells: cells,
|
| + textToBraille: [],
|
| + brailleToText: new Array(cells.byteLength)};
|
| + for (var i = 0; i < cells.byteLength; ++i)
|
| + chunk.brailleToText[i] = 0;
|
| + chunks.push(chunk);
|
| + }
|
| function addChunk(translator, start, end) {
|
| - chunks.push({translator: translator, start: start, end: end});
|
| + while (extraCellsSpans.length > 0 && extraCellsPositions[0] <= end) {
|
| + maybeAddChunkToTranslate(translator, start, extraCellsPositions[0]);
|
| + start = extraCellsPositions.shift();
|
| + addExtraCellsChunk(start, extraCellsSpans.shift().cells);
|
| + }
|
| + maybeAddChunkToTranslate(translator, start, end);
|
| }
|
| var lastEnd = 0;
|
| for (var i = 0; i < expandRanges.length; ++i) {
|
| @@ -109,19 +135,19 @@ cvox.ExpandingBrailleTranslator.prototype.translate =
|
| addChunk(this.uncontractedTranslator_, range.start, range.end);
|
| lastEnd = range.end;
|
| }
|
| - if (lastEnd < text.getLength()) {
|
| - addChunk(this.defaultTranslator_, lastEnd, text.getLength());
|
| - }
|
| + addChunk(this.defaultTranslator_, lastEnd, text.getLength());
|
|
|
| - var numPendingCallbacks = chunks.length;
|
| + var chunksToTranslate = chunks.filter(function(chunk) {
|
| + return chunk.translator;
|
| + });
|
| + var numPendingCallbacks = chunksToTranslate.length;
|
|
|
| function chunkTranslated(chunk, cells, textToBraille, brailleToText) {
|
| chunk.cells = cells;
|
| chunk.textToBraille = textToBraille;
|
| chunk.brailleToText = brailleToText;
|
| - if (--numPendingCallbacks <= 0) {
|
| + if (--numPendingCallbacks <= 0)
|
| finish();
|
| - }
|
| }
|
|
|
| function finish() {
|
| @@ -145,11 +171,15 @@ cvox.ExpandingBrailleTranslator.prototype.translate =
|
| callback(cells.buffer, textToBraille, brailleToText);
|
| }
|
|
|
| - for (var i = 0, chunk; chunk = chunks[i]; ++i) {
|
| - chunk.translator.translate(
|
| - text.toString().substring(chunk.start, chunk.end),
|
| - cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_(
|
| - chunk.end - chunk.start, goog.partial(chunkTranslated, chunk)));
|
| + if (chunksToTranslate.length > 0) {
|
| + chunksToTranslate.forEach(function(chunk) {
|
| + chunk.translator.translate(
|
| + text.toString().substring(chunk.start, chunk.end),
|
| + cvox.ExpandingBrailleTranslator.nullParamsToEmptyAdapter_(
|
| + chunk.end - chunk.start, goog.partial(chunkTranslated, chunk)));
|
| + });
|
| + } else {
|
| + finish();
|
| }
|
| };
|
|
|
|
|