Skip to content

Commit 97b6206

Browse files
committed
test: nav back and forward integ tests and fixes
1 parent 3df4558 commit 97b6206

File tree

3 files changed

+141
-8
lines changed

3 files changed

+141
-8
lines changed

src/extensionsIntegrated/NavigationAndHistory/NavigationProvider.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ define(function (require, exports, module) {
4242
var KeyboardPrefs = JSON.parse(require("text!./keyboard.json"));
4343

4444
// Command constants for navigation history
45-
var NAVIGATION_JUMP_BACK = "navigation.jump.back",
46-
NAVIGATION_JUMP_FWD = "navigation.jump.fwd";
45+
const NAVIGATION_JUMP_BACK = "navigation.jump.back",
46+
NAVIGATION_JUMP_FWD = "navigation.jump.fwd",
47+
_NAVIGATION_RESET_FOR_TESTS = "navigation.jump.reset.tests";
4748

4849
// The latency time to capture an explicit cursor movement as a navigation frame
4950
var MAX_NAV_FRAMES_COUNT = 50;
@@ -130,7 +131,9 @@ define(function (require, exports, module) {
130131
fileEntry.exists(function (err, exists) {
131132
if (!err && exists) {
132133
// Additional check to handle external modification and mutation of the doc text affecting markers
133-
if (fileEntry._hash !== entry._hash) {
134+
if(entry.nonEditorView){
135+
deferred.resolve(); // no markers, file exists, valid
136+
} else if (fileEntry._hash !== entry._hash) {
134137
deferred.reject();
135138
} else if (!entry._validateMarkers()) {
136139
deferred.reject();
@@ -440,6 +443,7 @@ define(function (require, exports, module) {
440443
* Command handler to navigate backward
441444
*/
442445
function _navigateBack(skipCurrentFile) {
446+
let deferred = new $.Deferred();
443447
let navFrame = jumpBackwardStack.pop();
444448
let currentEditNavFrame = _getCurrentEditNavFrame();
445449

@@ -463,21 +467,25 @@ define(function (require, exports, module) {
463467
CommandManager.execute(NAVIGATION_JUMP_BACK);
464468
}).always(function () {
465469
_validateNavigationCmds();
470+
deferred.resolve();
466471
});
467472
} else {
468473
jumpBackwardStack.push(currentEditNavFrame);
474+
deferred.resolve();
469475
}
476+
return deferred.promise();
470477
}
471478

472479
/**
473480
* Command handler to navigate forward
474481
*/
475482
function _navigateForward(skipCurrentFile) {
483+
let deferred = new $.Deferred();
476484
let navFrame = jumpForwardStack.pop();
477485
let currentEditNavFrame = _getCurrentEditNavFrame();
478486

479487
if (!navFrame) {
480-
return;
488+
return new $.Deferred().resolve().promise();
481489
}
482490

483491
// Check if the poped frame is the current active frame or doesn't have any valid marker information
@@ -501,8 +509,12 @@ define(function (require, exports, module) {
501509
CommandManager.execute(NAVIGATION_JUMP_FWD);
502510
}).always(function () {
503511
_validateNavigationCmds();
512+
deferred.resolve();
504513
});
514+
} else {
515+
deferred.resolve();
505516
}
517+
return deferred.promise();
506518
}
507519

508520
/**
@@ -522,6 +534,9 @@ define(function (require, exports, module) {
522534
function _initNavigationCommands() {
523535
CommandManager.register(Strings.CMD_NAVIGATE_BACKWARD, NAVIGATION_JUMP_BACK, _navigateBack);
524536
CommandManager.register(Strings.CMD_NAVIGATE_FORWARD, NAVIGATION_JUMP_FWD, _navigateForward);
537+
if(Phoenix.isTestWindow){
538+
CommandManager.register("reset nav forward and back for tests", _NAVIGATION_RESET_FOR_TESTS, _clearStacks);
539+
}
525540
commandJumpBack = CommandManager.get(NAVIGATION_JUMP_BACK);
526541
commandJumpFwd = CommandManager.get(NAVIGATION_JUMP_FWD);
527542
commandJumpBack.setEnabled(false);
@@ -589,6 +604,7 @@ define(function (require, exports, module) {
589604
function _clearStacks() {
590605
jumpBackwardStack = [];
591606
jumpForwardStack = [];
607+
_validateNavigationCmds();
592608
}
593609

594610
/**
@@ -634,12 +650,15 @@ define(function (require, exports, module) {
634650
}
635651
}
636652

637-
function _currentFileChanged(_evt, currentFile, currentPane) {
653+
function _currentFileChanged(_evt) {
654+
if(jumpInProgress) {
655+
return;
656+
}
638657
// We may not always have an active editor to navigate, For Eg: image/video or other custom views
639658
// have its onw non-editor views. This section is to handle those cases.
640659
const activeFullEditor = EditorManager.getCurrentFullEditor();
641660
if(activeFullEditor){
642-
return;
661+
return; // this is a text file with codemirror editor, this is handled by _handleActiveEditorChange
643662
}
644663
const currentEditNavFrame = _getCurrentEditNavFrame();
645664
let lastBack = jumpBackwardStack.pop();
@@ -648,6 +667,7 @@ define(function (require, exports, module) {
648667
jumpBackwardStack.push(lastBack);
649668
}
650669
jumpBackwardStack.push(currentEditNavFrame);
670+
jumpForwardStack = [];
651671
_validateNavigationCmds();
652672
}
653673

src/file/FileUtils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ define(function (require, exports, module) {
7474
const result = new $.Deferred();
7575

7676
file.read({bypassCache: bypassCache}, function (err, data, _encoding, stat) {
77-
if(typeof data !== "string"){
77+
if(!err && typeof data !== "string"){
7878
result.reject(FileSystemError.UNSUPPORTED_ENCODING);
7979
} else if (!err) {
8080
result.resolve(data, stat.mtime);

test/spec/Extn-NavigationAndHistory-integ-test.js

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*
2020
*/
2121

22-
/*global describe, it, expect, beforeAll, afterAll, awaitsForDone, beforeEach, awaits, awaitsFor */
22+
/*global describe, it, expect, beforeAll, afterAll, awaitsForDone, beforeEach, awaits, awaitsFor, path */
2323

2424
define(function (require, exports, module) {
2525
// Recommended to avoid reloading the integration test window Phoenix instance for each test.
@@ -246,4 +246,117 @@ define(function (require, exports, module) {
246246
// await closeSession();
247247
// }, 1000000);
248248
});
249+
describe("integration:Navigation back/forward integration tests", function () {
250+
251+
const testProjectPath = SpecRunnerUtils.getTestPath("/spec/quickview-extn-test-files");
252+
const NAVIGATION_JUMP_BACK = "navigation.jump.back",
253+
NAVIGATION_JUMP_FWD = "navigation.jump.fwd",
254+
_NAVIGATION_RESET_FOR_TESTS = "navigation.jump.reset.tests";
255+
256+
let FileViewController, // loaded from brackets.test
257+
CommandManager,
258+
Commands,
259+
testWindow,
260+
MainViewManager,
261+
brackets,
262+
$;
263+
264+
beforeAll(async function () {
265+
testWindow = await SpecRunnerUtils.createTestWindowAndRun();
266+
brackets = testWindow.brackets;
267+
$ = testWindow.$;
268+
FileViewController = brackets.test.FileViewController;
269+
CommandManager = brackets.test.CommandManager;
270+
Commands = brackets.test.Commands;
271+
MainViewManager = brackets.test.MainViewManager;
272+
}, 30000);
273+
274+
beforeEach(async ()=>{
275+
await awaitsForDone(CommandManager.execute(Commands.FILE_CLOSE_ALL, { _forceClose: true }),
276+
"closing all file");
277+
await SpecRunnerUtils.closeTestWindow();
278+
await SpecRunnerUtils.loadProjectInTestWindow(testProjectPath);
279+
});
280+
281+
afterAll(async function () {
282+
FileViewController = null;
283+
testWindow = null;
284+
brackets = null;
285+
$ = null;
286+
MainViewManager = null;
287+
Commands = null;
288+
CommandManager = null;
289+
await SpecRunnerUtils.closeTestWindow();
290+
}, 30000);
291+
292+
async function openFile(relativePath) {
293+
await awaitsForDone(
294+
FileViewController.openAndSelectDocument(
295+
path.join(testProjectPath, relativePath),
296+
FileViewController.PROJECT_MANAGER
297+
));
298+
}
299+
300+
async function _expectNavButton(backDisabled, fwdDisabled, message) {
301+
await awaitsFor(()=>{
302+
const navBackDisabledState = $("#navBackButton").hasClass("nav-back-btn-disabled");
303+
const navFwdDisabledState = $("#navForwardButton").hasClass("nav-forward-btn-disabled");
304+
return navBackDisabledState === backDisabled && navFwdDisabledState === fwdDisabled;
305+
}, message || "For the nav buttons state to be updated");
306+
expect($("#navBackButton").hasClass("nav-back-btn-disabled")).toBe(backDisabled);
307+
expect($("#navForwardButton").hasClass("nav-forward-btn-disabled")).toBe(fwdDisabled);
308+
}
309+
310+
async function _validateActiveFile(relativePath) {
311+
await awaitsFor(()=>{
312+
return MainViewManager.getCurrentlyViewedFile().fullPath === path.join(testProjectPath, relativePath);
313+
}, "Active file to be " + relativePath);
314+
}
315+
316+
async function navigateBack() {
317+
await awaitsForDone(CommandManager.execute(NAVIGATION_JUMP_BACK), "To navigate back");
318+
}
319+
320+
async function navigateForward() {
321+
await awaitsForDone(CommandManager.execute(NAVIGATION_JUMP_FWD), "To navigate forward");
322+
}
323+
async function navigateResetStack() {
324+
await awaitsForDone(CommandManager.execute(_NAVIGATION_RESET_FOR_TESTS), "reset nav stacks");
325+
}
326+
327+
async function _validateNavForFiles(file1, file2, file3) {
328+
await openFile("img/update_large_icon.svg"); // we open this just to have the first file back button
329+
// on first time, because of a race condition, the back button may(enabled but does nothing) or
330+
// may not be enabled. we cant test for this, so we just open a random file as control
331+
await openFile(file1);
332+
await openFile(file2);
333+
await _expectNavButton(false, true, "nav back only enabled");
334+
await navigateBack();
335+
await _validateActiveFile(file1);
336+
await _expectNavButton(false, false, "both enabled");
337+
await navigateForward();
338+
await _validateActiveFile(file2);
339+
await _expectNavButton(false, true, "nav back only enabled");
340+
await navigateBack();
341+
await _validateActiveFile(file1);
342+
await _expectNavButton(false, false, "both enabled");
343+
await openFile(file3);
344+
await _expectNavButton(false, true, "nav forward disabled due to new file open");
345+
}
346+
347+
it("Should navigate back and forward between text files", async function () {
348+
await navigateResetStack();
349+
await _validateNavForFiles("test.css", "test.html", "test.js");
350+
}, 15000);
351+
352+
it("Should navigate back and forward between image files", async function () {
353+
await navigateResetStack();
354+
await _validateNavForFiles("img/Color.png", "img/grabber_color-well.png", "img/throbber.gif");
355+
}, 15000);
356+
357+
it("Should navigate back and forward between image and text files", async function () {
358+
await navigateResetStack();
359+
await _validateNavForFiles("test.css", "img/grabber_color-well.png", "test.js");
360+
}, 15000);
361+
});
249362
});

0 commit comments

Comments
 (0)