blocks
5 years ago
build
5 years ago
fonts
8 years ago
genericons
6 years ago
lib
5 years ago
social-logos
5 years ago
accessible-focus.js
5 years ago
class.jetpack-provision.php
6 years ago
connect-button.js
5 years ago
crowdsignal-shortcode.js
5 years ago
crowdsignal-survey.js
5 years ago
facebook-embed.js
5 years ago
footer.php
7 years ago
gallery-settings.js
5 years ago
genericons.php
11 years ago
header.php
7 years ago
idc-notice.js
5 years ago
jetpack-admin.js
5 years ago
jetpack-connection-banner.js
5 years ago
jetpack-deactivate-dialog.js
5 years ago
jetpack-jitm.js
5 years ago
jetpack-modules.js
5 years ago
jetpack-modules.models.js
6 years ago
jetpack-modules.views.js
5 years ago
jetpack-server-sandbox.php
6 years ago
jetpack-wizard-banner.js
5 years ago
jquery.jetpack-resize.js
5 years ago
polldaddy-shortcode.js
5 years ago
postmessage.js
8 years ago
social-logos.php
6 years ago
twitter-timeline.js
5 years ago
jquery.jetpack-resize.js
291 lines
| 1 | /* global Jetpack, JSON */ |
| 2 | /** |
| 3 | * Resizeable Iframes. |
| 4 | * |
| 5 | * Start listening to resize postMessage events for selected iframes: |
| 6 | * $( selector ).Jetpack( 'resizeable' ); |
| 7 | * - OR - |
| 8 | * Jetpack.resizeable( 'on', context ); |
| 9 | * |
| 10 | * Resize selected iframes: |
| 11 | * $( selector ).Jetpack( 'resizeable', 'resize', { width: 100, height: 200 } ); |
| 12 | * - OR - |
| 13 | * Jetpack.resizeable( 'resize', { width: 100, height: 200 }, context ); |
| 14 | * |
| 15 | * Stop listening to resize postMessage events for selected iframes: |
| 16 | * $( selector ).Jetpack( 'resizeable', 'off' ); |
| 17 | * - OR - |
| 18 | * Jetpack.resizeable( 'off', context ); |
| 19 | * |
| 20 | * Stop listening to all resize postMessage events: |
| 21 | * Jetpack.resizeable( 'off' ); |
| 22 | */ |
| 23 | ( function ( $ ) { |
| 24 | var listening = false, // Are we listening for resize postMessage events |
| 25 | sourceOrigins = [], // What origins are allowed to send resize postMessage events |
| 26 | $sources = false, // What iframe elements are we tracking resize postMessage events from |
| 27 | URLtoOrigin, // Utility to convert URLs into origins |
| 28 | setupListener, // Binds global resize postMessage event handler |
| 29 | destroyListener, // Unbinds global resize postMessage event handler |
| 30 | methods; // Jetpack.resizeable methods |
| 31 | |
| 32 | // Setup the Jetpack global |
| 33 | if ( 'undefined' === typeof window.Jetpack ) { |
| 34 | window.Jetpack = { |
| 35 | /** |
| 36 | * Handles the two different calling methods: |
| 37 | * $( selector ).Jetpack( 'namespace', 'method', context ) // here, context is optional and is used to filter the collection |
| 38 | * - vs. - |
| 39 | * Jetpack.namespace( 'method', context ) // here context defines the collection |
| 40 | * |
| 41 | * @internal |
| 42 | * |
| 43 | * Call as: Jetpack.getTarget.call( this, context ) |
| 44 | * |
| 45 | * @param string context: jQuery selector |
| 46 | * @return jQuery|undefined object on which to perform operations or undefined when context cannot be determined |
| 47 | */ |
| 48 | getTarget: function ( context ) { |
| 49 | if ( this instanceof jQuery ) { |
| 50 | return context ? this.filter( context ) : this; |
| 51 | } |
| 52 | |
| 53 | return context ? $( context ) : context; |
| 54 | }, |
| 55 | }; |
| 56 | } |
| 57 | |
| 58 | // Setup the Jetpack jQuery method |
| 59 | if ( 'undefined' === typeof $.fn.Jetpack ) { |
| 60 | /** |
| 61 | * Dispatches calls to the correct namespace |
| 62 | * |
| 63 | * @param string namespace |
| 64 | * @param ... |
| 65 | * @return mixed|jQuery (chainable) |
| 66 | */ |
| 67 | $.fn.Jetpack = function ( namespace ) { |
| 68 | if ( 'function' === typeof Jetpack[ namespace ] ) { |
| 69 | // Send the call to the correct Jetpack.namespace |
| 70 | return Jetpack[ namespace ].apply( this, Array.prototype.slice.call( arguments, 1 ) ); |
| 71 | } else { |
| 72 | $.error( 'Namespace "' + namespace + '" does not exist on jQuery.Jetpack' ); |
| 73 | } |
| 74 | }; |
| 75 | } |
| 76 | |
| 77 | // Define Jetpack.resizeable() namespace to just always bail if no postMessage |
| 78 | if ( 'function' !== typeof window.postMessage ) { |
| 79 | $.extend( window.Jetpack, { |
| 80 | /** |
| 81 | * Defines the Jetpack.resizeable() namespace. |
| 82 | * See below for non-trivial definition for browsers with postMessage. |
| 83 | */ |
| 84 | resizeable: function () { |
| 85 | $.error( 'Browser does not support window.postMessage' ); |
| 86 | }, |
| 87 | } ); |
| 88 | |
| 89 | return; |
| 90 | } |
| 91 | |
| 92 | /** |
| 93 | * Utility to convert URLs into origins |
| 94 | * |
| 95 | * http://example.com:port/path?query#fragment -> http://example.com:port |
| 96 | * |
| 97 | * @param string URL |
| 98 | * @return string origin |
| 99 | */ |
| 100 | URLtoOrigin = function ( URL ) { |
| 101 | if ( ! URL.match( /^https?:\/\// ) ) { |
| 102 | URL = document.location.href; |
| 103 | } |
| 104 | return URL.split( '/' ).slice( 0, 3 ).join( '/' ); |
| 105 | }; |
| 106 | |
| 107 | /** |
| 108 | * Binds global resize postMessage event handler |
| 109 | */ |
| 110 | setupListener = function () { |
| 111 | listening = true; |
| 112 | |
| 113 | $( window ).on( 'message.JetpackResizeableIframe', function ( e ) { |
| 114 | var event = e.originalEvent, |
| 115 | data; |
| 116 | |
| 117 | // Ensure origin is allowed |
| 118 | if ( -1 === $.inArray( event.origin, sourceOrigins ) ) { |
| 119 | return; |
| 120 | } |
| 121 | |
| 122 | // Some browsers send structured data, some send JSON strings |
| 123 | if ( 'object' === typeof event.data ) { |
| 124 | data = event.data.data; |
| 125 | } else { |
| 126 | try { |
| 127 | data = JSON.parse( event.data ); |
| 128 | } catch ( err ) { |
| 129 | data = false; |
| 130 | } |
| 131 | } |
| 132 | |
| 133 | if ( ! data.data ) { |
| 134 | return; |
| 135 | } |
| 136 | |
| 137 | // Un-nest |
| 138 | data = data.data; |
| 139 | |
| 140 | // Is it a resize event? |
| 141 | if ( 'undefined' === typeof data.action || 'resize' !== data.action ) { |
| 142 | return; |
| 143 | } |
| 144 | |
| 145 | // Find the correct iframe and resize it |
| 146 | $sources |
| 147 | .filter( function () { |
| 148 | if ( 'undefined' !== typeof data.name ) { |
| 149 | return this.name === data.name; |
| 150 | } else { |
| 151 | return event.source === this.contentWindow; |
| 152 | } |
| 153 | } ) |
| 154 | .first() |
| 155 | .Jetpack( 'resizeable', 'resize', data ); |
| 156 | } ); |
| 157 | }; |
| 158 | |
| 159 | /** |
| 160 | * Unbinds global resize postMessage event handler |
| 161 | */ |
| 162 | destroyListener = function () { |
| 163 | listening = false; |
| 164 | $( window ).off( 'message.JetpackResizeableIframe' ); |
| 165 | |
| 166 | sourceOrigins = []; |
| 167 | $( '.jetpack-resizeable' ).removeClass( 'jetpack-resizeable' ); |
| 168 | $sources = false; |
| 169 | }; |
| 170 | |
| 171 | // Methods for Jetpack.resizeable() namespace |
| 172 | methods = { |
| 173 | /** |
| 174 | * Start listening for resize postMessage events on the given iframes |
| 175 | * |
| 176 | * Call statically as: Jetpack.resizeable( 'on', context ) |
| 177 | * Call as: $( selector ).Jetpack( 'resizeable', 'on', context ) // context optional: used to filter the collectino |
| 178 | * |
| 179 | * @param string context jQuery selector. |
| 180 | * @return jQuery (chainable) |
| 181 | */ |
| 182 | on: function ( context ) { |
| 183 | var target = Jetpack.getTarget.call( this, context ); |
| 184 | |
| 185 | if ( ! listening ) { |
| 186 | setupListener(); |
| 187 | } |
| 188 | |
| 189 | target |
| 190 | .each( function () { |
| 191 | sourceOrigins.push( URLtoOrigin( $( this ).attr( 'src' ) ) ); |
| 192 | } ) |
| 193 | .addClass( 'jetpack-resizeable' ); |
| 194 | |
| 195 | $sources = $( '.jetpack-resizeable' ); |
| 196 | |
| 197 | return target; |
| 198 | }, |
| 199 | |
| 200 | /** |
| 201 | * Stop listening for resize postMessage events on the given iframes |
| 202 | * |
| 203 | * Call statically as: Jetpack.resizeable( 'off', context ) |
| 204 | * Call as: $( selector ).Jetpack( 'resizeable', 'off', context ) // context optional: used to filter the collectino |
| 205 | * |
| 206 | * @param string context jQuery selector |
| 207 | * @return jQuery (chainable) |
| 208 | */ |
| 209 | off: function ( context ) { |
| 210 | var target = Jetpack.getTarget.call( this, context ); |
| 211 | |
| 212 | if ( 'undefined' === typeof target ) { |
| 213 | destroyListener(); |
| 214 | |
| 215 | return target; |
| 216 | } |
| 217 | |
| 218 | target |
| 219 | .each( function () { |
| 220 | var origin = URLtoOrigin( $( this ).attr( 'src' ) ), |
| 221 | pos = $.inArray( origin, sourceOrigins ); |
| 222 | |
| 223 | if ( -1 !== pos ) { |
| 224 | sourceOrigins.splice( pos, 1 ); |
| 225 | } |
| 226 | } ) |
| 227 | .removeClass( 'jetpack-resizeable' ); |
| 228 | |
| 229 | $sources = $( '.jetpack-resizeable' ); |
| 230 | |
| 231 | return target; |
| 232 | }, |
| 233 | |
| 234 | /** |
| 235 | * Resize the given iframes |
| 236 | * |
| 237 | * Call statically as: Jetpack.resizeable( 'resize', dimensions, context ) |
| 238 | * Call as: $( selector ).Jetpack( 'resizeable', 'resize', dimensions, context ) // context optional: used to filter the collectino |
| 239 | * |
| 240 | * @param object dimensions in pixels: { width: (int), height: (int) } |
| 241 | * @param string context jQuery selector |
| 242 | * @return jQuery (chainable) |
| 243 | */ |
| 244 | resize: function ( dimensions, context ) { |
| 245 | var target = Jetpack.getTarget.call( this, context ); |
| 246 | |
| 247 | $.each( [ 'width', 'height' ], function ( i, variable ) { |
| 248 | var value = 0, |
| 249 | container; |
| 250 | if ( 'undefined' !== typeof dimensions[ variable ] ) { |
| 251 | value = parseInt( dimensions[ variable ], 10 ); |
| 252 | } |
| 253 | |
| 254 | if ( 0 !== value ) { |
| 255 | target[ variable ]( value ); |
| 256 | container = target.parent(); |
| 257 | if ( container.hasClass( 'slim-likes-widget' ) ) { |
| 258 | container[ variable ]( value ); |
| 259 | } |
| 260 | } |
| 261 | } ); |
| 262 | |
| 263 | return target; |
| 264 | }, |
| 265 | }; |
| 266 | |
| 267 | // Define Jetpack.resizeable() namespace |
| 268 | $.extend( window.Jetpack, { |
| 269 | /** |
| 270 | * Defines the Jetpack.resizeable() namespace. |
| 271 | * See above for trivial definition for browsers with no postMessage. |
| 272 | * |
| 273 | * @param string method |
| 274 | * @param ... |
| 275 | * @return mixed|jQuery (chainable) |
| 276 | */ |
| 277 | resizeable: function ( method ) { |
| 278 | if ( methods[ method ] ) { |
| 279 | // Send the call to the correct Jetpack.resizeable() method |
| 280 | return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) ); |
| 281 | } else if ( ! method ) { |
| 282 | // By default, send to Jetpack.resizeable( 'on' ), which isn't useful in that form but is when called as |
| 283 | // jQuery( selector ).Jetpack( 'resizeable' ) |
| 284 | return methods.on.apply( this ); |
| 285 | } else { |
| 286 | $.error( 'Method ' + method + ' does not exist on Jetpack.resizeable' ); |
| 287 | } |
| 288 | }, |
| 289 | } ); |
| 290 | } )( jQuery ); |
| 291 |