1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/embedding/browser/webBrowser/nsWebBrowser.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1832 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +// Local Includes 1.10 +#include "nsWebBrowser.h" 1.11 + 1.12 +// Helper Classes 1.13 +#include "nsGfxCIID.h" 1.14 +#include "nsWidgetsCID.h" 1.15 + 1.16 +//Interfaces Needed 1.17 +#include "nsReadableUtils.h" 1.18 +#include "nsIComponentManager.h" 1.19 +#include "nsIDOMDocument.h" 1.20 +#include "nsIDOMWindow.h" 1.21 +#include "nsIDOMElement.h" 1.22 +#include "nsIInterfaceRequestor.h" 1.23 +#include "nsIInterfaceRequestorUtils.h" 1.24 +#include "nsIWebBrowserChrome.h" 1.25 +#include "nsPIDOMWindow.h" 1.26 +#include "nsIWebProgress.h" 1.27 +#include "nsIWebProgressListener.h" 1.28 +#include "nsIWebBrowserFocus.h" 1.29 +#include "nsIWebBrowserStream.h" 1.30 +#include "nsIPresShell.h" 1.31 +#include "nsIURIContentListener.h" 1.32 +#include "nsISHistoryListener.h" 1.33 +#include "nsIURI.h" 1.34 +#include "nsIWebBrowserPersist.h" 1.35 +#include "nsCWebBrowserPersist.h" 1.36 +#include "nsIServiceManager.h" 1.37 +#include "nsAutoPtr.h" 1.38 +#include "nsFocusManager.h" 1.39 +#include "Layers.h" 1.40 +#include "gfxContext.h" 1.41 +#include "nsILoadContext.h" 1.42 + 1.43 +// for painting the background window 1.44 +#include "mozilla/LookAndFeel.h" 1.45 + 1.46 +// Printing Includes 1.47 +#ifdef NS_PRINTING 1.48 +#include "nsIWebBrowserPrint.h" 1.49 +#include "nsIContentViewer.h" 1.50 +#endif 1.51 + 1.52 +// PSM2 includes 1.53 +#include "nsISecureBrowserUI.h" 1.54 +#include "nsXULAppAPI.h" 1.55 + 1.56 +using namespace mozilla; 1.57 +using namespace mozilla::layers; 1.58 + 1.59 +static NS_DEFINE_CID(kChildCID, NS_CHILD_CID); 1.60 + 1.61 + 1.62 +//***************************************************************************** 1.63 +//*** nsWebBrowser: Object Management 1.64 +//***************************************************************************** 1.65 + 1.66 +nsWebBrowser::nsWebBrowser() : mDocShellTreeOwner(nullptr), 1.67 + mInitInfo(nullptr), 1.68 + mContentType(typeContentWrapper), 1.69 + mActivating(false), 1.70 + mShouldEnableHistory(true), 1.71 + mIsActive(true), 1.72 + mParentNativeWindow(nullptr), 1.73 + mProgressListener(nullptr), 1.74 + mBackgroundColor(0), 1.75 + mPersistCurrentState(nsIWebBrowserPersist::PERSIST_STATE_READY), 1.76 + mPersistResult(NS_OK), 1.77 + mPersistFlags(nsIWebBrowserPersist::PERSIST_FLAGS_NONE), 1.78 + mStream(nullptr), 1.79 + mParentWidget(nullptr), 1.80 + mListenerArray(nullptr) 1.81 +{ 1.82 + mInitInfo = new nsWebBrowserInitInfo(); 1.83 + mWWatch = do_GetService(NS_WINDOWWATCHER_CONTRACTID); 1.84 + NS_ASSERTION(mWWatch, "failed to get WindowWatcher"); 1.85 +} 1.86 + 1.87 +nsWebBrowser::~nsWebBrowser() 1.88 +{ 1.89 + InternalDestroy(); 1.90 +} 1.91 + 1.92 +NS_IMETHODIMP nsWebBrowser::InternalDestroy() 1.93 +{ 1.94 + 1.95 + if (mInternalWidget) { 1.96 + mInternalWidget->SetWidgetListener(nullptr); 1.97 + mInternalWidget->Destroy(); 1.98 + mInternalWidget = nullptr; // Force release here. 1.99 + } 1.100 + 1.101 + SetDocShell(nullptr); 1.102 + 1.103 + if(mDocShellTreeOwner) 1.104 + { 1.105 + mDocShellTreeOwner->WebBrowser(nullptr); 1.106 + NS_RELEASE(mDocShellTreeOwner); 1.107 + } 1.108 + if(mInitInfo) 1.109 + { 1.110 + delete mInitInfo; 1.111 + mInitInfo = nullptr; 1.112 + } 1.113 + 1.114 + if (mListenerArray) { 1.115 + for (uint32_t i = 0, end = mListenerArray->Length(); i < end; i++) { 1.116 + nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); 1.117 + delete state; 1.118 + } 1.119 + delete mListenerArray; 1.120 + mListenerArray = nullptr; 1.121 + } 1.122 + 1.123 + return NS_OK; 1.124 +} 1.125 + 1.126 + 1.127 +//***************************************************************************** 1.128 +// nsWebBrowser::nsISupports 1.129 +//***************************************************************************** 1.130 + 1.131 +NS_IMPL_ADDREF(nsWebBrowser) 1.132 +NS_IMPL_RELEASE(nsWebBrowser) 1.133 + 1.134 +NS_INTERFACE_MAP_BEGIN(nsWebBrowser) 1.135 + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowser) 1.136 + NS_INTERFACE_MAP_ENTRY(nsIWebBrowser) 1.137 + NS_INTERFACE_MAP_ENTRY(nsIWebNavigation) 1.138 + NS_INTERFACE_MAP_ENTRY(nsIBaseWindow) 1.139 + NS_INTERFACE_MAP_ENTRY(nsIScrollable) 1.140 + NS_INTERFACE_MAP_ENTRY(nsITextScroll) 1.141 + NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeItem) 1.142 + NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) 1.143 + NS_INTERFACE_MAP_ENTRY(nsIWebBrowserSetup) 1.144 + NS_INTERFACE_MAP_ENTRY(nsIWebBrowserPersist) 1.145 + NS_INTERFACE_MAP_ENTRY(nsICancelable) 1.146 + NS_INTERFACE_MAP_ENTRY(nsIWebBrowserFocus) 1.147 + NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) 1.148 + NS_INTERFACE_MAP_ENTRY(nsIWebBrowserStream) 1.149 + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) 1.150 +NS_INTERFACE_MAP_END 1.151 + 1.152 +///***************************************************************************** 1.153 +// nsWebBrowser::nsIInterfaceRequestor 1.154 +//***************************************************************************** 1.155 + 1.156 +NS_IMETHODIMP nsWebBrowser::GetInterface(const nsIID& aIID, void** aSink) 1.157 +{ 1.158 + NS_ENSURE_ARG_POINTER(aSink); 1.159 + 1.160 + if(NS_SUCCEEDED(QueryInterface(aIID, aSink))) 1.161 + return NS_OK; 1.162 + 1.163 + if (mDocShell) { 1.164 +#ifdef NS_PRINTING 1.165 + if (aIID.Equals(NS_GET_IID(nsIWebBrowserPrint))) { 1.166 + nsCOMPtr<nsIContentViewer> viewer; 1.167 + mDocShell->GetContentViewer(getter_AddRefs(viewer)); 1.168 + if (!viewer) 1.169 + return NS_NOINTERFACE; 1.170 + 1.171 + nsCOMPtr<nsIWebBrowserPrint> webBrowserPrint(do_QueryInterface(viewer)); 1.172 + nsIWebBrowserPrint* print = (nsIWebBrowserPrint*)webBrowserPrint.get(); 1.173 + NS_ASSERTION(print, "This MUST support this interface!"); 1.174 + NS_ADDREF(print); 1.175 + *aSink = print; 1.176 + return NS_OK; 1.177 + } 1.178 +#endif 1.179 + return mDocShellAsReq->GetInterface(aIID, aSink); 1.180 + } 1.181 + 1.182 + return NS_NOINTERFACE; 1.183 +} 1.184 + 1.185 +//***************************************************************************** 1.186 +// nsWebBrowser::nsIWebBrowser 1.187 +//***************************************************************************** 1.188 + 1.189 +// listeners that currently support registration through AddWebBrowserListener: 1.190 +// - nsIWebProgressListener 1.191 +NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsIWeakReference *aListener, const nsIID& aIID) 1.192 +{ 1.193 + NS_ENSURE_ARG_POINTER(aListener); 1.194 + 1.195 + nsresult rv = NS_OK; 1.196 + if (!mWebProgress) { 1.197 + // The window hasn't been created yet, so queue up the listener. They'll be 1.198 + // registered when the window gets created. 1.199 + nsAutoPtr<nsWebBrowserListenerState> state; 1.200 + state = new nsWebBrowserListenerState(); 1.201 + if (!state) return NS_ERROR_OUT_OF_MEMORY; 1.202 + 1.203 + state->mWeakPtr = aListener; 1.204 + state->mID = aIID; 1.205 + 1.206 + if (!mListenerArray) { 1.207 + mListenerArray = new nsTArray<nsWebBrowserListenerState*>(); 1.208 + if (!mListenerArray) { 1.209 + return NS_ERROR_OUT_OF_MEMORY; 1.210 + } 1.211 + } 1.212 + 1.213 + if (!mListenerArray->AppendElement(state)) { 1.214 + return NS_ERROR_OUT_OF_MEMORY; 1.215 + } 1.216 + 1.217 + // We're all set now; don't delete |state| after this point 1.218 + state.forget(); 1.219 + } else { 1.220 + nsCOMPtr<nsISupports> supports(do_QueryReferent(aListener)); 1.221 + if (!supports) return NS_ERROR_INVALID_ARG; 1.222 + rv = BindListener(supports, aIID); 1.223 + } 1.224 + 1.225 + return rv; 1.226 +} 1.227 + 1.228 +NS_IMETHODIMP nsWebBrowser::BindListener(nsISupports *aListener, const nsIID& aIID) { 1.229 + NS_ENSURE_ARG_POINTER(aListener); 1.230 + NS_ASSERTION(mWebProgress, "this should only be called after we've retrieved a progress iface"); 1.231 + nsresult rv = NS_OK; 1.232 + 1.233 + // register this listener for the specified interface id 1.234 + if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { 1.235 + nsCOMPtr<nsIWebProgressListener> listener = do_QueryInterface(aListener, &rv); 1.236 + if (NS_FAILED(rv)) return rv; 1.237 + NS_ENSURE_STATE(mWebProgress); 1.238 + rv = mWebProgress->AddProgressListener(listener, nsIWebProgress::NOTIFY_ALL); 1.239 + } 1.240 + else if (aIID.Equals(NS_GET_IID(nsISHistoryListener))) { 1.241 + nsCOMPtr<nsISHistory> shistory(do_GetInterface(mDocShell, &rv)); 1.242 + if (NS_FAILED(rv)) return rv; 1.243 + nsCOMPtr<nsISHistoryListener> listener(do_QueryInterface(aListener, &rv)); 1.244 + if (NS_FAILED(rv)) return rv; 1.245 + rv = shistory->AddSHistoryListener(listener); 1.246 + } 1.247 + return rv; 1.248 +} 1.249 + 1.250 +NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsIWeakReference *aListener, const nsIID& aIID) 1.251 +{ 1.252 + NS_ENSURE_ARG_POINTER(aListener); 1.253 + 1.254 + nsresult rv = NS_OK; 1.255 + if (!mWebProgress) { 1.256 + // if there's no-one to register the listener w/, and we don't have a queue going, 1.257 + // the the called is calling Remove before an Add which doesn't make sense. 1.258 + if (!mListenerArray) return NS_ERROR_FAILURE; 1.259 + 1.260 + // iterate the array and remove the queued listener 1.261 + int32_t count = mListenerArray->Length(); 1.262 + while (count > 0) { 1.263 + nsWebBrowserListenerState *state = mListenerArray->ElementAt(count); 1.264 + NS_ASSERTION(state, "list construction problem"); 1.265 + 1.266 + if (state->Equals(aListener, aIID)) { 1.267 + // this is the one, pull it out. 1.268 + mListenerArray->RemoveElementAt(count); 1.269 + break; 1.270 + } 1.271 + count--; 1.272 + } 1.273 + 1.274 + // if we've emptied the array, get rid of it. 1.275 + if (0 >= mListenerArray->Length()) { 1.276 + for (uint32_t i = 0, end = mListenerArray->Length(); i < end; i++) { 1.277 + nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); 1.278 + delete state; 1.279 + } 1.280 + delete mListenerArray; 1.281 + mListenerArray = nullptr; 1.282 + } 1.283 + 1.284 + } else { 1.285 + nsCOMPtr<nsISupports> supports(do_QueryReferent(aListener)); 1.286 + if (!supports) return NS_ERROR_INVALID_ARG; 1.287 + rv = UnBindListener(supports, aIID); 1.288 + } 1.289 + 1.290 + return rv; 1.291 +} 1.292 + 1.293 +NS_IMETHODIMP nsWebBrowser::UnBindListener(nsISupports *aListener, const nsIID& aIID) { 1.294 + NS_ENSURE_ARG_POINTER(aListener); 1.295 + NS_ASSERTION(mWebProgress, "this should only be called after we've retrieved a progress iface"); 1.296 + nsresult rv = NS_OK; 1.297 + 1.298 + // remove the listener for the specified interface id 1.299 + if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { 1.300 + nsCOMPtr<nsIWebProgressListener> listener = do_QueryInterface(aListener, &rv); 1.301 + if (NS_FAILED(rv)) return rv; 1.302 + NS_ENSURE_STATE(mWebProgress); 1.303 + rv = mWebProgress->RemoveProgressListener(listener); 1.304 + } 1.305 + else if (aIID.Equals(NS_GET_IID(nsISHistoryListener))) { 1.306 + nsCOMPtr<nsISHistory> shistory(do_GetInterface(mDocShell, &rv)); 1.307 + if (NS_FAILED(rv)) return rv; 1.308 + nsCOMPtr<nsISHistoryListener> listener(do_QueryInterface(aListener, &rv)); 1.309 + if (NS_FAILED(rv)) return rv; 1.310 + rv = shistory->RemoveSHistoryListener(listener); 1.311 + } 1.312 + return rv; 1.313 +} 1.314 + 1.315 +NS_IMETHODIMP nsWebBrowser::EnableGlobalHistory(bool aEnable) 1.316 +{ 1.317 + NS_ENSURE_STATE(mDocShell); 1.318 + 1.319 + return mDocShell->SetUseGlobalHistory(aEnable); 1.320 +} 1.321 + 1.322 +NS_IMETHODIMP nsWebBrowser::GetContainerWindow(nsIWebBrowserChrome** aTopWindow) 1.323 +{ 1.324 + NS_ENSURE_ARG_POINTER(aTopWindow); 1.325 + 1.326 + if(mDocShellTreeOwner) { 1.327 + *aTopWindow = mDocShellTreeOwner->GetWebBrowserChrome().take(); 1.328 + } else { 1.329 + *aTopWindow = nullptr; 1.330 + } 1.331 + 1.332 + return NS_OK; 1.333 +} 1.334 + 1.335 +NS_IMETHODIMP nsWebBrowser::SetContainerWindow(nsIWebBrowserChrome* aTopWindow) 1.336 +{ 1.337 + NS_ENSURE_SUCCESS(EnsureDocShellTreeOwner(), NS_ERROR_FAILURE); 1.338 + return mDocShellTreeOwner->SetWebBrowserChrome(aTopWindow); 1.339 +} 1.340 + 1.341 +NS_IMETHODIMP nsWebBrowser::GetParentURIContentListener(nsIURIContentListener** 1.342 + aParentContentListener) 1.343 +{ 1.344 + NS_ENSURE_ARG_POINTER(aParentContentListener); 1.345 + *aParentContentListener = nullptr; 1.346 + 1.347 + // get the interface from the docshell 1.348 + nsCOMPtr<nsIURIContentListener> listener(do_GetInterface(mDocShell)); 1.349 + 1.350 + if (listener) 1.351 + return listener->GetParentContentListener(aParentContentListener); 1.352 + return NS_OK; 1.353 +} 1.354 + 1.355 +NS_IMETHODIMP nsWebBrowser::SetParentURIContentListener(nsIURIContentListener* 1.356 + aParentContentListener) 1.357 +{ 1.358 + // get the interface from the docshell 1.359 + nsCOMPtr<nsIURIContentListener> listener(do_GetInterface(mDocShell)); 1.360 + 1.361 + if (listener) 1.362 + return listener->SetParentContentListener(aParentContentListener); 1.363 + return NS_ERROR_FAILURE; 1.364 +} 1.365 + 1.366 +NS_IMETHODIMP nsWebBrowser::GetContentDOMWindow(nsIDOMWindow **_retval) 1.367 +{ 1.368 + NS_ENSURE_STATE(mDocShell); 1.369 + nsresult rv = NS_OK; 1.370 + nsCOMPtr<nsIDOMWindow> retval = do_GetInterface(mDocShell, &rv); 1.371 + if (NS_FAILED(rv)) return rv; 1.372 + 1.373 + *_retval = retval; 1.374 + NS_ADDREF(*_retval); 1.375 + return rv; 1.376 +} 1.377 + 1.378 +NS_IMETHODIMP nsWebBrowser::GetIsActive(bool *rv) 1.379 +{ 1.380 + *rv = mIsActive; 1.381 + return NS_OK; 1.382 +} 1.383 + 1.384 +NS_IMETHODIMP nsWebBrowser::SetIsActive(bool aIsActive) 1.385 +{ 1.386 + // Set our copy of the value 1.387 + mIsActive = aIsActive; 1.388 + 1.389 + // If we have a docshell, pass on the request 1.390 + if (mDocShell) 1.391 + return mDocShell->SetIsActive(aIsActive); 1.392 + return NS_OK; 1.393 +} 1.394 + 1.395 +//***************************************************************************** 1.396 +// nsWebBrowser::nsIDocShellTreeItem 1.397 +//***************************************************************************** 1.398 + 1.399 +NS_IMETHODIMP nsWebBrowser::GetName(nsAString& aName) 1.400 +{ 1.401 + if(mDocShell) 1.402 + mDocShell->GetName(aName); 1.403 + else 1.404 + aName = mInitInfo->name; 1.405 + 1.406 + return NS_OK; 1.407 +} 1.408 + 1.409 +NS_IMETHODIMP nsWebBrowser::SetName(const nsAString& aName) 1.410 +{ 1.411 + if(mDocShell) 1.412 + { 1.413 + return mDocShell->SetName(aName); 1.414 + } 1.415 + else 1.416 + mInitInfo->name = aName; 1.417 + 1.418 + return NS_OK; 1.419 +} 1.420 + 1.421 +NS_IMETHODIMP nsWebBrowser::NameEquals(const char16_t *aName, bool *_retval) 1.422 +{ 1.423 + NS_ENSURE_ARG_POINTER(aName); 1.424 + NS_ENSURE_ARG_POINTER(_retval); 1.425 + if(mDocShell) 1.426 + { 1.427 + return mDocShell->NameEquals(aName, _retval); 1.428 + } 1.429 + else 1.430 + *_retval = mInitInfo->name.Equals(aName); 1.431 + 1.432 + return NS_OK; 1.433 +} 1.434 + 1.435 +/* virtual */ int32_t 1.436 +nsWebBrowser::ItemType() 1.437 +{ 1.438 + return mContentType; 1.439 +} 1.440 + 1.441 +NS_IMETHODIMP nsWebBrowser::GetItemType(int32_t* aItemType) 1.442 +{ 1.443 + NS_ENSURE_ARG_POINTER(aItemType); 1.444 + 1.445 + *aItemType = ItemType(); 1.446 + return NS_OK; 1.447 +} 1.448 + 1.449 +NS_IMETHODIMP nsWebBrowser::SetItemType(int32_t aItemType) 1.450 +{ 1.451 + NS_ENSURE_TRUE((aItemType == typeContentWrapper || aItemType == typeChromeWrapper), NS_ERROR_FAILURE); 1.452 + mContentType = aItemType; 1.453 + if (mDocShell) 1.454 + mDocShell->SetItemType(mContentType == typeChromeWrapper 1.455 + ? static_cast<int32_t>(typeChrome) 1.456 + : static_cast<int32_t>(typeContent)); 1.457 + return NS_OK; 1.458 +} 1.459 + 1.460 +NS_IMETHODIMP nsWebBrowser::GetParent(nsIDocShellTreeItem** aParent) 1.461 +{ 1.462 + *aParent = nullptr; 1.463 + return NS_OK; 1.464 +} 1.465 + 1.466 +NS_IMETHODIMP nsWebBrowser::GetSameTypeParent(nsIDocShellTreeItem** aParent) 1.467 +{ 1.468 + *aParent = nullptr; 1.469 + 1.470 + return NS_OK; 1.471 +} 1.472 + 1.473 +NS_IMETHODIMP nsWebBrowser::GetRootTreeItem(nsIDocShellTreeItem** aRootTreeItem) 1.474 +{ 1.475 + NS_ENSURE_ARG_POINTER(aRootTreeItem); 1.476 + *aRootTreeItem = static_cast<nsIDocShellTreeItem*>(this); 1.477 + 1.478 + nsCOMPtr<nsIDocShellTreeItem> parent; 1.479 + NS_ENSURE_SUCCESS(GetParent(getter_AddRefs(parent)), NS_ERROR_FAILURE); 1.480 + while(parent) 1.481 + { 1.482 + *aRootTreeItem = parent; 1.483 + NS_ENSURE_SUCCESS((*aRootTreeItem)->GetParent(getter_AddRefs(parent)), NS_ERROR_FAILURE); 1.484 + } 1.485 + NS_ADDREF(*aRootTreeItem); 1.486 + return NS_OK; 1.487 +} 1.488 + 1.489 +NS_IMETHODIMP nsWebBrowser::GetSameTypeRootTreeItem(nsIDocShellTreeItem** aRootTreeItem) 1.490 +{ 1.491 + NS_ENSURE_ARG_POINTER(aRootTreeItem); 1.492 + *aRootTreeItem = static_cast<nsIDocShellTreeItem*>(this); 1.493 + 1.494 + nsCOMPtr<nsIDocShellTreeItem> parent; 1.495 + NS_ENSURE_SUCCESS(GetSameTypeParent(getter_AddRefs(parent)), NS_ERROR_FAILURE); 1.496 + while(parent) 1.497 + { 1.498 + *aRootTreeItem = parent; 1.499 + NS_ENSURE_SUCCESS((*aRootTreeItem)->GetSameTypeParent(getter_AddRefs(parent)), 1.500 + NS_ERROR_FAILURE); 1.501 + } 1.502 + NS_ADDREF(*aRootTreeItem); 1.503 + return NS_OK; 1.504 +} 1.505 + 1.506 +NS_IMETHODIMP nsWebBrowser::FindItemWithName(const char16_t *aName, 1.507 + nsISupports* aRequestor, nsIDocShellTreeItem* aOriginalRequestor, 1.508 + nsIDocShellTreeItem **_retval) 1.509 +{ 1.510 + NS_ENSURE_STATE(mDocShell); 1.511 + NS_ASSERTION(mDocShellTreeOwner, "This should always be set when in this situation"); 1.512 + 1.513 + return mDocShell->FindItemWithName(aName, 1.514 + static_cast<nsIDocShellTreeOwner*>(mDocShellTreeOwner), 1.515 + aOriginalRequestor, _retval); 1.516 +} 1.517 + 1.518 +NS_IMETHODIMP nsWebBrowser::GetTreeOwner(nsIDocShellTreeOwner** aTreeOwner) 1.519 +{ 1.520 + NS_ENSURE_ARG_POINTER(aTreeOwner); 1.521 + *aTreeOwner = nullptr; 1.522 + if(mDocShellTreeOwner) 1.523 + { 1.524 + if (mDocShellTreeOwner->mTreeOwner) 1.525 + { 1.526 + *aTreeOwner = mDocShellTreeOwner->mTreeOwner; 1.527 + } 1.528 + else 1.529 + { 1.530 + *aTreeOwner = mDocShellTreeOwner; 1.531 + } 1.532 + } 1.533 + NS_IF_ADDREF(*aTreeOwner); 1.534 + return NS_OK; 1.535 +} 1.536 + 1.537 +NS_IMETHODIMP nsWebBrowser::SetTreeOwner(nsIDocShellTreeOwner* aTreeOwner) 1.538 +{ 1.539 + NS_ENSURE_SUCCESS(EnsureDocShellTreeOwner(), NS_ERROR_FAILURE); 1.540 + return mDocShellTreeOwner->SetTreeOwner(aTreeOwner); 1.541 +} 1.542 + 1.543 +//***************************************************************************** 1.544 +// nsWebBrowser::nsIDocShellTreeItem 1.545 +//***************************************************************************** 1.546 + 1.547 +NS_IMETHODIMP nsWebBrowser::GetChildCount(int32_t * aChildCount) 1.548 +{ 1.549 + NS_ENSURE_ARG_POINTER(aChildCount); 1.550 + *aChildCount = 0; 1.551 + return NS_OK; 1.552 +} 1.553 + 1.554 +NS_IMETHODIMP nsWebBrowser::AddChild(nsIDocShellTreeItem * aChild) 1.555 +{ 1.556 + return NS_ERROR_UNEXPECTED; 1.557 +} 1.558 + 1.559 +NS_IMETHODIMP nsWebBrowser::RemoveChild(nsIDocShellTreeItem * aChild) 1.560 +{ 1.561 + return NS_ERROR_UNEXPECTED; 1.562 +} 1.563 + 1.564 +NS_IMETHODIMP nsWebBrowser::GetChildAt(int32_t aIndex, 1.565 + nsIDocShellTreeItem ** aChild) 1.566 +{ 1.567 + return NS_ERROR_UNEXPECTED; 1.568 +} 1.569 + 1.570 +NS_IMETHODIMP nsWebBrowser::FindChildWithName( 1.571 + const char16_t * aName, 1.572 + bool aRecurse, bool aSameType, 1.573 + nsIDocShellTreeItem * aRequestor, 1.574 + nsIDocShellTreeItem * aOriginalRequestor, 1.575 + nsIDocShellTreeItem ** _retval) 1.576 +{ 1.577 + NS_ENSURE_ARG_POINTER(_retval); 1.578 + 1.579 + *_retval = nullptr; 1.580 + return NS_OK; 1.581 +} 1.582 + 1.583 +//***************************************************************************** 1.584 +// nsWebBrowser::nsIWebNavigation 1.585 +//***************************************************************************** 1.586 + 1.587 +NS_IMETHODIMP nsWebBrowser::GetCanGoBack(bool* aCanGoBack) 1.588 +{ 1.589 + NS_ENSURE_STATE(mDocShell); 1.590 + 1.591 + return mDocShellAsNav->GetCanGoBack(aCanGoBack); 1.592 +} 1.593 + 1.594 +NS_IMETHODIMP nsWebBrowser::GetCanGoForward(bool* aCanGoForward) 1.595 +{ 1.596 + NS_ENSURE_STATE(mDocShell); 1.597 + 1.598 + return mDocShellAsNav->GetCanGoForward(aCanGoForward); 1.599 +} 1.600 + 1.601 +NS_IMETHODIMP nsWebBrowser::GoBack() 1.602 +{ 1.603 + NS_ENSURE_STATE(mDocShell); 1.604 + 1.605 + return mDocShellAsNav->GoBack(); 1.606 +} 1.607 + 1.608 +NS_IMETHODIMP nsWebBrowser::GoForward() 1.609 +{ 1.610 + NS_ENSURE_STATE(mDocShell); 1.611 + 1.612 + return mDocShellAsNav->GoForward(); 1.613 +} 1.614 + 1.615 +NS_IMETHODIMP nsWebBrowser::LoadURIWithBase(const char16_t* aURI, 1.616 + uint32_t aLoadFlags, 1.617 + nsIURI* aReferringURI, 1.618 + nsIInputStream* aPostDataStream, 1.619 + nsIInputStream* aExtraHeaderStream, 1.620 + nsIURI* aBaseURI) 1.621 +{ 1.622 + NS_ENSURE_STATE(mDocShell); 1.623 + 1.624 + return mDocShellAsNav->LoadURIWithBase(aURI, 1.625 + aLoadFlags, 1.626 + aReferringURI, 1.627 + aPostDataStream, 1.628 + aExtraHeaderStream, 1.629 + aBaseURI); 1.630 +} 1.631 + 1.632 +NS_IMETHODIMP nsWebBrowser::LoadURI(const char16_t* aURI, 1.633 + uint32_t aLoadFlags, 1.634 + nsIURI* aReferringURI, 1.635 + nsIInputStream* aPostDataStream, 1.636 + nsIInputStream* aExtraHeaderStream) 1.637 +{ 1.638 + NS_ENSURE_STATE(mDocShell); 1.639 + 1.640 + return mDocShellAsNav->LoadURI(aURI, 1.641 + aLoadFlags, 1.642 + aReferringURI, 1.643 + aPostDataStream, 1.644 + aExtraHeaderStream); 1.645 +} 1.646 + 1.647 +NS_IMETHODIMP nsWebBrowser::Reload(uint32_t aReloadFlags) 1.648 +{ 1.649 + NS_ENSURE_STATE(mDocShell); 1.650 + 1.651 + return mDocShellAsNav->Reload(aReloadFlags); 1.652 +} 1.653 + 1.654 +NS_IMETHODIMP nsWebBrowser::GotoIndex(int32_t aIndex) 1.655 +{ 1.656 + NS_ENSURE_STATE(mDocShell); 1.657 + 1.658 + return mDocShellAsNav->GotoIndex(aIndex); 1.659 +} 1.660 + 1.661 +NS_IMETHODIMP nsWebBrowser::Stop(uint32_t aStopFlags) 1.662 +{ 1.663 + NS_ENSURE_STATE(mDocShell); 1.664 + 1.665 + return mDocShellAsNav->Stop(aStopFlags); 1.666 +} 1.667 + 1.668 +NS_IMETHODIMP nsWebBrowser::GetCurrentURI(nsIURI** aURI) 1.669 +{ 1.670 + NS_ENSURE_STATE(mDocShell); 1.671 + 1.672 + return mDocShellAsNav->GetCurrentURI(aURI); 1.673 +} 1.674 + 1.675 +NS_IMETHODIMP nsWebBrowser::GetReferringURI(nsIURI** aURI) 1.676 +{ 1.677 + NS_ENSURE_STATE(mDocShell); 1.678 + 1.679 + return mDocShellAsNav->GetReferringURI(aURI); 1.680 +} 1.681 + 1.682 +NS_IMETHODIMP nsWebBrowser::SetSessionHistory(nsISHistory* aSessionHistory) 1.683 +{ 1.684 + if(mDocShell) 1.685 + return mDocShellAsNav->SetSessionHistory(aSessionHistory); 1.686 + else 1.687 + mInitInfo->sessionHistory = aSessionHistory; 1.688 + 1.689 + return NS_OK; 1.690 +} 1.691 + 1.692 +NS_IMETHODIMP nsWebBrowser::GetSessionHistory(nsISHistory** aSessionHistory) 1.693 +{ 1.694 + NS_ENSURE_ARG_POINTER(aSessionHistory); 1.695 + if(mDocShell) 1.696 + return mDocShellAsNav->GetSessionHistory(aSessionHistory); 1.697 + else 1.698 + *aSessionHistory = mInitInfo->sessionHistory; 1.699 + 1.700 + NS_IF_ADDREF(*aSessionHistory); 1.701 + 1.702 + return NS_OK; 1.703 +} 1.704 + 1.705 + 1.706 +NS_IMETHODIMP nsWebBrowser::GetDocument(nsIDOMDocument** aDocument) 1.707 +{ 1.708 + NS_ENSURE_STATE(mDocShell); 1.709 + 1.710 + return mDocShellAsNav->GetDocument(aDocument); 1.711 +} 1.712 + 1.713 + 1.714 +//***************************************************************************** 1.715 +// nsWebBrowser::nsIWebBrowserSetup 1.716 +//***************************************************************************** 1.717 + 1.718 +/* void setProperty (in unsigned long aId, in unsigned long aValue); */ 1.719 +NS_IMETHODIMP nsWebBrowser::SetProperty(uint32_t aId, uint32_t aValue) 1.720 +{ 1.721 + nsresult rv = NS_OK; 1.722 + 1.723 + switch (aId) 1.724 + { 1.725 + case nsIWebBrowserSetup::SETUP_ALLOW_PLUGINS: 1.726 + { 1.727 + NS_ENSURE_STATE(mDocShell); 1.728 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.729 + aValue == static_cast<uint32_t>(false)), 1.730 + NS_ERROR_INVALID_ARG); 1.731 + mDocShell->SetAllowPlugins(!!aValue); 1.732 + } 1.733 + break; 1.734 + case nsIWebBrowserSetup::SETUP_ALLOW_JAVASCRIPT: 1.735 + { 1.736 + NS_ENSURE_STATE(mDocShell); 1.737 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.738 + aValue == static_cast<uint32_t>(false)), 1.739 + NS_ERROR_INVALID_ARG); 1.740 + mDocShell->SetAllowJavascript(!!aValue); 1.741 + } 1.742 + break; 1.743 + case nsIWebBrowserSetup::SETUP_ALLOW_META_REDIRECTS: 1.744 + { 1.745 + NS_ENSURE_STATE(mDocShell); 1.746 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.747 + aValue == static_cast<uint32_t>(false)), 1.748 + NS_ERROR_INVALID_ARG); 1.749 + mDocShell->SetAllowMetaRedirects(!!aValue); 1.750 + } 1.751 + break; 1.752 + case nsIWebBrowserSetup::SETUP_ALLOW_SUBFRAMES: 1.753 + { 1.754 + NS_ENSURE_STATE(mDocShell); 1.755 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.756 + aValue == static_cast<uint32_t>(false)), 1.757 + NS_ERROR_INVALID_ARG); 1.758 + mDocShell->SetAllowSubframes(!!aValue); 1.759 + } 1.760 + break; 1.761 + case nsIWebBrowserSetup::SETUP_ALLOW_IMAGES: 1.762 + { 1.763 + NS_ENSURE_STATE(mDocShell); 1.764 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.765 + aValue == static_cast<uint32_t>(false)), 1.766 + NS_ERROR_INVALID_ARG); 1.767 + mDocShell->SetAllowImages(!!aValue); 1.768 + } 1.769 + break; 1.770 + case nsIWebBrowserSetup::SETUP_ALLOW_DNS_PREFETCH: 1.771 + { 1.772 + NS_ENSURE_STATE(mDocShell); 1.773 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.774 + aValue == static_cast<uint32_t>(false)), 1.775 + NS_ERROR_INVALID_ARG); 1.776 + mDocShell->SetAllowDNSPrefetch(!!aValue); 1.777 + } 1.778 + break; 1.779 + case nsIWebBrowserSetup::SETUP_USE_GLOBAL_HISTORY: 1.780 + { 1.781 + NS_ENSURE_STATE(mDocShell); 1.782 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.783 + aValue == static_cast<uint32_t>(false)), 1.784 + NS_ERROR_INVALID_ARG); 1.785 + rv = EnableGlobalHistory(!!aValue); 1.786 + mShouldEnableHistory = aValue; 1.787 + } 1.788 + break; 1.789 + case nsIWebBrowserSetup::SETUP_FOCUS_DOC_BEFORE_CONTENT: 1.790 + { 1.791 + // obsolete 1.792 + } 1.793 + break; 1.794 + case nsIWebBrowserSetup::SETUP_IS_CHROME_WRAPPER: 1.795 + { 1.796 + NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) || 1.797 + aValue == static_cast<uint32_t>(false)), 1.798 + NS_ERROR_INVALID_ARG); 1.799 + SetItemType(aValue ? static_cast<int32_t>(typeChromeWrapper) 1.800 + : static_cast<int32_t>(typeContentWrapper)); 1.801 + } 1.802 + break; 1.803 + default: 1.804 + rv = NS_ERROR_INVALID_ARG; 1.805 + 1.806 + } 1.807 + return rv; 1.808 +} 1.809 + 1.810 + 1.811 +//***************************************************************************** 1.812 +// nsWebBrowser::nsIWebProgressListener 1.813 +//***************************************************************************** 1.814 + 1.815 +/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */ 1.816 +NS_IMETHODIMP nsWebBrowser::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus) 1.817 +{ 1.818 + if (mPersist) 1.819 + { 1.820 + mPersist->GetCurrentState(&mPersistCurrentState); 1.821 + } 1.822 + if (aStateFlags & STATE_IS_NETWORK && aStateFlags & STATE_STOP) 1.823 + { 1.824 + mPersist = nullptr; 1.825 + } 1.826 + if (mProgressListener) 1.827 + { 1.828 + return mProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus); 1.829 + } 1.830 + return NS_OK; 1.831 +} 1.832 + 1.833 +/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */ 1.834 +NS_IMETHODIMP nsWebBrowser::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress) 1.835 +{ 1.836 + if (mPersist) 1.837 + { 1.838 + mPersist->GetCurrentState(&mPersistCurrentState); 1.839 + } 1.840 + if (mProgressListener) 1.841 + { 1.842 + return mProgressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress); 1.843 + } 1.844 + return NS_OK; 1.845 +} 1.846 + 1.847 +/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */ 1.848 +NS_IMETHODIMP nsWebBrowser::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags) 1.849 +{ 1.850 + if (mProgressListener) 1.851 + { 1.852 + return mProgressListener->OnLocationChange(aWebProgress, aRequest, location, aFlags); 1.853 + } 1.854 + return NS_OK; 1.855 +} 1.856 + 1.857 +/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */ 1.858 +NS_IMETHODIMP nsWebBrowser::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage) 1.859 +{ 1.860 + if (mProgressListener) 1.861 + { 1.862 + return mProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage); 1.863 + } 1.864 + return NS_OK; 1.865 +} 1.866 + 1.867 +/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */ 1.868 +NS_IMETHODIMP nsWebBrowser::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state) 1.869 +{ 1.870 + if (mProgressListener) 1.871 + { 1.872 + return mProgressListener->OnSecurityChange(aWebProgress, aRequest, state); 1.873 + } 1.874 + return NS_OK; 1.875 +} 1.876 + 1.877 +//***************************************************************************** 1.878 +// nsWebBrowser::nsIWebBrowserPersist 1.879 +//***************************************************************************** 1.880 + 1.881 +/* attribute unsigned long persistFlags; */ 1.882 +NS_IMETHODIMP nsWebBrowser::GetPersistFlags(uint32_t *aPersistFlags) 1.883 +{ 1.884 + NS_ENSURE_ARG_POINTER(aPersistFlags); 1.885 + nsresult rv = NS_OK; 1.886 + if (mPersist) 1.887 + { 1.888 + rv = mPersist->GetPersistFlags(&mPersistFlags); 1.889 + } 1.890 + *aPersistFlags = mPersistFlags; 1.891 + return rv; 1.892 +} 1.893 +NS_IMETHODIMP nsWebBrowser::SetPersistFlags(uint32_t aPersistFlags) 1.894 +{ 1.895 + nsresult rv = NS_OK; 1.896 + mPersistFlags = aPersistFlags; 1.897 + if (mPersist) 1.898 + { 1.899 + rv = mPersist->SetPersistFlags(mPersistFlags); 1.900 + mPersist->GetPersistFlags(&mPersistFlags); 1.901 + } 1.902 + return rv; 1.903 +} 1.904 + 1.905 + 1.906 +/* readonly attribute unsigned long currentState; */ 1.907 +NS_IMETHODIMP nsWebBrowser::GetCurrentState(uint32_t *aCurrentState) 1.908 +{ 1.909 + NS_ENSURE_ARG_POINTER(aCurrentState); 1.910 + if (mPersist) 1.911 + { 1.912 + mPersist->GetCurrentState(&mPersistCurrentState); 1.913 + } 1.914 + *aCurrentState = mPersistCurrentState; 1.915 + return NS_OK; 1.916 +} 1.917 + 1.918 +/* readonly attribute nsresult result; */ 1.919 +NS_IMETHODIMP nsWebBrowser::GetResult(nsresult *aResult) 1.920 +{ 1.921 + NS_ENSURE_ARG_POINTER(aResult); 1.922 + if (mPersist) 1.923 + { 1.924 + mPersist->GetResult(&mPersistResult); 1.925 + } 1.926 + *aResult = mPersistResult; 1.927 + return NS_OK; 1.928 +} 1.929 + 1.930 +/* attribute nsIWebBrowserPersistProgress progressListener; */ 1.931 +NS_IMETHODIMP nsWebBrowser::GetProgressListener(nsIWebProgressListener * *aProgressListener) 1.932 +{ 1.933 + NS_ENSURE_ARG_POINTER(aProgressListener); 1.934 + *aProgressListener = mProgressListener; 1.935 + NS_IF_ADDREF(*aProgressListener); 1.936 + return NS_OK; 1.937 +} 1.938 + 1.939 +NS_IMETHODIMP nsWebBrowser::SetProgressListener(nsIWebProgressListener * aProgressListener) 1.940 +{ 1.941 + mProgressListener = aProgressListener; 1.942 + return NS_OK; 1.943 +} 1.944 + 1.945 +/* void saveURI (in nsIURI aURI, in nsIURI aReferrer, 1.946 + in nsISupports aCacheKey, in nsIInputStream aPostData, in wstring aExtraHeaders, 1.947 + in nsISupports aFile, in nsILoadContext aPrivacyContext); */ 1.948 +NS_IMETHODIMP nsWebBrowser::SaveURI( 1.949 + nsIURI *aURI, nsISupports *aCacheKey, nsIURI *aReferrer, nsIInputStream *aPostData, 1.950 + const char *aExtraHeaders, nsISupports *aFile, nsILoadContext* aPrivacyContext) 1.951 +{ 1.952 + return SavePrivacyAwareURI(aURI, aCacheKey, aReferrer, aPostData, aExtraHeaders, 1.953 + aFile, aPrivacyContext && aPrivacyContext->UsePrivateBrowsing()); 1.954 +} 1.955 + 1.956 +NS_IMETHODIMP nsWebBrowser::SavePrivacyAwareURI( 1.957 + nsIURI *aURI, nsISupports *aCacheKey, nsIURI *aReferrer, nsIInputStream *aPostData, 1.958 + const char *aExtraHeaders, nsISupports *aFile, bool aIsPrivate) 1.959 +{ 1.960 + if (mPersist) 1.961 + { 1.962 + uint32_t currentState; 1.963 + mPersist->GetCurrentState(¤tState); 1.964 + if (currentState == PERSIST_STATE_FINISHED) 1.965 + { 1.966 + mPersist = nullptr; 1.967 + } 1.968 + else 1.969 + { 1.970 + // You can't save again until the last save has completed 1.971 + return NS_ERROR_FAILURE; 1.972 + } 1.973 + } 1.974 + 1.975 + nsCOMPtr<nsIURI> uri; 1.976 + if (aURI) 1.977 + { 1.978 + uri = aURI; 1.979 + } 1.980 + else 1.981 + { 1.982 + nsresult rv = GetCurrentURI(getter_AddRefs(uri)); 1.983 + if (NS_FAILED(rv)) 1.984 + { 1.985 + return NS_ERROR_FAILURE; 1.986 + } 1.987 + } 1.988 + 1.989 + // Create a throwaway persistence object to do the work 1.990 + nsresult rv; 1.991 + mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv); 1.992 + NS_ENSURE_SUCCESS(rv, rv); 1.993 + mPersist->SetProgressListener(this); 1.994 + mPersist->SetPersistFlags(mPersistFlags); 1.995 + mPersist->GetCurrentState(&mPersistCurrentState); 1.996 + rv = mPersist->SavePrivacyAwareURI(uri, aCacheKey, aReferrer, aPostData, 1.997 + aExtraHeaders, aFile, aIsPrivate); 1.998 + if (NS_FAILED(rv)) 1.999 + { 1.1000 + mPersist = nullptr; 1.1001 + } 1.1002 + return rv; 1.1003 +} 1.1004 + 1.1005 +/* void saveChannel (in nsIChannel aChannel, in nsISupports aFile); */ 1.1006 +NS_IMETHODIMP nsWebBrowser::SaveChannel( 1.1007 + nsIChannel* aChannel, nsISupports *aFile) 1.1008 +{ 1.1009 + if (mPersist) 1.1010 + { 1.1011 + uint32_t currentState; 1.1012 + mPersist->GetCurrentState(¤tState); 1.1013 + if (currentState == PERSIST_STATE_FINISHED) 1.1014 + { 1.1015 + mPersist = nullptr; 1.1016 + } 1.1017 + else 1.1018 + { 1.1019 + // You can't save again until the last save has completed 1.1020 + return NS_ERROR_FAILURE; 1.1021 + } 1.1022 + } 1.1023 + 1.1024 + // Create a throwaway persistence object to do the work 1.1025 + nsresult rv; 1.1026 + mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv); 1.1027 + NS_ENSURE_SUCCESS(rv, rv); 1.1028 + mPersist->SetProgressListener(this); 1.1029 + mPersist->SetPersistFlags(mPersistFlags); 1.1030 + mPersist->GetCurrentState(&mPersistCurrentState); 1.1031 + rv = mPersist->SaveChannel(aChannel, aFile); 1.1032 + if (NS_FAILED(rv)) 1.1033 + { 1.1034 + mPersist = nullptr; 1.1035 + } 1.1036 + return rv; 1.1037 +} 1.1038 + 1.1039 +/* void saveDocument (in nsIDOMDocument document, in nsISupports aFile, in nsISupports aDataPath); */ 1.1040 +NS_IMETHODIMP nsWebBrowser::SaveDocument( 1.1041 + nsIDOMDocument *aDocument, nsISupports *aFile, nsISupports *aDataPath, 1.1042 + const char *aOutputContentType, uint32_t aEncodingFlags, uint32_t aWrapColumn) 1.1043 +{ 1.1044 + if (mPersist) 1.1045 + { 1.1046 + uint32_t currentState; 1.1047 + mPersist->GetCurrentState(¤tState); 1.1048 + if (currentState == PERSIST_STATE_FINISHED) 1.1049 + { 1.1050 + mPersist = nullptr; 1.1051 + } 1.1052 + else 1.1053 + { 1.1054 + // You can't save again until the last save has completed 1.1055 + return NS_ERROR_FAILURE; 1.1056 + } 1.1057 + } 1.1058 + 1.1059 + // Use the specified DOM document, or if none is specified, the one 1.1060 + // attached to the web browser. 1.1061 + 1.1062 + nsCOMPtr<nsIDOMDocument> doc; 1.1063 + if (aDocument) 1.1064 + { 1.1065 + doc = do_QueryInterface(aDocument); 1.1066 + } 1.1067 + else 1.1068 + { 1.1069 + GetDocument(getter_AddRefs(doc)); 1.1070 + } 1.1071 + if (!doc) 1.1072 + { 1.1073 + return NS_ERROR_FAILURE; 1.1074 + } 1.1075 + 1.1076 + // Create a throwaway persistence object to do the work 1.1077 + nsresult rv; 1.1078 + mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv); 1.1079 + NS_ENSURE_SUCCESS(rv, rv); 1.1080 + mPersist->SetProgressListener(this); 1.1081 + mPersist->SetPersistFlags(mPersistFlags); 1.1082 + mPersist->GetCurrentState(&mPersistCurrentState); 1.1083 + rv = mPersist->SaveDocument(doc, aFile, aDataPath, aOutputContentType, aEncodingFlags, aWrapColumn); 1.1084 + if (NS_FAILED(rv)) 1.1085 + { 1.1086 + mPersist = nullptr; 1.1087 + } 1.1088 + return rv; 1.1089 +} 1.1090 + 1.1091 +/* void cancelSave(); */ 1.1092 +NS_IMETHODIMP nsWebBrowser::CancelSave() 1.1093 +{ 1.1094 + if (mPersist) 1.1095 + { 1.1096 + return mPersist->CancelSave(); 1.1097 + } 1.1098 + return NS_OK; 1.1099 +} 1.1100 + 1.1101 +/* void cancel(nsresult aReason); */ 1.1102 +NS_IMETHODIMP nsWebBrowser::Cancel(nsresult aReason) 1.1103 +{ 1.1104 + if (mPersist) 1.1105 + { 1.1106 + return mPersist->Cancel(aReason); 1.1107 + } 1.1108 + return NS_OK; 1.1109 +} 1.1110 + 1.1111 + 1.1112 + 1.1113 + 1.1114 +//***************************************************************************** 1.1115 +// nsWebBrowser::nsIBaseWindow 1.1116 +//***************************************************************************** 1.1117 + 1.1118 +NS_IMETHODIMP nsWebBrowser::InitWindow(nativeWindow aParentNativeWindow, 1.1119 + nsIWidget* aParentWidget, int32_t aX, int32_t aY, int32_t aCX, int32_t aCY) 1.1120 +{ 1.1121 + NS_ENSURE_ARG(aParentNativeWindow || aParentWidget); 1.1122 + NS_ENSURE_STATE(!mDocShell || mInitInfo); 1.1123 + 1.1124 + if(aParentWidget) 1.1125 + NS_ENSURE_SUCCESS(SetParentWidget(aParentWidget), NS_ERROR_FAILURE); 1.1126 + else 1.1127 + NS_ENSURE_SUCCESS(SetParentNativeWindow(aParentNativeWindow), 1.1128 + NS_ERROR_FAILURE); 1.1129 + 1.1130 + NS_ENSURE_SUCCESS(SetPositionAndSize(aX, aY, aCX, aCY, false), 1.1131 + NS_ERROR_FAILURE); 1.1132 + 1.1133 + return NS_OK; 1.1134 +} 1.1135 + 1.1136 +NS_IMETHODIMP nsWebBrowser::Create() 1.1137 +{ 1.1138 + NS_ENSURE_STATE(!mDocShell && (mParentNativeWindow || mParentWidget)); 1.1139 + 1.1140 + nsresult rv = EnsureDocShellTreeOwner(); 1.1141 + NS_ENSURE_SUCCESS(rv, rv); 1.1142 + 1.1143 + nsCOMPtr<nsIWidget> docShellParentWidget(mParentWidget); 1.1144 + if(!mParentWidget) // We need to create a widget 1.1145 + { 1.1146 + // Create the widget 1.1147 + mInternalWidget = do_CreateInstance(kChildCID, &rv); 1.1148 + NS_ENSURE_SUCCESS(rv, rv); 1.1149 + 1.1150 + docShellParentWidget = mInternalWidget; 1.1151 + nsWidgetInitData widgetInit; 1.1152 + 1.1153 + widgetInit.clipChildren = true; 1.1154 + 1.1155 + widgetInit.mWindowType = eWindowType_child; 1.1156 + nsIntRect bounds(mInitInfo->x, mInitInfo->y, mInitInfo->cx, mInitInfo->cy); 1.1157 + 1.1158 + mInternalWidget->SetWidgetListener(this); 1.1159 + mInternalWidget->Create(nullptr, mParentNativeWindow, bounds, nullptr, &widgetInit); 1.1160 + } 1.1161 + 1.1162 + nsCOMPtr<nsIDocShell> docShell(do_CreateInstance("@mozilla.org/docshell;1", &rv)); 1.1163 + NS_ENSURE_SUCCESS(rv, rv); 1.1164 + rv = SetDocShell(docShell); 1.1165 + NS_ENSURE_SUCCESS(rv, rv); 1.1166 + 1.1167 + // get the system default window background colour 1.1168 + LookAndFeel::GetColor(LookAndFeel::eColorID_WindowBackground, 1.1169 + &mBackgroundColor); 1.1170 + 1.1171 + // the docshell has been set so we now have our listener registrars. 1.1172 + if (mListenerArray) { 1.1173 + // we had queued up some listeners, let's register them now. 1.1174 + uint32_t count = mListenerArray->Length(); 1.1175 + uint32_t i = 0; 1.1176 + NS_ASSERTION(count > 0, "array construction problem"); 1.1177 + while (i < count) { 1.1178 + nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); 1.1179 + NS_ASSERTION(state, "array construction problem"); 1.1180 + nsCOMPtr<nsISupports> listener = do_QueryReferent(state->mWeakPtr); 1.1181 + NS_ASSERTION(listener, "bad listener"); 1.1182 + (void)BindListener(listener, state->mID); 1.1183 + i++; 1.1184 + } 1.1185 + for (uint32_t i = 0, end = mListenerArray->Length(); i < end; i++) { 1.1186 + nsWebBrowserListenerState *state = mListenerArray->ElementAt(i); 1.1187 + delete state; 1.1188 + } 1.1189 + delete mListenerArray; 1.1190 + mListenerArray = nullptr; 1.1191 + } 1.1192 + 1.1193 + // HACK ALERT - this registration registers the nsDocShellTreeOwner as a 1.1194 + // nsIWebBrowserListener so it can setup its MouseListener in one of the 1.1195 + // progress callbacks. If we can register the MouseListener another way, this 1.1196 + // registration can go away, and nsDocShellTreeOwner can stop implementing 1.1197 + // nsIWebProgressListener. 1.1198 + nsCOMPtr<nsISupports> supports = nullptr; 1.1199 + (void)mDocShellTreeOwner->QueryInterface(NS_GET_IID(nsIWebProgressListener), 1.1200 + static_cast<void**>(getter_AddRefs(supports))); 1.1201 + (void)BindListener(supports, NS_GET_IID(nsIWebProgressListener)); 1.1202 + 1.1203 + NS_ENSURE_SUCCESS(mDocShellAsWin->InitWindow(nullptr, 1.1204 + docShellParentWidget, mInitInfo->x, mInitInfo->y, mInitInfo->cx, 1.1205 + mInitInfo->cy), NS_ERROR_FAILURE); 1.1206 + 1.1207 + mDocShell->SetName(mInitInfo->name); 1.1208 + if (mContentType == typeChromeWrapper) 1.1209 + { 1.1210 + mDocShell->SetItemType(nsIDocShellTreeItem::typeChrome); 1.1211 + } 1.1212 + else 1.1213 + { 1.1214 + mDocShell->SetItemType(nsIDocShellTreeItem::typeContent); 1.1215 + } 1.1216 + mDocShell->SetTreeOwner(mDocShellTreeOwner); 1.1217 + 1.1218 + // If the webbrowser is a content docshell item then we won't hear any 1.1219 + // events from subframes. To solve that we install our own chrome event handler 1.1220 + // that always gets called (even for subframes) for any bubbling event. 1.1221 + 1.1222 + if (!mInitInfo->sessionHistory) { 1.1223 + mInitInfo->sessionHistory = do_CreateInstance(NS_SHISTORY_CONTRACTID, &rv); 1.1224 + NS_ENSURE_SUCCESS(rv, rv); 1.1225 + } 1.1226 + mDocShellAsNav->SetSessionHistory(mInitInfo->sessionHistory); 1.1227 + 1.1228 + if (XRE_GetProcessType() == GeckoProcessType_Default) { 1.1229 + // Hook up global history. Do not fail if we can't - just warn. 1.1230 + rv = EnableGlobalHistory(mShouldEnableHistory); 1.1231 + NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "EnableGlobalHistory() failed"); 1.1232 + } 1.1233 + 1.1234 + NS_ENSURE_SUCCESS(mDocShellAsWin->Create(), NS_ERROR_FAILURE); 1.1235 + 1.1236 + // Hook into the OnSecurityChange() notification for lock/unlock icon 1.1237 + // updates 1.1238 + nsCOMPtr<nsIDOMWindow> domWindow; 1.1239 + rv = GetContentDOMWindow(getter_AddRefs(domWindow)); 1.1240 + if (NS_SUCCEEDED(rv)) 1.1241 + { 1.1242 + // this works because the implementation of nsISecureBrowserUI 1.1243 + // (nsSecureBrowserUIImpl) gets a docShell from the domWindow, 1.1244 + // and calls docShell->SetSecurityUI(this); 1.1245 + nsCOMPtr<nsISecureBrowserUI> securityUI = 1.1246 + do_CreateInstance(NS_SECURE_BROWSER_UI_CONTRACTID, &rv); 1.1247 + if (NS_SUCCEEDED(rv)) 1.1248 + securityUI->Init(domWindow); 1.1249 + } 1.1250 + 1.1251 + mDocShellTreeOwner->AddToWatcher(); // evil twin of Remove in SetDocShell(0) 1.1252 + mDocShellTreeOwner->AddChromeListeners(); 1.1253 + 1.1254 + delete mInitInfo; 1.1255 + mInitInfo = nullptr; 1.1256 + 1.1257 + return NS_OK; 1.1258 +} 1.1259 + 1.1260 +NS_IMETHODIMP nsWebBrowser::Destroy() 1.1261 +{ 1.1262 + InternalDestroy(); 1.1263 + 1.1264 + if(!mInitInfo) 1.1265 + mInitInfo = new nsWebBrowserInitInfo(); 1.1266 + 1.1267 + return NS_OK; 1.1268 +} 1.1269 + 1.1270 +NS_IMETHODIMP nsWebBrowser::GetUnscaledDevicePixelsPerCSSPixel(double *aScale) 1.1271 +{ 1.1272 + *aScale = mParentWidget ? mParentWidget->GetDefaultScale().scale : 1.0; 1.1273 + return NS_OK; 1.1274 +} 1.1275 + 1.1276 +NS_IMETHODIMP nsWebBrowser::SetPosition(int32_t aX, int32_t aY) 1.1277 +{ 1.1278 + int32_t cx = 0; 1.1279 + int32_t cy = 0; 1.1280 + 1.1281 + GetSize(&cx, &cy); 1.1282 + 1.1283 + return SetPositionAndSize(aX, aY, cx, cy, false); 1.1284 +} 1.1285 + 1.1286 +NS_IMETHODIMP nsWebBrowser::GetPosition(int32_t* aX, int32_t* aY) 1.1287 +{ 1.1288 + return GetPositionAndSize(aX, aY, nullptr, nullptr); 1.1289 +} 1.1290 + 1.1291 +NS_IMETHODIMP nsWebBrowser::SetSize(int32_t aCX, int32_t aCY, bool aRepaint) 1.1292 +{ 1.1293 + int32_t x = 0; 1.1294 + int32_t y = 0; 1.1295 + 1.1296 + GetPosition(&x, &y); 1.1297 + 1.1298 + return SetPositionAndSize(x, y, aCX, aCY, aRepaint); 1.1299 +} 1.1300 + 1.1301 +NS_IMETHODIMP nsWebBrowser::GetSize(int32_t* aCX, int32_t* aCY) 1.1302 +{ 1.1303 + return GetPositionAndSize(nullptr, nullptr, aCX, aCY); 1.1304 +} 1.1305 + 1.1306 +NS_IMETHODIMP nsWebBrowser::SetPositionAndSize(int32_t aX, int32_t aY, 1.1307 + int32_t aCX, int32_t aCY, bool aRepaint) 1.1308 +{ 1.1309 + if(!mDocShell) 1.1310 + { 1.1311 + mInitInfo->x = aX; 1.1312 + mInitInfo->y = aY; 1.1313 + mInitInfo->cx = aCX; 1.1314 + mInitInfo->cy = aCY; 1.1315 + } 1.1316 + else 1.1317 + { 1.1318 + int32_t doc_x = aX; 1.1319 + int32_t doc_y = aY; 1.1320 + 1.1321 + // If there is an internal widget we need to make the docShell coordinates 1.1322 + // relative to the internal widget rather than the calling app's parent. 1.1323 + // We also need to resize our widget then. 1.1324 + if(mInternalWidget) 1.1325 + { 1.1326 + doc_x = doc_y = 0; 1.1327 + NS_ENSURE_SUCCESS(mInternalWidget->Resize(aX, aY, aCX, aCY, aRepaint), 1.1328 + NS_ERROR_FAILURE); 1.1329 + } 1.1330 + // Now reposition/ resize the doc 1.1331 + NS_ENSURE_SUCCESS(mDocShellAsWin->SetPositionAndSize(doc_x, doc_y, aCX, aCY, 1.1332 + aRepaint), NS_ERROR_FAILURE); 1.1333 + } 1.1334 + 1.1335 + return NS_OK; 1.1336 +} 1.1337 + 1.1338 +NS_IMETHODIMP nsWebBrowser::GetPositionAndSize(int32_t* aX, int32_t* aY, 1.1339 + int32_t* aCX, int32_t* aCY) 1.1340 +{ 1.1341 + if(!mDocShell) 1.1342 + { 1.1343 + if(aX) 1.1344 + *aX = mInitInfo->x; 1.1345 + if(aY) 1.1346 + *aY = mInitInfo->y; 1.1347 + if(aCX) 1.1348 + *aCX = mInitInfo->cx; 1.1349 + if(aCY) 1.1350 + *aCY = mInitInfo->cy; 1.1351 + } 1.1352 + else 1.1353 + { 1.1354 + if(mInternalWidget) 1.1355 + { 1.1356 + nsIntRect bounds; 1.1357 + NS_ENSURE_SUCCESS(mInternalWidget->GetBounds(bounds), NS_ERROR_FAILURE); 1.1358 + 1.1359 + if(aX) 1.1360 + *aX = bounds.x; 1.1361 + if(aY) 1.1362 + *aY = bounds.y; 1.1363 + if(aCX) 1.1364 + *aCX = bounds.width; 1.1365 + if(aCY) 1.1366 + *aCY = bounds.height; 1.1367 + return NS_OK; 1.1368 + } 1.1369 + else 1.1370 + return mDocShellAsWin->GetPositionAndSize(aX, aY, aCX, aCY); // Can directly return this as it is the 1.1371 + } 1.1372 + return NS_OK; 1.1373 +} 1.1374 + 1.1375 +NS_IMETHODIMP nsWebBrowser::Repaint(bool aForce) 1.1376 +{ 1.1377 + NS_ENSURE_STATE(mDocShell); 1.1378 + return mDocShellAsWin->Repaint(aForce); // Can directly return this as it is the 1.1379 +} // same interface, thus same returns. 1.1380 + 1.1381 +NS_IMETHODIMP nsWebBrowser::GetParentWidget(nsIWidget** aParentWidget) 1.1382 +{ 1.1383 + NS_ENSURE_ARG_POINTER(aParentWidget); 1.1384 + 1.1385 + *aParentWidget = mParentWidget; 1.1386 + 1.1387 + NS_IF_ADDREF(*aParentWidget); 1.1388 + 1.1389 + return NS_OK; 1.1390 +} 1.1391 + 1.1392 +NS_IMETHODIMP nsWebBrowser::SetParentWidget(nsIWidget* aParentWidget) 1.1393 +{ 1.1394 + NS_ENSURE_STATE(!mDocShell); 1.1395 + 1.1396 + mParentWidget = aParentWidget; 1.1397 + if(mParentWidget) 1.1398 + mParentNativeWindow = mParentWidget->GetNativeData(NS_NATIVE_WIDGET); 1.1399 + else 1.1400 + mParentNativeWindow = nullptr; 1.1401 + 1.1402 + return NS_OK; 1.1403 +} 1.1404 + 1.1405 +NS_IMETHODIMP nsWebBrowser::GetParentNativeWindow(nativeWindow* aParentNativeWindow) 1.1406 +{ 1.1407 + NS_ENSURE_ARG_POINTER(aParentNativeWindow); 1.1408 + 1.1409 + *aParentNativeWindow = mParentNativeWindow; 1.1410 + 1.1411 + return NS_OK; 1.1412 +} 1.1413 + 1.1414 +NS_IMETHODIMP nsWebBrowser::SetParentNativeWindow(nativeWindow aParentNativeWindow) 1.1415 +{ 1.1416 + NS_ENSURE_STATE(!mDocShell); 1.1417 + 1.1418 + mParentNativeWindow = aParentNativeWindow; 1.1419 + 1.1420 + return NS_OK; 1.1421 +} 1.1422 + 1.1423 +NS_IMETHODIMP nsWebBrowser::GetNativeHandle(nsAString& aNativeHandle) 1.1424 +{ 1.1425 + // the nativeHandle should be accessed from nsIXULWindow 1.1426 + return NS_ERROR_NOT_IMPLEMENTED; 1.1427 +} 1.1428 + 1.1429 +NS_IMETHODIMP nsWebBrowser::GetVisibility(bool* visibility) 1.1430 +{ 1.1431 + NS_ENSURE_ARG_POINTER(visibility); 1.1432 + 1.1433 + if(!mDocShell) 1.1434 + *visibility = mInitInfo->visible; 1.1435 + else 1.1436 + NS_ENSURE_SUCCESS(mDocShellAsWin->GetVisibility(visibility), NS_ERROR_FAILURE); 1.1437 + 1.1438 + return NS_OK; 1.1439 +} 1.1440 + 1.1441 +NS_IMETHODIMP nsWebBrowser::SetVisibility(bool aVisibility) 1.1442 +{ 1.1443 + if(!mDocShell) 1.1444 + mInitInfo->visible = aVisibility; 1.1445 + else 1.1446 + { 1.1447 + NS_ENSURE_SUCCESS(mDocShellAsWin->SetVisibility(aVisibility), NS_ERROR_FAILURE); 1.1448 + if(mInternalWidget) 1.1449 + mInternalWidget->Show(aVisibility); 1.1450 + } 1.1451 + 1.1452 + return NS_OK; 1.1453 +} 1.1454 + 1.1455 +NS_IMETHODIMP nsWebBrowser::GetEnabled(bool* aEnabled) 1.1456 +{ 1.1457 + if (mInternalWidget) { 1.1458 + *aEnabled = mInternalWidget->IsEnabled(); 1.1459 + return NS_OK; 1.1460 + } 1.1461 + 1.1462 + return NS_ERROR_FAILURE; 1.1463 +} 1.1464 + 1.1465 +NS_IMETHODIMP nsWebBrowser::SetEnabled(bool aEnabled) 1.1466 +{ 1.1467 + if (mInternalWidget) 1.1468 + return mInternalWidget->Enable(aEnabled); 1.1469 + return NS_ERROR_FAILURE; 1.1470 +} 1.1471 + 1.1472 +NS_IMETHODIMP nsWebBrowser::GetMainWidget(nsIWidget** mainWidget) 1.1473 +{ 1.1474 + NS_ENSURE_ARG_POINTER(mainWidget); 1.1475 + 1.1476 + if(mInternalWidget) 1.1477 + *mainWidget = mInternalWidget; 1.1478 + else 1.1479 + *mainWidget = mParentWidget; 1.1480 + 1.1481 + NS_IF_ADDREF(*mainWidget); 1.1482 + 1.1483 + return NS_OK; 1.1484 +} 1.1485 + 1.1486 +NS_IMETHODIMP nsWebBrowser::SetFocus() 1.1487 +{ 1.1488 + nsCOMPtr<nsIDOMWindow> window = do_GetInterface(mDocShell); 1.1489 + NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); 1.1490 + 1.1491 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1492 + return fm ? fm->SetFocusedWindow(window) : NS_OK; 1.1493 +} 1.1494 + 1.1495 +NS_IMETHODIMP nsWebBrowser::GetTitle(char16_t** aTitle) 1.1496 +{ 1.1497 + NS_ENSURE_ARG_POINTER(aTitle); 1.1498 + NS_ENSURE_STATE(mDocShell); 1.1499 + 1.1500 + NS_ENSURE_SUCCESS(mDocShellAsWin->GetTitle(aTitle), NS_ERROR_FAILURE); 1.1501 + 1.1502 + return NS_OK; 1.1503 +} 1.1504 + 1.1505 +NS_IMETHODIMP nsWebBrowser::SetTitle(const char16_t* aTitle) 1.1506 +{ 1.1507 + NS_ENSURE_STATE(mDocShell); 1.1508 + 1.1509 + NS_ENSURE_SUCCESS(mDocShellAsWin->SetTitle(aTitle), NS_ERROR_FAILURE); 1.1510 + 1.1511 + return NS_OK; 1.1512 +} 1.1513 + 1.1514 +//***************************************************************************** 1.1515 +// nsWebBrowser::nsIScrollable 1.1516 +//***************************************************************************** 1.1517 + 1.1518 +NS_IMETHODIMP nsWebBrowser::GetDefaultScrollbarPreferences(int32_t aScrollOrientation, 1.1519 + int32_t* aScrollbarPref) 1.1520 +{ 1.1521 + NS_ENSURE_STATE(mDocShell); 1.1522 + 1.1523 + return mDocShellAsScrollable->GetDefaultScrollbarPreferences(aScrollOrientation, 1.1524 + aScrollbarPref); 1.1525 +} 1.1526 + 1.1527 +NS_IMETHODIMP nsWebBrowser::SetDefaultScrollbarPreferences(int32_t aScrollOrientation, 1.1528 + int32_t aScrollbarPref) 1.1529 +{ 1.1530 + NS_ENSURE_STATE(mDocShell); 1.1531 + 1.1532 + return mDocShellAsScrollable->SetDefaultScrollbarPreferences(aScrollOrientation, 1.1533 + aScrollbarPref); 1.1534 +} 1.1535 + 1.1536 +NS_IMETHODIMP nsWebBrowser::GetScrollbarVisibility(bool* aVerticalVisible, 1.1537 + bool* aHorizontalVisible) 1.1538 +{ 1.1539 + NS_ENSURE_STATE(mDocShell); 1.1540 + 1.1541 + return mDocShellAsScrollable->GetScrollbarVisibility(aVerticalVisible, 1.1542 + aHorizontalVisible); 1.1543 +} 1.1544 + 1.1545 +//***************************************************************************** 1.1546 +// nsWebBrowser::nsITextScroll 1.1547 +//***************************************************************************** 1.1548 + 1.1549 +NS_IMETHODIMP nsWebBrowser::ScrollByLines(int32_t aNumLines) 1.1550 +{ 1.1551 + NS_ENSURE_STATE(mDocShell); 1.1552 + 1.1553 + return mDocShellAsTextScroll->ScrollByLines(aNumLines); 1.1554 +} 1.1555 + 1.1556 +NS_IMETHODIMP nsWebBrowser::ScrollByPages(int32_t aNumPages) 1.1557 +{ 1.1558 + NS_ENSURE_STATE(mDocShell); 1.1559 + 1.1560 + return mDocShellAsTextScroll->ScrollByPages(aNumPages); 1.1561 +} 1.1562 + 1.1563 + 1.1564 +//***************************************************************************** 1.1565 +// nsWebBrowser: Listener Helpers 1.1566 +//***************************************************************************** 1.1567 + 1.1568 +NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell) 1.1569 +{ 1.1570 + nsCOMPtr<nsIDocShell> kungFuDeathGrip(mDocShell); 1.1571 + if(aDocShell) 1.1572 + { 1.1573 + NS_ENSURE_TRUE(!mDocShell, NS_ERROR_FAILURE); 1.1574 + 1.1575 + nsCOMPtr<nsIInterfaceRequestor> req(do_QueryInterface(aDocShell)); 1.1576 + nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(aDocShell)); 1.1577 + nsCOMPtr<nsIWebNavigation> nav(do_QueryInterface(aDocShell)); 1.1578 + nsCOMPtr<nsIScrollable> scrollable(do_QueryInterface(aDocShell)); 1.1579 + nsCOMPtr<nsITextScroll> textScroll(do_QueryInterface(aDocShell)); 1.1580 + nsCOMPtr<nsIWebProgress> progress(do_GetInterface(aDocShell)); 1.1581 + NS_ENSURE_TRUE(req && baseWin && nav && scrollable && textScroll && progress, 1.1582 + NS_ERROR_FAILURE); 1.1583 + 1.1584 + mDocShell = aDocShell; 1.1585 + mDocShellAsReq = req; 1.1586 + mDocShellAsWin = baseWin; 1.1587 + mDocShellAsNav = nav; 1.1588 + mDocShellAsScrollable = scrollable; 1.1589 + mDocShellAsTextScroll = textScroll; 1.1590 + mWebProgress = progress; 1.1591 + 1.1592 + // By default, do not allow DNS prefetch, so we don't break our frozen 1.1593 + // API. Embeddors who decide to enable it should do so manually. 1.1594 + mDocShell->SetAllowDNSPrefetch(false); 1.1595 + 1.1596 + // It's possible to call setIsActive() on us before we have a docshell. 1.1597 + // If we're getting a docshell now, pass along our desired value. The 1.1598 + // default here (true) matches the default of the docshell, so this is 1.1599 + // a no-op unless setIsActive(false) has been called on us. 1.1600 + mDocShell->SetIsActive(mIsActive); 1.1601 + } 1.1602 + else 1.1603 + { 1.1604 + if (mDocShellTreeOwner) 1.1605 + mDocShellTreeOwner->RemoveFromWatcher(); // evil twin of Add in Create() 1.1606 + if (mDocShellAsWin) 1.1607 + mDocShellAsWin->Destroy(); 1.1608 + 1.1609 + mDocShell = nullptr; 1.1610 + mDocShellAsReq = nullptr; 1.1611 + mDocShellAsWin = nullptr; 1.1612 + mDocShellAsNav = nullptr; 1.1613 + mDocShellAsScrollable = nullptr; 1.1614 + mDocShellAsTextScroll = nullptr; 1.1615 + mWebProgress = nullptr; 1.1616 + } 1.1617 + 1.1618 + return NS_OK; 1.1619 +} 1.1620 + 1.1621 +NS_IMETHODIMP nsWebBrowser::EnsureDocShellTreeOwner() 1.1622 +{ 1.1623 + if(mDocShellTreeOwner) 1.1624 + return NS_OK; 1.1625 + 1.1626 + mDocShellTreeOwner = new nsDocShellTreeOwner(); 1.1627 + NS_ENSURE_TRUE(mDocShellTreeOwner, NS_ERROR_OUT_OF_MEMORY); 1.1628 + 1.1629 + NS_ADDREF(mDocShellTreeOwner); 1.1630 + mDocShellTreeOwner->WebBrowser(this); 1.1631 + 1.1632 + return NS_OK; 1.1633 +} 1.1634 + 1.1635 +static void DrawThebesLayer(ThebesLayer* aLayer, 1.1636 + gfxContext* aContext, 1.1637 + const nsIntRegion& aRegionToDraw, 1.1638 + DrawRegionClip aClip, 1.1639 + const nsIntRegion& aRegionToInvalidate, 1.1640 + void* aCallbackData) 1.1641 +{ 1.1642 + nscolor* color = static_cast<nscolor*>(aCallbackData); 1.1643 + aContext->NewPath(); 1.1644 + aContext->SetColor(gfxRGBA(*color)); 1.1645 + nsIntRect dirtyRect = aRegionToDraw.GetBounds(); 1.1646 + aContext->Rectangle(gfxRect(dirtyRect.x, dirtyRect.y, dirtyRect.width, dirtyRect.height)); 1.1647 + aContext->Fill(); 1.1648 +} 1.1649 + 1.1650 +void nsWebBrowser::WindowRaised(nsIWidget* aWidget) 1.1651 +{ 1.1652 +#if defined(DEBUG_smaug) 1.1653 + nsCOMPtr<nsIDOMDocument> domDocument = do_GetInterface(mDocShell); 1.1654 + nsAutoString documentURI; 1.1655 + domDocument->GetDocumentURI(documentURI); 1.1656 + printf("nsWebBrowser::NS_ACTIVATE %p %s\n", (void*)this, 1.1657 + NS_ConvertUTF16toUTF8(documentURI).get()); 1.1658 +#endif 1.1659 + Activate(); 1.1660 +} 1.1661 + 1.1662 +void nsWebBrowser::WindowLowered(nsIWidget* aWidget) 1.1663 +{ 1.1664 +#if defined(DEBUG_smaug) 1.1665 + nsCOMPtr<nsIDOMDocument> domDocument = do_GetInterface(mDocShell); 1.1666 + nsAutoString documentURI; 1.1667 + domDocument->GetDocumentURI(documentURI); 1.1668 + printf("nsWebBrowser::NS_DEACTIVATE %p %s\n", (void*)this, 1.1669 + NS_ConvertUTF16toUTF8(documentURI).get()); 1.1670 +#endif 1.1671 + Deactivate(); 1.1672 +} 1.1673 + 1.1674 +bool nsWebBrowser::PaintWindow(nsIWidget* aWidget, nsIntRegion aRegion) 1.1675 +{ 1.1676 + LayerManager* layerManager = aWidget->GetLayerManager(); 1.1677 + NS_ASSERTION(layerManager, "Must be in paint event"); 1.1678 + 1.1679 + layerManager->BeginTransaction(); 1.1680 + nsRefPtr<ThebesLayer> root = layerManager->CreateThebesLayer(); 1.1681 + if (root) { 1.1682 + nsIntRect dirtyRect = aRegion.GetBounds(); 1.1683 + root->SetVisibleRegion(dirtyRect); 1.1684 + layerManager->SetRoot(root); 1.1685 + } 1.1686 + 1.1687 + layerManager->EndTransaction(DrawThebesLayer, &mBackgroundColor); 1.1688 + return true; 1.1689 +} 1.1690 + 1.1691 +NS_IMETHODIMP nsWebBrowser::GetPrimaryContentWindow(nsIDOMWindow** aDOMWindow) 1.1692 +{ 1.1693 + *aDOMWindow = 0; 1.1694 + 1.1695 + nsCOMPtr<nsIDocShellTreeItem> item; 1.1696 + NS_ENSURE_TRUE(mDocShellTreeOwner, NS_ERROR_FAILURE); 1.1697 + mDocShellTreeOwner->GetPrimaryContentShell(getter_AddRefs(item)); 1.1698 + NS_ENSURE_TRUE(item, NS_ERROR_FAILURE); 1.1699 + 1.1700 + nsCOMPtr<nsIDocShell> docShell; 1.1701 + docShell = do_QueryInterface(item); 1.1702 + NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE); 1.1703 + 1.1704 + nsCOMPtr<nsIDOMWindow> domWindow = do_GetInterface(docShell); 1.1705 + NS_ENSURE_TRUE(domWindow, NS_ERROR_FAILURE); 1.1706 + 1.1707 + *aDOMWindow = domWindow; 1.1708 + NS_ADDREF(*aDOMWindow); 1.1709 + return NS_OK; 1.1710 + 1.1711 +} 1.1712 +//***************************************************************************** 1.1713 +// nsWebBrowser::nsIWebBrowserFocus 1.1714 +//***************************************************************************** 1.1715 + 1.1716 +/* void activate (); */ 1.1717 +NS_IMETHODIMP nsWebBrowser::Activate(void) 1.1718 +{ 1.1719 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1720 + nsCOMPtr<nsIDOMWindow> window = do_GetInterface(mDocShell); 1.1721 + if (fm && window) 1.1722 + return fm->WindowRaised(window); 1.1723 + return NS_OK; 1.1724 +} 1.1725 + 1.1726 +/* void deactivate (); */ 1.1727 +NS_IMETHODIMP nsWebBrowser::Deactivate(void) 1.1728 +{ 1.1729 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1730 + nsCOMPtr<nsIDOMWindow> window = do_GetInterface(mDocShell); 1.1731 + if (fm && window) 1.1732 + return fm->WindowLowered(window); 1.1733 + return NS_OK; 1.1734 +} 1.1735 + 1.1736 +/* void setFocusAtFirstElement (); */ 1.1737 +NS_IMETHODIMP nsWebBrowser::SetFocusAtFirstElement(void) 1.1738 +{ 1.1739 + return NS_OK; 1.1740 +} 1.1741 + 1.1742 +/* void setFocusAtLastElement (); */ 1.1743 +NS_IMETHODIMP nsWebBrowser::SetFocusAtLastElement(void) 1.1744 +{ 1.1745 + return NS_OK; 1.1746 +} 1.1747 + 1.1748 +/* attribute nsIDOMWindow focusedWindow; */ 1.1749 +NS_IMETHODIMP nsWebBrowser::GetFocusedWindow(nsIDOMWindow * *aFocusedWindow) 1.1750 +{ 1.1751 + NS_ENSURE_ARG_POINTER(aFocusedWindow); 1.1752 + *aFocusedWindow = nullptr; 1.1753 + 1.1754 + nsCOMPtr<nsIDOMWindow> window = do_GetInterface(mDocShell); 1.1755 + NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); 1.1756 + 1.1757 + nsCOMPtr<nsIDOMElement> focusedElement; 1.1758 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1759 + return fm ? fm->GetFocusedElementForWindow(window, true, aFocusedWindow, 1.1760 + getter_AddRefs(focusedElement)) : NS_OK; 1.1761 +} 1.1762 + 1.1763 +NS_IMETHODIMP nsWebBrowser::SetFocusedWindow(nsIDOMWindow * aFocusedWindow) 1.1764 +{ 1.1765 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1766 + return fm ? fm->SetFocusedWindow(aFocusedWindow) : NS_OK; 1.1767 +} 1.1768 + 1.1769 +/* attribute nsIDOMElement focusedElement; */ 1.1770 +NS_IMETHODIMP nsWebBrowser::GetFocusedElement(nsIDOMElement * *aFocusedElement) 1.1771 +{ 1.1772 + NS_ENSURE_ARG_POINTER(aFocusedElement); 1.1773 + 1.1774 + nsCOMPtr<nsIDOMWindow> window = do_GetInterface(mDocShell); 1.1775 + NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); 1.1776 + 1.1777 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1778 + return fm ? fm->GetFocusedElementForWindow(window, true, nullptr, aFocusedElement) : NS_OK; 1.1779 +} 1.1780 + 1.1781 +NS_IMETHODIMP nsWebBrowser::SetFocusedElement(nsIDOMElement * aFocusedElement) 1.1782 +{ 1.1783 + nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); 1.1784 + return fm ? fm->SetFocus(aFocusedElement, 0) : NS_OK; 1.1785 +} 1.1786 + 1.1787 +//***************************************************************************** 1.1788 +// nsWebBrowser::nsIWebBrowserStream 1.1789 +//***************************************************************************** 1.1790 + 1.1791 +/* void openStream(in nsIURI aBaseURI, in ACString aContentType); */ 1.1792 +NS_IMETHODIMP nsWebBrowser::OpenStream(nsIURI *aBaseURI, const nsACString& aContentType) 1.1793 +{ 1.1794 + nsresult rv; 1.1795 + 1.1796 + if (!mStream) { 1.1797 + mStream = new nsEmbedStream(); 1.1798 + if (!mStream) 1.1799 + return NS_ERROR_OUT_OF_MEMORY; 1.1800 + 1.1801 + mStreamGuard = do_QueryInterface(mStream); 1.1802 + mStream->InitOwner(this); 1.1803 + rv = mStream->Init(); 1.1804 + if (NS_FAILED(rv)) 1.1805 + return rv; 1.1806 + } 1.1807 + 1.1808 + return mStream->OpenStream(aBaseURI, aContentType); 1.1809 +} 1.1810 + 1.1811 +/* void appendToStream([const, array, size_is(aLen)] in octet aData, 1.1812 + * in unsigned long aLen); */ 1.1813 +NS_IMETHODIMP nsWebBrowser::AppendToStream(const uint8_t *aData, uint32_t aLen) 1.1814 +{ 1.1815 + if (!mStream) 1.1816 + return NS_ERROR_FAILURE; 1.1817 + 1.1818 + return mStream->AppendToStream(aData, aLen); 1.1819 +} 1.1820 + 1.1821 +/* void closeStream (); */ 1.1822 +NS_IMETHODIMP nsWebBrowser::CloseStream() 1.1823 +{ 1.1824 + nsresult rv; 1.1825 + 1.1826 + if (!mStream) 1.1827 + return NS_ERROR_FAILURE; 1.1828 + rv = mStream->CloseStream(); 1.1829 + 1.1830 + // release 1.1831 + mStream = 0; 1.1832 + mStreamGuard = 0; 1.1833 + 1.1834 + return rv; 1.1835 +}