forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			233 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html>
 | 
						|
<head>
 | 
						|
  <meta charset="utf-8">
 | 
						|
  <title>web_channel_test</title>
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
<script>
 | 
						|
   var IFRAME_SRC_ROOT = "http://mochi.test:8888/browser/browser/base/content/test/general/browser_web_channel_iframe.html";
 | 
						|
 | 
						|
  window.onload = function() {
 | 
						|
    var testName = window.location.search.replace(/^\?/, "");
 | 
						|
 | 
						|
    switch (testName) {
 | 
						|
      case "generic":
 | 
						|
        test_generic();
 | 
						|
        break;
 | 
						|
      case "twoway":
 | 
						|
        test_twoWay();
 | 
						|
        break;
 | 
						|
      case "multichannel":
 | 
						|
        test_multichannel();
 | 
						|
        break;
 | 
						|
      case "iframe":
 | 
						|
        test_iframe();
 | 
						|
        break;
 | 
						|
      case "iframe_pre_redirect":
 | 
						|
        test_iframe_pre_redirect();
 | 
						|
        break;
 | 
						|
      case "unsolicited":
 | 
						|
        test_unsolicited();
 | 
						|
        break;
 | 
						|
      case "bubbles":
 | 
						|
        test_bubbles();
 | 
						|
        break;
 | 
						|
      case "object":
 | 
						|
        test_object();
 | 
						|
        break;
 | 
						|
      case "error_thrown":
 | 
						|
        test_error_thrown();
 | 
						|
        break;
 | 
						|
      case "error_invalid_channel":
 | 
						|
        test_error_invalid_channel();
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        throw new Error(`INVALID TEST NAME ${testName}`);
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  function test_generic() {
 | 
						|
    var event = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: "generic",
 | 
						|
        message: {
 | 
						|
          something: {
 | 
						|
            nested: "hello",
 | 
						|
          },
 | 
						|
        }
 | 
						|
      })
 | 
						|
    });
 | 
						|
 | 
						|
    window.dispatchEvent(event);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_twoWay() {
 | 
						|
    var firstMessage = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: "twoway",
 | 
						|
        message: {
 | 
						|
          command: "one",
 | 
						|
        },
 | 
						|
      })
 | 
						|
    });
 | 
						|
 | 
						|
    window.addEventListener("WebChannelMessageToContent", function(e) {
 | 
						|
      var secondMessage = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
        detail: JSON.stringify({
 | 
						|
          id: "twoway",
 | 
						|
          message: {
 | 
						|
            command: "two",
 | 
						|
            detail: e.detail.message,
 | 
						|
          },
 | 
						|
        }),
 | 
						|
      });
 | 
						|
 | 
						|
      if (!e.detail.message.error) {
 | 
						|
        window.dispatchEvent(secondMessage);
 | 
						|
      }
 | 
						|
    }, true);
 | 
						|
 | 
						|
    window.dispatchEvent(firstMessage);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_multichannel() {
 | 
						|
    var event1 = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: "wrongchannel",
 | 
						|
        message: {},
 | 
						|
      })
 | 
						|
    });
 | 
						|
 | 
						|
    var event2 = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: "multichannel",
 | 
						|
        message: {},
 | 
						|
      })
 | 
						|
    });
 | 
						|
 | 
						|
    window.dispatchEvent(event1);
 | 
						|
    window.dispatchEvent(event2);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_iframe() {
 | 
						|
    // Note that this message is the response to the message sent
 | 
						|
    // by the iframe!  This is bad, as this page is *not* trusted.
 | 
						|
    window.addEventListener("WebChannelMessageToContent", function(e) {
 | 
						|
      // the test parent will fail if the echo message is received.
 | 
						|
      echoEventToChannel(e, "echo");
 | 
						|
    });
 | 
						|
 | 
						|
    // only attach the iframe for the iframe test to avoid
 | 
						|
    // interfering with other tests.
 | 
						|
    var iframe = document.createElement("iframe");
 | 
						|
    iframe.setAttribute("src", IFRAME_SRC_ROOT + "?iframe");
 | 
						|
    document.body.appendChild(iframe);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_iframe_pre_redirect() {
 | 
						|
    var iframe = document.createElement("iframe");
 | 
						|
    iframe.setAttribute("src", IFRAME_SRC_ROOT + "?iframe_pre_redirect");
 | 
						|
    document.body.appendChild(iframe);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_unsolicited() {
 | 
						|
    // echo any unsolicted events back to chrome.
 | 
						|
    window.addEventListener("WebChannelMessageToContent", function(e) {
 | 
						|
      echoEventToChannel(e, "echo");
 | 
						|
    }, true);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_bubbles() {
 | 
						|
    var event = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: "not_a_window",
 | 
						|
        message: {
 | 
						|
          command: "start"
 | 
						|
        }
 | 
						|
      })
 | 
						|
    });
 | 
						|
 | 
						|
    var nonWindowTarget = document.getElementById("not_a_window");
 | 
						|
 | 
						|
    nonWindowTarget.addEventListener("WebChannelMessageToContent", function(e) {
 | 
						|
      echoEventToChannel(e, "not_a_window");
 | 
						|
    }, true);
 | 
						|
 | 
						|
 | 
						|
    nonWindowTarget.dispatchEvent(event);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_object() {
 | 
						|
    let objectMessage = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: {
 | 
						|
        id: "objects",
 | 
						|
        message: { type: "object" }
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    let stringMessage = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: "objects",
 | 
						|
        message: { type: "string" }
 | 
						|
      })
 | 
						|
    });
 | 
						|
    // Test fails if objectMessage is received, we send stringMessage to know
 | 
						|
    // when we should stop listening for objectMessage
 | 
						|
    window.dispatchEvent(objectMessage);
 | 
						|
    window.dispatchEvent(stringMessage);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_error_thrown() {
 | 
						|
   var event = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
     detail: JSON.stringify({
 | 
						|
       id: "error",
 | 
						|
       message: {
 | 
						|
         command: "oops"
 | 
						|
       }
 | 
						|
     })
 | 
						|
   });
 | 
						|
 | 
						|
   // echo the response back to chrome - chrome will check it is the
 | 
						|
   // expected error.
 | 
						|
   window.addEventListener("WebChannelMessageToContent", function(e) {
 | 
						|
     echoEventToChannel(e, "echo");
 | 
						|
   }, true);
 | 
						|
 | 
						|
   window.dispatchEvent(event);
 | 
						|
  }
 | 
						|
 | 
						|
  function test_error_invalid_channel() {
 | 
						|
   var event = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
     detail: JSON.stringify({
 | 
						|
       id: "invalid-channel",
 | 
						|
       message: {
 | 
						|
         command: "oops"
 | 
						|
       }
 | 
						|
     })
 | 
						|
   });
 | 
						|
 | 
						|
   // echo the response back to chrome - chrome will check it is the
 | 
						|
   // expected error.
 | 
						|
   window.addEventListener("WebChannelMessageToContent", function(e) {
 | 
						|
     echoEventToChannel(e, "echo");
 | 
						|
   }, true);
 | 
						|
 | 
						|
   window.dispatchEvent(event);
 | 
						|
  }
 | 
						|
 | 
						|
  function echoEventToChannel(e, channelId) {
 | 
						|
    var echoedEvent = new window.CustomEvent("WebChannelMessageToChrome", {
 | 
						|
      detail: JSON.stringify({
 | 
						|
        id: channelId,
 | 
						|
        message: e.detail.message,
 | 
						|
      })
 | 
						|
    });
 | 
						|
 | 
						|
    e.target.dispatchEvent(echoedEvent);
 | 
						|
  }
 | 
						|
</script>
 | 
						|
 | 
						|
<div id="not_a_window"></div>
 | 
						|
</body>
 | 
						|
</html>
 |