"use strict";

let contextMenu;
let hasPocket = Services.prefs.getBoolPref("extensions.pocket.enabled");

add_task(function* test_setup() {
  const example_base = "http://example.com/browser/browser/base/content/test/general/";
  const url = example_base + "subtst_contextmenu_input.html";
  yield BrowserTestUtils.openNewForegroundTab(gBrowser, url);

  const chrome_base = "chrome://mochitests/content/browser/browser/base/content/test/general/";
  const contextmenu_common = chrome_base + "contextmenu_common.js";
  Services.scriptloader.loadSubScript(contextmenu_common, this);
});

add_task(function* test_text_input() {
  yield test_contextmenu("#input_text",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   false,
     "---",                 null,
     "spell-check-enabled", true]);
});

add_task(function* test_text_input_spellcheck() {
  yield test_contextmenu("#input_spellcheck_no_value",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   false,
     "---",                 null,
     "spell-check-enabled", true,
     "spell-dictionaries",  true,
         ["spell-check-dictionary-en-US", true,
          "---",                          null,
          "spell-add-dictionaries",       true], null],
    {
      waitForSpellCheck: true,
      // Need to dynamically add/remove the "password" type or LoginManager
      // will think that the form inputs on the page are part of a login
      // and will add fill-login context menu items.
      *preCheckContextMenuFn() {
        yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
          let doc = content.document;
          let input = doc.getElementById("input_spellcheck_no_value");
          input.setAttribute("spellcheck", "true");
          input.clientTop; // force layout flush
        });
      },
    }
  );
});

add_task(function* test_text_input_spellcheckwrong() {
  yield test_contextmenu("#input_spellcheck_incorrect",
    ["*prodigality",        true, // spelling suggestion
     "spell-add-to-dictionary", true,
     "---",                 null,
     "context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   true,
     "---",                 null,
     "spell-check-enabled", true,
     "spell-dictionaries",  true,
         ["spell-check-dictionary-en-US", true,
          "---",                          null,
          "spell-add-dictionaries",       true], null],
     {waitForSpellCheck: true}
   );
});

add_task(function* test_text_input_spellcheckcorrect() {
  yield test_contextmenu("#input_spellcheck_correct",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   true,
     "---",                 null,
     "spell-check-enabled", true,
     "spell-dictionaries",  true,
         ["spell-check-dictionary-en-US", true,
          "---",                          null,
          "spell-add-dictionaries",       true], null],
     {waitForSpellCheck: true}
  );
});

add_task(function* test_text_input_disabled() {
  yield test_contextmenu("#input_disabled",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   true,
     "---",                 null,
     "spell-check-enabled", true],
    {skipFocusChange: true}
  );
});

add_task(function* test_password_input() {
  todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
              " it should be disabled");
  yield test_contextmenu("#input_password",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   null,
     "---",                 null,
     "fill-login",          null,
       ["fill-login-no-logins",       false,
        "---",                        null,
        "fill-login-saved-passwords", true], null],
    {
      skipFocusChange: true,
      // Need to dynamically add/remove the "password" type or LoginManager
      // will think that the form inputs on the page are part of a login
      // and will add fill-login context menu items.
      *preCheckContextMenuFn() {
        yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
          let doc = content.document;
          let input = doc.getElementById("input_password");
          input.type = "password";
          input.clientTop; // force layout flush
        });
      },
      *postCheckContextMenuFn() {
        yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
          let doc = content.document;
          let input = doc.getElementById("input_password");
          input.type = "text";
          input.clientTop; // force layout flush
        });
      },
    }
  );
});

add_task(function* test_tel_email_url_number_input() {
  todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
              " it should be disabled");
  for (let selector of ["#input_email", "#input_url", "#input_tel", "#input_number"]) {
    yield test_contextmenu(selector,
      ["context-undo",        false,
       "---",                 null,
       "context-cut",         true,
       "context-copy",        true,
       "context-paste",       null, // ignore clipboard state
       "context-delete",      false,
       "---",                 null,
       "context-selectall",   null],
      {skipFocusChange: true}
    );
  }
});

add_task(function* test_date_time_color_range_input() {
  for (let selector of ["#input_date", "#input_time", "#input_color", "#input_range"]) {
    yield test_contextmenu(selector,
      ["context-navigation", null,
           ["context-back",         false,
            "context-forward",      false,
            "context-reload",       true,
            "context-bookmarkpage", true], null,
       "---",                  null,
       "context-savepage",     true,
       ...(hasPocket ? ["context-pocket", true] : []),
       "---",                  null,
       "context-viewbgimage",  false,
       "context-selectall",    null,
       "---",                  null,
       "context-viewsource",   true,
       "context-viewinfo",     true],
      {skipFocusChange: true}
    );
  }
});

add_task(function* test_search_input() {
  todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
              " it should be disabled");
  yield test_contextmenu("#input_search",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   null,
     "---",                 null,
     "spell-check-enabled", true],
    {skipFocusChange: true}
  );
});

add_task(function* test_datetime_month_week_datetimelocal_input_todos() {
  for (let type of ["datetime", "month", "week", "datetime-local"]) {
    let returnedType = yield ContentTask.spawn(gBrowser.selectedBrowser, type, function*(type) {
      let doc = content.document;
      let input = doc.getElementById("input_" + type);
      return input.type;
    });
    todo_is(returnedType, type, `TODO: add test for ${type} input fields`);
  }
});

add_task(function* test_text_input_readonly() {
  todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
              " it should be disabled");
  todo(false, "spell-check should not be enabled for input[readonly]. see bug 1246296");
  yield test_contextmenu("#input_readonly",
    ["context-undo",        false,
     "---",                 null,
     "context-cut",         true,
     "context-copy",        true,
     "context-paste",       null, // ignore clipboard state
     "context-delete",      false,
     "---",                 null,
     "context-selectall",   null],
    {skipFocusChange: true}
  );
});

add_task(function* test_cleanup() {
  yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
