Skip to content

Commit

Permalink
add an option named passEsc
Browse files Browse the repository at this point in the history
to work better with search engine result pages

like philc/vimium#3917
  • Loading branch information
gdh1995 committed Dec 23, 2021
1 parent 490dac4 commit ff13a6c
Show file tree
Hide file tree
Showing 10 changed files with 56 additions and 33 deletions.
3 changes: 2 additions & 1 deletion background/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ shortcut-forwarding-tool@gdh1995.cn`
nextPatterns: "\u4e0b\u4e00\u5c01,\u4e0b\u9875,\u4e0b\u4e00\u9875,\u4e0b\u4e00\u7ae0,\u540e\u4e00\u9875\
,next,more,newer,>,\u203a,\u2192,\xbb,\u226b,>>",
omniBlockList: "",
passEsc: "[aria-controls],[role=combobox],#kw.s_ipt", // MS Bing / Google / Baidu
previousPatterns: "\u4e0a\u4e00\u5c01,\u4e0a\u9875,\u4e0a\u4e00\u9875,\u4e0a\u4e00\u7ae0,\u524d\u4e00\u9875\
,prev,previous,back,older,<,\u2039,\u2190,\xab,\u226a,<<",
regexFindMode: false,
Expand Down Expand Up @@ -386,7 +387,7 @@ export const valuesToLoad_ = <SettingsNS.AutoSyncedNameMap> As_<SettingsNS.AutoS
ignoreKeyboardLayout: "l",
mapModifier: "a",
mouseReachable: "e",
keyboard: "k", linkHintCharacters: "c", linkHintNumbers: "n",
keyboard: "k", linkHintCharacters: "c", linkHintNumbers: "n", passEsc: "p",
regexFindMode: "r", smoothScroll: "s", scrollStepSize: "t", waitForEnter: "w"
})

Expand Down
35 changes: 22 additions & 13 deletions content/insert.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import {
doc, keydownEvents_, safeObj, isTop, set_keydownEvents_, setupEventListener, Stop_, OnChrome, OnFirefox, weakRef_ff,
esc, onWndFocus, isEnabled_, readyState_, injector, recordLog, weakRef_not_ff, OnEdge, getTime, math
esc, onWndFocus, isEnabled_, readyState_, injector, recordLog, weakRef_not_ff, OnEdge, getTime, math, fgCache,
safeCall, timeout_
} from "../lib/utils"
import { post_, runFallbackKey, safePost } from "./port"
import { getParentVApi, ui_box } from "./dom_ui"
import { hudHide } from "./hud"
import { set_currentScrolling, scrollTick, set_cachedScrollable } from "./scroller"
import { set_isCmdTriggered, resetAnyClickHandler, onPassKey } from "./key_handler"
import {
activeEl_unsafe_, getEditableType_, GetShadowRoot_, getSelection_, frameElement_, deepActiveEl_unsafe_,
SafeEl_not_ff_, MDW, fullscreenEl_unsafe_, removeEl_s, isNode_, BU, docHasFocus_, getRootNode_mounted
activeEl_unsafe_, getEditableType_, GetShadowRoot_, getSelection_, frameElement_, deepActiveEl_unsafe_, blur_unsafe,
SafeEl_not_ff_, MDW, fullscreenEl_unsafe_, removeEl_s, isNode_, BU, docHasFocus_, getRootNode_mounted, testMatch,
} from "../lib/dom_utils"
import { pushHandler_, removeHandler_, prevent_ } from "../lib/keyboard_utils"
import { pushHandler_, removeHandler_, prevent_, isEscape_ } from "../lib/keyboard_utils"
import { InputHintItem } from "./link_hints"

const enum kNodeInfo { NONE = 0, ShadowBlur = 1, ShadowFull = 2 }
Expand Down Expand Up @@ -174,21 +175,29 @@ export const focusUpper = (key: kKeyCode, force: boolean, event: ToPrevent | 0):
}
}

export const exitInsertMode = (target: Element): void => {
if (GetShadowRoot_(target)) {
if (target = lock_ as unknown as Element) {
lock_ = null;
(target as LockableElement).blur();
}
} else if (target === lock_ ? (lock_ = null, 1) : getEditableType_(target)) {
(target as LockableElement).blur();
export const exitInsertMode = <(target: Element, event?: HandlerNS.Event) => HandlerResult> ((
target: LockableElement | null, event?: HandlerNS.Event): HandlerResult => {
if (GetShadowRoot_(target!) || target === lock_) {
target = lock_
lock_ = null
} else {
target = getEditableType_(target!) ? target : null
}
let match: boolean | void = !1
const ret = insert_global_ && insert_global_.p || target && event
&& (fgCache.p && (match = safeCall(testMatch, fgCache.p, [target])))
&& isEscape_(event.c) ? HandlerResult.Nothing : HandlerResult.Prevent
if (target) {
ret ? target.blur() : timeout_(blur_unsafe.bind(0, target), 0)
match !== !!match && (fgCache.p = "")
}
if (insert_global_) {
insert_global_.t && runFallbackKey(insert_global_.t, 0)
insert_global_ = null
hudHide();
}
}
return ret
})

export const exitInputHint = (): void => {
if (inputHint) {
Expand Down
6 changes: 2 additions & 4 deletions content/key_handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,10 +209,8 @@ export const onKeydown = (event: KeyboardEventToPrevent): void => {
event.repeat && focusUpper(key, true, event);
action = /* the real is HandlerResult.PassKey; here's for smaller code */ HandlerResult.Nothing;
} else {
action = insert_global_ && insert_global_.p
? (OnChrome && checkAccessKey_cr(eventWrapper), HandlerResult.Nothing)
: HandlerResult.Prevent
/*#__NOINLINE__*/ exitInsertMode(event.target as Element);
OnChrome && checkAccessKey_cr(eventWrapper)
action = /*#__NOINLINE__*/ exitInsertMode(event.target as Element, eventWrapper)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion content/request_handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ set_requestHandlers([
} else if (OnChrome && Build.MinCVer < BrowserVer.MinNewWeakSetWithSetOrArray) {
set_clickable_(parApi ? parApi.y().c : new WeakSet!<Element>())
oldSet.forEach(clickable_.add, clickable_)
} else if (parApi) {
} else if (Build.NDEBUG && parApi) {
set_clickable_(parApi.y().c)
oldSet.forEach(clickable_.add, clickable_);
} else {
Expand Down
4 changes: 2 additions & 2 deletions i18n/zh/help_dialog.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,11 @@
"editText": "向浏览器发送文字编辑指令",
"enableContentSettingTemp": "在无痕窗口中赋予网站对一项功能的使用权限",
"enterFindMode": "进入页内查找模式",
"enterInsertMode": "暂停识别快捷键,按Esc退出",
"enterInsertMode": "暂停识别快捷键,按 ESC 退出",
"enterVisualLineMode": "进入文字选择模式(对齐到行)",
"enterVisualMode": "进入文字自由选择模式",
"firstTab": "切换到左数指定位置的标签页",
"focusInput": "进入文本框选择模式(Tab切换)",
"focusInput": "进入文本框选择模式(Tab 切换)",
"focusOrLaunch": "切换到或新建指定网址的标签页",
"goBack": "在历史记录中后退",
"goForward": "在历史记录中前进",
Expand Down
2 changes: 2 additions & 0 deletions i18n/zh/options.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@
"o93": "任何不以英文字母数字或 “",
"o94": "” 字符开始的行都会被忽略",
"o95": "如何在其它扩展程序的私有页面中使用 Vimium C?",
"o95_2": "ESC 键兼容模式",
"o95_3": "输入文字时,指定在哪些文本框上放行“ESC”的按下事件、并推迟移除焦点。默认值可在部分网站上收起搜索建议。",
"o96": "定制搜索框页面",
"o97": "例如:",
"o98": "或",
Expand Down
11 changes: 11 additions & 0 deletions pages/options.html
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,17 @@
How to inject Vimium C into other extensions?</a>
</div></td>
</tr>
<tr>
<td class="caption" data-i="o95_2">Compatibility<br> of Escape</td>
<td>
<input id="passEsc" type="text" inputmode="text" lang="en" data-model="NonEmptyText" autocomplete="off" />
<div class="info" data-i="nonEmpty">Delete all to reset this option.</div>
</td>
<td class="help"><div class="help-inner break-all" data-i="o95_3">
In plain insert mode, specify when to pass <kbd>Escape</kbd> keydown events to pages and delay blurring.
The default value may collapse some search suggestions.
</div></td>
</tr>
<tr>
<td class="caption" data-i="o96">Preferred<br> Vomnibar page</td>
<td>
Expand Down
2 changes: 1 addition & 1 deletion pages/options_base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ export const bgSettings_ = {
ignoreKeyboardLayout: "l",
mapModifier: "a",
mouseReachable: "e",
keyboard: "k", linkHintCharacters: "c", linkHintNumbers: "n",
keyboard: "k", linkHintCharacters: "c", linkHintNumbers: "n", passEsc: "p",
regexFindMode: "r", smoothScroll: "s", scrollStepSize: "t", waitForEnter: "w"
})
}
Expand Down
23 changes: 12 additions & 11 deletions pages/options_defs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,14 +240,15 @@ export class TextOption_<T extends TextualizedOptionNames> extends Option_<T> {
return p
}
override populateElement_ (value: AllowedOptions[T] | string, enableUndo?: boolean): void {
const value2 = (value as string).replace(<RegExpG> / /g, "\xa0")
const value2 = this.formatValue_(value).replace(<RegExpG> / /g, "\xa0")
if (enableUndo !== true) {
this.element_.value = value2
} else {
this.atomicUpdate_(value2, true, true)
}
}
readRaw_ (): string { return this.element_.value.trim().replace(<RegExpG> /\xa0/g, " ") }
formatValue_ (value: AllowedOptions[T] | string): string { return value as string }
/** @returns `string` in fact */
override readValueFromElement_ (): AllowedOptions[T] {
let value = this.readRaw_()
Expand All @@ -259,7 +260,7 @@ export class TextOption_<T extends TextualizedOptionNames> extends Option_<T> {
}
return value as AllowedOptions[T]
}
override doesPopulateOnSave_ (val: AllowedOptions[T]): boolean { return val !== this.readRaw_() }
override doesPopulateOnSave_ (val: AllowedOptions[T]): boolean { return this.formatValue_(val) !== this.readRaw_() }
showError_ (msg: string, tag?: OptionErrorType | null): void {
const hasError = !!msg
if (!hasError && !this._lastError) { return }
Expand Down Expand Up @@ -318,21 +319,16 @@ export class NonEmptyTextOption_<T extends TextOptionNames> extends TextOption_<

export type JSONOptionNames = PossibleOptionNames<object>
export class JSONOption_<T extends JSONOptionNames> extends TextOption_<T> {
formatValue_ (obj: AllowedOptions[T]): string {
override formatValue_ (obj: AllowedOptions[T]): string {
const one = this.element_ instanceof HTMLInputElement, s0 = JSON.stringify(obj, null, one ? 1 : 2)
return one ? s0.replace(<RegExpG & RegExpSearchable<1>> /(,?)\n\s*/g, (_, s) => s ? ", " : "") : s0
}
override populateElement_ (obj: AllowedOptions[T], enableUndo?: boolean): void {
super.populateElement_(this.formatValue_(obj), enableUndo)
}
override doesPopulateOnSave_ (obj: AllowedOptions[T]): boolean { return this.formatValue_(obj) !== this.readRaw_() }
override readValueFromElement_ (): AllowedOptions[T] {
let value = super.readValueFromElement_(), obj: AllowedOptions[T] = null as never
if (value) {
try {
obj = JSON.parse<AllowedOptions[T]>(value as AllowedOptions[T] & string)
} catch {
}
} catch { /* empty */ }
} else {
obj = bgSettings_.defaults_[this.field_]
this.populateElement_(obj, true)
Expand Down Expand Up @@ -367,8 +363,8 @@ export class MaskedText_<T extends TextOptionNames> extends TextOption_<T> {
}
super.populateElement_(value, enableUndo)
}
override readValueFromElement_ (): AllowedOptions[T] {
return this.masked_ ? this.previous_ : super.readValueFromElement_()
override readRaw_(): string {
return this.masked_ ? this.previous_ : super.readRaw_()
}
}

Expand Down Expand Up @@ -595,3 +591,8 @@ Option_.all_.userDefinedCss.onSave_ = function () {
Option_.all_.autoReduceMotion.onSave_ = function (): void {
nextTick_(() => { toggleReduceMotion(this.previous_) })
}

Option_.all_.passEsc.readValueFromElement_ = function (): string {
return NonEmptyTextOption_.prototype.readValueFromElement_.call(this).replace(<RegExpG> /, /g, ",")
}
Option_.all_.passEsc.formatValue_ = (value: string): string => value.replace(<RegExpG> /,/g, ", ")
1 change: 1 addition & 0 deletions typings/vimium_c.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ declare namespace SettingsNS {
/** filterLinkHints */ f: ["filterLinkHints", boolean];
/** waitForEnter */ w: ["waitForEnter", boolean];
/** mouseReachable */ e: ["mouseReachable", boolean];
/** passEsc */ p: ["passEsc", string];
/** regexFindMode */ r: ["regexFindMode", boolean];
/** scrollStepSize */ t: ["scrollStepSize", number];
/** smoothScroll */ s: ["smoothScroll", boolean];
Expand Down

0 comments on commit ff13a6c

Please sign in to comment.