Skip to content

Commit 1b8f414

Browse files
committed
Fixed #2347 Guard against potentially resource intensive repeating actions like 99yt
1 parent 89104c0 commit 1b8f414

File tree

7 files changed

+54
-14
lines changed

7 files changed

+54
-14
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ Some functionalities are also available when you're using original pdf viewer, b
571571
| settings.defaultSearchEngine | "g" | The default search engine used in Omnibar. |
572572
| settings.blocklistPattern | undefined | A regex to match the sites that will have Surfingkeys disabled. |
573573
| settings.focusAfterClosed | "right" | Which tab will be focused after the current tab is closed. ["left", "right", "last"] |
574-
| settings.repeatThreshold | 99 | The maximum of actions to be repeated. |
574+
| settings.repeatThreshold | 9 | The maximum of actions to be repeated. |
575575
| settings.tabsMRUOrder | true | Whether to list opened tabs in order of most recently used beneath Omnibar. |
576576
| settings.historyMUOrder | true | Whether to list history in order of most used beneath Omnibar. |
577577
| settings.newTabPosition | 'default' | Where to new tab. ["left", "right", "first", "last", "default"] |

README_CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ Surfingkeys默认使用[这个markdown分析器](https://github.com/chjj/marked)
555555
| settings.defaultSearchEngine | "g" | 搜索栏里的默认搜索引擎。 |
556556
| settings.blocklistPattern | undefined | 如果当前访问的网站匹配设定的正则表达式,则禁用Surfingkeys。 |
557557
| settings.focusAfterClosed | "right" | 关掉当前标签页后,切换到哪一侧的标签页。["left", "right"] |
558-
| settings.repeatThreshold | 99 | 操作可重复最多次数。 |
558+
| settings.repeatThreshold | 9 | 操作可重复最多次数。 |
559559
| settings.tabsMRUOrder | true | 查找打开标签页时,是否按最近访问顺序列出所有标签页。 |
560560
| settings.historyMUOrder | true | 查找访问记录时,是否按最常访问顺序列出所有访问记录。 |
561561
| settings.newTabPosition | 'default' | 在哪个位置创建新标签页。["left", "right", "first", "default"] |

src/background/start.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ function start(browser) {
217217
var conf = {
218218
llm: { },
219219
focusAfterClosed: "right",
220-
repeatThreshold: 99,
221220
tabsMRUOrder: true,
222221
newTabPosition: 'default',
223222
showTabIndices: false,
@@ -451,9 +450,6 @@ function start(browser) {
451450
}
452451
function handleMessage(_message, _sender, _sendResponse) {
453452
if (self.hasOwnProperty(_message.action)) {
454-
if (_message.repeats > conf.repeatThreshold) {
455-
_message.repeats = conf.repeatThreshold;
456-
}
457453
var result = self[_message.action](_message, _sender, _sendResponse);
458454
if (_message.needResponse) {
459455
if (result) {

src/content_scripts/common/mode.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,18 @@ Mode.handleMapKey = function(event, onNoMatched) {
311311
RUNTIME.repeats = parseInt(this.repeats) || 1;
312312
event.sk_stopPropagation = (!this.map_node.meta.stopPropagation
313313
|| this.map_node.meta.stopPropagation(key));
314-
while(RUNTIME.repeats > 0) {
315-
code();
316-
RUNTIME.repeats--;
314+
if (RUNTIME.repeats > runtime.conf.repeatThreshold) {
315+
dispatchSKEvent("front", ['showDialog', `Do you really want to repeat this action (${this.map_node.meta.annotation}) ${RUNTIME.repeats} times?`, () => {
316+
while(RUNTIME.repeats > 0) {
317+
code();
318+
RUNTIME.repeats--;
319+
}
320+
}]);
321+
} else {
322+
while(RUNTIME.repeats > 0) {
323+
code();
324+
RUNTIME.repeats--;
325+
}
317326
}
318327
actionDone = Mode.finish(thisMode);
319328
}

src/content_scripts/common/runtime.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const runtime = (function() {
7979
omnibarTabsQuery: {},
8080
pageUrlRegex: [],
8181
prevLinkRegex: /(\b(prev|previous)\b)|||||||<<|«/i,
82+
repeatThreshold: 9,
8283
richHintsForKeystroke: 1000,
8384
scrollStepSize: 70,
8485
showModeStatus: false,

src/content_scripts/front.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,12 +439,28 @@ function createFront(insert, normal, hints, visual, browser) {
439439
});
440440
};
441441

442+
let onDialogResponseOk = null;
443+
_actions["dialogResponse"] = function (message) {
444+
if (message.result === "Ok" && onDialogResponseOk) {
445+
onDialogResponseOk();
446+
} else {
447+
onDialogResponseOk = null;
448+
}
449+
};
450+
442451
skCallbacks = initSKFunctionListener("front", {
443452
showPopup: (content) => {
444453
self.command({
445454
action: 'showPopup',
446-
content: content
455+
content
456+
});
457+
},
458+
showDialog: (question, onOk) => {
459+
self.command({
460+
action: 'showDialog',
461+
question
447462
});
463+
onDialogResponseOk = onOk;
448464
},
449465
applySettingsFromSnippets: (us) => {
450466
applyUICommand({

src/content_scripts/ui/frontend.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,13 @@ const Front = (function() {
7070
};
7171

7272
var pressedHintKeys = "";
73+
var _display;
7374
self.addEventListener('keydown', function(event) {
7475
if (Mode.isSpecialKeyOf("<Esc>", event.sk_keyName)) {
7576
self.hidePopup();
7677
event.sk_stopPropagation = true;
77-
} else if (_tabs.style.display !== "none") {
78-
const tabHints = _tabs.querySelectorAll('div>div.sk_tab_hint');
78+
} else if (_display && _display.style.display !== "none") {
79+
const tabHints = _display.querySelectorAll('div>div.sk_tab_hint');
7980
if (tabHints.length > 0) {
8081
const key = event.sk_keyName;
8182
const characters = hints.getCharacters().toLowerCase();
@@ -88,7 +89,7 @@ const Front = (function() {
8889
pressedHintKeys = pressedHintKeys + key.toUpperCase();
8990
const hintState = refreshHints(tabHints, pressedHintKeys);
9091
if (hintState.matched) {
91-
_tabs.onHit(hintState.matched);
92+
_display.onHit(hintState.matched);
9293
pressedHintKeys = "";
9394
self.hidePopup();
9495
} else if (hintState.candidates === 0) {
@@ -203,7 +204,6 @@ const Front = (function() {
203204
};
204205
var keystroke = document.getElementById('sk_keystroke');
205206

206-
var _display;
207207
self.startInputGuard = () => {
208208
if (getBrowserName().startsWith("Safari")) {
209209
var inputGuard = setInterval(() => {
@@ -487,6 +487,24 @@ const Front = (function() {
487487
showPopup(message.content);
488488
};
489489

490+
_actions['showDialog'] = function(message) {
491+
showElement(_popup, () => {
492+
const hintLabels = hints.genLabels(2);
493+
setSanitizedContent(_popup, `<div>${message.question}</div><div><div class=sk_tab_hint>${hintLabels[0]}</div><span class=sk_tab_group_title>Ok</span><div class=sk_tab_hint>${hintLabels[1]}</div><span class=sk_tab_group_title>Cancel</span></div>`);
494+
const tabHints = _popup.querySelectorAll("div.sk_tab_hint");
495+
_popup.style.textAlign = "center";
496+
tabHints[0].link = "Ok";
497+
tabHints[0].label = hintLabels[0];
498+
tabHints[1].link = "Cancel";
499+
tabHints[1].label = hintLabels[1];
500+
}, (matched) => {
501+
self.contentCommand({
502+
action: 'dialogResponse',
503+
result: matched
504+
});
505+
});
506+
};
507+
490508
self.vimMappings = [];
491509
let _aceEditor = null;
492510
function renderAceEditor(message) {

0 commit comments

Comments
 (0)