summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/bg/js/search.js46
-rw-r--r--ext/fg/js/float.js8
-rw-r--r--ext/fg/js/popup.js6
-rw-r--r--ext/mixed/js/display.js37
4 files changed, 71 insertions, 26 deletions
diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js
index ead9ba6f..7a8fdf5e 100644
--- a/ext/bg/js/search.js
+++ b/ext/bg/js/search.js
@@ -33,23 +33,37 @@ class DisplaySearch extends Display {
this.introAnimationTimer = null;
this.dependencies = Object.assign({}, this.dependencies, {docRangeFromPoint, docSentenceExtract});
+ }
- if (this.search !== null) {
- this.search.addEventListener('click', (e) => this.onSearch(e), false);
- }
- if (this.query !== null) {
- this.query.addEventListener('input', () => this.onSearchInput(), false);
+ static create() {
+ const instance = new DisplaySearch();
+ instance.prepare();
+ return instance;
+ }
+
+ async prepare() {
+ try {
+ await this.initialize();
- const query = DisplaySearch.getSearchQueryFromLocation(window.location.href);
- if (query !== null) {
- this.query.value = window.wanakana.toKana(query);
- this.onSearchQueryUpdated(query, false);
+ if (this.search !== null) {
+ this.search.addEventListener('click', (e) => this.onSearch(e), false);
}
+ if (this.query !== null) {
+ this.query.addEventListener('input', () => this.onSearchInput(), false);
- window.wanakana.bind(this.query);
- }
+ const query = DisplaySearch.getSearchQueryFromLocation(window.location.href);
+ if (query !== null) {
+ this.query.value = window.wanakana.toKana(query);
+ this.onSearchQueryUpdated(query, false);
+ }
- this.updateSearchButton();
+ window.wanakana.bind(this.query);
+ }
+
+ this.updateSearchButton();
+ } catch (e) {
+ this.onError(e);
+ }
}
onError(error) {
@@ -89,7 +103,7 @@ class DisplaySearch extends Display {
this.updateSearchButton();
if (valid) {
const {definitions} = await apiTermsFind(query, this.optionsContext);
- this.termsShow(definitions, await apiOptionsGet(this.optionsContext));
+ this.termsShow(definitions, this.options);
} else {
this.container.textContent = '';
}
@@ -98,6 +112,10 @@ class DisplaySearch extends Display {
}
}
+ getOptionsContext() {
+ return this.optionsContext;
+ }
+
setIntroVisible(visible, animate) {
if (this.introVisible === visible) {
return;
@@ -164,4 +182,4 @@ class DisplaySearch extends Display {
}
}
-window.yomichan_search = new DisplaySearch();
+window.yomichan_search = DisplaySearch.create();
diff --git a/ext/fg/js/float.js b/ext/fg/js/float.js
index 533d98e1..d9b483d7 100644
--- a/ext/fg/js/float.js
+++ b/ext/fg/js/float.js
@@ -84,6 +84,10 @@ class DisplayFloat extends Display {
super.onKeyDown(e);
}
+ getOptionsContext() {
+ return this.optionsContext;
+ }
+
autoPlayAudio() {
this.clearAutoPlayTimer();
this.autoPlayAudioTimer = window.setTimeout(() => super.autoPlayAudio(), 400);
@@ -96,7 +100,9 @@ class DisplayFloat extends Display {
}
}
- initialize(options, popupInfo, url, childrenSupported) {
+ async initialize(options, popupInfo, url, childrenSupported) {
+ await super.initialize(options);
+
const css = options.general.customPopupCss;
if (css) {
this.setStyle(css);
diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js
index 7f96fe97..0fd6a9d0 100644
--- a/ext/fg/js/popup.js
+++ b/ext/fg/js/popup.js
@@ -61,11 +61,7 @@ class Popup {
const parentFrameId = (typeof this.frameId === 'number' ? this.frameId : null);
this.container.addEventListener('load', () => {
this.invokeApi('initialize', {
- options: {
- general: {
- customPopupCss: options.general.customPopupCss
- }
- },
+ options: options,
popupInfo: {
id: this.id,
depth: this.depth,
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js
index f879f5b3..0d7be355 100644
--- a/ext/mixed/js/display.js
+++ b/ext/mixed/js/display.js
@@ -29,7 +29,6 @@ class Display {
this.audioPlaying = null;
this.audioFallback = null;
this.audioCache = {};
- this.optionsContext = {};
this.eventListeners = [];
this.persistentEventListeners = [];
@@ -76,7 +75,7 @@ class Display {
context.source.source = this.context.source;
}
- const kanjiDefs = await apiKanjiFind(link.textContent, this.optionsContext);
+ const kanjiDefs = await apiKanjiFind(link.textContent, this.getOptionsContext());
this.kanjiShow(kanjiDefs, this.options, context);
} catch (e) {
this.onError(e);
@@ -99,7 +98,7 @@ class Display {
try {
textSource.setEndOffset(this.options.scanning.length);
- ({definitions, length} = await apiTermsFind(textSource.text(), this.optionsContext));
+ ({definitions, length} = await apiTermsFind(textSource.text(), this.getOptionsContext()));
if (definitions.length === 0) {
return false;
}
@@ -175,6 +174,28 @@ class Display {
}
}
+ onRuntimeMessage({action, params}, sender, callback) {
+ const handlers = Display.runtimeMessageHandlers;
+ if (handlers.hasOwnProperty(action)) {
+ const handler = handlers[action];
+ handler(this, params);
+ callback();
+ }
+ }
+
+ getOptionsContext() {
+ throw new Error('Override me');
+ }
+
+ async initialize(options=null) {
+ await this.updateOptions(options);
+ chrome.runtime.onMessage.addListener(this.onRuntimeMessage.bind(this));
+ }
+
+ async updateOptions(options) {
+ this.options = options ? options : await apiOptionsGet(this.getOptionsContext());
+ }
+
setInteractive(interactive) {
interactive = !!interactive;
if (this.interactive === interactive) { return; }
@@ -314,7 +335,7 @@ class Display {
async adderButtonUpdate(modes, sequence) {
try {
- const states = await apiDefinitionsAddable(this.definitions, modes, this.optionsContext);
+ const states = await apiDefinitionsAddable(this.definitions, modes, this.getOptionsContext());
if (!states || sequence !== this.sequence) {
return;
}
@@ -416,7 +437,7 @@ class Display {
}
}
- const noteId = await apiDefinitionAdd(definition, mode, context, this.optionsContext);
+ const noteId = await apiDefinitionAdd(definition, mode, context, this.getOptionsContext());
if (noteId) {
const index = this.definitions.indexOf(definition);
const adderButton = this.adderButtonFind(index, mode);
@@ -446,7 +467,7 @@ class Display {
}
const sources = this.options.audio.sources;
- let {audio, source} = await audioGetFromSources(expression, sources, this.optionsContext, true, this.audioCache);
+ let {audio, source} = await audioGetFromSources(expression, sources, this.getOptionsContext(), true, this.audioCache);
let info;
if (audio === null) {
if (this.audioFallback === null) {
@@ -706,3 +727,7 @@ Display.onKeyDownHandlers = {
return false;
}
};
+
+Display.runtimeMessageHandlers = {
+ optionsUpdate: (self) => self.updateOptions(null)
+};