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

Reply via email to