embedding/tests/winEmbed/WebBrowserChrome.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:09c8161939ff
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: Mozilla-sample-code 1.0
3 *
4 * Copyright (c) 2002 Netscape Communications Corporation and
5 * other contributors
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this Mozilla sample software and associated documentation files
9 * (the "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sublicense, and/or sell copies of the Software, and to permit
12 * persons to whom the Software is furnished to do so, subject to the
13 * following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
25 *
26 * Contributor(s):
27 *
28 * ***** END LICENSE BLOCK ***** */
29
30 // Local includes
31 #include "resource.h"
32 #include "winEmbed.h"
33 #include "WebBrowserChrome.h"
34
35 // OS headers
36 #include <stdio.h>
37
38 // Frozen APIs
39
40 #include "nsStringAPI.h"
41 #include "nsIComponentManager.h"
42 #include "nsIDOMWindow.h"
43 #include "nsIInterfaceRequestor.h"
44 #include "nsIRequest.h"
45 #include "nsIURI.h"
46 #include "nsIWebProgress.h"
47 #include "nsCWebBrowser.h"
48
49 // Glue APIs (not frozen, but safe to use because they are statically linked)
50 #include "nsComponentManagerUtils.h"
51
52 // NON-FROZEN APIS!
53 #include "nsIWebNavigation.h"
54
55 WebBrowserChrome::WebBrowserChrome()
56 {
57 mNativeWindow = nullptr;
58 mSizeSet = false;
59 }
60
61 WebBrowserChrome::~WebBrowserChrome()
62 {
63 WebBrowserChromeUI::Destroyed(this);
64 }
65
66 nsresult WebBrowserChrome::CreateBrowser(int32_t aX, int32_t aY,
67 int32_t aCX, int32_t aCY,
68 nsIWebBrowser **aBrowser)
69 {
70 NS_ENSURE_ARG_POINTER(aBrowser);
71 *aBrowser = nullptr;
72
73 mWebBrowser = do_CreateInstance(NS_WEBBROWSER_CONTRACTID);
74
75 if (!mWebBrowser)
76 return NS_ERROR_FAILURE;
77
78 (void)mWebBrowser->SetContainerWindow(static_cast<nsIWebBrowserChrome*>(this));
79
80 nsCOMPtr<nsIBaseWindow> browserBaseWindow = do_QueryInterface(mWebBrowser);
81
82 mNativeWindow = WebBrowserChromeUI::CreateNativeWindow(static_cast<nsIWebBrowserChrome*>(this));
83
84 if (!mNativeWindow)
85 return NS_ERROR_FAILURE;
86
87 browserBaseWindow->InitWindow( mNativeWindow,
88 nullptr,
89 aX, aY, aCX, aCY);
90 browserBaseWindow->Create();
91
92 nsCOMPtr<nsIWebProgressListener> listener(static_cast<nsIWebProgressListener*>(this));
93 nsCOMPtr<nsIWeakReference> thisListener(do_GetWeakReference(listener));
94 (void)mWebBrowser->AddWebBrowserListener(thisListener,
95 NS_GET_IID(nsIWebProgressListener));
96
97 // The window has been created. Now register for history notifications
98 mWebBrowser->AddWebBrowserListener(thisListener, NS_GET_IID(nsISHistoryListener));
99
100 if (mWebBrowser)
101 {
102 *aBrowser = mWebBrowser;
103 NS_ADDREF(*aBrowser);
104 return NS_OK;
105 }
106 return NS_ERROR_FAILURE;
107 }
108
109 //*****************************************************************************
110 // WebBrowserChrome::nsISupports
111 //*****************************************************************************
112
113 NS_IMPL_ADDREF(WebBrowserChrome)
114 NS_IMPL_RELEASE(WebBrowserChrome)
115
116 NS_INTERFACE_MAP_BEGIN(WebBrowserChrome)
117 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowserChrome)
118 NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
119 NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome)
120 NS_INTERFACE_MAP_ENTRY(nsIEmbeddingSiteWindow)
121 NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) // optional
122 NS_INTERFACE_MAP_ENTRY(nsISHistoryListener)
123 NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
124 NS_INTERFACE_MAP_ENTRY(nsIObserver)
125 NS_INTERFACE_MAP_ENTRY(nsIContextMenuListener)
126 NS_INTERFACE_MAP_ENTRY(nsITooltipListener)
127 NS_INTERFACE_MAP_END
128
129 //*****************************************************************************
130 // WebBrowserChrome::nsIInterfaceRequestor
131 //*****************************************************************************
132
133 NS_IMETHODIMP WebBrowserChrome::GetInterface(const nsIID &aIID, void** aInstancePtr)
134 {
135 NS_ENSURE_ARG_POINTER(aInstancePtr);
136
137 *aInstancePtr = 0;
138 if (aIID.Equals(NS_GET_IID(nsIDOMWindow)))
139 {
140 if (mWebBrowser)
141 {
142 return mWebBrowser->GetContentDOMWindow((nsIDOMWindow **) aInstancePtr);
143 }
144 return NS_ERROR_NOT_INITIALIZED;
145 }
146 return QueryInterface(aIID, aInstancePtr);
147 }
148
149 //*****************************************************************************
150 // WebBrowserChrome::nsIWebBrowserChrome
151 //*****************************************************************************
152
153 NS_IMETHODIMP WebBrowserChrome::SetStatus(uint32_t aType, const char16_t* aStatus)
154 {
155 WebBrowserChromeUI::UpdateStatusBarText(this, aStatus);
156 return NS_OK;
157 }
158
159 NS_IMETHODIMP WebBrowserChrome::GetWebBrowser(nsIWebBrowser** aWebBrowser)
160 {
161 NS_ENSURE_ARG_POINTER(aWebBrowser);
162 *aWebBrowser = mWebBrowser;
163 NS_IF_ADDREF(*aWebBrowser);
164 return NS_OK;
165 }
166
167 NS_IMETHODIMP WebBrowserChrome::SetWebBrowser(nsIWebBrowser* aWebBrowser)
168 {
169 mWebBrowser = aWebBrowser;
170 return NS_OK;
171 }
172
173 NS_IMETHODIMP WebBrowserChrome::GetChromeFlags(uint32_t* aChromeMask)
174 {
175 *aChromeMask = mChromeFlags;
176 return NS_OK;
177 }
178
179 NS_IMETHODIMP WebBrowserChrome::SetChromeFlags(uint32_t aChromeMask)
180 {
181 mChromeFlags = aChromeMask;
182 return NS_OK;
183 }
184
185 NS_IMETHODIMP WebBrowserChrome::DestroyBrowserWindow(void)
186 {
187 WebBrowserChromeUI::Destroy(this);
188 return NS_OK;
189 }
190
191
192 // IN: The desired browser client area dimensions.
193 NS_IMETHODIMP WebBrowserChrome::SizeBrowserTo(int32_t aWidth, int32_t aHeight)
194 {
195 /* This isn't exactly correct: we're setting the whole window to
196 the size requested for the browser. At time of writing, though,
197 it's fine and useful for winEmbed's purposes. */
198 WebBrowserChromeUI::SizeTo(this, aWidth, aHeight);
199 mSizeSet = true;
200 return NS_OK;
201 }
202
203
204 NS_IMETHODIMP WebBrowserChrome::ShowAsModal(void)
205 {
206 if (mDependentParent)
207 AppCallbacks::EnableChromeWindow(mDependentParent, false);
208
209 mContinueModalLoop = true;
210 AppCallbacks::RunEventLoop(mContinueModalLoop);
211
212 if (mDependentParent)
213 AppCallbacks::EnableChromeWindow(mDependentParent, true);
214
215 return NS_OK;
216 }
217
218 NS_IMETHODIMP WebBrowserChrome::IsWindowModal(bool *_retval)
219 {
220 *_retval = false;
221 return NS_ERROR_NOT_IMPLEMENTED;
222 }
223
224 NS_IMETHODIMP WebBrowserChrome::ExitModalEventLoop(nsresult aStatus)
225 {
226 mContinueModalLoop = false;
227 return NS_OK;
228 }
229
230 //*****************************************************************************
231 // WebBrowserChrome::nsIWebBrowserChromeFocus
232 //*****************************************************************************
233
234 NS_IMETHODIMP WebBrowserChrome::FocusNextElement()
235 {
236 return NS_ERROR_NOT_IMPLEMENTED;
237 }
238
239 NS_IMETHODIMP WebBrowserChrome::FocusPrevElement()
240 {
241 return NS_ERROR_NOT_IMPLEMENTED;
242 }
243
244 //*****************************************************************************
245 // WebBrowserChrome::nsIWebProgressListener
246 //*****************************************************************************
247
248 NS_IMETHODIMP WebBrowserChrome::OnProgressChange(nsIWebProgress *progress, nsIRequest *request,
249 int32_t curSelfProgress, int32_t maxSelfProgress,
250 int32_t curTotalProgress, int32_t maxTotalProgress)
251 {
252 WebBrowserChromeUI::UpdateProgress(this, curTotalProgress, maxTotalProgress);
253 return NS_OK;
254 }
255
256 NS_IMETHODIMP WebBrowserChrome::OnStateChange(nsIWebProgress *progress, nsIRequest *request,
257 uint32_t progressStateFlags, nsresult status)
258 {
259 if ((progressStateFlags & STATE_START) && (progressStateFlags & STATE_IS_DOCUMENT))
260 {
261 WebBrowserChromeUI::UpdateBusyState(this, true);
262 }
263
264 if ((progressStateFlags & STATE_STOP) && (progressStateFlags & STATE_IS_DOCUMENT))
265 {
266 WebBrowserChromeUI::UpdateBusyState(this, false);
267 WebBrowserChromeUI::UpdateProgress(this, 0, 100);
268 WebBrowserChromeUI::UpdateStatusBarText(this, nullptr);
269 ContentFinishedLoading();
270 }
271
272 return NS_OK;
273 }
274
275
276 NS_IMETHODIMP WebBrowserChrome::OnLocationChange(nsIWebProgress* aWebProgress,
277 nsIRequest* aRequest,
278 nsIURI *location,
279 uint32_t aFlags)
280 {
281 bool isSubFrameLoad = false; // Is this a subframe load
282 if (aWebProgress) {
283 nsCOMPtr<nsIDOMWindow> domWindow;
284 nsCOMPtr<nsIDOMWindow> topDomWindow;
285 aWebProgress->GetDOMWindow(getter_AddRefs(domWindow));
286 if (domWindow) { // Get root domWindow
287 domWindow->GetTop(getter_AddRefs(topDomWindow));
288 }
289 if (domWindow != topDomWindow)
290 isSubFrameLoad = true;
291 }
292 if (!isSubFrameLoad)
293 WebBrowserChromeUI::UpdateCurrentURI(this);
294 return NS_OK;
295 }
296
297 NS_IMETHODIMP
298 WebBrowserChrome::OnStatusChange(nsIWebProgress* aWebProgress,
299 nsIRequest* aRequest,
300 nsresult aStatus,
301 const char16_t* aMessage)
302 {
303 WebBrowserChromeUI::UpdateStatusBarText(this, aMessage);
304 return NS_OK;
305 }
306
307
308
309 NS_IMETHODIMP
310 WebBrowserChrome::OnSecurityChange(nsIWebProgress *aWebProgress,
311 nsIRequest *aRequest,
312 uint32_t state)
313 {
314 return NS_OK;
315 }
316
317 //*****************************************************************************
318 // WebBrowserChrome::nsISHistoryListener
319 //*****************************************************************************
320
321 NS_IMETHODIMP
322 WebBrowserChrome::OnHistoryNewEntry(nsIURI * aNewURI)
323 {
324 return SendHistoryStatusMessage(aNewURI, "add");
325 }
326
327 NS_IMETHODIMP
328 WebBrowserChrome::OnHistoryGoBack(nsIURI * aBackURI, bool * aContinue)
329 {
330 // For now, let the operation continue
331 *aContinue = true;
332 return SendHistoryStatusMessage(aBackURI, "back");
333 }
334
335
336 NS_IMETHODIMP
337 WebBrowserChrome::OnHistoryGoForward(nsIURI * aForwardURI, bool * aContinue)
338 {
339 // For now, let the operation continue
340 *aContinue = true;
341 return SendHistoryStatusMessage(aForwardURI, "forward");
342 }
343
344
345 NS_IMETHODIMP
346 WebBrowserChrome::OnHistoryGotoIndex(int32_t aIndex, nsIURI * aGotoURI, bool * aContinue)
347 {
348 // For now, let the operation continue
349 *aContinue = true;
350 return SendHistoryStatusMessage(aGotoURI, "goto", aIndex);
351 }
352
353 NS_IMETHODIMP
354 WebBrowserChrome::OnHistoryReload(nsIURI * aURI, uint32_t aReloadFlags, bool * aContinue)
355 {
356 // For now, let the operation continue
357 *aContinue = true;
358 return SendHistoryStatusMessage(aURI, "reload", 0 /* no info to pass here */, aReloadFlags);
359 }
360
361 NS_IMETHODIMP
362 WebBrowserChrome::OnHistoryPurge(int32_t aNumEntries, bool *aContinue)
363 {
364 // For now let the operation continue
365 *aContinue = false;
366 return SendHistoryStatusMessage(nullptr, "purge", aNumEntries);
367 }
368
369 NS_IMETHODIMP
370 WebBrowserChrome::OnHistoryReplaceEntry(int32_t aIndex)
371 {
372 return SendHistoryStatusMessage(nullptr, "replace", aIndex);
373 }
374
375 static void
376 AppendIntToCString(int32_t info1, nsCString& aResult)
377 {
378 char intstr[10];
379 _snprintf(intstr, sizeof(intstr) - 1, "%i", info1);
380 intstr[sizeof(intstr) - 1] = '\0';
381 aResult.Append(intstr);
382 }
383
384 nsresult
385 WebBrowserChrome::SendHistoryStatusMessage(nsIURI * aURI, char * operation, int32_t info1, uint32_t aReloadFlags)
386 {
387 nsCString uriSpec;
388 if (aURI)
389 {
390 aURI->GetSpec(uriSpec);
391 }
392
393 nsCString status;
394
395 if(!(strcmp(operation, "back")))
396 {
397 status.Assign("Going back to url: ");
398 status.Append(uriSpec);
399 }
400 else if (!(strcmp(operation, "forward")))
401 {
402 // Going forward. XXX Get string from a resource file
403 status.Assign("Going forward to url: ");
404 status.Append(uriSpec);
405 }
406 else if (!(strcmp(operation, "reload")))
407 {
408 // Reloading. XXX Get string from a resource file
409 if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY &&
410 aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE)
411 {
412 status.Assign("Reloading url, (bypassing proxy and cache): ");
413 }
414 else if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY)
415 {
416 status.Assign("Reloading url, (bypassing proxy): ");
417 }
418 else if (aReloadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE)
419 {
420 status.Assign("Reloading url, (bypassing cache): ");
421 }
422 else
423 {
424 status.Assign("Reloading url, (normal): ");
425 }
426 status.Append(uriSpec);
427 }
428 else if (!(strcmp(operation, "add")))
429 {
430 status.Assign(uriSpec);
431 status.Append(" added to session History");
432 }
433 else if (!(strcmp(operation, "goto")))
434 {
435 status.Assign("Going to HistoryIndex: ");
436
437 AppendIntToCString(info1, status);
438
439 status.Append(" Url: ");
440 status.Append(uriSpec);
441 }
442 else if (!(strcmp(operation, "purge")))
443 {
444 AppendIntToCString(info1, status);
445 status.Append(" purged from Session History");
446 }
447 else if (!(strcmp(operation, "replace")))
448 {
449 status.Assign("Replacing HistoryIndex: ");
450 AppendIntToCString(info1, status);
451 }
452
453 nsString wstatus;
454 NS_CStringToUTF16(status, NS_CSTRING_ENCODING_UTF8, wstatus);
455 WebBrowserChromeUI::UpdateStatusBarText(this, wstatus.get());
456
457 return NS_OK;
458 }
459
460 void WebBrowserChrome::ContentFinishedLoading()
461 {
462 // if it was a chrome window and no one has already specified a size,
463 // size to content
464 if (mWebBrowser && !mSizeSet &&
465 (mChromeFlags & nsIWebBrowserChrome::CHROME_OPENAS_CHROME)) {
466 nsCOMPtr<nsIDOMWindow> contentWin;
467 mWebBrowser->GetContentDOMWindow(getter_AddRefs(contentWin));
468 if (contentWin)
469 contentWin->SizeToContent();
470 WebBrowserChromeUI::ShowWindow(this, true);
471 }
472 }
473
474
475 //*****************************************************************************
476 // WebBrowserChrome::nsIEmbeddingSiteWindow
477 //*****************************************************************************
478
479 NS_IMETHODIMP WebBrowserChrome::SetDimensions(uint32_t aFlags, int32_t x, int32_t y, int32_t cx, int32_t cy)
480 {
481 return NS_ERROR_NOT_IMPLEMENTED;
482 }
483
484 NS_IMETHODIMP WebBrowserChrome::GetDimensions(uint32_t aFlags, int32_t *x, int32_t *y, int32_t *cx, int32_t *cy)
485 {
486 if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_POSITION)
487 {
488 *x = 0;
489 *y = 0;
490 }
491 if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER ||
492 aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_OUTER)
493 {
494 *cx = 0;
495 *cy = 0;
496 }
497 return NS_ERROR_NOT_IMPLEMENTED;
498 }
499
500 /* void setFocus (); */
501 NS_IMETHODIMP WebBrowserChrome::SetFocus()
502 {
503 WebBrowserChromeUI::SetFocus(this);
504 return NS_OK;
505 }
506
507 /* void blur (); */
508 NS_IMETHODIMP WebBrowserChrome::Blur()
509 {
510 return NS_ERROR_NOT_IMPLEMENTED;
511 }
512
513 /* attribute wstring title; */
514 NS_IMETHODIMP WebBrowserChrome::GetTitle(char16_t * *aTitle)
515 {
516 NS_ENSURE_ARG_POINTER(aTitle);
517
518 *aTitle = nullptr;
519
520 return NS_ERROR_NOT_IMPLEMENTED;
521 }
522 NS_IMETHODIMP WebBrowserChrome::SetTitle(const char16_t * aTitle)
523 {
524 return NS_ERROR_NOT_IMPLEMENTED;
525 }
526
527 /* attribute boolean visibility; */
528 NS_IMETHODIMP WebBrowserChrome::GetVisibility(bool * aVisibility)
529 {
530 NS_ENSURE_ARG_POINTER(aVisibility);
531 *aVisibility = true;
532 return NS_OK;
533 }
534 NS_IMETHODIMP WebBrowserChrome::SetVisibility(bool aVisibility)
535 {
536 return NS_OK;
537 }
538
539 /* attribute nativeSiteWindow siteWindow */
540 NS_IMETHODIMP WebBrowserChrome::GetSiteWindow(void * *aSiteWindow)
541 {
542 NS_ENSURE_ARG_POINTER(aSiteWindow);
543
544 *aSiteWindow = mNativeWindow;
545 return NS_OK;
546 }
547
548
549 //*****************************************************************************
550 // WebBrowserChrome::nsIObserver
551 //*****************************************************************************
552
553 NS_IMETHODIMP WebBrowserChrome::Observe(nsISupports *aSubject, const char *aTopic, const char16_t *someData)
554 {
555 nsresult rv = NS_OK;
556 if (strcmp(aTopic, "profile-change-teardown") == 0)
557 {
558 // A profile change means death for this window
559 WebBrowserChromeUI::Destroy(this);
560 }
561 return rv;
562 }
563
564 //*****************************************************************************
565 // WebBrowserChrome::nsIContextMenuListener
566 //*****************************************************************************
567
568 /* void OnShowContextMenu (in unsigned long aContextFlags, in nsIDOMEvent aEvent, in nsIDOMNode aNode); */
569 NS_IMETHODIMP WebBrowserChrome::OnShowContextMenu(uint32_t aContextFlags, nsIDOMEvent *aEvent, nsIDOMNode *aNode)
570 {
571 WebBrowserChromeUI::ShowContextMenu(this, aContextFlags, aEvent, aNode);
572 return NS_OK;
573 }
574
575 //*****************************************************************************
576 // WebBrowserChrome::nsITooltipListener
577 //*****************************************************************************
578
579 /* void OnShowTooltip (in long aXCoords, in long aYCoords, in wstring aTipText); */
580 NS_IMETHODIMP WebBrowserChrome::OnShowTooltip(int32_t aXCoords, int32_t aYCoords, const char16_t *aTipText)
581 {
582 WebBrowserChromeUI::ShowTooltip(this, aXCoords, aYCoords, aTipText);
583 return NS_OK;
584 }
585
586 /* void OnHideTooltip (); */
587 NS_IMETHODIMP WebBrowserChrome::OnHideTooltip()
588 {
589 WebBrowserChromeUI::HideTooltip(this);
590 return NS_OK;
591 }

mercurial