nsWebBrowser.cpp 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. // Local Includes
  6. #include "nsWebBrowser.h"
  7. // Helper Classes
  8. #include "nsGfxCIID.h"
  9. #include "nsWidgetsCID.h"
  10. #include "gfxUtils.h"
  11. #include "mozilla/gfx/2D.h"
  12. // Interfaces Needed
  13. #include "nsReadableUtils.h"
  14. #include "nsIComponentManager.h"
  15. #include "nsIDOMDocument.h"
  16. #include "nsIDOMWindow.h"
  17. #include "nsIDOMElement.h"
  18. #include "nsIInterfaceRequestor.h"
  19. #include "nsIInterfaceRequestorUtils.h"
  20. #include "nsIWebBrowserChrome.h"
  21. #include "nsPIDOMWindow.h"
  22. #include "nsIWebProgress.h"
  23. #include "nsIWebProgressListener.h"
  24. #include "nsIWebBrowserFocus.h"
  25. #include "nsIWebBrowserStream.h"
  26. #include "nsIPresShell.h"
  27. #include "nsIURIContentListener.h"
  28. #include "nsISHistoryListener.h"
  29. #include "nsIURI.h"
  30. #include "nsIWebBrowserPersist.h"
  31. #include "nsCWebBrowserPersist.h"
  32. #include "nsIServiceManager.h"
  33. #include "nsFocusManager.h"
  34. #include "Layers.h"
  35. #include "gfxContext.h"
  36. #include "nsILoadContext.h"
  37. #include "nsDocShell.h"
  38. // for painting the background window
  39. #include "mozilla/LookAndFeel.h"
  40. // Printing Includes
  41. #ifdef NS_PRINTING
  42. #include "nsIWebBrowserPrint.h"
  43. #include "nsIContentViewer.h"
  44. #endif
  45. // PSM2 includes
  46. #include "nsISecureBrowserUI.h"
  47. #include "nsXULAppAPI.h"
  48. using namespace mozilla;
  49. using namespace mozilla::gfx;
  50. using namespace mozilla::layers;
  51. static NS_DEFINE_CID(kChildCID, NS_CHILD_CID);
  52. nsWebBrowser::nsWebBrowser()
  53. : mInitInfo(new nsWebBrowserInitInfo())
  54. , mContentType(typeContentWrapper)
  55. , mActivating(false)
  56. , mShouldEnableHistory(true)
  57. , mIsActive(true)
  58. , mParentNativeWindow(nullptr)
  59. , mProgressListener(nullptr)
  60. , mWidgetListenerDelegate(this)
  61. , mBackgroundColor(0)
  62. , mPersistCurrentState(nsIWebBrowserPersist::PERSIST_STATE_READY)
  63. , mPersistResult(NS_OK)
  64. , mPersistFlags(nsIWebBrowserPersist::PERSIST_FLAGS_NONE)
  65. , mParentWidget(nullptr)
  66. {
  67. mWWatch = do_GetService(NS_WINDOWWATCHER_CONTRACTID);
  68. NS_ASSERTION(mWWatch, "failed to get WindowWatcher");
  69. }
  70. nsWebBrowser::~nsWebBrowser()
  71. {
  72. InternalDestroy();
  73. }
  74. NS_IMETHODIMP
  75. nsWebBrowser::InternalDestroy()
  76. {
  77. if (mInternalWidget) {
  78. mInternalWidget->SetWidgetListener(nullptr);
  79. mInternalWidget->Destroy();
  80. mInternalWidget = nullptr; // Force release here.
  81. }
  82. SetDocShell(nullptr);
  83. if (mDocShellTreeOwner) {
  84. mDocShellTreeOwner->WebBrowser(nullptr);
  85. mDocShellTreeOwner = nullptr;
  86. }
  87. mInitInfo = nullptr;
  88. mListenerArray = nullptr;
  89. return NS_OK;
  90. }
  91. NS_IMPL_ADDREF(nsWebBrowser)
  92. NS_IMPL_RELEASE(nsWebBrowser)
  93. NS_INTERFACE_MAP_BEGIN(nsWebBrowser)
  94. NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowser)
  95. NS_INTERFACE_MAP_ENTRY(nsIWebBrowser)
  96. NS_INTERFACE_MAP_ENTRY(nsIWebNavigation)
  97. NS_INTERFACE_MAP_ENTRY(nsIBaseWindow)
  98. NS_INTERFACE_MAP_ENTRY(nsIScrollable)
  99. NS_INTERFACE_MAP_ENTRY(nsITextScroll)
  100. NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeItem)
  101. NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
  102. NS_INTERFACE_MAP_ENTRY(nsIWebBrowserSetup)
  103. NS_INTERFACE_MAP_ENTRY(nsIWebBrowserPersist)
  104. NS_INTERFACE_MAP_ENTRY(nsICancelable)
  105. NS_INTERFACE_MAP_ENTRY(nsIWebBrowserFocus)
  106. NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
  107. NS_INTERFACE_MAP_ENTRY(nsIWebBrowserStream)
  108. NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
  109. NS_INTERFACE_MAP_END
  110. ///*****************************************************************************
  111. // nsWebBrowser::nsIInterfaceRequestor
  112. //*****************************************************************************
  113. NS_IMETHODIMP
  114. nsWebBrowser::GetInterface(const nsIID& aIID, void** aSink)
  115. {
  116. NS_ENSURE_ARG_POINTER(aSink);
  117. if (NS_SUCCEEDED(QueryInterface(aIID, aSink))) {
  118. return NS_OK;
  119. }
  120. if (mDocShell) {
  121. #ifdef NS_PRINTING
  122. if (aIID.Equals(NS_GET_IID(nsIWebBrowserPrint))) {
  123. nsCOMPtr<nsIContentViewer> viewer;
  124. mDocShell->GetContentViewer(getter_AddRefs(viewer));
  125. if (!viewer) {
  126. return NS_NOINTERFACE;
  127. }
  128. nsCOMPtr<nsIWebBrowserPrint> webBrowserPrint(do_QueryInterface(viewer));
  129. nsIWebBrowserPrint* print = (nsIWebBrowserPrint*)webBrowserPrint.get();
  130. NS_ASSERTION(print, "This MUST support this interface!");
  131. NS_ADDREF(print);
  132. *aSink = print;
  133. return NS_OK;
  134. }
  135. #endif
  136. return mDocShellAsReq->GetInterface(aIID, aSink);
  137. }
  138. return NS_NOINTERFACE;
  139. }
  140. //*****************************************************************************
  141. // nsWebBrowser::nsIWebBrowser
  142. //*****************************************************************************
  143. // listeners that currently support registration through AddWebBrowserListener:
  144. // - nsIWebProgressListener
  145. NS_IMETHODIMP
  146. nsWebBrowser::AddWebBrowserListener(nsIWeakReference* aListener,
  147. const nsIID& aIID)
  148. {
  149. NS_ENSURE_ARG_POINTER(aListener);
  150. nsresult rv = NS_OK;
  151. if (!mWebProgress) {
  152. // The window hasn't been created yet, so queue up the listener. They'll be
  153. // registered when the window gets created.
  154. if (!mListenerArray) {
  155. mListenerArray = new nsTArray<nsWebBrowserListenerState>();
  156. }
  157. nsWebBrowserListenerState* state = mListenerArray->AppendElement();
  158. state->mWeakPtr = aListener;
  159. state->mID = aIID;
  160. } else {
  161. nsCOMPtr<nsISupports> supports(do_QueryReferent(aListener));
  162. if (!supports) {
  163. return NS_ERROR_INVALID_ARG;
  164. }
  165. rv = BindListener(supports, aIID);
  166. }
  167. return rv;
  168. }
  169. NS_IMETHODIMP
  170. nsWebBrowser::BindListener(nsISupports* aListener, const nsIID& aIID)
  171. {
  172. NS_ENSURE_ARG_POINTER(aListener);
  173. NS_ASSERTION(mWebProgress,
  174. "this should only be called after we've retrieved a progress iface");
  175. nsresult rv = NS_OK;
  176. // register this listener for the specified interface id
  177. if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) {
  178. nsCOMPtr<nsIWebProgressListener> listener = do_QueryInterface(aListener, &rv);
  179. if (NS_FAILED(rv)) {
  180. return rv;
  181. }
  182. NS_ENSURE_STATE(mWebProgress);
  183. rv = mWebProgress->AddProgressListener(listener, nsIWebProgress::NOTIFY_ALL);
  184. } else if (aIID.Equals(NS_GET_IID(nsISHistoryListener))) {
  185. nsCOMPtr<nsISHistory> shistory(do_GetInterface(mDocShell, &rv));
  186. if (NS_FAILED(rv)) {
  187. return rv;
  188. }
  189. nsCOMPtr<nsISHistoryListener> listener(do_QueryInterface(aListener, &rv));
  190. if (NS_FAILED(rv)) {
  191. return rv;
  192. }
  193. rv = shistory->AddSHistoryListener(listener);
  194. }
  195. return rv;
  196. }
  197. NS_IMETHODIMP
  198. nsWebBrowser::RemoveWebBrowserListener(nsIWeakReference* aListener,
  199. const nsIID& aIID)
  200. {
  201. NS_ENSURE_ARG_POINTER(aListener);
  202. nsresult rv = NS_OK;
  203. if (!mWebProgress) {
  204. // if there's no-one to register the listener w/, and we don't have a queue
  205. // going, the the called is calling Remove before an Add which doesn't make
  206. // sense.
  207. if (!mListenerArray) {
  208. return NS_ERROR_FAILURE;
  209. }
  210. // iterate the array and remove the queued listener
  211. int32_t count = mListenerArray->Length();
  212. while (count > 0) {
  213. if (mListenerArray->ElementAt(count-1).Equals(aListener, aIID)) {
  214. mListenerArray->RemoveElementAt(count-1);
  215. break;
  216. }
  217. count--;
  218. }
  219. // if we've emptied the array, get rid of it.
  220. if (0 >= mListenerArray->Length()) {
  221. mListenerArray = nullptr;
  222. }
  223. } else {
  224. nsCOMPtr<nsISupports> supports(do_QueryReferent(aListener));
  225. if (!supports) {
  226. return NS_ERROR_INVALID_ARG;
  227. }
  228. rv = UnBindListener(supports, aIID);
  229. }
  230. return rv;
  231. }
  232. NS_IMETHODIMP
  233. nsWebBrowser::UnBindListener(nsISupports* aListener, const nsIID& aIID)
  234. {
  235. NS_ENSURE_ARG_POINTER(aListener);
  236. NS_ASSERTION(mWebProgress,
  237. "this should only be called after we've retrieved a progress iface");
  238. nsresult rv = NS_OK;
  239. // remove the listener for the specified interface id
  240. if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) {
  241. nsCOMPtr<nsIWebProgressListener> listener = do_QueryInterface(aListener, &rv);
  242. if (NS_FAILED(rv)) {
  243. return rv;
  244. }
  245. NS_ENSURE_STATE(mWebProgress);
  246. rv = mWebProgress->RemoveProgressListener(listener);
  247. } else if (aIID.Equals(NS_GET_IID(nsISHistoryListener))) {
  248. nsCOMPtr<nsISHistory> shistory(do_GetInterface(mDocShell, &rv));
  249. if (NS_FAILED(rv)) {
  250. return rv;
  251. }
  252. nsCOMPtr<nsISHistoryListener> listener(do_QueryInterface(aListener, &rv));
  253. if (NS_FAILED(rv)) {
  254. return rv;
  255. }
  256. rv = shistory->RemoveSHistoryListener(listener);
  257. }
  258. return rv;
  259. }
  260. NS_IMETHODIMP
  261. nsWebBrowser::EnableGlobalHistory(bool aEnable)
  262. {
  263. NS_ENSURE_STATE(mDocShell);
  264. return mDocShell->SetUseGlobalHistory(aEnable);
  265. }
  266. NS_IMETHODIMP
  267. nsWebBrowser::GetContainerWindow(nsIWebBrowserChrome** aTopWindow)
  268. {
  269. NS_ENSURE_ARG_POINTER(aTopWindow);
  270. nsCOMPtr<nsIWebBrowserChrome> top;
  271. if (mDocShellTreeOwner) {
  272. top = mDocShellTreeOwner->GetWebBrowserChrome();
  273. }
  274. top.forget(aTopWindow);
  275. return NS_OK;
  276. }
  277. NS_IMETHODIMP
  278. nsWebBrowser::SetContainerWindow(nsIWebBrowserChrome* aTopWindow)
  279. {
  280. NS_ENSURE_SUCCESS(EnsureDocShellTreeOwner(), NS_ERROR_FAILURE);
  281. return mDocShellTreeOwner->SetWebBrowserChrome(aTopWindow);
  282. }
  283. NS_IMETHODIMP
  284. nsWebBrowser::GetParentURIContentListener(
  285. nsIURIContentListener** aParentContentListener)
  286. {
  287. NS_ENSURE_ARG_POINTER(aParentContentListener);
  288. *aParentContentListener = nullptr;
  289. // get the interface from the docshell
  290. nsCOMPtr<nsIURIContentListener> listener(do_GetInterface(mDocShell));
  291. if (listener) {
  292. return listener->GetParentContentListener(aParentContentListener);
  293. }
  294. return NS_OK;
  295. }
  296. NS_IMETHODIMP
  297. nsWebBrowser::SetParentURIContentListener(
  298. nsIURIContentListener* aParentContentListener)
  299. {
  300. // get the interface from the docshell
  301. nsCOMPtr<nsIURIContentListener> listener(do_GetInterface(mDocShell));
  302. if (listener) {
  303. return listener->SetParentContentListener(aParentContentListener);
  304. }
  305. return NS_ERROR_FAILURE;
  306. }
  307. NS_IMETHODIMP
  308. nsWebBrowser::GetContentDOMWindow(mozIDOMWindowProxy** aResult)
  309. {
  310. if (!mDocShell) {
  311. return NS_ERROR_UNEXPECTED;
  312. }
  313. nsCOMPtr<nsPIDOMWindowOuter> retval = mDocShell->GetWindow();
  314. retval.forget(aResult);
  315. return *aResult ? NS_OK : NS_ERROR_FAILURE;
  316. }
  317. NS_IMETHODIMP
  318. nsWebBrowser::GetIsActive(bool* aResult)
  319. {
  320. *aResult = mIsActive;
  321. return NS_OK;
  322. }
  323. NS_IMETHODIMP
  324. nsWebBrowser::SetIsActive(bool aIsActive)
  325. {
  326. // Set our copy of the value
  327. mIsActive = aIsActive;
  328. // If we have a docshell, pass on the request
  329. if (mDocShell) {
  330. return mDocShell->SetIsActive(aIsActive);
  331. }
  332. return NS_OK;
  333. }
  334. void
  335. nsWebBrowser::SetOriginAttributes(const DocShellOriginAttributes& aAttrs)
  336. {
  337. mOriginAttributes = aAttrs;
  338. }
  339. //*****************************************************************************
  340. // nsWebBrowser::nsIDocShellTreeItem
  341. //*****************************************************************************
  342. NS_IMETHODIMP
  343. nsWebBrowser::GetName(nsAString& aName)
  344. {
  345. if (mDocShell) {
  346. mDocShell->GetName(aName);
  347. } else {
  348. aName = mInitInfo->name;
  349. }
  350. return NS_OK;
  351. }
  352. NS_IMETHODIMP
  353. nsWebBrowser::SetName(const nsAString& aName)
  354. {
  355. if (mDocShell) {
  356. return mDocShell->SetName(aName);
  357. } else {
  358. mInitInfo->name = aName;
  359. }
  360. return NS_OK;
  361. }
  362. NS_IMETHODIMP
  363. nsWebBrowser::NameEquals(const nsAString& aName, bool* aResult)
  364. {
  365. NS_ENSURE_ARG_POINTER(aResult);
  366. if (mDocShell) {
  367. return mDocShell->NameEquals(aName, aResult);
  368. } else {
  369. *aResult = mInitInfo->name.Equals(aName);
  370. }
  371. return NS_OK;
  372. }
  373. /* virtual */ int32_t
  374. nsWebBrowser::ItemType()
  375. {
  376. return mContentType;
  377. }
  378. NS_IMETHODIMP
  379. nsWebBrowser::GetItemType(int32_t* aItemType)
  380. {
  381. NS_ENSURE_ARG_POINTER(aItemType);
  382. *aItemType = ItemType();
  383. return NS_OK;
  384. }
  385. NS_IMETHODIMP
  386. nsWebBrowser::SetItemType(int32_t aItemType)
  387. {
  388. NS_ENSURE_TRUE(
  389. aItemType == typeContentWrapper || aItemType == typeChromeWrapper,
  390. NS_ERROR_FAILURE);
  391. mContentType = aItemType;
  392. if (mDocShell) {
  393. mDocShell->SetItemType(mContentType == typeChromeWrapper ?
  394. static_cast<int32_t>(typeChrome) :
  395. static_cast<int32_t>(typeContent));
  396. }
  397. return NS_OK;
  398. }
  399. NS_IMETHODIMP
  400. nsWebBrowser::GetParent(nsIDocShellTreeItem** aParent)
  401. {
  402. *aParent = nullptr;
  403. return NS_OK;
  404. }
  405. NS_IMETHODIMP
  406. nsWebBrowser::GetSameTypeParent(nsIDocShellTreeItem** aParent)
  407. {
  408. *aParent = nullptr;
  409. return NS_OK;
  410. }
  411. NS_IMETHODIMP
  412. nsWebBrowser::GetRootTreeItem(nsIDocShellTreeItem** aRootTreeItem)
  413. {
  414. NS_ENSURE_ARG_POINTER(aRootTreeItem);
  415. *aRootTreeItem = static_cast<nsIDocShellTreeItem*>(this);
  416. nsCOMPtr<nsIDocShellTreeItem> parent;
  417. NS_ENSURE_SUCCESS(GetParent(getter_AddRefs(parent)), NS_ERROR_FAILURE);
  418. while (parent) {
  419. *aRootTreeItem = parent;
  420. NS_ENSURE_SUCCESS((*aRootTreeItem)->GetParent(getter_AddRefs(parent)),
  421. NS_ERROR_FAILURE);
  422. }
  423. NS_ADDREF(*aRootTreeItem);
  424. return NS_OK;
  425. }
  426. NS_IMETHODIMP
  427. nsWebBrowser::GetSameTypeRootTreeItem(nsIDocShellTreeItem** aRootTreeItem)
  428. {
  429. NS_ENSURE_ARG_POINTER(aRootTreeItem);
  430. *aRootTreeItem = static_cast<nsIDocShellTreeItem*>(this);
  431. nsCOMPtr<nsIDocShellTreeItem> parent;
  432. NS_ENSURE_SUCCESS(GetSameTypeParent(getter_AddRefs(parent)),
  433. NS_ERROR_FAILURE);
  434. while (parent) {
  435. *aRootTreeItem = parent;
  436. NS_ENSURE_SUCCESS((*aRootTreeItem)->GetSameTypeParent(getter_AddRefs(parent)),
  437. NS_ERROR_FAILURE);
  438. }
  439. NS_ADDREF(*aRootTreeItem);
  440. return NS_OK;
  441. }
  442. NS_IMETHODIMP
  443. nsWebBrowser::FindItemWithName(const nsAString& aName,
  444. nsISupports* aRequestor,
  445. nsIDocShellTreeItem* aOriginalRequestor,
  446. nsIDocShellTreeItem** aResult)
  447. {
  448. NS_ENSURE_STATE(mDocShell);
  449. NS_ASSERTION(mDocShellTreeOwner,
  450. "This should always be set when in this situation");
  451. return mDocShell->FindItemWithName(
  452. aName, static_cast<nsIDocShellTreeOwner*>(mDocShellTreeOwner),
  453. aOriginalRequestor, aResult);
  454. }
  455. nsIDocument*
  456. nsWebBrowser::GetDocument()
  457. {
  458. return mDocShell ? mDocShell->GetDocument() : nullptr;
  459. }
  460. nsPIDOMWindowOuter*
  461. nsWebBrowser::GetWindow()
  462. {
  463. return mDocShell ? mDocShell->GetWindow() : nullptr;
  464. }
  465. NS_IMETHODIMP
  466. nsWebBrowser::GetTreeOwner(nsIDocShellTreeOwner** aTreeOwner)
  467. {
  468. NS_ENSURE_ARG_POINTER(aTreeOwner);
  469. *aTreeOwner = nullptr;
  470. if (mDocShellTreeOwner) {
  471. if (mDocShellTreeOwner->mTreeOwner) {
  472. *aTreeOwner = mDocShellTreeOwner->mTreeOwner;
  473. } else {
  474. *aTreeOwner = mDocShellTreeOwner;
  475. }
  476. }
  477. NS_IF_ADDREF(*aTreeOwner);
  478. return NS_OK;
  479. }
  480. NS_IMETHODIMP
  481. nsWebBrowser::SetTreeOwner(nsIDocShellTreeOwner* aTreeOwner)
  482. {
  483. NS_ENSURE_SUCCESS(EnsureDocShellTreeOwner(), NS_ERROR_FAILURE);
  484. return mDocShellTreeOwner->SetTreeOwner(aTreeOwner);
  485. }
  486. //*****************************************************************************
  487. // nsWebBrowser::nsIDocShellTreeItem
  488. //*****************************************************************************
  489. NS_IMETHODIMP
  490. nsWebBrowser::GetChildCount(int32_t* aChildCount)
  491. {
  492. NS_ENSURE_ARG_POINTER(aChildCount);
  493. *aChildCount = 0;
  494. return NS_OK;
  495. }
  496. NS_IMETHODIMP
  497. nsWebBrowser::AddChild(nsIDocShellTreeItem* aChild)
  498. {
  499. return NS_ERROR_UNEXPECTED;
  500. }
  501. NS_IMETHODIMP
  502. nsWebBrowser::RemoveChild(nsIDocShellTreeItem* aChild)
  503. {
  504. return NS_ERROR_UNEXPECTED;
  505. }
  506. NS_IMETHODIMP
  507. nsWebBrowser::GetChildAt(int32_t aIndex, nsIDocShellTreeItem** aChild)
  508. {
  509. return NS_ERROR_UNEXPECTED;
  510. }
  511. NS_IMETHODIMP
  512. nsWebBrowser::FindChildWithName(const nsAString& aName,
  513. bool aRecurse,
  514. bool aSameType,
  515. nsIDocShellTreeItem* aRequestor,
  516. nsIDocShellTreeItem* aOriginalRequestor,
  517. nsIDocShellTreeItem** aResult)
  518. {
  519. NS_ENSURE_ARG_POINTER(aResult);
  520. *aResult = nullptr;
  521. return NS_OK;
  522. }
  523. //*****************************************************************************
  524. // nsWebBrowser::nsIWebNavigation
  525. //*****************************************************************************
  526. NS_IMETHODIMP
  527. nsWebBrowser::GetCanGoBack(bool* aCanGoBack)
  528. {
  529. NS_ENSURE_STATE(mDocShell);
  530. return mDocShellAsNav->GetCanGoBack(aCanGoBack);
  531. }
  532. NS_IMETHODIMP
  533. nsWebBrowser::GetCanGoForward(bool* aCanGoForward)
  534. {
  535. NS_ENSURE_STATE(mDocShell);
  536. return mDocShellAsNav->GetCanGoForward(aCanGoForward);
  537. }
  538. NS_IMETHODIMP
  539. nsWebBrowser::GoBack()
  540. {
  541. NS_ENSURE_STATE(mDocShell);
  542. return mDocShellAsNav->GoBack();
  543. }
  544. NS_IMETHODIMP
  545. nsWebBrowser::GoForward()
  546. {
  547. NS_ENSURE_STATE(mDocShell);
  548. return mDocShellAsNav->GoForward();
  549. }
  550. NS_IMETHODIMP
  551. nsWebBrowser::LoadURIWithOptions(const char16_t* aURI, uint32_t aLoadFlags,
  552. nsIURI* aReferringURI,
  553. uint32_t aReferrerPolicy,
  554. nsIInputStream* aPostDataStream,
  555. nsIInputStream* aExtraHeaderStream,
  556. nsIURI* aBaseURI,
  557. nsIPrincipal* aTriggeringPrincipal)
  558. {
  559. NS_ENSURE_STATE(mDocShell);
  560. return mDocShellAsNav->LoadURIWithOptions(
  561. aURI, aLoadFlags, aReferringURI, aReferrerPolicy, aPostDataStream,
  562. aExtraHeaderStream, aBaseURI, aTriggeringPrincipal);
  563. }
  564. NS_IMETHODIMP
  565. nsWebBrowser::SetOriginAttributesBeforeLoading(JS::Handle<JS::Value> aOriginAttributes)
  566. {
  567. return mDocShellAsNav->SetOriginAttributesBeforeLoading(aOriginAttributes);
  568. }
  569. NS_IMETHODIMP
  570. nsWebBrowser::LoadURI(const char16_t* aURI, uint32_t aLoadFlags,
  571. nsIURI* aReferringURI,
  572. nsIInputStream* aPostDataStream,
  573. nsIInputStream* aExtraHeaderStream)
  574. {
  575. NS_ENSURE_STATE(mDocShell);
  576. return mDocShellAsNav->LoadURI(
  577. aURI, aLoadFlags, aReferringURI, aPostDataStream, aExtraHeaderStream);
  578. }
  579. NS_IMETHODIMP
  580. nsWebBrowser::Reload(uint32_t aReloadFlags)
  581. {
  582. NS_ENSURE_STATE(mDocShell);
  583. return mDocShellAsNav->Reload(aReloadFlags);
  584. }
  585. NS_IMETHODIMP
  586. nsWebBrowser::GotoIndex(int32_t aIndex)
  587. {
  588. NS_ENSURE_STATE(mDocShell);
  589. return mDocShellAsNav->GotoIndex(aIndex);
  590. }
  591. NS_IMETHODIMP
  592. nsWebBrowser::Stop(uint32_t aStopFlags)
  593. {
  594. NS_ENSURE_STATE(mDocShell);
  595. return mDocShellAsNav->Stop(aStopFlags);
  596. }
  597. NS_IMETHODIMP
  598. nsWebBrowser::GetCurrentURI(nsIURI** aURI)
  599. {
  600. NS_ENSURE_STATE(mDocShell);
  601. return mDocShellAsNav->GetCurrentURI(aURI);
  602. }
  603. NS_IMETHODIMP
  604. nsWebBrowser::GetReferringURI(nsIURI** aURI)
  605. {
  606. NS_ENSURE_STATE(mDocShell);
  607. return mDocShellAsNav->GetReferringURI(aURI);
  608. }
  609. NS_IMETHODIMP
  610. nsWebBrowser::SetSessionHistory(nsISHistory* aSessionHistory)
  611. {
  612. if (mDocShell) {
  613. return mDocShellAsNav->SetSessionHistory(aSessionHistory);
  614. } else {
  615. mInitInfo->sessionHistory = aSessionHistory;
  616. }
  617. return NS_OK;
  618. }
  619. NS_IMETHODIMP
  620. nsWebBrowser::GetSessionHistory(nsISHistory** aSessionHistory)
  621. {
  622. NS_ENSURE_ARG_POINTER(aSessionHistory);
  623. if (mDocShell) {
  624. return mDocShellAsNav->GetSessionHistory(aSessionHistory);
  625. } else {
  626. *aSessionHistory = mInitInfo->sessionHistory;
  627. }
  628. NS_IF_ADDREF(*aSessionHistory);
  629. return NS_OK;
  630. }
  631. NS_IMETHODIMP
  632. nsWebBrowser::GetDocument(nsIDOMDocument** aDocument)
  633. {
  634. NS_ENSURE_STATE(mDocShell);
  635. return mDocShellAsNav->GetDocument(aDocument);
  636. }
  637. //*****************************************************************************
  638. // nsWebBrowser::nsIWebBrowserSetup
  639. //*****************************************************************************
  640. NS_IMETHODIMP
  641. nsWebBrowser::SetProperty(uint32_t aId, uint32_t aValue)
  642. {
  643. nsresult rv = NS_OK;
  644. switch (aId) {
  645. case nsIWebBrowserSetup::SETUP_ALLOW_PLUGINS: {
  646. NS_ENSURE_STATE(mDocShell);
  647. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  648. aValue == static_cast<uint32_t>(false)),
  649. NS_ERROR_INVALID_ARG);
  650. mDocShell->SetAllowPlugins(!!aValue);
  651. break;
  652. }
  653. case nsIWebBrowserSetup::SETUP_ALLOW_JAVASCRIPT: {
  654. NS_ENSURE_STATE(mDocShell);
  655. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  656. aValue == static_cast<uint32_t>(false)),
  657. NS_ERROR_INVALID_ARG);
  658. mDocShell->SetAllowJavascript(!!aValue);
  659. break;
  660. }
  661. case nsIWebBrowserSetup::SETUP_ALLOW_META_REDIRECTS: {
  662. NS_ENSURE_STATE(mDocShell);
  663. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  664. aValue == static_cast<uint32_t>(false)),
  665. NS_ERROR_INVALID_ARG);
  666. mDocShell->SetAllowMetaRedirects(!!aValue);
  667. break;
  668. }
  669. case nsIWebBrowserSetup::SETUP_ALLOW_SUBFRAMES: {
  670. NS_ENSURE_STATE(mDocShell);
  671. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  672. aValue == static_cast<uint32_t>(false)),
  673. NS_ERROR_INVALID_ARG);
  674. mDocShell->SetAllowSubframes(!!aValue);
  675. break;
  676. }
  677. case nsIWebBrowserSetup::SETUP_ALLOW_IMAGES: {
  678. NS_ENSURE_STATE(mDocShell);
  679. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  680. aValue == static_cast<uint32_t>(false)),
  681. NS_ERROR_INVALID_ARG);
  682. mDocShell->SetAllowImages(!!aValue);
  683. break;
  684. }
  685. case nsIWebBrowserSetup::SETUP_ALLOW_DNS_PREFETCH: {
  686. NS_ENSURE_STATE(mDocShell);
  687. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  688. aValue == static_cast<uint32_t>(false)),
  689. NS_ERROR_INVALID_ARG);
  690. mDocShell->SetAllowDNSPrefetch(!!aValue);
  691. break;
  692. }
  693. case nsIWebBrowserSetup::SETUP_USE_GLOBAL_HISTORY: {
  694. NS_ENSURE_STATE(mDocShell);
  695. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  696. aValue == static_cast<uint32_t>(false)),
  697. NS_ERROR_INVALID_ARG);
  698. rv = EnableGlobalHistory(!!aValue);
  699. mShouldEnableHistory = aValue;
  700. break;
  701. }
  702. case nsIWebBrowserSetup::SETUP_FOCUS_DOC_BEFORE_CONTENT: {
  703. // obsolete
  704. break;
  705. }
  706. case nsIWebBrowserSetup::SETUP_IS_CHROME_WRAPPER: {
  707. NS_ENSURE_TRUE((aValue == static_cast<uint32_t>(true) ||
  708. aValue == static_cast<uint32_t>(false)),
  709. NS_ERROR_INVALID_ARG);
  710. SetItemType(aValue ? static_cast<int32_t>(typeChromeWrapper) :
  711. static_cast<int32_t>(typeContentWrapper));
  712. break;
  713. }
  714. default:
  715. rv = NS_ERROR_INVALID_ARG;
  716. }
  717. return rv;
  718. }
  719. //*****************************************************************************
  720. // nsWebBrowser::nsIWebProgressListener
  721. //*****************************************************************************
  722. NS_IMETHODIMP
  723. nsWebBrowser::OnStateChange(nsIWebProgress* aWebProgress,
  724. nsIRequest* aRequest,
  725. uint32_t aStateFlags,
  726. nsresult aStatus)
  727. {
  728. if (mPersist) {
  729. mPersist->GetCurrentState(&mPersistCurrentState);
  730. }
  731. if (aStateFlags & STATE_IS_NETWORK && aStateFlags & STATE_STOP) {
  732. mPersist = nullptr;
  733. }
  734. if (mProgressListener) {
  735. return mProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags,
  736. aStatus);
  737. }
  738. return NS_OK;
  739. }
  740. NS_IMETHODIMP
  741. nsWebBrowser::OnProgressChange(nsIWebProgress* aWebProgress,
  742. nsIRequest* aRequest,
  743. int32_t aCurSelfProgress,
  744. int32_t aMaxSelfProgress,
  745. int32_t aCurTotalProgress,
  746. int32_t aMaxTotalProgress)
  747. {
  748. if (mPersist) {
  749. mPersist->GetCurrentState(&mPersistCurrentState);
  750. }
  751. if (mProgressListener) {
  752. return mProgressListener->OnProgressChange(
  753. aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress,
  754. aCurTotalProgress, aMaxTotalProgress);
  755. }
  756. return NS_OK;
  757. }
  758. NS_IMETHODIMP
  759. nsWebBrowser::OnLocationChange(nsIWebProgress* aWebProgress,
  760. nsIRequest* aRequest,
  761. nsIURI* aLocation,
  762. uint32_t aFlags)
  763. {
  764. if (mProgressListener) {
  765. return mProgressListener->OnLocationChange(aWebProgress, aRequest, aLocation,
  766. aFlags);
  767. }
  768. return NS_OK;
  769. }
  770. NS_IMETHODIMP
  771. nsWebBrowser::OnStatusChange(nsIWebProgress* aWebProgress,
  772. nsIRequest* aRequest,
  773. nsresult aStatus,
  774. const char16_t* aMessage)
  775. {
  776. if (mProgressListener) {
  777. return mProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus,
  778. aMessage);
  779. }
  780. return NS_OK;
  781. }
  782. NS_IMETHODIMP
  783. nsWebBrowser::OnSecurityChange(nsIWebProgress* aWebProgress,
  784. nsIRequest* aRequest,
  785. uint32_t aState)
  786. {
  787. if (mProgressListener) {
  788. return mProgressListener->OnSecurityChange(aWebProgress, aRequest, aState);
  789. }
  790. return NS_OK;
  791. }
  792. //*****************************************************************************
  793. // nsWebBrowser::nsIWebBrowserPersist
  794. //*****************************************************************************
  795. NS_IMETHODIMP
  796. nsWebBrowser::GetPersistFlags(uint32_t* aPersistFlags)
  797. {
  798. NS_ENSURE_ARG_POINTER(aPersistFlags);
  799. nsresult rv = NS_OK;
  800. if (mPersist) {
  801. rv = mPersist->GetPersistFlags(&mPersistFlags);
  802. }
  803. *aPersistFlags = mPersistFlags;
  804. return rv;
  805. }
  806. NS_IMETHODIMP
  807. nsWebBrowser::SetPersistFlags(uint32_t aPersistFlags)
  808. {
  809. nsresult rv = NS_OK;
  810. mPersistFlags = aPersistFlags;
  811. if (mPersist) {
  812. rv = mPersist->SetPersistFlags(mPersistFlags);
  813. mPersist->GetPersistFlags(&mPersistFlags);
  814. }
  815. return rv;
  816. }
  817. NS_IMETHODIMP
  818. nsWebBrowser::GetCurrentState(uint32_t* aCurrentState)
  819. {
  820. NS_ENSURE_ARG_POINTER(aCurrentState);
  821. if (mPersist) {
  822. mPersist->GetCurrentState(&mPersistCurrentState);
  823. }
  824. *aCurrentState = mPersistCurrentState;
  825. return NS_OK;
  826. }
  827. NS_IMETHODIMP
  828. nsWebBrowser::GetResult(nsresult* aResult)
  829. {
  830. NS_ENSURE_ARG_POINTER(aResult);
  831. if (mPersist) {
  832. mPersist->GetResult(&mPersistResult);
  833. }
  834. *aResult = mPersistResult;
  835. return NS_OK;
  836. }
  837. NS_IMETHODIMP
  838. nsWebBrowser::GetProgressListener(nsIWebProgressListener** aProgressListener)
  839. {
  840. NS_ENSURE_ARG_POINTER(aProgressListener);
  841. *aProgressListener = mProgressListener;
  842. NS_IF_ADDREF(*aProgressListener);
  843. return NS_OK;
  844. }
  845. NS_IMETHODIMP
  846. nsWebBrowser::SetProgressListener(nsIWebProgressListener* aProgressListener)
  847. {
  848. mProgressListener = aProgressListener;
  849. return NS_OK;
  850. }
  851. NS_IMETHODIMP
  852. nsWebBrowser::SaveURI(nsIURI* aURI,
  853. nsISupports* aCacheKey,
  854. nsIURI* aReferrer,
  855. uint32_t aReferrerPolicy,
  856. nsIInputStream* aPostData,
  857. const char* aExtraHeaders,
  858. nsISupports* aFile,
  859. nsILoadContext* aPrivacyContext)
  860. {
  861. return SavePrivacyAwareURI(
  862. aURI, aCacheKey, aReferrer, aReferrerPolicy, aPostData, aExtraHeaders,
  863. aFile, aPrivacyContext && aPrivacyContext->UsePrivateBrowsing());
  864. }
  865. NS_IMETHODIMP
  866. nsWebBrowser::SavePrivacyAwareURI(nsIURI* aURI,
  867. nsISupports* aCacheKey,
  868. nsIURI* aReferrer,
  869. uint32_t aReferrerPolicy,
  870. nsIInputStream* aPostData,
  871. const char* aExtraHeaders,
  872. nsISupports* aFile,
  873. bool aIsPrivate)
  874. {
  875. if (mPersist) {
  876. uint32_t currentState;
  877. mPersist->GetCurrentState(&currentState);
  878. if (currentState == PERSIST_STATE_FINISHED) {
  879. mPersist = nullptr;
  880. } else {
  881. // You can't save again until the last save has completed
  882. return NS_ERROR_FAILURE;
  883. }
  884. }
  885. nsCOMPtr<nsIURI> uri;
  886. if (aURI) {
  887. uri = aURI;
  888. } else {
  889. nsresult rv = GetCurrentURI(getter_AddRefs(uri));
  890. if (NS_FAILED(rv)) {
  891. return NS_ERROR_FAILURE;
  892. }
  893. }
  894. // Create a throwaway persistence object to do the work
  895. nsresult rv;
  896. mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv);
  897. NS_ENSURE_SUCCESS(rv, rv);
  898. mPersist->SetProgressListener(this);
  899. mPersist->SetPersistFlags(mPersistFlags);
  900. mPersist->GetCurrentState(&mPersistCurrentState);
  901. rv = mPersist->SavePrivacyAwareURI(uri, aCacheKey, aReferrer, aReferrerPolicy,
  902. aPostData, aExtraHeaders, aFile, aIsPrivate);
  903. if (NS_FAILED(rv)) {
  904. mPersist = nullptr;
  905. }
  906. return rv;
  907. }
  908. NS_IMETHODIMP
  909. nsWebBrowser::SaveChannel(nsIChannel* aChannel, nsISupports* aFile)
  910. {
  911. if (mPersist) {
  912. uint32_t currentState;
  913. mPersist->GetCurrentState(&currentState);
  914. if (currentState == PERSIST_STATE_FINISHED) {
  915. mPersist = nullptr;
  916. } else {
  917. // You can't save again until the last save has completed
  918. return NS_ERROR_FAILURE;
  919. }
  920. }
  921. // Create a throwaway persistence object to do the work
  922. nsresult rv;
  923. mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv);
  924. NS_ENSURE_SUCCESS(rv, rv);
  925. mPersist->SetProgressListener(this);
  926. mPersist->SetPersistFlags(mPersistFlags);
  927. mPersist->GetCurrentState(&mPersistCurrentState);
  928. rv = mPersist->SaveChannel(aChannel, aFile);
  929. if (NS_FAILED(rv)) {
  930. mPersist = nullptr;
  931. }
  932. return rv;
  933. }
  934. NS_IMETHODIMP
  935. nsWebBrowser::SaveDocument(nsISupports* aDocumentish,
  936. nsISupports* aFile,
  937. nsISupports* aDataPath,
  938. const char* aOutputContentType,
  939. uint32_t aEncodingFlags,
  940. uint32_t aWrapColumn)
  941. {
  942. if (mPersist) {
  943. uint32_t currentState;
  944. mPersist->GetCurrentState(&currentState);
  945. if (currentState == PERSIST_STATE_FINISHED) {
  946. mPersist = nullptr;
  947. } else {
  948. // You can't save again until the last save has completed
  949. return NS_ERROR_FAILURE;
  950. }
  951. }
  952. // Use the specified DOM document, or if none is specified, the one
  953. // attached to the web browser.
  954. nsCOMPtr<nsISupports> doc;
  955. if (aDocumentish) {
  956. doc = aDocumentish;
  957. } else {
  958. nsCOMPtr<nsIDOMDocument> domDoc;
  959. GetDocument(getter_AddRefs(domDoc));
  960. doc = domDoc.forget();
  961. }
  962. if (!doc) {
  963. return NS_ERROR_FAILURE;
  964. }
  965. // Create a throwaway persistence object to do the work
  966. nsresult rv;
  967. mPersist = do_CreateInstance(NS_WEBBROWSERPERSIST_CONTRACTID, &rv);
  968. NS_ENSURE_SUCCESS(rv, rv);
  969. mPersist->SetProgressListener(this);
  970. mPersist->SetPersistFlags(mPersistFlags);
  971. mPersist->GetCurrentState(&mPersistCurrentState);
  972. rv = mPersist->SaveDocument(doc, aFile, aDataPath, aOutputContentType,
  973. aEncodingFlags, aWrapColumn);
  974. if (NS_FAILED(rv)) {
  975. mPersist = nullptr;
  976. }
  977. return rv;
  978. }
  979. NS_IMETHODIMP
  980. nsWebBrowser::CancelSave()
  981. {
  982. if (mPersist) {
  983. return mPersist->CancelSave();
  984. }
  985. return NS_OK;
  986. }
  987. NS_IMETHODIMP
  988. nsWebBrowser::Cancel(nsresult aReason)
  989. {
  990. if (mPersist) {
  991. return mPersist->Cancel(aReason);
  992. }
  993. return NS_OK;
  994. }
  995. //*****************************************************************************
  996. // nsWebBrowser::nsIBaseWindow
  997. //*****************************************************************************
  998. NS_IMETHODIMP
  999. nsWebBrowser::InitWindow(nativeWindow aParentNativeWindow,
  1000. nsIWidget* aParentWidget,
  1001. int32_t aX, int32_t aY,
  1002. int32_t aCX, int32_t aCY)
  1003. {
  1004. NS_ENSURE_ARG(aParentNativeWindow || aParentWidget);
  1005. NS_ENSURE_STATE(!mDocShell || mInitInfo);
  1006. if (aParentWidget) {
  1007. NS_ENSURE_SUCCESS(SetParentWidget(aParentWidget), NS_ERROR_FAILURE);
  1008. } else
  1009. NS_ENSURE_SUCCESS(SetParentNativeWindow(aParentNativeWindow),
  1010. NS_ERROR_FAILURE);
  1011. NS_ENSURE_SUCCESS(SetPositionAndSize(aX, aY, aCX, aCY, 0),
  1012. NS_ERROR_FAILURE);
  1013. return NS_OK;
  1014. }
  1015. NS_IMETHODIMP
  1016. nsWebBrowser::Create()
  1017. {
  1018. NS_ENSURE_STATE(!mDocShell && (mParentNativeWindow || mParentWidget));
  1019. nsresult rv = EnsureDocShellTreeOwner();
  1020. NS_ENSURE_SUCCESS(rv, rv);
  1021. nsCOMPtr<nsIWidget> docShellParentWidget(mParentWidget);
  1022. if (!mParentWidget) {
  1023. // Create the widget
  1024. mInternalWidget = do_CreateInstance(kChildCID, &rv);
  1025. NS_ENSURE_SUCCESS(rv, rv);
  1026. docShellParentWidget = mInternalWidget;
  1027. nsWidgetInitData widgetInit;
  1028. widgetInit.clipChildren = true;
  1029. widgetInit.mWindowType = eWindowType_child;
  1030. LayoutDeviceIntRect bounds(mInitInfo->x, mInitInfo->y,
  1031. mInitInfo->cx, mInitInfo->cy);
  1032. mInternalWidget->SetWidgetListener(&mWidgetListenerDelegate);
  1033. rv = mInternalWidget->Create(nullptr, mParentNativeWindow, bounds,
  1034. &widgetInit);
  1035. NS_ENSURE_SUCCESS(rv, rv);
  1036. }
  1037. nsCOMPtr<nsIDocShell> docShell(
  1038. do_CreateInstance("@mozilla.org/docshell;1", &rv));
  1039. NS_ENSURE_SUCCESS(rv, rv);
  1040. nsDocShell::Cast(docShell)->SetOriginAttributes(mOriginAttributes);
  1041. rv = SetDocShell(docShell);
  1042. NS_ENSURE_SUCCESS(rv, rv);
  1043. // get the system default window background colour
  1044. LookAndFeel::GetColor(LookAndFeel::eColorID_WindowBackground,
  1045. &mBackgroundColor);
  1046. // the docshell has been set so we now have our listener registrars.
  1047. if (mListenerArray) {
  1048. // we had queued up some listeners, let's register them now.
  1049. uint32_t count = mListenerArray->Length();
  1050. uint32_t i = 0;
  1051. NS_ASSERTION(count > 0, "array construction problem");
  1052. while (i < count) {
  1053. nsWebBrowserListenerState& state = mListenerArray->ElementAt(i);
  1054. nsCOMPtr<nsISupports> listener = do_QueryReferent(state.mWeakPtr);
  1055. NS_ASSERTION(listener, "bad listener");
  1056. (void)BindListener(listener, state.mID);
  1057. i++;
  1058. }
  1059. mListenerArray = nullptr;
  1060. }
  1061. // HACK ALERT - this registration registers the nsDocShellTreeOwner as a
  1062. // nsIWebBrowserListener so it can setup its MouseListener in one of the
  1063. // progress callbacks. If we can register the MouseListener another way, this
  1064. // registration can go away, and nsDocShellTreeOwner can stop implementing
  1065. // nsIWebProgressListener.
  1066. nsCOMPtr<nsISupports> supports = nullptr;
  1067. (void)mDocShellTreeOwner->QueryInterface(
  1068. NS_GET_IID(nsIWebProgressListener),
  1069. static_cast<void**>(getter_AddRefs(supports)));
  1070. (void)BindListener(supports, NS_GET_IID(nsIWebProgressListener));
  1071. NS_ENSURE_SUCCESS(mDocShellAsWin->InitWindow(nullptr, docShellParentWidget,
  1072. mInitInfo->x, mInitInfo->y,
  1073. mInitInfo->cx, mInitInfo->cy),
  1074. NS_ERROR_FAILURE);
  1075. mDocShell->SetName(mInitInfo->name);
  1076. if (mContentType == typeChromeWrapper) {
  1077. mDocShell->SetItemType(nsIDocShellTreeItem::typeChrome);
  1078. } else {
  1079. mDocShell->SetItemType(nsIDocShellTreeItem::typeContent);
  1080. }
  1081. mDocShell->SetTreeOwner(mDocShellTreeOwner);
  1082. // If the webbrowser is a content docshell item then we won't hear any
  1083. // events from subframes. To solve that we install our own chrome event
  1084. // handler that always gets called (even for subframes) for any bubbling
  1085. // event.
  1086. if (!mInitInfo->sessionHistory) {
  1087. mInitInfo->sessionHistory = do_CreateInstance(NS_SHISTORY_CONTRACTID, &rv);
  1088. NS_ENSURE_SUCCESS(rv, rv);
  1089. }
  1090. mDocShellAsNav->SetSessionHistory(mInitInfo->sessionHistory);
  1091. if (XRE_IsParentProcess()) {
  1092. // Hook up global history. Do not fail if we can't - just warn.
  1093. rv = EnableGlobalHistory(mShouldEnableHistory);
  1094. NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "EnableGlobalHistory() failed");
  1095. }
  1096. NS_ENSURE_SUCCESS(mDocShellAsWin->Create(), NS_ERROR_FAILURE);
  1097. // Hook into the OnSecurityChange() notification for lock/unlock icon
  1098. // updates
  1099. nsCOMPtr<mozIDOMWindowProxy> domWindow;
  1100. rv = GetContentDOMWindow(getter_AddRefs(domWindow));
  1101. if (NS_SUCCEEDED(rv)) {
  1102. // this works because the implementation of nsISecureBrowserUI
  1103. // (nsSecureBrowserUIImpl) gets a docShell from the domWindow,
  1104. // and calls docShell->SetSecurityUI(this);
  1105. nsCOMPtr<nsISecureBrowserUI> securityUI =
  1106. do_CreateInstance(NS_SECURE_BROWSER_UI_CONTRACTID, &rv);
  1107. if (NS_SUCCEEDED(rv)) {
  1108. securityUI->Init(domWindow);
  1109. }
  1110. }
  1111. mDocShellTreeOwner->AddToWatcher(); // evil twin of Remove in SetDocShell(0)
  1112. mDocShellTreeOwner->AddChromeListeners();
  1113. mInitInfo = nullptr;
  1114. return NS_OK;
  1115. }
  1116. NS_IMETHODIMP
  1117. nsWebBrowser::Destroy()
  1118. {
  1119. InternalDestroy();
  1120. if (!mInitInfo) {
  1121. mInitInfo = new nsWebBrowserInitInfo();
  1122. }
  1123. return NS_OK;
  1124. }
  1125. NS_IMETHODIMP
  1126. nsWebBrowser::GetUnscaledDevicePixelsPerCSSPixel(double* aScale)
  1127. {
  1128. *aScale = mParentWidget ? mParentWidget->GetDefaultScale().scale : 1.0;
  1129. return NS_OK;
  1130. }
  1131. NS_IMETHODIMP
  1132. nsWebBrowser::GetDevicePixelsPerDesktopPixel(double* aScale)
  1133. {
  1134. *aScale = mParentWidget ? mParentWidget->GetDesktopToDeviceScale().scale
  1135. : 1.0;
  1136. return NS_OK;
  1137. }
  1138. NS_IMETHODIMP
  1139. nsWebBrowser::SetPositionDesktopPix(int32_t aX, int32_t aY)
  1140. {
  1141. // XXX jfkthame
  1142. // It's not clear to me whether this will be fully correct across
  1143. // potential multi-screen, mixed-DPI configurations for all platforms;
  1144. // we might need to add code paths that make it possible to pass the
  1145. // desktop-pix parameters all the way through to the native widget,
  1146. // to avoid the risk of device-pixel coords mapping to the wrong
  1147. // display on OS X with mixed retina/non-retina screens.
  1148. double scale = 1.0;
  1149. GetDevicePixelsPerDesktopPixel(&scale);
  1150. return SetPosition(NSToIntRound(aX * scale), NSToIntRound(aY * scale));
  1151. }
  1152. NS_IMETHODIMP
  1153. nsWebBrowser::SetPosition(int32_t aX, int32_t aY)
  1154. {
  1155. int32_t cx = 0;
  1156. int32_t cy = 0;
  1157. GetSize(&cx, &cy);
  1158. return SetPositionAndSize(aX, aY, cx, cy, 0);
  1159. }
  1160. NS_IMETHODIMP
  1161. nsWebBrowser::GetPosition(int32_t* aX, int32_t* aY)
  1162. {
  1163. return GetPositionAndSize(aX, aY, nullptr, nullptr);
  1164. }
  1165. NS_IMETHODIMP
  1166. nsWebBrowser::SetSize(int32_t aCX, int32_t aCY, bool aRepaint)
  1167. {
  1168. int32_t x = 0;
  1169. int32_t y = 0;
  1170. GetPosition(&x, &y);
  1171. return SetPositionAndSize(x, y, aCX, aCY,
  1172. aRepaint ? nsIBaseWindow::eRepaint : 0);
  1173. }
  1174. NS_IMETHODIMP
  1175. nsWebBrowser::GetSize(int32_t* aCX, int32_t* aCY)
  1176. {
  1177. return GetPositionAndSize(nullptr, nullptr, aCX, aCY);
  1178. }
  1179. NS_IMETHODIMP
  1180. nsWebBrowser::SetPositionAndSize(int32_t aX, int32_t aY,
  1181. int32_t aCX, int32_t aCY, uint32_t aFlags)
  1182. {
  1183. if (!mDocShell) {
  1184. mInitInfo->x = aX;
  1185. mInitInfo->y = aY;
  1186. mInitInfo->cx = aCX;
  1187. mInitInfo->cy = aCY;
  1188. } else {
  1189. int32_t doc_x = aX;
  1190. int32_t doc_y = aY;
  1191. // If there is an internal widget we need to make the docShell coordinates
  1192. // relative to the internal widget rather than the calling app's parent.
  1193. // We also need to resize our widget then.
  1194. if (mInternalWidget) {
  1195. doc_x = doc_y = 0;
  1196. NS_ENSURE_SUCCESS(mInternalWidget->Resize(aX, aY, aCX, aCY,
  1197. !!(aFlags & nsIBaseWindow::eRepaint)),
  1198. NS_ERROR_FAILURE);
  1199. }
  1200. // Now reposition/ resize the doc
  1201. NS_ENSURE_SUCCESS(
  1202. mDocShellAsWin->SetPositionAndSize(doc_x, doc_y, aCX, aCY, aFlags),
  1203. NS_ERROR_FAILURE);
  1204. }
  1205. return NS_OK;
  1206. }
  1207. NS_IMETHODIMP
  1208. nsWebBrowser::GetPositionAndSize(int32_t* aX, int32_t* aY,
  1209. int32_t* aCX, int32_t* aCY)
  1210. {
  1211. if (!mDocShell) {
  1212. if (aX) {
  1213. *aX = mInitInfo->x;
  1214. }
  1215. if (aY) {
  1216. *aY = mInitInfo->y;
  1217. }
  1218. if (aCX) {
  1219. *aCX = mInitInfo->cx;
  1220. }
  1221. if (aCY) {
  1222. *aCY = mInitInfo->cy;
  1223. }
  1224. } else if (mInternalWidget) {
  1225. LayoutDeviceIntRect bounds = mInternalWidget->GetBounds();
  1226. if (aX) {
  1227. *aX = bounds.x;
  1228. }
  1229. if (aY) {
  1230. *aY = bounds.y;
  1231. }
  1232. if (aCX) {
  1233. *aCX = bounds.width;
  1234. }
  1235. if (aCY) {
  1236. *aCY = bounds.height;
  1237. }
  1238. return NS_OK;
  1239. } else {
  1240. // Can directly return this as it is the
  1241. // same interface, thus same returns.
  1242. return mDocShellAsWin->GetPositionAndSize(aX, aY, aCX, aCY);
  1243. }
  1244. return NS_OK;
  1245. }
  1246. NS_IMETHODIMP
  1247. nsWebBrowser::Repaint(bool aForce)
  1248. {
  1249. NS_ENSURE_STATE(mDocShell);
  1250. // Can directly return this as it is the
  1251. // same interface, thus same returns.
  1252. return mDocShellAsWin->Repaint(aForce);
  1253. }
  1254. NS_IMETHODIMP
  1255. nsWebBrowser::GetParentWidget(nsIWidget** aParentWidget)
  1256. {
  1257. NS_ENSURE_ARG_POINTER(aParentWidget);
  1258. *aParentWidget = mParentWidget;
  1259. NS_IF_ADDREF(*aParentWidget);
  1260. return NS_OK;
  1261. }
  1262. NS_IMETHODIMP
  1263. nsWebBrowser::SetParentWidget(nsIWidget* aParentWidget)
  1264. {
  1265. NS_ENSURE_STATE(!mDocShell);
  1266. mParentWidget = aParentWidget;
  1267. if (mParentWidget) {
  1268. mParentNativeWindow = mParentWidget->GetNativeData(NS_NATIVE_WIDGET);
  1269. } else {
  1270. mParentNativeWindow = nullptr;
  1271. }
  1272. return NS_OK;
  1273. }
  1274. NS_IMETHODIMP
  1275. nsWebBrowser::GetParentNativeWindow(nativeWindow* aParentNativeWindow)
  1276. {
  1277. NS_ENSURE_ARG_POINTER(aParentNativeWindow);
  1278. *aParentNativeWindow = mParentNativeWindow;
  1279. return NS_OK;
  1280. }
  1281. NS_IMETHODIMP
  1282. nsWebBrowser::SetParentNativeWindow(nativeWindow aParentNativeWindow)
  1283. {
  1284. NS_ENSURE_STATE(!mDocShell);
  1285. mParentNativeWindow = aParentNativeWindow;
  1286. return NS_OK;
  1287. }
  1288. NS_IMETHODIMP
  1289. nsWebBrowser::GetNativeHandle(nsAString& aNativeHandle)
  1290. {
  1291. // the nativeHandle should be accessed from nsIXULWindow
  1292. return NS_ERROR_NOT_IMPLEMENTED;
  1293. }
  1294. NS_IMETHODIMP
  1295. nsWebBrowser::GetVisibility(bool* aVisibility)
  1296. {
  1297. NS_ENSURE_ARG_POINTER(aVisibility);
  1298. if (!mDocShell) {
  1299. *aVisibility = mInitInfo->visible;
  1300. } else {
  1301. NS_ENSURE_SUCCESS(mDocShellAsWin->GetVisibility(aVisibility),
  1302. NS_ERROR_FAILURE);
  1303. }
  1304. return NS_OK;
  1305. }
  1306. NS_IMETHODIMP
  1307. nsWebBrowser::SetVisibility(bool aVisibility)
  1308. {
  1309. if (!mDocShell) {
  1310. mInitInfo->visible = aVisibility;
  1311. } else {
  1312. NS_ENSURE_SUCCESS(mDocShellAsWin->SetVisibility(aVisibility),
  1313. NS_ERROR_FAILURE);
  1314. if (mInternalWidget) {
  1315. mInternalWidget->Show(aVisibility);
  1316. }
  1317. }
  1318. return NS_OK;
  1319. }
  1320. NS_IMETHODIMP
  1321. nsWebBrowser::GetEnabled(bool* aEnabled)
  1322. {
  1323. if (mInternalWidget) {
  1324. *aEnabled = mInternalWidget->IsEnabled();
  1325. return NS_OK;
  1326. }
  1327. return NS_ERROR_FAILURE;
  1328. }
  1329. NS_IMETHODIMP
  1330. nsWebBrowser::SetEnabled(bool aEnabled)
  1331. {
  1332. if (mInternalWidget) {
  1333. return mInternalWidget->Enable(aEnabled);
  1334. }
  1335. return NS_ERROR_FAILURE;
  1336. }
  1337. NS_IMETHODIMP
  1338. nsWebBrowser::GetMainWidget(nsIWidget** aMainWidget)
  1339. {
  1340. NS_ENSURE_ARG_POINTER(aMainWidget);
  1341. if (mInternalWidget) {
  1342. *aMainWidget = mInternalWidget;
  1343. } else {
  1344. *aMainWidget = mParentWidget;
  1345. }
  1346. NS_IF_ADDREF(*aMainWidget);
  1347. return NS_OK;
  1348. }
  1349. NS_IMETHODIMP
  1350. nsWebBrowser::SetFocus()
  1351. {
  1352. nsCOMPtr<nsPIDOMWindowOuter> window = GetWindow();
  1353. NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
  1354. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1355. return fm ? fm->SetFocusedWindow(window) : NS_OK;
  1356. }
  1357. NS_IMETHODIMP
  1358. nsWebBrowser::GetTitle(char16_t** aTitle)
  1359. {
  1360. NS_ENSURE_ARG_POINTER(aTitle);
  1361. NS_ENSURE_STATE(mDocShell);
  1362. NS_ENSURE_SUCCESS(mDocShellAsWin->GetTitle(aTitle), NS_ERROR_FAILURE);
  1363. return NS_OK;
  1364. }
  1365. NS_IMETHODIMP
  1366. nsWebBrowser::SetTitle(const char16_t* aTitle)
  1367. {
  1368. NS_ENSURE_STATE(mDocShell);
  1369. NS_ENSURE_SUCCESS(mDocShellAsWin->SetTitle(aTitle), NS_ERROR_FAILURE);
  1370. return NS_OK;
  1371. }
  1372. //*****************************************************************************
  1373. // nsWebBrowser::nsIScrollable
  1374. //*****************************************************************************
  1375. NS_IMETHODIMP
  1376. nsWebBrowser::GetDefaultScrollbarPreferences(int32_t aScrollOrientation,
  1377. int32_t* aScrollbarPref)
  1378. {
  1379. NS_ENSURE_STATE(mDocShell);
  1380. return mDocShellAsScrollable->GetDefaultScrollbarPreferences(
  1381. aScrollOrientation, aScrollbarPref);
  1382. }
  1383. NS_IMETHODIMP
  1384. nsWebBrowser::SetDefaultScrollbarPreferences(int32_t aScrollOrientation,
  1385. int32_t aScrollbarPref)
  1386. {
  1387. NS_ENSURE_STATE(mDocShell);
  1388. return mDocShellAsScrollable->SetDefaultScrollbarPreferences(
  1389. aScrollOrientation, aScrollbarPref);
  1390. }
  1391. NS_IMETHODIMP
  1392. nsWebBrowser::GetScrollbarVisibility(bool* aVerticalVisible,
  1393. bool* aHorizontalVisible)
  1394. {
  1395. NS_ENSURE_STATE(mDocShell);
  1396. return mDocShellAsScrollable->GetScrollbarVisibility(aVerticalVisible,
  1397. aHorizontalVisible);
  1398. }
  1399. //*****************************************************************************
  1400. // nsWebBrowser::nsITextScroll
  1401. //*****************************************************************************
  1402. NS_IMETHODIMP
  1403. nsWebBrowser::ScrollByLines(int32_t aNumLines)
  1404. {
  1405. NS_ENSURE_STATE(mDocShell);
  1406. return mDocShellAsTextScroll->ScrollByLines(aNumLines);
  1407. }
  1408. NS_IMETHODIMP
  1409. nsWebBrowser::ScrollByPages(int32_t aNumPages)
  1410. {
  1411. NS_ENSURE_STATE(mDocShell);
  1412. return mDocShellAsTextScroll->ScrollByPages(aNumPages);
  1413. }
  1414. //*****************************************************************************
  1415. // nsWebBrowser: Listener Helpers
  1416. //*****************************************************************************
  1417. NS_IMETHODIMP
  1418. nsWebBrowser::SetDocShell(nsIDocShell* aDocShell)
  1419. {
  1420. // We need to keep the docshell alive while we perform the changes, but we
  1421. // don't need to call any methods on it.
  1422. nsCOMPtr<nsIDocShell> kungFuDeathGrip(mDocShell);
  1423. mozilla::Unused << kungFuDeathGrip;
  1424. if (aDocShell) {
  1425. NS_ENSURE_TRUE(!mDocShell, NS_ERROR_FAILURE);
  1426. nsCOMPtr<nsIInterfaceRequestor> req(do_QueryInterface(aDocShell));
  1427. nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(aDocShell));
  1428. nsCOMPtr<nsIWebNavigation> nav(do_QueryInterface(aDocShell));
  1429. nsCOMPtr<nsIScrollable> scrollable(do_QueryInterface(aDocShell));
  1430. nsCOMPtr<nsITextScroll> textScroll(do_QueryInterface(aDocShell));
  1431. nsCOMPtr<nsIWebProgress> progress(do_GetInterface(aDocShell));
  1432. NS_ENSURE_TRUE(req && baseWin && nav && scrollable && textScroll && progress,
  1433. NS_ERROR_FAILURE);
  1434. mDocShell = aDocShell;
  1435. mDocShellAsReq = req;
  1436. mDocShellAsWin = baseWin;
  1437. mDocShellAsNav = nav;
  1438. mDocShellAsScrollable = scrollable;
  1439. mDocShellAsTextScroll = textScroll;
  1440. mWebProgress = progress;
  1441. // By default, do not allow DNS prefetch, so we don't break our frozen
  1442. // API. Embeddors who decide to enable it should do so manually.
  1443. mDocShell->SetAllowDNSPrefetch(false);
  1444. // It's possible to call setIsActive() on us before we have a docshell.
  1445. // If we're getting a docshell now, pass along our desired value. The
  1446. // default here (true) matches the default of the docshell, so this is
  1447. // a no-op unless setIsActive(false) has been called on us.
  1448. mDocShell->SetIsActive(mIsActive);
  1449. } else {
  1450. if (mDocShellTreeOwner) {
  1451. mDocShellTreeOwner->RemoveFromWatcher(); // evil twin of Add in Create()
  1452. }
  1453. if (mDocShellAsWin) {
  1454. mDocShellAsWin->Destroy();
  1455. }
  1456. mDocShell = nullptr;
  1457. mDocShellAsReq = nullptr;
  1458. mDocShellAsWin = nullptr;
  1459. mDocShellAsNav = nullptr;
  1460. mDocShellAsScrollable = nullptr;
  1461. mDocShellAsTextScroll = nullptr;
  1462. mWebProgress = nullptr;
  1463. }
  1464. return NS_OK;
  1465. }
  1466. NS_IMETHODIMP
  1467. nsWebBrowser::EnsureDocShellTreeOwner()
  1468. {
  1469. if (mDocShellTreeOwner) {
  1470. return NS_OK;
  1471. }
  1472. mDocShellTreeOwner = new nsDocShellTreeOwner();
  1473. mDocShellTreeOwner->WebBrowser(this);
  1474. return NS_OK;
  1475. }
  1476. static void
  1477. DrawPaintedLayer(PaintedLayer* aLayer,
  1478. gfxContext* aContext,
  1479. const nsIntRegion& aRegionToDraw,
  1480. const nsIntRegion& aDirtyRegion,
  1481. DrawRegionClip aClip,
  1482. const nsIntRegion& aRegionToInvalidate,
  1483. void* aCallbackData)
  1484. {
  1485. DrawTarget& aDrawTarget = *aContext->GetDrawTarget();
  1486. ColorPattern color(ToDeviceColor(*static_cast<nscolor*>(aCallbackData)));
  1487. nsIntRect dirtyRect = aRegionToDraw.GetBounds();
  1488. aDrawTarget.FillRect(
  1489. Rect(dirtyRect.x, dirtyRect.y, dirtyRect.width, dirtyRect.height), color);
  1490. }
  1491. void
  1492. nsWebBrowser::WindowRaised(nsIWidget* aWidget)
  1493. {
  1494. #if defined(DEBUG_smaug)
  1495. nsCOMPtr<nsIDocument> document = mDocShell->GetDocument();
  1496. nsAutoString documentURI;
  1497. document->GetDocumentURI(documentURI);
  1498. printf("nsWebBrowser::NS_ACTIVATE %p %s\n", (void*)this,
  1499. NS_ConvertUTF16toUTF8(documentURI).get());
  1500. #endif
  1501. Activate();
  1502. }
  1503. void
  1504. nsWebBrowser::WindowLowered(nsIWidget* aWidget)
  1505. {
  1506. #if defined(DEBUG_smaug)
  1507. nsCOMPtr<nsIDocument> document = mDocShell->GetDocument();
  1508. nsAutoString documentURI;
  1509. document->GetDocumentURI(documentURI);
  1510. printf("nsWebBrowser::NS_DEACTIVATE %p %s\n", (void*)this,
  1511. NS_ConvertUTF16toUTF8(documentURI).get());
  1512. #endif
  1513. Deactivate();
  1514. }
  1515. bool
  1516. nsWebBrowser::PaintWindow(nsIWidget* aWidget, LayoutDeviceIntRegion aRegion)
  1517. {
  1518. LayerManager* layerManager = aWidget->GetLayerManager();
  1519. NS_ASSERTION(layerManager, "Must be in paint event");
  1520. layerManager->BeginTransaction();
  1521. RefPtr<PaintedLayer> root = layerManager->CreatePaintedLayer();
  1522. if (root) {
  1523. nsIntRect dirtyRect = aRegion.GetBounds().ToUnknownRect();
  1524. root->SetVisibleRegion(LayerIntRegion::FromUnknownRegion(dirtyRect));
  1525. layerManager->SetRoot(root);
  1526. }
  1527. layerManager->EndTransaction(DrawPaintedLayer, &mBackgroundColor);
  1528. return true;
  1529. }
  1530. /*
  1531. NS_IMETHODIMP
  1532. nsWebBrowser::GetPrimaryContentWindow(mozIDOMWindowProxy** aDOMWindow)
  1533. {
  1534. *aDOMWindow = nullptr;
  1535. nsCOMPtr<nsIDocShellTreeItem> item;
  1536. NS_ENSURE_TRUE(mDocShellTreeOwner, NS_ERROR_FAILURE);
  1537. mDocShellTreeOwner->GetPrimaryContentShell(getter_AddRefs(item));
  1538. NS_ENSURE_TRUE(item, NS_ERROR_FAILURE);
  1539. nsCOMPtr<nsIDocShell> docShell;
  1540. docShell = do_QueryInterface(item);
  1541. NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE);
  1542. nsCOMPtr<nsPIDOMWindowOuter> domWindow = docShell->GetWindow();
  1543. NS_ENSURE_TRUE(domWindow, NS_ERROR_FAILURE);
  1544. *aDOMWindow = domWindow;
  1545. NS_ADDREF(*aDOMWindow);
  1546. return NS_OK;
  1547. }
  1548. */
  1549. //*****************************************************************************
  1550. // nsWebBrowser::nsIWebBrowserFocus
  1551. //*****************************************************************************
  1552. NS_IMETHODIMP
  1553. nsWebBrowser::Activate(void)
  1554. {
  1555. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1556. nsCOMPtr<nsPIDOMWindowOuter> window = GetWindow();
  1557. if (fm && window) {
  1558. return fm->WindowRaised(window);
  1559. }
  1560. return NS_OK;
  1561. }
  1562. NS_IMETHODIMP
  1563. nsWebBrowser::Deactivate(void)
  1564. {
  1565. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1566. nsCOMPtr<nsPIDOMWindowOuter> window = GetWindow();
  1567. if (fm && window) {
  1568. return fm->WindowLowered(window);
  1569. }
  1570. return NS_OK;
  1571. }
  1572. NS_IMETHODIMP
  1573. nsWebBrowser::SetFocusAtFirstElement(void)
  1574. {
  1575. return NS_OK;
  1576. }
  1577. NS_IMETHODIMP
  1578. nsWebBrowser::SetFocusAtLastElement(void)
  1579. {
  1580. return NS_OK;
  1581. }
  1582. NS_IMETHODIMP
  1583. nsWebBrowser::GetFocusedWindow(mozIDOMWindowProxy** aFocusedWindow)
  1584. {
  1585. NS_ENSURE_ARG_POINTER(aFocusedWindow);
  1586. *aFocusedWindow = nullptr;
  1587. NS_ENSURE_TRUE(mDocShell, NS_ERROR_FAILURE);
  1588. nsCOMPtr<nsPIDOMWindowOuter> window = mDocShell->GetWindow();
  1589. NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
  1590. nsCOMPtr<nsIDOMElement> focusedElement;
  1591. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1592. return fm ? fm->GetFocusedElementForWindow(window, true, aFocusedWindow,
  1593. getter_AddRefs(focusedElement)) :
  1594. NS_OK;
  1595. }
  1596. NS_IMETHODIMP
  1597. nsWebBrowser::SetFocusedWindow(mozIDOMWindowProxy* aFocusedWindow)
  1598. {
  1599. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1600. return fm ? fm->SetFocusedWindow(aFocusedWindow) : NS_OK;
  1601. }
  1602. NS_IMETHODIMP
  1603. nsWebBrowser::GetFocusedElement(nsIDOMElement** aFocusedElement)
  1604. {
  1605. NS_ENSURE_ARG_POINTER(aFocusedElement);
  1606. NS_ENSURE_TRUE(mDocShell, NS_ERROR_FAILURE);
  1607. nsCOMPtr<nsPIDOMWindowOuter> window = mDocShell->GetWindow();
  1608. NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
  1609. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1610. return
  1611. fm ? fm->GetFocusedElementForWindow(window, true, nullptr, aFocusedElement) :
  1612. NS_OK;
  1613. }
  1614. NS_IMETHODIMP
  1615. nsWebBrowser::SetFocusedElement(nsIDOMElement* aFocusedElement)
  1616. {
  1617. nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
  1618. return fm ? fm->SetFocus(aFocusedElement, 0) : NS_OK;
  1619. }
  1620. //*****************************************************************************
  1621. // nsWebBrowser::nsIWebBrowserStream
  1622. //*****************************************************************************
  1623. NS_IMETHODIMP
  1624. nsWebBrowser::OpenStream(nsIURI* aBaseURI, const nsACString& aContentType)
  1625. {
  1626. nsresult rv;
  1627. if (!mStream) {
  1628. mStream = new nsEmbedStream();
  1629. mStream->InitOwner(this);
  1630. rv = mStream->Init();
  1631. if (NS_FAILED(rv)) {
  1632. return rv;
  1633. }
  1634. }
  1635. return mStream->OpenStream(aBaseURI, aContentType);
  1636. }
  1637. NS_IMETHODIMP
  1638. nsWebBrowser::AppendToStream(const uint8_t* aData, uint32_t aLen)
  1639. {
  1640. if (!mStream) {
  1641. return NS_ERROR_FAILURE;
  1642. }
  1643. return mStream->AppendToStream(aData, aLen);
  1644. }
  1645. NS_IMETHODIMP
  1646. nsWebBrowser::CloseStream()
  1647. {
  1648. nsresult rv;
  1649. if (!mStream) {
  1650. return NS_ERROR_FAILURE;
  1651. }
  1652. rv = mStream->CloseStream();
  1653. mStream = nullptr;
  1654. return rv;
  1655. }
  1656. bool
  1657. nsWebBrowser::WidgetListenerDelegate::PaintWindow(
  1658. nsIWidget* aWidget, mozilla::LayoutDeviceIntRegion aRegion)
  1659. {
  1660. RefPtr<nsWebBrowser> holder = mWebBrowser;
  1661. return holder->PaintWindow(aWidget, aRegion);
  1662. }