TinyMCE views: fix Firefox issues.
* Set focus before rendering to prevent reload in Firefox. * Rerender views if they are unloaded. * Remove timeout added in [29513]. * Fix argument in wp.mce.views.render. * Empty views on hide. Missed in #36434. Props gitlost, azaozz, iseulde. Fixes #38511. Built from https://develop.svn.wordpress.org/trunk@39282 git-svn-id: http://core.svn.wordpress.org/trunk@39222 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
2fadd7a895
commit
79b3576650
|
@ -157,6 +157,14 @@
|
||||||
|
|
||||||
text = tinymce.DOM.decode( text );
|
text = tinymce.DOM.decode( text );
|
||||||
|
|
||||||
|
if ( text.indexOf( '[' ) !== -1 && text.indexOf( ']' ) !== -1 ) {
|
||||||
|
// Looks like a shortcode? Remove any line breaks from inside of shortcodes
|
||||||
|
// or autop will replace them with <p> and <br> later and the string won't match.
|
||||||
|
text = text.replace( /\[[^\]]+\]/g, function( match ) {
|
||||||
|
return match.replace( /[\r\n]/g, '' );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if ( ! force ) {
|
if ( ! force ) {
|
||||||
instance = this.getInstance( text );
|
instance = this.getInstance( text );
|
||||||
|
|
||||||
|
@ -208,7 +216,7 @@
|
||||||
*/
|
*/
|
||||||
render: function( force ) {
|
render: function( force ) {
|
||||||
_.each( instances, function( instance ) {
|
_.each( instances, function( instance ) {
|
||||||
instance.render( force );
|
instance.render( null, force );
|
||||||
} );
|
} );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -490,7 +498,8 @@
|
||||||
var dom = editor.dom,
|
var dom = editor.dom,
|
||||||
styles = '',
|
styles = '',
|
||||||
bodyClasses = editor.getBody().className || '',
|
bodyClasses = editor.getBody().className || '',
|
||||||
editorHead = editor.getDoc().getElementsByTagName( 'head' )[0];
|
editorHead = editor.getDoc().getElementsByTagName( 'head' )[0],
|
||||||
|
iframe, iframeWin, iframeDoc, MutationObserver, observer, i, block;
|
||||||
|
|
||||||
tinymce.each( dom.$( 'link[rel="stylesheet"]', editorHead ), function( link ) {
|
tinymce.each( dom.$( 'link[rel="stylesheet"]', editorHead ), function( link ) {
|
||||||
if ( link.href && link.href.indexOf( 'skins/lightgray/content.min.css' ) === -1 &&
|
if ( link.href && link.href.indexOf( 'skins/lightgray/content.min.css' ) === -1 &&
|
||||||
|
@ -511,125 +520,127 @@
|
||||||
}, '\u200B' );
|
}, '\u200B' );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seems the browsers need a bit of time to insert/set the view nodes,
|
editor.undoManager.transact( function() {
|
||||||
// or the iframe will fail especially when switching Text => Visual.
|
node.innerHTML = '';
|
||||||
setTimeout( function() {
|
|
||||||
var iframe, iframeWin, iframeDoc, MutationObserver, observer, i, block;
|
|
||||||
|
|
||||||
editor.undoManager.transact( function() {
|
iframe = dom.add( node, 'iframe', {
|
||||||
node.innerHTML = '';
|
/* jshint scripturl: true */
|
||||||
|
src: tinymce.Env.ie ? 'javascript:""' : '',
|
||||||
iframe = dom.add( node, 'iframe', {
|
frameBorder: '0',
|
||||||
/* jshint scripturl: true */
|
allowTransparency: 'true',
|
||||||
src: tinymce.Env.ie ? 'javascript:""' : '',
|
scrolling: 'no',
|
||||||
frameBorder: '0',
|
'class': 'wpview-sandbox',
|
||||||
allowTransparency: 'true',
|
style: {
|
||||||
scrolling: 'no',
|
width: '100%',
|
||||||
'class': 'wpview-sandbox',
|
display: 'block'
|
||||||
style: {
|
},
|
||||||
width: '100%',
|
height: self.iframeHeight
|
||||||
display: 'block'
|
|
||||||
},
|
|
||||||
height: self.iframeHeight
|
|
||||||
} );
|
|
||||||
|
|
||||||
dom.add( node, 'span', { 'class': 'mce-shim' } );
|
|
||||||
dom.add( node, 'span', { 'class': 'wpview-end' } );
|
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// Bail if the iframe node is not attached to the DOM.
|
dom.add( node, 'span', { 'class': 'mce-shim' } );
|
||||||
// Happens when the view is dragged in the editor.
|
dom.add( node, 'span', { 'class': 'wpview-end' } );
|
||||||
// There is a browser restriction when iframes are moved in the DOM. They get emptied.
|
} );
|
||||||
// The iframe will be rerendered after dropping the view node at the new location.
|
|
||||||
if ( ! iframe.contentWindow ) {
|
// Bail if the iframe node is not attached to the DOM.
|
||||||
|
// Happens when the view is dragged in the editor.
|
||||||
|
// There is a browser restriction when iframes are moved in the DOM. They get emptied.
|
||||||
|
// The iframe will be rerendered after dropping the view node at the new location.
|
||||||
|
if ( ! iframe.contentWindow ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
iframeWin = iframe.contentWindow;
|
||||||
|
iframeDoc = iframeWin.document;
|
||||||
|
iframeDoc.open();
|
||||||
|
|
||||||
|
iframeDoc.write(
|
||||||
|
'<!DOCTYPE html>' +
|
||||||
|
'<html>' +
|
||||||
|
'<head>' +
|
||||||
|
'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' +
|
||||||
|
head +
|
||||||
|
styles +
|
||||||
|
'<style>' +
|
||||||
|
'html {' +
|
||||||
|
'background: transparent;' +
|
||||||
|
'padding: 0;' +
|
||||||
|
'margin: 0;' +
|
||||||
|
'}' +
|
||||||
|
'body#wpview-iframe-sandbox {' +
|
||||||
|
'background: transparent;' +
|
||||||
|
'padding: 1px 0 !important;' +
|
||||||
|
'margin: -1px 0 0 !important;' +
|
||||||
|
'}' +
|
||||||
|
'body#wpview-iframe-sandbox:before,' +
|
||||||
|
'body#wpview-iframe-sandbox:after {' +
|
||||||
|
'display: none;' +
|
||||||
|
'content: "";' +
|
||||||
|
'}' +
|
||||||
|
'</style>' +
|
||||||
|
'</head>' +
|
||||||
|
'<body id="wpview-iframe-sandbox" class="' + bodyClasses + '">' +
|
||||||
|
body +
|
||||||
|
'</body>' +
|
||||||
|
'</html>'
|
||||||
|
);
|
||||||
|
|
||||||
|
iframeDoc.close();
|
||||||
|
|
||||||
|
function resize() {
|
||||||
|
var $iframe;
|
||||||
|
|
||||||
|
if ( block ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
iframeWin = iframe.contentWindow;
|
// Make sure the iframe still exists.
|
||||||
iframeDoc = iframeWin.document;
|
if ( iframe.contentWindow ) {
|
||||||
iframeDoc.open();
|
$iframe = $( iframe );
|
||||||
|
self.iframeHeight = $( iframeDoc.body ).height();
|
||||||
|
|
||||||
iframeDoc.write(
|
if ( $iframe.height() !== self.iframeHeight ) {
|
||||||
'<!DOCTYPE html>' +
|
$iframe.height( self.iframeHeight );
|
||||||
'<html>' +
|
editor.nodeChanged();
|
||||||
'<head>' +
|
|
||||||
'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' +
|
|
||||||
head +
|
|
||||||
styles +
|
|
||||||
'<style>' +
|
|
||||||
'html {' +
|
|
||||||
'background: transparent;' +
|
|
||||||
'padding: 0;' +
|
|
||||||
'margin: 0;' +
|
|
||||||
'}' +
|
|
||||||
'body#wpview-iframe-sandbox {' +
|
|
||||||
'background: transparent;' +
|
|
||||||
'padding: 1px 0 !important;' +
|
|
||||||
'margin: -1px 0 0 !important;' +
|
|
||||||
'}' +
|
|
||||||
'body#wpview-iframe-sandbox:before,' +
|
|
||||||
'body#wpview-iframe-sandbox:after {' +
|
|
||||||
'display: none;' +
|
|
||||||
'content: "";' +
|
|
||||||
'}' +
|
|
||||||
'</style>' +
|
|
||||||
'</head>' +
|
|
||||||
'<body id="wpview-iframe-sandbox" class="' + bodyClasses + '">' +
|
|
||||||
body +
|
|
||||||
'</body>' +
|
|
||||||
'</html>'
|
|
||||||
);
|
|
||||||
|
|
||||||
iframeDoc.close();
|
|
||||||
|
|
||||||
function resize() {
|
|
||||||
var $iframe;
|
|
||||||
|
|
||||||
if ( block ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure the iframe still exists.
|
|
||||||
if ( iframe.contentWindow ) {
|
|
||||||
$iframe = $( iframe );
|
|
||||||
self.iframeHeight = $( iframeDoc.body ).height();
|
|
||||||
|
|
||||||
if ( $iframe.height() !== self.iframeHeight ) {
|
|
||||||
$iframe.height( self.iframeHeight );
|
|
||||||
editor.nodeChanged();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( self.iframeHeight ) {
|
if ( self.iframeHeight ) {
|
||||||
block = true;
|
block = true;
|
||||||
|
|
||||||
setTimeout( function() {
|
setTimeout( function() {
|
||||||
block = false;
|
block = false;
|
||||||
resize();
|
resize();
|
||||||
}, 3000 );
|
}, 3000 );
|
||||||
|
}
|
||||||
|
|
||||||
|
function reload() {
|
||||||
|
$( node ).data( 'rendered', null );
|
||||||
|
|
||||||
|
setTimeout( function() {
|
||||||
|
wp.mce.views.render();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
$( iframeWin ).on( 'load', resize ).on( 'unload', reload );
|
||||||
|
|
||||||
|
MutationObserver = iframeWin.MutationObserver || iframeWin.WebKitMutationObserver || iframeWin.MozMutationObserver;
|
||||||
|
|
||||||
|
if ( MutationObserver ) {
|
||||||
|
observer = new MutationObserver( _.debounce( resize, 100 ) );
|
||||||
|
|
||||||
|
observer.observe( iframeDoc.body, {
|
||||||
|
attributes: true,
|
||||||
|
childList: true,
|
||||||
|
subtree: true
|
||||||
|
} );
|
||||||
|
} else {
|
||||||
|
for ( i = 1; i < 6; i++ ) {
|
||||||
|
setTimeout( resize, i * 700 );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$( iframeWin ).on( 'load', resize );
|
callback && callback.call( self, editor, node );
|
||||||
|
|
||||||
MutationObserver = iframeWin.MutationObserver || iframeWin.WebKitMutationObserver || iframeWin.MozMutationObserver;
|
|
||||||
|
|
||||||
if ( MutationObserver ) {
|
|
||||||
observer = new MutationObserver( _.debounce( resize, 100 ) );
|
|
||||||
|
|
||||||
observer.observe( iframeDoc.body, {
|
|
||||||
attributes: true,
|
|
||||||
childList: true,
|
|
||||||
subtree: true
|
|
||||||
} );
|
|
||||||
} else {
|
|
||||||
for ( i = 1; i < 6; i++ ) {
|
|
||||||
setTimeout( resize, i * 700 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
callback && callback.call( self, editor, node );
|
|
||||||
}, 50 );
|
|
||||||
}, rendered );
|
}, rendered );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -93,11 +93,14 @@
|
||||||
|
|
||||||
// Replace any new markers nodes with views.
|
// Replace any new markers nodes with views.
|
||||||
editor.on( 'setcontent', function() {
|
editor.on( 'setcontent', function() {
|
||||||
|
// Make sure that the editor is focussed.
|
||||||
|
// May refresh the content internally which resets the iframes.
|
||||||
|
editor.focus();
|
||||||
wp.mce.views.render();
|
wp.mce.views.render();
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// Empty view nodes for easier processing.
|
// Empty view nodes for easier processing.
|
||||||
editor.on( 'preprocess', function( event ) {
|
editor.on( 'preprocess hide', function( event ) {
|
||||||
editor.$( 'div[data-wpview-text], p[data-wpview-marker]', event.node ).each( function( i, node ) {
|
editor.$( 'div[data-wpview-text], p[data-wpview-marker]', event.node ).each( function( i, node ) {
|
||||||
node.innerHTML = '.';
|
node.innerHTML = '.';
|
||||||
} );
|
} );
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
!function(a,b){a.PluginManager.add("wpview",function(c){function d(){}function e(a){return c.dom.hasClass(a,"wpview")}function f(a){function b(a,b){return"<p>"+window.decodeURIComponent(b)+"</p>"}return a?a.replace(/<div[^>]+data-wpview-text="([^"]+)"[^>]*>(?:\.|[\s\S]+?wpview-end[^>]+>\s*<\/span>\s*)?<\/div>/g,b).replace(/<p[^>]+data-wpview-marker="([^"]+)"[^>]*>[\s\S]*?<\/p>/g,b):a}return b&&b.mce&&b.mce.views?(c.on("init",function(){var a=window.MutationObserver||window.WebKitMutationObserver;a&&new a(function(){c.fire("wp-body-class-change")}).observe(c.getBody(),{attributes:!0,attributeFilter:["class"]}),c.on("wp-body-class-change",function(){var a=c.getBody().className;c.$('iframe[class="wpview-sandbox"]').each(function(b,c){if(!c.src||'javascript:""'===c.src)try{c.contentWindow.document.body.className=a}catch(d){}})})}),c.on("beforesetcontent",function(a){var d;if(a.selection||b.mce.views.unbind(),a.content){if(!a.load&&(d=c.selection.getNode(),d&&d!==c.getBody()&&/^\s*https?:\/\/\S+\s*$/i.test(a.content))){if(d=c.dom.getParent(d,"p"),!d||!/^[\s\uFEFF\u00A0]*$/.test(c.$(d).text()||""))return;d.innerHTML=""}a.content=b.mce.views.setMarkers(a.content)}}),c.on("setcontent",function(){b.mce.views.render()}),c.on("preprocess",function(a){c.$("div[data-wpview-text], p[data-wpview-marker]",a.node).each(function(a,b){b.innerHTML="."})},!0),c.on("postprocess",function(a){a.content=f(a.content)}),c.on("beforeaddundo",function(a){a.level.content=f(a.level.content)}),c.on("drop objectselected",function(a){e(a.targetClone)&&(a.targetClone=c.getDoc().createTextNode(window.decodeURIComponent(c.dom.getAttrib(a.targetClone,"data-wpview-text"))))}),c.on("pastepreprocess",function(b){var c=b.content;c&&(c=a.trim(c.replace(/<[^>]+>/g,"")),/^https?:\/\/\S+$/i.test(c)&&(b.content=c))}),c.on("resolvename",function(a){e(a.target)&&(a.name=c.dom.getAttrib(a.target,"data-wpview-type")||"object")}),c.on("click keyup",function(){var a=c.selection.getNode();e(a)&&c.dom.getAttrib(a,"data-mce-selected")&&a.setAttribute("data-mce-selected","2")}),c.addButton("wp_view_edit",{tooltip:"Edit ",icon:"dashicon dashicons-edit",onclick:function(){var a=c.selection.getNode();e(a)&&b.mce.views.edit(c,a)}}),c.addButton("wp_view_remove",{tooltip:"Remove",icon:"dashicon dashicons-no",onclick:function(){c.fire("cut")}}),c.once("preinit",function(){var a;c.wp&&c.wp._createToolbar&&(a=c.wp._createToolbar(["wp_view_edit","wp_view_remove"]),c.on("wptoolbar",function(b){e(b.element)&&(b.toolbar=a)}))}),c.wp=c.wp||{},c.wp.getView=d,c.wp.setViewCursor=d,{getView:d}):{getView:d}})}(window.tinymce,window.wp);
|
!function(a,b){a.PluginManager.add("wpview",function(c){function d(){}function e(a){return c.dom.hasClass(a,"wpview")}function f(a){function b(a,b){return"<p>"+window.decodeURIComponent(b)+"</p>"}return a?a.replace(/<div[^>]+data-wpview-text="([^"]+)"[^>]*>(?:\.|[\s\S]+?wpview-end[^>]+>\s*<\/span>\s*)?<\/div>/g,b).replace(/<p[^>]+data-wpview-marker="([^"]+)"[^>]*>[\s\S]*?<\/p>/g,b):a}return b&&b.mce&&b.mce.views?(c.on("init",function(){var a=window.MutationObserver||window.WebKitMutationObserver;a&&new a(function(){c.fire("wp-body-class-change")}).observe(c.getBody(),{attributes:!0,attributeFilter:["class"]}),c.on("wp-body-class-change",function(){var a=c.getBody().className;c.$('iframe[class="wpview-sandbox"]').each(function(b,c){if(!c.src||'javascript:""'===c.src)try{c.contentWindow.document.body.className=a}catch(d){}})})}),c.on("beforesetcontent",function(a){var d;if(a.selection||b.mce.views.unbind(),a.content){if(!a.load&&(d=c.selection.getNode(),d&&d!==c.getBody()&&/^\s*https?:\/\/\S+\s*$/i.test(a.content))){if(d=c.dom.getParent(d,"p"),!d||!/^[\s\uFEFF\u00A0]*$/.test(c.$(d).text()||""))return;d.innerHTML=""}a.content=b.mce.views.setMarkers(a.content)}}),c.on("setcontent",function(){c.focus(),b.mce.views.render()}),c.on("preprocess hide",function(a){c.$("div[data-wpview-text], p[data-wpview-marker]",a.node).each(function(a,b){b.innerHTML="."})},!0),c.on("postprocess",function(a){a.content=f(a.content)}),c.on("beforeaddundo",function(a){a.level.content=f(a.level.content)}),c.on("drop objectselected",function(a){e(a.targetClone)&&(a.targetClone=c.getDoc().createTextNode(window.decodeURIComponent(c.dom.getAttrib(a.targetClone,"data-wpview-text"))))}),c.on("pastepreprocess",function(b){var c=b.content;c&&(c=a.trim(c.replace(/<[^>]+>/g,"")),/^https?:\/\/\S+$/i.test(c)&&(b.content=c))}),c.on("resolvename",function(a){e(a.target)&&(a.name=c.dom.getAttrib(a.target,"data-wpview-type")||"object")}),c.on("click keyup",function(){var a=c.selection.getNode();e(a)&&c.dom.getAttrib(a,"data-mce-selected")&&a.setAttribute("data-mce-selected","2")}),c.addButton("wp_view_edit",{tooltip:"Edit ",icon:"dashicon dashicons-edit",onclick:function(){var a=c.selection.getNode();e(a)&&b.mce.views.edit(c,a)}}),c.addButton("wp_view_remove",{tooltip:"Remove",icon:"dashicon dashicons-no",onclick:function(){c.fire("cut")}}),c.once("preinit",function(){var a;c.wp&&c.wp._createToolbar&&(a=c.wp._createToolbar(["wp_view_edit","wp_view_remove"]),c.on("wptoolbar",function(b){e(b.element)&&(b.toolbar=a)}))}),c.wp=c.wp||{},c.wp.getView=d,c.wp.setViewCursor=d,{getView:d}):{getView:d}})}(window.tinymce,window.wp);
|
Binary file not shown.
|
@ -4,7 +4,7 @@
|
||||||
*
|
*
|
||||||
* @global string $wp_version
|
* @global string $wp_version
|
||||||
*/
|
*/
|
||||||
$wp_version = '4.7-beta4-39281';
|
$wp_version = '4.7-beta4-39282';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||||
|
|
Loading…
Reference in New Issue