Embedding/NewApi/XpcomAccess

Access to underlying XPCOM API

MozView provides a GetInterfaceRequestor() method for accessing the underlying API. This returns an InterfaceRequestor which you can use to get access to the XPCOM object you need.

NOTE: currently it is the InterfaceRequestor from nsIWebBrowser which is returned and thus the interfaces from that which is accessible.

DOM access sample

Here is a small example of using this for DOM access. You could e.g. call this code as response to the DocumentLoaded method of MozViewListener.

  // pointer to your MozView
  MozView* pMozView;
  ...
  nsCOMPtr<nsIInterfaceRequestor> requestor;
  pMozView->GetInterfaceRequestor(getter_AddRefs(requestor));
  nsCOMPtr<nsIDOMDocument> doc = do_GetInterface(requestor);

Gets a nsIDOMDocument from the MozView

  nsCOMPtr<nsIDOMHTMLDocument> htmldoc = do_QueryInterface(doc);

Use QI to get the nsIDOMHTMLDocument. Note, that we can't do this directly from the InterfaceRequestor as it will only give us the nsIDOMDocument.

  if (htmldoc)
  {
    nsCOMPtr<nsIDOMNode> retval;
    nsCOMPtr<nsIDOMHTMLElement> body;
    htmldoc->GetBody(getter_AddRefs(body));
    nsCOMPtr<nsIDOMElement> newdiv;
    doc->CreateElement(NS_LITERAL_STRING("div"), getter_AddRefs(newdiv));
    nsCOMPtr<nsIDOMElement> newhr;
    doc->CreateElement(NS_LITERAL_STRING("hr"), getter_AddRefs(newhr));
    newdiv->AppendChild(newhr, getter_AddRefs(retval));
    nsCOMPtr<nsIDOMText> text;
    doc->CreateTextNode(NS_LITERAL_STRING("Provided by MozEmbed"), getter_AddRefs(text));
    newdiv->AppendChild(text, getter_AddRefs(retval));
    body->AppendChild(newdiv, getter_AddRefs(retval));
  }

If we get a valid nsIDOMHTMLDocument, use it to append a div to the body containing a hr and some text.