annotate iframe-resizer/src/iframeResizer.js @ 1:bda1cc8041bf draft

Markdown support added
author saskia-hiltemann
date Tue, 07 Oct 2014 08:47:45 -0400
parents c73753f1606f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
1 /*
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
2 * File: iframeReizer.js
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
3 * Desc: Force iframes to size to content.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
4 * Requires: iframeResizer.contentWindow.js to be loaded into the target frame.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
5 * Author: David J. Bradshaw - dave@bradshaw.net
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
6 * Contributor: Jure Mav - jure.mav@gmail.com
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
7 */
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
8 ;( function() {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
9 'use strict';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
10
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
11 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
12 count = 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
13 firstRun = true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
14 msgHeader = 'message',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
15 msgHeaderLen = msgHeader.length,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
16 msgId = '[iFrameSizer]', //Must match iframe msg ID
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
17 msgIdLen = msgId.length,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
18 page = '', //:'+location.href, //Uncoment to debug nested iFrames
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
19 pagePosition = null,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
20 requestAnimationFrame = window.requestAnimationFrame,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
21 resetRequiredMethods = {max:1,scroll:1,bodyScroll:1,documentElementScroll:1},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
22 settings = {},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
23
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
24 defaults = {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
25 autoResize : true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
26 bodyBackground : null,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
27 bodyMargin : null,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
28 bodyMarginV1 : 8,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
29 bodyPadding : null,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
30 checkOrigin : true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
31 enablePublicMethods : false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
32 heightCalculationMethod : 'offset',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
33 interval : 32,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
34 log : false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
35 maxHeight : Infinity,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
36 maxWidth : Infinity,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
37 minHeight : 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
38 minWidth : 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
39 scrolling : false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
40 sizeHeight : true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
41 sizeWidth : false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
42 tolerance : 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
43 closedCallback : function(){},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
44 initCallback : function(){},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
45 messageCallback : function(){},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
46 resizedCallback : function(){}
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
47 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
48
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
49 function addEventListener(obj,evt,func){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
50 if ('addEventListener' in window){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
51 obj.addEventListener(evt,func, false);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
52 } else if ('attachEvent' in window){//IE
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
53 obj.attachEvent('on'+evt,func);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
54 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
55 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
56
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
57 function setupRequestAnimationFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
58 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
59 vendors = ['moz', 'webkit', 'o', 'ms'],
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
60 x;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
61
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
62 // Remove vendor prefixing if prefixed and break early if not
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
63 for (x = 0; x < vendors.length && !requestAnimationFrame; x += 1) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
64 requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
65 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
66
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
67 if (!(requestAnimationFrame)){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
68 log(' RequestAnimationFrame not supported');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
69 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
70 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
71
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
72 function log(msg){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
73 if (settings.log && (typeof console === 'object')){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
74 console.log(msgId + '[Host page'+page+']' + msg);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
75 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
76 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
77
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
78
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
79 function iFrameListener(event){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
80 function resizeIFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
81 function resize(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
82 setSize(messageData);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
83 setPagePosition();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
84 settings.resizedCallback(messageData);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
85 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
86
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
87 syncResize(resize,messageData,'resetPage');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
88 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
89
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
90 function closeIFrame(iframe){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
91 var iframeID = iframe.id;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
92
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
93 log(' Removing iFrame: '+iframeID);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
94 iframe.parentNode.removeChild(iframe);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
95 settings.closedCallback(iframeID);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
96 log(' --');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
97 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
98
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
99 function processMsg(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
100 var data = msg.substr(msgIdLen).split(':');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
101
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
102 return {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
103 iframe: document.getElementById(data[0]),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
104 id: data[0],
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
105 height: data[1],
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
106 width: data[2],
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
107 type: data[3]
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
108 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
109 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
110
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
111 function ensureInRange(Dimension){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
112 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
113 max = Number(settings['max'+Dimension]),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
114 min = Number(settings['min'+Dimension]),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
115 dimension = Dimension.toLowerCase(),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
116 size = Number(messageData[dimension]);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
117
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
118 if (min>max){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
119 throw new Error('Value for min'+Dimension+' can not be greater than max'+Dimension);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
120 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
121
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
122 log(' Checking '+dimension+' is in range '+min+'-'+max);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
123
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
124 if (size<min) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
125 size=min;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
126 log(' Set '+dimension+' to min value');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
127 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
128
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
129 if (size>max) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
130 size=max;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
131 log(' Set '+dimension+' to max value');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
132 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
133
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
134 messageData[dimension]=''+size;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
135 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
136
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
137 function isMessageFromIFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
138
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
139 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
140 origin = event.origin,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
141 remoteHost = messageData.iframe.src.split('/').slice(0,3).join('/');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
142
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
143 if (settings.checkOrigin) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
144 log(' Checking connection is from: '+remoteHost);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
145
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
146 if ((''+origin !== 'null') && (origin !== remoteHost)) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
147 throw new Error(
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
148 'Unexpected message received from: ' + origin +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
149 ' for ' + messageData.iframe.id +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
150 '. Message was: ' + event.data +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
151 '. This error can be disabled by adding the checkOrigin: false option.'
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
152 );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
153 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
154 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
155
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
156 return true;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
157 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
158
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
159 function isMessageForUs(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
160 return msgId === ('' + msg).substr(0,msgIdLen); //''+Protects against non-string msg
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
161 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
162
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
163 function isMessageFromMetaParent(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
164 //test if this message is from a parent above us. This is an ugly test, however, updating
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
165 //the message format would break backwards compatibity.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
166 var retCode = messageData.type in {'true':1,'false':1};
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
167
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
168 if (retCode){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
169 log(' Ignoring init message from meta parent page');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
170 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
171
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
172 return retCode;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
173 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
174
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
175 function forwardMsgFromIFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
176 var msgBody = msg.substr(msg.indexOf(':')+msgHeaderLen+6); //6 === ':0:0:' + ':' (Ideas to name this magic number most welcome)
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
177
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
178 log(' MessageCallback passed: {iframe: '+ messageData.iframe.id + ', message: ' + msgBody + '}');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
179 settings.messageCallback({
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
180 iframe: messageData.iframe,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
181 message: msgBody
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
182 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
183 log(' --');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
184 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
185
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
186 function checkIFrameExists(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
187 if (null === messageData.iframe) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
188 throw new Error('iFrame ('+messageData.id+') does not exist on ' + page);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
189 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
190 return true;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
191 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
192
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
193 function actionMsg(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
194 switch(messageData.type){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
195 case 'close':
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
196 closeIFrame(messageData.iframe);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
197 settings.resizedCallback(messageData); //To be removed.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
198 break;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
199 case 'message':
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
200 forwardMsgFromIFrame();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
201 break;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
202 case 'reset':
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
203 resetIFrame(messageData);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
204 break;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
205 case 'init':
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
206 resizeIFrame();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
207 settings.initCallback(messageData.iframe);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
208 break;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
209 default:
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
210 resizeIFrame();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
211 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
212 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
213
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
214 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
215 msg = event.data,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
216 messageData = {};
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
217
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
218 if (isMessageForUs()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
219 log(' Received: '+msg);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
220 messageData = processMsg();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
221 ensureInRange('Height');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
222 ensureInRange('Width');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
223
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
224 if ( !isMessageFromMetaParent() && checkIFrameExists() && isMessageFromIFrame() ){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
225 actionMsg();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
226 firstRun = false;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
227 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
228 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
229 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
230
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
231
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
232 function getPagePosition (){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
233 if(null === pagePosition){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
234 pagePosition = {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
235 x: (window.pageXOffset !== undefined) ? window.pageXOffset : document.documentElement.scrollLeft,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
236 y: (window.pageYOffset !== undefined) ? window.pageYOffset : document.documentElement.scrollTop
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
237 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
238 log(' Get position: '+pagePosition.x+','+pagePosition.y);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
239 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
240 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
241
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
242 function setPagePosition(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
243 if(null !== pagePosition){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
244 window.scrollTo(pagePosition.x,pagePosition.y);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
245 log(' Set position: '+pagePosition.x+','+pagePosition.y);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
246 pagePosition = null;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
247 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
248 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
249
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
250 function resetIFrame(messageData){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
251 function reset(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
252 setSize(messageData);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
253 trigger('reset','reset',messageData.iframe);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
254 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
255
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
256 log(' Size reset requested by '+('init'===messageData.type?'host page':'iFrame'));
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
257 getPagePosition();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
258 syncResize(reset,messageData,'init');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
259 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
260
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
261 function setSize(messageData){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
262 function setDimension(dimension,min,max){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
263 messageData.iframe.style[dimension] = messageData[dimension] + 'px';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
264 log(
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
265 ' IFrame (' + messageData.iframe.id +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
266 ') ' + dimension +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
267 ' set to ' + messageData[dimension] + 'px'
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
268 );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
269 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
270
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
271 if( settings.sizeHeight) { setDimension('height'); }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
272 if( settings.sizeWidth ) { setDimension('width'); }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
273 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
274
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
275 function syncResize(func,messageData,doNotSync){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
276 if(doNotSync!==messageData.type && requestAnimationFrame){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
277 log(' Requesting animation frame');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
278 requestAnimationFrame(func);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
279 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
280 func();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
281 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
282 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
283
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
284 function trigger(calleeMsg,msg,iframe){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
285 log('[' + calleeMsg + '] Sending msg to iframe ('+msg+')');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
286 iframe.contentWindow.postMessage( msgId + msg, '*' );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
287 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
288
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
289
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
290 function setupIFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
291 function setLimits(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
292 function addStyle(style){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
293 if ((Infinity !== settings[style]) && (0 !== settings[style])){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
294 iframe.style[style] = settings[style] + 'px';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
295 log(' Set '+style+' = '+settings[style]+'px');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
296 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
297 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
298
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
299 addStyle('maxHeight');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
300 addStyle('minHeight');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
301 addStyle('maxWidth');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
302 addStyle('minWidth');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
303 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
304
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
305 function ensureHasId(iframeID){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
306 if (''===iframeID){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
307 iframe.id = iframeID = 'iFrameResizer' + count++;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
308 log(' Added missing iframe ID: '+ iframeID);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
309 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
310
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
311 return iframeID;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
312 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
313
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
314 function setScrolling(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
315 log(' IFrame scrolling ' + (settings.scrolling ? 'enabled' : 'disabled') + ' for ' + iframeID);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
316 iframe.style.overflow = false === settings.scrolling ? 'hidden' : 'auto';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
317 iframe.scrolling = false === settings.scrolling ? 'no' : 'yes';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
318 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
319
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
320 //The V1 iFrame script expects an int, where as in V2 expects a CSS
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
321 //string value such as '1px 3em', so if we have an int for V2, set V1=V2
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
322 //and then convert V2 to a string PX value.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
323 function setupBodyMarginValues(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
324 if (('number'===typeof(settings.bodyMargin)) || ('0'===settings.bodyMargin)){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
325 settings.bodyMarginV1 = settings.bodyMargin;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
326 settings.bodyMargin = '' + settings.bodyMargin + 'px';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
327 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
328 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
329
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
330 function createOutgoingMsg(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
331 return iframeID +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
332 ':' + settings.bodyMarginV1 +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
333 ':' + settings.sizeWidth +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
334 ':' + settings.log +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
335 ':' + settings.interval +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
336 ':' + settings.enablePublicMethods +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
337 ':' + settings.autoResize +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
338 ':' + settings.bodyMargin +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
339 ':' + settings.heightCalculationMethod +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
340 ':' + settings.bodyBackground +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
341 ':' + settings.bodyPadding +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
342 ':' + settings.tolerance;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
343 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
344
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
345 function init(msg){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
346 //We have to call trigger twice, as we can not be sure if all
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
347 //iframes have completed loading when this code runs. The
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
348 //event listener also catches the page changing in the iFrame.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
349 addEventListener(iframe,'load',function(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
350 var fr = firstRun; // Reduce scope of var to function, because IE8's JS execution
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
351 // context stack is borked and this value gets externally
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
352 // changed midway through running this function.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
353 trigger('iFrame.onload',msg,iframe);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
354 if (!fr && settings.heightCalculationMethod in resetRequiredMethods){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
355 resetIFrame({
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
356 iframe:iframe,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
357 height:0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
358 width:0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
359 type:'init'
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
360 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
361 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
362 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
363 trigger('init',msg,iframe);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
364 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
365
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
366 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
367 /*jshint validthis:true */
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
368 iframe = this,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
369 iframeID = ensureHasId(iframe.id);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
370
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
371 setScrolling();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
372 setLimits();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
373 setupBodyMarginValues();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
374 init(createOutgoingMsg());
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
375 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
376
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
377 function checkOptions(options){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
378 if ('object' !== typeof options){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
379 throw new TypeError('Options is not an object.');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
380 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
381 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
382
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
383 function createNativePublicFunction(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
384 function init(element){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
385 if('IFRAME' !== element.tagName) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
386 throw new TypeError('Expected <IFRAME> tag, found <'+element.tagName+'>.');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
387 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
388 setupIFrame.call(element);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
389 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
390 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
391
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
392 function processOptions(options){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
393 options = options || {};
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
394
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
395 checkOptions(options);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
396
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
397 for (var option in defaults) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
398 if (defaults.hasOwnProperty(option)){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
399 settings[option] = options.hasOwnProperty(option) ? options[option] : defaults[option];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
400 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
401 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
402 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
403
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
404 return function iFrameResizeF(options,selecter){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
405 processOptions(options);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
406 Array.prototype.forEach.call( document.querySelectorAll( selecter || 'iframe' ), init );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
407 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
408 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
409
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
410 function createJQueryPublicMethod($){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
411 $.fn.iFrameResize = function $iFrameResizeF(options) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
412 checkOptions(options);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
413 settings = $.extend( {}, defaults, options );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
414 return this.filter('iframe').each( setupIFrame ).end();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
415 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
416 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
417
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
418 setupRequestAnimationFrame();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
419 addEventListener(window,'message',iFrameListener);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
420
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
421 if ('jQuery' in window) { createJQueryPublicMethod(jQuery); }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
422
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
423 if (typeof define === 'function' && define.amd) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
424 define(function (){ return createNativePublicFunction(); });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
425 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
426 window.iFrameResize = createNativePublicFunction();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
427 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
428
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
429 })();