Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
147 lines
3.5 KiB
JavaScript
Executable file
147 lines
3.5 KiB
JavaScript
Executable file
/* global BaseModule, LazyLoader, BookmarksDatabase */
|
|
'use strict';
|
|
|
|
(function(exports) {
|
|
|
|
var PinsManager = function() {};
|
|
PinsManager.SERVICES = ['isPinned'];
|
|
PinsManager.STATES = ['getScope'];
|
|
|
|
BaseModule.create(PinsManager, {
|
|
EVENT_PREFIX: 'pins-',
|
|
DEBUG: false,
|
|
name: 'PinsManager',
|
|
_scopes: {},
|
|
|
|
_start: function() {
|
|
LazyLoader.load('shared/js/bookmarks_database.js')
|
|
.then(function() {
|
|
this._syncScopes();
|
|
this._addListeners();
|
|
}.bind(this));
|
|
},
|
|
|
|
isPinned: function(url) {
|
|
var origin = new URL(url).origin;
|
|
var scopes = this._scopes[origin];
|
|
|
|
if (!scopes) {
|
|
return false;
|
|
}
|
|
|
|
return Object.keys(scopes).some(function(scope) {
|
|
return this._inScope(url, scope);
|
|
}.bind(this));
|
|
},
|
|
|
|
getScope: function(url) {
|
|
var origin = new URL(url).origin;
|
|
var paths = this._scopes[origin];
|
|
|
|
if (!paths) {
|
|
return;
|
|
}
|
|
|
|
var scopes = [];
|
|
|
|
for (var path in paths) {
|
|
var scope = paths[path].scope;
|
|
if (this._inScope(url, scope)) {
|
|
scopes.push(scope);
|
|
}
|
|
}
|
|
|
|
return scopes.length && this._getLongestScope(scopes);
|
|
},
|
|
|
|
_inScope: function(url, scope) {
|
|
if (!scope) {
|
|
return false;
|
|
}
|
|
|
|
var origin = new URL(url).origin;
|
|
var scopeFullUrl = new URL(scope, origin);
|
|
return url.indexOf(scopeFullUrl) === 0;
|
|
},
|
|
|
|
_getLongestScope: function(scopes) {
|
|
return scopes.reduce(function(a, b) {
|
|
return a.length > b.length ? a : b;
|
|
});
|
|
},
|
|
|
|
_addListeners: function() {
|
|
var events = ['added', 'updated', 'removed'];
|
|
events.forEach(function(name) {
|
|
BookmarksDatabase.addEventListener(name, this._onChange.bind(this));
|
|
}.bind(this));
|
|
},
|
|
|
|
_onChange: function(task) {
|
|
switch (task.type) {
|
|
case 'updated':
|
|
case 'added':
|
|
this._addScope(task.target);
|
|
break;
|
|
|
|
case 'removed':
|
|
this._removeScope(task.target.id);
|
|
break;
|
|
}
|
|
},
|
|
|
|
_syncScopes: function() {
|
|
var self = this;
|
|
self._scopes = {};
|
|
BookmarksDatabase.getAll().then(function(bookmarks) {
|
|
Object.keys(bookmarks).forEach(function(id) {
|
|
var currentBookmark = bookmarks[id];
|
|
self._addScope(currentBookmark);
|
|
});
|
|
});
|
|
},
|
|
|
|
_addScope: function(data) {
|
|
var url = new URL(data.id);
|
|
var origin = url.origin;
|
|
this._scopes[origin] = this._scopes[origin] || {};
|
|
|
|
var path = data.scope || '/';
|
|
this._scopes[origin][path] = {
|
|
id: data.id,
|
|
name: data.name,
|
|
scope: data.scope
|
|
};
|
|
this.publish('scopechange', {
|
|
action: 'add',
|
|
scope: data.scope || false,
|
|
name: data.name,
|
|
url: data.id
|
|
});
|
|
},
|
|
|
|
_removeScope: function(id) {
|
|
var url = new URL(id);
|
|
var origin = url.origin;
|
|
if (this._scopes[origin]) {
|
|
var currentHost = this._scopes[origin];
|
|
var removed;
|
|
Object.keys(currentHost).forEach(function(path) {
|
|
if (currentHost[path].id === id) {
|
|
removed = currentHost[path];
|
|
delete currentHost[path];
|
|
}
|
|
});
|
|
if (removed) {
|
|
this.publish('scopechange', {
|
|
action: 'remove',
|
|
scope: removed.scope || false,
|
|
name: removed.name,
|
|
url: removed.id
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
}(window));
|