Hi all,
I am trying to embed gecko into gtk window on linux machine. my class
nsWebBrowserChrome implements nsIWebBrowser and nsIEmbeddingSitewindow
interfaces. To implement nsISupports inerface i am using
NS_IMPL_ISUPPORTS2(nsWebBrowserChrome,nsIWebBrowserChrome,nsIEmbeddingSiteWindow)
However in this case prgram gives a seg-fault at following line in
constructor of class nsWebBrowserChrome,
browserBaseWindow = do_QueryInterface(nsWebBrowser,&rv);
But when i use
NS_IMPL_ISUPPORTS1(nsWebBrowserChrome,nsIWebBrowserChrome)
with rest of code unchangedm then program runs successfully wihtout any
error. But Even in that case window appears blank. Though i am doing
sleep(50sec), so that nsIWebNavigation->loadURI(...) can load www.google.com
successfully.
One more thing, one document says to use NS_IMPL_ISUPPORTS2_CI to imple
nsISupports. When i do this, program fails to compile with error 'undefined
reference to nsWebBrowserChrome_classInfoGlobal'. What the difference
between two macros.
Any help is much appreciated.
My Source code follows,
#include "nsXPCOM.h"
#include "nsEmbedAPI.h"
#include "nsCOMPtr.h"
#include "nsMemory.h"
#include "nsISupportsImpl.h"
#include "nsStringAPI.h"
#include "nsEmbedString.h"
#include "nsIWebBrowserChrome.h"
#include "nsIWebBrowser.h"
#include "nsIWebNavigation.h"
#include "nsIEmbeddingSiteWindow.h"
#include "nsCWebBrowser.h"
#include "nsIDocShellTreeItem.h"
#include "nsIDocShellTreeOwner.h"
#include "nsIDocShell.h"
#include "nsIContentViewer.h"
#include "nsNetCID.h"
#include "nsIIOService.h"
#include "nsIURI.h"
#include "nsIWebProgressListener.h"
#include "nsIWeakReference.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <gtk/gtk.h>
extern nsresult NS_NewURI(nsIURI **result,const nsACString &spec,const char
*charset = nsnull,nsIURI *baseURI = nsnull,nsIIOService *ioService =
nsnull);
class nsCString;
static gint delete_callback(GtkWidget* w, GdkEventAny* e, gpointer data)
{
gtk_main_quit();
return 0;
}
class nsWebBrowserChrome : public nsIWebBrowserChrome,public
nsIEmbeddingSiteWindow {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIWEBBROWSERCHROME
NS_DECL_NSIEMBEDDINGSITEWINDOW
NS_DECL_NSIWEBPROGRESSLISTENER
nsWebBrowserChrome();
virtual ~nsWebBrowserChrome();
protected:
nsCOMPtr<nsIWebBrowser> nsWebBrowser;
nsCOMPtr<nsIBaseWindow> browserBaseWindow;
PRUint32 mChromeFlags;
GtkWidget* window;
};
NS_IMPL_ISUPPORTS2(nsWebBrowserChrome,nsIWebBrowserChrome,nsIEmbeddingSiteWindow)
nsWebBrowserChrome::nsWebBrowserChrome()
{
/* member initializers and constructor code */
nsresult rv = NS_OK;
nsWebBrowser = do_CreateInstance(NS_WEBBROWSER_CONTRACTID,&rv);
if(NS_FAILED(rv)){
fprintf(stdout, "Couldn't create nsIWebBrowser.\n");
nsWebBrowser = nsnull;
return;
}
nsWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*,this));
mChromeFlags = nsIWebBrowserChrome::CHROME_ALL;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
button = gtk_button_new();
label = gtk_label_new("Hello World");
gtk_window_set_title(GTK_WINDOW(window), " Hello World");
gtk_window_set_default_size(GTK_WINDOW(window),600,600);
gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_callback),NULL);
//gtk_widget_show_all(window);
printf("Here\n");fflush(stdout);
browserBaseWindow = do_QueryInterface(nsWebBrowser,&rv);
printf("Here2\n");fflush(stdout);
browserBaseWindow->InitWindow(window,nsnull,0,0,600,600);
browserBaseWindow->Create();
}
nsWebBrowserChrome::~nsWebBrowserChrome()
{
/* destructor code */
}
/* void setStatus (in unsigned long stVatusType, in wstring status); */
NS_IMETHODIMP nsWebBrowserChrome::SetStatus(PRUint32 statusType, const
PRUnichar *status)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* attribute nsIWebBrowser webBrowser; */
NS_IMETHODIMP nsWebBrowserChrome::GetWebBrowser(nsIWebBrowser *
*aWebBrowser)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
NS_ENSURE_ARG_POINTER(aWebBrowser);
*aWebBrowser = nsWebBrowser;
NS_IF_ADDREF(*aWebBrowser);
return NS_OK;
}
NS_IMETHODIMP nsWebBrowserChrome::SetWebBrowser(nsIWebBrowser * aWebBrowser)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
nsWebBrowser = aWebBrowser;
return NS_OK;
}
/* attribute unsigned long chromeFlags; */
NS_IMETHODIMP nsWebBrowserChrome::GetChromeFlags(PRUint32 *aChromeFlags)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
*aChromeFlags = mChromeFlags;
return NS_OK;
}
NS_IMETHODIMP nsWebBrowserChrome::SetChromeFlags(PRUint32 aChromeFlags)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
mChromeFlags = aChromeFlags;
return NS_OK;
}
/* void destroyBrowserWindow (); */
NS_IMETHODIMP nsWebBrowserChrome::DestroyBrowserWindow()
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* void sizeBrowserTo (in long aCX, in long aCY); */
NS_IMETHODIMP nsWebBrowserChrome::SizeBrowserTo(PRInt32 aCX, PRInt32 aCY)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* void showAsModal (); */
NS_IMETHODIMP nsWebBrowserChrome::ShowAsModal()
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* boolean isWindowModal (); */
NS_IMETHODIMP nsWebBrowserChrome::IsWindowModal(PRBool *_retval)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
NS_ENSURE_ARG_POINTER(_retval);
*_retval = PR_FALSE;
return NS_OK;
}
/* void exitModalEventLoop (in nsresult aStatus); */
NS_IMETHODIMP nsWebBrowserChrome::ExitModalEventLoop(nsresult aStatus)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* void setDimensions (in unsigned long flags, in long x, in long y, in long
cx, in long cy); */
NS_IMETHODIMP nsWebBrowserChrome::SetDimensions(PRUint32 flags, PRInt32 x,
PRInt32 y, PRInt32 cx, PRInt32 cy)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* void getDimensions (in unsigned long flags, out long x, out long y, out
long cx, out long cy); */
NS_IMETHODIMP nsWebBrowserChrome::GetDimensions(PRUint32 flags, PRInt32 *x,
PRInt32 *y, PRInt32 *cx, PRInt32 *cy)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
*x = 0;
*y = 0;
*cx = 600;
*cy = 600;
return NS_OK;
}
/* void setFocus (); */
NS_IMETHODIMP nsWebBrowserChrome::SetFocus()
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* attribute boolean visibility; */
NS_IMETHODIMP nsWebBrowserChrome::GetVisibility(PRBool *aVisibility)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
NS_ENSURE_ARG_POINTER(aVisibility);
*aVisibility = PR_TRUE;
return NS_OK;
}
NS_IMETHODIMP nsWebBrowserChrome::SetVisibility(PRBool aVisibility)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* attribute wstring title; */
NS_IMETHODIMP nsWebBrowserChrome::GetTitle(PRUnichar * *aTitle)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
NS_ENSURE_ARG_POINTER(aTitle);
*aTitle = nsnull;
return NS_OK;
}
NS_IMETHODIMP nsWebBrowserChrome::SetTitle(const PRUnichar * aTitle)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
return NS_OK;
}
/* [noscript] readonly attribute voidPtr siteWindow; */
NS_IMETHODIMP nsWebBrowserChrome::GetSiteWindow(void * *aSiteWindow)
{
/*return NS_ERROR_NOT_IMPLEMENTED;*/
*aSiteWindow = window;
return NS_OK;
}
int main(int argc, char **argv){
nsresult rv;
nsCOMPtr<nsILocalFile> greDir = nsnull;
char* grePath =
"/home/rajpal/d/magai_sucks/firefox/mozilla-source-1.8a1/gecko/dist/bin";
rv = NS_NewLocalFile(nsEmbedString((const
PRUnichar*)grePath),PR_TRUE,getter_AddRefs(greDir));
if (NS_FAILED(rv)){
fprintf(stdout, "Couldn't set greDir.\n");
exit(1);
}
rv = NS_InitEmbedding(greDir,nsnull);
//rv = NS_InitEmbedding(nsnull,nsnull);
if(NS_FAILED(rv)){
fprintf(stdout, "Couldn't start XPCOM.\n");
exit(1);
}
gtk_init(&argc, &argv);
nsCOMPtr<nsIWebBrowser> mWebBrowser;
nsCOMPtr<nsIWebNavigation> mWebNav = nsnull;
nsWebBrowserChrome* webBrowserChrome = new nsWebBrowserChrome();
nsCOMPtr<nsIWebBrowserChrome> chrome = nsnull;
chrome = NS_STATIC_CAST(nsIWebBrowserChrome*,webBrowserChrome);
rv = NS_OK;
if(!chrome){
fprintf(stdout, "Couldn't create nsIWebBrowserChrome Impl.\n");
return rv;
}
chrome->GetWebBrowser(getter_AddRefs(mWebBrowser));
if(!mWebBrowser){
fprintf(stdout, "Couldn't get nsIWebBrowser.\n");
return rv;
}
rv = NS_OK;
mWebNav = do_QueryInterface(mWebBrowser,&rv);
if(NS_FAILED(rv)){
fprintf(stdout, "Couldn't create nsIWebNavigation.\n");
return rv;
}
char* url = "http://www.google.com";
rv = NS_OK;
rv = mWebNav->LoadURI((const
PRUnichar*)url,nsIWebNavigation::LOAD_FLAGS_NONE,nsnull,nsnull,nsnull);
if(NS_FAILED(rv)){
fprintf(stdout," %x \n",rv);
fprintf(stdout, "Couldn't Load URI.\n");
return rv;
}
sleep(50);
rv = NS_OK;
nsCOMPtr<nsIDocShellTreeItem> browserAsItem = nsnull;
browserAsItem = do_QueryInterface(mWebBrowser,&rv);
if(NS_FAILED(rv)){
fprintf(stdout, "Couldn't get DocShellTreeItem.\n");
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIDocShellTreeOwner> treeOwner = nsnull;
browserAsItem->GetTreeOwner(getter_AddRefs(treeOwner));
if(!treeOwner){
fprintf(stdout, "Couldn't get DocShellTreeOwner.\n");
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIDocShellTreeItem> contentItem = nsnull;
treeOwner->GetPrimaryContentShell(getter_AddRefs(contentItem));
if(!contentItem){
fprintf(stdout, "Couldn't get DocShellContentItem.\n");
return NS_ERROR_FAILURE;
}
rv = NS_OK;
nsCOMPtr<nsIDocShell> docShell = nsnull;
docShell = do_QueryInterface(contentItem,&rv);
if(NS_FAILED(rv)){
fprintf(stdout, "Couldn't get DocShell.\n");
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIEmbeddingSiteWindow> nsWebBrowserChromeUI;
nsWebBrowserChromeUI =
NS_STATIC_CAST(nsIEmbeddingSiteWindow*,webBrowserChrome);
GtkWidget* window;
nsWebBrowserChromeUI->GetSiteWindow((void**)&window);
gtk_widget_show_all(window);
gtk_main();
rv = NS_OK;
rv = NS_TermEmbedding();
if(NS_FAILED(rv)){
fprintf(stdout, "Couldn't terminate XPCOM.\n");
exit(1);
}
fprintf(stdout,"---------Life Sucks---------\n");
return 0;
}
--
View this message in context:
http://www.nabble.com/Embedding-gecko-on-linux-gtk-help-tf3802605.html#a10759536
Sent from the Mozilla - Embedding mailing list archive at Nabble.com.
_______________________________________________
dev-embedding mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-embedding