michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/PlacesUtils.jsm"); michael@0: michael@0: function run_test() { michael@0: initApp(); michael@0: michael@0: // NOTE: none of the manifests here can have a workerURL set, or we attempt michael@0: // to create a FrameWorker and that fails under xpcshell... michael@0: let manifests = [ michael@0: { // normal provider michael@0: name: "provider 1", michael@0: origin: "https://example1.com", michael@0: sidebarURL: "https://example1.com/sidebar/", michael@0: }, michael@0: { // provider without workerURL michael@0: name: "provider 2", michael@0: origin: "https://example2.com", michael@0: sidebarURL: "https://example2.com/sidebar/", michael@0: } michael@0: ]; michael@0: michael@0: Cu.import("resource://gre/modules/SocialService.jsm"); michael@0: Cu.import("resource://gre/modules/MozSocialAPI.jsm"); michael@0: michael@0: let runner = new AsyncRunner(); michael@0: let next = runner.next.bind(runner); michael@0: runner.appendIterator(testAddProviders(manifests, next)); michael@0: runner.appendIterator(testGetProvider(manifests, next)); michael@0: runner.appendIterator(testGetProviderList(manifests, next)); michael@0: runner.appendIterator(testAddRemoveProvider(manifests, next)); michael@0: runner.appendIterator(testIsSameOrigin(manifests, next)); michael@0: runner.appendIterator(testResolveUri (manifests, next)); michael@0: runner.appendIterator(testOrderedProviders(manifests, next)); michael@0: runner.appendIterator(testRemoveProviders(manifests, next)); michael@0: runner.next(); michael@0: } michael@0: michael@0: function testAddProviders(manifests, next) { michael@0: do_check_false(SocialService.enabled); michael@0: let provider = yield SocialService.addProvider(manifests[0], next); michael@0: do_check_true(SocialService.enabled); michael@0: do_check_true(MozSocialAPI._enabled); michael@0: do_check_false(provider.enabled); michael@0: provider = yield SocialService.addProvider(manifests[1], next); michael@0: do_check_false(provider.enabled); michael@0: } michael@0: michael@0: function testRemoveProviders(manifests, next) { michael@0: do_check_true(SocialService.enabled); michael@0: yield SocialService.removeProvider(manifests[0].origin, next); michael@0: yield SocialService.removeProvider(manifests[1].origin, next); michael@0: do_check_false(SocialService.enabled); michael@0: } michael@0: michael@0: function testGetProvider(manifests, next) { michael@0: for (let i = 0; i < manifests.length; i++) { michael@0: let manifest = manifests[i]; michael@0: let provider = yield SocialService.getProvider(manifest.origin, next); michael@0: do_check_neq(provider, null); michael@0: do_check_eq(provider.name, manifest.name); michael@0: do_check_eq(provider.workerURL, manifest.workerURL); michael@0: do_check_eq(provider.origin, manifest.origin); michael@0: } michael@0: do_check_eq((yield SocialService.getProvider("bogus", next)), null); michael@0: } michael@0: michael@0: function testGetProviderList(manifests, next) { michael@0: let providers = yield SocialService.getProviderList(next); michael@0: do_check_true(providers.length >= manifests.length); michael@0: for (let i = 0; i < manifests.length; i++) { michael@0: let providerIdx = providers.map(function (p) p.origin).indexOf(manifests[i].origin); michael@0: let provider = providers[providerIdx]; michael@0: do_check_true(!!provider); michael@0: do_check_false(provider.enabled); michael@0: do_check_eq(provider.workerURL, manifests[i].workerURL); michael@0: do_check_eq(provider.name, manifests[i].name); michael@0: } michael@0: } michael@0: michael@0: function testAddRemoveProvider(manifests, next) { michael@0: var threw; michael@0: try { michael@0: // Adding a provider whose origin already exists should fail michael@0: SocialService.addProvider(manifests[0]); michael@0: } catch (ex) { michael@0: threw = ex; michael@0: } michael@0: do_check_neq(threw.toString().indexOf("SocialService.addProvider: provider with this origin already exists"), -1); michael@0: michael@0: let originalProviders = yield SocialService.getProviderList(next); michael@0: michael@0: // Check that provider installation succeeds michael@0: let newProvider = yield SocialService.addProvider({ michael@0: name: "foo", michael@0: origin: "http://example3.com" michael@0: }, next); michael@0: let retrievedNewProvider = yield SocialService.getProvider(newProvider.origin, next); michael@0: do_check_eq(newProvider, retrievedNewProvider); michael@0: michael@0: let providersAfter = yield SocialService.getProviderList(next); michael@0: do_check_eq(providersAfter.length, originalProviders.length + 1); michael@0: do_check_neq(providersAfter.indexOf(newProvider), -1); michael@0: michael@0: // Now remove the provider michael@0: yield SocialService.removeProvider(newProvider.origin, next); michael@0: providersAfter = yield SocialService.getProviderList(next); michael@0: do_check_eq(providersAfter.length, originalProviders.length); michael@0: do_check_eq(providersAfter.indexOf(newProvider), -1); michael@0: newProvider = yield SocialService.getProvider(newProvider.origin, next); michael@0: do_check_true(!newProvider); michael@0: } michael@0: michael@0: function testIsSameOrigin(manifests, next) { michael@0: let providers = yield SocialService.getProviderList(next); michael@0: let provider = providers[0]; michael@0: // provider.origin is a string. michael@0: do_check_true(provider.isSameOrigin(provider.origin)); michael@0: do_check_true(provider.isSameOrigin(Services.io.newURI(provider.origin, null, null))); michael@0: do_check_true(provider.isSameOrigin(provider.origin + "/some-sub-page")); michael@0: do_check_true(provider.isSameOrigin(Services.io.newURI(provider.origin + "/some-sub-page", null, null))); michael@0: do_check_false(provider.isSameOrigin("http://something.com")); michael@0: do_check_false(provider.isSameOrigin(Services.io.newURI("http://something.com", null, null))); michael@0: do_check_false(provider.isSameOrigin("data:text/html,

hi")); michael@0: do_check_true(provider.isSameOrigin("data:text/html,

hi", true)); michael@0: do_check_false(provider.isSameOrigin(Services.io.newURI("data:text/html,

hi", null, null))); michael@0: do_check_true(provider.isSameOrigin(Services.io.newURI("data:text/html,

hi", null, null), true)); michael@0: // we explicitly handle null and return false michael@0: do_check_false(provider.isSameOrigin(null)); michael@0: } michael@0: michael@0: function testResolveUri(manifests, next) { michael@0: let providers = yield SocialService.getProviderList(next); michael@0: let provider = providers[0]; michael@0: do_check_eq(provider.resolveUri(provider.origin).spec, provider.origin + "/"); michael@0: do_check_eq(provider.resolveUri("foo.html").spec, provider.origin + "/foo.html"); michael@0: do_check_eq(provider.resolveUri("/foo.html").spec, provider.origin + "/foo.html"); michael@0: do_check_eq(provider.resolveUri("http://somewhereelse.com/foo.html").spec, "http://somewhereelse.com/foo.html"); michael@0: do_check_eq(provider.resolveUri("data:text/html,

hi").spec, "data:text/html,

hi"); michael@0: } michael@0: michael@0: function testOrderedProviders(manifests, next) { michael@0: let providers = yield SocialService.getProviderList(next); michael@0: michael@0: // add visits for only one of the providers michael@0: let visits = []; michael@0: let startDate = Date.now() * 1000; michael@0: for (let i = 0; i < 10; i++) { michael@0: visits.push({ michael@0: uri: Services.io.newURI(providers[1].sidebarURL + i, null, null), michael@0: visitDate: startDate + i michael@0: }); michael@0: } michael@0: michael@0: promiseAddVisits(visits).then(next); michael@0: yield; michael@0: let orderedProviders = yield SocialService.getOrderedProviderList(next); michael@0: do_check_eq(orderedProviders[0], providers[1]); michael@0: do_check_eq(orderedProviders[1], providers[0]); michael@0: do_check_true(orderedProviders[0].frecency > orderedProviders[1].frecency); michael@0: promiseClearHistory().then(next); michael@0: yield; michael@0: }