Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/jetpack/modules/sharedad...
File: sharing.js
/* global WPCOM_sharing_counts */
[0] Fix | Delete
[1] Fix | Delete
// NOTE: This file intentionally does not make use of polyfills or libraries,
[2] Fix | Delete
// including jQuery. Please keep all code as IE11-compatible vanilla ES5, and
[3] Fix | Delete
// ensure everything is inside an IIFE to avoid global namespace pollution.
[4] Fix | Delete
// Code follows WordPress browser support guidelines. For an up to date list,
[5] Fix | Delete
// see https://make.wordpress.org/core/handbook/best-practices/browser-support/
[6] Fix | Delete
[7] Fix | Delete
( function () {
[8] Fix | Delete
var currentScript = document.currentScript;
[9] Fix | Delete
[10] Fix | Delete
// -------------------------- UTILITY FUNCTIONS -------------------------- //
[11] Fix | Delete
[12] Fix | Delete
// Helper function to load an external script.
[13] Fix | Delete
function loadScript( url ) {
[14] Fix | Delete
var script = document.createElement( 'script' );
[15] Fix | Delete
var prev = currentScript || document.getElementsByTagName( 'script' )[ 0 ];
[16] Fix | Delete
script.setAttribute( 'async', true );
[17] Fix | Delete
script.setAttribute( 'src', url );
[18] Fix | Delete
prev.parentNode.insertBefore( script, prev );
[19] Fix | Delete
}
[20] Fix | Delete
[21] Fix | Delete
// Helper matches function (not a polyfill), compatible with IE 11.
[22] Fix | Delete
function matches( el, sel ) {
[23] Fix | Delete
if ( Element.prototype.matches ) {
[24] Fix | Delete
return el.matches( sel );
[25] Fix | Delete
}
[26] Fix | Delete
[27] Fix | Delete
if ( Element.prototype.msMatchesSelector ) {
[28] Fix | Delete
return el.msMatchesSelector( sel );
[29] Fix | Delete
}
[30] Fix | Delete
}
[31] Fix | Delete
[32] Fix | Delete
// Helper closest parent node function (not a polyfill) based on
[33] Fix | Delete
// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
[34] Fix | Delete
function closest( el, sel ) {
[35] Fix | Delete
if ( el.closest ) {
[36] Fix | Delete
return el.closest( sel );
[37] Fix | Delete
}
[38] Fix | Delete
[39] Fix | Delete
var current = el;
[40] Fix | Delete
[41] Fix | Delete
do {
[42] Fix | Delete
if ( matches( current, sel ) ) {
[43] Fix | Delete
return current;
[44] Fix | Delete
}
[45] Fix | Delete
current = current.parentElement || current.parentNode;
[46] Fix | Delete
} while ( current !== null && current.nodeType === 1 );
[47] Fix | Delete
[48] Fix | Delete
return null;
[49] Fix | Delete
}
[50] Fix | Delete
[51] Fix | Delete
// Helper function to iterate over a NodeList
[52] Fix | Delete
// (since IE 11 doesn't have NodeList.prototype.forEach)
[53] Fix | Delete
function forEachNode( list, fn ) {
[54] Fix | Delete
for ( var i = 0; i < list.length; i++ ) {
[55] Fix | Delete
var node = list[ i ];
[56] Fix | Delete
fn( node, i, list );
[57] Fix | Delete
}
[58] Fix | Delete
}
[59] Fix | Delete
[60] Fix | Delete
// Helper function to remove a node from the DOM.
[61] Fix | Delete
function removeNode( node ) {
[62] Fix | Delete
if ( node && node.parentNode ) {
[63] Fix | Delete
node.parentNode.removeChild( node );
[64] Fix | Delete
}
[65] Fix | Delete
}
[66] Fix | Delete
[67] Fix | Delete
// Helper functions to show/hide a node, and check its status.
[68] Fix | Delete
function hideNode( node ) {
[69] Fix | Delete
if ( node ) {
[70] Fix | Delete
node.style.display = 'none';
[71] Fix | Delete
}
[72] Fix | Delete
}
[73] Fix | Delete
[74] Fix | Delete
function showNode( node ) {
[75] Fix | Delete
if ( node ) {
[76] Fix | Delete
node.style.removeProperty( 'display' );
[77] Fix | Delete
}
[78] Fix | Delete
}
[79] Fix | Delete
[80] Fix | Delete
function isNodeHidden( node ) {
[81] Fix | Delete
return ! node || node.style.display === 'none';
[82] Fix | Delete
}
[83] Fix | Delete
[84] Fix | Delete
// ------------------------------- CLASSES ------------------------------- //
[85] Fix | Delete
[86] Fix | Delete
var PANE_SELECTOR = '.sharing-hidden .inner';
[87] Fix | Delete
var PANE_DATA_ATTR = 'data-sharing-more-button-id';
[88] Fix | Delete
[89] Fix | Delete
// Implements a MoreButton class, which controls the lifecycle and behavior
[90] Fix | Delete
// of a "more" button and its dialog.
[91] Fix | Delete
function MoreButton( buttonEl ) {
[92] Fix | Delete
this.button = buttonEl;
[93] Fix | Delete
this.pane = closest( buttonEl, 'div' ).querySelector( PANE_SELECTOR );
[94] Fix | Delete
this.openedBy = null;
[95] Fix | Delete
this.recentlyOpenedByHover = false;
[96] Fix | Delete
[97] Fix | Delete
MoreButton.instances.push( this );
[98] Fix | Delete
this.pane.setAttribute( PANE_DATA_ATTR, MoreButton.instances.length - 1 );
[99] Fix | Delete
[100] Fix | Delete
this.attachHandlers();
[101] Fix | Delete
}
[102] Fix | Delete
[103] Fix | Delete
// Keep a reference to each instance, so we can get back to it from the DOM.
[104] Fix | Delete
MoreButton.instances = [];
[105] Fix | Delete
[106] Fix | Delete
// Delay time configs.
[107] Fix | Delete
MoreButton.hoverOpenDelay = 200;
[108] Fix | Delete
MoreButton.recentOpenDelay = 400;
[109] Fix | Delete
MoreButton.hoverCloseDelay = 300;
[110] Fix | Delete
[111] Fix | Delete
// Use this to avoid creating new instances for buttons which already have one.
[112] Fix | Delete
MoreButton.instantiateOrReuse = function ( buttonEl ) {
[113] Fix | Delete
var pane = closest( buttonEl, 'div' ).querySelector( PANE_SELECTOR );
[114] Fix | Delete
var paneId = pane && pane.getAttribute( PANE_DATA_ATTR );
[115] Fix | Delete
[116] Fix | Delete
var existingInstance = MoreButton.instances[ paneId ];
[117] Fix | Delete
if ( existingInstance ) {
[118] Fix | Delete
return existingInstance;
[119] Fix | Delete
}
[120] Fix | Delete
[121] Fix | Delete
return new MoreButton( buttonEl );
[122] Fix | Delete
};
[123] Fix | Delete
[124] Fix | Delete
// Retrieve a button instance from the pane DOM element.
[125] Fix | Delete
MoreButton.getButtonInstanceFromPane = function ( paneEl ) {
[126] Fix | Delete
var paneId = paneEl && paneEl.getAttribute( PANE_DATA_ATTR );
[127] Fix | Delete
return MoreButton.instances[ paneId ];
[128] Fix | Delete
};
[129] Fix | Delete
[130] Fix | Delete
// Close all open More Button dialogs.
[131] Fix | Delete
MoreButton.closeAll = function () {
[132] Fix | Delete
for ( var i = 0; i < MoreButton.instances.length; i++ ) {
[133] Fix | Delete
MoreButton.instances[ i ].close();
[134] Fix | Delete
}
[135] Fix | Delete
};
[136] Fix | Delete
[137] Fix | Delete
MoreButton.prototype.open = function () {
[138] Fix | Delete
var offset;
[139] Fix | Delete
var offsetParent;
[140] Fix | Delete
var parentOffset = [ 0, 0 ];
[141] Fix | Delete
[142] Fix | Delete
function getOffsets( el ) {
[143] Fix | Delete
var rect = el.getBoundingClientRect();
[144] Fix | Delete
return [
[145] Fix | Delete
rect.left + ( window.scrollX || window.pageXOffset || 0 ),
[146] Fix | Delete
rect.top + ( window.scrollY || window.pageYOffset || 0 ),
[147] Fix | Delete
];
[148] Fix | Delete
}
[149] Fix | Delete
[150] Fix | Delete
function getStyleValue( el, prop ) {
[151] Fix | Delete
return parseInt( getComputedStyle( el ).getPropertyValue( prop ) || 0 );
[152] Fix | Delete
}
[153] Fix | Delete
[154] Fix | Delete
offset = getOffsets( this.button );
[155] Fix | Delete
offsetParent = this.button.offsetParent || document.documentElement;
[156] Fix | Delete
[157] Fix | Delete
while (
[158] Fix | Delete
offsetParent &&
[159] Fix | Delete
( offsetParent === document.body || offsetParent === document.documentElement ) &&
[160] Fix | Delete
getComputedStyle( offsetParent ).getPropertyValue( 'position' ) === 'static'
[161] Fix | Delete
) {
[162] Fix | Delete
offsetParent = offsetParent.parentNode;
[163] Fix | Delete
}
[164] Fix | Delete
[165] Fix | Delete
if ( offsetParent && offsetParent !== this.button && offsetParent.nodeType === 1 ) {
[166] Fix | Delete
parentOffset = getOffsets( offsetParent );
[167] Fix | Delete
parentOffset = [
[168] Fix | Delete
parentOffset[ 0 ] + getStyleValue( offsetParent, 'border-left-width' ),
[169] Fix | Delete
parentOffset[ 1 ] + getStyleValue( offsetParent, 'border-top-width' ),
[170] Fix | Delete
];
[171] Fix | Delete
}
[172] Fix | Delete
[173] Fix | Delete
var positionLeft =
[174] Fix | Delete
offset[ 0 ] - parentOffset[ 0 ] - getStyleValue( this.button, 'margin-left' );
[175] Fix | Delete
var positionTop = offset[ 1 ] - parentOffset[ 1 ] - getStyleValue( this.button, 'margin-top' );
[176] Fix | Delete
[177] Fix | Delete
this.pane.style.left = positionLeft + 'px';
[178] Fix | Delete
this.pane.style.top = positionTop + this.button.offsetHeight + 3 + 'px';
[179] Fix | Delete
[180] Fix | Delete
showNode( this.pane );
[181] Fix | Delete
};
[182] Fix | Delete
[183] Fix | Delete
MoreButton.prototype.close = function () {
[184] Fix | Delete
hideNode( this.pane );
[185] Fix | Delete
this.openedBy = null;
[186] Fix | Delete
};
[187] Fix | Delete
[188] Fix | Delete
MoreButton.prototype.toggle = function () {
[189] Fix | Delete
if ( isNodeHidden( this.pane ) ) {
[190] Fix | Delete
this.open();
[191] Fix | Delete
} else {
[192] Fix | Delete
this.close();
[193] Fix | Delete
}
[194] Fix | Delete
};
[195] Fix | Delete
[196] Fix | Delete
MoreButton.prototype.nonHoverOpen = function () {
[197] Fix | Delete
clearTimeout( this.openTimer );
[198] Fix | Delete
clearTimeout( this.closeTimer );
[199] Fix | Delete
[200] Fix | Delete
if ( this.recentlyOpenedByHover ) {
[201] Fix | Delete
this.recentlyOpenedByHover = false;
[202] Fix | Delete
clearTimeout( this.hoverOpenTimer );
[203] Fix | Delete
this.open();
[204] Fix | Delete
} else {
[205] Fix | Delete
this.toggle();
[206] Fix | Delete
}
[207] Fix | Delete
};
[208] Fix | Delete
[209] Fix | Delete
MoreButton.prototype.resetCloseTimer = function () {
[210] Fix | Delete
clearTimeout( this.closeTimer );
[211] Fix | Delete
this.closeTimer = setTimeout( this.close.bind( this ), MoreButton.hoverCloseDelay );
[212] Fix | Delete
};
[213] Fix | Delete
[214] Fix | Delete
MoreButton.prototype.attachHandlers = function () {
[215] Fix | Delete
this.buttonClick = function ( event ) {
[216] Fix | Delete
event.preventDefault();
[217] Fix | Delete
event.stopPropagation();
[218] Fix | Delete
[219] Fix | Delete
this.openedBy = 'click';
[220] Fix | Delete
this.nonHoverOpen();
[221] Fix | Delete
}.bind( this );
[222] Fix | Delete
[223] Fix | Delete
this.buttonKeydown = function ( event ) {
[224] Fix | Delete
if ( event.keyCode === 13 || event.keyCode === 32 ) {
[225] Fix | Delete
event.preventDefault();
[226] Fix | Delete
event.stopPropagation();
[227] Fix | Delete
[228] Fix | Delete
this.openedBy = 'keydown';
[229] Fix | Delete
this.nonHoverOpen();
[230] Fix | Delete
}
[231] Fix | Delete
}.bind( this );
[232] Fix | Delete
[233] Fix | Delete
this.buttonEnter = function () {
[234] Fix | Delete
if ( ! this.openedBy ) {
[235] Fix | Delete
this.openTimer = setTimeout(
[236] Fix | Delete
function () {
[237] Fix | Delete
this.open();
[238] Fix | Delete
this.openedBy = 'hover';
[239] Fix | Delete
this.recentlyOpenedByHover = true;
[240] Fix | Delete
this.hoverOpenTimer = setTimeout(
[241] Fix | Delete
function () {
[242] Fix | Delete
this.recentlyOpenedByHover = false;
[243] Fix | Delete
}.bind( this ),
[244] Fix | Delete
MoreButton.recentOpenDelay
[245] Fix | Delete
);
[246] Fix | Delete
}.bind( this ),
[247] Fix | Delete
MoreButton.hoverOpenDelay
[248] Fix | Delete
);
[249] Fix | Delete
}
[250] Fix | Delete
clearTimeout( this.closeTimer );
[251] Fix | Delete
}.bind( this );
[252] Fix | Delete
[253] Fix | Delete
this.buttonLeave = function () {
[254] Fix | Delete
if ( this.openedBy === 'hover' ) {
[255] Fix | Delete
this.resetCloseTimer();
[256] Fix | Delete
}
[257] Fix | Delete
clearTimeout( this.openTimer );
[258] Fix | Delete
}.bind( this );
[259] Fix | Delete
[260] Fix | Delete
this.paneEnter = function () {
[261] Fix | Delete
clearTimeout( this.closeTimer );
[262] Fix | Delete
}.bind( this );
[263] Fix | Delete
[264] Fix | Delete
this.paneLeave = function () {
[265] Fix | Delete
if ( this.openedBy === 'hover' ) {
[266] Fix | Delete
this.resetCloseTimer();
[267] Fix | Delete
}
[268] Fix | Delete
}.bind( this );
[269] Fix | Delete
[270] Fix | Delete
this.documentClick = function () {
[271] Fix | Delete
this.close();
[272] Fix | Delete
}.bind( this );
[273] Fix | Delete
[274] Fix | Delete
this.button.addEventListener( 'click', this.buttonClick );
[275] Fix | Delete
this.button.addEventListener( 'keydown', this.buttonKeydown );
[276] Fix | Delete
document.addEventListener( 'click', this.documentClick );
[277] Fix | Delete
[278] Fix | Delete
if ( document.ontouchstart === undefined ) {
[279] Fix | Delete
// Non-touchscreen device: use hover/mouseout with delay
[280] Fix | Delete
this.button.addEventListener( 'mouseenter', this.buttonEnter );
[281] Fix | Delete
this.button.addEventListener( 'mouseleave', this.buttonLeave );
[282] Fix | Delete
this.pane.addEventListener( 'mouseenter', this.paneEnter );
[283] Fix | Delete
this.pane.addEventListener( 'mouseleave', this.paneLeave );
[284] Fix | Delete
}
[285] Fix | Delete
};
[286] Fix | Delete
[287] Fix | Delete
// ---------------------------- SHARE COUNTS ---------------------------- //
[288] Fix | Delete
[289] Fix | Delete
if ( window.sharing_js_options && window.sharing_js_options.counts ) {
[290] Fix | Delete
var WPCOMSharing = {
[291] Fix | Delete
done_urls: [],
[292] Fix | Delete
get_counts: function () {
[293] Fix | Delete
var url, requests, id, service, service_request;
[294] Fix | Delete
[295] Fix | Delete
if ( 'undefined' === typeof WPCOM_sharing_counts ) {
[296] Fix | Delete
return;
[297] Fix | Delete
}
[298] Fix | Delete
[299] Fix | Delete
for ( url in WPCOM_sharing_counts ) {
[300] Fix | Delete
id = WPCOM_sharing_counts[ url ];
[301] Fix | Delete
[302] Fix | Delete
if ( 'undefined' !== typeof WPCOMSharing.done_urls[ id ] ) {
[303] Fix | Delete
continue;
[304] Fix | Delete
}
[305] Fix | Delete
[306] Fix | Delete
requests = {
[307] Fix | Delete
// Pinterest handles share counts for both http and https
[308] Fix | Delete
pinterest: [
[309] Fix | Delete
window.location.protocol +
[310] Fix | Delete
'//api.pinterest.com/v1/urls/count.json?callback=WPCOMSharing.update_pinterest_count&url=' +
[311] Fix | Delete
encodeURIComponent( url ),
[312] Fix | Delete
],
[313] Fix | Delete
};
[314] Fix | Delete
[315] Fix | Delete
for ( service in requests ) {
[316] Fix | Delete
if ( ! document.querySelector( 'a[data-shared=sharing-' + service + '-' + id + ']' ) ) {
[317] Fix | Delete
continue;
[318] Fix | Delete
}
[319] Fix | Delete
[320] Fix | Delete
while ( ( service_request = requests[ service ].pop() ) ) {
[321] Fix | Delete
loadScript( service_request );
[322] Fix | Delete
}
[323] Fix | Delete
[324] Fix | Delete
if ( window.sharing_js_options.is_stats_active ) {
[325] Fix | Delete
WPCOMSharing.bump_sharing_count_stat( service );
[326] Fix | Delete
}
[327] Fix | Delete
}
[328] Fix | Delete
[329] Fix | Delete
WPCOMSharing.done_urls[ id ] = true;
[330] Fix | Delete
}
[331] Fix | Delete
},
[332] Fix | Delete
update_pinterest_count: function ( data ) {
[333] Fix | Delete
if ( 'undefined' !== typeof data.count && data.count * 1 > 0 ) {
[334] Fix | Delete
WPCOMSharing.inject_share_count(
[335] Fix | Delete
'sharing-pinterest-' + WPCOM_sharing_counts[ data.url ],
[336] Fix | Delete
data.count
[337] Fix | Delete
);
[338] Fix | Delete
}
[339] Fix | Delete
},
[340] Fix | Delete
inject_share_count: function ( id, count ) {
[341] Fix | Delete
forEachNode(
[342] Fix | Delete
document.querySelectorAll( 'a[data-shared=' + id + '] > span' ),
[343] Fix | Delete
function ( span ) {
[344] Fix | Delete
var countNode = span.querySelector( '.share-count' );
[345] Fix | Delete
removeNode( countNode );
[346] Fix | Delete
var newNode = document.createElement( 'span' );
[347] Fix | Delete
newNode.className = 'share-count';
[348] Fix | Delete
newNode.textContent = WPCOMSharing.format_count( count );
[349] Fix | Delete
span.appendChild( newNode );
[350] Fix | Delete
}
[351] Fix | Delete
);
[352] Fix | Delete
},
[353] Fix | Delete
format_count: function ( count ) {
[354] Fix | Delete
if ( count < 1000 ) {
[355] Fix | Delete
return count;
[356] Fix | Delete
}
[357] Fix | Delete
if ( count >= 1000 && count < 10000 ) {
[358] Fix | Delete
return String( count ).substring( 0, 1 ) + 'K+';
[359] Fix | Delete
}
[360] Fix | Delete
return '10K+';
[361] Fix | Delete
},
[362] Fix | Delete
bump_sharing_count_stat: function ( service ) {
[363] Fix | Delete
new Image().src =
[364] Fix | Delete
document.location.protocol +
[365] Fix | Delete
'//pixel.wp.com/g.gif?v=wpcom-no-pv&x_sharing-count-request=' +
[366] Fix | Delete
service +
[367] Fix | Delete
'&r=' +
[368] Fix | Delete
Math.random();
[369] Fix | Delete
},
[370] Fix | Delete
};
[371] Fix | Delete
window.WPCOMSharing = WPCOMSharing;
[372] Fix | Delete
}
[373] Fix | Delete
[374] Fix | Delete
// ------------------------ BUTTON FUNCTIONALITY ------------------------ //
[375] Fix | Delete
function isUrlForCurrentHost( url ) {
[376] Fix | Delete
var currentDomain = window.location.protocol + '//' + window.location.hostname + '/';
[377] Fix | Delete
[378] Fix | Delete
return String( url ).indexOf( currentDomain ) === 0;
[379] Fix | Delete
}
[380] Fix | Delete
[381] Fix | Delete
function getEncodedFormFieldForSubmit( name, value ) {
[382] Fix | Delete
// Encode the key and value into a URI-compatible string.
[383] Fix | Delete
var encoded = encodeURIComponent( name ) + '=' + encodeURIComponent( value );
[384] Fix | Delete
[385] Fix | Delete
// In x-www-form-urlencoded, spaces should be `+`, not `%20`.
[386] Fix | Delete
return encoded.replace( /%20/g, '+' );
[387] Fix | Delete
}
[388] Fix | Delete
[389] Fix | Delete
function trackButtonClick( button ) {
[390] Fix | Delete
var clickCount = getClickCountForButton( button );
[391] Fix | Delete
[392] Fix | Delete
setClickCountForButton( button, clickCount + 1 );
[393] Fix | Delete
}
[394] Fix | Delete
[395] Fix | Delete
function setClickCountForButton( button, clickCount ) {
[396] Fix | Delete
button.setAttribute( 'jetpack-share-click-count', clickCount );
[397] Fix | Delete
}
[398] Fix | Delete
[399] Fix | Delete
function getClickCountForButton( button ) {
[400] Fix | Delete
var currentClickCount = button.getAttribute( 'jetpack-share-click-count' );
[401] Fix | Delete
if ( currentClickCount === null ) {
[402] Fix | Delete
return 0;
[403] Fix | Delete
}
[404] Fix | Delete
[405] Fix | Delete
return parseInt( currentClickCount, 10 );
[406] Fix | Delete
}
[407] Fix | Delete
[408] Fix | Delete
function showEmailShareError( emailShareButton, sdUlGroup ) {
[409] Fix | Delete
var sdContent = sdUlGroup.parentElement;
[410] Fix | Delete
if ( ! sdContent.classList.contains( 'sd-content' ) ) {
[411] Fix | Delete
return;
[412] Fix | Delete
}
[413] Fix | Delete
[414] Fix | Delete
forEachNode( sdContent.querySelectorAll( '.share-email-error' ), function ( shareEmailError ) {
[415] Fix | Delete
shareEmailError.parentElement.removeChild( shareEmailError );
[416] Fix | Delete
} );
[417] Fix | Delete
[418] Fix | Delete
var newShareEmailError = document.createElement( 'div' );
[419] Fix | Delete
newShareEmailError.className = 'share-email-error';
[420] Fix | Delete
[421] Fix | Delete
var newShareEmailErrorTitle = document.createElement( 'h6' );
[422] Fix | Delete
newShareEmailErrorTitle.className = 'share-email-error-title';
[423] Fix | Delete
newShareEmailErrorTitle.innerText = emailShareButton.getAttribute(
[424] Fix | Delete
'data-email-share-error-title'
[425] Fix | Delete
);
[426] Fix | Delete
newShareEmailError.appendChild( newShareEmailErrorTitle );
[427] Fix | Delete
[428] Fix | Delete
var newShareEmailErrorText = document.createElement( 'p' );
[429] Fix | Delete
newShareEmailErrorText.className = 'share-email-error-text';
[430] Fix | Delete
newShareEmailErrorText.innerText = emailShareButton.getAttribute(
[431] Fix | Delete
'data-email-share-error-text'
[432] Fix | Delete
);
[433] Fix | Delete
newShareEmailError.appendChild( newShareEmailErrorText );
[434] Fix | Delete
[435] Fix | Delete
sdContent.appendChild( newShareEmailError );
[436] Fix | Delete
}
[437] Fix | Delete
[438] Fix | Delete
function recordEmailShareClick( emailShareTrackerUrl, emailShareNonce ) {
[439] Fix | Delete
var request = new XMLHttpRequest();
[440] Fix | Delete
request.open( 'POST', emailShareTrackerUrl, true );
[441] Fix | Delete
request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8' );
[442] Fix | Delete
request.setRequestHeader( 'x-requested-with', 'XMLHttpRequest' );
[443] Fix | Delete
[444] Fix | Delete
request.send( getEncodedFormFieldForSubmit( 'email-share-nonce', emailShareNonce ) );
[445] Fix | Delete
}
[446] Fix | Delete
[447] Fix | Delete
// Sharing initialization.
[448] Fix | Delete
// Will run immediately or on `DOMContentLoaded`, depending on current page status.
[449] Fix | Delete
function init() {
[450] Fix | Delete
WPCOMSharing_do();
[451] Fix | Delete
}
[452] Fix | Delete
if ( document.readyState !== 'loading' ) {
[453] Fix | Delete
init();
[454] Fix | Delete
} else {
[455] Fix | Delete
document.addEventListener( 'DOMContentLoaded', init );
[456] Fix | Delete
}
[457] Fix | Delete
[458] Fix | Delete
// Set up sharing again whenever a new post loads, to pick up any new buttons.
[459] Fix | Delete
document.body.addEventListener( 'is.post-load', WPCOMSharing_do );
[460] Fix | Delete
[461] Fix | Delete
// Set up sharing, updating counts and adding all button functionality.
[462] Fix | Delete
function WPCOMSharing_do() {
[463] Fix | Delete
if ( window.WPCOMSharing ) {
[464] Fix | Delete
window.WPCOMSharing.get_counts();
[465] Fix | Delete
}
[466] Fix | Delete
[467] Fix | Delete
forEachNode( document.querySelectorAll( '.sharedaddy a' ), function ( anchor ) {
[468] Fix | Delete
var href = anchor.getAttribute( 'href' );
[469] Fix | Delete
if ( href && href.indexOf( 'share=' ) !== -1 && href.indexOf( '&nb=1' ) === -1 ) {
[470] Fix | Delete
anchor.setAttribute( 'href', href + '&nb=1' );
[471] Fix | Delete
}
[472] Fix | Delete
} );
[473] Fix | Delete
[474] Fix | Delete
// Show hidden buttons
[475] Fix | Delete
[476] Fix | Delete
// Touchscreen device: use click.
[477] Fix | Delete
// Non-touchscreen device: use click if not already appearing due to a hover event
[478] Fix | Delete
[479] Fix | Delete
forEachNode(
[480] Fix | Delete
document.querySelectorAll( '.sharedaddy a.sharing-anchor' ),
[481] Fix | Delete
function ( buttonEl ) {
[482] Fix | Delete
MoreButton.instantiateOrReuse( buttonEl );
[483] Fix | Delete
}
[484] Fix | Delete
);
[485] Fix | Delete
[486] Fix | Delete
if ( document.ontouchstart !== undefined ) {
[487] Fix | Delete
document.body.classList.add( 'jp-sharing-input-touch' );
[488] Fix | Delete
}
[489] Fix | Delete
[490] Fix | Delete
// Add click functionality
[491] Fix | Delete
forEachNode( document.querySelectorAll( '.sharedaddy ul' ), function ( group ) {
[492] Fix | Delete
if ( group.getAttribute( 'data-sharing-events-added' ) === 'true' ) {
[493] Fix | Delete
return;
[494] Fix | Delete
}
[495] Fix | Delete
group.setAttribute( 'data-sharing-events-added', 'true' );
[496] Fix | Delete
[497] Fix | Delete
var printUrl = function ( uniqueId, urlToPrint ) {
[498] Fix | Delete
var iframe = document.createElement( 'iframe' );
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function