Iframe + AjaxControlToolkit v1 + IE = Access Denied Cross Domain
Siempre oí hablar del infierno de las DLL pero cuando hablamos de desarrollos web no nos podemos olvidar del infierno de los iFrames. Cabe decir que este problema lo han solucionado en la nueva versión de AjaxControlToolkit v3 pero para los que tenemos algún proyecto con la versión anterior tenemos una solución para este problema de permisos.
Primero mostraremos gráficamente cual es el problema.
Hemos creado un simple TexBox con un CalendarExtender para seleccionar una fecha del calendario y esta página de ejemplo la llamamos desde un Iframe que se encuentra en otro dominio, como si la llamada fuera desde un cliente ;-).
Un claro ejemplo de un error de acceso de Cross-Domain.
En el Blog de Bertrand Le Roy’s nos da una solución para poder solucionar este problema que lo provoca Sys.UI.getLocation al intentar acceder a una propiedad de la página.
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <script type= "text/javascript"> if (Sys.Browser.agent == Sys.Browser.InternetExplorer){ Sys.UI.DomElement.getLocation=function(a){ if(a.self||a.nodeType===9) return new Sys.UI.Point(0,0); var b=a.getBoundingClientRect(); if(!b) return new Sys.UI.Point(0,0); var c=a.document.documentElement,d=b.left-2 +c.scrollLeft,e=b.top-2+c.scrollTop; try{ var g=a.ownerDocument.parentWindow.frameElement||null; if(g){ var f=2-(g.frameBorder||1)*2; d+=f;e+=f } }catch(h){} return new Sys.UI.Point(d,e)}; }
Lo único que tenemos que hacer es sobreescribir Sys.UI.DomElement.getLocation cuando el exploración sea InternetExplorer y evitaremos el tan temido error.
Con esta pequeña modificación ya podemos utilizar nuestro ejemplo dentro de un Iframe desde otro dominio.