extern "C" char * mozilla_get_content_type (EphyEmbed *embed) { nsCOMPtr<nsIWebBrowser> browser; gtk_moz_embed_get_nsIWebBrowser (GTK_MOZ_EMBED (embed), getter_AddRefs (browser)); NS_ENSURE_TRUE (browser, NULL); nsCOMPtr<nsIDOMWindow> dom_window; browser->GetContentDOMWindow (getter_AddRefs (dom_window)); NS_ENSURE_TRUE (dom_window, NULL); nsCOMPtr<nsIDOMDocument> doc; dom_window->GetDocument (getter_AddRefs (doc)); NS_ENSURE_TRUE (doc, NULL); nsCOMPtr<nsIDOMNSDocument> ns_doc = do_QueryInterface (doc); NS_ENSURE_TRUE (ns_doc, NULL); nsresult rv; nsString contentType; rv = ns_doc->GetContentType (contentType); nsCString cType; NS_UTF16ToCString (contentType, NS_CSTRING_ENCODING_UTF8, cType); return g_strdup (cType.get()); }
extern "C" char * mozilla_get_doctype (EphyEmbed *embed) { nsCOMPtr<nsIWebBrowser> browser; gtk_moz_embed_get_nsIWebBrowser (GTK_MOZ_EMBED (embed), getter_AddRefs (browser)); NS_ENSURE_TRUE (browser, NULL); nsCOMPtr<nsIDOMWindow> dom_window; browser->GetContentDOMWindow (getter_AddRefs (dom_window)); NS_ENSURE_TRUE (dom_window, NULL); nsCOMPtr<nsIDOMDocument> doc; dom_window->GetDocument (getter_AddRefs (doc)); NS_ENSURE_TRUE (doc, NULL); nsCOMPtr<nsIDOMDocumentType> doctype; doc->GetDoctype (getter_AddRefs (doctype)); NS_ENSURE_TRUE (doctype, NULL); nsresult rv; nsString name; rv = doctype->GetPublicId (name); NS_ENSURE_SUCCESS (rv, NULL); nsCString cName; NS_UTF16ToCString (name, NS_CSTRING_ENCODING_UTF8, cName); return g_strdup (cName.get()); }
static nsresult do_command(GtkMozEmbed *embed, const char *command) { nsCOMPtr<nsIWebBrowser> webBrowser; nsCOMPtr<nsICommandManager> cmdManager; gtk_moz_embed_get_nsIWebBrowser(embed, getter_AddRefs(webBrowser)); cmdManager = do_GetInterface(webBrowser); return cmdManager->DoCommand(command, nsnull, nsnull); }
extern "C" void gecko_utils_set_zoom(GtkMozEmbed *embed, gfloat zoom) { nsCOMPtr<nsIWebBrowser> webBrowser; nsCOMPtr<nsIDOMWindow> domWindow; gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(embed), getter_AddRefs(webBrowser)); webBrowser->GetContentDOMWindow(getter_AddRefs(domWindow)); if (!domWindow) { g_warning("Could not get DOMWindow."); return; } domWindow->SetTextZoom(zoom); }
extern "C" void gecko_set_zoom (GtkWidget *moz, gfloat zoom) { nsCOMPtr<nsIWebBrowser> mWebBrowser; nsCOMPtr<nsIDOMWindow> mDOMWindow; gtk_moz_embed_get_nsIWebBrowser( (GtkMozEmbed *)moz, getter_AddRefs (mWebBrowser)); if (NULL == mWebBrowser) { g_warning ("gecko_set_zoom(): Could not retrieve browser..."); return; } mWebBrowser->GetContentDOMWindow(getter_AddRefs (mDOMWindow)); if (NULL == mDOMWindow) { g_warning ("gecko_set_zoom(): Could not retrieve DOM window..."); return; } mDOMWindow->SetTextZoom (zoom); }
void HandleSocketMessage(gpointer data, gpointer user_data) { int instance, type; char mMsgBuf[1024]; char *msg = (char *)data; int i = sscanf(msg, "%d,%d,%s", &instance, &type, mMsgBuf); NS_ASSERTION(i >= 2, "Wrong message format\n"); // In case that the last message string argument contains spaces, sscanf // returns before the first space. Below line returns the complete message // string. char* mMsgString = (char*)strchr(msg, ','); mMsgString++; mMsgString = (char*)strchr(mMsgString, ','); mMsgString++; GtkBrowser *pBrowser; switch (type) { case JEVENT_INIT: break; case JEVENT_CREATEWINDOW: { // only create new browser window when the instance does not exist if (instance < gBrowserArray.GetSize() && gBrowserArray[instance] != NULL) break; if (i != 3) break; int javaXId = atoi(mMsgString); NS_ASSERTION(javaXId, "Invalid X window handle\n"); pBrowser = g_new0(GtkBrowser, 1); pBrowser->topLevelWindow = gtk_plug_new(javaXId); pBrowser->mozEmbed = gtk_moz_embed_new(); if (pBrowser->mozEmbed) { gtk_container_add(GTK_CONTAINER(pBrowser->topLevelWindow), pBrowser->mozEmbed); install_mozembed_cb(pBrowser); gtk_moz_embed_set_chrome_mask(GTK_MOZ_EMBED(pBrowser->mozEmbed), GTK_MOZ_EMBED_FLAG_DEFAULTCHROME); gtk_widget_realize(pBrowser->topLevelWindow); gtk_widget_show_all(pBrowser->topLevelWindow); pBrowser->id = instance; gBrowserArray.SetAtGrow(instance, pBrowser); SendSocketMessage(instance, CEVENT_INIT_WINDOW_SUCC); } gtk_signal_connect(GTK_OBJECT(pBrowser->topLevelWindow), "set-focus", GTK_SIGNAL_FUNC(set_focus_cb), pBrowser); } break; case JEVENT_DESTROYWINDOW: pBrowser = (GtkBrowser *)gBrowserArray[instance]; if(pBrowser != NULL){ gtk_widget_destroy(pBrowser->mozEmbed); gtk_object_destroy((GtkObject *)pBrowser->topLevelWindow); gBrowserArray.SetAt(instance, NULL); } SendSocketMessage(instance, CEVENT_DISTORYWINDOW_SUCC); break; case JEVENT_SHUTDOWN: gtk_main_quit(); break; case JEVENT_SET_BOUNDS: { NS_ASSERTION(i == 3, "Wrong message format\n"); int x, y, w, h; i = sscanf(mMsgString, "%d,%d,%d,%d", &x, &y, &w, &h); if (i == 4) { pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); gtk_widget_set_usize(pBrowser->topLevelWindow, w, h); } } break; case JEVENT_NAVIGATE: NS_ASSERTION(i == 3, "Wrong message format\n"); pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); gtk_moz_embed_load_url(GTK_MOZ_EMBED(pBrowser->mozEmbed), mMsgString); break; case JEVENT_NAVIGATE_POST: NS_ASSERTION(i == 3, "Wrong message format\n"); strncpy(gCachedURL, mMsgString, sizeof(gCachedURL)); break; case JEVENT_NAVIGATE_POSTDATA: NS_ASSERTION(i == 3, "Wrong message format\n"); pBrowser = (GtkBrowser *)gBrowserArray[instance]; OpenURL(pBrowser, gCachedURL, mMsgString, POST_HEADER); break; case JEVENT_GOBACK: pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); gtk_moz_embed_go_back(GTK_MOZ_EMBED(pBrowser->mozEmbed)); break; case JEVENT_GOFORWARD: pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); gtk_moz_embed_go_forward(GTK_MOZ_EMBED(pBrowser->mozEmbed)); break; case JEVENT_REFRESH: pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); gtk_moz_embed_reload(GTK_MOZ_EMBED(pBrowser->mozEmbed), GTK_MOZ_EMBED_FLAG_RELOADNORMAL); break; case JEVENT_STOP: pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); gtk_moz_embed_stop_load(GTK_MOZ_EMBED(pBrowser->mozEmbed)); break; case JEVENT_GETURL: { pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); nsCOMPtr<nsIWebBrowser> webBrowser; gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser)); nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser)); nsCOMPtr<nsIURI> currentURI; webNavigation->GetCurrentURI(getter_AddRefs(currentURI)); if (currentURI == NULL) SendSocketMessage(instance, CEVENT_RETURN_URL, ""); else { nsEmbedCString uriString; currentURI->GetAsciiSpec(uriString); SendSocketMessage(instance, CEVENT_RETURN_URL, uriString.get()); } } break; case JEVENT_FOCUSGAINED: case JEVENT_FOCUSLOST: { pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); if (!pBrowser->topLevelWindow) { ReportError("Top level Window is Null!\n"); break; } GtkWidget *widget = GTK_WIDGET (pBrowser->topLevelWindow); GdkEvent event; GtkWindowClass *parent_class = (GtkWindowClass*) gtk_type_class (GTK_TYPE_WINDOW); if (!widget) { ReportError("Failed to get browser's toplevel window !\n"); break; } if (!parent_class) { ReportError("Failed to get gtk window class !\n"); break; } event.focus_change.type = GDK_FOCUS_CHANGE; event.focus_change.window = widget->window; event.focus_change.send_event = TRUE; if (type == JEVENT_FOCUSGAINED) { event.focus_change.in = TRUE; GTK_WIDGET_CLASS (parent_class)->focus_in_event (widget, (GdkEventFocus *)&event); } else { event.focus_change.in = FALSE; GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, (GdkEventFocus *)&event); } } break; case JEVENT_GETCONTENT: { pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); nsCOMPtr<nsIWebBrowser> webBrowser; gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser)); nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser)); char *retStr = GetContent(webNavigation); if (retStr == NULL) SendSocketMessage(instance, CEVENT_GETCONTENT, ""); else SendSocketMessage(instance, CEVENT_GETCONTENT, retStr); } break; case JEVENT_SETCONTENT: { NS_ASSERTION(i == 3, "Wrong message format\n"); pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); nsCOMPtr<nsIWebBrowser> webBrowser; gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser)); nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser)); SetContent(webNavigation, mMsgString); } break; case JEVENT_EXECUTESCRIPT: { NS_ASSERTION(i == 3, "Wrong message format\n"); pBrowser = (GtkBrowser *)gBrowserArray[instance]; NS_ASSERTION(pBrowser, "Can't get native browser instance\n"); nsCOMPtr<nsIWebBrowser> webBrowser; gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser)); nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser)); char *retStr = ExecuteScript(webNavigation, mMsgString); if (retStr == NULL) SendSocketMessage(instance, CEVENT_EXECUTESCRIPT, ""); else SendSocketMessage(instance, CEVENT_EXECUTESCRIPT, retStr); } break; } }
void OpenURL(GtkBrowser *pBrowser, const char *pUrl, const char *pPostData, const char *pHeader) { nsresult rv; nsCOMPtr<nsIInputStream> postDataStream; nsCOMPtr<nsIInputStream> headersStream; if (pPostData) { unsigned long nSizeData = strlen(pPostData); if (nSizeData > 0) { char szCL[64]; sprintf(szCL, "Content-Length: %lu\r\n\r\n", nSizeData); unsigned long nSizeCL = strlen(szCL); unsigned long nSize = nSizeCL + nSizeData; char *tmp = (char *) nsMemory::Alloc(nSize + 1); // byte stream owns this mem if (tmp) { memcpy(tmp, szCL, nSizeCL); memcpy(tmp + nSizeCL, pPostData, nSizeData); tmp[nSize] = '\0'; nsCOMPtr<nsIStringInputStream> stream; rv = CreateInstance("@mozilla.org/io/string-input-stream;1", NS_GET_IID(nsIStringInputStream), getter_AddRefs(stream)); if (NS_FAILED(rv) || !stream) { NS_ASSERTION(0, "cannot create PostData stream"); nsMemory::Free(tmp); return; } stream->AdoptData(tmp, nSize); postDataStream = do_QueryInterface(stream); } } } if (pHeader) { unsigned long nSize = strlen(pHeader) + 1; if (nSize > 0) { char *tmp = (char *) nsMemory::Alloc(nSize); // byteArray stream owns this mem if (tmp) { memcpy(tmp, pHeader, nSize); nsCOMPtr<nsIStringInputStream> stream; rv = CreateInstance("@mozilla.org/io/string-input-stream;1", NS_GET_IID(nsIStringInputStream), getter_AddRefs(stream)); if (NS_FAILED(rv) || !stream) { NS_ASSERTION(0, "cannot create Header stream"); nsMemory::Free(tmp); return; } stream->AdoptData(tmp, nSize); headersStream = do_QueryInterface(stream); } } } nsCOMPtr<nsIWebBrowser> webBrowser; gtk_moz_embed_get_nsIWebBrowser(GTK_MOZ_EMBED(pBrowser->mozEmbed), getter_AddRefs(webBrowser)); nsCOMPtr<nsIWebNavigation> webNavigation(do_QueryInterface(webBrowser)); if (!webNavigation) return; nsEmbedString unicodeUrl; ConvertAsciiToUtf16(pUrl, unicodeUrl); webNavigation->LoadURI(unicodeUrl.get(), // URI string nsIWebNavigation::LOAD_FLAGS_NONE, // Load flags nsnull, // Refering URI postDataStream, // Post data headersStream); // Extra headers }