diff options
Diffstat (limited to 'addon-sdk/source/test/addons/places/lib/places-helper.js')
-rw-r--r-- | addon-sdk/source/test/addons/places/lib/places-helper.js | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/addon-sdk/source/test/addons/places/lib/places-helper.js b/addon-sdk/source/test/addons/places/lib/places-helper.js new file mode 100644 index 000000000..a8545b24a --- /dev/null +++ b/addon-sdk/source/test/addons/places/lib/places-helper.js @@ -0,0 +1,239 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + 'use strict' + +const { Cc, Ci, Cu } = require('chrome'); +const bmsrv = Cc['@mozilla.org/browser/nav-bookmarks-service;1']. + getService(Ci.nsINavBookmarksService); +const hsrv = Cc['@mozilla.org/browser/nav-history-service;1']. + getService(Ci.nsINavHistoryService); +const brsrv = Cc["@mozilla.org/browser/nav-history-service;1"] + .getService(Ci.nsIBrowserHistory); +const tagsrv = Cc['@mozilla.org/browser/tagging-service;1']. + getService(Ci.nsITaggingService); +const asyncHistory = Cc['@mozilla.org/browser/history;1']. + getService(Ci.mozIAsyncHistory); +const { send } = require('sdk/addon/events'); +const { setTimeout } = require('sdk/timers'); +const { newURI } = require('sdk/url/utils'); +const { defer, all } = require('sdk/core/promise'); +const { once } = require('sdk/system/events'); +const { set } = require('sdk/preferences/service'); +const { + Bookmark, Group, Separator, + save, search, + MENU, TOOLBAR, UNSORTED +} = require('sdk/places/bookmarks'); + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", + "resource://gre/modules/PlacesUtils.jsm"); + +function invalidResolve (assert) { + return function (e) { + assert.fail('Resolve state should not be called: ' + e); + }; +} +exports.invalidResolve = invalidResolve; + +// Removes all children of group +function clearBookmarks (group) { + group + ? bmsrv.removeFolderChildren(group.id) + : clearAllBookmarks(); +} + +function clearAllBookmarks () { + [MENU, TOOLBAR, UNSORTED].forEach(clearBookmarks); +} + +function clearHistory (done) { + PlacesUtils.history.clear().catch(Cu.reportError).then(done); +} + +// Cleans bookmarks and history and disables maintanance +function resetPlaces (done) { + // Set last maintenance to current time to prevent + // Places DB maintenance occuring and locking DB + set('places.database.lastMaintenance', Math.floor(Date.now() / 1000)); + clearAllBookmarks(); + clearHistory(done); +} +exports.resetPlaces = resetPlaces; + +function compareWithHost (assert, item) { + let id = item.id; + let type = item.type === 'group' ? bmsrv.TYPE_FOLDER : bmsrv['TYPE_' + item.type.toUpperCase()]; + let url = item.url && !item.url.endsWith('/') ? item.url + '/' : item.url; + + if (type === bmsrv.TYPE_BOOKMARK) { + assert.equal(url, bmsrv.getBookmarkURI(id).spec.toString(), 'Matches host url'); + let tags = tagsrv.getTagsForURI(newURI(item.url)); + for (let tag of tags) { + // Handle both array for raw data and set for instances + if (Array.isArray(item.tags)) + assert.ok(~item.tags.indexOf(tag), 'has correct tag'); + else + assert.ok(item.tags.has(tag), 'has correct tag'); + } + assert.equal(tags.length, + Array.isArray(item.tags) ? item.tags.length : item.tags.size, + 'matches tag count'); + } + if (type !== bmsrv.TYPE_SEPARATOR) { + assert.equal(item.title, bmsrv.getItemTitle(id), 'Matches host title'); + } + assert.equal(item.index, bmsrv.getItemIndex(id), 'Matches host index'); + assert.equal(item.group.id || item.group, bmsrv.getFolderIdForItem(id), 'Matches host group id'); + assert.equal(type, bmsrv.getItemType(id), 'Matches host type'); +} +exports.compareWithHost = compareWithHost; + +function addVisits (urls) { + var deferred = defer(); + asyncHistory.updatePlaces([].concat(urls).map(createVisit), { + handleResult: function () {}, + handleError: deferred.reject, + handleCompletion: deferred.resolve + }); + + return deferred.promise; +} +exports.addVisits = addVisits; + +function removeVisits (urls) { + [].concat(urls).map(url => { + hsrv.removePage(newURI(url)); + }); +} +exports.removeVisits = removeVisits; + +// Creates a mozIVisitInfo object +function createVisit (url) { + let place = {} + place.uri = newURI(url); + place.title = "Test visit for " + place.uri.spec; + place.visits = [{ + transitionType: hsrv.TRANSITION_LINK, + visitDate: +(new Date()) * 1000, + referredURI: undefined + }]; + return place; +} + +function createBookmark (data) { + data = data || {}; + let item = { + title: data.title || 'Moz', + url: data.url || (!data.type || data.type === 'bookmark' ? + 'http://moz.com/' : + undefined), + tags: data.tags || (!data.type || data.type === 'bookmark' ? + ['firefox'] : + undefined), + type: data.type || 'bookmark', + group: data.group + }; + return send('sdk-places-bookmarks-create', item); +} +exports.createBookmark = createBookmark; + +function historyBatch () { + hsrv.runInBatchMode(() => {}, null); +} +exports.historyBatch = historyBatch; + +function createBookmarkItem (data) { + let deferred = defer(); + data = data || {}; + save({ + title: data.title || 'Moz', + url: data.url || 'http://moz.com/', + tags: data.tags || (!data.type || data.type === 'bookmark' ? + ['firefox'] : + undefined), + type: data.type || 'bookmark', + group: data.group + }).on('end', function (bookmark) { + deferred.resolve(bookmark[0]); + }); + return deferred.promise; +} +exports.createBookmarkItem = createBookmarkItem; + +function createBookmarkTree () { + let agg = []; + return createBookmarkItem({ type: 'group', title: 'mozgroup' }) + .then(group => { + agg.push(group); + return all([createBookmarkItem({ + title: 'mozilla.com', + url: 'http://mozilla.com/', + group: group, + tags: ['mozilla', 'firefox', 'thunderbird', 'rust'] + }), createBookmarkItem({ + title: 'mozilla.org', + url: 'http://mozilla.org/', + group: group, + tags: ['mozilla', 'firefox', 'thunderbird', 'rust'] + }), createBookmarkItem({ + title: 'firefox', + url: 'http://firefox.com/', + group: group, + tags: ['mozilla', 'firefox', 'browser'] + }), createBookmarkItem({ + title: 'thunderbird', + url: 'http://mozilla.org/thunderbird/', + group: group, + tags: ['mozilla', 'thunderbird', 'email'] + }), createBookmarkItem({ + title: 'moz subfolder', + group: group, + type: 'group' + }) + ]); + }) + .then(results => { + agg = agg.concat(results); + let subfolder = results.filter(item => item.type === 'group')[0]; + return createBookmarkItem({ + title: 'dark javascript secrets', + url: 'http://w3schools.com', + group: subfolder, + tags: [] + }); + }).then(item => { + agg.push(item); + return createBookmarkItem( + { type: 'group', group: MENU, title: 'other stuff' } + ); + }).then(newGroup => { + agg.push(newGroup); + return all([ + createBookmarkItem({ + title: 'mdn', + url: 'http://developer.mozilla.org/en-US/', + group: newGroup, + tags: ['javascript'] + }), + createBookmarkItem({ + title: 'web audio', + url: 'http://webaud.io', + group: newGroup, + tags: ['javascript', 'web audio'] + }), + createBookmarkItem({ + title: 'web audio components', + url: 'http://component.fm', + group: newGroup, + tags: ['javascript', 'web audio', 'components'] + }) + ]); + }).then(results => { + agg = agg.concat(results); + return agg; + }); +} +exports.createBookmarkTree = createBookmarkTree; |