1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
"use strict";
const { sinon } = ChromeUtils.importESModule(
"resource://testing-common/Sinon.sys.mjs"
);
const sandbox = sinon.createSandbox();
registerCleanupFunction(async function () {
sandbox.restore();
await PlacesUtils.bookmarks.eraseEverything();
await PlacesUtils.history.clear();
});
let bookmarks; // Bookmarks added via insertTree.
add_setup(async function () {
bookmarks = await PlacesUtils.bookmarks.insertTree({
guid: PlacesUtils.bookmarks.unfiledGuid,
children: [
{
title: "bm1",
url: "http://example.com",
},
{
title: "bm2",
url: "http://example.com/2",
},
],
});
// Undo is called asynchronously - and not waited for. Since we're not
// expecting undo to be called, we can only tell this by stubbing it.
sandbox.stub(PlacesTransactions, "undo").returns(Promise.resolve());
});
// Tests for bug 1391393 - Ensures that if the user cancels the bookmark properties
// dialog without having done any changes, then no undo is called.
add_task(async function test_cancel_with_no_changes() {
await withSidebarTree("bookmarks", async tree => {
tree.selectItems([bookmarks[0].guid]);
// Delete the bookmark to put something in the undo history.
// Rather than calling cmd_delete, we call the remove directly, so that we
// can await on it finishing, and be guaranteed that there's something
// in the history.
await tree.controller.remove("Remove Selection");
tree.selectItems([bookmarks[1].guid]);
// Now open the bookmarks dialog and cancel it.
await withBookmarksDialog(
true,
function openDialog() {
tree.controller.doCommand("placesCmd_show:info");
},
async function test(dialogWin) {
let acceptButton = dialogWin.document
.getElementById("bookmarkpropertiesdialog")
.getButton("accept");
await TestUtils.waitForCondition(
() => !acceptButton.disabled,
"The accept button should be enabled"
);
}
);
// Check the bookmark is still removed.
Assert.ok(
!(await PlacesUtils.bookmarks.fetch(bookmarks[0].guid)),
"The originally removed bookmark should not exist."
);
Assert.ok(
await PlacesUtils.bookmarks.fetch(bookmarks[1].guid),
"The second bookmark should still exist"
);
Assert.ok(
PlacesTransactions.undo.notCalled,
"undo should not have been called"
);
});
});
add_task(async function test_cancel_with_changes() {
await withSidebarTree("bookmarks", async tree => {
tree.selectItems([bookmarks[1].guid]);
// Now open the bookmarks dialog and cancel it.
await withBookmarksDialog(
true,
function openDialog() {
tree.controller.doCommand("placesCmd_show:info");
},
async function test(dialogWin) {
let acceptButton = dialogWin.document
.getElementById("bookmarkpropertiesdialog")
.getButton("accept");
await TestUtils.waitForCondition(
() => !acceptButton.disabled,
"EditBookmark: The accept button should be enabled"
);
let namePicker = dialogWin.document.getElementById(
"editBMPanel_namePicker"
);
fillBookmarkTextField("editBMPanel_namePicker", "new_n", dialogWin);
// Ensure that value in field has changed
Assert.equal(
namePicker.value,
"new_n",
"EditBookmark: The title is the expected one."
);
}
);
let oldBookmark = await PlacesUtils.bookmarks.fetch(bookmarks[1].guid);
Assert.equal(
oldBookmark.title,
"bm2",
"EditBookmark: The title hasn't been changed"
);
});
});
|