diff options
author | Marco Pesenti Gritti <marco@gnome.org> | 2003-10-28 00:39:50 +0800 |
---|---|---|
committer | Marco Pesenti Gritti <marco@src.gnome.org> | 2003-10-28 00:39:50 +0800 |
commit | 03518bcc5c5aa9a9149315e932f84a0aee2d44ce (patch) | |
tree | ee8ca665c481ecfa6c3e59a68a3abf59e4e91523 /embed/mozilla/EphyBrowser.cpp | |
parent | 971cc4759cceb6a5842bf4d2016eb5c8e71896a8 (diff) | |
download | gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.tar gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.tar.gz gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.tar.bz2 gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.tar.lz gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.tar.xz gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.tar.zst gsoc2013-epiphany-03518bcc5c5aa9a9149315e932f84a0aee2d44ce.zip |
Solving the wrapper mess Episode 3. Rename to EphyBrowser and add sanity
2003-10-27 Marco Pesenti Gritti <marco@gnome.org>
* embed/mozilla/EphyBrowser.cpp:
* embed/mozilla/EphyBrowser.h:
* embed/mozilla/EphyWrapper.cpp:
* embed/mozilla/EphyWrapper.h:
* embed/mozilla/EventContext.cpp:
* embed/mozilla/EventContext.h:
* embed/mozilla/Makefile.am:
* embed/mozilla/mozilla-embed-persist.cpp:
* embed/mozilla/mozilla-embed.cpp:
* embed/mozilla/mozilla-embed.h:
Solving the wrapper mess Episode 3.
Rename to EphyBrowser and add sanity checks.
GtkMozEmbed initialize the browser on realize, that
means until that we shouldnt use most of the EphyBrowser
methods. I'm quite sure there are not such cases in
current implementation, otherwise we would have had
problems also before. Though better avoid problems
in the future.
Diffstat (limited to 'embed/mozilla/EphyBrowser.cpp')
-rw-r--r-- | embed/mozilla/EphyBrowser.cpp | 739 |
1 files changed, 739 insertions, 0 deletions
diff --git a/embed/mozilla/EphyBrowser.cpp b/embed/mozilla/EphyBrowser.cpp new file mode 100644 index 000000000..f23f7163a --- /dev/null +++ b/embed/mozilla/EphyBrowser.cpp @@ -0,0 +1,739 @@ +/* + * Copyright (C) 2000-2003 Marco Pesenti Gritti + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "EphyBrowser.h" +#include "GlobalHistory.h" +#include "ephy-embed.h" +#include "ephy-string.h" + +#include <gtkmozembed_internal.h> +#include <unistd.h> + +#include "nsIDocCharset.h" +#include "nsICommandManager.h" +#include "nsIContentViewer.h" +#include "nsIGlobalHistory.h" +#include "nsIDocShellHistory.h" +#include "nsIWebBrowserFind.h" +#include "nsIWebBrowserFocus.h" +#include "nsIDocument.h" +#include "nsISHEntry.h" +#include "nsISHistoryInternal.h" +#include "nsIHistoryEntry.h" +#include "nsIWebBrowserPrint.h" +#include "nsIURI.h" +#include "nsIMarkupDocumentViewer.h" +#include "nsIComponentManager.h" +#include "nsIScriptGlobalObject.h" +#include "nsIDOMWindowInternal.h" +#include "nsIInterfaceRequestor.h" +#include "nsIFocusController.h" +#include "nsIWebBrowserPersist.h" +#include "nsCWebBrowserPersist.h" +#include "nsNetUtil.h" +#include "nsIChromeEventHandler.h" +#include "nsIDOMDocumentStyle.h" +#include "nsIDocShellTreeItem.h" +#include "nsIDocShellTreeNode.h" +#include "nsIDocShellTreeOwner.h" +#include "nsIHTMLContentContainer.h" +#include "nsICSSLoader.h" +#include "nsICSSStyleSheet.h" +#include "nsICSSLoaderObserver.h" +#include "nsIStyleSet.h" +#include "nsIDocumentObserver.h" +#include "nsCWebBrowser.h" +#include "nsReadableUtils.h" +#include "nsUnicharUtils.h" +#include "nsIDOMNSHTMLDocument.h" +#include "nsIDOMHTMLDocument.h" +#include "nsIDOMHTMLCollection.h" +#include "nsIDOMHTMLElement.h" +#include "nsIDeviceContext.h" +#include "nsIPresContext.h" +#include "nsIAtom.h" +#include "nsIDocumentCharsetInfo.h" +#include "nsPromiseFlatString.h" +#include "ContentHandler.h" +#include "EphyEventListener.h" + +EphyBrowser::EphyBrowser () +{ + mEventListener = nsnull; + mEventReceiver = nsnull; +} + +EphyBrowser::~EphyBrowser () +{ +} + +nsresult EphyBrowser::Init (GtkMozEmbed *mozembed) +{ + mGtkMozEmbed = mozembed; + + gtk_moz_embed_get_nsIWebBrowser (mozembed, + getter_AddRefs(mWebBrowser)); + if (!mWebBrowser) return NS_ERROR_FAILURE; + + return mWebBrowser->GetContentDOMWindow (getter_AddRefs (mDOMWindow)); +} + +nsresult EphyBrowser::InitDocument () +{ + nsresult rv; + + mEventListener = new EphyEventListener(); + + rv = mEventListener->Init (EPHY_EMBED (mGtkMozEmbed)); + if (NS_FAILED (rv)) return NS_ERROR_FAILURE; + + rv = GetListener(); + if (NS_FAILED (rv)) return NS_ERROR_FAILURE; + + return AttachListeners(); +} + +nsresult +EphyBrowser::GetListener (void) +{ + if (mEventReceiver) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDOMWindow> domWindowExternal; + mWebBrowser->GetContentDOMWindow(getter_AddRefs(domWindowExternal)); + + nsCOMPtr<nsIDOMWindowInternal> domWindow; + domWindow = do_QueryInterface(domWindowExternal); + + nsCOMPtr<nsPIDOMWindow> piWin(do_QueryInterface(domWindow)); + if (!piWin) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIChromeEventHandler> chromeHandler; + piWin->GetChromeEventHandler(getter_AddRefs(chromeHandler)); + + mEventReceiver = do_QueryInterface(chromeHandler); + if (!mEventReceiver) return NS_ERROR_FAILURE; + + return NS_OK; +} + +nsresult +EphyBrowser::AttachListeners(void) +{ + if (!mEventReceiver) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDOMEventTarget> target; + target = do_QueryInterface (mEventReceiver); + + return target->AddEventListener(NS_LITERAL_STRING("DOMLinkAdded"), + mEventListener, PR_FALSE); +} + +nsresult +EphyBrowser::DetachListeners(void) +{ + if (!mEventReceiver) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDOMEventTarget> target; + target = do_QueryInterface (mEventReceiver); + + return target->RemoveEventListener(NS_LITERAL_STRING("DOMLinkAdded"), + mEventListener, PR_FALSE); +} + +nsresult EphyBrowser::Print (nsIPrintSettings *options, PRBool preview) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(mWebBrowser, &result)); + if (NS_FAILED(result) || !print) return NS_ERROR_FAILURE; + + if (!preview) + { + result = print->Print (options, nsnull); + } + else + { + result = print->PrintPreview(options, nsnull, nsnull); + } + + return result; +} + +nsresult EphyBrowser::PrintPreviewClose (void) +{ + nsresult rv; + PRBool isPreview = PR_FALSE; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(mWebBrowser, &rv)); + if (NS_FAILED(rv) || !print) return NS_ERROR_FAILURE; + + rv = print->GetDoingPrintPreview(&isPreview); + if (NS_SUCCEEDED (rv) && isPreview == PR_TRUE) + { + rv = print->ExitPrintPreview(); + } + + return rv; +} + +nsresult EphyBrowser::PrintPreviewNumPages (int *numPages) +{ + nsresult rv; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(mWebBrowser, &rv)); + if (NS_FAILED(rv) || !print) return NS_ERROR_FAILURE; + + rv = print->GetPrintPreviewNumPages(numPages); + return rv; +} + +nsresult EphyBrowser::PrintPreviewNavigate(PRInt16 navType, PRInt32 pageNum) +{ + nsresult rv; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(mWebBrowser, &rv)); + if (NS_FAILED(rv) || !print) return NS_ERROR_FAILURE; + + rv = print->PrintPreviewNavigate(navType, pageNum); + return rv; +} + +nsresult EphyBrowser::GetPrintSettings (nsIPrintSettings **options) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserPrint> print(do_GetInterface(mWebBrowser, &result)); + if (NS_FAILED(result) || !print) return NS_ERROR_FAILURE; + + return print->GetGlobalPrintSettings(options); +} + +nsresult EphyBrowser::GetSHistory (nsISHistory **aSHistory) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebNavigation> ContentNav = do_QueryInterface (mWebBrowser); + if (!ContentNav) return NS_ERROR_FAILURE; + + nsCOMPtr<nsISHistory> SessionHistory; + result = ContentNav->GetSessionHistory (getter_AddRefs (SessionHistory)); + if (!SessionHistory) return NS_ERROR_FAILURE; + + *aSHistory = SessionHistory.get(); + NS_IF_ADDREF (*aSHistory); + + return NS_OK; +} + +nsresult EphyBrowser::Destroy () +{ + DetachListeners (); + + mWebBrowser = nsnull; + + return NS_OK; +} + +nsresult EphyBrowser::GoToHistoryIndex (PRInt16 index) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebNavigation> ContentNav = do_QueryInterface (mWebBrowser); + if (!ContentNav) return NS_ERROR_FAILURE; + + return ContentNav->GotoIndex (index); +} + +nsresult EphyBrowser::SetZoom (float aZoom, PRBool reflow) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + if (reflow) + { + nsCOMPtr<nsIContentViewer> contentViewer; + result = GetContentViewer (getter_AddRefs(contentViewer)); + if (!NS_SUCCEEDED (result) || !contentViewer) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIMarkupDocumentViewer> mdv = do_QueryInterface(contentViewer, + &result); + if (NS_FAILED(result) || !mdv) return NS_ERROR_FAILURE; + + return mdv->SetTextZoom (aZoom); + } + else + { + nsCOMPtr<nsIDocShell> DocShell; + DocShell = do_GetInterface (mWebBrowser); + if (!DocShell) return NS_ERROR_FAILURE; + + SetZoomOnDocshell (aZoom, DocShell); + + nsCOMPtr<nsIDocShellTreeNode> docShellNode(do_QueryInterface(DocShell)); + if (docShellNode) + { + PRInt32 i; + PRInt32 n; + docShellNode->GetChildCount(&n); + for (i=0; i < n; i++) + { + nsCOMPtr<nsIDocShellTreeItem> child; + docShellNode->GetChildAt(i, getter_AddRefs(child)); + nsCOMPtr<nsIDocShell> childAsShell(do_QueryInterface(child)); + if (childAsShell) + { + return SetZoomOnDocshell (aZoom, childAsShell); + } + } + } + } + + return NS_OK; +} + +nsresult EphyBrowser::SetZoomOnDocshell (float aZoom, nsIDocShell *DocShell) +{ + nsresult result; + + nsCOMPtr<nsIPresContext> PresContext; + result = DocShell->GetPresContext (getter_AddRefs(PresContext)); + if (NS_FAILED(result) || !PresContext) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDeviceContext> DeviceContext; + result = PresContext->GetDeviceContext (getter_AddRefs(DeviceContext)); + if (NS_FAILED(result) || !DeviceContext) return NS_ERROR_FAILURE; + + return DeviceContext->SetTextZoom (aZoom); +} + +nsresult EphyBrowser::GetContentViewer (nsIContentViewer **aViewer) +{ + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIDocShell> ourDocShell(do_GetInterface(mWebBrowser)); + NS_ENSURE_TRUE(ourDocShell, NS_ERROR_FAILURE); + return ourDocShell->GetContentViewer(aViewer); +} + +nsresult EphyBrowser::GetZoom (float *aZoom) +{ + nsresult result; + + nsCOMPtr<nsIContentViewer> contentViewer; + result = GetContentViewer (getter_AddRefs(contentViewer)); + if (!NS_SUCCEEDED (result) || !contentViewer) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIMarkupDocumentViewer> mdv = do_QueryInterface(contentViewer, + &result); + if (NS_FAILED(result) || !mdv) return NS_ERROR_FAILURE; + + return mdv->GetTextZoom (aZoom); +} + +nsresult EphyBrowser::GetDocument (nsIDOMDocument **aDOMDocument) +{ + return mDOMWindow->GetDocument (aDOMDocument); +} + +nsresult EphyBrowser::GetTargetDocument (nsIDOMDocument **aDOMDocument) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + /* Use the current target document */ + if (mTargetDocument) + { + *aDOMDocument = mTargetDocument.get(); + + NS_IF_ADDREF(*aDOMDocument); + + return NS_OK; + } + + /* Use the focused document */ + nsCOMPtr<nsIWebBrowserFocus> webBrowserFocus; + webBrowserFocus = do_QueryInterface (mWebBrowser); + if (!webBrowserFocus) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDOMWindow> DOMWindow; + result = webBrowserFocus->GetFocusedWindow (getter_AddRefs(DOMWindow)); + if (NS_SUCCEEDED(result) && DOMWindow) + { + return DOMWindow->GetDocument (aDOMDocument); + } + + /* Use the main document */ + return mDOMWindow->GetDocument (aDOMDocument); +} + +nsresult EphyBrowser::GetSHInfo (PRInt32 *count, PRInt32 *index) +{ + nsresult result; + + nsCOMPtr<nsISHistory> SessionHistory; + result = GetSHistory (getter_AddRefs(SessionHistory)); + if (NS_FAILED(result) || ! SessionHistory) return NS_ERROR_FAILURE; + + SessionHistory->GetCount (count); + SessionHistory->GetIndex (index); + + return NS_OK; +} + +nsresult EphyBrowser::GetSHTitleAtIndex (PRInt32 index, PRUnichar **title) +{ + nsresult result; + + nsCOMPtr<nsISHistory> SessionHistory; + result = GetSHistory (getter_AddRefs(SessionHistory)); + if (NS_FAILED(result) || ! SessionHistory) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIHistoryEntry> he; + result = SessionHistory->GetEntryAtIndex (index, PR_FALSE, + getter_AddRefs (he)); + if (!NS_SUCCEEDED(result) || (!he)) return NS_ERROR_FAILURE; + + result = he->GetTitle (title); + if (!NS_SUCCEEDED(result) || (!title)) return NS_ERROR_FAILURE; + + return NS_OK; +} + +nsresult EphyBrowser::GetSHUrlAtIndex (PRInt32 index, nsCString &url) +{ + nsresult result; + + nsCOMPtr<nsISHistory> SessionHistory; + result = GetSHistory (getter_AddRefs(SessionHistory)); + if (NS_FAILED(result) || ! SessionHistory) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIHistoryEntry> he; + result = SessionHistory->GetEntryAtIndex (index, PR_FALSE, + getter_AddRefs (he)); + if (NS_FAILED(result) || (!he)) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIURI> uri; + result = he->GetURI (getter_AddRefs(uri)); + if (NS_FAILED(result) || (!uri)) return NS_ERROR_FAILURE; + + result = uri->GetSpec(url); + if (NS_FAILED(result) || url.IsEmpty()) return NS_ERROR_FAILURE; + + return NS_OK; +} + +nsresult EphyBrowser::FindSetProperties (const PRUnichar *search_string, + PRBool case_sensitive, + PRBool wrap_around) +{ + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserFind> finder (do_GetInterface(mWebBrowser)); + + finder->SetSearchString (search_string); + finder->SetMatchCase (case_sensitive); + finder->SetWrapFind (wrap_around); + + return NS_OK; +} + +nsresult EphyBrowser::Find (PRBool backwards, + PRBool *didFind) +{ + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebBrowserFind> finder (do_GetInterface(mWebBrowser)); + + finder->SetFindBackwards (backwards); + + return finder->FindNext(didFind); +} + +nsresult EphyBrowser::LoadDocument(nsISupports *aPageDescriptor, + PRUint32 aDisplayType) +{ + nsresult rv; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebNavigation> wn; + wn = do_QueryInterface (mWebBrowser); + if (!wn) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIWebPageDescriptor> wpd = do_QueryInterface(wn, &rv); + if (!wpd || !NS_SUCCEEDED(rv)) return NS_ERROR_FAILURE; + + return wpd->LoadPage(aPageDescriptor, aDisplayType); +} + +nsresult EphyBrowser::GetPageDescriptor(nsISupports **aPageDescriptor) +{ + nsresult rv; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIWebNavigation> wn; + wn = do_QueryInterface (mWebBrowser); + if (!wn) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIWebPageDescriptor> wpd = do_QueryInterface(wn, &rv); + if (!wpd || !NS_SUCCEEDED(rv)) return NS_ERROR_FAILURE; + + return wpd->GetCurrentDescriptor(aPageDescriptor); +} + +nsresult EphyBrowser::GetDocumentUrl (nsCString &url) +{ + nsresult result; + + nsCOMPtr<nsIDOMDocument> DOMDocument; + + result = mDOMWindow->GetDocument (getter_AddRefs(DOMDocument)); + if (NS_FAILED(result) || !DOMDocument) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDocument> doc = do_QueryInterface(DOMDocument); + if(!doc) return NS_ERROR_FAILURE; + +#if MOZILLA_SNAPSHOT > 11 + nsIURI *uri; + uri = doc->GetDocumentURL (); +#else + nsCOMPtr<nsIURI> uri; + doc->GetDocumentURL(getter_AddRefs(uri)); +#endif + + return uri->GetSpec (url); +} + +nsresult EphyBrowser::GetTargetDocumentUrl (nsCString &url) +{ + nsresult result; + + nsCOMPtr<nsIDOMDocument> DOMDocument; + + result = GetTargetDocument (getter_AddRefs(DOMDocument)); + if (NS_FAILED(result) || !DOMDocument) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDocument> doc = do_QueryInterface(DOMDocument); + if(!doc) return NS_ERROR_FAILURE; + +#if MOZILLA_SNAPSHOT > 11 + nsIURI *uri; + uri = doc->GetDocumentURL (); +#else + nsCOMPtr<nsIURI> uri; + doc->GetDocumentURL(getter_AddRefs(uri)); +#endif + + uri->GetSpec (url); + + return NS_OK; +} + +nsresult EphyBrowser::ForceEncoding (const char *encoding) +{ + nsresult result; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + nsCOMPtr<nsIDocShell> docShell; + docShell = do_GetInterface (mWebBrowser); + if (!docShell) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDocCharset> docCharset; + docCharset = do_QueryInterface (docShell); + + result = docCharset->SetCharset (encoding); + + return result; +} + +nsresult EphyBrowser::PushTargetDocument (nsIDOMDocument *domDoc) +{ + mTargetDocument = domDoc; + + return NS_OK; +} + +nsresult EphyBrowser::PopTargetDocument () +{ + mTargetDocument = nsnull; + + return NS_OK; +} + +nsresult EphyBrowser::GetEncodingInfo (EphyEncodingInfo **infoptr) +{ + nsresult result; + EphyEncodingInfo *info; + + nsCOMPtr<nsIDOMDocument> domDoc; + result = GetTargetDocument (getter_AddRefs(domDoc)); + if (NS_FAILED (result) || !domDoc) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc, &result); + if (NS_FAILED (result) || !doc) return NS_ERROR_FAILURE; + + info = g_new0 (EphyEncodingInfo, 1); + *infoptr = info; + + PRInt32 source; +#if MOZILLA_SNAPSHOT > 11 + source = doc->GetDocumentCharacterSetSource (); +#else + result = doc->GetDocumentCharacterSetSource (&source); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; +#endif + info->encoding_source = (EphyEncodingSource) source; + + nsCOMPtr<nsIDocShell> ds; + ds = do_GetInterface (mWebBrowser); + if (!ds) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIDocumentCharsetInfo> ci; + result = ds->GetDocumentCharsetInfo (getter_AddRefs (ci)); + if (NS_FAILED(result) || !ci) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIAtom> atom; + result = ci->GetForcedCharset (getter_AddRefs (atom)); + if (NS_FAILED(result)) return NS_ERROR_FAILURE; + if (atom) + { + nsCAutoString atomstr; + atom->ToUTF8String (atomstr); + info->forced_encoding = g_strdup (atomstr.get()); + } + + result = ci->GetParentCharset (getter_AddRefs (atom)); + if (NS_FAILED(result)) return NS_ERROR_FAILURE; + if (atom) + { + nsCAutoString atomstr; + atom->ToUTF8String (atomstr); + info->parent_encoding = g_strdup (atomstr.get()); + } + + result = ci->GetParentCharsetSource (&source); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->parent_encoding_source = (EphyEncodingSource) source; + + nsCOMPtr<nsIContentViewer> contentViewer; + result = ds->GetContentViewer (getter_AddRefs(contentViewer)); + if (!NS_SUCCEEDED (result) || !contentViewer) return NS_ERROR_FAILURE; + + nsCOMPtr<nsIMarkupDocumentViewer> mdv = do_QueryInterface(contentViewer, + &result); + if (NS_FAILED(result) || !mdv) return NS_ERROR_FAILURE; + +#if MOZILLA_SNAPSHOT > 11 + const nsACString& charsetEnc = doc->GetDocumentCharacterSet (); + if (charsetEnc.IsEmpty()) return NS_ERROR_FAILURE; + + info->encoding = g_strdup (PromiseFlatCString(charsetEnc).get()); +#elif MOZILLA_SNAPSHOT >= 10 + nsCAutoString charsetEnc; + result = doc->GetDocumentCharacterSet (charsetEnc); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + + info->encoding = g_strdup (charsetEnc.get()); +#else + nsAutoString charsetEnc; + result = doc->GetDocumentCharacterSet (charsetEnc); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + + info->encoding = g_strdup (NS_ConvertUCS2toUTF8(charsetEnc).get()); +#endif + +#if MOZILLA_SNAPSHOT >= 10 + nsCAutoString enc; + + result = mdv->GetDefaultCharacterSet (enc); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->default_encoding = g_strdup (enc.get()); + + result = mdv->GetForceCharacterSet (enc); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->forced_encoding = g_strdup (enc.get()); + + result = mdv->GetHintCharacterSet (enc); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->hint_encoding = g_strdup (enc.get()); + + result = mdv->GetPrevDocCharacterSet (enc); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->prev_doc_encoding = g_strdup (enc.get()); +#else + PRUnichar *str; + + result = mdv->GetDefaultCharacterSet (&str); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->default_encoding = g_strdup (NS_ConvertUCS2toUTF8(str).get()); + + result = mdv->GetForceCharacterSet (&str); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->forced_encoding = g_strdup (NS_ConvertUCS2toUTF8(str).get()); + + result = mdv->GetHintCharacterSet (&str); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->hint_encoding = g_strdup (NS_ConvertUCS2toUTF8(str).get()); + + result = mdv->GetPrevDocCharacterSet (&str); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->prev_doc_encoding = g_strdup (NS_ConvertUCS2toUTF8(str).get()); +#endif + + mdv->GetHintCharacterSetSource (&source); + if (NS_FAILED (result)) return NS_ERROR_FAILURE; + info->hint_encoding_source = (EphyEncodingSource) source; + + return NS_OK; +} + +nsresult EphyBrowser::DoCommand (const char *command) +{ + nsCOMPtr<nsICommandManager> cmdManager; + + g_return_val_if_fail (mWebBrowser, NS_ERROR_FAILURE); + + cmdManager = do_GetInterface (mWebBrowser); + if (!cmdManager) return NS_ERROR_FAILURE; + + return cmdManager->DoCommand (command, nsnull, nsnull); +} |