annotate iframe-resizer/src/iframeResizer.contentWindow.js @ 0:c73753f1606f draft

Uploaded
author saskia-hiltemann
date Mon, 06 Oct 2014 08:13:54 -0400
parents
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: iframeSizer.contentWindow.js
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
3 * Desc: Include this file in any page being loaded into an iframe
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
4 * to force the iframe to resize to the content size.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
5 * Requires: iframeResizer.js on host page.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
6 * Author: David J. Bradshaw - dave@bradshaw.net
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
7 * Contributor: Jure Mav - jure.mav@gmail.com
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
8 */
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
9
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
10 ;(function() {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
11 'use strict';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
12
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
13 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
14 autoResize = true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
15 base = 10,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
16 bodyBackground = '',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
17 bodyMargin = 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
18 bodyMarginStr = '',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
19 bodyPadding = '',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
20 calculateWidth = false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
21 doubleEventList = {'resize':1,'click':1},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
22 eventCancelTimer = 64,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
23 height = 1,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
24 firstRun = true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
25 heightCalcModeDefault = 'offset',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
26 heightCalcMode = heightCalcModeDefault,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
27 initLock = true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
28 initMsg = '',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
29 interval = 32,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
30 logging = false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
31 msgID = '[iFrameSizer]', //Must match host page msg ID
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
32 msgIdLen = msgID.length,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
33 myID = '',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
34 publicMethods = false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
35 resetRequiredMethods = {max:1,scroll:1,bodyScroll:1,documentElementScroll:1},
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
36 targetOriginDefault = '*',
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
37 target = window.parent,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
38 tolerance = 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
39 triggerLocked = false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
40 triggerLockedTimer = null,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
41 width = 1;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
42
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
43
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
44 function addEventListener(el,evt,func){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
45 if ('addEventListener' in window){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
46 el.addEventListener(evt,func, false);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
47 } else if ('attachEvent' in window){ //IE
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
48 el.attachEvent('on'+evt,func);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
49 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
50 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
51
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
52 function formatLogMsg(msg){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
53 return msgID + '[' + myID + ']' + ' ' + msg;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
54 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
55
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
56 function log(msg){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
57 if (logging && ('object' === typeof window.console)){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
58 console.log(formatLogMsg(msg));
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
59 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
60 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
61
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
62 function warn(msg){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
63 if ('object' === typeof window.console){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
64 console.warn(formatLogMsg(msg));
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
65 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
66 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
67
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
68
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
69 function init(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
70 log('Initialising iFrame');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
71 readData();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
72 setMargin();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
73 setBodyStyle('background',bodyBackground);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
74 setBodyStyle('padding',bodyPadding);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
75 injectClearFixIntoBodyElement();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
76 checkHeightMode();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
77 stopInfiniteResizingOfIFrame();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
78 setupPublicMethods();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
79 startEventListeners();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
80 sendSize('init','Init message from host page');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
81 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
82
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
83 function readData(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
84
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
85 var data = initMsg.substr(msgIdLen).split(':');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
86
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
87 function strBool(str){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
88 return 'true' === str ? true : false;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
89 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
90
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
91 myID = data[0];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
92 bodyMargin = (undefined !== data[1]) ? Number(data[1]) : bodyMargin; //For V1 compatibility
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
93 calculateWidth = (undefined !== data[2]) ? strBool(data[2]) : calculateWidth;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
94 logging = (undefined !== data[3]) ? strBool(data[3]) : logging;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
95 interval = (undefined !== data[4]) ? Number(data[4]) : interval;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
96 publicMethods = (undefined !== data[5]) ? strBool(data[5]) : publicMethods;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
97 autoResize = (undefined !== data[6]) ? strBool(data[6]) : autoResize;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
98 bodyMarginStr = data[7];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
99 heightCalcMode = (undefined !== data[8]) ? data[8] : heightCalcMode;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
100 bodyBackground = data[9];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
101 bodyPadding = data[10];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
102 tolerance = (undefined !== data[11]) ? Number(data[11]) : tolerance;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
103 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
104
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
105 function chkCSS(attr,value){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
106 if (-1 !== value.indexOf('-')){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
107 warn('Negative CSS value ignored for '+attr);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
108 value='';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
109 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
110 return value;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
111 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
112
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
113 function setBodyStyle(attr,value){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
114 if ((undefined !== value) && ('' !== value) && ('null' !== value)){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
115 document.body.style[attr] = value;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
116 log('Body '+attr+' set to "'+value+'"');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
117 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
118 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
119
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
120 function setMargin(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
121 //If called via V1 script, convert bodyMargin from int to str
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
122 if (undefined === bodyMarginStr){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
123 bodyMarginStr = bodyMargin+'px';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
124 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
125 chkCSS('margin',bodyMarginStr);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
126 setBodyStyle('margin',bodyMarginStr);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
127 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
128
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
129 function stopInfiniteResizingOfIFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
130 document.documentElement.style.height = '';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
131 document.body.style.height = '';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
132 log('HTML & body height set to "auto"');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
133 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
134
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
135 function initWindowResizeListener(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
136 addEventListener(window,'resize', function(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
137 sendSize('resize','Window resized');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
138 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
139 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
140
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
141 function initWindowClickListener(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
142 addEventListener(window,'click', function(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
143 sendSize('click','Window clicked');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
144 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
145 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
146
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
147 function checkHeightMode(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
148 if (heightCalcModeDefault !== heightCalcMode){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
149 if (!(heightCalcMode in getHeight)){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
150 warn(heightCalcMode + ' is not a valid option for heightCalculationMethod.');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
151 heightCalcMode='bodyScroll';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
152 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
153 log('Height calculation method set to "'+heightCalcMode+'"');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
154 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
155 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
156
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
157 function startEventListeners(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
158 if ( true === autoResize ) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
159 initWindowResizeListener();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
160 initWindowClickListener();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
161 setupMutationObserver();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
162 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
163 else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
164 log('Auto Resize disabled');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
165 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
166 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
167
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
168 function injectClearFixIntoBodyElement(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
169 var clearFix = document.createElement('div');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
170 clearFix.style.clear = 'both';
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
171 clearFix.style.display = 'block'; //Guard against this having been globally redefined in CSS.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
172 document.body.appendChild(clearFix);
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 setupPublicMethods(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
176 if (publicMethods) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
177 log('Enable public methods');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
178
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
179 window.parentIFrame = {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
180 close: function closeF(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
181 sendSize('close','parentIFrame.close()', 0, 0);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
182 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
183 getId: function getIdF(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
184 return myID;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
185 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
186 reset: function resetF(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
187 resetIFrame('parentIFrame.size');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
188 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
189 sendMessage: function sendMessageF(msg,targetOrigin){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
190 sendMsg(0,0,'message',msg,targetOrigin);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
191 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
192 setHeightCalculationMethod: function setHeightCalculationMethodF(heightCalculationMethod){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
193 heightCalcMode = heightCalculationMethod;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
194 checkHeightMode();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
195 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
196 setTargetOrigin: function setTargetOriginF(targetOrigin){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
197 log('Set targetOrigin: '+targetOrigin);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
198 targetOriginDefault = targetOrigin;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
199 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
200 size: function sizeF(customHeight, customWidth){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
201 var valString = ''+(customHeight?customHeight:'')+(customWidth?','+customWidth:'');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
202 lockTrigger();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
203 sendSize('size','parentIFrame.size('+valString+')', customHeight, customWidth);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
204 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
205 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
206 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
207 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
208
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
209 function initInterval(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
210 if ( 0 !== interval ){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
211 log('setInterval: '+interval+'ms');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
212 setInterval(function(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
213 sendSize('interval','setInterval: '+interval);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
214 },Math.abs(interval));
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
215 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
216 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
217
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
218 function setupInjectElementLoadListners(mutations){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
219 function addLoadListener(element){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
220 if (element.height === undefined || element.width === undefined || 0 === element.height || 0 === element.width){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
221 log('Attach listerner to '+element.src);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
222 addEventListener(element,'load', function imageLoaded(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
223 sendSize('imageLoad','Image loaded');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
224 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
225 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
226 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
227
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
228 mutations.forEach(function (mutation) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
229 if (mutation.type === 'attributes' && mutation.attributeName === 'src'){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
230 addLoadListener(mutation.target);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
231 } else if (mutation.type === 'childList'){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
232 var images = mutation.target.querySelectorAll('img');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
233 Array.prototype.forEach.call(images,function (image) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
234 addLoadListener(image);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
235 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
236 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
237 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
238 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
239
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
240 function setupMutationObserver(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
241
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
242 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
243
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
244 function createMutationObserver(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
245 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
246 target = document.querySelector('body'),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
247
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
248 config = {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
249 attributes : true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
250 attributeOldValue : false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
251 characterData : true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
252 characterDataOldValue : false,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
253 childList : true,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
254 subtree : true
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
255 },
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
256
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
257 observer = new MutationObserver(function(mutations) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
258 sendSize('mutationObserver','mutationObserver: ' + mutations[0].target + ' ' + mutations[0].type);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
259 setupInjectElementLoadListners(mutations); //Deal with WebKit asyncing image loading when tags are injected into the page
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
260 });
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
261
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
262 log('Enable MutationObserver');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
263 observer.observe(target, config);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
264 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
265
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
266 if (MutationObserver){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
267 if (0 > interval) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
268 initInterval();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
269 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
270 createMutationObserver();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
271 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
272 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
273 else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
274 warn('MutationObserver not supported in this browser!');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
275 initInterval();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
276 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
277 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
278
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
279
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
280 // document.documentElement.offsetHeight is not reliable, so
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
281 // we have to jump through hoops to get a better value.
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
282 function getBodyOffsetHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
283 function getComputedBodyStyle(prop) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
284 function convertUnitsToPxForIE8(value) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
285 var PIXEL = /^\d+(px)?$/i;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
286
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
287 if (PIXEL.test(value)) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
288 return parseInt(value,base);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
289 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
290
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
291 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
292 style = el.style.left,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
293 runtimeStyle = el.runtimeStyle.left;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
294
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
295 el.runtimeStyle.left = el.currentStyle.left;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
296 el.style.left = value || 0;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
297 value = el.style.pixelLeft;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
298 el.style.left = style;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
299 el.runtimeStyle.left = runtimeStyle;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
300
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
301 return value;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
302 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
303
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
304 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
305 el = document.body,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
306 retVal = 0;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
307
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
308 if (('defaultView' in document) && ('getComputedStyle' in document.defaultView)) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
309 retVal = document.defaultView.getComputedStyle(el, null);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
310 retVal = (null !== retVal) ? retVal[prop] : 0;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
311 } else {//IE8
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
312 retVal = convertUnitsToPxForIE8(el.currentStyle[prop]);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
313 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
314
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
315 return parseInt(retVal,base);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
316 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
317
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
318 return document.body.offsetHeight +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
319 getComputedBodyStyle('marginTop') +
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
320 getComputedBodyStyle('marginBottom');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
321 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
322
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
323 function getBodyScrollHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
324 return document.body.scrollHeight;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
325 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
326
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
327 function getDEOffsetHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
328 return document.documentElement.offsetHeight;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
329 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
330
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
331 function getDEScrollHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
332 return document.documentElement.scrollHeight;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
333 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
334
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
335 //From https://github.com/guardian/iframe-messenger
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
336 function getLowestElementHeight() {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
337 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
338 allElements = document.querySelectorAll('body *'),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
339 allElementsLength = allElements.length,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
340 maxBottomVal = 0,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
341 timer = new Date().getTime();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
342
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
343 for (var i = 0; i < allElementsLength; i++) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
344 if (allElements[i].getBoundingClientRect().bottom > maxBottomVal) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
345 maxBottomVal = allElements[i].getBoundingClientRect().bottom;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
346 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
347 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
348
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
349 timer = new Date().getTime() - timer;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
350
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
351 log('Parsed '+allElementsLength+' HTML elements');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
352 log('LowestElement bottom position calculated in ' + timer + 'ms');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
353
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
354 return maxBottomVal;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
355 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
356
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
357 function getAllHeights(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
358 return [
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
359 getBodyOffsetHeight(),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
360 getBodyScrollHeight(),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
361 getDEOffsetHeight(),
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
362 getDEScrollHeight()
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
363 ];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
364 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
365
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
366 function getMaxHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
367 return Math.max.apply(null,getAllHeights());
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
368 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
369
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
370 function getMinHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
371 return Math.min.apply(null,getAllHeights());
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
372 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
373
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
374 function getBestHeight(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
375 return Math.max(getBodyOffsetHeight(),getLowestElementHeight());
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
376 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
377
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
378 var getHeight = {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
379 offset : getBodyOffsetHeight, //Backward compatability
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
380 bodyOffset : getBodyOffsetHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
381 bodyScroll : getBodyScrollHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
382 documentElementOffset : getDEOffsetHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
383 scroll : getDEScrollHeight, //Backward compatability
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
384 documentElementScroll : getDEScrollHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
385 max : getMaxHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
386 min : getMinHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
387 grow : getMaxHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
388 lowestElement : getBestHeight,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
389 };
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
390
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
391 function getWidth(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
392 return Math.max(
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
393 document.documentElement.scrollWidth,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
394 document.body.scrollWidth
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
395 );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
396 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
397
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
398 function sendSize(triggerEvent, triggerEventDesc, customHeight, customWidth){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
399
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
400 var currentHeight,currentWidth;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
401
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
402 function recordTrigger(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
403 if (!(triggerEvent in {'reset':1,'resetPage':1,'init':1})){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
404 log( 'Trigger event: ' + triggerEventDesc );
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
405 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
406 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
407
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
408 function resizeIFrame(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
409 height = currentHeight;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
410 width = currentWidth;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
411
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
412 sendMsg(height,width,triggerEvent);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
413 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
414
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
415 function isDoubleFiredEvent(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
416 return triggerLocked && (triggerEvent in doubleEventList);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
417 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
418
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
419 function isSizeChangeDetected(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
420 function checkTolarance(a,b){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
421 var retVal = Math.abs(a-b) <= tolerance;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
422 return !retVal;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
423 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
424
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
425 currentHeight = (undefined !== customHeight) ? customHeight : getHeight[heightCalcMode]();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
426 currentWidth = (undefined !== customWidth ) ? customWidth : getWidth();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
427
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
428 return checkTolarance(height,currentHeight) ||
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
429 (calculateWidth && checkTolarance(width,currentWidth));
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
430
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
431 //return (height !== currentHeight) ||
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
432 // (calculateWidth && width !== currentWidth);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
433 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
434
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
435 function isForceResizableEvent(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
436 return !(triggerEvent in {'init':1,'interval':1,'size':1});
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
437 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
438
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
439 function isForceResizableHeightCalcMode(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
440 return (heightCalcMode in resetRequiredMethods);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
441 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
442
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
443 function logIgnored(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
444 log('No change in size detected');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
445 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
446
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
447 function checkDownSizing(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
448 if (isForceResizableEvent() && isForceResizableHeightCalcMode()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
449 resetIFrame(triggerEventDesc);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
450 } else if (!(triggerEvent in {'interval':1})){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
451 recordTrigger();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
452 logIgnored();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
453 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
454 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
455
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
456 if (!isDoubleFiredEvent()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
457 if (isSizeChangeDetected()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
458 recordTrigger();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
459 lockTrigger();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
460 resizeIFrame();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
461 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
462 checkDownSizing();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
463 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
464 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
465 log('Trigger event cancelled: '+triggerEvent);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
466 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
467 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
468
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
469 function lockTrigger(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
470 if (!triggerLocked){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
471 triggerLocked = true;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
472 log('Trigger event lock on');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
473 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
474 clearTimeout(triggerLockedTimer);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
475 triggerLockedTimer = setTimeout(function(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
476 triggerLocked = false;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
477 log('Trigger event lock off');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
478 log('--');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
479 },eventCancelTimer);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
480 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
481
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
482 function triggerReset(triggerEvent){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
483 height = getHeight[heightCalcMode]();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
484 width = getWidth();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
485
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
486 sendMsg(height,width,triggerEvent);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
487 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
488
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
489 function resetIFrame(triggerEventDesc){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
490 var hcm = heightCalcMode;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
491 heightCalcMode = heightCalcModeDefault;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
492
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
493 log('Reset trigger event: ' + triggerEventDesc);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
494 lockTrigger();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
495 triggerReset('reset');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
496
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
497 heightCalcMode = hcm;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
498 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
499
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
500 function sendMsg(height,width,triggerEvent,msg,targetOrigin){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
501 function setTargetOrigin(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
502 if (undefined === targetOrigin){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
503 targetOrigin = targetOriginDefault;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
504 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
505 log('Message targetOrigin: '+targetOrigin);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
506 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
507 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
508
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
509 function sendToParent(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
510 var
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
511 size = height + ':' + width,
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
512 message = myID + ':' + size + ':' + triggerEvent + (undefined !== msg ? ':' + msg : '');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
513
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
514 log('Sending message to host page (' + message + ')');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
515 target.postMessage( msgID + message, targetOrigin);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
516 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
517
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
518 setTargetOrigin();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
519 sendToParent();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
520 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
521
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
522 function receiver(event) {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
523 function isMessageForUs(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
524 return msgID === (''+event.data).substr(0,msgIdLen); //''+ Protects against non-string messages
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
525 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
526
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
527 function initFromParent(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
528 initMsg = event.data;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
529 init();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
530 firstRun = false;
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
531 setTimeout(function(){ initLock = false;},eventCancelTimer);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
532 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
533
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
534 function resetFromParent(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
535 if (!initLock){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
536 log('Page size reset by host page');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
537 triggerReset('resetPage');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
538 } else {
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
539 log('Page reset ignored by init');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
540 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
541 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
542
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
543 function getMessageType(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
544 return event.data.split(']')[1];
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
545 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
546
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
547 function isMiddleTier(){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
548 return ('iFrameResize' in window);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
549 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
550
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
551 if (isMessageForUs()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
552 if (firstRun){ //Check msg ID
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
553 initFromParent();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
554 } else if ('reset' === getMessageType()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
555 resetFromParent();
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
556 } else if (event.data !== initMsg && !isMiddleTier()){
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
557 warn('Unexpected message ('+event.data+')');
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
558 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
559 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
560 }
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
561
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
562 addEventListener(window, 'message', receiver);
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
563
c73753f1606f Uploaded
saskia-hiltemann
parents:
diff changeset
564 })();