blob: 0b58eec56766183539b6deea02086a5f1f6dec35 [file] [log] [blame]
// Copyright 2008 The Closure Library Authors. All Rights Reserved.
//
// 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.
goog.provide('goog.net.MultiIframeLoadMonitorTest');
goog.setTestOnly('goog.net.MultiIframeLoadMonitorTest');
goog.require('goog.dom');
goog.require('goog.net.IframeLoadMonitor');
goog.require('goog.net.MultiIframeLoadMonitor');
goog.require('goog.testing.AsyncTestCase');
goog.require('goog.testing.jsunit');
var TEST_FRAME_SRCS = ['iframeloadmonitor_test_frame.html',
'iframeloadmonitor_test_frame2.html',
'iframeloadmonitor_test_frame3.html'];
// Create a new test case.
var iframeLoaderTestCase = new goog.testing.AsyncTestCase(document.title);
iframeLoaderTestCase.stepTimeout = 4 * 1000;
// How many multpile frames finished loading
iframeLoaderTestCase.multipleComplete_ = 0;
iframeLoaderTestCase.numMonitors = 0;
iframeLoaderTestCase.disposeCalled = 0;
/**
* Sets up the test environment, adds tests and sets up the worker pools.
* @this {goog.testing.AsyncTestCase}
*/
iframeLoaderTestCase.setUpPage = function() {
this.log('Setting tests up');
iframeLoaderTestCase.waitForAsync('loading iframes');
var dom = goog.dom.getDomHelper();
// Load multiple with callback
var frame1 = dom.createDom('iframe');
var frame2 = dom.createDom('iframe');
var multiMonitor = new goog.net.MultiIframeLoadMonitor(
[frame1, frame2], goog.bind(this.multipleCallback, this));
this.log('Loading frames at: ' + TEST_FRAME_SRCS[0] + ' and ' +
TEST_FRAME_SRCS[1]);
// Make sure they don't look loaded yet.
assertEquals(0, this.multipleComplete_);
var frameParent = dom.getElement('frame_parent');
dom.appendChild(frameParent, frame1);
frame1.src = TEST_FRAME_SRCS[0];
dom.appendChild(frameParent, frame2);
frame2.src = TEST_FRAME_SRCS[1];
// Load multiple with callback and content check
var frame3 = dom.createDom('iframe');
var frame4 = dom.createDom('iframe');
var multiMonitor = new goog.net.MultiIframeLoadMonitor(
[frame3, frame4], goog.bind(this.multipleContentCallback, this), true);
this.log('Loading frames with content check at: ' + TEST_FRAME_SRCS[1] +
' and ' + TEST_FRAME_SRCS[2]);
dom.appendChild(frameParent, frame3);
frame3.src = TEST_FRAME_SRCS[1];
dom.appendChild(frameParent, frame4);
frame4.src = TEST_FRAME_SRCS[2];
};
/**
* Callback for the multiple frame load test case
* @this {goog.testing.AsyncTestCase}
*/
iframeLoaderTestCase.multipleCallback = function() {
this.log('multiple frames finished loading');
this.multipleComplete_++;
this.multipleCompleteNoContent_ = true;
this.callbacksComplete();
};
/**
* Callback for the multiple frame with content load test case
* @this {goog.testing.AsyncTestCase}
*/
iframeLoaderTestCase.multipleContentCallback = function() {
this.log('multiple frames with content finished loading');
this.multipleComplete_++;
this.multipleCompleteContent_ = true;
this.callbacksComplete();
};
/**
* Checks if all the load callbacks are done
* @this {goog.testing.AsyncTestCase}
*/
iframeLoaderTestCase.callbacksComplete = function() {
if (this.multipleComplete_ == 2) {
iframeLoaderTestCase.continueTesting();
}
};
/** Tests the results. */
iframeLoaderTestCase.addNewTest('testResults', function() {
this.log('getting test results');
assertTrue(this.multipleCompleteNoContent_);
assertTrue(this.multipleCompleteContent_);
});
iframeLoaderTestCase.fakeLoadMonitor = function() {
// Replaces IframeLoadMonitor with a fake version that just tracks
// instantiations/disposals
this.loadMonitorConstructor = goog.net.IframeLoadMonitor;
var that = this;
goog.net.IframeLoadMonitor = function() {
that.numMonitors++;
return {
isLoaded: function() { return false; },
dispose: function() { that.disposeCalled++; },
attachEvent: function() {}
};
};
goog.net.IframeLoadMonitor.LOAD_EVENT = 'ifload';
};
iframeLoaderTestCase.unfakeLoadMonitor = function() {
goog.net.IframeLoadMonitor = this.loadMonitorConstructor;
};
iframeLoaderTestCase.addNewTest('stopMonitoring', function() {
// create two unloaded frames, make sure that load monitors are loaded
// behind the scenes, then make sure they are disposed properly.
this.fakeLoadMonitor();
var dom = goog.dom.getDomHelper();
var frames = [dom.createDom('iframe'), dom.createDom('iframe')];
var multiMonitor = new goog.net.MultiIframeLoadMonitor(
frames,
function() {
fail('should not invoke callback for unloaded rames');
});
assertEquals(frames.length, this.numMonitors);
assertEquals(0, this.disposeCalled);
multiMonitor.stopMonitoring();
assertEquals(frames.length, this.disposeCalled);
this.unfakeLoadMonitor();
});
/** Standalone Closure Test Runner. */
G_testRunner.initialize(iframeLoaderTestCase);