Add a Live Connect extension to be able to react to the very tiny bit of exposed JavaScript API for host containers.

The current implementation is very very very simple and minimal, and misses a bit of stuff (eg the queue'ing for messages, errors, etc), but for now seems working.
Many thanks to Maksim for his precious help with the extension working :)

svn path=/trunk/KDE/kdegraphics/okular/; revision=792030
This commit is contained in:
Pino Toscano 2008-03-30 23:36:15 +00:00
parent 872d380582
commit d3e7460947
2 changed files with 109 additions and 0 deletions

View file

@ -147,6 +147,8 @@ m_cliPresentation(false), m_generatorGuiClient(0)
// create browser extension (for printing when embedded into browser)
m_bExtension = new BrowserExtension(this);
// create live connect extension (for integrating with browser scripting)
new OkularLiveConnectExtension( this );
// we need an instance
setComponentData(okularPartFactory::componentData());
@ -1911,6 +1913,91 @@ void BrowserExtension::print()
}
/*
* OkularLiveConnectExtension class
*/
#define OKULAR_EVAL_RES_OBJ_NAME "__okular_object"
#define OKULAR_EVAL_RES_OBJ "this." OKULAR_EVAL_RES_OBJ_NAME
OkularLiveConnectExtension::OkularLiveConnectExtension( Part *parent )
: KParts::LiveConnectExtension( parent ), m_inEval( false )
{
}
bool OkularLiveConnectExtension::get( const unsigned long objid, const QString &field,
KParts::LiveConnectExtension::Type &type,
unsigned long &retobjid, QString &value )
{
Q_UNUSED( value )
retobjid = objid;
bool result = false;
if ( field == QLatin1String( "postMessage" ) )
{
type = KParts::LiveConnectExtension::TypeFunction;
result = true;
}
return result;
}
bool OkularLiveConnectExtension::put( const unsigned long objid, const QString &field, const QString &value )
{
Q_UNUSED( objid )
if ( m_inEval )
{
if ( field == QLatin1String( OKULAR_EVAL_RES_OBJ_NAME ) )
m_evalRes = value;
return true;
}
return false;
}
bool OkularLiveConnectExtension::call( const unsigned long objid, const QString &func, const QStringList &args,
KParts::LiveConnectExtension::Type &type, unsigned long &retobjid, QString &value )
{
retobjid = objid;
bool result = false;
if ( func == QLatin1String( "postMessage" ) )
{
type = KParts::LiveConnectExtension::TypeVoid;
postMessage( args );
value = QString();
result = true;
}
return result;
}
QString OkularLiveConnectExtension::eval( const QString &script )
{
KParts::LiveConnectExtension::ArgList args;
args.append( qMakePair( KParts::LiveConnectExtension::TypeString, script ) );
m_evalRes.clear();
m_inEval = true;
emit partEvent( 0, "eval", args );
m_inEval = false;
return m_evalRes;
}
void OkularLiveConnectExtension::postMessage( const QStringList &args )
{
QStringList arrayargs;
Q_FOREACH ( const QString &arg, args )
{
QString newarg = arg;
newarg.replace( '\'', "\\'" );
arrayargs.append( "\"" + newarg + "\"" );
}
const QString arrayarg = "[" + arrayargs.join( ", " ) + "]";
eval( "if (this.messageHandler && typeof this.messageHandler.onMessage == 'function') "
"{ this.messageHandler.onMessage(" + arrayarg + ") }" );
}
#include "part.moc"
/* kate: replace-tabs on; indent-width 4; */

22
part.h
View file

@ -267,6 +267,28 @@ class BrowserExtension : public KParts::BrowserExtension
private:
Part *m_part;
};
class OkularLiveConnectExtension : public KParts::LiveConnectExtension
{
Q_OBJECT
public:
OkularLiveConnectExtension( Part *parent );
// from LiveConnectExtension
virtual bool get( const unsigned long objid, const QString &field, Type &type,
unsigned long &retobjid, QString &value );
virtual bool put( const unsigned long objid, const QString &field, const QString &value );
virtual bool call( const unsigned long objid, const QString &func, const QStringList &args,
Type &type, unsigned long &retobjid, QString &value );
private:
QString eval( const QString &script );
void postMessage( const QStringList &args );
bool m_inEval;
QString m_evalRes;
};
#endif
/* kate: replace-tabs on; indent-width 4; */