michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // Local Includes michael@0: #include "nsWebBrowser.h" michael@0: michael@0: // Helper Classes michael@0: #include "nsGfxCIID.h" michael@0: #include "nsWidgetsCID.h" michael@0: michael@0: //Interfaces Needed michael@0: #include "nsReadableUtils.h" michael@0: #include "nsIComponentManager.h" michael@0: #include "nsIDOMDocument.h" michael@0: #include "nsIDOMWindow.h" michael@0: #include "nsIDOMElement.h" michael@0: #include "nsIInterfaceRequestor.h" michael@0: #include "nsIInterfaceRequestorUtils.h" michael@0: #include "nsIWebBrowserChrome.h" michael@0: #include "nsPIDOMWindow.h" michael@0: #include "nsIWebProgress.h" michael@0: #include "nsIWebProgressListener.h" michael@0: #include "nsIWebBrowserFocus.h" michael@0: #include "nsIWebBrowserStream.h" michael@0: #include "nsIPresShell.h" michael@0: #include "nsIURIContentListener.h" michael@0: #include "nsISHistoryListener.h" michael@0: #include "nsIURI.h" michael@0: #include "nsIWebBrowserPersist.h" michael@0: #include "nsCWebBrowserPersist.h" michael@0: #include "nsIServiceManager.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "nsFocusManager.h" michael@0: #include "Layers.h" michael@0: #include "gfxContext.h" michael@0: #include "nsILoadContext.h" michael@0: michael@0: // for painting the background window michael@0: #include "mozilla/LookAndFeel.h" michael@0: michael@0: // Printing Includes michael@0: #ifdef NS_PRINTING michael@0: #include "nsIWebBrowserPrint.h" michael@0: #include "nsIContentViewer.h" michael@0: #endif michael@0: michael@0: // PSM2 includes michael@0: #include "nsISecureBrowserUI.h" michael@0: #include "nsXULAppAPI.h" michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::layers; michael@0: michael@0: static NS_DEFINE_CID(kChildCID, NS_CHILD_CID); michael@0: michael@0: michael@0: //***************************************************************************** michael@0: //*** nsWebBrowser: Object Management michael@0: //***************************************************************************** michael@0: michael@0: nsWebBrowser::nsWebBrowser() : mDocShellTreeOwner(nullptr), michael@0: mInitInfo(nullptr), michael@0: mContentType(typeContentWrapper), michael@0: mActivating(false), michael@0: mShouldEnableHistory(true), michael@0: mIsActive(true), michael@0: mParentNativeWindow(nullptr), michael@0: mProgressListener(nullptr), michael@0: mBackgroundColor(0), michael@0: mPersistCurrentState(nsIWebBrowserPersist::PERSIST_STATE_READY), michael@0: mPersistResult(NS_OK), michael@0: mPersistFlags(nsIWebBrowserPersist::PERSIST_FLAGS_NONE), michael@0: mStream(nullptr), michael@0: mParentWidget(nullptr), michael@0: mListenerArray(nullptr) michael@0: { michael@0: mInitInfo = new nsWebBrowserInitInfo(); michael@0: mWWatch = do_GetService(NS_WINDOWWATCHER_CONTRACTID); michael@0: NS_ASSERTION(mWWatch, "failed to get WindowWatcher"); michael@0: } michael@0: michael@0: nsWebBrowser::~nsWebBrowser() michael@0: { michael@0: InternalDestroy(); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::InternalDestroy() michael@0: { michael@0: michael@0: if (mInternalWidget) { michael@0: mInternalWidget->SetWidgetListener(nullptr); michael@0: mInternalWidget->Destroy(); michael@0: mInternalWidget = nullptr; // Force release here. michael@0: } michael@0: michael@0: SetDocShell(nullptr); michael@0: michael@0: if(mDocShellTreeOwner) michael@0: { michael@0: mDocShellTreeOwner->WebBrowser(nullptr); michael@0: NS_RELEASE(mDocShellTreeOwner); michael@0: } michael@0: if(mInitInfo) michael@0: { michael@0: delete mInitInfo; michael@0: mInitInfo = nullptr; michael@0: } michael@0: michael@0: if (mListenerArray) { michael@0: for (uint32_t i = 0, end = mListenerArray->Length(); i < end; i++) { michael@0: nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); michael@0: delete state; michael@0: } michael@0: delete mListenerArray; michael@0: mListenerArray = nullptr; michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsISupports michael@0: //***************************************************************************** michael@0: michael@0: NS_IMPL_ADDREF(nsWebBrowser) michael@0: NS_IMPL_RELEASE(nsWebBrowser) michael@0: michael@0: NS_INTERFACE_MAP_BEGIN(nsWebBrowser) michael@0: NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowser) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebBrowser) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebNavigation) michael@0: NS_INTERFACE_MAP_ENTRY(nsIBaseWindow) michael@0: NS_INTERFACE_MAP_ENTRY(nsIScrollable) michael@0: NS_INTERFACE_MAP_ENTRY(nsITextScroll) michael@0: NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeItem) michael@0: NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebBrowserSetup) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebBrowserPersist) michael@0: NS_INTERFACE_MAP_ENTRY(nsICancelable) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebBrowserFocus) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) michael@0: NS_INTERFACE_MAP_ENTRY(nsIWebBrowserStream) michael@0: NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) michael@0: NS_INTERFACE_MAP_END michael@0: michael@0: ///***************************************************************************** michael@0: // nsWebBrowser::nsIInterfaceRequestor michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetInterface(const nsIID& aIID, void** aSink) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aSink); michael@0: michael@0: if(NS_SUCCEEDED(QueryInterface(aIID, aSink))) michael@0: return NS_OK; michael@0: michael@0: if (mDocShell) { michael@0: #ifdef NS_PRINTING michael@0: if (aIID.Equals(NS_GET_IID(nsIWebBrowserPrint))) { michael@0: nsCOMPtr viewer; michael@0: mDocShell->GetContentViewer(getter_AddRefs(viewer)); michael@0: if (!viewer) michael@0: return NS_NOINTERFACE; michael@0: michael@0: nsCOMPtr webBrowserPrint(do_QueryInterface(viewer)); michael@0: nsIWebBrowserPrint* print = (nsIWebBrowserPrint*)webBrowserPrint.get(); michael@0: NS_ASSERTION(print, "This MUST support this interface!"); michael@0: NS_ADDREF(print); michael@0: *aSink = print; michael@0: return NS_OK; michael@0: } michael@0: #endif michael@0: return mDocShellAsReq->GetInterface(aIID, aSink); michael@0: } michael@0: michael@0: return NS_NOINTERFACE; michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebBrowser michael@0: //***************************************************************************** michael@0: michael@0: // listeners that currently support registration through AddWebBrowserListener: michael@0: // - nsIWebProgressListener michael@0: NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsIWeakReference *aListener, const nsIID& aIID) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aListener); michael@0: michael@0: nsresult rv = NS_OK; michael@0: if (!mWebProgress) { michael@0: // The window hasn't been created yet, so queue up the listener. They'll be michael@0: // registered when the window gets created. michael@0: nsAutoPtr state; michael@0: state = new nsWebBrowserListenerState(); michael@0: if (!state) return NS_ERROR_OUT_OF_MEMORY; michael@0: michael@0: state->mWeakPtr = aListener; michael@0: state->mID = aIID; michael@0: michael@0: if (!mListenerArray) { michael@0: mListenerArray = new nsTArray(); michael@0: if (!mListenerArray) { michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: } michael@0: } michael@0: michael@0: if (!mListenerArray->AppendElement(state)) { michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: } michael@0: michael@0: // We're all set now; don't delete |state| after this point michael@0: state.forget(); michael@0: } else { michael@0: nsCOMPtr supports(do_QueryReferent(aListener)); michael@0: if (!supports) return NS_ERROR_INVALID_ARG; michael@0: rv = BindListener(supports, aIID); michael@0: } michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::BindListener(nsISupports *aListener, const nsIID& aIID) { michael@0: NS_ENSURE_ARG_POINTER(aListener); michael@0: NS_ASSERTION(mWebProgress, "this should only be called after we've retrieved a progress iface"); michael@0: nsresult rv = NS_OK; michael@0: michael@0: // register this listener for the specified interface id michael@0: if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { michael@0: nsCOMPtr listener = do_QueryInterface(aListener, &rv); michael@0: if (NS_FAILED(rv)) return rv; michael@0: NS_ENSURE_STATE(mWebProgress); michael@0: rv = mWebProgress->AddProgressListener(listener, nsIWebProgress::NOTIFY_ALL); michael@0: } michael@0: else if (aIID.Equals(NS_GET_IID(nsISHistoryListener))) { michael@0: nsCOMPtr shistory(do_GetInterface(mDocShell, &rv)); michael@0: if (NS_FAILED(rv)) return rv; michael@0: nsCOMPtr listener(do_QueryInterface(aListener, &rv)); michael@0: if (NS_FAILED(rv)) return rv; michael@0: rv = shistory->AddSHistoryListener(listener); michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsIWeakReference *aListener, const nsIID& aIID) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aListener); michael@0: michael@0: nsresult rv = NS_OK; michael@0: if (!mWebProgress) { michael@0: // if there's no-one to register the listener w/, and we don't have a queue going, michael@0: // the the called is calling Remove before an Add which doesn't make sense. michael@0: if (!mListenerArray) return NS_ERROR_FAILURE; michael@0: michael@0: // iterate the array and remove the queued listener michael@0: int32_t count = mListenerArray->Length(); michael@0: while (count > 0) { michael@0: nsWebBrowserListenerState *state = mListenerArray->ElementAt(count); michael@0: NS_ASSERTION(state, "list construction problem"); michael@0: michael@0: if (state->Equals(aListener, aIID)) { michael@0: // this is the one, pull it out. michael@0: mListenerArray->RemoveElementAt(count); michael@0: break; michael@0: } michael@0: count--; michael@0: } michael@0: michael@0: // if we've emptied the array, get rid of it. michael@0: if (0 >= mListenerArray->Length()) { michael@0: for (uint32_t i = 0, end = mListenerArray->Length(); i < end; i++) { michael@0: nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); michael@0: delete state; michael@0: } michael@0: delete mListenerArray; michael@0: mListenerArray = nullptr; michael@0: } michael@0: michael@0: } else { michael@0: nsCOMPtr supports(do_QueryReferent(aListener)); michael@0: if (!supports) return NS_ERROR_INVALID_ARG; michael@0: rv = UnBindListener(supports, aIID); michael@0: } michael@0: michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::UnBindListener(nsISupports *aListener, const nsIID& aIID) { michael@0: NS_ENSURE_ARG_POINTER(aListener); michael@0: NS_ASSERTION(mWebProgress, "this should only be called after we've retrieved a progress iface"); michael@0: nsresult rv = NS_OK; michael@0: michael@0: // remove the listener for the specified interface id michael@0: if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { michael@0: nsCOMPtr listener = do_QueryInterface(aListener, &rv); michael@0: if (NS_FAILED(rv)) return rv; michael@0: NS_ENSURE_STATE(mWebProgress); michael@0: rv = mWebProgress->RemoveProgressListener(listener); michael@0: } michael@0: else if (aIID.Equals(NS_GET_IID(nsISHistoryListener))) { michael@0: nsCOMPtr shistory(do_GetInterface(mDocShell, &rv)); michael@0: if (NS_FAILED(rv)) return rv; michael@0: nsCOMPtr listener(do_QueryInterface(aListener, &rv)); michael@0: if (NS_FAILED(rv)) return rv; michael@0: rv = shistory->RemoveSHistoryListener(listener); michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::EnableGlobalHistory(bool aEnable) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShell->SetUseGlobalHistory(aEnable); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetContainerWindow(nsIWebBrowserChrome** aTopWindow) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aTopWindow); michael@0: michael@0: if(mDocShellTreeOwner) { michael@0: *aTopWindow = mDocShellTreeOwner->GetWebBrowserChrome().take(); michael@0: } else { michael@0: *aTopWindow = nullptr; michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetContainerWindow(nsIWebBrowserChrome* aTopWindow) michael@0: { michael@0: NS_ENSURE_SUCCESS(EnsureDocShellTreeOwner(), NS_ERROR_FAILURE); michael@0: return mDocShellTreeOwner->SetWebBrowserChrome(aTopWindow); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetParentURIContentListener(nsIURIContentListener** michael@0: aParentContentListener) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aParentContentListener); michael@0: *aParentContentListener = nullptr; michael@0: michael@0: // get the interface from the docshell michael@0: nsCOMPtr listener(do_GetInterface(mDocShell)); michael@0: michael@0: if (listener) michael@0: return listener->GetParentContentListener(aParentContentListener); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetParentURIContentListener(nsIURIContentListener* michael@0: aParentContentListener) michael@0: { michael@0: // get the interface from the docshell michael@0: nsCOMPtr listener(do_GetInterface(mDocShell)); michael@0: michael@0: if (listener) michael@0: return listener->SetParentContentListener(aParentContentListener); michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetContentDOMWindow(nsIDOMWindow **_retval) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: nsresult rv = NS_OK; michael@0: nsCOMPtr retval = do_GetInterface(mDocShell, &rv); michael@0: if (NS_FAILED(rv)) return rv; michael@0: michael@0: *_retval = retval; michael@0: NS_ADDREF(*_retval); michael@0: return rv; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetIsActive(bool *rv) michael@0: { michael@0: *rv = mIsActive; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetIsActive(bool aIsActive) michael@0: { michael@0: // Set our copy of the value michael@0: mIsActive = aIsActive; michael@0: michael@0: // If we have a docshell, pass on the request michael@0: if (mDocShell) michael@0: return mDocShell->SetIsActive(aIsActive); michael@0: return NS_OK; michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIDocShellTreeItem michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetName(nsAString& aName) michael@0: { michael@0: if(mDocShell) michael@0: mDocShell->GetName(aName); michael@0: else michael@0: aName = mInitInfo->name; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetName(const nsAString& aName) michael@0: { michael@0: if(mDocShell) michael@0: { michael@0: return mDocShell->SetName(aName); michael@0: } michael@0: else michael@0: mInitInfo->name = aName; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::NameEquals(const char16_t *aName, bool *_retval) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aName); michael@0: NS_ENSURE_ARG_POINTER(_retval); michael@0: if(mDocShell) michael@0: { michael@0: return mDocShell->NameEquals(aName, _retval); michael@0: } michael@0: else michael@0: *_retval = mInitInfo->name.Equals(aName); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* virtual */ int32_t michael@0: nsWebBrowser::ItemType() michael@0: { michael@0: return mContentType; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetItemType(int32_t* aItemType) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aItemType); michael@0: michael@0: *aItemType = ItemType(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetItemType(int32_t aItemType) michael@0: { michael@0: NS_ENSURE_TRUE((aItemType == typeContentWrapper || aItemType == typeChromeWrapper), NS_ERROR_FAILURE); michael@0: mContentType = aItemType; michael@0: if (mDocShell) michael@0: mDocShell->SetItemType(mContentType == typeChromeWrapper michael@0: ? static_cast(typeChrome) michael@0: : static_cast(typeContent)); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetParent(nsIDocShellTreeItem** aParent) michael@0: { michael@0: *aParent = nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetSameTypeParent(nsIDocShellTreeItem** aParent) michael@0: { michael@0: *aParent = nullptr; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetRootTreeItem(nsIDocShellTreeItem** aRootTreeItem) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRootTreeItem); michael@0: *aRootTreeItem = static_cast(this); michael@0: michael@0: nsCOMPtr parent; michael@0: NS_ENSURE_SUCCESS(GetParent(getter_AddRefs(parent)), NS_ERROR_FAILURE); michael@0: while(parent) michael@0: { michael@0: *aRootTreeItem = parent; michael@0: NS_ENSURE_SUCCESS((*aRootTreeItem)->GetParent(getter_AddRefs(parent)), NS_ERROR_FAILURE); michael@0: } michael@0: NS_ADDREF(*aRootTreeItem); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetSameTypeRootTreeItem(nsIDocShellTreeItem** aRootTreeItem) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRootTreeItem); michael@0: *aRootTreeItem = static_cast(this); michael@0: michael@0: nsCOMPtr parent; michael@0: NS_ENSURE_SUCCESS(GetSameTypeParent(getter_AddRefs(parent)), NS_ERROR_FAILURE); michael@0: while(parent) michael@0: { michael@0: *aRootTreeItem = parent; michael@0: NS_ENSURE_SUCCESS((*aRootTreeItem)->GetSameTypeParent(getter_AddRefs(parent)), michael@0: NS_ERROR_FAILURE); michael@0: } michael@0: NS_ADDREF(*aRootTreeItem); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::FindItemWithName(const char16_t *aName, michael@0: nsISupports* aRequestor, nsIDocShellTreeItem* aOriginalRequestor, michael@0: nsIDocShellTreeItem **_retval) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ASSERTION(mDocShellTreeOwner, "This should always be set when in this situation"); michael@0: michael@0: return mDocShell->FindItemWithName(aName, michael@0: static_cast(mDocShellTreeOwner), michael@0: aOriginalRequestor, _retval); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetTreeOwner(nsIDocShellTreeOwner** aTreeOwner) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aTreeOwner); michael@0: *aTreeOwner = nullptr; michael@0: if(mDocShellTreeOwner) michael@0: { michael@0: if (mDocShellTreeOwner->mTreeOwner) michael@0: { michael@0: *aTreeOwner = mDocShellTreeOwner->mTreeOwner; michael@0: } michael@0: else michael@0: { michael@0: *aTreeOwner = mDocShellTreeOwner; michael@0: } michael@0: } michael@0: NS_IF_ADDREF(*aTreeOwner); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetTreeOwner(nsIDocShellTreeOwner* aTreeOwner) michael@0: { michael@0: NS_ENSURE_SUCCESS(EnsureDocShellTreeOwner(), NS_ERROR_FAILURE); michael@0: return mDocShellTreeOwner->SetTreeOwner(aTreeOwner); michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIDocShellTreeItem michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetChildCount(int32_t * aChildCount) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aChildCount); michael@0: *aChildCount = 0; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::AddChild(nsIDocShellTreeItem * aChild) michael@0: { michael@0: return NS_ERROR_UNEXPECTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::RemoveChild(nsIDocShellTreeItem * aChild) michael@0: { michael@0: return NS_ERROR_UNEXPECTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetChildAt(int32_t aIndex, michael@0: nsIDocShellTreeItem ** aChild) michael@0: { michael@0: return NS_ERROR_UNEXPECTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::FindChildWithName( michael@0: const char16_t * aName, michael@0: bool aRecurse, bool aSameType, michael@0: nsIDocShellTreeItem * aRequestor, michael@0: nsIDocShellTreeItem * aOriginalRequestor, michael@0: nsIDocShellTreeItem ** _retval) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(_retval); michael@0: michael@0: *_retval = nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebNavigation michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetCanGoBack(bool* aCanGoBack) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GetCanGoBack(aCanGoBack); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetCanGoForward(bool* aCanGoForward) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GetCanGoForward(aCanGoForward); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GoBack() michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GoBack(); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GoForward() michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GoForward(); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::LoadURIWithBase(const char16_t* aURI, michael@0: uint32_t aLoadFlags, michael@0: nsIURI* aReferringURI, michael@0: nsIInputStream* aPostDataStream, michael@0: nsIInputStream* aExtraHeaderStream, michael@0: nsIURI* aBaseURI) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->LoadURIWithBase(aURI, michael@0: aLoadFlags, michael@0: aReferringURI, michael@0: aPostDataStream, michael@0: aExtraHeaderStream, michael@0: aBaseURI); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::LoadURI(const char16_t* aURI, michael@0: uint32_t aLoadFlags, michael@0: nsIURI* aReferringURI, michael@0: nsIInputStream* aPostDataStream, michael@0: nsIInputStream* aExtraHeaderStream) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->LoadURI(aURI, michael@0: aLoadFlags, michael@0: aReferringURI, michael@0: aPostDataStream, michael@0: aExtraHeaderStream); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::Reload(uint32_t aReloadFlags) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->Reload(aReloadFlags); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GotoIndex(int32_t aIndex) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GotoIndex(aIndex); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::Stop(uint32_t aStopFlags) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->Stop(aStopFlags); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetCurrentURI(nsIURI** aURI) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GetCurrentURI(aURI); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetReferringURI(nsIURI** aURI) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GetReferringURI(aURI); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetSessionHistory(nsISHistory* aSessionHistory) michael@0: { michael@0: if(mDocShell) michael@0: return mDocShellAsNav->SetSessionHistory(aSessionHistory); michael@0: else michael@0: mInitInfo->sessionHistory = aSessionHistory; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetSessionHistory(nsISHistory** aSessionHistory) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aSessionHistory); michael@0: if(mDocShell) michael@0: return mDocShellAsNav->GetSessionHistory(aSessionHistory); michael@0: else michael@0: *aSessionHistory = mInitInfo->sessionHistory; michael@0: michael@0: NS_IF_ADDREF(*aSessionHistory); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetDocument(nsIDOMDocument** aDocument) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsNav->GetDocument(aDocument); michael@0: } michael@0: michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebBrowserSetup michael@0: //***************************************************************************** michael@0: michael@0: /* void setProperty (in unsigned long aId, in unsigned long aValue); */ michael@0: NS_IMETHODIMP nsWebBrowser::SetProperty(uint32_t aId, uint32_t aValue) michael@0: { michael@0: nsresult rv = NS_OK; michael@0: michael@0: switch (aId) michael@0: { michael@0: case nsIWebBrowserSetup::SETUP_ALLOW_PLUGINS: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: mDocShell->SetAllowPlugins(!!aValue); michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_ALLOW_JAVASCRIPT: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: mDocShell->SetAllowJavascript(!!aValue); michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_ALLOW_META_REDIRECTS: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: mDocShell->SetAllowMetaRedirects(!!aValue); michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_ALLOW_SUBFRAMES: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: mDocShell->SetAllowSubframes(!!aValue); michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_ALLOW_IMAGES: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: mDocShell->SetAllowImages(!!aValue); michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_ALLOW_DNS_PREFETCH: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: mDocShell->SetAllowDNSPrefetch(!!aValue); michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_USE_GLOBAL_HISTORY: michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: rv = EnableGlobalHistory(!!aValue); michael@0: mShouldEnableHistory = aValue; michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_FOCUS_DOC_BEFORE_CONTENT: michael@0: { michael@0: // obsolete michael@0: } michael@0: break; michael@0: case nsIWebBrowserSetup::SETUP_IS_CHROME_WRAPPER: michael@0: { michael@0: NS_ENSURE_TRUE((aValue == static_cast(true) || michael@0: aValue == static_cast(false)), michael@0: NS_ERROR_INVALID_ARG); michael@0: SetItemType(aValue ? static_cast(typeChromeWrapper) michael@0: : static_cast(typeContentWrapper)); michael@0: } michael@0: break; michael@0: default: michael@0: rv = NS_ERROR_INVALID_ARG; michael@0: michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebProgressListener michael@0: //***************************************************************************** michael@0: michael@0: /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */ michael@0: NS_IMETHODIMP nsWebBrowser::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus) michael@0: { michael@0: if (mPersist) michael@0: { michael@0: mPersist->GetCurrentState(&mPersistCurrentState); michael@0: } michael@0: if (aStateFlags & STATE_IS_NETWORK && aStateFlags & STATE_STOP) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: if (mProgressListener) michael@0: { michael@0: return mProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */ michael@0: NS_IMETHODIMP nsWebBrowser::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress) michael@0: { michael@0: if (mPersist) michael@0: { michael@0: mPersist->GetCurrentState(&mPersistCurrentState); michael@0: } michael@0: if (mProgressListener) michael@0: { michael@0: return mProgressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */ michael@0: NS_IMETHODIMP nsWebBrowser::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags) michael@0: { michael@0: if (mProgressListener) michael@0: { michael@0: return mProgressListener->OnLocationChange(aWebProgress, aRequest, location, aFlags); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */ michael@0: NS_IMETHODIMP nsWebBrowser::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage) michael@0: { michael@0: if (mProgressListener) michael@0: { michael@0: return mProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */ michael@0: NS_IMETHODIMP nsWebBrowser::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state) michael@0: { michael@0: if (mProgressListener) michael@0: { michael@0: return mProgressListener->OnSecurityChange(aWebProgress, aRequest, state); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebBrowserPersist michael@0: //***************************************************************************** michael@0: michael@0: /* attribute unsigned long persistFlags; */ michael@0: NS_IMETHODIMP nsWebBrowser::GetPersistFlags(uint32_t *aPersistFlags) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aPersistFlags); michael@0: nsresult rv = NS_OK; michael@0: if (mPersist) michael@0: { michael@0: rv = mPersist->GetPersistFlags(&mPersistFlags); michael@0: } michael@0: *aPersistFlags = mPersistFlags; michael@0: return rv; michael@0: } michael@0: NS_IMETHODIMP nsWebBrowser::SetPersistFlags(uint32_t aPersistFlags) michael@0: { michael@0: nsresult rv = NS_OK; michael@0: mPersistFlags = aPersistFlags; michael@0: if (mPersist) michael@0: { michael@0: rv = mPersist->SetPersistFlags(mPersistFlags); michael@0: mPersist->GetPersistFlags(&mPersistFlags); michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: michael@0: /* readonly attribute unsigned long currentState; */ michael@0: NS_IMETHODIMP nsWebBrowser::GetCurrentState(uint32_t *aCurrentState) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aCurrentState); michael@0: if (mPersist) michael@0: { michael@0: mPersist->GetCurrentState(&mPersistCurrentState); michael@0: } michael@0: *aCurrentState = mPersistCurrentState; michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* readonly attribute nsresult result; */ michael@0: NS_IMETHODIMP nsWebBrowser::GetResult(nsresult *aResult) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aResult); michael@0: if (mPersist) michael@0: { michael@0: mPersist->GetResult(&mPersistResult); michael@0: } michael@0: *aResult = mPersistResult; michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* attribute nsIWebBrowserPersistProgress progressListener; */ michael@0: NS_IMETHODIMP nsWebBrowser::GetProgressListener(nsIWebProgressListener * *aProgressListener) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aProgressListener); michael@0: *aProgressListener = mProgressListener; michael@0: NS_IF_ADDREF(*aProgressListener); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetProgressListener(nsIWebProgressListener * aProgressListener) michael@0: { michael@0: mProgressListener = aProgressListener; michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void saveURI (in nsIURI aURI, in nsIURI aReferrer, michael@0: in nsISupports aCacheKey, in nsIInputStream aPostData, in wstring aExtraHeaders, michael@0: in nsISupports aFile, in nsILoadContext aPrivacyContext); */ michael@0: NS_IMETHODIMP nsWebBrowser::SaveURI( michael@0: nsIURI *aURI, nsISupports *aCacheKey, nsIURI *aReferrer, nsIInputStream *aPostData, michael@0: const char *aExtraHeaders, nsISupports *aFile, nsILoadContext* aPrivacyContext) michael@0: { michael@0: return SavePrivacyAwareURI(aURI, aCacheKey, aReferrer, aPostData, aExtraHeaders, michael@0: aFile, aPrivacyContext && aPrivacyContext->UsePrivateBrowsing()); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SavePrivacyAwareURI( michael@0: nsIURI *aURI, nsISupports *aCacheKey, nsIURI *aReferrer, nsIInputStream *aPostData, michael@0: const char *aExtraHeaders, nsISupports *aFile, bool aIsPrivate) michael@0: { michael@0: if (mPersist) michael@0: { michael@0: uint32_t currentState; michael@0: mPersist->GetCurrentState(¤tState); michael@0: if (currentState == PERSIST_STATE_FINISHED) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: else michael@0: { michael@0: // You can't save again until the last save has completed michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: } michael@0: michael@0: nsCOMPtr uri; michael@0: if (aURI) michael@0: { michael@0: uri = aURI; michael@0: } michael@0: else michael@0: { michael@0: nsresult rv = GetCurrentURI(getter_AddRefs(uri)); michael@0: if (NS_FAILED(rv)) michael@0: { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: } michael@0: michael@0: // Create a throwaway persistence object to do the work michael@0: nsresult rv; michael@0: mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: mPersist->SetProgressListener(this); michael@0: mPersist->SetPersistFlags(mPersistFlags); michael@0: mPersist->GetCurrentState(&mPersistCurrentState); michael@0: rv = mPersist->SavePrivacyAwareURI(uri, aCacheKey, aReferrer, aPostData, michael@0: aExtraHeaders, aFile, aIsPrivate); michael@0: if (NS_FAILED(rv)) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: /* void saveChannel (in nsIChannel aChannel, in nsISupports aFile); */ michael@0: NS_IMETHODIMP nsWebBrowser::SaveChannel( michael@0: nsIChannel* aChannel, nsISupports *aFile) michael@0: { michael@0: if (mPersist) michael@0: { michael@0: uint32_t currentState; michael@0: mPersist->GetCurrentState(¤tState); michael@0: if (currentState == PERSIST_STATE_FINISHED) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: else michael@0: { michael@0: // You can't save again until the last save has completed michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: } michael@0: michael@0: // Create a throwaway persistence object to do the work michael@0: nsresult rv; michael@0: mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: mPersist->SetProgressListener(this); michael@0: mPersist->SetPersistFlags(mPersistFlags); michael@0: mPersist->GetCurrentState(&mPersistCurrentState); michael@0: rv = mPersist->SaveChannel(aChannel, aFile); michael@0: if (NS_FAILED(rv)) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: /* void saveDocument (in nsIDOMDocument document, in nsISupports aFile, in nsISupports aDataPath); */ michael@0: NS_IMETHODIMP nsWebBrowser::SaveDocument( michael@0: nsIDOMDocument *aDocument, nsISupports *aFile, nsISupports *aDataPath, michael@0: const char *aOutputContentType, uint32_t aEncodingFlags, uint32_t aWrapColumn) michael@0: { michael@0: if (mPersist) michael@0: { michael@0: uint32_t currentState; michael@0: mPersist->GetCurrentState(¤tState); michael@0: if (currentState == PERSIST_STATE_FINISHED) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: else michael@0: { michael@0: // You can't save again until the last save has completed michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: } michael@0: michael@0: // Use the specified DOM document, or if none is specified, the one michael@0: // attached to the web browser. michael@0: michael@0: nsCOMPtr doc; michael@0: if (aDocument) michael@0: { michael@0: doc = do_QueryInterface(aDocument); michael@0: } michael@0: else michael@0: { michael@0: GetDocument(getter_AddRefs(doc)); michael@0: } michael@0: if (!doc) michael@0: { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: // Create a throwaway persistence object to do the work michael@0: nsresult rv; michael@0: mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: mPersist->SetProgressListener(this); michael@0: mPersist->SetPersistFlags(mPersistFlags); michael@0: mPersist->GetCurrentState(&mPersistCurrentState); michael@0: rv = mPersist->SaveDocument(doc, aFile, aDataPath, aOutputContentType, aEncodingFlags, aWrapColumn); michael@0: if (NS_FAILED(rv)) michael@0: { michael@0: mPersist = nullptr; michael@0: } michael@0: return rv; michael@0: } michael@0: michael@0: /* void cancelSave(); */ michael@0: NS_IMETHODIMP nsWebBrowser::CancelSave() michael@0: { michael@0: if (mPersist) michael@0: { michael@0: return mPersist->CancelSave(); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void cancel(nsresult aReason); */ michael@0: NS_IMETHODIMP nsWebBrowser::Cancel(nsresult aReason) michael@0: { michael@0: if (mPersist) michael@0: { michael@0: return mPersist->Cancel(aReason); michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: michael@0: michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIBaseWindow michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::InitWindow(nativeWindow aParentNativeWindow, michael@0: nsIWidget* aParentWidget, int32_t aX, int32_t aY, int32_t aCX, int32_t aCY) michael@0: { michael@0: NS_ENSURE_ARG(aParentNativeWindow || aParentWidget); michael@0: NS_ENSURE_STATE(!mDocShell || mInitInfo); michael@0: michael@0: if(aParentWidget) michael@0: NS_ENSURE_SUCCESS(SetParentWidget(aParentWidget), NS_ERROR_FAILURE); michael@0: else michael@0: NS_ENSURE_SUCCESS(SetParentNativeWindow(aParentNativeWindow), michael@0: NS_ERROR_FAILURE); michael@0: michael@0: NS_ENSURE_SUCCESS(SetPositionAndSize(aX, aY, aCX, aCY, false), michael@0: NS_ERROR_FAILURE); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::Create() michael@0: { michael@0: NS_ENSURE_STATE(!mDocShell && (mParentNativeWindow || mParentWidget)); michael@0: michael@0: nsresult rv = EnsureDocShellTreeOwner(); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsCOMPtr docShellParentWidget(mParentWidget); michael@0: if(!mParentWidget) // We need to create a widget michael@0: { michael@0: // Create the widget michael@0: mInternalWidget = do_CreateInstance(kChildCID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: docShellParentWidget = mInternalWidget; michael@0: nsWidgetInitData widgetInit; michael@0: michael@0: widgetInit.clipChildren = true; michael@0: michael@0: widgetInit.mWindowType = eWindowType_child; michael@0: nsIntRect bounds(mInitInfo->x, mInitInfo->y, mInitInfo->cx, mInitInfo->cy); michael@0: michael@0: mInternalWidget->SetWidgetListener(this); michael@0: mInternalWidget->Create(nullptr, mParentNativeWindow, bounds, nullptr, &widgetInit); michael@0: } michael@0: michael@0: nsCOMPtr docShell(do_CreateInstance("@mozilla.org/docshell;1", &rv)); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: rv = SetDocShell(docShell); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: // get the system default window background colour michael@0: LookAndFeel::GetColor(LookAndFeel::eColorID_WindowBackground, michael@0: &mBackgroundColor); michael@0: michael@0: // the docshell has been set so we now have our listener registrars. michael@0: if (mListenerArray) { michael@0: // we had queued up some listeners, let's register them now. michael@0: uint32_t count = mListenerArray->Length(); michael@0: uint32_t i = 0; michael@0: NS_ASSERTION(count > 0, "array construction problem"); michael@0: while (i < count) { michael@0: nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); michael@0: NS_ASSERTION(state, "array construction problem"); michael@0: nsCOMPtr listener = do_QueryReferent(state->mWeakPtr); michael@0: NS_ASSERTION(listener, "bad listener"); michael@0: (void)BindListener(listener, state->mID); michael@0: i++; michael@0: } michael@0: for (uint32_t i = 0, end = mListenerArray->Length(); i < end; i++) { michael@0: nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); michael@0: delete state; michael@0: } michael@0: delete mListenerArray; michael@0: mListenerArray = nullptr; michael@0: } michael@0: michael@0: // HACK ALERT - this registration registers the nsDocShellTreeOwner as a michael@0: // nsIWebBrowserListener so it can setup its MouseListener in one of the michael@0: // progress callbacks. If we can register the MouseListener another way, this michael@0: // registration can go away, and nsDocShellTreeOwner can stop implementing michael@0: // nsIWebProgressListener. michael@0: nsCOMPtr supports = nullptr; michael@0: (void)mDocShellTreeOwner->QueryInterface(NS_GET_IID(nsIWebProgressListener), michael@0: static_cast(getter_AddRefs(supports))); michael@0: (void)BindListener(supports, NS_GET_IID(nsIWebProgressListener)); michael@0: michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->InitWindow(nullptr, michael@0: docShellParentWidget, mInitInfo->x, mInitInfo->y, mInitInfo->cx, michael@0: mInitInfo->cy), NS_ERROR_FAILURE); michael@0: michael@0: mDocShell->SetName(mInitInfo->name); michael@0: if (mContentType == typeChromeWrapper) michael@0: { michael@0: mDocShell->SetItemType(nsIDocShellTreeItem::typeChrome); michael@0: } michael@0: else michael@0: { michael@0: mDocShell->SetItemType(nsIDocShellTreeItem::typeContent); michael@0: } michael@0: mDocShell->SetTreeOwner(mDocShellTreeOwner); michael@0: michael@0: // If the webbrowser is a content docshell item then we won't hear any michael@0: // events from subframes. To solve that we install our own chrome event handler michael@0: // that always gets called (even for subframes) for any bubbling event. michael@0: michael@0: if (!mInitInfo->sessionHistory) { michael@0: mInitInfo->sessionHistory = do_CreateInstance(NS_SHISTORY_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: } michael@0: mDocShellAsNav->SetSessionHistory(mInitInfo->sessionHistory); michael@0: michael@0: if (XRE_GetProcessType() == GeckoProcessType_Default) { michael@0: // Hook up global history. Do not fail if we can't - just warn. michael@0: rv = EnableGlobalHistory(mShouldEnableHistory); michael@0: NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "EnableGlobalHistory() failed"); michael@0: } michael@0: michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->Create(), NS_ERROR_FAILURE); michael@0: michael@0: // Hook into the OnSecurityChange() notification for lock/unlock icon michael@0: // updates michael@0: nsCOMPtr domWindow; michael@0: rv = GetContentDOMWindow(getter_AddRefs(domWindow)); michael@0: if (NS_SUCCEEDED(rv)) michael@0: { michael@0: // this works because the implementation of nsISecureBrowserUI michael@0: // (nsSecureBrowserUIImpl) gets a docShell from the domWindow, michael@0: // and calls docShell->SetSecurityUI(this); michael@0: nsCOMPtr securityUI = michael@0: do_CreateInstance(NS_SECURE_BROWSER_UI_CONTRACTID, &rv); michael@0: if (NS_SUCCEEDED(rv)) michael@0: securityUI->Init(domWindow); michael@0: } michael@0: michael@0: mDocShellTreeOwner->AddToWatcher(); // evil twin of Remove in SetDocShell(0) michael@0: mDocShellTreeOwner->AddChromeListeners(); michael@0: michael@0: delete mInitInfo; michael@0: mInitInfo = nullptr; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::Destroy() michael@0: { michael@0: InternalDestroy(); michael@0: michael@0: if(!mInitInfo) michael@0: mInitInfo = new nsWebBrowserInitInfo(); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetUnscaledDevicePixelsPerCSSPixel(double *aScale) michael@0: { michael@0: *aScale = mParentWidget ? mParentWidget->GetDefaultScale().scale : 1.0; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetPosition(int32_t aX, int32_t aY) michael@0: { michael@0: int32_t cx = 0; michael@0: int32_t cy = 0; michael@0: michael@0: GetSize(&cx, &cy); michael@0: michael@0: return SetPositionAndSize(aX, aY, cx, cy, false); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetPosition(int32_t* aX, int32_t* aY) michael@0: { michael@0: return GetPositionAndSize(aX, aY, nullptr, nullptr); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetSize(int32_t aCX, int32_t aCY, bool aRepaint) michael@0: { michael@0: int32_t x = 0; michael@0: int32_t y = 0; michael@0: michael@0: GetPosition(&x, &y); michael@0: michael@0: return SetPositionAndSize(x, y, aCX, aCY, aRepaint); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetSize(int32_t* aCX, int32_t* aCY) michael@0: { michael@0: return GetPositionAndSize(nullptr, nullptr, aCX, aCY); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetPositionAndSize(int32_t aX, int32_t aY, michael@0: int32_t aCX, int32_t aCY, bool aRepaint) michael@0: { michael@0: if(!mDocShell) michael@0: { michael@0: mInitInfo->x = aX; michael@0: mInitInfo->y = aY; michael@0: mInitInfo->cx = aCX; michael@0: mInitInfo->cy = aCY; michael@0: } michael@0: else michael@0: { michael@0: int32_t doc_x = aX; michael@0: int32_t doc_y = aY; michael@0: michael@0: // If there is an internal widget we need to make the docShell coordinates michael@0: // relative to the internal widget rather than the calling app's parent. michael@0: // We also need to resize our widget then. michael@0: if(mInternalWidget) michael@0: { michael@0: doc_x = doc_y = 0; michael@0: NS_ENSURE_SUCCESS(mInternalWidget->Resize(aX, aY, aCX, aCY, aRepaint), michael@0: NS_ERROR_FAILURE); michael@0: } michael@0: // Now reposition/ resize the doc michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->SetPositionAndSize(doc_x, doc_y, aCX, aCY, michael@0: aRepaint), NS_ERROR_FAILURE); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetPositionAndSize(int32_t* aX, int32_t* aY, michael@0: int32_t* aCX, int32_t* aCY) michael@0: { michael@0: if(!mDocShell) michael@0: { michael@0: if(aX) michael@0: *aX = mInitInfo->x; michael@0: if(aY) michael@0: *aY = mInitInfo->y; michael@0: if(aCX) michael@0: *aCX = mInitInfo->cx; michael@0: if(aCY) michael@0: *aCY = mInitInfo->cy; michael@0: } michael@0: else michael@0: { michael@0: if(mInternalWidget) michael@0: { michael@0: nsIntRect bounds; michael@0: NS_ENSURE_SUCCESS(mInternalWidget->GetBounds(bounds), NS_ERROR_FAILURE); michael@0: michael@0: if(aX) michael@0: *aX = bounds.x; michael@0: if(aY) michael@0: *aY = bounds.y; michael@0: if(aCX) michael@0: *aCX = bounds.width; michael@0: if(aCY) michael@0: *aCY = bounds.height; michael@0: return NS_OK; michael@0: } michael@0: else michael@0: return mDocShellAsWin->GetPositionAndSize(aX, aY, aCX, aCY); // Can directly return this as it is the michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::Repaint(bool aForce) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: return mDocShellAsWin->Repaint(aForce); // Can directly return this as it is the michael@0: } // same interface, thus same returns. michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetParentWidget(nsIWidget** aParentWidget) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aParentWidget); michael@0: michael@0: *aParentWidget = mParentWidget; michael@0: michael@0: NS_IF_ADDREF(*aParentWidget); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetParentWidget(nsIWidget* aParentWidget) michael@0: { michael@0: NS_ENSURE_STATE(!mDocShell); michael@0: michael@0: mParentWidget = aParentWidget; michael@0: if(mParentWidget) michael@0: mParentNativeWindow = mParentWidget->GetNativeData(NS_NATIVE_WIDGET); michael@0: else michael@0: mParentNativeWindow = nullptr; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetParentNativeWindow(nativeWindow* aParentNativeWindow) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aParentNativeWindow); michael@0: michael@0: *aParentNativeWindow = mParentNativeWindow; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetParentNativeWindow(nativeWindow aParentNativeWindow) michael@0: { michael@0: NS_ENSURE_STATE(!mDocShell); michael@0: michael@0: mParentNativeWindow = aParentNativeWindow; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetNativeHandle(nsAString& aNativeHandle) michael@0: { michael@0: // the nativeHandle should be accessed from nsIXULWindow michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetVisibility(bool* visibility) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(visibility); michael@0: michael@0: if(!mDocShell) michael@0: *visibility = mInitInfo->visible; michael@0: else michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->GetVisibility(visibility), NS_ERROR_FAILURE); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetVisibility(bool aVisibility) michael@0: { michael@0: if(!mDocShell) michael@0: mInitInfo->visible = aVisibility; michael@0: else michael@0: { michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->SetVisibility(aVisibility), NS_ERROR_FAILURE); michael@0: if(mInternalWidget) michael@0: mInternalWidget->Show(aVisibility); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetEnabled(bool* aEnabled) michael@0: { michael@0: if (mInternalWidget) { michael@0: *aEnabled = mInternalWidget->IsEnabled(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetEnabled(bool aEnabled) michael@0: { michael@0: if (mInternalWidget) michael@0: return mInternalWidget->Enable(aEnabled); michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetMainWidget(nsIWidget** mainWidget) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(mainWidget); michael@0: michael@0: if(mInternalWidget) michael@0: *mainWidget = mInternalWidget; michael@0: else michael@0: *mainWidget = mParentWidget; michael@0: michael@0: NS_IF_ADDREF(*mainWidget); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetFocus() michael@0: { michael@0: nsCOMPtr window = do_GetInterface(mDocShell); michael@0: NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: return fm ? fm->SetFocusedWindow(window) : NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetTitle(char16_t** aTitle) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aTitle); michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->GetTitle(aTitle), NS_ERROR_FAILURE); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetTitle(const char16_t* aTitle) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: NS_ENSURE_SUCCESS(mDocShellAsWin->SetTitle(aTitle), NS_ERROR_FAILURE); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIScrollable michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetDefaultScrollbarPreferences(int32_t aScrollOrientation, michael@0: int32_t* aScrollbarPref) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsScrollable->GetDefaultScrollbarPreferences(aScrollOrientation, michael@0: aScrollbarPref); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetDefaultScrollbarPreferences(int32_t aScrollOrientation, michael@0: int32_t aScrollbarPref) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsScrollable->SetDefaultScrollbarPreferences(aScrollOrientation, michael@0: aScrollbarPref); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetScrollbarVisibility(bool* aVerticalVisible, michael@0: bool* aHorizontalVisible) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsScrollable->GetScrollbarVisibility(aVerticalVisible, michael@0: aHorizontalVisible); michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsITextScroll michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::ScrollByLines(int32_t aNumLines) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsTextScroll->ScrollByLines(aNumLines); michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::ScrollByPages(int32_t aNumPages) michael@0: { michael@0: NS_ENSURE_STATE(mDocShell); michael@0: michael@0: return mDocShellAsTextScroll->ScrollByPages(aNumPages); michael@0: } michael@0: michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser: Listener Helpers michael@0: //***************************************************************************** michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell) michael@0: { michael@0: nsCOMPtr kungFuDeathGrip(mDocShell); michael@0: if(aDocShell) michael@0: { michael@0: NS_ENSURE_TRUE(!mDocShell, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr req(do_QueryInterface(aDocShell)); michael@0: nsCOMPtr baseWin(do_QueryInterface(aDocShell)); michael@0: nsCOMPtr nav(do_QueryInterface(aDocShell)); michael@0: nsCOMPtr scrollable(do_QueryInterface(aDocShell)); michael@0: nsCOMPtr textScroll(do_QueryInterface(aDocShell)); michael@0: nsCOMPtr progress(do_GetInterface(aDocShell)); michael@0: NS_ENSURE_TRUE(req && baseWin && nav && scrollable && textScroll && progress, michael@0: NS_ERROR_FAILURE); michael@0: michael@0: mDocShell = aDocShell; michael@0: mDocShellAsReq = req; michael@0: mDocShellAsWin = baseWin; michael@0: mDocShellAsNav = nav; michael@0: mDocShellAsScrollable = scrollable; michael@0: mDocShellAsTextScroll = textScroll; michael@0: mWebProgress = progress; michael@0: michael@0: // By default, do not allow DNS prefetch, so we don't break our frozen michael@0: // API. Embeddors who decide to enable it should do so manually. michael@0: mDocShell->SetAllowDNSPrefetch(false); michael@0: michael@0: // It's possible to call setIsActive() on us before we have a docshell. michael@0: // If we're getting a docshell now, pass along our desired value. The michael@0: // default here (true) matches the default of the docshell, so this is michael@0: // a no-op unless setIsActive(false) has been called on us. michael@0: mDocShell->SetIsActive(mIsActive); michael@0: } michael@0: else michael@0: { michael@0: if (mDocShellTreeOwner) michael@0: mDocShellTreeOwner->RemoveFromWatcher(); // evil twin of Add in Create() michael@0: if (mDocShellAsWin) michael@0: mDocShellAsWin->Destroy(); michael@0: michael@0: mDocShell = nullptr; michael@0: mDocShellAsReq = nullptr; michael@0: mDocShellAsWin = nullptr; michael@0: mDocShellAsNav = nullptr; michael@0: mDocShellAsScrollable = nullptr; michael@0: mDocShellAsTextScroll = nullptr; michael@0: mWebProgress = nullptr; michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::EnsureDocShellTreeOwner() michael@0: { michael@0: if(mDocShellTreeOwner) michael@0: return NS_OK; michael@0: michael@0: mDocShellTreeOwner = new nsDocShellTreeOwner(); michael@0: NS_ENSURE_TRUE(mDocShellTreeOwner, NS_ERROR_OUT_OF_MEMORY); michael@0: michael@0: NS_ADDREF(mDocShellTreeOwner); michael@0: mDocShellTreeOwner->WebBrowser(this); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: static void DrawThebesLayer(ThebesLayer* aLayer, michael@0: gfxContext* aContext, michael@0: const nsIntRegion& aRegionToDraw, michael@0: DrawRegionClip aClip, michael@0: const nsIntRegion& aRegionToInvalidate, michael@0: void* aCallbackData) michael@0: { michael@0: nscolor* color = static_cast(aCallbackData); michael@0: aContext->NewPath(); michael@0: aContext->SetColor(gfxRGBA(*color)); michael@0: nsIntRect dirtyRect = aRegionToDraw.GetBounds(); michael@0: aContext->Rectangle(gfxRect(dirtyRect.x, dirtyRect.y, dirtyRect.width, dirtyRect.height)); michael@0: aContext->Fill(); michael@0: } michael@0: michael@0: void nsWebBrowser::WindowRaised(nsIWidget* aWidget) michael@0: { michael@0: #if defined(DEBUG_smaug) michael@0: nsCOMPtr domDocument = do_GetInterface(mDocShell); michael@0: nsAutoString documentURI; michael@0: domDocument->GetDocumentURI(documentURI); michael@0: printf("nsWebBrowser::NS_ACTIVATE %p %s\n", (void*)this, michael@0: NS_ConvertUTF16toUTF8(documentURI).get()); michael@0: #endif michael@0: Activate(); michael@0: } michael@0: michael@0: void nsWebBrowser::WindowLowered(nsIWidget* aWidget) michael@0: { michael@0: #if defined(DEBUG_smaug) michael@0: nsCOMPtr domDocument = do_GetInterface(mDocShell); michael@0: nsAutoString documentURI; michael@0: domDocument->GetDocumentURI(documentURI); michael@0: printf("nsWebBrowser::NS_DEACTIVATE %p %s\n", (void*)this, michael@0: NS_ConvertUTF16toUTF8(documentURI).get()); michael@0: #endif michael@0: Deactivate(); michael@0: } michael@0: michael@0: bool nsWebBrowser::PaintWindow(nsIWidget* aWidget, nsIntRegion aRegion) michael@0: { michael@0: LayerManager* layerManager = aWidget->GetLayerManager(); michael@0: NS_ASSERTION(layerManager, "Must be in paint event"); michael@0: michael@0: layerManager->BeginTransaction(); michael@0: nsRefPtr root = layerManager->CreateThebesLayer(); michael@0: if (root) { michael@0: nsIntRect dirtyRect = aRegion.GetBounds(); michael@0: root->SetVisibleRegion(dirtyRect); michael@0: layerManager->SetRoot(root); michael@0: } michael@0: michael@0: layerManager->EndTransaction(DrawThebesLayer, &mBackgroundColor); michael@0: return true; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::GetPrimaryContentWindow(nsIDOMWindow** aDOMWindow) michael@0: { michael@0: *aDOMWindow = 0; michael@0: michael@0: nsCOMPtr item; michael@0: NS_ENSURE_TRUE(mDocShellTreeOwner, NS_ERROR_FAILURE); michael@0: mDocShellTreeOwner->GetPrimaryContentShell(getter_AddRefs(item)); michael@0: NS_ENSURE_TRUE(item, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr docShell; michael@0: docShell = do_QueryInterface(item); michael@0: NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr domWindow = do_GetInterface(docShell); michael@0: NS_ENSURE_TRUE(domWindow, NS_ERROR_FAILURE); michael@0: michael@0: *aDOMWindow = domWindow; michael@0: NS_ADDREF(*aDOMWindow); michael@0: return NS_OK; michael@0: michael@0: } michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebBrowserFocus michael@0: //***************************************************************************** michael@0: michael@0: /* void activate (); */ michael@0: NS_IMETHODIMP nsWebBrowser::Activate(void) michael@0: { michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: nsCOMPtr window = do_GetInterface(mDocShell); michael@0: if (fm && window) michael@0: return fm->WindowRaised(window); michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void deactivate (); */ michael@0: NS_IMETHODIMP nsWebBrowser::Deactivate(void) michael@0: { michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: nsCOMPtr window = do_GetInterface(mDocShell); michael@0: if (fm && window) michael@0: return fm->WindowLowered(window); michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void setFocusAtFirstElement (); */ michael@0: NS_IMETHODIMP nsWebBrowser::SetFocusAtFirstElement(void) michael@0: { michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* void setFocusAtLastElement (); */ michael@0: NS_IMETHODIMP nsWebBrowser::SetFocusAtLastElement(void) michael@0: { michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* attribute nsIDOMWindow focusedWindow; */ michael@0: NS_IMETHODIMP nsWebBrowser::GetFocusedWindow(nsIDOMWindow * *aFocusedWindow) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aFocusedWindow); michael@0: *aFocusedWindow = nullptr; michael@0: michael@0: nsCOMPtr window = do_GetInterface(mDocShell); michael@0: NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr focusedElement; michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: return fm ? fm->GetFocusedElementForWindow(window, true, aFocusedWindow, michael@0: getter_AddRefs(focusedElement)) : NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetFocusedWindow(nsIDOMWindow * aFocusedWindow) michael@0: { michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: return fm ? fm->SetFocusedWindow(aFocusedWindow) : NS_OK; michael@0: } michael@0: michael@0: /* attribute nsIDOMElement focusedElement; */ michael@0: NS_IMETHODIMP nsWebBrowser::GetFocusedElement(nsIDOMElement * *aFocusedElement) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aFocusedElement); michael@0: michael@0: nsCOMPtr window = do_GetInterface(mDocShell); michael@0: NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); michael@0: michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: return fm ? fm->GetFocusedElementForWindow(window, true, nullptr, aFocusedElement) : NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP nsWebBrowser::SetFocusedElement(nsIDOMElement * aFocusedElement) michael@0: { michael@0: nsCOMPtr fm = do_GetService(FOCUSMANAGER_CONTRACTID); michael@0: return fm ? fm->SetFocus(aFocusedElement, 0) : NS_OK; michael@0: } michael@0: michael@0: //***************************************************************************** michael@0: // nsWebBrowser::nsIWebBrowserStream michael@0: //***************************************************************************** michael@0: michael@0: /* void openStream(in nsIURI aBaseURI, in ACString aContentType); */ michael@0: NS_IMETHODIMP nsWebBrowser::OpenStream(nsIURI *aBaseURI, const nsACString& aContentType) michael@0: { michael@0: nsresult rv; michael@0: michael@0: if (!mStream) { michael@0: mStream = new nsEmbedStream(); michael@0: if (!mStream) michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: michael@0: mStreamGuard = do_QueryInterface(mStream); michael@0: mStream->InitOwner(this); michael@0: rv = mStream->Init(); michael@0: if (NS_FAILED(rv)) michael@0: return rv; michael@0: } michael@0: michael@0: return mStream->OpenStream(aBaseURI, aContentType); michael@0: } michael@0: michael@0: /* void appendToStream([const, array, size_is(aLen)] in octet aData, michael@0: * in unsigned long aLen); */ michael@0: NS_IMETHODIMP nsWebBrowser::AppendToStream(const uint8_t *aData, uint32_t aLen) michael@0: { michael@0: if (!mStream) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: return mStream->AppendToStream(aData, aLen); michael@0: } michael@0: michael@0: /* void closeStream (); */ michael@0: NS_IMETHODIMP nsWebBrowser::CloseStream() michael@0: { michael@0: nsresult rv; michael@0: michael@0: if (!mStream) michael@0: return NS_ERROR_FAILURE; michael@0: rv = mStream->CloseStream(); michael@0: michael@0: // release michael@0: mStream = 0; michael@0: mStreamGuard = 0; michael@0: michael@0: return rv; michael@0: }