]> git.ktnx.net Git - icedeb.git/blobdiff - icedeb.js
fixup for d28e9ea: add support for clipboard.readText()
[icedeb.git] / icedeb.js
index dcd1197506839e86cebcd3920cb37f021f2a0fb2..41117778fa9a08fc08acb30ff44b05acb69b465b 100644 (file)
--- a/icedeb.js
+++ b/icedeb.js
@@ -30,38 +30,97 @@ function trim(word) {
     word = word.replace(/^[^a-zA-Z0-9]+/, '');
     word = word.replace(/[^a-zA-Z0-9]+$/, '');
     word = word.replace(/^Bug#/i, '');
+    word = word.replace(/^#/, '');
   } while ( oldword != word );
 
   return word;
 }
 
 function open_tab(url) {
-  browser.tabs.create({url:url})
-    .then(
-      function() {},
-      function(err) {
-        console.log('Error creating tab', err);
-      }
-    );
+  return new Promise((resolve, reject) => {
+    browser.tabs.create({url:url, active:false})
+      .then(
+        function() {
+          resolve();
+        },
+        function(err) {
+          //console.log('Error creating tab', err);
+          reject(err);
+        }
+      );
+  });
 }
 
-document.addEventListener('click', (e) => {
-  console.log(e.button);
-  if ( !e.target.classList.contains('icedeb-button') )
-    return;
+function open_link(url, in_new_tab) {
+  //console.log('open_link', url, in_new_tab);
+
+  if (in_new_tab) {
+    return open_tab(url);
+  }
+
+  //console.log('querying active tab');
+  return new Promise((resolve, reject) => {
+    browser.tabs.query({active:true, currentWindow:true})
+      .then(
+        function(tabs) {
+          //console.log('active tab queried');
+          browser.tabs.executeScript(tabs[0].id, {file: '/icedeb-content.js'})
+            .then(
+              function(){
+                //console.log('content script executed');
+                browser.tabs.sendMessage( tabs[0].id, {url:url} )
+                  .then(
+                    function() {
+                      //console.log('message sent');
+                      resolve();
+                    },
+                    function(err) {
+                      console.log('error sending message', err);
+                      reject(err);
+                    }
+                  );
+              },
+              function(err){
+                console.log('Error executing script. Probably a system tab is active', err, tabs[0]);
+                open_tab(url)
+                  .then(
+                    function() { resolve(); },
+                    function(err) { reject(err); } );
+              });
 
+        },
+        function(err) {
+          console.log('Error querying the active tab of the current window', err);
+          open_tab(url)
+            .then(
+              function() { resolve(); },
+              function(err) { reject(err) }
+            );
+        }
+      );
+  });
+}
+
+function link_clicked(e) {
+  //console.log(e.target.tagName);
   let autoclose = true;
 
-  let clip_input = document.getElementById("clipboard");
-  clip_input.focus();
-  if (!document.execCommand("paste")) {
-    let err = document.getElementById('error');
-    err.textContent = 'Error executing Paste';
-    err.classList.remove('hidden');
-    return;
+  if (e.target.tagName == 'A') {
+    open_link(e.target.href, e.button == 1)
+      .then( function() {
+        if (autoclose) {
+          //console.log('closing pop-up');
+          window.close();
+        }
+      });
+    e.preventDefault();
+    return false;
   }
 
-  let clip = trim(clip_input.textContent);
+  let clip_input = document.getElementById("clipboard");
+  let clip = trim(clip_input.value);
+
+  if(clip_input.value == '') return;
 
   let url;
 
@@ -79,63 +138,119 @@ document.addEventListener('click', (e) => {
       url = 'https://lists.debian.org/msgid-search/' + clip;
       break;
     case 'ddpo':
-      url = 'https://qa.debian.org/developer.php';
-      if (clip != '')
-        url += '?login=' + clip;
+      url = 'https://qa.debian.org/developer.php?login=' + clip;
+      break;
+    case 'dmd':
+      url = 'https://udd.debian.org/dmd.cgi?email1=' + clip;
       break;
     case 'buildd':
       url = 'https://buildd.debian.org/' + clip;
       break;
     case 'security':
-      url = 'https://security-tracker.debian.org/';
-      if (clip != '')
-        url += 'tracker/' + clip;
+      clip = clip.replace(' ', '-');
+      clip = clip.toUpperCase();
+      url = 'https://security-tracker.debian.org/tracker/' + clip;
+      break;
+    case 'piuparts':
+      url = `https://piuparts.debian.org/sid/source/${clip.substring(0,1)}/${clip}.html`;
+      break;
+    case 'r-b':
+      url = 'https://tests.reproducible-builds.org/debian/rb-pkg/' + clip + '.html';
       break;
   }
 
-  if (e.button == 1) {
-    open_tab(url);
-    if (autoclose) window.close();
-    return;
-  }
-
-  browser.tabs.query({active:true, currentWindow:true})
-    .then(
-      function(tabs) {
-        browser.tabs.executeScript(tabs[0].id, {file: '/icedeb-content.js'})
-          .then(
-            function(){
-              browser.tabs.sendMessage( tabs[0].id, {url:url} );
-              if (autoclose) window.close();
-            },
-            function(err){
-              console.log('Error executing script', err);
-            });
-
-      },
-      function(err) {
-        console.log('Error querying the active tab of the current window', err);
-        open_tab(url);
-        if (autoclose) window.close();
+  open_link(url, e.button == 1)
+    .then( function() {
+      if (autoclose) {
+        //console.log('closing pop-up');
+        window.close();
       }
-    );
-});
+    });
 
-document.addEventListener('change', (e) => {
-  if ( !e.target.classList.contains('icedeb-option') )
-    return;
+  e.preventDefault();
+  return false;
+}
 
-  save_settings();
-});
+function check_likely_inputs(q) {
+  let cnt = document.getElementById('button-list-container').classList;
+
+  cnt.remove('like-b', 'like-p', 'like-m', 'like-i', 'like-s');
+  document.querySelectorAll('.likely')
+    .forEach((el) => {
+        el.classList.remove('likely');
+    });
+
+  q = q.replace(/^\s+/, '');
+  q = q.replace(/\s+$/, '');
 
-browser.runtime.getPlatformInfo()
-  .then(function(info) {
-    console.log(info.os);
+  if ( /^#?\d+$/.test(q) || /^CVE-/.test(q) )
+    cnt.add('like-b');
 
-    switch (info.os) {
-      case 'linux':
-      case 'openbsd':
-        document.getElementById('sorry').classList.remove('hidden');
-        break;
+  if ( /^[a-z0-9][a-z0-9\-+.]+$/.test(q) )
+    cnt.add('like-p');
+
+  if ( /.@[a-z0-9-]/i.test(q) )
+    cnt.add('like-m');
+
+  if ( /^<.+@.+>$/.test(q) )
+    cnt.add('like-i');
+
+  if ( /^d[sl]a[- ]\d+(-\d+)?$/i.test(q) )
+    cnt.add('like-s');
+
+  document.querySelectorAll('.like-b .hint.b, .like-p .hint.p, .like-m .hint.m, .like-i .hint.i, .like-s .hint.s')
+    .forEach((el) => {
+      el.parentElement.parentElement.classList.add('likely');
+    } );
+}
+
+function react_to_clipboard_text(text) {
+  let clip_input = document.getElementById("clipboard");
+  clip_input.value = text;
+  clip_input.focus();
+  clip_input.setSelectionRange(0, clip_input.value.length);
+
+  check_likely_inputs(text);
+}
+
+function get_clipboard_contents() {
+  if (navigator.clipboard && navigator.clipboard.readText) {
+    navigator.clipboard.readText().then(function(q){
+      react_to_clipboard_text(q);
+    });
+  }
+  else {
+    let clip_pot = document.getElementById('clip-pot');
+    let clip_input = document.getElementById("clipboard");
+    clip_pot.focus();
+    if (document.execCommand("Paste")) {
+      let q = clip_pot.textContent.trim();
+      react_to_clipboard_text(q);
     }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', (e) => {
+  document.querySelectorAll('.icedeb-button, #button-list-container a')
+    .forEach(function(el){
+      el.addEventListener('mouseup', link_clicked);
+    });
+
+  document.querySelector('#clipboard')
+    .addEventListener('input', function(ev) {
+      check_likely_inputs(ev.target.value);
+    });
+
+  document.addEventListener('change', (e) => {
+    if ( !e.target.classList.contains('icedeb-option') )
+      return;
+
+    save_settings();
+  });
+
+  window.requestAnimationFrame(()=>{
+    window.requestAnimationFrame(get_clipboard_contents);
   });
+});
+
+// vim: sw=2