Skip to content

Commit 5a783b0

Browse files
committed
v0.1
1 parent f3de898 commit 5a783b0

5 files changed

Lines changed: 434 additions & 0 deletions

File tree

src/background.js

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
var list = [];
2+
3+
var status = "";
4+
5+
function startBrowsingCapture() {
6+
statusCreation = false;
7+
statusRemoval = false;
8+
statusChanged = false;
9+
statusMoved = false;
10+
11+
// CREATION
12+
if (!browser.bookmarks.onCreated.hasListener(captureCreation)) {
13+
browser.bookmarks.onCreated.addListener(captureCreation);
14+
statusCreation = true;
15+
console.log(Date().toLocaleString() + " starting: created log");
16+
}
17+
18+
// REMOVAL
19+
if (!browser.bookmarks.onRemoved.hasListener(captureRemoval)) {
20+
browser.bookmarks.onRemoved.addListener(captureRemoval);
21+
statusRemoval = true;
22+
console.log(Date().toLocaleString() + " starting: removal log");
23+
}
24+
25+
// CHANGED
26+
if (!browser.bookmarks.onChanged.hasListener(captureChanged)) {
27+
browser.bookmarks.onChanged.addListener(captureChanged);
28+
statusChanged = true;
29+
console.log(Date().toLocaleString() + " starting: changed log");
30+
}
31+
32+
// MOVED
33+
if (!browser.bookmarks.onMoved.hasListener(captureMoved)) {
34+
browser.bookmarks.onMoved.addListener(captureMoved);
35+
statusMoved = true;
36+
console.log(Date().toLocaleString() + " starting: changed log");
37+
}
38+
39+
40+
if (statusCreation == true && statusRemoval == true && statusChanged == true && statusMoved == true)
41+
{
42+
status = "STARTED";
43+
}else
44+
{
45+
stopBrowsingCapture();
46+
}
47+
48+
}
49+
50+
function stopBrowsingCapture() {
51+
52+
// CREATION
53+
if (browser.bookmarks.onCreated.hasListener(captureCreation)) {
54+
browser.bookmarks.onCreated.removeListener(captureCreation);
55+
status = "STOPPED";
56+
console.log(Date().toLocaleString() + " stopping: created log");
57+
}
58+
59+
// REMOVAL
60+
if (browser.bookmarks.onRemoved.hasListener(captureRemoval)) {
61+
browser.bookmarks.onRemoved.removeListener(captureRemoval);
62+
status = "STOPPED";
63+
console.log(Date().toLocaleString() + " stopping: removal log");
64+
}
65+
66+
// CHANGED
67+
if (browser.bookmarks.onChanged.hasListener(captureChanged)) {
68+
browser.bookmarks.onChanged.removeListener(captureChanged);
69+
status = "STOPPED";
70+
console.log(Date().toLocaleString() + " stopping: changed log");
71+
}
72+
73+
// MOVED
74+
if (browser.bookmarks.onMoved.hasListener(captureMoved)) {
75+
browser.bookmarks.onMoved.removeListener(captureMoved);
76+
status = "STOPPED";
77+
console.log(Date().toLocaleString() + " stopping: moved log");
78+
}
79+
80+
81+
downloadBrowsingBookmark();
82+
}
83+
84+
function downloadBrowsingBookmark() {
85+
86+
if (list.length === 0) {
87+
console.log("empty browsing list - not saving anything !");
88+
89+
} else {
90+
saveData(list);
91+
console.log("browsing list saved");
92+
}
93+
}
94+
95+
96+
function captureCreation(id, bookmarkInfo) {
97+
console.log("Bookmark created");
98+
99+
if (bookmarkInfo.type === "bookmark")
100+
{
101+
logInfo(bookmarkInfo, id, "creation");
102+
103+
}else if (bookmarkInfo.type === "folder") {
104+
// don't log when a folder is created because on Firefox, it is weird behavior :
105+
// the folder is always called " new folder" and not by the name the user choose
106+
107+
/* const temp = writeInfo(bookmarkInfo, id, "creation");
108+
list.push(temp); */
109+
console.log("FOLDER: DO NOTHING");
110+
}else
111+
{
112+
console.log("SEPARATOR: DO NOTHING");
113+
}
114+
}
115+
116+
function captureRemoval(id, removeInfo){
117+
console.log("Bookmark removed");
118+
119+
if (removeInfo.node.type === "bookmark")
120+
{
121+
logInfo(removeInfo.node, id, "removal");
122+
123+
}else if (removeInfo.node.type === "folder") {
124+
125+
logInfo(removeInfo.node, id,"removal");
126+
}else
127+
{
128+
console.log("SEPARATOR: DO NOTHING");
129+
}
130+
}
131+
132+
133+
function captureChanged (id, changeInfo){
134+
console.log("Bookmark changed");
135+
136+
logMoreInfo(id,"change");
137+
138+
// const temp = writeInfo(changeInfo,id, "change");
139+
// list.push(temp);
140+
}
141+
142+
function captureMoved(id, moveInfo){
143+
console.log("Bookmark moved");
144+
145+
// logMoreInfo(id,"move");
146+
147+
getBookmarkMoveInfos(id, moveInfo.parentId, moveInfo.oldParentId)
148+
.then((bookmarks) => {
149+
let temp = {
150+
move: bookmarks[0],
151+
from: bookmarks[1],
152+
to: bookmarks[2]
153+
}
154+
155+
list.push(temp);
156+
});
157+
158+
}
159+
160+
async function getBookmarkMoveInfos(id, parentId, oldParentId) {
161+
let bookmarkInfo;
162+
bookmarkInfo = await getMoreInfo(id);
163+
let bookmarkMoved = writeInfo(bookmarkInfo, id, "move");
164+
165+
bookmarkInfo = await getMoreInfo(oldParentId);
166+
let bookmarkOldParentMoved = writeInfo(bookmarkInfo, oldParentId, "move");
167+
168+
bookmarkInfo = await getMoreInfo(parentId);
169+
let bookmarkParentMoved = writeInfo(bookmarkInfo, parentId, "move");
170+
171+
return [bookmarkMoved, bookmarkOldParentMoved, bookmarkParentMoved];
172+
}
173+
174+
function logMoreInfo(id, action) {
175+
let bookmarkInfo;
176+
console.log("More info for: " + id);
177+
let gettingBookmarks = browser.bookmarks.get(id);
178+
gettingBookmarks.then(onFulfilledGetBookmark, error => (console.log("error get bookmark: " + error)))
179+
.then(bookmarkInfo => {logInfo(bookmarkInfo[0], id, action);});
180+
}
181+
182+
function getMoreInfo(id) {
183+
let bookmarkInfo;
184+
console.log("More info for: " + id);
185+
let gettingBookmarks = browser.bookmarks.get(id);
186+
gettingBookmarks.then(onFulfilledGetBookmark, error => (console.log("error get bookmark: " + error)));
187+
188+
return gettingBookmarks.then( (results) => {return results[0];});
189+
}
190+
191+
function logInfo(bookmarkInfo, id, action) {
192+
const temp = writeInfo(bookmarkInfo,id, action);
193+
list.push(temp);
194+
}
195+
196+
197+
function onFulfilledGetBookmark(bookmark){
198+
console.log(bookmark);
199+
return bookmark;
200+
}
201+
202+
203+
function writeInfo(bookmarkInfo, id, action)
204+
{
205+
let dateISO = new Date();
206+
console.log(dateISO.toISOString());
207+
208+
console.log(bookmarkInfo.title);
209+
console.log(bookmarkInfo.url);
210+
211+
return {
212+
date: dateISO.toISOString(),
213+
action: action,
214+
type: bookmarkInfo.type,
215+
url: bookmarkInfo.url,
216+
title: bookmarkInfo.title,
217+
id: id,
218+
dateAdded: bookmarkInfo.dateAdded,
219+
dateGroupModified: bookmarkInfo.dateGroupModified
220+
};
221+
}
222+
223+
224+
function getMessage() {
225+
if (!browser.runtime.onMessage.hasListener(processMessage)) {
226+
browser.runtime.onMessage.addListener(processMessage);
227+
}
228+
}
229+
230+
function stopMessage() {
231+
if (browser.runtime.onMessage.hasListener(processMessage)) {
232+
browser.runtime.onMessage.removeListener(processMessage);
233+
}
234+
}
235+
236+
function processMessage(data, sender) {
237+
console.log("MSG Copy " + data.content);
238+
239+
if (data.content === '#start') {
240+
startBrowsingCapture();
241+
return Promise.resolve({response: "done"});
242+
}
243+
244+
if (data.content === '#stop') {
245+
stopBrowsingCapture();
246+
247+
return Promise.resolve({response: "done"});
248+
}
249+
250+
if (data.content === '#status') {
251+
return Promise.resolve({response: status});
252+
}
253+
254+
if (data.content === '#download') {
255+
downloadBrowsingBookmark();
256+
return Promise.resolve({response: "done"});
257+
}
258+
259+
return Promise.resolve({response: "error"});
260+
}
261+
262+
function dateFile() {
263+
let dateUTC = new Date();
264+
let dateString = dateUTC.getUTCFullYear() + "-" + (dateUTC.getUTCMonth() + 1) + "-" + dateUTC.getUTCDate() + "_" +
265+
dateUTC.getUTCHours() + "-" + dateUTC.getUTCMinutes() + "-" + dateUTC.getUTCSeconds();
266+
return dateString;
267+
}
268+
269+
270+
function saveData(data) {
271+
let blob = new Blob([JSON.stringify(data, null, 2)], {type: 'application/json'});
272+
let url = URL.createObjectURL(blob);
273+
let dateString = "regis-browser-bookmark/" + dateFile() + ".txt";
274+
let download = browser.downloads.download({url: url, filename: dateString, saveAs: false});
275+
download.then(() => {
276+
list = []
277+
}).catch(error => console.log(error));
278+
}
279+
280+
281+
function init() {
282+
startBrowsingCapture();
283+
getMessage();
284+
285+
browser.windows.onRemoved.addListener(() => {
286+
downloadBrowsingBookmark()
287+
});
288+
289+
setInterval(downloadBrowsingBookmark,1200000); // every 20 minutes
290+
291+
}
292+
293+
294+
init();

src/manifest.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"manifest_version": 2,
3+
"name": "REGIS-BROWSER-BOOKMARK",
4+
"version": "0.1",
5+
"description": "Capture web browsing bookmark history",
6+
"author": "acendrou",
7+
"background": {
8+
"scripts": [
9+
"background.js"
10+
]
11+
},
12+
"browser_action": {
13+
"default_title": "REGIS-BROWSER-BOOKMARK",
14+
"default_popup": "popup/choose_options.html"
15+
},
16+
"permissions": [
17+
"bookmarks",
18+
"downloads"
19+
],
20+
"browser_specific_settings": {
21+
"gecko": {
22+
"id": "regis-browser-bookmark@ekvidi"
23+
}
24+
}
25+
}

src/popup/choose_options.css

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
html, body {
2+
width: 300px;
3+
}
4+
5+
.title {
6+
font-size: medium;
7+
text-align: center;
8+
color: blueviolet;
9+
}
10+
11+
.button {
12+
font-family: Arial, sans-serif;
13+
margin: 3% auto;
14+
padding: 4px;
15+
text-align: center;
16+
font-size: 1.5em;
17+
cursor: pointer;
18+
}
19+
20+
#start {
21+
color: green;
22+
}
23+
24+
#stop {
25+
color: red;
26+
}
27+
28+
#status {
29+
padding-left: 40%
30+
}
31+
32+
#download {
33+
color: black;
34+
}

src/popup/choose_options.html

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!DOCTYPE html>
2+
<html lang="en" xmlns="http://www.w3.org/1999/html">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>REGIS-BROWSER-BOOKMARK</title>
6+
<link rel="stylesheet" href="choose_options.css"/>
7+
</head>
8+
<body>
9+
<div id="title" class="title">REGIS-BROWSER-BOOKMARK</div>
10+
<div id="popup_content">
11+
<div id="start" class="button">
12+
Start
13+
</div>
14+
<div id="stop" class="button">
15+
Stop
16+
</div>
17+
<div id="status">
18+
STARTED
19+
</div>
20+
<div id="download" class="button">
21+
Download
22+
</div>
23+
</div>
24+
<script src="choose_options.js"></script>
25+
</body>
26+
</html>

0 commit comments

Comments
 (0)