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