Blame devtools/server/tests/browser/browser_storage_updates.js

Packit f0b94e
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
Packit f0b94e
/* Any copyright is dedicated to the Public Domain.
Packit f0b94e
   http://creativecommons.org/publicdomain/zero/1.0/ */
Packit f0b94e
Packit f0b94e
"use strict";
Packit f0b94e
Packit f0b94e
const {StorageFront} = require("devtools/shared/fronts/storage");
Packit f0b94e
Packit f0b94e
const TESTS = [
Packit f0b94e
  // index 0
Packit f0b94e
  {
Packit f0b94e
    action: function (win) {
Packit f0b94e
      info('win.addCookie("c1", "foobar1")');
Packit f0b94e
      win.addCookie("c1", "foobar1");
Packit f0b94e
Packit f0b94e
      info('win.addCookie("c2", "foobar2")');
Packit f0b94e
      win.addCookie("c2", "foobar2");
Packit f0b94e
Packit f0b94e
      info('win.localStorage.setItem("l1", "foobar1")');
Packit f0b94e
      win.localStorage.setItem("l1", "foobar1");
Packit f0b94e
    },
Packit f0b94e
    expected: {
Packit f0b94e
      added: {
Packit f0b94e
        cookies: {
Packit f0b94e
          "http://test1.example.org": [
Packit f0b94e
            getCookieId("c1", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/"),
Packit f0b94e
            getCookieId("c2", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/")
Packit f0b94e
          ]
Packit f0b94e
        },
Packit f0b94e
        localStorage: {
Packit f0b94e
          "http://test1.example.org": ["l1"]
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  // index 1
Packit f0b94e
  {
Packit f0b94e
    action: function (win) {
Packit f0b94e
      info('win.addCookie("c1", "new_foobar1")');
Packit f0b94e
      win.addCookie("c1", "new_foobar1");
Packit f0b94e
Packit f0b94e
      info('win.localStorage.setItem("l2", "foobar2")');
Packit f0b94e
      win.localStorage.setItem("l2", "foobar2");
Packit f0b94e
    },
Packit f0b94e
    expected: {
Packit f0b94e
      changed: {
Packit f0b94e
        cookies: {
Packit f0b94e
          "http://test1.example.org": [
Packit f0b94e
            getCookieId("c1", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/"),
Packit f0b94e
          ]
Packit f0b94e
        }
Packit f0b94e
      },
Packit f0b94e
      added: {
Packit f0b94e
        localStorage: {
Packit f0b94e
          "http://test1.example.org": ["l2"]
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  // index 2
Packit f0b94e
  {
Packit f0b94e
    action: function (win) {
Packit f0b94e
      info('win.removeCookie("c2")');
Packit f0b94e
      win.removeCookie("c2");
Packit f0b94e
Packit f0b94e
      info('win.localStorage.removeItem("l1")');
Packit f0b94e
      win.localStorage.removeItem("l1");
Packit f0b94e
Packit f0b94e
      info('win.localStorage.setItem("l3", "foobar3")');
Packit f0b94e
      win.localStorage.setItem("l3", "foobar3");
Packit f0b94e
    },
Packit f0b94e
    expected: {
Packit f0b94e
      deleted: {
Packit f0b94e
        cookies: {
Packit f0b94e
          "http://test1.example.org": [
Packit f0b94e
            getCookieId("c2", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/"),
Packit f0b94e
          ]
Packit f0b94e
        },
Packit f0b94e
        localStorage: {
Packit f0b94e
          "http://test1.example.org": ["l1"]
Packit f0b94e
        }
Packit f0b94e
      },
Packit f0b94e
      added: {
Packit f0b94e
        localStorage: {
Packit f0b94e
          "http://test1.example.org": ["l3"]
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  // index 3
Packit f0b94e
  {
Packit f0b94e
    action: function (win) {
Packit f0b94e
      info('win.removeCookie("c1")');
Packit f0b94e
      win.removeCookie("c1");
Packit f0b94e
Packit f0b94e
      info('win.addCookie("c3", "foobar3")');
Packit f0b94e
      win.addCookie("c3", "foobar3");
Packit f0b94e
Packit f0b94e
      info('win.localStorage.removeItem("l2")');
Packit f0b94e
      win.localStorage.removeItem("l2");
Packit f0b94e
Packit f0b94e
      info('win.sessionStorage.setItem("s1", "foobar1")');
Packit f0b94e
      win.sessionStorage.setItem("s1", "foobar1");
Packit f0b94e
Packit f0b94e
      info('win.sessionStorage.setItem("s2", "foobar2")');
Packit f0b94e
      win.sessionStorage.setItem("s2", "foobar2");
Packit f0b94e
Packit f0b94e
      info('win.localStorage.setItem("l3", "new_foobar3")');
Packit f0b94e
      win.localStorage.setItem("l3", "new_foobar3");
Packit f0b94e
    },
Packit f0b94e
    expected: {
Packit f0b94e
      added: {
Packit f0b94e
        cookies: {
Packit f0b94e
          "http://test1.example.org": [
Packit f0b94e
            getCookieId("c3", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/"),
Packit f0b94e
          ]
Packit f0b94e
        },
Packit f0b94e
        sessionStorage: {
Packit f0b94e
          "http://test1.example.org": ["s1", "s2"]
Packit f0b94e
        }
Packit f0b94e
      },
Packit f0b94e
      changed: {
Packit f0b94e
        localStorage: {
Packit f0b94e
          "http://test1.example.org": ["l3"]
Packit f0b94e
        }
Packit f0b94e
      },
Packit f0b94e
      deleted: {
Packit f0b94e
        cookies: {
Packit f0b94e
          "http://test1.example.org": [
Packit f0b94e
            getCookieId("c1", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/"),
Packit f0b94e
          ]
Packit f0b94e
        },
Packit f0b94e
        localStorage: {
Packit f0b94e
          "http://test1.example.org": ["l2"]
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  // index 4
Packit f0b94e
  {
Packit f0b94e
    action: function (win) {
Packit f0b94e
      info('win.sessionStorage.removeItem("s1")');
Packit f0b94e
      win.sessionStorage.removeItem("s1");
Packit f0b94e
    },
Packit f0b94e
    expected: {
Packit f0b94e
      deleted: {
Packit f0b94e
        sessionStorage: {
Packit f0b94e
          "http://test1.example.org": ["s1"]
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
  },
Packit f0b94e
Packit f0b94e
  // index 5
Packit f0b94e
  {
Packit f0b94e
    action: function (win) {
Packit f0b94e
      info("win.clearCookies()");
Packit f0b94e
      win.clearCookies();
Packit f0b94e
    },
Packit f0b94e
    expected: {
Packit f0b94e
      deleted: {
Packit f0b94e
        cookies: {
Packit f0b94e
          "http://test1.example.org": [
Packit f0b94e
            getCookieId("c3", "test1.example.org",
Packit f0b94e
                        "/browser/devtools/server/tests/browser/"),
Packit f0b94e
          ]
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
];
Packit f0b94e
Packit f0b94e
function markOutMatched(toBeEmptied, data) {
Packit f0b94e
  if (!Object.keys(toBeEmptied).length) {
Packit f0b94e
    info("Object empty");
Packit f0b94e
    return;
Packit f0b94e
  }
Packit f0b94e
  ok(Object.keys(data).length, "At least one storage type should be present");
Packit f0b94e
Packit f0b94e
  for (let storageType in toBeEmptied) {
Packit f0b94e
    if (!data[storageType]) {
Packit f0b94e
      continue;
Packit f0b94e
    }
Packit f0b94e
    info("Testing for " + storageType);
Packit f0b94e
    for (let host in data[storageType]) {
Packit f0b94e
      ok(toBeEmptied[storageType][host], "Host " + host + " found");
Packit f0b94e
Packit f0b94e
      for (let item of data[storageType][host]) {
Packit f0b94e
        let index = toBeEmptied[storageType][host].indexOf(item);
Packit f0b94e
        ok(index > -1, "Item found - " + item);
Packit f0b94e
        if (index > -1) {
Packit f0b94e
          toBeEmptied[storageType][host].splice(index, 1);
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
      if (!toBeEmptied[storageType][host].length) {
Packit f0b94e
        delete toBeEmptied[storageType][host];
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
    if (!Object.keys(toBeEmptied[storageType]).length) {
Packit f0b94e
      delete toBeEmptied[storageType];
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function onStoresUpdate(expected, {added, changed, deleted}, index) {
Packit f0b94e
  info("inside stores update for index " + index);
Packit f0b94e
Packit f0b94e
  // Here, added, changed and deleted might be null even if they are required as
Packit f0b94e
  // per expected. This is fine as they might come in the next stores-update
Packit f0b94e
  // call or have already come in the previous one.
Packit f0b94e
  if (added) {
Packit f0b94e
    info("matching added object for index " + index);
Packit f0b94e
    markOutMatched(expected.added, added);
Packit f0b94e
  }
Packit f0b94e
  if (changed) {
Packit f0b94e
    info("matching changed object for index " + index);
Packit f0b94e
    markOutMatched(expected.changed, changed);
Packit f0b94e
  }
Packit f0b94e
  if (deleted) {
Packit f0b94e
    info("matching deleted object for index " + index);
Packit f0b94e
    markOutMatched(expected.deleted, deleted);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  if ((!expected.added || !Object.keys(expected.added).length) &&
Packit f0b94e
      (!expected.changed || !Object.keys(expected.changed).length) &&
Packit f0b94e
      (!expected.deleted || !Object.keys(expected.deleted).length)) {
Packit f0b94e
    info("Everything expected has been received for index " + index);
Packit f0b94e
  } else {
Packit f0b94e
    info("Still some updates pending for index " + index);
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function runTest({action, expected}, front, win, index) {
Packit f0b94e
  return new Promise(resolve => {
Packit f0b94e
    front.once("stores-update", function (addedChangedDeleted) {
Packit f0b94e
      onStoresUpdate(expected, addedChangedDeleted, index);
Packit f0b94e
      resolve();
Packit f0b94e
    });
Packit f0b94e
Packit f0b94e
    info("Running test at index " + index);
Packit f0b94e
    action(win);
Packit f0b94e
  });
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testClearLocalAndSessionStores(front, win) {
Packit f0b94e
  return new Promise(resolve => {
Packit f0b94e
    // We need to wait until we have received stores-cleared for both local and
Packit f0b94e
    // session storage.
Packit f0b94e
    let localStorage = false;
Packit f0b94e
    let sessionStorage = false;
Packit f0b94e
Packit f0b94e
    front.on("stores-cleared", function onStoresCleared(data) {
Packit f0b94e
      storesCleared(data);
Packit f0b94e
Packit f0b94e
      if (data.localStorage) {
Packit f0b94e
        localStorage = true;
Packit f0b94e
      }
Packit f0b94e
      if (data.sessionStorage) {
Packit f0b94e
        sessionStorage = true;
Packit f0b94e
      }
Packit f0b94e
      if (localStorage && sessionStorage) {
Packit f0b94e
        front.off("stores-cleared", onStoresCleared);
Packit f0b94e
        resolve();
Packit f0b94e
      }
Packit f0b94e
    });
Packit f0b94e
Packit f0b94e
    win.clearLocalAndSessionStores();
Packit f0b94e
  });
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function storesCleared(data) {
Packit f0b94e
  if (data.sessionStorage || data.localStorage) {
Packit f0b94e
    let hosts = data.sessionStorage || data.localStorage;
Packit f0b94e
    info("Stores cleared required for session storage");
Packit f0b94e
    is(hosts.length, 1, "number of hosts is 1");
Packit f0b94e
    is(hosts[0], "http://test1.example.org",
Packit f0b94e
       "host matches for " + Object.keys(data)[0]);
Packit f0b94e
  } else {
Packit f0b94e
    ok(false, "Stores cleared should only be for local and session storage");
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
async function finishTests(client) {
Packit f0b94e
  await client.close();
Packit f0b94e
  DebuggerServer.destroy();
Packit f0b94e
  finish();
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
add_task(async function () {
Packit f0b94e
  let browser = await addTab(MAIN_DOMAIN + "storage-updates.html");
Packit f0b94e
  // eslint-disable-next-line mozilla/no-cpows-in-tests
Packit f0b94e
  let doc = browser.contentDocumentAsCPOW;
Packit f0b94e
Packit f0b94e
  initDebuggerServer();
Packit f0b94e
Packit f0b94e
  let client = new DebuggerClient(DebuggerServer.connectPipe());
Packit f0b94e
  let form = await connectDebuggerClient(client);
Packit f0b94e
  let front = StorageFront(client, form);
Packit f0b94e
  let win = doc.defaultView.wrappedJSObject;
Packit f0b94e
Packit f0b94e
  await front.listStores();
Packit f0b94e
Packit f0b94e
  for (let i = 0; i < TESTS.length; i++) {
Packit f0b94e
    let test = TESTS[i];
Packit f0b94e
    await runTest(test, front, win, i);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  await testClearLocalAndSessionStores(front, win);
Packit f0b94e
  await finishTests(client);
Packit f0b94e
});