Skip to content

Commit 8e58167

Browse files
committed
Fixed #2299 Always use mouse event to open link in new tab
1 parent 6288aed commit 8e58167

File tree

4 files changed

+25
-50
lines changed

4 files changed

+25
-50
lines changed

src/content_scripts/common/hints.js

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ div.hint-scrollable {
335335
if (!behaviours.multipleHits) {
336336
self.exit();
337337
}
338-
var tabbed = behaviours.tabbed, active = behaviours.active;
338+
let tabbed = behaviours.tabbed, active = behaviours.active;
339339
if (behaviours.multipleHits) {
340340
const href = element.getAttribute('href');
341341
if (href !== null && href !== "#") {
@@ -344,30 +344,20 @@ div.hint-scrollable {
344344
}
345345
}
346346

347+
const mouseEventModifiers = {shiftKey: shiftKey || active};
347348
if (shiftKey && runtime.conf.hintShiftNonActive) {
348349
tabbed = true;
349-
active = false;
350-
} else if (shiftKey && getBrowserName() === "Firefox") {
351-
// mouseButton does not work for firefox in mouse event.
352-
tabbed = true;
353-
active = true;
350+
mouseEventModifiers.shiftKey = false;
351+
}
352+
if (tabbed) {
353+
const modKey = (navigator.platform.indexOf("Mac") !== -1) ? "metaKey" : "ctrlKey";
354+
mouseEventModifiers[modKey] = true;
354355
}
355-
356356
flashPressedLink(element,() => {
357-
if (tabbed) {
358-
RUNTIME("openLink", {
359-
tab: {
360-
tabbed: tabbed,
361-
active: active
362-
},
363-
url: getHref(element)
364-
});
365-
} else {
366-
self.mouseoutLastElement();
367-
dispatchMouseEvent(element, behaviours.mouseEvents, shiftKey);
368-
dispatchSKEvent("observer", ['turnOn']);
369-
lastMouseTarget = element;
370-
}
357+
self.mouseoutLastElement();
358+
dispatchMouseEvent(element, behaviours.mouseEvents, mouseEventModifiers);
359+
dispatchSKEvent("observer", ['turnOn']);
360+
lastMouseTarget = element;
371361

372362
if (behaviours.multipleHits) {
373363
setTimeout(resetHints, 300);
@@ -466,11 +456,7 @@ div.hint-scrollable {
466456
function hide() {
467457
// To reset default behaviours here is necessary, as some hint my be hit without creation.
468458
behaviours = {
469-
active: true,
470-
tabbed: false,
471-
regionalHints: false,
472-
mouseEvents: ['mouseover', 'pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click', 'focus', 'focusin'],
473-
multipleHits: false
459+
mouseEvents: MOUSE_EVENTS
474460
};
475461
setSanitizedContent(holder, "");
476462
holder.remove();
@@ -736,21 +722,13 @@ div.hint-scrollable {
736722
}
737723

738724
function createHintsForElements(elements, attrs) {
739-
attrs = Object.assign({
740-
active: true,
741-
tabbed: false,
742-
mouseEvents: MOUSE_EVENTS,
743-
multipleHits: false,
744-
filterInvisible: true
745-
}, attrs || {});
725+
attrs = attrs || {};
746726
for (var attr in attrs) {
747727
behaviours[attr] = attrs[attr];
748728
}
749729
self.statusLine = (attrs && attrs.statusLine) || "Hints to click";
750730

751-
if (attrs.filterInvisible) {
752-
elements = filterInvisibleElements(elements);
753-
}
731+
elements = filterInvisibleElements(elements);
754732
if (elements.length > 0) {
755733
placeHints(elements);
756734
}
@@ -760,16 +738,11 @@ div.hint-scrollable {
760738
function createHintsForClick(cssSelector, attrs) {
761739
self.statusLine = "Hints to click";
762740

763-
attrs = Object.assign({
764-
active: true,
765-
tabbed: false,
766-
mouseEvents: MOUSE_EVENTS,
767-
multipleHits: false
768-
}, attrs || {});
741+
attrs = attrs || {};
769742
for (var attr in attrs) {
770743
behaviours[attr] = attrs[attr];
771744
}
772-
var elements;
745+
let elements;
773746
if (cssSelector === "") {
774747
elements = getVisibleElements(function(e, v) {
775748
if (isElementClickable(e)) {
@@ -991,7 +964,7 @@ div.hint-scrollable {
991964

992965
self.mouseoutLastElement = function() {
993966
if (lastMouseTarget) {
994-
dispatchMouseEvent(lastMouseTarget, ['mouseout'], false);
967+
dispatchMouseEvent(lastMouseTarget, ['mouseout'], {});
995968
lastMouseTarget = null;
996969
}
997970
};

src/content_scripts/common/utils.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,15 +305,17 @@ function initSKFunctionListener(name, interfaces, capture) {
305305
return callbacks;
306306
}
307307

308-
function dispatchMouseEvent(element, events, shiftKey) {
308+
function dispatchMouseEvent(element, events, modifiers) {
309309
events.forEach(function(eventName) {
310-
var mouseButton = shiftKey ? 1 : 0;
311-
var event = new MouseEvent(eventName, {
310+
const event = new MouseEvent(eventName, {
312311
bubbles: true,
313312
cancelable: true,
314313
composed: true,
315314
view: window,
316-
button: mouseButton
315+
ctrlKey: modifiers.ctrlKey,
316+
altKey: modifiers.altKey,
317+
shiftKey: modifiers.shiftKey,
318+
metaKey: modifiers.metaKey
317319
});
318320
element.dispatchEvent(event);
319321
});

src/content_scripts/common/visual.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ function createVisual(clipboard, hints) {
290290
});
291291
function clickLink(element, shiftKey) {
292292
flashPressedLink(element, () => {
293-
dispatchMouseEvent(element, ['click'], shiftKey);
293+
dispatchMouseEvent(element, ['click'], {shiftKey});
294294
});
295295
}
296296
self.mappings.add(KeyboardUtils.encodeKeystroke("<Enter>"), {

src/content_scripts/content.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ div.surfingkeys_hints_host {
44
color-scheme: auto;
55
position: absolute;
66
inset: 0 0 auto 0;
7-
overflow: hidden;
7+
overflow: visible;
88
}
99
div.surfingkeys_match_mark {
1010
background-color: #ff0;

0 commit comments

Comments
 (0)