зеркало из https://github.com/mozilla/gecko-dev.git
119 строки
3.3 KiB
JavaScript
119 строки
3.3 KiB
JavaScript
/* vim: set ts=2 sw=2 sts=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
var { InlineSpellChecker, SpellCheckHelper } = ChromeUtils.import(
|
|
"resource://gre/modules/InlineSpellChecker.jsm"
|
|
);
|
|
|
|
var EXPORTED_SYMBOLS = ["InlineSpellCheckerContent"];
|
|
|
|
var InlineSpellCheckerContent = {
|
|
_spellChecker: null,
|
|
_actor: null,
|
|
|
|
initContextMenu(event, editFlags, actor) {
|
|
this._actor = actor;
|
|
|
|
let spellChecker;
|
|
if (!(editFlags & (SpellCheckHelper.TEXTAREA | SpellCheckHelper.INPUT))) {
|
|
// Get the editor off the window.
|
|
let win = event.target.ownerGlobal;
|
|
let editingSession = win.docShell.editingSession;
|
|
spellChecker = this._spellChecker = new InlineSpellChecker(
|
|
editingSession.getEditorForWindow(win)
|
|
);
|
|
} else {
|
|
// Use the element's editor.
|
|
spellChecker = this._spellChecker = new InlineSpellChecker(
|
|
event.composedTarget.editor
|
|
);
|
|
}
|
|
|
|
this._spellChecker.initFromEvent(event.rangeParent, event.rangeOffset);
|
|
|
|
if (!spellChecker.canSpellCheck) {
|
|
return {
|
|
canSpellCheck: false,
|
|
initialSpellCheckPending: true,
|
|
enableRealTimeSpell: false,
|
|
};
|
|
}
|
|
|
|
if (!spellChecker.mInlineSpellChecker.enableRealTimeSpell) {
|
|
return {
|
|
canSpellCheck: true,
|
|
initialSpellCheckPending: spellChecker.initialSpellCheckPending,
|
|
enableRealTimeSpell: false,
|
|
};
|
|
}
|
|
|
|
if (spellChecker.initialSpellCheckPending) {
|
|
return {
|
|
canSpellCheck: true,
|
|
initialSpellCheckPending: true,
|
|
enableRealTimeSpell: true,
|
|
};
|
|
}
|
|
|
|
let realSpellChecker = spellChecker.mInlineSpellChecker.spellChecker;
|
|
let dictionaryList = realSpellChecker.GetDictionaryList();
|
|
|
|
return {
|
|
canSpellCheck: spellChecker.canSpellCheck,
|
|
initialSpellCheckPending: spellChecker.initialSpellCheckPending,
|
|
enableRealTimeSpell: spellChecker.enabled,
|
|
overMisspelling: spellChecker.overMisspelling,
|
|
misspelling: spellChecker.mMisspelling,
|
|
spellSuggestions: this._generateSpellSuggestions(),
|
|
currentDictionary: spellChecker.mInlineSpellChecker.spellChecker.GetCurrentDictionary(),
|
|
dictionaryList,
|
|
};
|
|
},
|
|
|
|
uninitContextMenu() {
|
|
this._actor = null;
|
|
this._spellChecker = null;
|
|
},
|
|
|
|
_generateSpellSuggestions() {
|
|
let spellChecker = this._spellChecker.mInlineSpellChecker.spellChecker;
|
|
try {
|
|
spellChecker.CheckCurrentWord(this._spellChecker.mMisspelling);
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
|
|
let suggestions = new Array(5);
|
|
for (let i = 0; i < 5; ++i) {
|
|
suggestions[i] = spellChecker.GetSuggestedWord();
|
|
if (suggestions[i].length === 0) {
|
|
suggestions.length = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
this._spellChecker.mSpellSuggestions = suggestions;
|
|
return suggestions;
|
|
},
|
|
|
|
selectDictionary(localeCode) {
|
|
this._spellChecker.selectDictionary(localeCode);
|
|
},
|
|
|
|
replaceMisspelling(index) {
|
|
this._spellChecker.replaceMisspelling(index);
|
|
},
|
|
|
|
toggleEnabled() {
|
|
this._spellChecker.toggleEnabled();
|
|
},
|
|
|
|
recheck() {
|
|
this._spellChecker.mInlineSpellChecker.enableRealTimeSpell = true;
|
|
},
|
|
};
|