| // Copyright 2007 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.iframeXhrTest'); |
| goog.setTestOnly('goog.net.iframeXhrTest'); |
| |
| goog.require('goog.Timer'); |
| goog.require('goog.debug.Console'); |
| goog.require('goog.debug.LogManager'); |
| goog.require('goog.debug.Logger'); |
| goog.require('goog.events'); |
| goog.require('goog.net.IframeIo'); |
| goog.require('goog.net.XhrIo'); |
| goog.require('goog.testing.AsyncTestCase'); |
| goog.require('goog.testing.jsunit'); |
| goog.require('goog.userAgent'); |
| |
| var c = new goog.debug.Console; |
| c.setCapturing(true); |
| goog.debug.LogManager.getRoot().setLevel(goog.debug.Logger.Level.ALL); |
| |
| // Can't use exportSymbol if we want JsUnit support |
| top.GG_iframeFn = goog.net.IframeIo.handleIncrementalData; |
| |
| // Make the dispose time short enough that it will cause the bug to appear |
| goog.net.IframeIo.IFRAME_DISPOSE_DELAY_MS = 0; |
| |
| |
| var fileName = 'iframe_xhr_test_response.html'; |
| var iframeio; |
| |
| // Create an async test case |
| var testCase = new goog.testing.AsyncTestCase(document.title); |
| testCase.stepTimeout = 4 * 1000; |
| testCase.resultCount = 0; |
| testCase.xhrCount = 0; |
| testCase.error = null; |
| |
| |
| /** |
| * Set up the iframe io and request the test response page. |
| * @this {goog.testing.AsyncTestCase} |
| */ |
| testCase.setUpPage = function() { |
| testCase.waitForAsync('setUpPage'); |
| iframeio = new goog.net.IframeIo(); |
| goog.events.listen( |
| iframeio, 'incrementaldata', this.onIframeData, false, this); |
| goog.events.listen( |
| iframeio, 'ready', this.onIframeReady, false, this); |
| iframeio.send(fileName); |
| }; |
| |
| |
| /** Disposes the iframe object. */ |
| testCase.tearDownPage = function() { |
| iframeio.dispose(); |
| }; |
| |
| |
| /** |
| * Handles the packets received from the Iframe incremental results. |
| * @this {goog.testing.AsyncTestCase} |
| */ |
| testCase.onIframeData = function(e) { |
| this.log('Data received : ' + e.data); |
| this.resultCount++; |
| goog.net.XhrIo.send(fileName, goog.bind(this.onXhrData, this)); |
| }; |
| |
| |
| /** |
| * Handles the iframe becoming ready. |
| * @this {goog.testing.AsyncTestCase} |
| */ |
| testCase.onIframeReady = function(e) { |
| this.log('Iframe ready'); |
| var me = this; |
| goog.net.XhrIo.send(fileName, goog.bind(this.onXhrData, this)); |
| }; |
| |
| |
| /** |
| * Handles the response from an Xhr request. |
| * @this {goog.testing.AsyncTestCase} |
| */ |
| testCase.onXhrData = function(e) { |
| this.xhrCount++; |
| // We access status directly so that XhrLite doesn't mask the error that |
| // would be thrown in FF if this worked correctly. |
| try { |
| this.log('Xhr Received: ' + e.target.xhr_.status); |
| } catch (e) { |
| this.log('ERROR: ' + e.message); |
| this.error = e; |
| } |
| if (this.xhrCount == 4 && this.resultCount == 3) { |
| // Wait for the async iframe disposal to fire. |
| this.log('Test set up finished, waiting 500ms for iframe disposal'); |
| goog.Timer.callOnce(goog.bind(this.continueTesting, this), 0); |
| } |
| }; |
| |
| |
| /** The main test function that validates the results were as expected. */ |
| testCase.addNewTest('testResults', function() { |
| assertEquals('There should be 3 data packets', 3, this.resultCount); |
| // 3 results + 1 ready |
| assertEquals('There should be 4 XHR results', 4, this.xhrCount); |
| if (this.error) { |
| throw this.error; |
| } |
| |
| assertEquals('There should be no iframes left', 0, |
| document.getElementsByTagName('iframe').length); |
| }); |
| |
| |
| /** This test only runs on GECKO browsers. */ |
| if (goog.userAgent.GECKO) { |
| /** Used by the JsUnit test runner. */ |
| var testXhrMonitorWorksForIframeIoRequests = function() { |
| testCase.reset(); |
| testCase.cycleTests(); |
| }; |
| } |
| |
| // Standalone Closure Test Runner. |
| if (goog.userAgent.GECKO) { |
| G_testRunner.initialize(testCase); |
| } else { |
| G_testRunner.setStrict(false); |
| } |