forked from iorate/uSuperDrag
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcontentscript.js
More file actions
126 lines (126 loc) · 4.54 KB
/
contentscript.js
File metadata and controls
126 lines (126 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
chrome.storage.sync.get({
enableTextSearch: true,
searchUrl: 'https://www.google.com/search?q=%s',
enableLinkOpen: true,
enableLinkTextSelect: false
}, items => {
if (items.enableTextSearch || items.enableLinkOpen) {
const isTextArea = element => element.matches(
'input[type="email"], input[type="number"], input[type="password"], input[type="search"], ' +
'input[type="tel"], input[type="text"], input[type="url"], textarea'
) && !element.disabled;
document.addEventListener('dragover', event => {
if (event.dataTransfer.types.includes('text/uri-list')) {
if (items.enableLinkOpen) {
event.dataTransfer.dropEffect = 'link';
event.preventDefault();
}
} else if (event.dataTransfer.types.includes('text/plain')) {
if (items.enableTextSearch && !isTextArea(event.target)) {
event.dataTransfer.dropEffect = 'link';
event.preventDefault();
}
}
}, false);
document.addEventListener('drop', event => {
if (event.dataTransfer.types.includes('text/uri-list')) {
if (items.enableLinkOpen) {
const url = event.dataTransfer.getData('URL');
chrome.runtime.sendMessage(url);
event.preventDefault();
}
} else if (event.dataTransfer.types.includes('text/plain')) {
if (items.enableTextSearch && !isTextArea(event.target)) {
const keyword = event.dataTransfer.getData('text/plain');
const url = items.searchUrl.replace(/%s/gi, encodeURIComponent(keyword));
chrome.runtime.sendMessage(url);
event.preventDefault();
}
}
}, false);
}
if (items.enableLinkTextSelect) {
// The original code is copyrighted by Griever and licensed under the MIT license.
class LinkDragSelection {
constructor() {
this.init(...arguments);
}
init(event) {
this.moved_flag = false;
this.range = document.caretRangeFromPoint(event.clientX, event.clientY);
const sel = getSelection();
if (!sel.isCollapsed &&
sel.getRangeAt(0).isPointInRange(this.range.startContainer, this.range.startOffset)) {
return;
}
this.screenX = event.screenX;
this.screenY = event.screenY;
document.addEventListener('mousemove', this, false);
document.addEventListener('mouseup', this, false);
}
uninit() {
document.removeEventListener('mousemove', this, false);
document.removeEventListener('mouseup', this, false);
document.removeEventListener('dragstart', this, false);
setTimeout(() => {
document.removeEventListener('click', this, false);
}, 100);
}
handleEvent(event) {
switch(event.type) {
case 'mousemove':
if (this.moved_flag) {
const range = document.caretRangeFromPoint(event.clientX, event.clientY);
if (range) {
getSelection().extend(range.startContainer, range.startOffset);
}
} else {
this.moveX = event.screenX;
this.moveY = event.screenY;
this.checkXY();
}
break;
case 'mouseup':
this.uninit();
break;
case 'dragstart':
event.currentTarget.removeEventListener(event.type, this, false);
if (this.moved_flag) {
event.preventDefault();
event.stopPropagation();
} else {
this.checkXY();
}
break;
case 'click':
event.currentTarget.removeEventListener(event.type, this, false);
if (!getSelection().isCollapsed) {
event.preventDefault();
event.stopPropagation();
}
break;
}
}
selectionStart() {
this.moved_flag = true;
getSelection().collapse(this.range.startContainer, this.range.startOffset);
document.addEventListener('dragstart', this, false);
document.addEventListener('click', this, false);
}
checkXY() {
const x = Math.abs(this.screenX - this.moveX);
const y = Math.abs(this.screenY - this.moveY);
if (x >= 4 && x > y) {
this.selectionStart();
} else if (y >= 4) {
this.uninit();
}
}
}
document.addEventListener('mousedown', event => {
if (event.button == 0 && !event.altKey && event.target.matches('a[href], a[href] *')) {
new LinkDragSelection(event);
}
}, false);
}
});