Com\’è dura la professione!

19 marzo 2009

Un viaggio in WebKit transitando per Plasmaland

Filed under: kde4,Open Source,Programmazione,QT — lbell @ 22:55

Scrivendo una piccola utility per Plasma mi sono fatto tentare dall’uso della nuova versione di WebKit per gestire l’interfaccia utente.

In effetti integrare WebKit in un programma QT o KDE non è troppo difficile, grazie all’uso degli slot e delle metainformazioni che QT aggiunge alle classi. E’ possibile richiamare direttamente i metodi di oggetti residenti nel nostro programma, sfruttando il meccanismo dei segnali e degli slot, dalla pagina HTML via Javascript. Per prima cosa occorre inserire nelle pagine HTML riferimenti agli oggetti C++ della nostra applicazione come se fossero variabili Javascript native, utilizzando un identificatore che verrà mappato sugli oggetti fisici a tempo debito. Fatto ciò possiamo codificare funzioni Javascript che sfruttino i metodi dichiarati come slot, in corrispondenza di determinati eventi, come la pressione di un pulsante. Possiamo quindi dalla pagina HTML eseguire metodi dei nostri oggetti passando quali parametri entità definite al livello HTML, come ad esempio i valori di un form.

Ogni collegamento tra WebKit e la nostra applicazione avverrà sempre tramite funzioni Javascript, quindi sarà WebKit ad iniziare le operazioni.

Facciamo un esempio:

Supponiamo che il nostro obiettivo sia di richiamare da Javascript il metodo ‘reload’ di un’istanza di una classe C++ descritta in questo modo:

class DBusApplet : public
Plasma::PopupApplet
{
    Q_OBJECT
    ...
public
slots:
    void reload(const QString &selection);
private:
    ...
};

in Javascript la nostra istanza può essere mappata come segue, assumendo che sia stata associata all’identificatore ‘appletInterface’:

function execute(selection)
{
    appletInterface.reload(selection);
}

Dato che la conversione dei tipi di base è automatica, quello che occorre fare è ‘iniettare’ gli oggetti C++ all’interno del componente WebKit, ma è necessario attendere che sia il componente ad avvertirci del momento più opportuno.

Al termine del caricamento di una pagina HTML, che la si assegni direttamente da programma o attraverso un URL, il frame corrente emette infatti il segnale “javaScriptWindowObjectCleared”, che occorre avere cura di catturare nel solito modo che QT ci mette a disposizione:

connect(page()->mainFrame(),

SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(populateJavaScriptWindowObject()));

Alla ricezione del segnale possiamo, attraverso il metodo collegato (nell’esempio precedente ‘populateJavaScriptWindowObject’), passare finalmente il riferimento dei nostri oggetti a WebKit attraverso il metodo addToJavaScriptWindowObject, i cui argomenti sono il nome della variabile Javascript associata e l’indirizzo dell’oggetto stesso.

page->mainFrame()->addToJavaScriptWindowObject(“appletInterface”, this);

Se tentassimo di associare i nostri oggetti prima che la pagina sia stata effettivamente caricata, il collegamento non avrebbe successo.

http://doc.trolltech.com/4.4/qtwebkit.html

http://webkit.org/

http://code.google.com/p/dbusapplet/

Crea un sito o un blog gratuito su WordPress.com.