From 3e7f3af63c01e39577bdc548d0dc81e83020df78 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Mon, 30 Aug 2021 21:55:08 -0400 Subject: [PATCH] Fix history replacement issue (#1917) * Remove unused "history" field of event details * Change setContent history parameter to historyMode --- ext/js/app/frontend.js | 2 +- ext/js/display/display-history.js | 2 +- ext/js/display/display.js | 35 ++++++++++++--------- ext/js/display/search-display-controller.js | 10 +++--- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 1c6def06..ef53cecb 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -515,7 +515,7 @@ class Frontend { const {url} = optionsContext; const details = { focus, - history: false, + historyMode: 'clear', params: { type, query, diff --git a/ext/js/display/display-history.js b/ext/js/display/display-history.js index a6335521..449bec47 100644 --- a/ext/js/display/display-history.js +++ b/ext/js/display/display-history.js @@ -112,7 +112,7 @@ class DisplayHistory extends EventDispatcher { } _triggerStateChanged(synthetic) { - this.trigger('stateChanged', {history: this, synthetic}); + this.trigger('stateChanged', {synthetic}); } _updateHistoryFromCurrent(replace) { diff --git a/ext/js/display/display.js b/ext/js/display/display.js index f3d46054..edd9a866 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -347,7 +347,8 @@ class Display extends EventDispatcher { } setContent(details) { - const {focus, history, params, state, content} = details; + const {focus, params, state, content} = details; + const historyMode = this._historyHasChanged ? details.historyMode : 'clear'; if (focus) { window.focus(); @@ -359,12 +360,18 @@ class Display extends EventDispatcher { } const url = `${location.protocol}//${location.host}${location.pathname}?${urlSearchParams.toString()}`; - if (history && this._historyHasChanged) { - this._updateHistoryState(); - this._history.pushState(state, content, url); - } else { - this._history.clear(); - this._history.replaceState(state, content, url); + switch (historyMode) { + case 'clear': + this._history.clear(); + this._history.replaceState(state, content, url); + break; + case 'overwrite': + this._history.replaceState(state, content, url); + break; + default: // 'new' + this._updateHistoryState(); + this._history.pushState(state, content, url); + break; } } @@ -430,7 +437,7 @@ class Display extends EventDispatcher { ); const details = { focus: false, - history: false, + historyMode: 'clear', params: this._createSearchParams(type, query, false), state, content: { @@ -638,14 +645,14 @@ class Display extends EventDispatcher { _onQueryParserSearch({type, dictionaryEntries, sentence, inputInfo: {eventType}, textSource, optionsContext}) { const query = textSource.text(); const historyState = this._history.state; - const history = ( + const historyMode = ( eventType === 'click' || !isObject(historyState) || historyState.cause !== 'queryParser' - ); + ) ? 'new' : 'overwrite'; const details = { focus: false, - history, + historyMode, params: this._createSearchParams(type, query, false), state: { sentence, @@ -665,7 +672,7 @@ class Display extends EventDispatcher { if (this._contentType === type) { return; } const details = { focus: false, - history: false, + historyMode: 'clear', params: {type}, state: {}, content: { @@ -725,7 +732,7 @@ class Display extends EventDispatcher { const dictionaryEntries = await yomichan.api.kanjiFind(query, optionsContext); const details = { focus: false, - history: true, + historyMode: 'new', params: this._createSearchParams('kanji', query, false), state: { focusEntry: 0, @@ -1448,7 +1455,7 @@ class Display extends EventDispatcher { const documentTitle = document.title; const details = { focus: false, - history: true, + historyMode: 'new', params: { type, query, diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js index 6bdef2c8..81124bbb 100644 --- a/ext/js/display/search-display-controller.js +++ b/ext/js/display/search-display-controller.js @@ -185,12 +185,12 @@ class SearchDisplayController { e.preventDefault(); e.stopImmediatePropagation(); this._display.blurElement(e.currentTarget); - this._search(true, true, true, null); + this._search(true, 'new', true, null); } _onSearch(e) { e.preventDefault(); - this._search(true, true, true, null); + this._search(true, 'new', true, null); } _onCopy() { @@ -205,7 +205,7 @@ class SearchDisplayController { } this._queryInput.value = text; this._updateSearchHeight(true); - this._search(animate, false, autoSearchContent, ['clipboard']); + this._search(animate, 'clear', autoSearchContent, ['clipboard']); } _onWanakanaEnableChange(e) { @@ -362,7 +362,7 @@ class SearchDisplayController { }); } - _search(animate, history, lookup, flags) { + _search(animate, historyMode, lookup, flags) { const query = this._queryInput.value; const depth = this._display.depth; const url = window.location.href; @@ -373,7 +373,7 @@ class SearchDisplayController { } const details = { focus: false, - history, + historyMode, params: { query },