mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-10 01:07:31 +09:00
203 lines
5.6 KiB
JavaScript
203 lines
5.6 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
|
|
* vim:set ts=2 sw=2 sts=2 et:
|
|
*/
|
|
"use strict";
|
|
|
|
Cu.import("resource://services-sync/main.js");
|
|
|
|
Services.prefs.setCharPref("services.sync.username", "someone@somewhere.com");
|
|
|
|
// A mock "Tabs" engine which autocomplete will use instead of the real
|
|
// engine. We pass a constructor that Sync creates.
|
|
function MockTabsEngine() {
|
|
this.clients = null; // We'll set this dynamically
|
|
}
|
|
|
|
MockTabsEngine.prototype = {
|
|
name: "tabs",
|
|
|
|
getAllClients() {
|
|
return this.clients;
|
|
},
|
|
}
|
|
|
|
// A clients engine that doesn't need to be a constructor.
|
|
let MockClientsEngine = {
|
|
isMobile(guid) {
|
|
Assert.ok(guid.endsWith("desktop") || guid.endsWith("mobile"));
|
|
return guid.endsWith("mobile");
|
|
},
|
|
}
|
|
|
|
// Tell Sync about the mocks.
|
|
Weave.Service.engineManager.register(MockTabsEngine);
|
|
Weave.Service.clientsEngine = MockClientsEngine;
|
|
|
|
// Tell the Sync XPCOM service it is initialized.
|
|
let weaveXPCService = Cc["@mozilla.org/weave/service;1"]
|
|
.getService(Ci.nsISupports)
|
|
.wrappedJSObject;
|
|
weaveXPCService.ready = true;
|
|
|
|
// Configure the singleton engine for a test.
|
|
function configureEngine(clients) {
|
|
// Configure the instance Sync created.
|
|
let engine = Weave.Service.engineManager.get("tabs");
|
|
engine.clients = clients;
|
|
// Send an observer that pretends the engine just finished a sync.
|
|
Services.obs.notifyObservers(null, "weave:engine:sync:finish", "tabs");
|
|
}
|
|
|
|
// Make a match object suitable for passing to check_autocomplete.
|
|
function makeRemoteTabMatch(url, deviceName, extra = {}) {
|
|
return {
|
|
uri: makeActionURI("remotetab", {url, deviceName}),
|
|
title: extra.title || url,
|
|
style: [ "action", "remotetab" ],
|
|
icon: extra.icon,
|
|
}
|
|
}
|
|
|
|
// The tests.
|
|
add_task(function* test_nomatch() {
|
|
// Nothing matches.
|
|
configureEngine({
|
|
guid_desktop: {
|
|
clientName: "My Desktop",
|
|
tabs: [{
|
|
urlHistory: ["http://foo.com/"],
|
|
}],
|
|
}
|
|
});
|
|
|
|
// No remote tabs match here, so we only expect search results.
|
|
yield check_autocomplete({
|
|
search: "ex",
|
|
searchParam: "enable-actions",
|
|
matches: [ makeSearchMatch("ex", { heuristic: true }) ],
|
|
});
|
|
});
|
|
|
|
add_task(function* test_minimal() {
|
|
// The minimal client and tabs info we can get away with.
|
|
configureEngine({
|
|
guid_desktop: {
|
|
clientName: "My Desktop",
|
|
tabs: [{
|
|
urlHistory: ["http://example.com/"],
|
|
}],
|
|
}
|
|
});
|
|
|
|
yield check_autocomplete({
|
|
search: "ex",
|
|
searchParam: "enable-actions",
|
|
matches: [ makeSearchMatch("ex", { heuristic: true }),
|
|
makeRemoteTabMatch("http://example.com/", "My Desktop") ],
|
|
});
|
|
});
|
|
|
|
add_task(function* test_maximal() {
|
|
// Every field that could possibly exist on a remote record.
|
|
configureEngine({
|
|
guid_mobile: {
|
|
clientName: "My Phone",
|
|
tabs: [{
|
|
urlHistory: ["http://example.com/"],
|
|
title: "An Example",
|
|
icon: "http://favicon",
|
|
}],
|
|
}
|
|
});
|
|
|
|
yield check_autocomplete({
|
|
search: "ex",
|
|
searchParam: "enable-actions",
|
|
matches: [ makeSearchMatch("ex", { heuristic: true }),
|
|
makeRemoteTabMatch("http://example.com/", "My Phone",
|
|
{ title: "An Example",
|
|
icon: "moz-anno:favicon:http://favicon/"
|
|
}),
|
|
],
|
|
});
|
|
});
|
|
|
|
add_task(function* test_noShowIcons() {
|
|
Services.prefs.setBoolPref("services.sync.syncedTabs.showRemoteIcons", false);
|
|
configureEngine({
|
|
guid_mobile: {
|
|
clientName: "My Phone",
|
|
tabs: [{
|
|
urlHistory: ["http://example.com/"],
|
|
title: "An Example",
|
|
icon: "http://favicon",
|
|
}],
|
|
}
|
|
});
|
|
|
|
yield check_autocomplete({
|
|
search: "ex",
|
|
searchParam: "enable-actions",
|
|
matches: [ makeSearchMatch("ex", { heuristic: true }),
|
|
makeRemoteTabMatch("http://example.com/", "My Phone",
|
|
{ title: "An Example",
|
|
// expecting the default favicon due to that pref.
|
|
icon: "",
|
|
}),
|
|
],
|
|
});
|
|
Services.prefs.clearUserPref("services.sync.syncedTabs.showRemoteIcons");
|
|
});
|
|
|
|
add_task(function* test_matches_title() {
|
|
// URL doesn't match search expression, should still match the title.
|
|
configureEngine({
|
|
guid_mobile: {
|
|
clientName: "My Phone",
|
|
tabs: [{
|
|
urlHistory: ["http://foo.com/"],
|
|
title: "An Example",
|
|
}],
|
|
}
|
|
});
|
|
|
|
yield check_autocomplete({
|
|
search: "ex",
|
|
searchParam: "enable-actions",
|
|
matches: [ makeSearchMatch("ex", { heuristic: true }),
|
|
makeRemoteTabMatch("http://foo.com/", "My Phone",
|
|
{ title: "An Example" }),
|
|
],
|
|
});
|
|
});
|
|
|
|
add_task(function* test_localtab_matches_override() {
|
|
// We have an open tab to the same page on a remote device, only "switch to
|
|
// tab" should appear as duplicate detection removed the remote one.
|
|
|
|
// First setup Sync to have the page as a remote tab.
|
|
configureEngine({
|
|
guid_mobile: {
|
|
clientName: "My Phone",
|
|
tabs: [{
|
|
urlHistory: ["http://foo.com/"],
|
|
title: "An Example",
|
|
}],
|
|
}
|
|
});
|
|
|
|
// Setup Places to think the tab is open locally.
|
|
let uri = NetUtil.newURI("http://foo.com/");
|
|
yield PlacesTestUtils.addVisits([
|
|
{ uri: uri, title: "An Example" },
|
|
]);
|
|
addOpenPages(uri, 1);
|
|
|
|
yield check_autocomplete({
|
|
search: "ex",
|
|
searchParam: "enable-actions",
|
|
matches: [ makeSearchMatch("ex", { heuristic: true }),
|
|
makeSwitchToTabMatch("http://foo.com/", { title: "An Example" }),
|
|
],
|
|
});
|
|
});
|