From cb544703ad234bf9efea96ffa59814a9bf46f967 Mon Sep 17 00:00:00 2001 From: MatMoul Date: Sun, 1 Oct 2017 21:27:06 +0200 Subject: [PATCH] Improvement --- src/js/background.js | 60 ++++++++++++++++++++++++++++++++++--------- src/js/dial.js | 15 ++++++++++- src/manifest.json | 4 ++- src/src.zip | Bin 0 -> 20082 bytes 4 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 src/src.zip diff --git a/src/js/background.js b/src/js/background.js index ef0ec53..36cedc5 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -112,10 +112,12 @@ core.Bookmarks.getItem = function(bookmarkItem, path){ // Return BookmarkItem fr core.SiteInfos = {} // Siteinfos helper object core.SiteInfos.loadInfos = function(url, args, callback){ // args: { icon: false; screenshot: false }, callback( { url, title, (/!\ Not handled now)icon, screenshot } || error: {} ) - function pageLoaded(last){ + function pageLoaded(){ + if(!iframe) return; var docTitle = iframe.contentWindow.document.title; var docIcon = null; var docScreenshot = null; + if(docTitle == '') docTitle = url; if(args && args.icon){ // } @@ -134,26 +136,29 @@ core.SiteInfos.loadInfos = function(url, args, callback){ // args: { icon: false docScreenshot = canvas.toDataURL(); } - if(last) document.body.removeChild(iframe); + document.body.removeChild(iframe); + iframe = null; if(callback) callback({ url: url, title: docTitle, icon: docIcon, screenshot:docScreenshot }); } - var previewWidth = 1200; // Need to be linked to settings + var previewWidth = 1200; // Need to be linked to settings var previewHeight = 710; // Need to be linked to settings - var iframe = document.createElement('iframe'); - iframe.width = previewWidth - iframe.height = previewHeight - iframe.style.position = 'absolute'; - iframe.style.visibility = 'hidden'; + var iframe; var xmlHttp = new XMLHttpRequest(); xmlHttp.timeout = 10000 xmlHttp.open('GET', url, true); xmlHttp.onload = function(){ + iframe = document.createElement('iframe'); + iframe.referrerPolicy = "unsafe-url"; + iframe.width = previewWidth + iframe.height = previewHeight + iframe.style.position = 'absolute'; + iframe.style.visibility = 'hidden'; document.body.appendChild(iframe); - iframe.srcdoc = xmlHttp.responseText.replace('', ''); - //iframe.srcdoc = xmlHttp.responseText.replace('', ''); - setTimeout(function(){ pageLoaded(); }, 2000); // /!\ Caution function can be shortcuted and sendtimeout is not the best way - setTimeout(function(){ pageLoaded(true); }, 6000); // /!\ Caution function can be shortcuted and sendtimeout is not the best way + var content = xmlHttp.responseText.replace('', ''); + iframe.srcdoc = content; + iframe.onload = function(){ pageLoaded(); } + setTimeout(function(){ pageLoaded(); }, 6000); } xmlHttp.onabort = function(){ if(callback) callback(); } xmlHttp.onerror = function(){ if(callback) callback(); } @@ -230,6 +235,8 @@ core.GridNodes.getNode = function(gridNode, path){ // Return GridNode from RootG return null; } core.GridNodes.refreshNode = function(gridNode, callback){ // Refresh content of a GridNode + if(gridNode.__isLoading == true) return; + gridNode.__isLoading = true; core.SiteInfos.loadInfos(gridNode.url, { screenshot: true }, function(infos){ if(infos){ gridNode.title = infos.title; @@ -239,6 +246,7 @@ core.GridNodes.refreshNode = function(gridNode, callback){ // Refresh content of }).then(function(bookmarkItem){}, function(){}); core.Settings.save(); } + gridNode.__isLoading = false; if(callback) callback(infos); }); } @@ -270,6 +278,33 @@ core.GridNodes.setNodeIndex = function(gridNode, index, newIndex, callback){ // if(callback) callback(); browser.runtime.sendMessage({ command: 'gridNodesSynced'}).then(function(){}, function(){}); } +core.GridNodes.capturePage = function(gridNode, callback){ + browser.tabs.create({url: gridNode.url, active: false}).then(function(tab){ + setTimeout(function(){ + tab.active = true; + browser.tabs.update(tab.id, {active: true}).then(function(){ + browser.tabs.captureVisibleTab().then(function(img){ + //gridNode.title = tab.title + browser.tabs.remove(tab.id); + gridNode.image = img; + browser.bookmarks.update(gridNode.id, { + title: gridNode.title + }).then(function(bookmarkItem){}, function(){}); + core.Settings.save(); + if(callback) callback(); + browser.runtime.sendMessage({ command: 'gridNodesSynced'}).then(function(){}, function(){}); + }, function(){ + browser.tabs.remove(tab.id); + if(callback) callback(); + }); + }, function(){ + if(callback) callback(); + }); + }, 4000); + }, function(){ + if(callback) callback(); + }); +} // Public functions app.refreshNode = core.GridNodes.refreshNode; @@ -278,3 +313,4 @@ app.createFolder = core.GridNodes.createFolder; app.createBookmark = core.GridNodes.createBookmark; app.deleteNode = core.GridNodes.delete; app.setNodeIndex = core.GridNodes.setNodeIndex; +app.capturePage = core.GridNodes.capturePage; \ No newline at end of file diff --git a/src/js/dial.js b/src/js/dial.js index 21c0d4a..3ac8138 100644 --- a/src/js/dial.js +++ b/src/js/dial.js @@ -108,13 +108,19 @@ dial.initMenus = function(){ dial.ItemMenuCreateFolder = document.createElement('menuitem'); dial.ItemMenuCreateFolder.label = browser.i18n.getMessage("menuAddFolder"); dial.ItemMenuCreateFolder.onclick = dial.createFolder; + /* dial.ItemMenuEdit = document.createElement('menuitem'); dial.ItemMenuEdit.label = 'Edit'; //dial.ItemMenuEdit.onclick = dial.test; + */ dial.ItemMenuRefresh = document.createElement('menuitem'); - dial.ItemMenuRefresh.label = 'Refresh'; dial.ItemMenuRefresh.label = browser.i18n.getMessage("menuRefreshItem"); dial.ItemMenuRefresh.onclick = dial.refreshNode; + + dial.ItemMenuCapture = document.createElement('menuitem'); + dial.ItemMenuCapture.label = 'Capture' // browser.i18n.getMessage("menuRefreshItem"); + dial.ItemMenuCapture.onclick = dial.capturePage; + dial.ItemMenuDelete = document.createElement('menuitem'); dial.ItemMenuDelete.label = browser.i18n.getMessage("menuDeleteItem"); dial.ItemMenuDelete.onclick = dial.deleteNode; @@ -123,6 +129,7 @@ dial.initMenus = function(){ dial.ItemMenu.appendChild(document.createElement('hr')); //dial.ItemMenu.appendChild(dial.ItemMenuEdit); dial.ItemMenu.appendChild(dial.ItemMenuRefresh); + dial.ItemMenu.appendChild(dial.ItemMenuCapture); dial.ItemMenu.appendChild(dial.ItemMenuDelete); dial.Body.appendChild(dial.ItemMenu); } @@ -307,4 +314,10 @@ dial.deleteNode = function(){ if(confirm(browser.i18n.getMessage("deleteItemConfimation", dial._selectedItem.Node.title))){ app.deleteNode(dial._selectedItem.Node.id); } +} + +dial.capturePage = function(){ + app.capturePage(dial._selectedItem.Node, function(){ + // + }) } \ No newline at end of file diff --git a/src/manifest.json b/src/manifest.json index dcc63f9..083918d 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Quick Dial", - "version": "0.0.5", + "version": "0.0.1", "description": "__MSG_extensionDescription__", @@ -18,6 +18,8 @@ "tabs", "" ], + + "content_security_policy": "default-src * moz-extension: 'self' 'unsafe-inline' 'unsafe-eval'; script-src * moz-extension: 'self' 'unsafe-inline' 'unsafe-eval'; child-src * moz-extension: 'self' 'unsafe-inline' 'unsafe-eval'; frame-src * moz-extension: 'self' 'unsafe-inline' 'unsafe-eval'; object-src * moz-extension: 'self' 'unsafe-inline' 'unsafe-eval'; style-src * moz-extension: 'self' 'unsafe-inline' 'unsafe-eval'", "background": { "scripts": ["js/background.js"] diff --git a/src/src.zip b/src/src.zip new file mode 100644 index 0000000000000000000000000000000000000000..8f68dca050b69ed565805b80dc5cfe55fc8f3a44 GIT binary patch literal 20082 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 z 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