|
@@ -1,112 +1,23 @@
|
|
-/*
|
|
|
|
-The way the extension works is, once you hover a link:
|
|
|
|
-If something is already selected in the page, it does nothing. Else, it
|
|
|
|
-takes the URL of the link you are hovering, copies it to an invisible span,
|
|
|
|
-programmatically selects the span.
|
|
|
|
|
|
+let popSoundUrl = chrome.runtime.getURL('sounds/pop.mp3');
|
|
|
|
+let popSoundAudio = new Audio(popSoundUrl);
|
|
|
|
|
|
-Now when you hits Cmd-C (Ctrl-C), the hidden selection is copied to clipboard.
|
|
|
|
-
|
|
|
|
-When you move pointer away from the link, it
|
|
|
|
-clears the hidden selection, clears the invisible span.
|
|
|
|
-
|
|
|
|
-If, at the time of hover, the cursor was in a textbox (without anything selected),
|
|
|
|
-it is technically a zero-length selection in Chrome. So, the extension goes ahead and clears that selection
|
|
|
|
-(thereby taking the cursor away from the textbox), saving the caret position.
|
|
|
|
-When you move away from the link, the caret position is restored.
|
|
|
|
-*/
|
|
|
|
-
|
|
|
|
-COPYL_DEBUG = false;
|
|
|
|
-
|
|
|
|
-let url = chrome.runtime.getURL('sounds/pop.mp3');
|
|
|
|
-let a = new Audio(url);
|
|
|
|
-var previousCaretPosition = -1;
|
|
|
|
-var linkAddress = $('<span id="copylAddress" style="display: inline-block;" />');
|
|
|
|
-$('body').append(linkAddress);
|
|
|
|
-/* This is a DOM element that has to be selectable but not visible to anybody */
|
|
|
|
-linkAddress.css({position: 'absolute', left:'-9999em'});
|
|
|
|
|
|
+function getAbsoluteURL(url) {
|
|
|
|
+ var link = document.createElement("a");
|
|
|
|
+ link.href = url;
|
|
|
|
+ return (link.protocol + "//" + link.host + link.pathname);
|
|
|
|
+}
|
|
|
|
|
|
-/* when the user presses y (=yank), copy URL to clipboard when hovering */
|
|
|
|
window.onkeydown = function(event) {
|
|
window.onkeydown = function(event) {
|
|
- if (event.key == "y") {
|
|
|
|
- if (linkAddress.text().length != 0) {
|
|
|
|
- document.execCommand('copy');
|
|
|
|
- a.play();
|
|
|
|
|
|
+ var hoveredLink = $('a:hover');
|
|
|
|
+ if (hoveredLink.length) {
|
|
|
|
+ if (event.key == "x") {
|
|
|
|
+ navigator.clipboard.writeText(hoveredLink.text())
|
|
|
|
+ } else if (event.key == "y") {
|
|
|
|
+ var hoveredHrefAttr = hoveredLink.attr('href');
|
|
|
|
+ navigator.clipboard.writeText(getAbsoluteURL(hoveredHrefAttr));
|
|
|
|
+ } else {
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
+ popSoundAudio.play();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-function write_to_console(text) {
|
|
|
|
- if (COPYL_DEBUG)
|
|
|
|
- console.log(text);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-function selectElement(el) {
|
|
|
|
- /* Check if anything is currently selected, if so backup */
|
|
|
|
- if (window.getSelection().rangeCount > 0) {
|
|
|
|
- previousCaretPosition = document.activeElement.selectionStart;
|
|
|
|
- }
|
|
|
|
- write_to_console("Previous cursor position: " + previousCaretPosition);
|
|
|
|
- var range = document.createRange();
|
|
|
|
-
|
|
|
|
- write_to_console("Selecting element " + el);
|
|
|
|
- write_to_console("el[0] is " + el[0]);
|
|
|
|
- range.selectNodeContents(el[0]);
|
|
|
|
- write_to_console("Range: " + range);
|
|
|
|
-
|
|
|
|
- write_to_console("Window selection range count before: " + window.getSelection().rangeCount);
|
|
|
|
- if (window.getSelection().rangeCount > 0) {
|
|
|
|
- window.getSelection().removeAllRanges();
|
|
|
|
- }
|
|
|
|
- write_to_console("Window selection range count now: " + window.getSelection().rangeCount);
|
|
|
|
-
|
|
|
|
- write_to_console("Active Element: " + document.activeElement);
|
|
|
|
- window.getSelection().addRange(range);
|
|
|
|
- write_to_console("Window selection range count after: " + window.getSelection().rangeCount);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-function clearLinkAddress() {
|
|
|
|
- if (linkAddress.text()) {
|
|
|
|
- linkAddress.text("");
|
|
|
|
- linkAddress.blur();
|
|
|
|
- write_to_console("Cleared linkAddress");
|
|
|
|
-
|
|
|
|
- write_to_console("window.getSelection: " + window.getSelection());
|
|
|
|
- window.getSelection().removeAllRanges();
|
|
|
|
- }
|
|
|
|
- if (previousCaretPosition != -1)
|
|
|
|
- {
|
|
|
|
- document.activeElement.selectionStart = previousCaretPosition;
|
|
|
|
- write_to_console("Previous cursor position set: " + document.activeElement.selectionStart);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- write_to_console("Current selection: " + window.getSelection().toString());
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-$(function() {
|
|
|
|
- /* The code attaches itself to all anchor elements */
|
|
|
|
- $("html").on("mouseenter", "a", function(){
|
|
|
|
- /* Everytime the user hovers (enters) a link */
|
|
|
|
- if(window.getSelection().toString()) {
|
|
|
|
- write_to_console("Something is already selected. Don't do anything.");
|
|
|
|
- } else {
|
|
|
|
- write_to_console("Nothing is selected.");
|
|
|
|
-
|
|
|
|
- linkAddress.text($(this).prop('href'));
|
|
|
|
- write_to_console("linkAddress: " + linkAddress.text());
|
|
|
|
- selectElement(linkAddress);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- write_to_console("Current Selection: " + window.getSelection().toString());
|
|
|
|
- }).on("mouseleave", "a", function(){
|
|
|
|
- /* Every time the user leaves a link */
|
|
|
|
- write_to_console("Leaving link.");
|
|
|
|
- clearLinkAddress();
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- $(window).on("beforeunload", function() {
|
|
|
|
- clearLinkAddress();
|
|
|
|
- });
|
|
|
|
-});
|
|
|
|
-
|
|
|