forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			166 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * These tests test nsBrowserGlue's nsIContentPermissionPrompt
 | |
|  * implementation behaviour with various types of
 | |
|  * nsIContentPermissionRequests.
 | |
|  */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 | |
| Cu.import("resource://gre/modules/Integration.jsm", this);
 | |
| 
 | |
| XPCOMUtils.defineLazyServiceGetter(this, "ContentPermissionPrompt",
 | |
|                                    "@mozilla.org/content-permission/prompt;1",
 | |
|                                    "nsIContentPermissionPrompt");
 | |
| 
 | |
| /**
 | |
|  * This is a partial implementation of nsIContentPermissionType.
 | |
|  *
 | |
|  * @param {string} type
 | |
|  *        The string defining what type of permission is being requested.
 | |
|  *        Example: "geo", "desktop-notification".
 | |
|  * @return nsIContentPermissionType implementation.
 | |
|  */
 | |
| function MockContentPermissionType(type) {
 | |
|   this.type = type;
 | |
| }
 | |
| 
 | |
| MockContentPermissionType.prototype = {
 | |
|   QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionType]),
 | |
|   // We expose the wrappedJSObject so that we can be sure
 | |
|   // in some of our tests that we're passing the right
 | |
|   // nsIContentPermissionType around.
 | |
|   wrappedJSObject: this,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * This is a partial implementation of nsIContentPermissionRequest.
 | |
|  *
 | |
|  * @param {Array<nsIContentPermissionType>} typesArray
 | |
|  *        The types to assign to this nsIContentPermissionRequest,
 | |
|  *        in order. You probably want to use MockContentPermissionType.
 | |
|  * @return nsIContentPermissionRequest implementation.
 | |
|  */
 | |
| function MockContentPermissionRequest(typesArray) {
 | |
|   this.types = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
 | |
|   for (let type of typesArray) {
 | |
|     this.types.appendElement(type);
 | |
|   }
 | |
| }
 | |
| 
 | |
| MockContentPermissionRequest.prototype = {
 | |
|   QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionRequest]),
 | |
|   // We expose the wrappedJSObject so that we can be sure
 | |
|   // in some of our tests that we're passing the right
 | |
|   // nsIContentPermissionRequest around.
 | |
|   wrappedJSObject: this,
 | |
|   // For some of our tests, we want to make sure that the
 | |
|   // request is cancelled, so we add some instrumentation here
 | |
|   // to check that cancel() is called.
 | |
|   cancel() {
 | |
|     this.cancelled = true;
 | |
|   },
 | |
|   cancelled: false,
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Tests that if the nsIContentPermissionRequest has an empty
 | |
|  * types array, that NS_ERROR_UNEXPECTED is thrown, and the
 | |
|  * request is cancelled.
 | |
|  */
 | |
| add_task(async function test_empty_types() {
 | |
|   let mockRequest = new MockContentPermissionRequest([]);
 | |
|   Assert.throws(() => { ContentPermissionPrompt.prompt(mockRequest); },
 | |
|                 /NS_ERROR_UNEXPECTED/,
 | |
|                 "Should have thrown NS_ERROR_UNEXPECTED.");
 | |
|   Assert.ok(mockRequest.cancelled, "Should have cancelled the request.");
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that if the nsIContentPermissionRequest has more than
 | |
|  * one type, that NS_ERROR_UNEXPECTED is thrown, and the request
 | |
|  * is cancelled.
 | |
|  */
 | |
| add_task(async function test_multiple_types() {
 | |
|   let mockRequest = new MockContentPermissionRequest([
 | |
|     new MockContentPermissionType("test1"),
 | |
|     new MockContentPermissionType("test2"),
 | |
|   ]);
 | |
| 
 | |
|   Assert.throws(() => { ContentPermissionPrompt.prompt(mockRequest); },
 | |
|                 /NS_ERROR_UNEXPECTED/);
 | |
|   Assert.ok(mockRequest.cancelled, "Should have cancelled the request.");
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that if the nsIContentPermissionRequest has a type that
 | |
|  * does not implement nsIContentPermissionType that NS_NOINTERFACE
 | |
|  * is thrown, and the request is cancelled.
 | |
|  */
 | |
| add_task(async function test_not_permission_type() {
 | |
|   let mockRequest = new MockContentPermissionRequest([
 | |
|     { QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]) },
 | |
|   ]);
 | |
| 
 | |
|   Assert.throws(() => { ContentPermissionPrompt.prompt(mockRequest); },
 | |
|                 /NS_NOINTERFACE/);
 | |
|   Assert.ok(mockRequest.cancelled, "Should have cancelled the request.");
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that if the nsIContentPermissionRequest is for a type
 | |
|  * that is not recognized, that NS_ERROR_FAILURE is thrown and
 | |
|  * the request is cancelled.
 | |
|  */
 | |
| add_task(async function test_unrecognized_type() {
 | |
|   let mockRequest = new MockContentPermissionRequest([
 | |
|     new MockContentPermissionType("test1"),
 | |
|   ]);
 | |
| 
 | |
|   Assert.throws(() => { ContentPermissionPrompt.prompt(mockRequest); },
 | |
|                 /NS_ERROR_FAILURE/);
 | |
|   Assert.ok(mockRequest.cancelled, "Should have cancelled the request.");
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Tests that if we meet the minimal requirements for a
 | |
|  * nsIContentPermissionRequest, that it will be passed to
 | |
|  * ContentPermissionIntegration's createPermissionPrompt
 | |
|  * method.
 | |
|  */
 | |
| add_task(async function test_working_request() {
 | |
|   let mockType = new MockContentPermissionType("test-permission-type");
 | |
|   let mockRequest = new MockContentPermissionRequest([mockType]);
 | |
| 
 | |
|   // mockPermissionPrompt is what createPermissionPrompt
 | |
|   // will return. Returning some kind of object should be
 | |
|   // enough to convince nsBrowserGlue that everything went
 | |
|   // okay.
 | |
|   let didPrompt = false;
 | |
|   let mockPermissionPrompt = {
 | |
|     prompt() {
 | |
|       didPrompt = true;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   let integration = (base) => ({
 | |
|     createPermissionPrompt(type, request) {
 | |
|       Assert.equal(type, "test-permission-type");
 | |
|       Assert.ok(Object.is(request.wrappedJSObject, mockRequest.wrappedJSObject));
 | |
|       return mockPermissionPrompt;
 | |
|     },
 | |
|   });
 | |
| 
 | |
|   // Register an integration so that we can capture the
 | |
|   // calls into ContentPermissionIntegration.
 | |
|   try {
 | |
|     Integration.contentPermission.register(integration);
 | |
| 
 | |
|     ContentPermissionPrompt.prompt(mockRequest);
 | |
|     Assert.ok(!mockRequest.cancelled,
 | |
|               "Should not have cancelled the request.");
 | |
|     Assert.ok(didPrompt, "Should have tried to show the prompt");
 | |
|   } finally {
 | |
|     Integration.contentPermission.unregister(integration);
 | |
|   }
 | |
| });
 | 
