forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			315 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* 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/. */
 | 
						|
 | 
						|
function test() {
 | 
						|
  waitForExplicitFinish();
 | 
						|
 | 
						|
  ok(PopupNotifications, "PopupNotifications object exists");
 | 
						|
  ok(PopupNotifications.panel, "PopupNotifications panel exists");
 | 
						|
 | 
						|
  setup();
 | 
						|
}
 | 
						|
 | 
						|
var tests = [
 | 
						|
  // Test optional params
 | 
						|
  {
 | 
						|
    id: "Test#1",
 | 
						|
    run() {
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notifyObj.secondaryActions = undefined;
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    onShown(popup) {
 | 
						|
      checkPopup(popup, this.notifyObj);
 | 
						|
      dismissNotification(popup);
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      ok(
 | 
						|
        this.notifyObj.dismissalCallbackTriggered,
 | 
						|
        "dismissal callback triggered"
 | 
						|
      );
 | 
						|
      this.notification.remove();
 | 
						|
      ok(this.notifyObj.removedCallbackTriggered, "removed callback triggered");
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test that icons appear
 | 
						|
  {
 | 
						|
    id: "Test#2",
 | 
						|
    run() {
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notifyObj.id = "geolocation";
 | 
						|
      this.notifyObj.anchorID = "geo-notification-icon";
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    onShown(popup) {
 | 
						|
      checkPopup(popup, this.notifyObj);
 | 
						|
      isnot(
 | 
						|
        document.getElementById("geo-notification-icon").getBoundingClientRect()
 | 
						|
          .width,
 | 
						|
        0,
 | 
						|
        "geo anchor should be visible"
 | 
						|
      );
 | 
						|
      dismissNotification(popup);
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      let icon = document.getElementById("geo-notification-icon");
 | 
						|
      isnot(
 | 
						|
        icon.getBoundingClientRect().width,
 | 
						|
        0,
 | 
						|
        "geo anchor should be visible after dismissal"
 | 
						|
      );
 | 
						|
      this.notification.remove();
 | 
						|
      is(
 | 
						|
        icon.getBoundingClientRect().width,
 | 
						|
        0,
 | 
						|
        "geo anchor should not be visible after removal"
 | 
						|
      );
 | 
						|
    },
 | 
						|
  },
 | 
						|
 | 
						|
  // Test that persistence allows the notification to persist across reloads
 | 
						|
  {
 | 
						|
    id: "Test#3",
 | 
						|
    async run() {
 | 
						|
      this.oldSelectedTab = gBrowser.selectedTab;
 | 
						|
      await BrowserTestUtils.openNewForegroundTab(
 | 
						|
        gBrowser,
 | 
						|
        // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
        "http://example.com/"
 | 
						|
      );
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notifyObj.addOptions({
 | 
						|
        persistence: 2,
 | 
						|
      });
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    async onShown(popup) {
 | 
						|
      this.complete = false;
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.org/");
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.com/");
 | 
						|
      // Next load will remove the notification
 | 
						|
      this.complete = true;
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.org/");
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      ok(
 | 
						|
        this.complete,
 | 
						|
        "Should only have hidden the notification after 3 page loads"
 | 
						|
      );
 | 
						|
      ok(this.notifyObj.removedCallbackTriggered, "removal callback triggered");
 | 
						|
      gBrowser.removeTab(gBrowser.selectedTab);
 | 
						|
      gBrowser.selectedTab = this.oldSelectedTab;
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test that a timeout allows the notification to persist across reloads
 | 
						|
  {
 | 
						|
    id: "Test#4",
 | 
						|
    async run() {
 | 
						|
      this.oldSelectedTab = gBrowser.selectedTab;
 | 
						|
      await BrowserTestUtils.openNewForegroundTab(
 | 
						|
        gBrowser,
 | 
						|
        // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
        "http://example.com/"
 | 
						|
      );
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      // Set a timeout of 10 minutes that should never be hit
 | 
						|
      this.notifyObj.addOptions({
 | 
						|
        timeout: Date.now() + 600000,
 | 
						|
      });
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    async onShown(popup) {
 | 
						|
      this.complete = false;
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.org/");
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.com/");
 | 
						|
      // Next load will hide the notification
 | 
						|
      this.notification.options.timeout = Date.now() - 1;
 | 
						|
      this.complete = true;
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.org/");
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      ok(
 | 
						|
        this.complete,
 | 
						|
        "Should only have hidden the notification after the timeout was passed"
 | 
						|
      );
 | 
						|
      this.notification.remove();
 | 
						|
      gBrowser.removeTab(gBrowser.selectedTab);
 | 
						|
      gBrowser.selectedTab = this.oldSelectedTab;
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test that setting persistWhileVisible allows a visible notification to
 | 
						|
  // persist across location changes
 | 
						|
  {
 | 
						|
    id: "Test#5",
 | 
						|
    async run() {
 | 
						|
      this.oldSelectedTab = gBrowser.selectedTab;
 | 
						|
      await BrowserTestUtils.openNewForegroundTab(
 | 
						|
        gBrowser,
 | 
						|
        // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
        "http://example.com/"
 | 
						|
      );
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notifyObj.addOptions({
 | 
						|
        persistWhileVisible: true,
 | 
						|
      });
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    async onShown(popup) {
 | 
						|
      this.complete = false;
 | 
						|
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.org/");
 | 
						|
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
 | 
						|
      await promiseTabLoadEvent(gBrowser.selectedTab, "http://example.com/");
 | 
						|
      // Notification should persist across location changes
 | 
						|
      this.complete = true;
 | 
						|
      dismissNotification(popup);
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      ok(
 | 
						|
        this.complete,
 | 
						|
        "Should only have hidden the notification after it was dismissed"
 | 
						|
      );
 | 
						|
      this.notification.remove();
 | 
						|
      gBrowser.removeTab(gBrowser.selectedTab);
 | 
						|
      gBrowser.selectedTab = this.oldSelectedTab;
 | 
						|
    },
 | 
						|
  },
 | 
						|
 | 
						|
  // Test that nested icon nodes correctly activate popups
 | 
						|
  {
 | 
						|
    id: "Test#6",
 | 
						|
    run() {
 | 
						|
      // Add a temporary box as the anchor with a button
 | 
						|
      this.box = document.createXULElement("box");
 | 
						|
      PopupNotifications.iconBox.appendChild(this.box);
 | 
						|
 | 
						|
      let button = document.createXULElement("button");
 | 
						|
      button.setAttribute("label", "Please click me!");
 | 
						|
      this.box.appendChild(button);
 | 
						|
 | 
						|
      // The notification should open up on the box
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notifyObj.anchorID = this.box.id = "nested-box";
 | 
						|
      this.notifyObj.addOptions({ dismissed: true });
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
 | 
						|
      // This test places a normal button in the notification area, which has
 | 
						|
      // standard GTK styling and dimensions. Due to the clip-path, this button
 | 
						|
      // gets clipped off, which makes it necessary to synthesize the mouse click
 | 
						|
      // a little bit downward. To be safe, I adjusted the x-offset with the same
 | 
						|
      // amount.
 | 
						|
      EventUtils.synthesizeMouse(button, 4, 4, {});
 | 
						|
    },
 | 
						|
    onShown(popup) {
 | 
						|
      checkPopup(popup, this.notifyObj);
 | 
						|
      dismissNotification(popup);
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      this.notification.remove();
 | 
						|
      this.box.remove();
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test that popupnotifications without popups have anchor icons shown
 | 
						|
  {
 | 
						|
    id: "Test#7",
 | 
						|
    async run() {
 | 
						|
      let notifyObj = new BasicNotification(this.id);
 | 
						|
      notifyObj.anchorID = "geo-notification-icon";
 | 
						|
      notifyObj.addOptions({ neverShow: true });
 | 
						|
      let promiseTopic = TestUtils.topicObserved(
 | 
						|
        "PopupNotifications-updateNotShowing"
 | 
						|
      );
 | 
						|
      showNotification(notifyObj);
 | 
						|
      await promiseTopic;
 | 
						|
      isnot(
 | 
						|
        document.getElementById("geo-notification-icon").getBoundingClientRect()
 | 
						|
          .width,
 | 
						|
        0,
 | 
						|
        "geo anchor should be visible"
 | 
						|
      );
 | 
						|
      goNext();
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test that autoplay media icon is shown
 | 
						|
  {
 | 
						|
    id: "Test#8",
 | 
						|
    async run() {
 | 
						|
      let notifyObj = new BasicNotification(this.id);
 | 
						|
      notifyObj.anchorID = "autoplay-media-notification-icon";
 | 
						|
      notifyObj.addOptions({ neverShow: true });
 | 
						|
      let promiseTopic = TestUtils.topicObserved(
 | 
						|
        "PopupNotifications-updateNotShowing"
 | 
						|
      );
 | 
						|
      showNotification(notifyObj);
 | 
						|
      await promiseTopic;
 | 
						|
      isnot(
 | 
						|
        document
 | 
						|
          .getElementById("autoplay-media-notification-icon")
 | 
						|
          .getBoundingClientRect().width,
 | 
						|
        0,
 | 
						|
        "autoplay media icon should be visible"
 | 
						|
      );
 | 
						|
      goNext();
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test notification close button
 | 
						|
  {
 | 
						|
    id: "Test#9",
 | 
						|
    run() {
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    onShown(popup) {
 | 
						|
      checkPopup(popup, this.notifyObj);
 | 
						|
      let notification = popup.children[0];
 | 
						|
      EventUtils.synthesizeMouseAtCenter(notification.closebutton, {});
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      ok(
 | 
						|
        this.notifyObj.dismissalCallbackTriggered,
 | 
						|
        "dismissal callback triggered"
 | 
						|
      );
 | 
						|
      this.notification.remove();
 | 
						|
      ok(this.notifyObj.removedCallbackTriggered, "removed callback triggered");
 | 
						|
      ok(
 | 
						|
        !this.notifyObj.secondaryActionClicked,
 | 
						|
        "secondary action not clicked"
 | 
						|
      );
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // Test notification when chrome is hidden
 | 
						|
  {
 | 
						|
    id: "Test#11",
 | 
						|
    run() {
 | 
						|
      window.locationbar.visible = false;
 | 
						|
      this.notifyObj = new BasicNotification(this.id);
 | 
						|
      this.notification = showNotification(this.notifyObj);
 | 
						|
    },
 | 
						|
    onShown(popup) {
 | 
						|
      checkPopup(popup, this.notifyObj);
 | 
						|
      is(
 | 
						|
        popup.anchorNode.className,
 | 
						|
        "tabbrowser-tab",
 | 
						|
        "notification anchored to tab"
 | 
						|
      );
 | 
						|
      dismissNotification(popup);
 | 
						|
    },
 | 
						|
    onHidden(popup) {
 | 
						|
      ok(
 | 
						|
        this.notifyObj.dismissalCallbackTriggered,
 | 
						|
        "dismissal callback triggered"
 | 
						|
      );
 | 
						|
      this.notification.remove();
 | 
						|
      ok(this.notifyObj.removedCallbackTriggered, "removed callback triggered");
 | 
						|
      window.locationbar.visible = true;
 | 
						|
    },
 | 
						|
  },
 | 
						|
];
 |