forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			1725 lines
		
	
	
	
		
			48 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1725 lines
		
	
	
	
		
			48 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | |
| /* vim: set sts=2 sw=2 et tw=80: */
 | |
| "use strict";
 | |
| 
 | |
| const { AddonTestUtils } = ChromeUtils.import(
 | |
|   "resource://testing-common/AddonTestUtils.jsm"
 | |
| );
 | |
| 
 | |
| ChromeUtils.defineESModuleGetters(this, {
 | |
|   PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",
 | |
| });
 | |
| 
 | |
| AddonTestUtils.init(this);
 | |
| AddonTestUtils.overrideCertDB();
 | |
| AddonTestUtils.createAppInfo(
 | |
|   "xpcshell@tests.mozilla.org",
 | |
|   "XPCShell",
 | |
|   "1",
 | |
|   "43"
 | |
| );
 | |
| 
 | |
| add_task(async function test_bookmarks() {
 | |
|   async function background() {
 | |
|     let unsortedId, ourId;
 | |
|     let initialBookmarkCount = 0;
 | |
|     let createdBookmarks = new Set();
 | |
|     let createdFolderId;
 | |
|     let createdSeparatorId;
 | |
|     let collectedEvents = [];
 | |
|     const nonExistentId = "000000000000";
 | |
|     const bookmarkGuids = {
 | |
|       menuGuid: "menu________",
 | |
|       toolbarGuid: "toolbar_____",
 | |
|       unfiledGuid: "unfiled_____",
 | |
|       rootGuid: "root________",
 | |
|     };
 | |
| 
 | |
|     function checkOurBookmark(bookmark) {
 | |
|       browser.test.assertEq(ourId, bookmark.id, "Bookmark has the expected Id");
 | |
|       browser.test.assertTrue(
 | |
|         "parentId" in bookmark,
 | |
|         "Bookmark has a parentId"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         0,
 | |
|         bookmark.index,
 | |
|         "Bookmark has the expected index"
 | |
|       ); // We assume there are no other bookmarks.
 | |
|       browser.test.assertEq(
 | |
|         "http://example.org/",
 | |
|         bookmark.url,
 | |
|         "Bookmark has the expected url"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         "test bookmark",
 | |
|         bookmark.title,
 | |
|         "Bookmark has the expected title"
 | |
|       );
 | |
|       browser.test.assertTrue(
 | |
|         "dateAdded" in bookmark,
 | |
|         "Bookmark has a dateAdded"
 | |
|       );
 | |
|       browser.test.assertFalse(
 | |
|         "dateGroupModified" in bookmark,
 | |
|         "Bookmark does not have a dateGroupModified"
 | |
|       );
 | |
|       browser.test.assertFalse(
 | |
|         "unmodifiable" in bookmark,
 | |
|         "Bookmark is not unmodifiable"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         "bookmark",
 | |
|         bookmark.type,
 | |
|         "Bookmark is of type bookmark"
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     function checkBookmark(expected, bookmark) {
 | |
|       browser.test.assertEq(
 | |
|         expected.url,
 | |
|         bookmark.url,
 | |
|         "Bookmark has the expected url"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         expected.title,
 | |
|         bookmark.title,
 | |
|         "Bookmark has the expected title"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         expected.index,
 | |
|         bookmark.index,
 | |
|         "Bookmark has expected index"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         "bookmark",
 | |
|         bookmark.type,
 | |
|         "Bookmark is of type bookmark"
 | |
|       );
 | |
|       if ("parentId" in expected) {
 | |
|         browser.test.assertEq(
 | |
|           expected.parentId,
 | |
|           bookmark.parentId,
 | |
|           "Bookmark has the expected parentId"
 | |
|         );
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function checkOnCreated(
 | |
|       id,
 | |
|       parentId,
 | |
|       index,
 | |
|       title,
 | |
|       url,
 | |
|       dateAdded,
 | |
|       type = "bookmark"
 | |
|     ) {
 | |
|       let createdData = collectedEvents.pop();
 | |
|       browser.test.assertEq(
 | |
|         "onCreated",
 | |
|         createdData.event,
 | |
|         "onCreated was the last event received"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         createdData.id,
 | |
|         "onCreated event received the expected id"
 | |
|       );
 | |
|       let bookmark = createdData.bookmark;
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         bookmark.id,
 | |
|         "onCreated event received the expected bookmark id"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         parentId,
 | |
|         bookmark.parentId,
 | |
|         "onCreated event received the expected bookmark parentId"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         index,
 | |
|         bookmark.index,
 | |
|         "onCreated event received the expected bookmark index"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         title,
 | |
|         bookmark.title,
 | |
|         "onCreated event received the expected bookmark title"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         url,
 | |
|         bookmark.url,
 | |
|         "onCreated event received the expected bookmark url"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         dateAdded,
 | |
|         bookmark.dateAdded,
 | |
|         "onCreated event received the expected bookmark dateAdded"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         type,
 | |
|         bookmark.type,
 | |
|         "onCreated event received the expected bookmark type"
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     function checkOnChanged(id, url, title) {
 | |
|       // If both url and title are changed, then url is fired last.
 | |
|       let changedData = collectedEvents.pop();
 | |
|       browser.test.assertEq(
 | |
|         "onChanged",
 | |
|         changedData.event,
 | |
|         "onChanged was the last event received"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         changedData.id,
 | |
|         "onChanged event received the expected id"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         url,
 | |
|         changedData.info.url,
 | |
|         "onChanged event received the expected url"
 | |
|       );
 | |
|       // title is fired first.
 | |
|       changedData = collectedEvents.pop();
 | |
|       browser.test.assertEq(
 | |
|         "onChanged",
 | |
|         changedData.event,
 | |
|         "onChanged was the last event received"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         changedData.id,
 | |
|         "onChanged event received the expected id"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         title,
 | |
|         changedData.info.title,
 | |
|         "onChanged event received the expected title"
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     function checkOnMoved(id, parentId, oldParentId, index, oldIndex) {
 | |
|       let movedData = collectedEvents.pop();
 | |
|       browser.test.assertEq(
 | |
|         "onMoved",
 | |
|         movedData.event,
 | |
|         "onMoved was the last event received"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         movedData.id,
 | |
|         "onMoved event received the expected id"
 | |
|       );
 | |
|       let info = movedData.info;
 | |
|       browser.test.assertEq(
 | |
|         parentId,
 | |
|         info.parentId,
 | |
|         "onMoved event received the expected parentId"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         oldParentId,
 | |
|         info.oldParentId,
 | |
|         "onMoved event received the expected oldParentId"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         index,
 | |
|         info.index,
 | |
|         "onMoved event received the expected index"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         oldIndex,
 | |
|         info.oldIndex,
 | |
|         "onMoved event received the expected oldIndex"
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     function checkOnRemoved(id, parentId, index, title, url, type = "folder") {
 | |
|       let removedData = collectedEvents.pop();
 | |
|       browser.test.assertEq(
 | |
|         "onRemoved",
 | |
|         removedData.event,
 | |
|         "onRemoved was the last event received"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         removedData.id,
 | |
|         "onRemoved event received the expected id"
 | |
|       );
 | |
|       let info = removedData.info;
 | |
|       browser.test.assertEq(
 | |
|         parentId,
 | |
|         removedData.info.parentId,
 | |
|         "onRemoved event received the expected parentId"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         index,
 | |
|         removedData.info.index,
 | |
|         "onRemoved event received the expected index"
 | |
|       );
 | |
|       let node = info.node;
 | |
|       browser.test.assertEq(
 | |
|         id,
 | |
|         node.id,
 | |
|         "onRemoved event received the expected node id"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         parentId,
 | |
|         node.parentId,
 | |
|         "onRemoved event received the expected node parentId"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         index,
 | |
|         node.index,
 | |
|         "onRemoved event received the expected node index"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         url,
 | |
|         node.url,
 | |
|         "onRemoved event received the expected node url"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         title,
 | |
|         node.title,
 | |
|         "onRemoved event received the expected node title"
 | |
|       );
 | |
|       browser.test.assertEq(
 | |
|         type,
 | |
|         node.type,
 | |
|         "onRemoved event received the expected node type"
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     browser.bookmarks.onChanged.addListener((id, info) => {
 | |
|       collectedEvents.push({ event: "onChanged", id, info });
 | |
|     });
 | |
| 
 | |
|     browser.bookmarks.onCreated.addListener((id, bookmark) => {
 | |
|       collectedEvents.push({ event: "onCreated", id, bookmark });
 | |
|     });
 | |
| 
 | |
|     browser.bookmarks.onMoved.addListener((id, info) => {
 | |
|       collectedEvents.push({ event: "onMoved", id, info });
 | |
|     });
 | |
| 
 | |
|     browser.bookmarks.onRemoved.addListener((id, info) => {
 | |
|       collectedEvents.push({ event: "onRemoved", id, info });
 | |
|     });
 | |
| 
 | |
|     await browser.test.assertRejects(
 | |
|       browser.bookmarks.get(["not-a-bookmark-guid"]),
 | |
|       /Invalid value for property 'guid': "not-a-bookmark-guid"/,
 | |
|       "Expected error thrown when trying to get a bookmark using an invalid guid"
 | |
|     );
 | |
| 
 | |
|     await browser.test
 | |
|       .assertRejects(
 | |
|         browser.bookmarks.get([nonExistentId]),
 | |
|         /Bookmark not found/,
 | |
|         "Expected error thrown when trying to get a bookmark using a non-existent Id"
 | |
|       )
 | |
|       .then(() => {
 | |
|         return browser.bookmarks.search({});
 | |
|       })
 | |
|       .then(results => {
 | |
|         initialBookmarkCount = results.length;
 | |
|         return browser.bookmarks.create({
 | |
|           title: "test bookmark",
 | |
|           url: "http://example.org",
 | |
|           type: "bookmark",
 | |
|         });
 | |
|       })
 | |
|       .then(result => {
 | |
|         ourId = result.id;
 | |
|         checkOurBookmark(result);
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected event received"
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           ourId,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           0,
 | |
|           "test bookmark",
 | |
|           "http://example.org/",
 | |
|           result.dateAdded
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.get(ourId);
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(results.length, 1);
 | |
|         checkOurBookmark(results[0]);
 | |
| 
 | |
|         unsortedId = results[0].parentId;
 | |
|         return browser.bookmarks.get(unsortedId);
 | |
|       })
 | |
|       .then(results => {
 | |
|         let folder = results[0];
 | |
|         browser.test.assertEq(1, results.length, "1 bookmark was returned");
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           unsortedId,
 | |
|           folder.id,
 | |
|           "Folder has the expected id"
 | |
|         );
 | |
|         browser.test.assertTrue("parentId" in folder, "Folder has a parentId");
 | |
|         browser.test.assertTrue("index" in folder, "Folder has an index");
 | |
|         browser.test.assertEq(
 | |
|           undefined,
 | |
|           folder.url,
 | |
|           "Folder does not have a url"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Other Bookmarks",
 | |
|           folder.title,
 | |
|           "Folder has the expected title"
 | |
|         );
 | |
|         browser.test.assertTrue(
 | |
|           "dateAdded" in folder,
 | |
|           "Folder has a dateAdded"
 | |
|         );
 | |
|         browser.test.assertTrue(
 | |
|           "dateGroupModified" in folder,
 | |
|           "Folder has a dateGroupModified"
 | |
|         );
 | |
|         browser.test.assertFalse(
 | |
|           "unmodifiable" in folder,
 | |
|           "Folder is not unmodifiable"
 | |
|         ); // TODO: Do we want to enable this?
 | |
|         browser.test.assertEq(
 | |
|           "folder",
 | |
|           folder.type,
 | |
|           "Folder has a type of folder"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.getChildren(unsortedId);
 | |
|       })
 | |
|       .then(async results => {
 | |
|         browser.test.assertEq(1, results.length, "The folder has one child");
 | |
|         checkOurBookmark(results[0]);
 | |
| 
 | |
|         await browser.test.assertRejects(
 | |
|           browser.bookmarks.update(nonExistentId, { title: "new test title" }),
 | |
|           /No bookmarks found for the provided GUID/,
 | |
|           "Expected error thrown when trying to update a non-existent bookmark"
 | |
|         );
 | |
|         return browser.bookmarks.update(ourId, {
 | |
|           title: "new test title",
 | |
|           url: "http://example.com/",
 | |
|         });
 | |
|       })
 | |
|       .then(async result => {
 | |
|         browser.test.assertEq(
 | |
|           "new test title",
 | |
|           result.title,
 | |
|           "Updated bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "http://example.com/",
 | |
|           result.url,
 | |
|           "Updated bookmark has the expected URL"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           ourId,
 | |
|           result.id,
 | |
|           "Updated bookmark has the expected id"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "bookmark",
 | |
|           result.type,
 | |
|           "Updated bookmark has a type of bookmark"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           2,
 | |
|           collectedEvents.length,
 | |
|           "2 expected events received"
 | |
|         );
 | |
|         checkOnChanged(ourId, "http://example.com/", "new test title");
 | |
| 
 | |
|         await browser.test.assertRejects(
 | |
|           browser.bookmarks.update(ourId, { url: "this is not a valid url" }),
 | |
|           /Invalid bookmark:/,
 | |
|           "Expected error thrown when trying update with an invalid url"
 | |
|         );
 | |
|         return browser.bookmarks.getTree();
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(1, results.length, "getTree returns one result");
 | |
|         let bookmark = results[0].children.find(
 | |
|           bookmarkItem => bookmarkItem.id == unsortedId
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Other Bookmarks",
 | |
|           bookmark.title,
 | |
|           "Folder returned from getTree has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "folder",
 | |
|           bookmark.type,
 | |
|           "Folder returned from getTree has the expected type"
 | |
|         );
 | |
| 
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.create({ parentId: "invalid" }),
 | |
|           error =>
 | |
|             error.message.includes("Invalid bookmark") &&
 | |
|             error.message.includes(`"parentGuid":"invalid"`),
 | |
|           "Expected error thrown when trying to create a bookmark with an invalid parentId"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.bookmarks.remove(ourId);
 | |
|       })
 | |
|       .then(result => {
 | |
|         browser.test.assertEq(
 | |
|           undefined,
 | |
|           result,
 | |
|           "Removing a bookmark returns undefined"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnRemoved(
 | |
|           ourId,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           0,
 | |
|           "new test title",
 | |
|           "http://example.com/",
 | |
|           "bookmark"
 | |
|         );
 | |
| 
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.get(ourId),
 | |
|           /Bookmark not found/,
 | |
|           "Expected error thrown when trying to get a removed bookmark"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.remove(nonExistentId),
 | |
|           /No bookmarks found for the provided GUID/,
 | |
|           "Expected error thrown when trying removed a non-existent bookmark"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         // test bookmarks.search
 | |
|         return Promise.all([
 | |
|           browser.bookmarks.create({
 | |
|             title: "Μοζιλλας",
 | |
|             url: "http://møzîllä.örg/",
 | |
|           }),
 | |
|           browser.bookmarks.create({
 | |
|             title: "Example",
 | |
|             url: "http://example.org/",
 | |
|           }),
 | |
|           browser.bookmarks.create({ title: "Mozilla Folder", type: "folder" }),
 | |
|           browser.bookmarks.create({ title: "EFF", url: "http://eff.org/" }),
 | |
|           browser.bookmarks.create({
 | |
|             title: "Menu Item",
 | |
|             url: "http://menu.org/",
 | |
|             parentId: bookmarkGuids.menuGuid,
 | |
|           }),
 | |
|           browser.bookmarks.create({
 | |
|             title: "Toolbar Item",
 | |
|             url: "http://toolbar.org/",
 | |
|             parentId: bookmarkGuids.toolbarGuid,
 | |
|           }),
 | |
|         ]);
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           6,
 | |
|           collectedEvents.length,
 | |
|           "6 expected events received"
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           results[5].id,
 | |
|           bookmarkGuids.toolbarGuid,
 | |
|           0,
 | |
|           "Toolbar Item",
 | |
|           "http://toolbar.org/",
 | |
|           results[5].dateAdded
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           results[4].id,
 | |
|           bookmarkGuids.menuGuid,
 | |
|           0,
 | |
|           "Menu Item",
 | |
|           "http://menu.org/",
 | |
|           results[4].dateAdded
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           results[3].id,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           0,
 | |
|           "EFF",
 | |
|           "http://eff.org/",
 | |
|           results[3].dateAdded
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           results[2].id,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           0,
 | |
|           "Mozilla Folder",
 | |
|           undefined,
 | |
|           results[2].dateAdded,
 | |
|           "folder"
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           results[1].id,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           0,
 | |
|           "Example",
 | |
|           "http://example.org/",
 | |
|           results[1].dateAdded
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           results[0].id,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           0,
 | |
|           "Μοζιλλας",
 | |
|           "http://xn--mzll-ooa1dud.xn--rg-eka/",
 | |
|           results[0].dateAdded
 | |
|         );
 | |
| 
 | |
|         for (let result of results) {
 | |
|           if (result.title !== "Mozilla Folder") {
 | |
|             createdBookmarks.add(result.id);
 | |
|           }
 | |
|         }
 | |
|         let folderResult = results[2];
 | |
|         createdFolderId = folderResult.id;
 | |
|         return Promise.all([
 | |
|           browser.bookmarks.create({
 | |
|             title: "Mozilla",
 | |
|             url: "http://allizom.org/",
 | |
|             parentId: createdFolderId,
 | |
|           }),
 | |
|           browser.bookmarks.create({
 | |
|             parentId: createdFolderId,
 | |
|             type: "separator",
 | |
|           }),
 | |
|           browser.bookmarks.create({
 | |
|             title: "Mozilla Corporation",
 | |
|             url: "http://allizom.com/",
 | |
|             parentId: createdFolderId,
 | |
|           }),
 | |
|           browser.bookmarks.create({
 | |
|             title: "Firefox",
 | |
|             url: "http://allizom.org/firefox/",
 | |
|             parentId: createdFolderId,
 | |
|           }),
 | |
|         ])
 | |
|           .then(newBookmarks => {
 | |
|             browser.test.assertEq(
 | |
|               4,
 | |
|               collectedEvents.length,
 | |
|               "4 expected events received"
 | |
|             );
 | |
|             checkOnCreated(
 | |
|               newBookmarks[3].id,
 | |
|               createdFolderId,
 | |
|               0,
 | |
|               "Firefox",
 | |
|               "http://allizom.org/firefox/",
 | |
|               newBookmarks[3].dateAdded
 | |
|             );
 | |
|             checkOnCreated(
 | |
|               newBookmarks[2].id,
 | |
|               createdFolderId,
 | |
|               0,
 | |
|               "Mozilla Corporation",
 | |
|               "http://allizom.com/",
 | |
|               newBookmarks[2].dateAdded
 | |
|             );
 | |
|             checkOnCreated(
 | |
|               newBookmarks[1].id,
 | |
|               createdFolderId,
 | |
|               0,
 | |
|               "",
 | |
|               "data:",
 | |
|               newBookmarks[1].dateAdded,
 | |
|               "separator"
 | |
|             );
 | |
|             checkOnCreated(
 | |
|               newBookmarks[0].id,
 | |
|               createdFolderId,
 | |
|               0,
 | |
|               "Mozilla",
 | |
|               "http://allizom.org/",
 | |
|               newBookmarks[0].dateAdded
 | |
|             );
 | |
| 
 | |
|             return browser.bookmarks.create({
 | |
|               title: "About Mozilla",
 | |
|               url: "http://allizom.org/about/",
 | |
|               parentId: createdFolderId,
 | |
|               index: 1,
 | |
|             });
 | |
|           })
 | |
|           .then(result => {
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               collectedEvents.length,
 | |
|               "1 expected events received"
 | |
|             );
 | |
|             checkOnCreated(
 | |
|               result.id,
 | |
|               createdFolderId,
 | |
|               1,
 | |
|               "About Mozilla",
 | |
|               "http://allizom.org/about/",
 | |
|               result.dateAdded
 | |
|             );
 | |
| 
 | |
|             // returns all items on empty object
 | |
|             return browser.bookmarks.search({});
 | |
|           })
 | |
|           .then(async bookmarksSearchResults => {
 | |
|             browser.test.assertTrue(
 | |
|               bookmarksSearchResults.length >= 10,
 | |
|               "At least as many bookmarks as added were returned by search({})"
 | |
|             );
 | |
| 
 | |
|             await browser.test.assertRejects(
 | |
|               browser.bookmarks.remove(createdFolderId),
 | |
|               /Cannot remove a non-empty folder/,
 | |
|               "Expected error thrown when trying to remove a non-empty folder"
 | |
|             );
 | |
|             return browser.bookmarks.getSubTree(createdFolderId);
 | |
|           });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of nodes returned by getSubTree"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla Folder",
 | |
|           results[0].title,
 | |
|           "Folder has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           results[0].parentId,
 | |
|           "Folder has the expected parentId"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "folder",
 | |
|           results[0].type,
 | |
|           "Folder has the expected type"
 | |
|         );
 | |
|         let children = results[0].children;
 | |
|         browser.test.assertEq(
 | |
|           5,
 | |
|           children.length,
 | |
|           "Expected number of bookmarks returned by getSubTree"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Firefox",
 | |
|           children[0].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "bookmark",
 | |
|           children[0].type,
 | |
|           "Bookmark has the expected type"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "About Mozilla",
 | |
|           children[1].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "bookmark",
 | |
|           children[1].type,
 | |
|           "Bookmark has the expected type"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           children[1].index,
 | |
|           "Bookmark has the expected index"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla Corporation",
 | |
|           children[2].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "",
 | |
|           children[3].title,
 | |
|           "Separator has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "data:",
 | |
|           children[3].url,
 | |
|           "Separator has the expected url"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "separator",
 | |
|           children[3].type,
 | |
|           "Separator has the expected type"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla",
 | |
|           children[4].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
| 
 | |
|         // throws an error for invalid query objects
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.search(),
 | |
|           /Incorrect argument types for bookmarks.search/,
 | |
|           "Expected error thrown when trying to search with no arguments"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.search(null),
 | |
|           /Incorrect argument types for bookmarks.search/,
 | |
|           "Expected error thrown when trying to search with null as an argument"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.search(() => {}),
 | |
|           /Incorrect argument types for bookmarks.search/,
 | |
|           "Expected error thrown when trying to search with a function as an argument"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.search({ banana: "banana" }),
 | |
|           /an unexpected "banana" property/,
 | |
|           "Expected error thrown when trying to search with a banana as an argument"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.search({ url: "spider-man vs. batman" }),
 | |
|           /must match the format "url"/,
 | |
|           "Expected error thrown when trying to search with a illegally formatted URL"
 | |
|         );
 | |
|         // queries the full url
 | |
|         return browser.bookmarks.search("http://example.org/");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for url search"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           { title: "Example", url: "http://example.org/", index: 2 },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // queries a partial url
 | |
|         return browser.bookmarks.search("example.org");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for url search"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           { title: "Example", url: "http://example.org/", index: 2 },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // queries the title
 | |
|         return browser.bookmarks.search("EFF");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for title search"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           {
 | |
|             title: "EFF",
 | |
|             url: "http://eff.org/",
 | |
|             index: 0,
 | |
|             parentId: bookmarkGuids.unfiledGuid,
 | |
|           },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // finds menu items
 | |
|         return browser.bookmarks.search("Menu Item");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for menu item search"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           {
 | |
|             title: "Menu Item",
 | |
|             url: "http://menu.org/",
 | |
|             index: 0,
 | |
|             parentId: bookmarkGuids.menuGuid,
 | |
|           },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // finds toolbar items
 | |
|         return browser.bookmarks.search("Toolbar Item");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for toolbar item search"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           {
 | |
|             title: "Toolbar Item",
 | |
|             url: "http://toolbar.org/",
 | |
|             index: 0,
 | |
|             parentId: bookmarkGuids.toolbarGuid,
 | |
|           },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // finds folders
 | |
|         return browser.bookmarks.search("Mozilla Folder");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of folders returned"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla Folder",
 | |
|           results[0].title,
 | |
|           "Folder has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "folder",
 | |
|           results[0].type,
 | |
|           "Folder has the expected type"
 | |
|         );
 | |
| 
 | |
|         // is case-insensitive
 | |
|         return browser.bookmarks.search("corporation");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returnedfor case-insensitive search"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla Corporation",
 | |
|           results[0].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
| 
 | |
|         // is case-insensitive for non-ascii
 | |
|         return browser.bookmarks.search("ΜοΖΙΛΛΑς");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for non-ascii search"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Μοζιλλας",
 | |
|           results[0].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
| 
 | |
|         // returns multiple results
 | |
|         return browser.bookmarks.search("allizom");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           4,
 | |
|           results.length,
 | |
|           "Expected number of multiple results returned"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla",
 | |
|           results[0].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla Corporation",
 | |
|           results[1].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Firefox",
 | |
|           results[2].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "About Mozilla",
 | |
|           results[3].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
| 
 | |
|         // accepts a url field
 | |
|         return browser.bookmarks.search({ url: "http://allizom.com/" });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for url field"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           {
 | |
|             title: "Mozilla Corporation",
 | |
|             url: "http://allizom.com/",
 | |
|             index: 2,
 | |
|           },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // normalizes urls
 | |
|         return browser.bookmarks.search({ url: "http://allizom.com" });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           results.length,
 | |
|           1,
 | |
|           "Expected number of results returned for normalized url field"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           {
 | |
|             title: "Mozilla Corporation",
 | |
|             url: "http://allizom.com/",
 | |
|             index: 2,
 | |
|           },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // normalizes urls even more
 | |
|         return browser.bookmarks.search({ url: "http:allizom.com" });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           results.length,
 | |
|           1,
 | |
|           "Expected number of results returned for normalized url field"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           {
 | |
|             title: "Mozilla Corporation",
 | |
|             url: "http://allizom.com/",
 | |
|             index: 2,
 | |
|           },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // accepts a title field
 | |
|         return browser.bookmarks.search({ title: "Mozilla" });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           results.length,
 | |
|           1,
 | |
|           "Expected number of results returned for title field"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           { title: "Mozilla", url: "http://allizom.org/", index: 4 },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // can combine title and query
 | |
|         return browser.bookmarks.search({ title: "Mozilla", query: "allizom" });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           results.length,
 | |
|           "Expected number of results returned for title and query fields"
 | |
|         );
 | |
|         checkBookmark(
 | |
|           { title: "Mozilla", url: "http://allizom.org/", index: 4 },
 | |
|           results[0]
 | |
|         );
 | |
| 
 | |
|         // uses AND conditions
 | |
|         return browser.bookmarks.search({ title: "EFF", query: "allizom" });
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           0,
 | |
|           results.length,
 | |
|           "Expected number of results returned for non-matching title and query fields"
 | |
|         );
 | |
| 
 | |
|         // returns an empty array on item not found
 | |
|         return browser.bookmarks.search("microsoft");
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           0,
 | |
|           results.length,
 | |
|           "Expected number of results returned for non-matching search"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.getRecent(""),
 | |
|           /Incorrect argument types for bookmarks.getRecent/,
 | |
|           "Expected error thrown when calling getRecent with an empty string"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         browser.test.assertThrows(
 | |
|           () => browser.bookmarks.getRecent(1.234),
 | |
|           /Incorrect argument types for bookmarks.getRecent/,
 | |
|           "Expected error thrown when calling getRecent with a decimal number"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return Promise.all([
 | |
|           browser.bookmarks.search("corporation"),
 | |
|           browser.bookmarks.getChildren(bookmarkGuids.menuGuid),
 | |
|         ]);
 | |
|       })
 | |
|       .then(results => {
 | |
|         let corporationBookmark = results[0][0];
 | |
|         let childCount = results[1].length;
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           2,
 | |
|           corporationBookmark.index,
 | |
|           "Bookmark has the expected index"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks
 | |
|           .move(corporationBookmark.id, { index: 0 })
 | |
|           .then(result => {
 | |
|             browser.test.assertEq(
 | |
|               0,
 | |
|               result.index,
 | |
|               "Bookmark has the expected index"
 | |
|             );
 | |
| 
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               collectedEvents.length,
 | |
|               "1 expected events received"
 | |
|             );
 | |
|             checkOnMoved(
 | |
|               corporationBookmark.id,
 | |
|               createdFolderId,
 | |
|               createdFolderId,
 | |
|               0,
 | |
|               2
 | |
|             );
 | |
| 
 | |
|             return browser.bookmarks.move(corporationBookmark.id, {
 | |
|               parentId: bookmarkGuids.menuGuid,
 | |
|             });
 | |
|           })
 | |
|           .then(result => {
 | |
|             browser.test.assertEq(
 | |
|               bookmarkGuids.menuGuid,
 | |
|               result.parentId,
 | |
|               "Bookmark has the expected parent"
 | |
|             );
 | |
|             browser.test.assertEq(
 | |
|               childCount,
 | |
|               result.index,
 | |
|               "Bookmark has the expected index"
 | |
|             );
 | |
| 
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               collectedEvents.length,
 | |
|               "1 expected events received"
 | |
|             );
 | |
|             checkOnMoved(
 | |
|               corporationBookmark.id,
 | |
|               bookmarkGuids.menuGuid,
 | |
|               createdFolderId,
 | |
|               1,
 | |
|               0
 | |
|             );
 | |
| 
 | |
|             return browser.bookmarks.move(corporationBookmark.id, { index: 0 });
 | |
|           })
 | |
|           .then(result => {
 | |
|             browser.test.assertEq(
 | |
|               bookmarkGuids.menuGuid,
 | |
|               result.parentId,
 | |
|               "Bookmark has the expected parent"
 | |
|             );
 | |
|             browser.test.assertEq(
 | |
|               0,
 | |
|               result.index,
 | |
|               "Bookmark has the expected index"
 | |
|             );
 | |
| 
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               collectedEvents.length,
 | |
|               "1 expected events received"
 | |
|             );
 | |
|             checkOnMoved(
 | |
|               corporationBookmark.id,
 | |
|               bookmarkGuids.menuGuid,
 | |
|               bookmarkGuids.menuGuid,
 | |
|               0,
 | |
|               1
 | |
|             );
 | |
| 
 | |
|             return browser.bookmarks.move(corporationBookmark.id, {
 | |
|               parentId: bookmarkGuids.toolbarGuid,
 | |
|               index: 1,
 | |
|             });
 | |
|           })
 | |
|           .then(result => {
 | |
|             browser.test.assertEq(
 | |
|               bookmarkGuids.toolbarGuid,
 | |
|               result.parentId,
 | |
|               "Bookmark has the expected parent"
 | |
|             );
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               result.index,
 | |
|               "Bookmark has the expected index"
 | |
|             );
 | |
| 
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               collectedEvents.length,
 | |
|               "1 expected events received"
 | |
|             );
 | |
|             checkOnMoved(
 | |
|               corporationBookmark.id,
 | |
|               bookmarkGuids.toolbarGuid,
 | |
|               bookmarkGuids.menuGuid,
 | |
|               1,
 | |
|               0
 | |
|             );
 | |
| 
 | |
|             createdBookmarks.add(corporationBookmark.id);
 | |
|           });
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.bookmarks.getRecent(4);
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           4,
 | |
|           results.length,
 | |
|           "Expected number of results returned by getRecent"
 | |
|         );
 | |
|         let prevDate = results[0].dateAdded;
 | |
|         for (let bookmark of results) {
 | |
|           browser.test.assertTrue(
 | |
|             bookmark.dateAdded <= prevDate,
 | |
|             "The recent bookmarks are sorted by dateAdded"
 | |
|           );
 | |
|           prevDate = bookmark.dateAdded;
 | |
|         }
 | |
|         let bookmarksByTitle = results.sort((a, b) => {
 | |
|           return a.title.localeCompare(b.title);
 | |
|         });
 | |
|         browser.test.assertEq(
 | |
|           "About Mozilla",
 | |
|           bookmarksByTitle[0].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Firefox",
 | |
|           bookmarksByTitle[1].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla",
 | |
|           bookmarksByTitle[2].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "Mozilla Corporation",
 | |
|           bookmarksByTitle[3].title,
 | |
|           "Bookmark has the expected title"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.search({});
 | |
|       })
 | |
|       .then(results => {
 | |
|         let startBookmarkCount = results.length;
 | |
| 
 | |
|         return browser.bookmarks
 | |
|           .search({ title: "Mozilla Folder" })
 | |
|           .then(result => {
 | |
|             return browser.bookmarks.removeTree(result[0].id);
 | |
|           })
 | |
|           .then(() => {
 | |
|             browser.test.assertEq(
 | |
|               1,
 | |
|               collectedEvents.length,
 | |
|               "1 expected events received"
 | |
|             );
 | |
|             checkOnRemoved(
 | |
|               createdFolderId,
 | |
|               bookmarkGuids.unfiledGuid,
 | |
|               1,
 | |
|               "Mozilla Folder"
 | |
|             );
 | |
| 
 | |
|             return browser.bookmarks.search({}).then(searchResults => {
 | |
|               browser.test.assertEq(
 | |
|                 startBookmarkCount - 5,
 | |
|                 searchResults.length,
 | |
|                 "Expected number of results returned after removeTree"
 | |
|               );
 | |
|             });
 | |
|           });
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.bookmarks.create({ title: "Empty Folder" });
 | |
|       })
 | |
|       .then(result => {
 | |
|         createdFolderId = result.id;
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           createdFolderId,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           3,
 | |
|           "Empty Folder",
 | |
|           undefined,
 | |
|           result.dateAdded,
 | |
|           "folder"
 | |
|         );
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           "Empty Folder",
 | |
|           result.title,
 | |
|           "Folder has the expected title"
 | |
|         );
 | |
|         browser.test.assertEq(
 | |
|           "folder",
 | |
|           result.type,
 | |
|           "Folder has the expected type"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.create({
 | |
|           parentId: createdFolderId,
 | |
|           type: "separator",
 | |
|         });
 | |
|       })
 | |
|       .then(result => {
 | |
|         createdSeparatorId = result.id;
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           createdSeparatorId,
 | |
|           createdFolderId,
 | |
|           0,
 | |
|           "",
 | |
|           "data:",
 | |
|           result.dateAdded,
 | |
|           "separator"
 | |
|         );
 | |
|         return browser.bookmarks.remove(createdSeparatorId);
 | |
|       })
 | |
|       .then(() => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnRemoved(
 | |
|           createdSeparatorId,
 | |
|           createdFolderId,
 | |
|           0,
 | |
|           "",
 | |
|           "data:",
 | |
|           "separator"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.remove(createdFolderId);
 | |
|       })
 | |
|       .then(() => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnRemoved(
 | |
|           createdFolderId,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           3,
 | |
|           "Empty Folder"
 | |
|         );
 | |
| 
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.get(createdFolderId),
 | |
|           /Bookmark not found/,
 | |
|           "Expected error thrown when trying to get a removed folder"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.getChildren(nonExistentId),
 | |
|           /root is null/,
 | |
|           "Expected error thrown when trying to getChildren for a non-existent folder"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.move(nonExistentId, {}),
 | |
|           /No bookmarks found for the provided GUID/,
 | |
|           "Expected error thrown when calling move with a non-existent bookmark"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.create({
 | |
|             title: "test root folder",
 | |
|             parentId: bookmarkGuids.rootGuid,
 | |
|           }),
 | |
|           "The bookmark root cannot be modified",
 | |
|           "Expected error thrown when creating bookmark folder at the root"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.update(bookmarkGuids.rootGuid, {
 | |
|             title: "test update title",
 | |
|           }),
 | |
|           "The bookmark root cannot be modified",
 | |
|           "Expected error thrown when updating root"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.remove(bookmarkGuids.rootGuid),
 | |
|           "The bookmark root cannot be modified",
 | |
|           "Expected error thrown when removing root"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.removeTree(bookmarkGuids.rootGuid),
 | |
|           "The bookmark root cannot be modified",
 | |
|           "Expected error thrown when removing root tree"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.bookmarks.create({ title: "Empty Folder" });
 | |
|       })
 | |
|       .then(async result => {
 | |
|         createdFolderId = result.id;
 | |
| 
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnCreated(
 | |
|           createdFolderId,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           3,
 | |
|           "Empty Folder",
 | |
|           undefined,
 | |
|           result.dateAdded,
 | |
|           "folder"
 | |
|         );
 | |
| 
 | |
|         await browser.test.assertRejects(
 | |
|           browser.bookmarks.move(createdFolderId, {
 | |
|             parentId: bookmarkGuids.rootGuid,
 | |
|           }),
 | |
|           "The bookmark root cannot be modified",
 | |
|           "Expected error thrown when moving bookmark folder to the root"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.remove(createdFolderId);
 | |
|       })
 | |
|       .then(() => {
 | |
|         browser.test.assertEq(
 | |
|           1,
 | |
|           collectedEvents.length,
 | |
|           "1 expected events received"
 | |
|         );
 | |
|         checkOnRemoved(
 | |
|           createdFolderId,
 | |
|           bookmarkGuids.unfiledGuid,
 | |
|           3,
 | |
|           "Empty Folder",
 | |
|           undefined,
 | |
|           "folder"
 | |
|         );
 | |
| 
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.get(createdFolderId),
 | |
|           "Bookmark not found",
 | |
|           "Expected error thrown when trying to get a removed folder"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         return browser.test.assertRejects(
 | |
|           browser.bookmarks.move(bookmarkGuids.rootGuid, {
 | |
|             parentId: bookmarkGuids.unfiledGuid,
 | |
|           }),
 | |
|           "The bookmark root cannot be modified",
 | |
|           "Expected error thrown when moving root"
 | |
|         );
 | |
|       })
 | |
|       .then(() => {
 | |
|         // remove all created bookmarks
 | |
|         let promises = Array.from(createdBookmarks, guid =>
 | |
|           browser.bookmarks.remove(guid)
 | |
|         );
 | |
|         return Promise.all(promises);
 | |
|       })
 | |
|       .then(() => {
 | |
|         browser.test.assertEq(
 | |
|           createdBookmarks.size,
 | |
|           collectedEvents.length,
 | |
|           "expected number of events received"
 | |
|         );
 | |
| 
 | |
|         return browser.bookmarks.search({});
 | |
|       })
 | |
|       .then(results => {
 | |
|         browser.test.assertEq(
 | |
|           initialBookmarkCount,
 | |
|           results.length,
 | |
|           "All created bookmarks have been removed"
 | |
|         );
 | |
| 
 | |
|         return browser.test.notifyPass("bookmarks");
 | |
|       })
 | |
|       .catch(error => {
 | |
|         browser.test.fail(`Error: ${String(error)} :: ${error.stack}`);
 | |
|         browser.test.notifyFail("bookmarks");
 | |
|       });
 | |
|   }
 | |
| 
 | |
|   let extension = ExtensionTestUtils.loadExtension({
 | |
|     background,
 | |
|     manifest: {
 | |
|       permissions: ["bookmarks"],
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   await extension.startup();
 | |
|   await extension.awaitFinish("bookmarks");
 | |
|   await extension.unload();
 | |
| });
 | |
| 
 | |
| add_task(async function test_get_recent_with_tag_and_query() {
 | |
|   function background() {
 | |
|     browser.bookmarks.getRecent(100).then(bookmarks => {
 | |
|       browser.test.sendMessage("bookmarks", bookmarks);
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   let extension = ExtensionTestUtils.loadExtension({
 | |
|     background,
 | |
|     manifest: {
 | |
|       permissions: ["bookmarks"],
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   // Start with an empty bookmarks database.
 | |
|   await PlacesUtils.bookmarks.eraseEverything();
 | |
| 
 | |
|   let createdBookmarks = [];
 | |
|   for (let i = 0; i < 3; i++) {
 | |
|     let bookmark = {
 | |
|       type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
 | |
|       url: `http://example.com/${i}`,
 | |
|       title: `My bookmark ${i}`,
 | |
|       parentGuid: PlacesUtils.bookmarks.unfiledGuid,
 | |
|     };
 | |
|     createdBookmarks.unshift(bookmark);
 | |
|     await PlacesUtils.bookmarks.insert(bookmark);
 | |
|   }
 | |
| 
 | |
|   // Add a tag to the most recent url to prove it doesn't get returned.
 | |
|   PlacesUtils.tagging.tagURI(NetUtil.newURI("http://example.com/${i}"), [
 | |
|     "Test Tag",
 | |
|   ]);
 | |
| 
 | |
|   // Add a query bookmark.
 | |
|   let queryURL = `place:parent=${PlacesUtils.bookmarks.menuGuid}&queryType=1`;
 | |
|   await PlacesUtils.bookmarks.insert({
 | |
|     parentGuid: PlacesUtils.bookmarks.unfiledGuid,
 | |
|     url: queryURL,
 | |
|     title: "a test query",
 | |
|   });
 | |
| 
 | |
|   await extension.startup();
 | |
|   let receivedBookmarks = await extension.awaitMessage("bookmarks");
 | |
| 
 | |
|   equal(
 | |
|     receivedBookmarks.length,
 | |
|     3,
 | |
|     "The expected number of bookmarks was returned."
 | |
|   );
 | |
|   for (let i = 0; i < 3; i++) {
 | |
|     let actual = receivedBookmarks[i];
 | |
|     let expected = createdBookmarks[i];
 | |
|     equal(actual.url, expected.url, "Bookmark has the expected url.");
 | |
|     equal(actual.title, expected.title, "Bookmark has the expected title.");
 | |
|     equal(
 | |
|       actual.parentId,
 | |
|       expected.parentGuid,
 | |
|       "Bookmark has the expected parentId."
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   await extension.unload();
 | |
| });
 | |
| 
 | |
| add_task(async function test_tree_with_empty_folder() {
 | |
|   async function background() {
 | |
|     await browser.bookmarks.create({ title: "Empty Folder" });
 | |
|     let nonEmptyFolder = await browser.bookmarks.create({
 | |
|       title: "Non-Empty Folder",
 | |
|     });
 | |
|     await browser.bookmarks.create({
 | |
|       title: "A bookmark",
 | |
|       url: "http://example.com",
 | |
|       parentId: nonEmptyFolder.id,
 | |
|     });
 | |
| 
 | |
|     let tree = await browser.bookmarks.getSubTree(nonEmptyFolder.parentId);
 | |
|     browser.test.assertEq(
 | |
|       0,
 | |
|       tree[0].children[0].children.length,
 | |
|       "The empty folder returns an empty array for children."
 | |
|     );
 | |
|     browser.test.assertEq(
 | |
|       1,
 | |
|       tree[0].children[1].children.length,
 | |
|       "The non-empty folder returns a single item array for children."
 | |
|     );
 | |
| 
 | |
|     let children = await browser.bookmarks.getChildren(nonEmptyFolder.parentId);
 | |
|     // getChildren should only return immediate children. This is not tested in the
 | |
|     // monster test above.
 | |
|     for (let child of children) {
 | |
|       browser.test.assertEq(
 | |
|         undefined,
 | |
|         child.children,
 | |
|         "Child from getChildren does not contain any children."
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     browser.test.sendMessage("done");
 | |
|   }
 | |
| 
 | |
|   let extension = ExtensionTestUtils.loadExtension({
 | |
|     background,
 | |
|     manifest: {
 | |
|       permissions: ["bookmarks"],
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   // Start with an empty bookmarks database.
 | |
|   await PlacesUtils.bookmarks.eraseEverything();
 | |
| 
 | |
|   await extension.startup();
 | |
|   await extension.awaitMessage("done");
 | |
| 
 | |
|   await extension.unload();
 | |
| });
 | |
| 
 | |
| add_task(
 | |
|   {
 | |
|     pref_set: [["extensions.eventPages.enabled", true]],
 | |
|   },
 | |
|   async function test_bookmarks_event_page() {
 | |
|     await AddonTestUtils.promiseStartupManager();
 | |
|     let extension = ExtensionTestUtils.loadExtension({
 | |
|       useAddonManager: "permanent",
 | |
|       manifest: {
 | |
|         browser_specific_settings: { gecko: { id: "eventpage@bookmarks" } },
 | |
|         permissions: ["bookmarks"],
 | |
|         background: { persistent: false },
 | |
|       },
 | |
|       background() {
 | |
|         browser.bookmarks.onCreated.addListener(() => {
 | |
|           browser.test.sendMessage("onCreated");
 | |
|         });
 | |
|         browser.bookmarks.onRemoved.addListener(() => {
 | |
|           browser.test.sendMessage("onRemoved");
 | |
|         });
 | |
|         browser.bookmarks.onChanged.addListener(() => {});
 | |
|         browser.bookmarks.onMoved.addListener(() => {});
 | |
|         browser.test.sendMessage("ready");
 | |
|       },
 | |
|     });
 | |
| 
 | |
|     const EVENTS = ["onCreated", "onRemoved", "onChanged", "onMoved"];
 | |
|     await PlacesUtils.bookmarks.eraseEverything();
 | |
| 
 | |
|     await extension.startup();
 | |
|     await extension.awaitMessage("ready");
 | |
|     for (let event of EVENTS) {
 | |
|       assertPersistentListeners(extension, "bookmarks", event, {
 | |
|         primed: false,
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     // test events waken background
 | |
|     await extension.terminateBackground();
 | |
|     for (let event of EVENTS) {
 | |
|       assertPersistentListeners(extension, "bookmarks", event, {
 | |
|         primed: true,
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     let bookmark = {
 | |
|       type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
 | |
|       url: `http://example.com/12345`,
 | |
|       title: `My bookmark 12345`,
 | |
|       parentGuid: PlacesUtils.bookmarks.unfiledGuid,
 | |
|     };
 | |
|     await PlacesUtils.bookmarks.insert(bookmark);
 | |
| 
 | |
|     await extension.awaitMessage("ready");
 | |
|     await extension.awaitMessage("onCreated");
 | |
|     for (let event of EVENTS) {
 | |
|       assertPersistentListeners(extension, "bookmarks", event, {
 | |
|         primed: false,
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     await AddonTestUtils.promiseRestartManager();
 | |
|     await extension.awaitStartup();
 | |
| 
 | |
|     for (let event of EVENTS) {
 | |
|       assertPersistentListeners(extension, "bookmarks", event, {
 | |
|         primed: true,
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     await PlacesUtils.bookmarks.eraseEverything();
 | |
|     await extension.awaitMessage("ready");
 | |
|     await extension.awaitMessage("onRemoved");
 | |
| 
 | |
|     await extension.unload();
 | |
|     await AddonTestUtils.promiseShutdownManager();
 | |
|   }
 | |
| );
 | 
