Skip to content

Commit 22c7651

Browse files
committed
Merge pull request mozilla-b2g#32476 from weilonge/seanlee/TVBrowser/master/Bug1212716
Bug 1212716 - Implement TV Browser IndexedDB adapter for Places DataStore. r=yifan
2 parents 9080540 + 46003b9 commit 22c7651

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

build/l10n/xfail.list

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ dev_apps/geoloc/js/geoloc.js
114114
shared/elements/gaia_grid/js/items/collection.js
115115
shared/js/l10n_date.js
116116
shared/js/tz_select.js
117+
tv_apps/browser/js/index.js
117118
tv_apps/smart-home/js/edit.js
118119
tv_apps/smart-home/js/home.js
119120
tv_apps/smart-system/js/accessibility.js

tv_apps/browser/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
<script defer src="js/datasync/sync_ds_helper.js"></script>
5656
<script defer src="js/datasync/sync_db_helper.js"></script>
5757
<script defer src="js/datasync/sync_bookmarks.js"></script>
58+
<script defer src="js/datasync/sync_history.js"></script>
5859

5960
<!-- IAC Handler (put here because it starts sending event immediately) -->
6061
<script defer src="shared/js/iac_handler.js"></script>

tv_apps/browser/js/datasync/sync_db_helper.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/* global Browser */
55
/* global Awesomescreen */
66
/* global IDBDatabaseException */
7+
/* global IDBKeyRange */
78

89
const DBOS_PLACES = 'sync_places';
910
const DBOS_VISITS = 'sync_visits';
@@ -52,6 +53,15 @@ var SyncBrowserDB = {
5253
}).bind(this));
5354
},
5455

56+
/**
57+
* Add a raw history entry to DBOS_PLACES store.
58+
* @param {String} history The history to be added
59+
* @param {Function} callback Runs when it finishs
60+
*/
61+
updateRawHistory: function browserDB_updateRawPlace(history, callback) {
62+
this.db.createRawHistory(history, callback);
63+
},
64+
5565
/**
5666
* Get a place by URI from DBOS_PLACES object store.
5767
* @param {String} uri URI query parameter
@@ -212,6 +222,14 @@ var SyncBrowserDB = {
212222
}).bind(this));
213223
},
214224

225+
/**
226+
* Get history by timestamp range at (start < record.timestamp <= end)
227+
* @param {Function} callback Runs on success with an array of history
228+
*/
229+
getHistoryByTime: function browserDB_getHistoryByTime(start, end, callback) {
230+
this.db.getHistoryByTime(start, end, callback);
231+
},
232+
215233
/**
216234
* Delete a history by URI
217235
* @param {String} uri URI
@@ -532,6 +550,43 @@ SyncBrowserDB.db = {
532550
};
533551
},
534552

553+
/**
554+
* Create a new raw entry of the history if there's none.
555+
* @param {String} history The history to be inserted
556+
* @param {Function} callback Runs when the entry exists or a new entry
557+
* created
558+
*/
559+
createRawHistory: function db_createRawHistory(history, callback) {
560+
var transaction = this._db.transaction([DBOS_VISITS], 'readwrite');
561+
var objectStore = transaction.objectStore(DBOS_VISITS);
562+
var readRequest = objectStore.get(history.uri);
563+
readRequest.onsuccess = function onReadSuccess(event) {
564+
var existingPlace = event.target.result;
565+
var writeRequest;
566+
if (existingPlace) {
567+
existingPlace.title = history.title;
568+
existingPlace.timestamp = history.timestamp;
569+
writeRequest = objectStore.put(history);
570+
} else {
571+
writeRequest = objectStore.add(history);
572+
}
573+
574+
writeRequest.onsuccess = function onWriteSuccess(event) {
575+
if (callback) {
576+
callback();
577+
}
578+
};
579+
580+
writeRequest.onerror = function onError(event) {
581+
console.error('error writing history');
582+
};
583+
};
584+
585+
transaction.onerror = function dbTransactionError(e) {
586+
console.error('Transaction error while trying to save history ', history);
587+
};
588+
},
589+
535590
/**
536591
* Save an places object store entry in database
537592
* @param {Object} places A visits entry
@@ -1277,6 +1332,48 @@ SyncBrowserDB.db = {
12771332
};
12781333
},
12791334

1335+
/**
1336+
* Get history by timestamp range at (start < record.timestamp <= end)
1337+
* @param {Number} start Start timestamp
1338+
* @param {Number} end End timestamp
1339+
* @param {Function} callback Runs on complete with an array of history
1340+
*/
1341+
getHistoryByTime: function db_getHistoryByTime(start, end, callback) {
1342+
var history = [];
1343+
var db = this._db;
1344+
1345+
function makeVisitProcessor(visit) {
1346+
return function(e) {
1347+
var object = e.target.result;
1348+
if(object){
1349+
visit.iconUri = object.iconUri;
1350+
}else{
1351+
visit.iconUri = Awesomescreen.DEFAULT_FAVICON;
1352+
}
1353+
history.push(visit);
1354+
};
1355+
}
1356+
1357+
var transaction = db.transaction([DBOS_VISITS, DBOS_ICONS]);
1358+
var visitsStore = transaction.objectStore(DBOS_VISITS);
1359+
var objectStore = transaction.objectStore(DBOS_ICONS);
1360+
var visitsIndex = visitsStore.index('timestamp');
1361+
var keyRange = IDBKeyRange.bound(start, end, true, false);
1362+
1363+
visitsIndex.openCursor(keyRange, 'prev').onsuccess =
1364+
function onSuccess(e) {
1365+
var cursor = e.target.result;
1366+
if (cursor) {
1367+
var visit = cursor.value;
1368+
objectStore.get(visit.uri).onsuccess = makeVisitProcessor(visit);
1369+
cursor.continue();
1370+
}
1371+
};
1372+
transaction.oncomplete = function db_historyTransactionComplete() {
1373+
callback(history);
1374+
};
1375+
},
1376+
12801377
/**
12811378
* Init the frequency(view count) of the specified URI,
12821379
* if the URI is in DBOS_PLACES.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
'use strict';
6+
7+
/* exported SyncHistory */
8+
/* global SyncBrowserDB */
9+
/* global SyncDsHelper */
10+
11+
/*
12+
exampleHistroyInIndexedDB = {
13+
"uri": "http://example.com/",
14+
"title": "Hello World",
15+
"frecency": 1,
16+
"iconUri": "http://example.com/favicon.ico",
17+
"screenshot": {}
18+
}
19+
*/
20+
21+
var SyncHistory = (function () {
22+
var syncDataStore;
23+
24+
function handleTask(task) {
25+
return new Promise(resolve => {
26+
var data = {};
27+
if (task.data) {
28+
data.uri = task.data.url;
29+
data.title = task.data.title;
30+
data.fxsyncId = task.data.fxsyncId;
31+
data.timestamp = task.data.visited;
32+
}
33+
switch(task.operation) {
34+
case 'update':
35+
case 'add':
36+
SyncBrowserDB.updateRawHistory(data, () => {
37+
resolve();
38+
});
39+
break;
40+
case 'clear':
41+
// Ignore clear operation.
42+
resolve();
43+
break;
44+
case 'remove':
45+
SyncBrowserDB.removeHistory(task.id, () => {
46+
resolve();
47+
});
48+
break;
49+
case 'done':
50+
resolve();
51+
break;
52+
}
53+
});
54+
}
55+
56+
function init() {
57+
syncDataStore = new SyncDsHelper('places');
58+
return syncDataStore.init();
59+
}
60+
61+
function start() {
62+
if (!syncDataStore) {
63+
return Promise.reject('Uninitialized DataStore');
64+
}
65+
syncDataStore.registerStoreChangeEvent(() => {
66+
syncDataStore.dataStoreSync(handleTask);
67+
});
68+
return syncDataStore.dataStoreSync(handleTask);
69+
}
70+
71+
function stop() {
72+
if (!syncDataStore) {
73+
return Promise.reject('Uninitialized DataStore');
74+
}
75+
syncDataStore.unregisterStoreChangeEvent();
76+
return Promise.resolve();
77+
}
78+
79+
return {
80+
init: init,
81+
start: start,
82+
stop: stop
83+
};
84+
})();

tv_apps/browser/js/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ var Browser = {
158158

159159
SyncBrowserDB.init(() => {
160160
SyncBookmark.init();
161+
SyncHistory.init();
161162
});
162163

163164
if (this.waitingActivities.length) {

0 commit comments

Comments
 (0)