UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

241 lines (209 loc) 6.32 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Andreas Ecker (ecker) * Jonathan Weiß (jonathan_rass) * Christian Hagendorn (Chris_schmidt) ************************************************************************ */ /** * Cross browser abstractions to work with iframes. * * @require(qx.event.handler.Iframe) */ qx.Class.define("qx.bom.Iframe", { /* ***************************************************************************** STATICS ***************************************************************************** */ statics : { /** * @type {Map} Default attributes for creation {@link #create}. */ DEFAULT_ATTRIBUTES : { onload : "qx.event.handler.Iframe.onevent(this)", frameBorder: 0, frameSpacing: 0, marginWidth: 0, marginHeight: 0, hspace: 0, vspace: 0, border: 0, allowTransparency: true }, /** * Creates an DOM element. * * Attributes may be given directly with this call. This is critical * for some attributes e.g. name, type, ... in many clients. * * @param attributes {Map?null} Map of attributes to apply * @param win {Window?null} Window to create the element for * @return {Element} The created iframe node */ create : function(attributes, win) { // Work on a copy to not modify given attributes map var attributes = attributes ? qx.lang.Object.clone(attributes) : {}; var initValues = qx.bom.Iframe.DEFAULT_ATTRIBUTES; for (var key in initValues) { if (attributes[key] == null) { attributes[key] = initValues[key]; } } return qx.dom.Element.create("iframe", attributes, win); }, /** * Get the DOM window object of an iframe. * * @param iframe {Element} DOM element of the iframe. * @return {Window?null} The DOM window object of the iframe or null. * @signature function(iframe) */ getWindow : function(iframe) { try { return iframe.contentWindow; } catch(ex) { return null; } }, /** * Get the DOM document object of an iframe. * * @param iframe {Element} DOM element of the iframe. * @return {Document} The DOM document object of the iframe. */ getDocument : function(iframe) { if ("contentDocument" in iframe) { try { return iframe.contentDocument; } catch(ex) { return null; } } try { var win = this.getWindow(iframe); return win ? win.document : null; } catch(ex) { return null; } }, /** * Get the HTML body element of the iframe. * * @param iframe {Element} DOM element of the iframe. * @return {Element} The DOM node of the <code>body</code> element of the iframe. */ getBody : function(iframe) { try { var doc = this.getDocument(iframe); return doc ? doc.getElementsByTagName("body")[0] : null; } catch(ex) { return null; } }, /** * Sets iframe's source attribute to given value * * @param iframe {Element} DOM element of the iframe. * @param source {String} URL to be set. * @signature function(iframe, source) */ setSource : function(iframe, source) { try { // the guru says ... // it is better to use 'replace' than 'src'-attribute, since 'replace' // does not interfere with the history (which is taken care of by the // history manager), but there has to be a loaded document if (this.getWindow(iframe) && qx.dom.Hierarchy.isRendered(iframe)) { /* Some gecko users might have an exception here: Exception... "Component returned failure code: 0x805e000a [nsIDOMLocation.replace]" nsresult: "0x805e000a (<unknown>)" */ try { // Webkit on Mac can't set the source when the iframe is still // loading its current page if ((qx.core.Environment.get("engine.name") == "webkit") && qx.core.Environment.get("os.name") == "osx") { var contentWindow = this.getWindow(iframe); if (contentWindow) { contentWindow.stop(); } } this.getWindow(iframe).location.replace(source); } catch(ex) { iframe.src = source; } } else { iframe.src = source; } // This is a programmer provided source. Remember URL for this source // for later comparison with current URL. The current URL can diverge // if the end-user navigates in the Iframe. this.__rememberUrl(iframe); } catch(ex) { qx.log.Logger.warn("Iframe source could not be set!"); } }, /** * Returns the current (served) URL inside the iframe * * @param iframe {Element} DOM element of the iframe. * @return {String} Returns the location href or null (if a query is not possible/allowed) */ queryCurrentUrl : function(iframe) { var doc = this.getDocument(iframe); try { if (doc && doc.location) { return doc.location.href; } } catch(ex) {}; return ""; }, /** * Remember actual URL of iframe. * * @param iframe {Element} DOM element of the iframe. */ __rememberUrl: function(iframe) { // URL can only be detected after load. Retrieve and store URL once. var callback = function() { qx.bom.Event.removeNativeListener(iframe, "load", callback); iframe.$$url = qx.bom.Iframe.queryCurrentUrl(iframe); }; qx.bom.Event.addNativeListener(iframe, "load", callback); } } });