Newsgroup
Authors
- 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.
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.
- The Dialog is not handled by the prompt service. You must implement another interface (for example, nsIBadCertListener)
- 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
- This will get the text in the security popup and allow you to view the certificate :
: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.