blob: 292e95b886f3919b9d25a08a9030ecc3011f2936 [file] [log] [blame]
/*
* Copyright 2012 Research In Motion Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var LIB_PATH = __dirname + "/../../../../lib/",
utils = require(LIB_PATH + 'utils'),
webkitOriginAccess = require(LIB_PATH + "policy/webkitOriginAccess"),
LOCAL_URI = "local://",
FILE_URI = "file://",
WW_URI = utils.getURIPrefix(),
mockWebView;
describe("lib/policy/webkitOriginAccess", function () {
beforeEach(function () {
mockWebView = {
addOriginAccessWhitelistEntry: jasmine.createSpy()
};
webkitOriginAccess = require(LIB_PATH + "policy/webkitOriginAccess");
});
afterEach(function () {
mockWebView = undefined;
delete require.cache[require.resolve(LIB_PATH + "config")];
delete require.cache[require.resolve(LIB_PATH + "policy/webkitOriginAccess")];
});
function mockConfig(mockAccessList, hasMultiAccess) {
delete require.cache[require.resolve(LIB_PATH + "config")];
delete require.cache[require.resolve(LIB_PATH + "policy/webkitOriginAccess")];
var config = require(LIB_PATH + "config");
config.accessList = mockAccessList;
config.hasMultiAccess = !!hasMultiAccess;
webkitOriginAccess = require(LIB_PATH + "policy/webkitOriginAccess");
}
describe("addWebview function", function () {
it("exists", function () {
expect(webkitOriginAccess.addWebView).toBeDefined();
});
it("sets up one time whitelisting", function () {
webkitOriginAccess.addWebView(mockWebView);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, FILE_URI, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(FILE_URI, LOCAL_URI, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, WW_URI, true);
});
it("initializes the webview with whitelisting based on the config", function () {
var mockAccessList = [
{
uri : "http://google.com",
allowSubDomain : true,
features : null
}
];
mockConfig(mockAccessList);
webkitOriginAccess.addWebView(mockWebView);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, "http://google.com", true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith("http://google.com", LOCAL_URI, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith("http://google.com", WW_URI, true);
});
it("initializes the webview with whitelisting based on what domains have been added", function () {
var mockAccessList = [{
uri : "http://google.com",
allowSubDomain : true,
features : null
}],
url = "http://www.rim.com";
mockConfig(mockAccessList, true);
webkitOriginAccess.addOriginAccess(url, true);
webkitOriginAccess.addWebView(mockWebView);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, url, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, LOCAL_URI, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, "http://google.com", true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith("http://google.com", url, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, WW_URI, true);
});
it("will not initialize twice", function () {
var origCallCount;
webkitOriginAccess.addWebView(mockWebView);
origCallCount = mockWebView.addOriginAccessWhitelistEntry.callCount;
webkitOriginAccess.addWebView(mockWebView);
expect(mockWebView.addOriginAccessWhitelistEntry.callCount).toEqual(origCallCount);
});
});
describe("addOriginAccess function", function () {
it("exists", function () {
expect(webkitOriginAccess.addOriginAccess).toBeDefined();
});
it("Treats falsey values as false", function () {
var url = "http://www.rim.com";
webkitOriginAccess.addWebView(mockWebView);
webkitOriginAccess.addOriginAccess(url);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, url, false);
});
it("Adds access for any non-local and non-file url", function () {
var url = "http://www.rim.com/grrr/arrg/blah.htm";
webkitOriginAccess.addWebView(mockWebView);
webkitOriginAccess.addOriginAccess(url);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, url, false);
});
//Because local:// is already a domain, the spy should not have no new calls
it("Local uris are treated as local://", function () {
var url = "local:///buy/local/beef/mmmmmmmmmmmmm/Steak.yum",
origCallCount;
webkitOriginAccess.addWebView(mockWebView);
webkitOriginAccess.addOriginAccess(url);
origCallCount = mockWebView.addOriginAccessWhitelistEntry.callCount;
webkitOriginAccess.addOriginAccess(url);
expect(mockWebView.addOriginAccessWhitelistEntry.callCount).toEqual(origCallCount);
});
it("File uris are treated as file://", function () {
var url = "file:///buy/local/beef/mmmmmmmmmmmmm/Steak.yum",
authority = "file://";
webkitOriginAccess.addWebView(mockWebView);
webkitOriginAccess.addOriginAccess(url);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, authority, false);
});
it("updates all managed webviews of the new domain access", function () {
var mockWebView2 = {
addOriginAccessWhitelistEntry: jasmine.createSpy()
},
url = "http://www.rim.com";
webkitOriginAccess.addWebView(mockWebView);
webkitOriginAccess.addWebView(mockWebView2);
webkitOriginAccess.addOriginAccess(url, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, url, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, LOCAL_URI, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, WW_URI, true);
expect(mockWebView2.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(LOCAL_URI, url, true);
expect(mockWebView2.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, LOCAL_URI, true);
expect(mockWebView2.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, WW_URI, true);
});
it("updates all managed webviews when a new domain is added", function () {
var mockAccessList = [{
uri : "http://google.com",
allowSubDomain : true,
features : null
}],
url = "http://www.rim.com";
mockConfig(mockAccessList, true);
webkitOriginAccess.addWebView(mockWebView);
expect(mockWebView.addOriginAccessWhitelistEntry).not.toHaveBeenCalledWith(url, "http://google.com", true);
expect(mockWebView.addOriginAccessWhitelistEntry).not.toHaveBeenCalledWith("http://google.com", url, true);
webkitOriginAccess.addOriginAccess(url, true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith(url, "http://google.com", true);
expect(mockWebView.addOriginAccessWhitelistEntry).toHaveBeenCalledWith("http://google.com", url, true);
});
});
});