aboutsummaryrefslogtreecommitdiff
path: root/src/background/operators/impls/FindPrevOperator.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/operators/impls/FindPrevOperator.ts')
-rw-r--r--src/background/operators/impls/FindPrevOperator.ts94
1 files changed, 44 insertions, 50 deletions
diff --git a/src/background/operators/impls/FindPrevOperator.ts b/src/background/operators/impls/FindPrevOperator.ts
index 3c4411d..f8506b9 100644
--- a/src/background/operators/impls/FindPrevOperator.ts
+++ b/src/background/operators/impls/FindPrevOperator.ts
@@ -21,71 +21,65 @@ export default class FindPrevOperator implements Operator {
return;
}
+ let frameIds = await this.frameRepository.getFrameIds(tabId);
+ if (typeof frameIds === "undefined") {
+ // No frames are ready
+ return;
+ }
+ frameIds = frameIds.slice(0).reverse();
+
const state = await this.findRepository.getLocalState(tabId);
if (state) {
- // Start to find the keyword from the current frame which last found on,
- // and concat it to end of frame ids to perform a wrap-search
- //
- // ,- keyword should be in this frame
- // |
- // [100, 101, 0, 100]
- // |
- // `- continue from frame id 100
- //
- const targetFrameIds = state.frameIds
- .slice(state.framePos)
- .concat(
- state.frameIds.slice(0, state.framePos),
- state.frameIds[state.framePos]
- );
+ const framePos = frameIds.indexOf(state.frameId);
+ if (framePos !== -1) {
+ // Start to find the keyword from the current frame which last found on,
+ // and concat it to end of frame ids to perform a wrap-search
+ //
+ // ,- keyword should be in this frame
+ // |
+ // [100, 101, 0, 100]
+ // |
+ // `- continue from frame id 100
+ //
+ const targetFrameIds = frameIds
+ .slice(framePos)
+ .concat(frameIds.slice(0, framePos), frameIds[framePos]);
- for (let i = targetFrameIds.length - 1; i >= 0; --i) {
- const found = await this.findClient.findPrev(
+ for (const frameId of targetFrameIds) {
+ const found = await this.findClient.findPrev(
+ tabId,
+ frameId,
+ state.keyword
+ );
+ if (found) {
+ this.findRepository.setLocalState(tabId, {
+ keyword: state.keyword,
+ frameId,
+ });
+ return;
+ }
+ this.findClient.clearSelection(tabId, frameId);
+ }
+
+ // The keyword is gone.
+ this.consoleClient.showError(
tabId,
- targetFrameIds[i],
- state.keyword
+ "Pattern not found: " + state.keyword
);
- if (found) {
- this.findRepository.setLocalState(tabId, {
- ...state,
- framePos: (i + state.framePos) % state.frameIds.length, // save current frame position or first
- });
- return;
- }
- this.findClient.clearSelection(tabId, targetFrameIds[i]);
+ return;
}
-
- // The keyword is gone.
- this.consoleClient.showError(
- tabId,
- "Pattern not found: " + state.keyword
- );
- return;
}
const keyword = await this.findRepository.getGlobalKeyword();
if (keyword) {
- const frameIds = await this.frameRepository.getFrameIds(tabId);
- if (typeof frameIds === "undefined") {
- // No frames are ready
- return;
- }
for (const frameId of frameIds) {
await this.findClient.clearSelection(tabId, frameId);
}
- for (let framePos = frameIds.length - 1; framePos >= 0; --framePos) {
- const found = await this.findClient.findPrev(
- tabId,
- frameIds[framePos],
- keyword
- );
+ for (const frameId of frameIds) {
+ const found = await this.findClient.findPrev(tabId, frameId, keyword);
if (found) {
- await this.findRepository.setLocalState(tabId, {
- frameIds,
- framePos,
- keyword,
- });
+ await this.findRepository.setLocalState(tabId, { frameId, keyword });
await this.consoleClient.showInfo(tabId, "Pattern found: " + keyword);
return;
}