From 90525bd9984b802ba7fd6432fc1d080b3d640d24 Mon Sep 17 00:00:00 2001 From: Tim Consolazio Date: Sun, 24 Aug 2014 12:05:25 -0400 Subject: [PATCH] Warning cleanups, deprecation changes. --- .../src/com/google/code/flexiframe/IFrame.as | 1829 ++++------------- 1 file changed, 382 insertions(+), 1447 deletions(-) diff --git a/library/src/com/google/code/flexiframe/IFrame.as b/library/src/com/google/code/flexiframe/IFrame.as index 962110b..d905d60 100644 --- a/library/src/com/google/code/flexiframe/IFrame.as +++ b/library/src/com/google/code/flexiframe/IFrame.as @@ -1,1463 +1,398 @@ /** * Copyright (c) 2007-2011 flex-iframe contributors - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. */ -package com.google.code.flexiframe +package com.vmturbo.ui.component.pods.htmlpanel { - import flash.display.DisplayObject; - import flash.display.DisplayObjectContainer; - import flash.events.Event; - import flash.external.ExternalInterface; - import flash.geom.Point; - import flash.utils.Dictionary; - import flash.utils.getQualifiedClassName; - - import mx.controls.ToolTip; - import mx.core.Application; - import mx.core.Container; - import mx.core.FlexGlobals; - import mx.core.IChildList; - import mx.core.UIComponent; - import mx.events.FlexEvent; - import mx.events.IndexChangedEvent; - import mx.events.MoveEvent; - import mx.logging.ILogger; - import mx.logging.Log; - import mx.logging.LogEventLevel; - import mx.logging.targets.TraceTarget; - import mx.managers.ISystemManager; - import mx.utils.URLUtil; - - /** - * The event dispatched when the IFrame is loaded. - * - * @eventType flash.events.Event - */ - [Event(name="frameLoad", type="flash.events.Event")] - - /** - * The icon file for the IFrame component. - * - * Appears in FlexBuilder's outline and design views. - */ - [IconFile("assets/flex-iframe-logo-16.png")] - - /** - * An IFrame which you can embed into Flex applications to show an HTML page. - * - *

Usage:
- * You must instantiate the IFrame with a unique identifier - * (such as <IFrame id="myIFrame"> or - * var myIFrame:IFrame = new IFrame();). You can assign a source - * (myIFrame.source = "http://www.google.com";) or HTML content - * (myIFrame.content = "some html content...";).

- * - *

Advanced features: - *

- *

- * - * @example A simple application with Google embedded - * - * <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" - * xmlns:flexiframe="http://code.google.com/p/flex-iframe/"> - * - * <flexiframe:IFrame id="googleIFrame" - * label="Google" - * source="http://www.google.com" - * width="80%" - * height="80%"/> - * - * <mx:Application> - * - * For more advanced examples, check out the project home page. - * - * @see http://code.google.com/p/flex-iframe - * @author Alistair Rutherford (www.netthreads.co.uk) - * @author Christophe Conraets (http://coenraets.org) - * @author Brian Deitte (http://www.deitte.com) - * @author Ryan Bell - * @author Max - * @author Julien Nicoulaud (http://www.twitter.com/nicoulaj) - */ - public class IFrame extends Container + public class IFrameExternalCalls { - - /** - * Build a new IFrame. - * - * @param id a String identifying the IFrame. Must be unique for every instance of the - * IFrame class. - * - * @example Declare an IFrame in MXML. - * - * <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" - * xmlns:flexiframe="http://code.google.com/p/flex-iframe/"> - * - * <flexiframe:IFrame id="googleIFrame" - * label="Google" - * source="http://www.google.com" - * width="80%" - * height="80%"/> - * - * <mx:Application> - * - * - * @example Declare an IFrame in ActionScript. - * - * import com.google.code.flexiframe.IFrame; - * - * ... - * - * var frame : IFrame = new IFrame("aUniqueIdForThisIFrameInstance"); - * - */ - public function IFrame(id:String=null) - { - // Call super class constructor - super(); - - // Assign the unique id - if (id != null) - { - this.id=id; - } - - // Listen to the stage events - this.addEventListener(Event.REMOVED_FROM_STAGE, handleRemove); - this.addEventListener(Event.ADDED_TO_STAGE, handleAdd); - } - - - // ========================================================================================= - // IFrame construction & management - // ========================================================================================= - - // Variables - - /** - * Value for the 'auto' scroll policy. - */ - public static const SCROLL_POLICY_AUTO : String = "auto"; - - /** - * Value for the 'on' scroll policy. - */ - public static const SCROLL_POLICY_ON : String = "yes"; - - /** - * Value for the 'off' scroll policy. - */ - public static const SCROLL_POLICY_OFF : String = "no"; - - /** - * The scrolling policy applied to the iframe. - */ - public var scrollPolicy : String = SCROLL_POLICY_AUTO; - - /** - * Track IDs in use throughout the app for iframe instances in order to detect and - * prevent collisions. - */ - public static var idList:Object=new Object(); - - /** - * Application host. - * - * Used to check potential cross-domain issues. - */ - protected static var _appHost:String; - - /** - * IFrame content host. - * - * Used to check potential cross-domain issues. - */ - protected var _iframeContentHost:String; - - /** - * The top level Flex application. - */ - protected var _application; - - /** - * The source of the IFrame. - */ - protected var _source:String; - - /** - * The content of the IFrame. - */ - protected var _content:String; - - /** - * The frame ID. - */ - protected var _frameId:String; - - /** - * The IFrame ID. - */ - protected var _iframeId:String; - - /** - * The validity of the frame for the display. - * - * @default true - */ - protected var _validForDisplay:Boolean=true; - - /** - * The visibility of parent containers. - * - * @default true - */ - protected var _parentVisibility:Boolean = true; - - /** - * Wether the frame is added or not. - * - * @default false - */ - protected var _frameAdded:Boolean=false; - - /** - * Wether the frame is loaded or not. - * - * @default false - */ - protected var _frameLoaded:Boolean=false; - - /** - * The queued functions waiting for the frame to be loaded. - */ - protected var _functionQueue:Array=[]; - - /** - * The browser zoom ratio - */ - protected var _browserScaling:Number=1; - - /** - * Manually-set visibility value - * - * @default true - */ - protected var explicitVisibleValue:Boolean=true; - - - // Overriden functions - - /** - * Generate DOM elements and build display path. - */ - override protected function createChildren():void - { - // Call super class method - super.createChildren(); - - // Check the external interface availability - if (!ExternalInterface.available) - { - throw new Error("ExternalInterface is not available in this container. Internet " + "Explorer ActiveX, Firefox, Mozilla 1.7.5 and greater, or other " + "browsers that support NPRuntime are required."); - } - - // Resolve the top level Flex application. - if(Application.application != null) - { - _application = Application.application; - } - else - { - _application = FlexGlobals.topLevelApplication; - } - - // Get the host info to check for cross-domain issues - if (!_appHost) - { - var url:String=_application.url; - if (url) - { - _appHost=URLUtil.getProtocol(url) + "://" + URLUtil.getServerNameWithPort(url); - } - else - { - _appHost="unknown"; - } - } - - // Generate unique id's for frame div name - var idSuffix:int=0; - while (idList[id + idSuffix]) - { - idSuffix++; - } - _frameId=id + idSuffix; - _iframeId="iframe_" + _frameId; - idList[_frameId]=true; - - // Setup the communication with the browser - setupExternalInterface(); - - // Insert frame into DOM - createIFrame(); - - // Build the parent containers list - buildContainerList(); - - // Place and size the iframe - adjustPosition(true); - - // Setup the load indicator if it was specified. - if (loadIndicatorClass) - { - logger.info("A load indicator class was specified: {0}", getQualifiedClassName(loadIndicatorClass)); - _loadIndicator=UIComponent(new loadIndicatorClass()); - addChild(_loadIndicator); - } - else - { - logger.info("No load indicator class specified."); - } - - updateFrameVisibility(true); - } - - - /** - * Triggered when display contents change. Adjusts frame layout. - * - * @param unscaledWidth - * @param unscaledHeight - */ - override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void - { - super.updateDisplayList(unscaledWidth, unscaledHeight); - - if (_frameLoaded) - { - if (_loadIndicator) - { - logger.debug("Frame with id '{0}' loaded, hiding the load indicator.", _frameId); - _loadIndicator.visible=false; - } - updateFrameVisibility(true); - } - else if (_loadIndicator) - { - logger.debug("Frame with id '{0}' not loaded, showing the load indicator.", _frameId); - _loadIndicator.visible=true; - var w:int=_loadIndicator.measuredWidth; - var h:int=_loadIndicator.measuredHeight; - _loadIndicator.setActualSize(w, h); - _loadIndicator.move((this.width - w) / 2, (this.height - h) / 2); - } - - // make sure we are allowed to display before doing the work of positioning the frame - if (_validForDisplay) - { - adjustPosition(); - } - } - - /** - * Triggered by change to component properties. - */ - override protected function commitProperties():void - { - super.commitProperties(); - - if (source) - { - if (!_frameLoaded) - { - _frameLoaded=false; - loadIFrame(); - } - else - { - logger.debug("The IFrame with id '{0}' is already loaded.", _frameId); - } - // Trigger re-layout of iframe contents. - invalidateDisplayList(); - } - else if (content) - { - loadDivContent(); - - // Trigger re-layout of iframe contents. - invalidateDisplayList(); - } - } - - /** - * Sets actual size - * - * When component is sized by its parent, and overlay - * detection is enabled, checks for existing pop-ups - */ - override public function setActualSize(w:Number, h:Number):void - { - super.setActualSize(w, h); - - // check for existing popups I may be appearing underneath - if (overlayDetection) - checkExistingPopUps(); - } - - // Event handlers - - /** - * Triggered by addition of this object to the stage. - * - * @param event Event trigger - */ - protected function handleAdd(event:Event=null):void - { - logger.debug("The component for the IFrame with id '{0}' has been added from the stage.", _frameId); - - // Hook the systemManager to provide overlaying object detection - if (overlayDetection) - { - logger.info("Listening to the stage component additions to detect overlapping objects."); - systemManager.addEventListener(Event.ADDED, systemManager_addedHandler); - systemManager.addEventListener(Event.REMOVED, systemManager_removedHandler); - } - - _frameAdded = true; - updateFrameVisibility(true); - } - - /** - * Triggered by removal of this object from the stage. - * - * @param event Event trigger - */ - protected function handleRemove(event:Event=null):void - { - logger.debug("The component for the IFrame with id '{0}' has been removed from the stage.", _frameId); - - // Remove systemManager hooks for overlay detection - if (overlayDetection) - { - systemManager.removeEventListener(Event.ADDED, systemManager_addedHandler); - systemManager.removeEventListener(Event.REMOVED, systemManager_removedHandler); - } - - _frameAdded = false; - updateFrameVisibility(false); - } - - /** - * Triggered by one of our listeners seeded all the way up the display - * list to catch a 'changed' event which might hide or display this object. - * - * @param event Event trigger - */ - protected function handleChange(event:Event):void - { - var target:Object=event.target; - - if (event is IndexChangedEvent) - { - var changedEvent:IndexChangedEvent=IndexChangedEvent(event); - var newIndex:Number=changedEvent.newIndex; - - var result:Boolean=updateFrameVisibility(checkDisplay(target, newIndex)); - logger.debug("Frame {0} set visible to {1} on IndexChangedEvent", _frameId, result); - } - } - - /** - * Triggered by one of our listeners seeded all the way up the display - * list to catch a 'move' event which might reposition this object. - * - * @param event Event trigger - */ - protected function handleMove(event:Event):void - { - // This will cause adjustPosition() to be called in the next validation cycle - invalidateDisplayList(); - } - - /** - * Trigered when the IFrame is loaded. - */ - protected function handleFrameLoad():void - { - logger.info("Browser reports frame with id {0} loaded.", _frameId); - _frameLoaded=true; - - // Execute any queued function calls now that the frame is loaded - var queuedCall:Object; - while (_functionQueue.length > 0) - { - queuedCall=_functionQueue.pop(); - logger.debug("frame id {0} calling queued function {1}", _frameId, queuedCall.functionName); - this.callIFrameFunction(queuedCall.functionName, queuedCall.args, queuedCall.callback); - } - - var newSource:String = getBrowserSource(); - if (newSource && newSource != "" && newSource != source) { - _source = newSource; - dispatchEvent(new Event("browserSourceChanged")); - } - - dispatchEvent(new Event("frameLoad")); - - invalidateDisplayList(); - } - - - // IFrame management - - /** - * This function updates the selected view child of the signalling container - * and then compares the path from our IFrame up the displaylist to see if - * the index settings match. Only an exact match all the way down to our - * IFrame will satisfy the condition to display the IFrame contents. - * - * @param target Object event source - * @param newIndex Number index from target object. - * - */ - protected function checkDisplay(target:Object = null, newIndex:Number = -1):Boolean - { - - if (target is Container) - { - - var container:DisplayObjectContainer=DisplayObjectContainer(target); - - // Update current setting - settingDict[container]=newIndex; - - } - - var valid:Boolean=true; - - for (var item:Object in containerDict) - { - var index:Number=lookupIndex(item as Container); - var setting:Number=lookupSetting(item as Container); - valid=valid && (index == setting); - } - - - // Remember this state so we can re-check later without a new IndexChangedEvent - _validForDisplay=valid; - return valid; - } - - /** - * Adjust frame position to match the exposed area in the application. - */ - protected function adjustPosition(recalculateBrowserScaling:Boolean=false):void - { - var globalPt:Point=localToGlobal(new Point()); - - // If needed, recalculate the browser zoom - if (recalculateBrowserScaling) - { - var browserMeasuredWidth:Number=getBrowserMeasuredWidth(); - - if (browserMeasuredWidth > 0) - { - _browserScaling=browserMeasuredWidth / _application.width; - } - } - - // Place the iframe - moveIFrame(Math.round(globalPt.x * _browserScaling), Math.round(globalPt.y * _browserScaling), Math.round(this.width * _browserScaling), Math.round(this.height * _browserScaling)); - } - - /** - * Set source url - * - * @param source Frame contents - */ - public function set source(source:String):void - { - if (source) - { - _source=source; - dispatchEvent(new Event("browserSourceChanged")); - - // mark unloaded now so calls in this frame will be queued - _frameLoaded=false; - invalidateProperties(); - - // Get the host info to check for cross-domain issues - _iframeContentHost=URLUtil.getProtocol(source) + "://" + URLUtil.getServerNameWithPort(source); - } - } - - /** - * Return url of frame contents - */ - [Bindable (event="browserSourceChanged")] - public function get source():String - { - return _source; - } - - /** - * Set content string - */ - public function set content(value:String):void - { - if (value) - { - _content=value; - - invalidateProperties(); - } - } - - /** - * Return content string of div contents - */ - public function get content():String - { - return _content; - } - - /** - * Request visibility update of html frame. - * - * @param value Boolean desired visibility state - * @return The actual resulting visibility after applying rules - */ - protected function updateFrameVisibility(value:Boolean):Boolean - { - logger.debug("IFrame with id '{0}' visibility set to '{1}'", _frameId, value); - - // Check that this frame should currently be visible - var isCurrentlyVisible:Boolean = checkDisplay(); - - // all of the following must be true for the iframe/div to be displayed: - // - the calling code is trying to show it - // - all parent navigators are set to correct index for this child to show - // - the frame has been added - // - overlay detection, if enabled, is not tracking any overlapping popups - // - .visible has not explicitly been set to false (or .hidden to true) on this component - // - if there's a load indicator defined, the iframe content has finished loading - if (isCurrentlyVisible && value && _validForDisplay && _parentVisibility && _frameAdded && (!overlayDetection || overlapCount == 0) && explicitVisibleValue == true && (_frameLoaded || (!_frameLoaded && loadIndicatorClass == null))) - { - // if we have an iframe in the same domain as the app, call the - // specialized functions to update visibility inside the iframe - if (source && _iframeContentHost == _appHost) - { - showIFrame(); - } - else - { - showDiv(); - } - - // make sure position and status indicators get updated when revealed - invalidateDisplayList(); - return true; - } - else - { - if (source && _iframeContentHost == _appHost) - { - hideIFrame(); - } - else - { - hideDiv(); - } - return false; - } - } - - /** - * Manually sets visibility of html iframe. - * - * @param value Boolean flag - */ - override public function set visible(value:Boolean):void - { - if (explicitVisibleValue != value) - { - super.visible=value; - explicitVisibleValue=value; - updateFrameVisibility(value); - } - } - - - // ========================================================================================= - // Application objects hierarchy path - // ========================================================================================= - - /** - * The dictionnary of the hierarchy of the parent containers. - */ - protected var containerDict:Object=null; - - /** - * The dictionnary of the child indexes in the hierarchy of the parent containers. - */ - protected var settingDict:Object=null; - - /** - * The z-index of this component off the system root - */ - protected var rootIndex:int=-1; - - /** - * Build list of container objects on the display list path all the way down - * to this object. We will seed the container classes we find with an event - * listener which will be used to test if this object is to be displayed or not. - * - * When the component is created the display list is traversed from the - * component down to the root element. At each traversal a test is made to - * see if current component is a container. If it is a container then the - * child of the element which leads back to the component is determined and - * a note madeof the appropriate 'index' on the path. The index is stored - * against a reference to the Container in a Dictionary. Also the container - * is 'seeded' with an event handler so that if the container triggers an - * IndexChangedEvent.CHANGE (i.e. when you click on a tab in a tab navigator) - * the path of 'index' values down to the component can be checked. If the - * path indicates that the indexes 'line up' to expose the component then - * the view is made visible. - */ - protected function buildContainerList():void - { - // We are going to store containers against index of child which leads down - // to IFrame item. - containerDict=new Dictionary(); - settingDict=new Dictionary(); - - var current:DisplayObjectContainer=parent; - var previous:DisplayObjectContainer=this; - - while (current != null) - { - if (current is Container) - { - if (current.contains(previous)) - { - var childIndex:Number=current.getChildIndex(previous); - - // Store child index against container - containerDict[current]=childIndex; - settingDict[current]=current.hasOwnProperty("selectedIndex") ? current["selectedIndex"] : childIndex; - - // Tag on a change listener - current.addEventListener(IndexChangedEvent.CHANGE, handleChange); - current.addEventListener(MoveEvent.MOVE, handleMove); - current.addEventListener(FlexEvent.SHOW, handleShowHide); - current.addEventListener(FlexEvent.HIDE, handleShowHide); - } - - } - else if (current is ISystemManager) - { - // remember where we are off the system manager root - if (ISystemManager(current).rawChildren.contains(previous)) - { - rootIndex=ISystemManager(current).rawChildren.getChildIndex(previous); - } - } - - previous=current; - current=current.parent; - } - } - - /** - * Triggered by one of our listeners seeded all the way up the display - * list to catch a 'show' and 'hide' events which might hide or display this object. - * - * @param event Event trigger - */ - protected function handleShowHide(event:FlexEvent):void - { - var valid:Boolean = true; - - for (var item:Object in containerDict) - { - valid = valid && item.visible; - } - - _parentVisibility = valid; - - var result:Boolean = updateFrameVisibility(valid); - logger.debug("Frame {0} set visible to {1} on {2} event", _frameId, result, event.type); - } - - - /** - * Return index of child item on path down to this object. If not - * found then return -1; - * - * @param target Container object - */ - public function lookupIndex(target:Container):Number - { - var index:Number=-1; - - try - { - index=containerDict[target]; - } - catch (e:Error) - { - // Error not found, we have to catch this or a silent exception - // will be thrown. - logger.debug(e.toString()); - } - - return index; - } - - /** - * Return index of child item on path down to this object. If not - * found then return -1; - * - * @param target Container object - */ - public function lookupSetting(target:Container):Number - { - var index:Number=-1; - - try - { - index=settingDict[target]; - } - catch (e:Error) - { - // Error not found, we have to catch this or a silent exception - // will be thrown. - logger.debug(e.toString()); - } - - return index; - } - - - // ========================================================================================= - // Loading indicator - // ========================================================================================= - - /** - * A UIComponent class to display centered over the iframe container while - * the browser is loading its content. Should implement measuredHeight - * and measuredWidth in order to be properly sized. - */ - public var loadIndicatorClass:Class; - - /** - * The instance of the load indicator class. - */ - protected var _loadIndicator:UIComponent; - - - // ========================================================================================= - // Overlay object detection - // ========================================================================================= - - /** - * The state of the overlay detection system (experimental). - * - * @default false - */ - public var overlayDetection:Boolean=false; - - /** - * A dictionnary holding the objects overlapping the IFrame. - */ - protected var overlappingDict:Dictionary=new Dictionary(true); - - /** - * The count of the objects overlapping the IFrame. - */ - protected var overlapCount:int=0; - - /** - * Called to check for existing pop-ups when the component - * appears or changes size - */ - protected function checkExistingPopUps():void - { - // run through each child of systemManager and if it's a popup, check it for overlay - var sm:ISystemManager=systemManager; - var n:int=sm.rawChildren.numChildren; - for (var i:int=0; i < n; i++) - { - var child:UIComponent=sm.rawChildren.getChildAt(i) as UIComponent; - if (child && child.isPopUp) - { - checkOverlay(child); - } - } - } - - /** - * Triggered when the object is added to the stage. - */ - protected function systemManager_addedHandler(event:Event):void - { - // A display object was added somewhere - var displayObj:DisplayObject=event.target as DisplayObject; - if (displayObj.parent == systemManager && displayObj.name != "cursorHolder" && !(displayObj is ToolTip)) - { - // If the object is a direct child of systemManager (i.e it floats) and isn't the cursor, - // or a tooltip, check to see if it overlaps me after it's been drawn - this.callLater(checkOverlay, [displayObj]); - } - } - - /** - * Triggered when the object is removed from the stage. - */ - protected function systemManager_removedHandler(event:Event):void - { - // A display object was removed somewhere - var displayObj:DisplayObject=event.target as DisplayObject; - if (displayObj.parent == systemManager && overlappingDict[displayObj]) - { - logger.debug("iframe {0} heard REMOVE for {1}", _frameId, displayObj.toString()); - // If the object is a direct child of systemManager and was an overlapping object, remove it - delete overlappingDict[displayObj]; - if (--overlapCount == 0) - { - updateFrameVisibility(true); - } - - if (displayObj is UIComponent) - { - // Remove listeners for hide and show events on overlappiung UIComponents - UIComponent(displayObj).removeEventListener(FlexEvent.HIDE, overlay_hideShowHandler); - UIComponent(displayObj).removeEventListener(FlexEvent.SHOW, overlay_hideShowHandler); - } - } - } - - /** - * Triggered when an overlapping object is shown or hidden. - */ - protected function overlay_hideShowHandler(event:FlexEvent):void - { - var displayObj:DisplayObject=event.target as DisplayObject; - if (event.type == FlexEvent.SHOW && !overlappingDict[displayObj]) - { - logger.debug("iframe {0} heard SHOW for {1}", _frameId, displayObj.toString()); - overlappingDict[displayObj]=displayObj; - overlapCount++; - updateFrameVisibility(false); - } - else if (event.type == FlexEvent.HIDE && overlappingDict[displayObj]) - { - logger.debug("iframe {0} heard HIDE for {1}", _frameId, displayObj.toString()); - delete overlappingDict[displayObj]; - if (--overlapCount == 0) - { - updateFrameVisibility(true); - } - } - } - - /** - * Check to see if the given DisplayObject overlaps this object. - * If so, add it to a dictionary of overlapping objects and update - * this object's visibility. - */ - protected function checkOverlay(displayObj:DisplayObject):void - { - if (displayObj.parent != systemManager) - return; // item has been removed since we heard it added - - if (isInFrontOfMe(displayObj) && !isAncestor(displayObj) && hitTestStageObject(displayObj)) - { - if (displayObj.visible) - { - if (!overlappingDict[displayObj]) - { - logger.debug("iframe {0} detected overlap of {1}", _frameId, displayObj.toString()); - overlappingDict[displayObj]=displayObj; - overlapCount++; - } - updateFrameVisibility(false); - } - - if (displayObj is UIComponent) - { - // Listen for hide and show events on overlapping UIComponents - // (ComboBox dropdowns for example aren't removed after use; they're just hidden) - UIComponent(displayObj).addEventListener(FlexEvent.HIDE, overlay_hideShowHandler, false, 0, true); - UIComponent(displayObj).addEventListener(FlexEvent.SHOW, overlay_hideShowHandler, false, 0, true); - } - } - } - - /** - * Checks whether a top-level object has a higher Z-index off - * the root than the Iframe container (in other words, - * whether it's on a layer above this object) - */ - protected function isInFrontOfMe(obj:DisplayObject):Boolean - { - var rootItems:IChildList=systemManager.rawChildren; - return (this.rootIndex < rootItems.getChildIndex(obj)); - } - - /** - * Use display object ancestry table already built - * to check whether an object is a container of this - * component or one of its ancestors - */ - protected function isAncestor(obj:DisplayObject):Boolean - { - for (var item:Object in containerDict) - { - if (obj == item) - return true; - } - return false; - } - - /** - * The native hitTestObject method seems to have some issues depending on - * the situation. This is a custom implementation to work around that. - * This method assumes that the passed DisplayObject is a direct child - * of the stage and therefore has x and y coordinates that are already global - */ - protected function hitTestStageObject(o:DisplayObject):Boolean - { - var overlapX:Boolean=false; - var overlapY:Boolean=false; - - var localMe:Point=new Point(this.x, this.y); - var globalMe:Point=this.parent.localToGlobal(localMe); - - var myLeft:int=globalMe.x; - var myRight:int=globalMe.x + this.width; - var oLeft:int=o.x; - var oRight:int=o.x + o.width; - - // Does object's left edge fall between my left and right edges? - overlapX=oLeft >= myLeft && oLeft <= myRight; - // Or does my left edge fall between object's left and right edges? - overlapX||=oLeft <= myLeft && oRight >= myLeft; - - var myTop:int=globalMe.y; - var myBottom:int=globalMe.y + this.height; - var oTop:int=o.y; - var oBottom:int=o.y + o.height; - - // Does object's top edge fall between my top and bottom edges? - overlapY=oTop >= myTop && oTop <= myBottom; - // Or does my top edge fall between object's top and bottom edges? - overlapY||=oTop <= myTop && oBottom >= myTop; - - return overlapX && overlapY; - } - - - // ========================================================================================= - // IFrame function call - // ========================================================================================= - - /** - * Calls a function of the specified name defined on the IFrame document - * (like document.functionName = function () {...} ), passing it an array of arguments. - * May not work if the iframe contents are in a different domain due to security. - * - * If the frame contents are loaded when this method is called, it will return any - * results from the function immediately to the caller (as well as to the callback - * function, if defined). Otherwise, the call will be queued, this method will return - * null, and results will be passed to the callback function after the frame loads - * and the queued function call executes. - * - * @param functionName String Name of function to call - * @param args Array List of arguments to pass as an array - * @param callback Function to call (if any) with results of IFrame function execution - */ - public function callIFrameFunction(functionName:String, args:Array=null, callback:Function=null):String - { - if (!source) - { - throw new Error("No IFrame to call functions on"); - } - - if (_iframeContentHost != _appHost) - { - logger.warn("Warning: attempt to call function '{0}' on IFrame '{1}' may fail due to cross-domain security.", functionName, _frameId); - } - - if (_frameLoaded) - { - // Call the function immediately - logger.info("frame id {0} now attempting to call internal iframe document function {1}", _frameId, functionName); - var result:Object=ExternalInterface.call(IFrameExternalCalls.FUNCTION_CALLIFRAMEFUNCTION, _iframeId, functionName, args); - if (callback != null) - { - callback(result); - } - return String(result); - } - else - { - // Queue the function for call once the iframe has loaded - var queuedCall:Object={functionName: functionName, args: args, callback: callback}; - _functionQueue.push(queuedCall); - return null; - } - } - - /** - * If you provide the name of JavaScript function here, that function will - * be called as a notification whenever the frame is hidden or shown due to - * tab index changes, overlay detection (if enabled), etc. It will be - * passed an array containing 1 item, the value true (if being shown) - * or false (if being hidden). - * - * This uses the same mechanism as callIFrameFunction, so the function - * should be defined the same way as others you want to call through - * this method - */ - public var visibilityNotificationFunction:String; - - - // ========================================================================================= - // SWF embed object tracking - // ========================================================================================= - - /** - * The SWF embed object id. - */ - public static var applicationId:String=null; - - /** - * The random string used to identify the right object. - */ - protected var randomIdentificationString:Number; - - /** - * Get the embed object id. - */ - protected function resolveEmbedObjectId():void - { - if (applicationId == null) - { - try - { - randomIdentificationString=Math.ceil(Math.random() * 9999 * 1000); - ExternalInterface.addCallback('checkObjectId', checkObjectId); - var result:Object=ExternalInterface.call(IFrameExternalCalls.FUNCTION_ASK_FOR_EMBED_OBJECT_ID, randomIdentificationString.toString()); - if (result != null) - { - applicationId=String(result); - logger.info("Resolved the SWF embed object id to '{0}'.", applicationId); - } - else - { - logger.error('Could not resolve the SWF embed object Id.'); - } - } - catch (error:Error) - { - logger.error(error.errorID + ": " + error.name + " - " + error.message); - } - } - } - - /** - * Receive information about a DOM object and test if this is this SWF object. - */ - protected function checkObjectId(id:String, randomCode:Number):Boolean - { - return randomIdentificationString == randomCode ? true : false; - } - - - // ========================================================================================= - // Calls to ExternalInterface - // ========================================================================================= - - /** - * Inserts the Javascript functions in the DOM, setups the callback and javascripts event - * listeners. - */ - protected function setupExternalInterface():void - { - logger.info("Inserting Javascript functions in the DOM."); - - // Add the functions to the DOM if they aren't already there. - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_CREATEIFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_MOVEIFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_HIDEIFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_SHOWIFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_HIDEDIV); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_SHOWDIV); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_LOADIFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_LOADDIV_CONTENT); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_CALLIFRAMEFUNCTION); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_REMOVEIFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_GET_BROWSER_MEASURED_WIDTH); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_PRINT_IFRAME); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_HISTORY_BACK); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_HISTORY_FORWARD); - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_GET_SOURCE); - - // Resolve the SWF embed object id in the DOM. - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_ASK_FOR_EMBED_OBJECT_ID); - resolveEmbedObjectId(); - - // Register a uniquely-named load event callback for this frame. - ExternalInterface.addCallback(_frameId + "_load", handleFrameLoad); - - // Setup the browser resize event listener. - ExternalInterface.call(IFrameExternalCalls.INSERT_FUNCTION_SETUP_RESIZE_EVENT_LISTENER(_frameId)); - setupBrowserResizeEventListener(); - ExternalInterface.addCallback(_frameId + "_resize", function():void - { - adjustPosition(true); - }); - } - - /** - * Create the IFrame. - */ - protected function createIFrame():void - { - logger.info("Creating IFrame with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_CREATEIFRAME, _frameId, (scrollPolicy == SCROLL_POLICY_OFF)?"hidden":"auto"); - } - - /** - * Move the IFrame. - */ - protected function moveIFrame(x:int, y:int, width:int, height:int):void - { - logger.info("Moving IFrame with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_MOVEIFRAME, _frameId, _iframeId, x, y, width, height, applicationId); - } - - /** - * Hide the IFrame. - */ - protected function hideIFrame():void - { - logger.info("Hiding IFrame with id '{0}'.", _frameId); - if (visibilityNotificationFunction) - callIFrameFunction(visibilityNotificationFunction, [false]); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_HIDEIFRAME, _frameId, _iframeId); - } - - /** - * Show the IFrame. - */ - protected function showIFrame():void - { - logger.info("Showing IFrame with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_SHOWIFRAME, _frameId, _iframeId); - if (visibilityNotificationFunction) - callIFrameFunction(visibilityNotificationFunction, [true]); - } - - /** - * Hide the div. - */ - protected function hideDiv():void - { - logger.info("Hiding div with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_HIDEDIV, _frameId); - } - - /** - * Show the div. - */ - protected function showDiv():void - { - logger.info("Showing div id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_SHOWDIV, _frameId); - } - - /** - * Show the IFrame. - */ - protected function loadIFrame():void - { - logger.info("Loading IFrame with id '{0}', on SWF embed object with id '{1}'.", _frameId, applicationId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_LOADIFRAME, _frameId, _iframeId, source, applicationId, scrollPolicy); - } - - /** - * Load content into a div. - */ - protected function loadDivContent():void - { - logger.info("Loading content on IFrame with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_LOADDIV_CONTENT, _frameId, _iframeId, content); - } - - /** - * Remove the IFrame. - */ - public function removeIFrame():void - { - logger.info("Removing IFrame with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_REMOVEIFRAME, _frameId); - } - - /** - * Bring the IFrame to the front. - */ - public function bringIFrameToFront():void - { - logger.info("Bring to front IFrame with id '{0}'.", _frameId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_BRING_IFRAME_TO_FRONT, _frameId); - } - - /** - * Get the browser measured width. - */ - protected function getBrowserMeasuredWidth():Number - { - logger.info("Get browser measured width."); - var result:Object=ExternalInterface.call(IFrameExternalCalls.FUNCTION_GET_BROWSER_MEASURED_WIDTH, applicationId); - if (result != null) - { - return new Number(result); - } - return new Number(0); - } + public static var FUNCTION_CREATEIFRAME:String = "createIFrame"; + public static var INSERT_FUNCTION_CREATEIFRAME:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_CREATEIFRAME + "==null)" + + "{" + + FUNCTION_CREATEIFRAME + " = function (frameID, overflowAssignment)" + + "{ " + + "var bodyID = document.getElementsByTagName(\"body\")[0];" + + "var newDiv = document.createElement('div');" + + "newDiv.id = frameID;" + + "newDiv.style.position ='absolute';" + + "newDiv.style.backgroundColor = '#FFFFFF';" + + "newDiv.style.border = '0px';" + + "newDiv.style.overflow = overflowAssignment;" + + "newDiv.style.display = 'none';" + + "bodyID.appendChild(newDiv);" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_MOVEIFRAME:String = "moveIFrame"; + public static var INSERT_FUNCTION_MOVEIFRAME:String = + "document.insertScript = function () " + + "{ " + + "if (document." + FUNCTION_MOVEIFRAME + "==null) " + + "{ " + + FUNCTION_MOVEIFRAME + " = function(frameID,iframeID,x,y,w,h,objectID) " + + "{" + + "var frameRef = document.getElementById(frameID); " + + "var swfObject = document.getElementById(objectID); " + + "frameRef.style.left = x + swfObject.offsetLeft + 'px'; " + + "frameRef.style.top = y + swfObject.offsetTop + 'px'; " + + "frameRef.style.width = w + 'px'; " + + "frameRef.style.height = h + 'px'; " + + "var iFrameRef = document.getElementById(iframeID); " + + "iFrameRef.width = w;" + + "iFrameRef.height = h;" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_HIDEIFRAME:String = "hideIFrame"; + public static var INSERT_FUNCTION_HIDEIFRAME:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_HIDEIFRAME + "==null)" + + "{" + + FUNCTION_HIDEIFRAME + " = function (frameID, iframeID)" + + "{" + + "var iframeRef = document.getElementById(iframeID);" + + "var iframeDoc;" + + "if (iframeRef.contentWindow) {" + + "iframeDoc = iframeRef.contentWindow.document;" + + "} else if (iframeRef.contentDocument) {" + + "iframeDoc = iframeRef.contentDocument;" + + "} else if (iframeRef.document) {" + + "iframeDoc = iframeRef.document;" + + "}" + + "if (iframeDoc) {" + + "iframeDoc.body.style.display = 'none';" + + "}" + + "document.getElementById(frameID).style.display = 'none';" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_SHOWIFRAME:String = "showIFrame"; + public static var INSERT_FUNCTION_SHOWIFRAME:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_SHOWIFRAME + "==null)" + + "{" + + FUNCTION_SHOWIFRAME + " = function (frameID, iframeID)" + + "{" + + "var iframeRef = document.getElementById(iframeID);" + + "document.getElementById(frameID).style.display='block';" + + "var iframeDoc;" + + "if (iframeRef.contentWindow) {" + + "iframeDoc = iframeRef.contentWindow.document;" + + "} else if (iframeRef.contentDocument) {" + + "iframeDoc = iframeRef.contentDocument;" + + "} else if (iframeRef.document) {" + + "iframeDoc = iframeRef.document;" + + "}" + + "if (iframeDoc) {" + + "iframeDoc.body.style.display='block';" + + "}" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_HIDEDIV:String = "hideDiv"; + public static var INSERT_FUNCTION_HIDEDIV:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_HIDEDIV + "==null)" + + "{" + + FUNCTION_HIDEDIV + " = function (frameID)" + + "{" + + "document.getElementById(frameID).style.display='none';" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_SHOWDIV:String = "showDiv"; + public static var INSERT_FUNCTION_SHOWDIV:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_SHOWDIV + "==null)" + + "{" + + FUNCTION_SHOWDIV + " = function (frameID)" + + "{" + + "document.getElementById(frameID).style.display = 'block';" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_LOADIFRAME:String = "loadIFrame"; + public static var INSERT_FUNCTION_LOADIFRAME:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_LOADIFRAME + "==null)" + + "{" + + FUNCTION_LOADIFRAME + " = function (frameID, iframeID, url, embedID, scrollPolicy)" + + "{" + + "document.getElementById(frameID).innerHTML = " + + "\"\";" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_LOADDIV_CONTENT:String = "loadDivContent"; + public static var INSERT_FUNCTION_LOADDIV_CONTENT:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_LOADDIV_CONTENT + "==null)" + + "{" + + FUNCTION_LOADDIV_CONTENT + " = function (frameID, iframeID, content)" + + "{" + + "document.getElementById(frameID).innerHTML = \"
\"+content+\"
\";" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_CALLIFRAMEFUNCTION:String = "callIFrameFunction"; + public static var INSERT_FUNCTION_CALLIFRAMEFUNCTION:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_CALLIFRAMEFUNCTION + "==null)" + + "{" + + FUNCTION_CALLIFRAMEFUNCTION + " = function (iframeID, functionName, args)" + + "{" + + "var iframeRef=document.getElementById(iframeID);" + + "var iframeWin;" + + "if (iframeRef.contentWindow) {" + + "iframeWin = iframeRef.contentWindow;" + + "} else if (iframeRef.contentDocument) {" + + "iframeWin = iframeRef.contentDocument.window;" + + "} else if (iframeRef.window) {" + + "iframeWin = iframeRef.window;" + + "}" + + "if (iframeWin.wrappedJSObject != undefined) {" + + "iframeWin = iframeDoc.wrappedJSObject;" + + "}" + + "return iframeWin[functionName](args);" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_REMOVEIFRAME:String = "removeIFrame"; + public static var INSERT_FUNCTION_REMOVEIFRAME:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_REMOVEIFRAME + "==null)" + + "{" + + FUNCTION_REMOVEIFRAME + " = function (frameID)" + + "{ " + + "var iFrameDiv = document.getElementById(frameID);" + + "iFrameDiv.parentNode.removeChild(iFrameDiv);" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_BRING_IFRAME_TO_FRONT:String = "bringIFrameToFront"; + public static var INSERT_FUNCTION_BRING_IFRAME_TO_FRONT:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_BRING_IFRAME_TO_FRONT + "==null)" + + "{" + + "var oldFrame=null;" + + FUNCTION_BRING_IFRAME_TO_FRONT + " = function(frameID) " + + "{" + + "var frameRef=document.getElementById(frameID);" + + "if (oldFrame!=frameRef) {" + + "if (oldFrame) {" + + "oldFrame.style.zIndex=\"99\";" + + "}" + + "frameRef.style.zIndex=\"100\";" + + "oldFrame = frameRef;" + + "}" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_ASK_FOR_EMBED_OBJECT_ID:String = "askForEmbedObjectId"; + public static var INSERT_FUNCTION_ASK_FOR_EMBED_OBJECT_ID:String = + "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_ASK_FOR_EMBED_OBJECT_ID + "==null)" + + "{ " + + FUNCTION_ASK_FOR_EMBED_OBJECT_ID + " = function(randomString) " + + "{ " + + "try { " + + "var embeds = document.getElementsByTagName('embed'); " + + "for (var i = 0; i < embeds.length; i++) { " + + "var isTheGoodOne = embeds[i].checkObjectId(embeds[i].getAttribute('id'),randomString); " + + "if(isTheGoodOne) { " + + "return embeds[i].getAttribute('id'); " + + "} " + + "} " + + "var objects = document.getElementsByTagName('object'); " + + "for(i = 0; i < objects.length; i++) { " + + "var isTheGoodOne = objects[i].checkObjectId(objects[i].getAttribute('id'),randomString); " + + "if(isTheGoodOne) { " + + "return objects[i].getAttribute('id'); " + + "} " + + "} " + + "} catch(e) {} " + + "return null; " + + "} " + + "} " + + "}"; + + + public static var FUNCTION_GET_BROWSER_MEASURED_WIDTH:String = "getBrowserMeasuredWidth"; + public static var INSERT_FUNCTION_GET_BROWSER_MEASURED_WIDTH:String = + "document.insertScript = function () " + + "{ " + + "if (document." + FUNCTION_GET_BROWSER_MEASURED_WIDTH + "==null) " + + "{ " + + FUNCTION_GET_BROWSER_MEASURED_WIDTH + " = function(objectID) " + + "{ " + + "return document.getElementById(objectID).offsetWidth; " + + "} " + + "} " + + "}"; + + + public static var FUNCTION_SETUP_RESIZE_EVENT_LISTENER:String = "setupResizeEventListener"; + public static function INSERT_FUNCTION_SETUP_RESIZE_EVENT_LISTENER(frameId:String):String + { + return "document.insertScript = function ()" + + "{ " + + "if (document." + FUNCTION_SETUP_RESIZE_EVENT_LISTENER + "==null)" + + "{ " + + FUNCTION_SETUP_RESIZE_EVENT_LISTENER + " = function() " + + "{ " + + "if (window.addEventListener) { " + + "window.addEventListener(\"resize\", on" + frameId + "Resize, false); " + + "} else if (window.attachEvent) { " + + "window.attachEvent(\"onresize\", on" + frameId + "Resize); " + + "} " + + "} " + + "} " + + "if (document.on" + frameId + "Resize==null)" + + "{ " + + "var resizeTimeout" + frameId + "; " + + "function on" + frameId + "Resize(e) " + + "{ " + + "window.clearTimeout(resizeTimeout" + frameId + ");" + + "resizeTimeout" + frameId + " = window.setTimeout('notify" + frameId + "Resize();', 10); " + + "} " + + "} " + + "if (document.notify" + frameId + "Resize==null)" + + "{ " + + "notify" + frameId + "Resize = function() " + + "{ " + + "document.getElementById('" + IFrame.applicationId + "')." + frameId + "_resize(); " + + "} " + + "} " + + "} "; + } + + + public static var FUNCTION_PRINT_IFRAME:String = "printIFrame"; + public static var INSERT_FUNCTION_PRINT_IFRAME:String = + "document.insertScript = function ()" + + "{" + + "if (document." + FUNCTION_PRINT_IFRAME + "==null)" + + "{" + + FUNCTION_PRINT_IFRAME + " = function (iframeID)" + + "{" + + "try" + + "{" + + "if (navigator.appName.indexOf('Microsoft') != -1)" + + "{" + + "document[iframeID].focus();" + + "document[iframeID].print();" + + "}" + + "else" + + "{" + + "for (var i=0; i < window.frames.length; i++)" + + "{" + + "if (window.frames[i].name == iframeID)" + + "{" + + "window.frames[i].focus();" + + "window.frames[i].print();" + + "}" + + "}" + + "}" + + "}" + + "catch(e)" + + "{" + + "alert(e.name + ': ' + e.message);" + + "}" + + "}" + + "}" + + "}"; + + + public static var FUNCTION_HISTORY_BACK:String = "historyBack"; + public static var INSERT_FUNCTION_HISTORY_BACK:String = + "document.insertScript = function ()" + + "{" + + "if (document." + FUNCTION_HISTORY_BACK + "==null)" + + "{" + + FUNCTION_HISTORY_BACK + " = function (iframeID)" + + "{" + + "frames[iframeID].history.go(-1); " + + "}" + + "}" + + "}"; + + + public static var FUNCTION_HISTORY_FORWARD:String = "historyForward"; + public static var INSERT_FUNCTION_HISTORY_FORWARD:String = + "document.insertScript = function ()" + + "{" + + "if (document." + FUNCTION_HISTORY_FORWARD + "==null)" + + "{" + + FUNCTION_HISTORY_FORWARD + " = function (iframeID)" + + "{" + + "frames[iframeID].history.go(1); " + + "}" + + "}" + + "}"; - /** - * Get the browser source. - */ - protected function getBrowserSource():String - { - logger.info("Get browser source."); - var result:Object = ExternalInterface.call(IFrameExternalCalls.FUNCTION_GET_SOURCE, _iframeId); - if (result != null) - { - return result as String; - } - return ""; - } - - /** - * Setup the Browser resize event listener. - */ - protected function setupBrowserResizeEventListener():void - { - logger.info("Setup the Browser resize event listener."); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_SETUP_RESIZE_EVENT_LISTENER); - } - - /** - * Print the content of the IFrame. - */ - public function printIFrame():void - { - logger.info("Print the iFrame with id '{0}'.", _iframeId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_PRINT_IFRAME, _iframeId); - } - - /** - * Load the IFrame's last page in the navigation history. - */ - public function historyBack():void - { - logger.info("History back for the iFrame with id '{0}'.", _iframeId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_HISTORY_BACK, _iframeId); - } - - /** - * Load the IFrame's next page in the navigation history. - */ - public function historyForward():void - { - logger.info("History forward for the iFrame with id '{0}'.", _iframeId); - ExternalInterface.call(IFrameExternalCalls.FUNCTION_HISTORY_FORWARD, _iframeId); - } - - - // ========================================================================================= - // Debug mode - // ========================================================================================= - - /** - * The state of the debug mode. - */ - protected var _debug:Boolean=false; - - /** - * The target for the logger. - */ - protected var logTarget:TraceTarget; - - /** - * The class logger. - */ - protected var logger:ILogger=Log.getLogger("flex-iframe"); - - /** - * Get the state of the debug mode. - */ - public function get debug():Boolean - { - return _debug; - } - - /** - * Set the state of the debug mode. - */ - public function set debug(value:Boolean):void - { - if (value == debug) - return; - - if (value) - { - if (!logTarget) - { - logTarget=new TraceTarget(); - logTarget.includeLevel=true; - logTarget.includeTime=true; - logTarget.level=LogEventLevel.ALL; - logTarget.filters=["flex-iframe"]; - } - logTarget.addLogger(logger); - } - else - { - if (logTarget) - logTarget.removeLogger(logger); - } - - _debug=value; - } - + + + public static var FUNCTION_GET_SOURCE:String = "getSource"; + public static var INSERT_FUNCTION_GET_SOURCE:String = + "document.insertScript = function () " + + "{ " + + "if (document." + FUNCTION_GET_SOURCE + "==null) " + + "{ " + + FUNCTION_GET_SOURCE + " = function(iframeID) " + + "{ " + + "return document.getElementById(iframeID).contentDocument.URL; " + + "} " + + "} " + + "}"; } }