Open main menu

CDOT Wiki β

Mozilla.dev.embedding

Newsgroup

Authors

  1. Cesar

Notice

There is already an embedding FAQ on mozilla that probably wasn't properly linked in with Mozilla's FAQ page. Instead, I am going to make a list of asked questions on this page and mozilla can put it into their FAQ at their discretion.

Important GtkMozEmbed 1.9 information

Timeless has become the new owner of GtkMozEmbed. You can read about some of the changes here

FAQ

How to start Embedding

You can find a examples, FAQs, and the API from mozilla itself.
You can get more detailed information on what interfaces are required and which are optional to impelement here. Scroll down to "Initalization and Teardown.

How to customize document retrieval

One method is to implement your own protocol method. You can find more information on adding new protocols here

How to embedding mozilla inside of Java

There hasn't been any good code examples found. However, there is a stripped down, uncommented code with eclipse libraries in this thread. Here is the code :

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.MozillaBrowser;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.mozilla.xpcom.nsIDOMDocument;

public class Test {
        public static void main(String args[]) {
                Display display = new Display();
                Shell shell = new Shell(display);

                final MozillaBrowser browser = new MozillaBrowser(shell,WT.BORDER);
                browser.setUrl("http://www.google.com");
                browser.addProgressListener(new ProgressListener() {
                        public void changed(ProgressEvent event) {
                        }

                        public void completed(ProgressEvent event) {
                            nsIDOMDocument doc = browser.getDocument();
                                System.out.println(doc);
                        }
                });

                while (!shell.isDisposed()) {
                        if (!display.readAndDispatch()) {
                                display.sleep();
                        }
                }
        }

How to map a Javascript function to a C++ function

Define an XPCOM class defining the function you'll be doing in javascript. Then pass the object to your XPCOM coded object and call it from C++. You can find a better quality answer repeated and with an example in this newsgroup thread.

nsIPromptService with secure sites

The problem is getting "Security Error: Domain Name Mismatch" when visting certain secure sites. You get no text and no functionality. There are two possible solutions to this error.

  1. The Dialog is not handled by the prompt service. You must implement another interface (for example, nsIBadCertListener)
  2. The original dialog does not work correctly because your application is not handling chrome correctly. Here are some things other people have used to solve their problems :
    • This will get the text in the security popup and allow you to view the certificate¬†:
      In the nsIWindowCreator::CreateChromeWindow() implementation, change the doc shell tree item's type to nsIDocShellTreeItem::typeChromeWrapper to nsIDocShellTreeItem::typeContentWrapper to view the certificate. You can nsIWebBrowserChrome::CHROME_OPENAS_CHROME to check when to use typeChromeWrapper and typeContentWrapper
    • This will tell the browser to progress to the secure site

:nsCOMPtr<nsIJSContextStack> stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1"));
if (stack && NS_SUCCEEDED(stack->Push(nsnull))) {
  /* Display the modal window here */
  JSContext* cx;
  stack->Pop(&cx);
}

How to control what is, and what is not, loaded

Some people have complained that nsIURIContentListener::OnStartURIOpen() is not called for logos (images) and CSS. This is because you must use nsIContentPolicy.

What is winEmbed?

It is the window class associated with the mozilla custom control.

How can I use the new nsIWindowProvider in Mozilla 1.8.1?

If you have SetWebBrowserChrome on the tree owner, just implement the nsIInterfaceRequestor on that object and call the GetInterface implementation, which returns an nsIwindowsProvider.

This was marked as a good example, but no line number was given.

How do I save HTML as an image

There is a test application that allows you to take a snapshot of rendered HTML and save it as an image. The program and code is available here

Why does TestGTKEmbed give an error message when I download something and 'save as/ open with' pops up?

You have to implement your own download UI as gtkmozembed doesn't have one. Alternatively, you can download files using nsIWebBrowserPersist if UI isn't a concern.

How to rebuild tests in only part of the Mozilla Suite

Go into the folder where the tests are found and issue make. If you built mozilla with an object directory, you must change into that directory into there first.

How do I render strings provided by the user?

use the nsIWebBrowserStream. You can get it by a do_QueryInterface() on the nsIWebBrowser you use. Look at the file embedding/browser/gtk/src/EmbedPrivate.cpp and the methods OpenStream(), AppendToStream(), and CloseStream() to get sample implementations

Is there any support for the Firefox XPI extensions in gtkmozembed?

No. It is not planned for the future.

Why does mfcembed crash when accessing secure sites?

There may be multiple solutions to this problem. One possible solution is that you tried to use nss without probing it first to initialize itself.