<br><br>On 7/17/07, Benjamin Otte &lt;<a href="mailto:otte@gnome.org">otte@gnome.org</a>&gt; wrote:<br><br>&nbsp;&nbsp;&nbsp; On 7/17/07, Uygar Gümüş &lt;<a href="mailto:uygar.gumus@gmail.com">uygar.gumus@gmail.com</a>&gt; wrote:<br><br>
&nbsp;&nbsp;&nbsp; &gt;&gt;&nbsp; And i successfully did it with version 0.4.5<br>&nbsp;&nbsp;&nbsp; &gt;&gt;&nbsp; Even thought it is integrated and works fine there are some problems with<br>&nbsp;&nbsp;&nbsp; &gt;&gt; swfdec.<br>&nbsp;&nbsp;&nbsp; &gt;&gt;<br>&nbsp;&nbsp;&nbsp; &gt; Where&#39;s the patch to do it? I was going to hack on that with Alp
<br>&nbsp;&nbsp;&nbsp; &gt; Toker, so if we had something to start, that&#39;d be great.<br><br>&nbsp;&nbsp; &nbsp;Thanks for your fast reply and sory my slow one. I could not prepare a patch for<br>&nbsp;&nbsp; &nbsp;gtk+webcore. Because after we started to use gtk+webcore-
0.5.2 the team came out with a new<br>&nbsp;&nbsp; &nbsp;and really better version called tiger branch and they said &quot;porting tiger branch of apples safari completed&quot;<br>&nbsp;&nbsp; &nbsp;But we had lots of changes on 0.5.2 code and did not have enough time for porting them&nbsp; to 
0.5.3 also they had a<br>&nbsp;&nbsp;&nbsp; naming change which made our porting job almost possible. I tried to make a patch for 0.5.2 version but i could not find original svn checkout of 0.5.2. Also i i did it it would contain all try-fail works of us (%99 of them is not 
<br>&nbsp;&nbsp; &nbsp;about swfdec). those has no meaning for you i think. And i decided to tell what we done. i will go backward. <br><br>&nbsp;&nbsp; &nbsp;NRCit module has a function called widgetForPluginWithURL which is called in NRCore and creates a gtk widget for plugin. We made implemet it to create a swfdecgtkwidget&nbsp; like this
<br><br><br>&nbsp;&nbsp; &nbsp;GtkWidget* BridgeImpl::widgetForPluginWithURL(const gchar* URL,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GList* attributesArray,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gchar* baseURLString,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gchar *MIMEType)
<br>&nbsp;&nbsp; &nbsp;{<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;GtkWidget* _pWidget = NULL;<br>&nbsp;&nbsp; &nbsp;<br><br>&nbsp;&nbsp; &nbsp;#if ENABLE_FLASH_PLUGIN<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if((strcmp(MIMEType, &quot;application/x-shockwave-flash&quot;) == 0)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;||(strcmp(MIMEType, &quot;application/x-flash-video&quot;) == 0))
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;_pWidget = FlashPlugin::flashWidget(URL);<br><br>&nbsp;&nbsp; &nbsp;#endif<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(!_pWidget)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;gchar str[100];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;g_snprintf(str, 100, &quot;widget for %s&quot;,MIMEType);<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;_pWidget = gtk_label_new(str);&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;<br><br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return _pWidget;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;As you see (and i said before) we integrated in to NRCit module. Not used as plugin. <br>&nbsp;&nbsp; &nbsp;FlashPlugin::flashWidget(URL); function uses libcurl to download content on a temp directory and create a Swfdecplayer and widget to render flash content.
<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;Second step was about make this function call. It is called in NRCore module at function KParts::ReadOnlyPart *KWQKHTMLPart::createPart(const khtml::ChildFrame &amp;child, const KURL &amp;url, const QString &amp;mimeType) Which creates a ReadOnlyPart for rendering. This function uses bool BridgeImpl::frameRequiredForMIMEType(const gchar* MIMEType, const gchar* URL) function in NRCit to determine if this mimetype needs a frame or not. I returned true to indicate all mimetypes need frame. (But must be implemented later.) So we can create a new widget for application/x-shockwave-flash and application/x-flash-video contents.
<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;Third step was tell servers that our browser can render flash files. For it i made a fwe google search and trusted this site: <a href="http://www.quirksmode.org/js/flash.html">http://www.quirksmode.org/js/flash.html
</a>. It say JS can be used to determine if flash plugin has or not.<br>&nbsp;&nbsp; &nbsp;This kind of Js checks are done NRCore/khtml/ecma/kjs_navigator.cpp file. This file uses KConfig objects to read configuration files. But this class is not implemet in 
0.5.2 version (i don&#39;t know if done in 0.5.3). PluginBase class is supposed to read a configuration file via KConfig and get plugin infos from there. So we added only one plugin info (as you guest for flash) hard coded. So JS scripts can now learn about our flash capability
<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;The code is that<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;PluginBase::PluginBase ( ExecState *exec )<br>&nbsp;&nbsp; &nbsp;: ObjectImp ( exec-&gt;lexicalInterpreter()-&gt;builtinObjectPrototype() )<br>&nbsp;&nbsp; &nbsp;{<br><br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ( !plugins )<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugins = new QPtrList&lt;PluginInfo&gt;;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mimes = new QPtrList&lt;MimeClassInfo&gt;;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugins-&gt;setAutoDelete ( true );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mimes-&gt;setAutoDelete ( true );
<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// read configuration<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;QString _str = KGlobal::dirs()-&gt;saveLocation ( &quot;data&quot;,&quot;nsplugins&quot; ) +&quot;/pluginsinfo&quot;;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;KConfig c ( _str );
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unsigned num = /*(unsigned int)c.readNumEntry(&quot;number&quot;)*/ 1;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for ( unsigned n=0; n&lt;num; n++ )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;c.setGroup ( QString::number ( n ) );
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;PluginInfo *plugin = new PluginInfo;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugin-&gt;name =&nbsp; QString ( &quot;Shockwave Flash&quot; ) /* c.readEntry(&quot;name&quot;)*/;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugin-&gt;file = QString ( &quot;
noname.so&quot; );/*c.readEntry(&quot;file&quot;);*/<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugin-&gt;desc = QString ( &quot;Flash Plug-in KJAS for Konqueror&quot; );/*c.readEntry(&quot;description&quot;);*/<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugins-&gt;append ( plugin );
<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// get mime types from string<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;QStringList types = QStringList::split ( &#39;;&#39;, QString ( &quot;application/x-shockwave-flash&quot; ) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;QStringList::Iterator type;
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for ( type=types.begin(); type!=types.end(); ++type )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// get mime information<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;MimeClassInfo *mime = new MimeClassInfo;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;QStringList tokens = QStringList::split ( &#39;:&#39;, *type, TRUE );
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;QStringList::Iterator token;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;token = tokens.begin();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ( token == tokens.end() )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;delete mime;
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;continue;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mime-&gt;type = ( *token ).lower();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//kdDebug(6070) &lt;&lt; &quot;mime-&gt;type=&quot; &lt;&lt; mime-&gt;type &lt;&lt; endl;
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;++token;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ( token == tokens.end() )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;delete mime;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;continue;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mime-&gt;suffixes = *token;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;++token;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ( token == tokens.end() )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;delete mime;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;continue;
<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mime-&gt;desc = *token;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;++token;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mime-&gt;plugin = plugin;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mimes-&gt;append ( mime );<br>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;plugin-&gt;mimes.append ( mime );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;m_refCount++;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;I hope this can be useful. Sory for patch. <br><br>-- <br>Uygar Gümüş 
<br>