Add support for frontend hotkeys; add scanSelectedText action (#1266)
* Add support for frontend hotkeys; add scanSelectedText action * Remove unused global * Remove duplicate hotkey handler script
This commit is contained in:
parent
de5d3ec3ad
commit
c875ca728f
@ -47,6 +47,7 @@
|
|||||||
"mixed/js/frame-client.js",
|
"mixed/js/frame-client.js",
|
||||||
"mixed/js/text-scanner.js",
|
"mixed/js/text-scanner.js",
|
||||||
"mixed/js/document-util.js",
|
"mixed/js/document-util.js",
|
||||||
|
"mixed/js/hotkey-handler.js",
|
||||||
"fg/js/dom-text-scanner.js",
|
"fg/js/dom-text-scanner.js",
|
||||||
"fg/js/popup.js",
|
"fg/js/popup.js",
|
||||||
"fg/js/text-source-range.js",
|
"fg/js/text-source-range.js",
|
||||||
|
@ -1011,7 +1011,7 @@
|
|||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": ["popup", "search"],
|
"enum": ["popup", "search", "web"],
|
||||||
"default": "popup"
|
"default": "popup"
|
||||||
},
|
},
|
||||||
"default": ["popup", "search"]
|
"default": ["popup", "search"]
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* global
|
/* global
|
||||||
|
* HotkeyHandler
|
||||||
* PopupFactory
|
* PopupFactory
|
||||||
* PopupPreviewFrame
|
* PopupPreviewFrame
|
||||||
* api
|
* api
|
||||||
@ -27,10 +28,13 @@
|
|||||||
|
|
||||||
const {frameId} = await api.frameInformationGet();
|
const {frameId} = await api.frameInformationGet();
|
||||||
|
|
||||||
|
const hotkeyHandler = new HotkeyHandler();
|
||||||
|
hotkeyHandler.prepare();
|
||||||
|
|
||||||
const popupFactory = new PopupFactory(frameId);
|
const popupFactory = new PopupFactory(frameId);
|
||||||
popupFactory.prepare();
|
popupFactory.prepare();
|
||||||
|
|
||||||
const preview = new PopupPreviewFrame(frameId, popupFactory);
|
const preview = new PopupPreviewFrame(frameId, popupFactory, hotkeyHandler);
|
||||||
await preview.prepare();
|
await preview.prepare();
|
||||||
|
|
||||||
document.documentElement.dataset.loaded = 'true';
|
document.documentElement.dataset.loaded = 'true';
|
||||||
|
@ -23,9 +23,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
class PopupPreviewFrame {
|
class PopupPreviewFrame {
|
||||||
constructor(frameId, popupFactory) {
|
constructor(frameId, popupFactory, hotkeyHandler) {
|
||||||
this._frameId = frameId;
|
this._frameId = frameId;
|
||||||
this._popupFactory = popupFactory;
|
this._popupFactory = popupFactory;
|
||||||
|
this._hotkeyHandler = hotkeyHandler;
|
||||||
this._frontend = null;
|
this._frontend = null;
|
||||||
this._apiOptionsGetOld = null;
|
this._apiOptionsGetOld = null;
|
||||||
this._popupShown = false;
|
this._popupShown = false;
|
||||||
@ -74,7 +75,8 @@ class PopupPreviewFrame {
|
|||||||
useProxyPopup: false,
|
useProxyPopup: false,
|
||||||
pageType: 'web',
|
pageType: 'web',
|
||||||
allowRootFramePopupProxy: false,
|
allowRootFramePopupProxy: false,
|
||||||
childrenSupported: false
|
childrenSupported: false,
|
||||||
|
hotkeyHandler: this._hotkeyHandler
|
||||||
});
|
});
|
||||||
this._frontend.setOptionsContextOverride(this._optionsContext);
|
this._frontend.setOptionsContextOverride(this._optionsContext);
|
||||||
await this._frontend.prepare();
|
await this._frontend.prepare();
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
<script src="/mixed/js/text-scanner.js"></script>
|
<script src="/mixed/js/text-scanner.js"></script>
|
||||||
|
|
||||||
<script src="/mixed/js/document-util.js"></script>
|
<script src="/mixed/js/document-util.js"></script>
|
||||||
|
<script src="/mixed/js/hotkey-handler.js"></script>
|
||||||
<script src="/fg/js/dom-text-scanner.js"></script>
|
<script src="/fg/js/dom-text-scanner.js"></script>
|
||||||
<script src="/fg/js/popup.js"></script>
|
<script src="/fg/js/popup.js"></script>
|
||||||
<script src="/fg/js/text-source-range.js"></script>
|
<script src="/fg/js/text-source-range.js"></script>
|
||||||
|
@ -3014,10 +3014,15 @@
|
|||||||
<option value="viewNote" data-scopes="popup search">View note</option>
|
<option value="viewNote" data-scopes="popup search">View note</option>
|
||||||
<option value="playAudio" data-scopes="popup search">Play audio</option>
|
<option value="playAudio" data-scopes="popup search">Play audio</option>
|
||||||
<option value="copyHostSelection" data-scopes="popup search">Copy selection</option>
|
<option value="copyHostSelection" data-scopes="popup search">Copy selection</option>
|
||||||
|
<option value="scanSelectedText" data-scopes="web">Scan selected text</option>
|
||||||
</select>
|
</select>
|
||||||
<div class="hotkey-list-item-flex-row">
|
<div class="hotkey-list-item-flex-row">
|
||||||
<div class="hotkey-list-item-flex-row-label">Scopes:</div>
|
<div class="hotkey-list-item-flex-row-label">Scopes:</div>
|
||||||
<div class="hotkey-list-item-flex-row">
|
<div class="hotkey-list-item-flex-row">
|
||||||
|
<label class="hotkey-scope-checkbox-container" data-scope="web">
|
||||||
|
<label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="web"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
|
||||||
|
<span>Web</span>
|
||||||
|
</label>
|
||||||
<label class="hotkey-scope-checkbox-container" data-scope="popup">
|
<label class="hotkey-scope-checkbox-container" data-scope="popup">
|
||||||
<label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="popup"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
|
<label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="popup"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label>
|
||||||
<span>Popup</span>
|
<span>Popup</span>
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
/* global
|
/* global
|
||||||
* Frontend
|
* Frontend
|
||||||
|
* HotkeyHandler
|
||||||
* PopupFactory
|
* PopupFactory
|
||||||
* api
|
* api
|
||||||
*/
|
*/
|
||||||
@ -31,6 +32,9 @@
|
|||||||
throw new Error('Failed to get frameId');
|
throw new Error('Failed to get frameId');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hotkeyHandler = new HotkeyHandler();
|
||||||
|
hotkeyHandler.prepare();
|
||||||
|
|
||||||
const popupFactory = new PopupFactory(frameId);
|
const popupFactory = new PopupFactory(frameId);
|
||||||
popupFactory.prepare();
|
popupFactory.prepare();
|
||||||
|
|
||||||
@ -42,7 +46,8 @@
|
|||||||
parentFrameId: null,
|
parentFrameId: null,
|
||||||
useProxyPopup: false,
|
useProxyPopup: false,
|
||||||
pageType: 'web',
|
pageType: 'web',
|
||||||
allowRootFramePopupProxy: true
|
allowRootFramePopupProxy: true,
|
||||||
|
hotkeyHandler
|
||||||
});
|
});
|
||||||
await frontend.prepare();
|
await frontend.prepare();
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
* DocumentUtil
|
* DocumentUtil
|
||||||
* TextScanner
|
* TextScanner
|
||||||
* TextSourceElement
|
* TextSourceElement
|
||||||
|
* TextSourceRange
|
||||||
* api
|
* api
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -32,7 +33,8 @@ class Frontend {
|
|||||||
parentFrameId,
|
parentFrameId,
|
||||||
useProxyPopup,
|
useProxyPopup,
|
||||||
allowRootFramePopupProxy,
|
allowRootFramePopupProxy,
|
||||||
childrenSupported=true
|
childrenSupported=true,
|
||||||
|
hotkeyHandler
|
||||||
}) {
|
}) {
|
||||||
this._pageType = pageType;
|
this._pageType = pageType;
|
||||||
this._popupFactory = popupFactory;
|
this._popupFactory = popupFactory;
|
||||||
@ -43,6 +45,7 @@ class Frontend {
|
|||||||
this._useProxyPopup = useProxyPopup;
|
this._useProxyPopup = useProxyPopup;
|
||||||
this._allowRootFramePopupProxy = allowRootFramePopupProxy;
|
this._allowRootFramePopupProxy = allowRootFramePopupProxy;
|
||||||
this._childrenSupported = childrenSupported;
|
this._childrenSupported = childrenSupported;
|
||||||
|
this._hotkeyHandler = hotkeyHandler;
|
||||||
this._popup = null;
|
this._popup = null;
|
||||||
this._disabledOverride = false;
|
this._disabledOverride = false;
|
||||||
this._options = null;
|
this._options = null;
|
||||||
@ -71,6 +74,10 @@ class Frontend {
|
|||||||
['setAllVisibleOverride', {async: true, handler: this._onApiSetAllVisibleOverride.bind(this)}],
|
['setAllVisibleOverride', {async: true, handler: this._onApiSetAllVisibleOverride.bind(this)}],
|
||||||
['clearAllVisibleOverride', {async: true, handler: this._onApiClearAllVisibleOverride.bind(this)}]
|
['clearAllVisibleOverride', {async: true, handler: this._onApiClearAllVisibleOverride.bind(this)}]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
this._hotkeyHandler.registerActions([
|
||||||
|
['scanSelectedText', this._onActionScanSelectedText.bind(this)]
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
get canClearSelection() {
|
get canClearSelection() {
|
||||||
@ -161,6 +168,12 @@ class Frontend {
|
|||||||
this._signalFrontendReady(frameId);
|
this._signalFrontendReady(frameId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Action handlers
|
||||||
|
|
||||||
|
_onActionScanSelectedText() {
|
||||||
|
this._scanSelectedText();
|
||||||
|
}
|
||||||
|
|
||||||
// API message handlers
|
// API message handlers
|
||||||
|
|
||||||
_onApiGetUrl() {
|
_onApiGetUrl() {
|
||||||
@ -319,6 +332,8 @@ class Frontend {
|
|||||||
const {scanning: scanningOptions, sentenceParsing: sentenceParsingOptions} = options;
|
const {scanning: scanningOptions, sentenceParsing: sentenceParsingOptions} = options;
|
||||||
this._options = options;
|
this._options = options;
|
||||||
|
|
||||||
|
this._hotkeyHandler.setHotkeys('web', options.inputs.hotkeys);
|
||||||
|
|
||||||
await this._updatePopup();
|
await this._updatePopup();
|
||||||
|
|
||||||
const preventMiddleMouse = this._getPreventMiddleMouseValueForPageType(scanningOptions.preventMiddleMouse);
|
const preventMiddleMouse = this._getPreventMiddleMouseValueForPageType(scanningOptions.preventMiddleMouse);
|
||||||
@ -646,4 +661,23 @@ class Frontend {
|
|||||||
detail: {documentTitle}
|
detail: {documentTitle}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async _scanSelectedText() {
|
||||||
|
const range = this._getFirstNonEmptySelectionRange();
|
||||||
|
if (range === null) { return false; }
|
||||||
|
const source = new TextSourceRange(range, range.toString(), null, null);
|
||||||
|
await this._textScanner.search(source, {focus: true});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_getFirstNonEmptySelectionRange() {
|
||||||
|
const selection = window.getSelection();
|
||||||
|
for (let i = 0, ii = selection.rangeCount; i < ii; ++i) {
|
||||||
|
const range = selection.getRangeAt(i);
|
||||||
|
if (range.toString().length > 0) {
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
"mixed/js/frame-client.js",
|
"mixed/js/frame-client.js",
|
||||||
"mixed/js/text-scanner.js",
|
"mixed/js/text-scanner.js",
|
||||||
"mixed/js/document-util.js",
|
"mixed/js/document-util.js",
|
||||||
|
"mixed/js/hotkey-handler.js",
|
||||||
"fg/js/dom-text-scanner.js",
|
"fg/js/dom-text-scanner.js",
|
||||||
"fg/js/popup.js",
|
"fg/js/popup.js",
|
||||||
"fg/js/text-source-range.js",
|
"fg/js/text-source-range.js",
|
||||||
|
@ -1640,7 +1640,8 @@ class Display extends EventDispatcher {
|
|||||||
popupFactory,
|
popupFactory,
|
||||||
pageType: this._pageType,
|
pageType: this._pageType,
|
||||||
allowRootFramePopupProxy: true,
|
allowRootFramePopupProxy: true,
|
||||||
childrenSupported: this._childrenSupported
|
childrenSupported: this._childrenSupported,
|
||||||
|
hotkeyHandler: this._hotkeyHandler
|
||||||
});
|
});
|
||||||
|
|
||||||
const frontend = new Frontend(setupNestedPopupsOptions);
|
const frontend = new Frontend(setupNestedPopupsOptions);
|
||||||
|
Loading…
Reference in New Issue
Block a user