Line data Source code
1 : /* -*- Mode: C++; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 : *
3 : * This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : // Local Includes
8 : #include "nsChromeTreeOwner.h"
9 : #include "nsXULWindow.h"
10 :
11 : // Helper Classes
12 : #include "nsString.h"
13 : #include "nsIEmbeddingSiteWindow.h"
14 : #include "nsIServiceManager.h"
15 : #include "nsIDocShellTreeItem.h"
16 :
17 : // Interfaces needed to include
18 : #include "nsIPrompt.h"
19 : #include "nsIAuthPrompt.h"
20 : #include "nsIBrowserDOMWindow.h"
21 : #include "nsIWebProgress.h"
22 : #include "nsIWidget.h"
23 : #include "nsIWindowMediator.h"
24 : #include "nsIDOMChromeWindow.h"
25 : #include "nsIDOMNode.h"
26 : #include "nsIDOMElement.h"
27 : #include "nsIDOMNodeList.h"
28 : #include "nsIDOMXULElement.h"
29 : #include "nsIXULBrowserWindow.h"
30 : #include "mozilla/dom/Element.h"
31 :
32 : using namespace mozilla;
33 :
34 : //*****************************************************************************
35 : // nsChromeTreeOwner string literals
36 : //*****************************************************************************
37 :
38 3 : const nsLiteralString kPersist(u"persist");
39 3 : const nsLiteralString kScreenX(u"screenX");
40 3 : const nsLiteralString kScreenY(u"screenY");
41 3 : const nsLiteralString kWidth(u"width");
42 3 : const nsLiteralString kHeight(u"height");
43 3 : const nsLiteralString kSizemode(u"sizemode");
44 3 : const nsLiteralString kSpace(u" ");
45 :
46 : //*****************************************************************************
47 : //*** nsChromeTreeOwner: Object Management
48 : //*****************************************************************************
49 :
50 2 : nsChromeTreeOwner::nsChromeTreeOwner() : mXULWindow(nullptr)
51 : {
52 2 : }
53 :
54 0 : nsChromeTreeOwner::~nsChromeTreeOwner()
55 : {
56 0 : }
57 :
58 : //*****************************************************************************
59 : // nsChromeTreeOwner::nsISupports
60 : //*****************************************************************************
61 :
62 771 : NS_IMPL_ADDREF(nsChromeTreeOwner)
63 765 : NS_IMPL_RELEASE(nsChromeTreeOwner)
64 :
65 712 : NS_INTERFACE_MAP_BEGIN(nsChromeTreeOwner)
66 712 : NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDocShellTreeOwner)
67 709 : NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeOwner)
68 619 : NS_INTERFACE_MAP_ENTRY(nsIBaseWindow)
69 578 : NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
70 70 : NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
71 26 : NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
72 24 : NS_INTERFACE_MAP_END
73 :
74 : //*****************************************************************************
75 : // nsChromeTreeOwner::nsIInterfaceRequestor
76 : //*****************************************************************************
77 :
78 43 : NS_IMETHODIMP nsChromeTreeOwner::GetInterface(const nsIID& aIID, void** aSink)
79 : {
80 43 : NS_ENSURE_ARG_POINTER(aSink);
81 :
82 43 : if(aIID.Equals(NS_GET_IID(nsIPrompt))) {
83 0 : NS_ENSURE_STATE(mXULWindow);
84 0 : return mXULWindow->GetInterface(aIID, aSink);
85 : }
86 43 : if(aIID.Equals(NS_GET_IID(nsIAuthPrompt))) {
87 0 : NS_ENSURE_STATE(mXULWindow);
88 0 : return mXULWindow->GetInterface(aIID, aSink);
89 : }
90 43 : if(aIID.Equals(NS_GET_IID(nsIWebBrowserChrome))) {
91 14 : NS_ENSURE_STATE(mXULWindow);
92 14 : return mXULWindow->GetInterface(aIID, aSink);
93 : }
94 29 : if (aIID.Equals(NS_GET_IID(nsIEmbeddingSiteWindow))) {
95 0 : NS_ENSURE_STATE(mXULWindow);
96 0 : return mXULWindow->GetInterface(aIID, aSink);
97 : }
98 29 : if (aIID.Equals(NS_GET_IID(nsIXULWindow))) {
99 6 : NS_ENSURE_STATE(mXULWindow);
100 6 : return mXULWindow->QueryInterface(aIID, aSink);
101 : }
102 :
103 23 : return QueryInterface(aIID, aSink);
104 : }
105 :
106 : //*****************************************************************************
107 : // nsChromeTreeOwner::nsIDocShellTreeOwner
108 : //*****************************************************************************
109 :
110 : NS_IMETHODIMP
111 1 : nsChromeTreeOwner::ContentShellAdded(nsIDocShellTreeItem* aContentShell,
112 : bool aPrimary)
113 : {
114 1 : NS_ENSURE_STATE(mXULWindow);
115 1 : return mXULWindow->ContentShellAdded(aContentShell, aPrimary);
116 : }
117 :
118 : NS_IMETHODIMP
119 1 : nsChromeTreeOwner::ContentShellRemoved(nsIDocShellTreeItem* aContentShell)
120 : {
121 1 : NS_ENSURE_STATE(mXULWindow);
122 1 : return mXULWindow->ContentShellRemoved(aContentShell);
123 : }
124 :
125 25 : NS_IMETHODIMP nsChromeTreeOwner::GetPrimaryContentShell(nsIDocShellTreeItem** aShell)
126 : {
127 25 : NS_ENSURE_STATE(mXULWindow);
128 25 : return mXULWindow->GetPrimaryContentShell(aShell);
129 : }
130 :
131 : NS_IMETHODIMP
132 1 : nsChromeTreeOwner::TabParentAdded(nsITabParent* aTab, bool aPrimary)
133 : {
134 1 : NS_ENSURE_STATE(mXULWindow);
135 1 : return mXULWindow->TabParentAdded(aTab, aPrimary);
136 : }
137 :
138 : NS_IMETHODIMP
139 1 : nsChromeTreeOwner::TabParentRemoved(nsITabParent* aTab)
140 : {
141 1 : NS_ENSURE_STATE(mXULWindow);
142 1 : return mXULWindow->TabParentRemoved(aTab);
143 : }
144 :
145 : NS_IMETHODIMP
146 0 : nsChromeTreeOwner::GetPrimaryTabParent(nsITabParent** aTab)
147 : {
148 0 : NS_ENSURE_STATE(mXULWindow);
149 0 : return mXULWindow->GetPrimaryTabParent(aTab);
150 : }
151 :
152 : NS_IMETHODIMP
153 0 : nsChromeTreeOwner::GetPrimaryContentSize(int32_t* aWidth,
154 : int32_t* aHeight)
155 : {
156 0 : NS_ENSURE_STATE(mXULWindow);
157 0 : return mXULWindow->GetPrimaryContentSize(aWidth, aHeight);
158 : }
159 :
160 : NS_IMETHODIMP
161 0 : nsChromeTreeOwner::SetPrimaryContentSize(int32_t aWidth,
162 : int32_t aHeight)
163 : {
164 0 : NS_ENSURE_STATE(mXULWindow);
165 0 : return mXULWindow->SetPrimaryContentSize(aWidth, aHeight);
166 : }
167 :
168 : NS_IMETHODIMP
169 1 : nsChromeTreeOwner::GetRootShellSize(int32_t* aWidth,
170 : int32_t* aHeight)
171 : {
172 1 : NS_ENSURE_STATE(mXULWindow);
173 1 : return mXULWindow->GetRootShellSize(aWidth, aHeight);
174 : }
175 :
176 : NS_IMETHODIMP
177 0 : nsChromeTreeOwner::SetRootShellSize(int32_t aWidth,
178 : int32_t aHeight)
179 : {
180 0 : NS_ENSURE_STATE(mXULWindow);
181 0 : return mXULWindow->SetRootShellSize(aWidth, aHeight);
182 : }
183 :
184 0 : NS_IMETHODIMP nsChromeTreeOwner::SizeShellTo(nsIDocShellTreeItem* aShellItem,
185 : int32_t aCX, int32_t aCY)
186 : {
187 0 : NS_ENSURE_STATE(mXULWindow);
188 0 : return mXULWindow->SizeShellTo(aShellItem, aCX, aCY);
189 : }
190 :
191 : NS_IMETHODIMP
192 0 : nsChromeTreeOwner::SetPersistence(bool aPersistPosition,
193 : bool aPersistSize,
194 : bool aPersistSizeMode)
195 : {
196 0 : NS_ENSURE_STATE(mXULWindow);
197 0 : nsCOMPtr<dom::Element> docShellElement = mXULWindow->GetWindowDOMElement();
198 0 : if (!docShellElement)
199 0 : return NS_ERROR_FAILURE;
200 :
201 0 : nsAutoString persistString;
202 0 : docShellElement->GetAttribute(kPersist, persistString);
203 :
204 0 : bool saveString = false;
205 : int32_t index;
206 :
207 : #define FIND_PERSIST_STRING(aString, aCond) \
208 : index = persistString.Find(aString); \
209 : if (!aCond && index > kNotFound) { \
210 : persistString.Cut(index, aString.Length()); \
211 : saveString = true; \
212 : } else if (aCond && index == kNotFound) { \
213 : persistString.Append(kSpace + aString); \
214 : saveString = true; \
215 : }
216 0 : FIND_PERSIST_STRING(kScreenX, aPersistPosition);
217 0 : FIND_PERSIST_STRING(kScreenY, aPersistPosition);
218 0 : FIND_PERSIST_STRING(kWidth, aPersistSize);
219 0 : FIND_PERSIST_STRING(kHeight, aPersistSize);
220 0 : FIND_PERSIST_STRING(kSizemode, aPersistSizeMode);
221 :
222 0 : ErrorResult rv;
223 0 : if (saveString) {
224 0 : docShellElement->SetAttribute(kPersist, persistString, rv);
225 : }
226 :
227 0 : return NS_OK;
228 : }
229 :
230 : NS_IMETHODIMP
231 0 : nsChromeTreeOwner::GetPersistence(bool* aPersistPosition,
232 : bool* aPersistSize,
233 : bool* aPersistSizeMode)
234 : {
235 0 : NS_ENSURE_STATE(mXULWindow);
236 0 : nsCOMPtr<dom::Element> docShellElement = mXULWindow->GetWindowDOMElement();
237 0 : if (!docShellElement)
238 0 : return NS_ERROR_FAILURE;
239 :
240 0 : nsAutoString persistString;
241 0 : docShellElement->GetAttribute(kPersist, persistString);
242 :
243 : // data structure doesn't quite match the question, but it's close enough
244 : // for what we want (since this method is never actually called...)
245 0 : if (aPersistPosition)
246 0 : *aPersistPosition = persistString.Find(kScreenX) > kNotFound ||
247 0 : persistString.Find(kScreenY) > kNotFound;
248 0 : if (aPersistSize)
249 0 : *aPersistSize = persistString.Find(kWidth) > kNotFound ||
250 0 : persistString.Find(kHeight) > kNotFound;
251 0 : if (aPersistSizeMode)
252 0 : *aPersistSizeMode = persistString.Find(kSizemode) > kNotFound;
253 :
254 0 : return NS_OK;
255 : }
256 :
257 : NS_IMETHODIMP
258 0 : nsChromeTreeOwner::GetTabCount(uint32_t* aResult)
259 : {
260 0 : if (mXULWindow) {
261 0 : return mXULWindow->GetTabCount(aResult);
262 : }
263 :
264 0 : *aResult = 0;
265 0 : return NS_OK;
266 : }
267 :
268 : NS_IMETHODIMP
269 1 : nsChromeTreeOwner::GetHasPrimaryContent(bool* aResult)
270 : {
271 1 : NS_ENSURE_STATE(mXULWindow);
272 1 : return mXULWindow->GetHasPrimaryContent(aResult);
273 : }
274 :
275 : //*****************************************************************************
276 : // nsChromeTreeOwner::nsIBaseWindow
277 : //*****************************************************************************
278 :
279 0 : NS_IMETHODIMP nsChromeTreeOwner::InitWindow(nativeWindow aParentNativeWindow,
280 : nsIWidget* parentWidget, int32_t x, int32_t y, int32_t cx, int32_t cy)
281 : {
282 : // Ignore widget parents for now. Don't think those are a vaild thing to call.
283 0 : NS_ENSURE_SUCCESS(SetPositionAndSize(x, y, cx, cy, 0), NS_ERROR_FAILURE);
284 :
285 0 : return NS_OK;
286 : }
287 :
288 0 : NS_IMETHODIMP nsChromeTreeOwner::Create()
289 : {
290 0 : NS_ASSERTION(false, "You can't call this");
291 0 : return NS_ERROR_UNEXPECTED;
292 : }
293 :
294 0 : NS_IMETHODIMP nsChromeTreeOwner::Destroy()
295 : {
296 0 : NS_ENSURE_STATE(mXULWindow);
297 0 : return mXULWindow->Destroy();
298 : }
299 :
300 1 : NS_IMETHODIMP nsChromeTreeOwner::GetUnscaledDevicePixelsPerCSSPixel(double *aScale)
301 : {
302 1 : NS_ENSURE_STATE(mXULWindow);
303 1 : return mXULWindow->GetUnscaledDevicePixelsPerCSSPixel(aScale);
304 : }
305 :
306 0 : NS_IMETHODIMP nsChromeTreeOwner::GetDevicePixelsPerDesktopPixel(double *aScale)
307 : {
308 0 : NS_ENSURE_STATE(mXULWindow);
309 0 : return mXULWindow->GetDevicePixelsPerDesktopPixel(aScale);
310 : }
311 :
312 0 : NS_IMETHODIMP nsChromeTreeOwner::SetPositionDesktopPix(int32_t x, int32_t y)
313 : {
314 0 : NS_ENSURE_STATE(mXULWindow);
315 0 : return mXULWindow->SetPositionDesktopPix(x, y);
316 : }
317 :
318 0 : NS_IMETHODIMP nsChromeTreeOwner::SetPosition(int32_t x, int32_t y)
319 : {
320 0 : NS_ENSURE_STATE(mXULWindow);
321 0 : return mXULWindow->SetPosition(x, y);
322 : }
323 :
324 9 : NS_IMETHODIMP nsChromeTreeOwner::GetPosition(int32_t* x, int32_t* y)
325 : {
326 9 : NS_ENSURE_STATE(mXULWindow);
327 9 : return mXULWindow->GetPosition(x, y);
328 : }
329 :
330 0 : NS_IMETHODIMP nsChromeTreeOwner::SetSize(int32_t cx, int32_t cy, bool fRepaint)
331 : {
332 0 : NS_ENSURE_STATE(mXULWindow);
333 0 : return mXULWindow->SetSize(cx, cy, fRepaint);
334 : }
335 :
336 9 : NS_IMETHODIMP nsChromeTreeOwner::GetSize(int32_t* cx, int32_t* cy)
337 : {
338 9 : NS_ENSURE_STATE(mXULWindow);
339 9 : return mXULWindow->GetSize(cx, cy);
340 : }
341 :
342 0 : NS_IMETHODIMP nsChromeTreeOwner::SetPositionAndSize(int32_t x, int32_t y, int32_t cx,
343 : int32_t cy, uint32_t aFlags)
344 : {
345 0 : NS_ENSURE_STATE(mXULWindow);
346 0 : return mXULWindow->SetPositionAndSize(x, y, cx, cy, aFlags);
347 : }
348 :
349 1 : NS_IMETHODIMP nsChromeTreeOwner::GetPositionAndSize(int32_t* x, int32_t* y, int32_t* cx,
350 : int32_t* cy)
351 : {
352 1 : NS_ENSURE_STATE(mXULWindow);
353 1 : return mXULWindow->GetPositionAndSize(x, y, cx, cy);
354 : }
355 :
356 0 : NS_IMETHODIMP nsChromeTreeOwner::Repaint(bool aForce)
357 : {
358 0 : NS_ENSURE_STATE(mXULWindow);
359 0 : return mXULWindow->Repaint(aForce);
360 : }
361 :
362 0 : NS_IMETHODIMP nsChromeTreeOwner::GetParentWidget(nsIWidget** aParentWidget)
363 : {
364 0 : NS_ENSURE_STATE(mXULWindow);
365 0 : return mXULWindow->GetParentWidget(aParentWidget);
366 : }
367 :
368 0 : NS_IMETHODIMP nsChromeTreeOwner::SetParentWidget(nsIWidget* aParentWidget)
369 : {
370 0 : NS_ASSERTION(false, "You can't call this");
371 0 : return NS_ERROR_NOT_IMPLEMENTED;
372 : }
373 :
374 0 : NS_IMETHODIMP nsChromeTreeOwner::GetParentNativeWindow(nativeWindow* aParentNativeWindow)
375 : {
376 0 : NS_ENSURE_STATE(mXULWindow);
377 0 : return mXULWindow->GetParentNativeWindow(aParentNativeWindow);
378 : }
379 :
380 0 : NS_IMETHODIMP nsChromeTreeOwner::SetParentNativeWindow(nativeWindow aParentNativeWindow)
381 : {
382 0 : NS_ASSERTION(false, "You can't call this");
383 0 : return NS_ERROR_NOT_IMPLEMENTED;
384 : }
385 :
386 0 : NS_IMETHODIMP nsChromeTreeOwner::GetNativeHandle(nsAString& aNativeHandle)
387 : {
388 0 : NS_ENSURE_STATE(mXULWindow);
389 0 : return mXULWindow->GetNativeHandle(aNativeHandle);
390 : }
391 :
392 3 : NS_IMETHODIMP nsChromeTreeOwner::GetVisibility(bool* aVisibility)
393 : {
394 3 : NS_ENSURE_STATE(mXULWindow);
395 3 : return mXULWindow->GetVisibility(aVisibility);
396 : }
397 :
398 1 : NS_IMETHODIMP nsChromeTreeOwner::SetVisibility(bool aVisibility)
399 : {
400 1 : NS_ENSURE_STATE(mXULWindow);
401 1 : return mXULWindow->SetVisibility(aVisibility);
402 : }
403 :
404 1 : NS_IMETHODIMP nsChromeTreeOwner::GetEnabled(bool *aEnabled)
405 : {
406 1 : NS_ENSURE_STATE(mXULWindow);
407 1 : return mXULWindow->GetEnabled(aEnabled);
408 : }
409 :
410 0 : NS_IMETHODIMP nsChromeTreeOwner::SetEnabled(bool aEnable)
411 : {
412 0 : NS_ENSURE_STATE(mXULWindow);
413 0 : return mXULWindow->SetEnabled(aEnable);
414 : }
415 :
416 8 : NS_IMETHODIMP nsChromeTreeOwner::GetMainWidget(nsIWidget** aMainWidget)
417 : {
418 8 : NS_ENSURE_ARG_POINTER(aMainWidget);
419 8 : NS_ENSURE_STATE(mXULWindow);
420 :
421 8 : *aMainWidget = mXULWindow->mWindow;
422 8 : NS_IF_ADDREF(*aMainWidget);
423 :
424 8 : return NS_OK;
425 : }
426 :
427 0 : NS_IMETHODIMP nsChromeTreeOwner::SetFocus()
428 : {
429 0 : NS_ENSURE_STATE(mXULWindow);
430 0 : return mXULWindow->SetFocus();
431 : }
432 :
433 0 : NS_IMETHODIMP nsChromeTreeOwner::GetTitle(char16_t** aTitle)
434 : {
435 0 : NS_ENSURE_STATE(mXULWindow);
436 0 : return mXULWindow->GetTitle(aTitle);
437 : }
438 :
439 2 : NS_IMETHODIMP nsChromeTreeOwner::SetTitle(const char16_t* aTitle)
440 : {
441 2 : NS_ENSURE_STATE(mXULWindow);
442 2 : return mXULWindow->SetTitle(aTitle);
443 : }
444 :
445 : //*****************************************************************************
446 : // nsChromeTreeOwner::nsIWebProgressListener
447 : //*****************************************************************************
448 :
449 : NS_IMETHODIMP
450 50 : nsChromeTreeOwner::OnProgressChange(nsIWebProgress* aWebProgress,
451 : nsIRequest* aRequest,
452 : int32_t aCurSelfProgress,
453 : int32_t aMaxSelfProgress,
454 : int32_t aCurTotalProgress,
455 : int32_t aMaxTotalProgress)
456 : {
457 50 : return NS_OK;
458 : }
459 :
460 : NS_IMETHODIMP
461 195 : nsChromeTreeOwner::OnStateChange(nsIWebProgress* aWebProgress,
462 : nsIRequest* aRequest,
463 : uint32_t aProgressStateFlags,
464 : nsresult aStatus)
465 : {
466 195 : return NS_OK;
467 : }
468 :
469 5 : NS_IMETHODIMP nsChromeTreeOwner::OnLocationChange(nsIWebProgress* aWebProgress,
470 : nsIRequest* aRequest,
471 : nsIURI* aLocation,
472 : uint32_t aFlags)
473 : {
474 5 : bool itsForYou = true;
475 :
476 5 : if (aWebProgress) {
477 5 : NS_ENSURE_STATE(mXULWindow);
478 10 : nsCOMPtr<mozIDOMWindowProxy> progressWin;
479 5 : aWebProgress->GetDOMWindow(getter_AddRefs(progressWin));
480 :
481 10 : nsCOMPtr<nsIDocShell> docshell;
482 5 : mXULWindow->GetDocShell(getter_AddRefs(docshell));
483 : // XXXkhuey this is totally wrong, bug 1223303.
484 10 : nsCOMPtr<mozIDOMWindowProxy> ourWin(do_QueryInterface(docshell));
485 :
486 5 : if (ourWin != progressWin)
487 5 : itsForYou = false;
488 : }
489 :
490 : // If loading a new root .xul document, then redo chrome.
491 5 : if (itsForYou) {
492 0 : NS_ENSURE_STATE(mXULWindow);
493 0 : mXULWindow->mChromeLoaded = false;
494 : }
495 5 : return NS_OK;
496 : }
497 :
498 : NS_IMETHODIMP
499 1 : nsChromeTreeOwner::OnStatusChange(nsIWebProgress* aWebProgress,
500 : nsIRequest* aRequest,
501 : nsresult aStatus,
502 : const char16_t* aMessage)
503 : {
504 1 : return NS_OK;
505 : }
506 :
507 :
508 :
509 : NS_IMETHODIMP
510 0 : nsChromeTreeOwner::OnSecurityChange(nsIWebProgress *aWebProgress,
511 : nsIRequest *aRequest,
512 : uint32_t state)
513 : {
514 0 : return NS_OK;
515 : }
516 :
517 : //*****************************************************************************
518 : // nsChromeTreeOwner: Helpers
519 : //*****************************************************************************
520 :
521 : //*****************************************************************************
522 : // nsChromeTreeOwner: Accessors
523 : //*****************************************************************************
524 :
525 2 : void nsChromeTreeOwner::XULWindow(nsXULWindow* aXULWindow)
526 : {
527 2 : mXULWindow = aXULWindow;
528 2 : }
529 :
530 0 : nsXULWindow* nsChromeTreeOwner::XULWindow()
531 : {
532 0 : return mXULWindow;
533 : }
|