annotate iframe-resizer/src/iframeResizer.contentWindow.js @ 2:3c160414da2e default tip

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