Skip to content

Commit

Permalink
Implement multiple tab compare queing
Browse files Browse the repository at this point in the history
  • Loading branch information
alandtse committed Aug 10, 2018
1 parent 4c98c5a commit 8648875
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 36 deletions.
72 changes: 55 additions & 17 deletions app/scripts/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ var runningworkers = 0;
var workers = [];
var workqueue = [];
var pendingcompare = false;
var comparequeue = [];
var activeTabId = null
var unsorted = {};
var selection = "";
Expand Down Expand Up @@ -53,12 +54,17 @@ chrome.runtime.onMessage.addListener(
activeTabId = sender.tab.id
if (updating){
pendingcompare = true
console.log("Update pending; queing compare")
comparequeue.push({'selection':selection,'tabId':activeTabId});
console.log("Update pending; queing compare for tab %s; %s queued", activeTabId, comparequeue.length);
break;
}
compareSelection(selection)
console.log("tab %s: Starting compare: %s", activeTabId, selection.substring(0,25));
compareSelection(selection, activeTabId)
break;
case "generateDiff":
activeTabId = sender.tab.id
request["tabId"] = activeTabId;
console.log("tab %s: Generating diff:", activeTabId, request);
dowork(request);
break;
default:
Expand All @@ -74,10 +80,32 @@ function workeronmessage(event) {
processqueue(); //Message received so see if queue can be cleared.
switch (event.data.command) {
case "progressbarmax":
chrome.tabs.sendMessage(activeTabId, event.data);
var tabId = (event.data.tabId !== undefined) ? event.data.tabId : activeTabId;
if (pendingcompare){ //broadcast to all
for (var i=0; i < comparequeue.length; i++)
chrome.tabs.sendMessage(comparequeue[i]["tabId"], event.data);
}else if (tabId !== undefined && tabId){
chrome.tabs.sendMessage(tabId, event.data);
}
break;
case "progressbarvalue":
var tabId = (event.data.tabId !== undefined) ? event.data.tabId : activeTabId;
if (pendingcompare){ //broadcast to all
for (var i=0; i < comparequeue.length; i++)
chrome.tabs.sendMessage(comparequeue[i]["tabId"], event.data);
}else if (tabId !== undefined && tabId){
chrome.tabs.sendMessage(tabId, event.data);
}
break;
case "next":
chrome.tabs.sendMessage(activeTabId, event.data);
var tabId = (event.data.tabId !== undefined) ? event.data.tabId : activeTabId;
if (pendingcompare){ //broadcast to all
for (var i=0; i < comparequeue.length; i++)
chrome.tabs.sendMessage(comparequeue[i]["tabId"], event.data);
}else if (tabId !== undefined && tabId){
chrome.tabs.sendMessage(tabId, event.data);
}

break;
case "store":
//This path is intended to store a hash of a comparison. Complete
Expand Down Expand Up @@ -165,35 +193,44 @@ function workeronmessage(event) {
}
updating = false;
if (pendingcompare)
compareSelection(selection)
while (comparequeue.length){
var compare = comparequeue.shift();
selection = compare["selection"];
var tabId = compare["tabId"];
console.log("Processing compare queue: compare for %s of selection length %s", tabId, selection.length);
compareSelection(selection, tabId)
}
pendingcompare = false;
break;
case "comparenext":
var threadid = event.data.id;
workerdone(threadid)
var tabId = event.data.tabId;
var result = event.data.result;
var spdxid = event.data.spdxid;
chrome.tabs.sendMessage(activeTabId, {"command": "next", "spdxid":spdxid,"id":threadid});
unsorted[spdxid] = result;
if (Object.keys(unsorted).length >= Object.keys(list["license"]).length){
console.log("Requesting final sort", Object.keys(unsorted).length)
dowork({ 'command':"sortlicenses", 'licenses':unsorted});
unsorted = {};
chrome.tabs.sendMessage(tabId, {"command": "next", "spdxid":spdxid,"id":threadid});
unsorted[tabId][spdxid] = result;
if (Object.keys(unsorted[tabId]).length >= Object.keys(list["license"]).length){
console.log("Requesting final sort of %s for tab %s", Object.keys(unsorted[tabId]).length, tabId)
dowork({ 'command':"sortlicenses", 'licenses':unsorted[tabId], "tabId":tabId});
unsorted[tabId]={};
}
break;
case "sortdone":
var threadid = event.data.id;
workerdone(threadid)
var spdx = event.data.result;
chrome.tabs.sendMessage(activeTabId, {"command": "sortdone","result": spdx,"id":threadid});
var tabId = event.data.tabId;
var result = event.data.result;
chrome.tabs.sendMessage(tabId, {"command": "sortdone","result": result,"id":threadid});
break;
case "diffnext":
var threadid = event.data.id;
workerdone(threadid)
var tabId = event.data.tabId;
var result = event.data.result;
var spdxid = event.data.spdxid;
var record = event.data.record;
chrome.tabs.sendMessage(activeTabId, {"command": "diffnext", "spdxid":spdxid, "result":result, "record":record, "id":threadid, "details":list.license[spdxid]});
chrome.tabs.sendMessage(tabId, {"command": "diffnext", "spdxid":spdxid, "result":result, "record":record, "id":threadid, "details":list.license[spdxid]});
break;
default:

Expand Down Expand Up @@ -259,12 +296,13 @@ function updateList(){
//Compare selection against a fully populated license list (must be loaded in list)
//This is the first phase to determine edit distance and return a sorted list
// for display in spdx
function compareSelection(selection){
function compareSelection(selection, tabId=activeTabId){
unsorted[tabId] = {}
var total = Object.keys(list["license"]).length;
chrome.tabs.sendMessage(activeTabId, {"message": "progressbarmax","value": total, "stage":"Comparing licenses", "reset":true});
chrome.tabs.sendMessage(tabId, {"message": "progressbarmax","value": total, "stage":"Comparing licenses", "reset":true});
//updateProgressBar(Object.keys(list["license"]).length, null)
for (var license in list["license"]){
dowork({'command':"compare", 'selection': selection, 'maxLengthDifference':options.maxLengthDifference, 'spdxid':license,'license':list["license"][license],'total': total});
dowork({'command':"compare", 'selection': selection, 'maxLengthDifference':options.maxLengthDifference, 'spdxid':license,'license':list["license"][license],'total': total, 'tabId':tabId});
}
}

Expand Down
3 changes: 3 additions & 0 deletions app/scripts/contentscript.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ chrome.runtime.onMessage.addListener(
updateProgressBar(request.value, 0 ? request.reset : null)
updateBubbleText(request.stage);
break;
case "progressbarvalue":
updateProgressBar(-1, request.value)
break;
case "next":
updateProgressBar(-1, -1)
break;
Expand Down
41 changes: 22 additions & 19 deletions app/scripts/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,19 @@ self.onmessage = function(event) {
var license = event.data.license
var maxLengthDifference = event.data.maxLengthDifference
var total = event.data.total;
comparelicense(event.data["selection"], spdxid, license, maxLengthDifference, total);
var tabId = event.data.tabId;
comparelicense(event.data["selection"], spdxid, license, tabId, maxLengthDifference, total);
break;
case "sortlicenses":
sortlicenses(event.data.licenses);
var tabId = event.data.tabId;
sortlicenses(event.data.licenses, tabId);
break;
case "generateDiff":
var spdxid = event.data.spdxid
var license = event.data.license
var record = event.data.record
generateDiff(event.data["selection"], spdxid, license, record);
var tabId = event.data.tabId;
generateDiff(event.data["selection"], spdxid, license, record, tabId);
break;

default:
Expand Down Expand Up @@ -78,7 +81,7 @@ function getSPDXlist(baseurl, remote=true) {
// download licenses from files array
function processSPDXlist(files, remote=true) {
promises = files.map(
function(value){
function(value, index){
return new Promise(function(resolve, reject) {
if (remote){
var url = value;
Expand All @@ -103,8 +106,8 @@ function processSPDXlist(files, remote=true) {
response["licenseId"] = spdxid
}
postMessage({"command": "savelicense","spdxid": spdxid, "data":response,"id":id});
//postMessage({"command": "progressbarmax","value": files.length, "stage":"Updating licenses","id":id});
postMessage({"command": "next", "spdxid":spdxid,"id":id});
postMessage({"command": "progressbarmax","value": files.length, "stage":"Updating licenses","id":id});
postMessage({"command": "progressbarvalue", "value": index, "spdxid":spdxid,"id":id});
SPDXlist[spdxid] = response
//postMessage({"command": "store", "spdxid":spdxid, "raw":data, "hash":hash, "processed":result.data, "patterns": result.patterns});
resolve(SPDXlist[spdxid])
Expand All @@ -122,8 +125,8 @@ function processSPDXlist(files, remote=true) {
);
};

function comparelicense(selection, spdxid, license, maxLengthDifference=1000, total=0) {
postMessage({"command": "progressbarmax","value": total, "stage":"Comparing licenses","id":id,"reset":true});
function comparelicense(selection, spdxid, license, tabId, maxLengthDifference=1000, total=0) {
postMessage({"command": "progressbarmax","value": total, "stage":"Comparing licenses","id":id,"reset":true,"tabId":tabId});
var result = {}
var count2 = selection.length;
//console.log(id, "Processing selection of " + count2 + " chars.");
Expand All @@ -139,15 +142,15 @@ function comparelicense(selection, spdxid, license, maxLengthDifference=1000, to
if (difference <= maxLength && difference < maxLengthDifference) {
var distance = Levenshtein.get(cleanText(data), cleanText(selection));
var percentage = ((maxLength - distance) / maxLength * 100).toFixed(1);
console.log(id, spdxid + " - Levenshtein Distance (clean): " + distance + " (" + percentage + "%)" + " Length Difference: " + difference + " LOC Diff:" + locdiff);
console.log(tabId, id, spdxid + " - Levenshtein Distance (clean): " + distance + " (" + percentage + "%)" + " Length Difference: " + difference + " LOC Diff:" + locdiff);
result = {
distance: distance,
text: data,
percentage: percentage,
//patterns: result.patterns
}
}else{
console.log(id, spdxid + " - Length Difference: " + difference + " LOC Diff:" + locdiff);
console.log(tabId, id, spdxid + " - Length Difference: " + difference + " LOC Diff:" + locdiff);
result = {
distance: difference,
text: data,
Expand All @@ -156,12 +159,12 @@ function comparelicense(selection, spdxid, license, maxLengthDifference=1000, to
}

}
postMessage({"command": "comparenext", "spdxid":spdxid, "result":result, "id":id});
postMessage({"command": "comparenext", "spdxid":spdxid, "result":result, "id":id, "tabId":tabId});
//postMessage({"command": "store", "spdxid":spdxid, "raw":data, "hash":hash, "processed":result.data, "patterns": result.patterns});
};
function sortlicenses(licenses) {
postMessage({"command": "progressbarmax","value": Object.keys(licenses).length, "stage":"Sorting licenses","id":id,"reset":true});
console.log(id, "Sorting " + Object.keys(licenses).length + " licenses");
function sortlicenses(licenses, tabId) {
postMessage({"command": "progressbarmax","value": Object.keys(licenses).length, "stage":"Sorting licenses","id":id,"reset":true, "tabId":tabId});
console.log(tabId, id, "Sorting " + Object.keys(licenses).length + " licenses");
var sortable = [];
for (var license in licenses) {
sortable.push({
Expand All @@ -170,15 +173,15 @@ function sortlicenses(licenses) {
'difftext':licenses[license]['text'],
'percentage':licenses[license]['percentage']
});
postMessage({"command": "next", "spdxid":license,"id":id});
postMessage({"command": "next", "spdxid":license,"id":id, "tabId":tabId});
}
sortable.sort(function(a, b) {
return b["percentage"] - a["percentage"];
});
postMessage({"command": "sortdone","result": sortable,"id":id});
postMessage({"command": "sortdone","result": sortable,"id":id, "tabId":tabId});
};

function generateDiff(selection, spdxid, license, record) {
function generateDiff(selection, spdxid, license, record, tabId) {
//postMessage({"command": "progressbarmax","value": total, "stage":"Generating Diff","id":id});
var result = {}
var data = license
Expand All @@ -190,8 +193,8 @@ function generateDiff(selection, spdxid, license, record) {
//dmp.diff_cleanupEfficiency(textDiff);
var ms_end = (new Date()).getTime();
result = { "html":dmp.diff_prettyHtml(textDiff), "time":(ms_end - ms_start)}
console.log("%s: %s diff:%o", id, spdxid, result);
postMessage({"command": "diffnext", "spdxid":spdxid, "result":result, "record":record, "id":id});
console.log("%s %s: %s diff:%o",tabId,id, spdxid, result);
postMessage({"command": "diffnext", "spdxid":spdxid, "result":result, "record":record, "id":id, "tabId":tabId});
};

function cleanText(str) {
Expand Down

0 comments on commit 8648875

Please sign in to comment.