Changeset 1790 for FCKeditor/trunk


Ignore:
Timestamp:
03/25/2008 08:23:55 AM (7 years ago)
Author:
martinkou
Message:

Fixed #922 : Implemented a generic document processor for <OBJECT> and <EMBED> tags.
Fixed #1831 : Fixed the issue where the placeholder icon for <EMBED> tags does not always show up in IE7.

Location:
FCKeditor/trunk
Files:
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/_whatsnew.html

    r1778 r1790  
    124124                        command was throwing an error if executed in an editor where its relative button
    125125                        is not present in the toolbar.</li>
     126                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/922">#922</a>] Implemented a
     127                        generic document processor for &lt;OBJECT&gt; and &lt;EMBED&gt; tags.</li>
     128                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1831">#1831</a>] Fixed the
     129                        issue where the placeholder icon for &lt;EMBED&gt; tags does not always show up
     130                        in IE7.</li>
    126131        </ul>
    127132        <h3>
  • FCKeditor/trunk/editor/_source/internals/fck.js

    r1775 r1790  
    364364                // IE doesn't support <abbr> and it breaks it. Let's protect it.
    365365                if ( FCKBrowserInfo.IsIE )
    366                         sTags += sTags.length > 0 ? '|ABBR|XML|EMBED' : 'ABBR|XML|EMBED' ;
     366                        sTags += sTags.length > 0 ? '|ABBR|XML|EMBED|OBJECT' : 'ABBR|XML|EMBED|OBJECT' ;
    367367
    368368                var oRegex ;
     
    400400                if ( FCKBrowserInfo.IsIE && FCK.EditorDocument )
    401401                {
    402                                 FCK.EditorDocument.detachEvent("onselectionchange", Doc_OnSelectionChange ) ;
     402                        FCK.EditorDocument.detachEvent("onselectionchange", Doc_OnSelectionChange ) ;
    403403                }
    404404
  • FCKeditor/trunk/editor/_source/internals/fckconfig.js

    r1628 r1790  
    177177
    178178        // <noscript> tags (get lost in IE and messed up in FF).
    179         /<noscript[\s\S]*?<\/noscript>/gi,
    180 
    181         // Protect <object> tags. See #359.
    182         /<object[\s\S]+?<\/object>/gi
     179        /<noscript[\s\S]*?<\/noscript>/gi
    183180] ;
    184181
  • FCKeditor/trunk/editor/_source/internals/fckdocumentprocessor.js

    r1565 r1790  
    3434FCKDocumentProcessor.Process = function( document )
    3535{
     36        var bIsDirty = FCK.IsDirty() ;
    3637        var oProcessor, i = 0 ;
    3738        while( ( oProcessor = this._Items[i++] ) )
    3839                oProcessor.ProcessDocument( document ) ;
     40        if ( !bIsDirty )
     41                FCK.ResetIsDirty() ;
    3942}
    4043
    4144var FCKDocumentProcessor_CreateFakeImage = function( fakeClass, realElement )
    4245{
    43         var oImg = FCK.EditorDocument.createElement( 'IMG' ) ;
     46        var oImg = FCKTools.GetElementDocument( realElement ).createElement( 'IMG' ) ;
    4447        oImg.className = fakeClass ;
    4548        oImg.src = FCKConfig.FullBasePath + 'images/spacer.gif' ;
     
    119122}
    120123
    121 // Flash Embeds.
    122 var FCKFlashProcessor = FCKDocumentProcessor.AppendNew() ;
    123 FCKFlashProcessor.ProcessDocument = function( document )
    124 {
    125         /*
    126         Sample code:
    127         This is some <embed src="/UserFiles/Flash/Yellow_Runners.swf"></embed><strong>sample text</strong>. You are&nbsp;<a name="fred"></a> using <a href="http://www.fckeditor.net/">FCKeditor</a>.
    128         */
    129 
    130         var bIsDirty = FCK.IsDirty() ;
    131 
    132         var aEmbeds = document.getElementsByTagName( 'EMBED' ) ;
    133 
    134         var oEmbed ;
    135         var i = aEmbeds.length - 1 ;
    136         while ( i >= 0 && ( oEmbed = aEmbeds[i--] ) )
    137         {
    138                 // IE doesn't return the type attribute with oEmbed.type or oEmbed.getAttribute("type")
    139                 // But it turns out that after accessing it then it doesn't gets copied later
    140                 var oType = oEmbed.attributes[ 'type' ] ;
    141 
    142                 // Check the extension and the type. Now it should be enough with just the type
    143                 // Opera doesn't return oEmbed.src so oEmbed.src.EndsWith will fail
    144                 if ( (oEmbed.src && oEmbed.src.EndsWith( '.swf', true )) || ( oType && oType.nodeValue == 'application/x-shockwave-flash' ) )
    145                 {
    146                         var oCloned = oEmbed.cloneNode( true ) ;
    147 
    148                         var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__Flash', oCloned ) ;
    149                         oImg.setAttribute( '_fckflash', 'true', 0 ) ;
    150 
    151                         FCKFlashProcessor.RefreshView( oImg, oEmbed ) ;
    152 
    153                         oEmbed.parentNode.insertBefore( oImg, oEmbed ) ;
    154                         oEmbed.parentNode.removeChild( oEmbed ) ;
    155                 }
    156         }
    157 
    158         // Fix the IsDirty state (#1406).
    159         if ( !bIsDirty )
    160                 FCK.ResetIsDirty() ;
    161 }
    162 
    163 FCKFlashProcessor.RefreshView = function( placeHolderImage, originalEmbed )
    164 {
    165         if ( originalEmbed.getAttribute( 'width' ) > 0 )
    166                 placeHolderImage.style.width = FCKTools.ConvertHtmlSizeToStyle( originalEmbed.getAttribute( 'width' ) ) ;
    167 
    168         if ( originalEmbed.getAttribute( 'height' ) > 0 )
    169                 placeHolderImage.style.height = FCKTools.ConvertHtmlSizeToStyle( originalEmbed.getAttribute( 'height' ) ) ;
    170 }
     124// EMBED and OBJECT tags.
     125FCKEmbedAndObjectProcessor = (function()
     126{
     127        var customProcessors = [] ;
     128
     129        var processElement = function( el )
     130        {
     131                var clone = el.cloneNode( true ) ;
     132                var replaceElement ;
     133                var fakeImg = replaceElement = FCKDocumentProcessor_CreateFakeImage( 'FCK__UnknownObject', clone ) ;
     134                FCKEmbedAndObjectProcessor.RefreshView( fakeImg, el ) ;
     135
     136                for ( var i = 0 ; i < customProcessors.length ; i++ )
     137                        replaceElement = customProcessors[i]( el, replaceElement ) || replaceElement ;
     138
     139                if ( replaceElement != fakeImg )
     140                        FCKTempBin.RemoveElement( fakeImg.getAttribute( '_fckrealelement' ) ) ;
     141
     142                el.parentNode.replaceChild( replaceElement, el ) ;
     143        }
     144
     145        return FCKTools.Merge( FCKDocumentProcessor.AppendNew(),
     146                       {
     147                                ProcessDocument : function( doc )
     148                                {
     149                                        // Firefox 3 would sometimes throw an unknown exception while accessing EMBEDs and OBJECTs
     150                                        // without the setTimeout().
     151                                        FCKTools.RunFunction( function()
     152                                                {
     153                                                        // Process OBJECTs first, since EMBEDs can sometimes go inside OBJECTS (e.g. Flash).
     154                                                        var aObjects = doc.getElementsByTagName( 'object' );
     155                                                        for ( var i = aObjects.length - 1 ; i >= 0 ; i-- )
     156                                                                processElement( aObjects[i] ) ;
     157
     158                                                        // Now process any EMBEDs left.
     159                                                        var aEmbeds = doc.getElementsByTagName( 'embed' ) ;
     160                                                        for ( var i = aEmbeds.length - 1 ; i >= 0 ; i-- )
     161                                                                processElement( aEmbeds[i] ) ;
     162                                                } ) ;
     163                                },
     164
     165                                RefreshView : function( placeHolder, original )
     166                                {
     167                                        if ( original.getAttribute( 'width' ) > 0 )
     168                                                placeHolder.style.width = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'width' ) ) ;
     169
     170                                        if ( original.getAttribute( 'height' ) > 0 )
     171                                                placeHolder.style.height = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'height' ) ) ;
     172                                },
     173
     174                                AddCustomHandler : function( func )
     175                                {
     176                                        customProcessors.push( func ) ;
     177                                }
     178                        } ) ;
     179} )() ;
    171180
    172181FCK.GetRealElement = function( fakeElement )
     
    230239        }
    231240}
     241
     242// Flash handler.
     243FCKEmbedAndObjectProcessor.AddCustomHandler( function( el, fakeImg )
     244        {
     245                if ( ! ( el.nodeName.IEquals( 'embed' ) && ( el.type == 'application/x-shockwave-flash' || /\.swf($|#|\?)/i.test( el.src ) ) ) )
     246                        return ;
     247                fakeImg.className = 'FCK__Flash' ;
     248                fakeImg.setAttribute( '_fckflash', 'true', 0 );
     249        } ) ;
  • FCKeditor/trunk/editor/css/fck_internal.css

    r1598 r1790  
    5252        background-position: center center;
    5353        background-image: url(images/fck_flashlogo.gif);
     54        background-repeat: no-repeat;
     55        width: 80px;
     56        height: 80px;
     57}
     58
     59.FCK__UnknownObject
     60{
     61        border: #a9a9a9 1px solid;
     62        background-position: center center;
     63        background-image: url(images/fck_plugin.gif);
    5464        background-repeat: no-repeat;
    5565        width: 80px;
  • FCKeditor/trunk/editor/dialog/fck_flash/fck_flash.js

    r1598 r1790  
    142142        }
    143143
    144         oEditor.FCKFlashProcessor.RefreshView( oFakeImage, oEmbed ) ;
     144        oEditor.FCKEmbedAndObjectProcessor.RefreshView( oFakeImage, oEmbed ) ;
    145145
    146146        return true ;
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy