summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/folder-tree-modes/browser_customFolderTreeMode.js
blob: 49189c9254d027d90e2153b6d43435230708fd88 (plain)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/* -*- Mode: JavaScript; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/*
 * Tests for custom folder tree modes. The test mode is provided by the test
 * extension in the test-extension subdirectory.
 */

"use strict";

var {
  assert_folder_mode,
  assert_folder_visible,
  FAKE_SERVER_HOSTNAME,
  get_special_folder,
  mc,
} = ChromeUtils.import(
  "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
);
var { close_window, plan_for_new_window, wait_for_new_window } =
  ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm");

var { ExtensionSupport } = ChromeUtils.import(
  "resource:///modules/ExtensionSupport.jsm"
);
var { MailServices } = ChromeUtils.import(
  "resource:///modules/MailServices.jsm"
);
var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm");

var gInbox;

add_setup(async function () {
  let server = MailServices.accounts.findServer(
    "tinderbox",
    FAKE_SERVER_HOSTNAME,
    "pop3"
  );
  gInbox = await get_special_folder(Ci.nsMsgFolderFlags.Inbox, false, server);

  ExtensionSupport.registerWindowListener("mochitest", {
    chromeURLs: ["chrome://messenger/content/messenger.xhtml"],
    onLoadWindow(aWindow) {
      let testFolderTreeMode = {
        __proto__: aWindow.IFolderTreeMode,
        generateMap(aFTV) {
          var { MailServices } = ChromeUtils.import(
            "resource:///modules/MailServices.jsm"
          );
          // Pick the tinderbox@foo.invalid inbox and use it as the only folder
          let server = MailServices.accounts.findServer(
            "tinderbox",
            "tinderbox123",
            "pop3"
          );
          let item = [];
          let inbox = new aWindow.FtvItem(
            server.rootFolder.getChildNamed("Inbox")
          );
          inbox.__defineGetter__("children", () => []);
          item.push(inbox);

          if (aWindow.gFolderTreeView.activeModes.length > 1) {
            item.unshift(new aWindow.FtvItemHeader("Test%20Mode", "testmode"));
          }

          return item;
        },
      };

      aWindow.gFolderTreeView.registerFolderTreeMode(
        "testmode",
        testFolderTreeMode,
        "Test Mode"
      );
    },
  });
});

// Provided by the extension in test-extension.
var kTestModeID = "testmode";

/**
 * Switch to the mode and verify that it displays correctly.
 */
add_task(function test_switch_to_test_mode() {
  mc.folderTreeView.activeModes = kTestModeID;
  // Hide the all folder view mode.
  mc.folderTreeView.activeModes = "all";

  assert_folder_mode(kTestModeID);
  assert_folder_visible(gInbox);
});

/**
 * Open a new 3-pane window while the custom mode is selected, and make sure
 * that the mode displayed in the new window is the custom mode.
 */
add_task(async function test_open_new_window_with_custom_mode() {
  // Our selection may get lost while changing modes, and be_in_folder is
  // not sufficient to ensure actual selection.
  mc.folderTreeView.selectFolder(gInbox);

  plan_for_new_window("mail:3pane");
  mc.window.MsgOpenNewWindowForFolder(null, -1);
  let mc2 = wait_for_new_window("mail:3pane");

  await TestUtils.waitForCondition(() => mc2.folderTreeView.isInited);
  assert_folder_mode(kTestModeID, mc2);
  assert_folder_visible(gInbox, mc2);

  close_window(mc2);
});

/**
 * Switch back to all folders.
 */
add_task(function test_switch_to_all_folders() {
  // Hide the test mode view enabled in the previous test. The activeModes
  // setter should take care of restoring the "all" view and prevent and empty
  // Folder pane.
  mc.folderTreeView.activeModes = kTestModeID;
  assert_folder_mode("all");
});

registerCleanupFunction(() => {
  mc.window.gFolderTreeView.unregisterFolderTreeMode(kTestModeID);
  ExtensionSupport.unregisterWindowListener("mochitest");
  Assert.report(
    false,
    undefined,
    undefined,
    "Test ran to completion successfully"
  );

  // Some tests that open new windows don't return focus to the main window
  // in a way that satisfies mochitest, and the test times out.
  Services.focus.focusedWindow = window;
  window.gFolderDisplay.tree.focus();
});