Annotation of chimera/NSBrowserView.mm, revision 1.1
1.1 ! hyatt 1: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
! 2: /* ***** BEGIN LICENSE BLOCK *****
! 3: * Version: NPL 1.1/GPL 2.0/LGPL 2.1
! 4: *
! 5: * The contents of this file are subject to the Netscape Public License
! 6: * Version 1.1 (the "License"); you may not use this file except in
! 7: * compliance with the License. You may obtain a copy of the License at
! 8: * http://www.mozilla.org/NPL/
! 9: *
! 10: * Software distributed under the License is distributed on an "AS IS" basis,
! 11: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
! 12: * for the specific language governing rights and limitations under the
! 13: * License.
! 14: *
! 15: * The Original Code is mozilla.org code.
! 16: *
! 17: * The Initial Developer of the Original Code is
! 18: * Netscape Communications Corporation.
! 19: * Portions created by the Initial Developer are Copyright (C) 1998
! 20: * the Initial Developer. All Rights Reserved.
! 21: *
! 22: * Contributor(s):
! 23: *
! 24: * Alternatively, the contents of this file may be used under the terms of
! 25: * either the GNU General Public License Version 2 or later (the "GPL"), or
! 26: * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
! 27: * in which case the provisions of the GPL or the LGPL are applicable instead
! 28: * of those above. If you wish to allow use of your version of this file only
! 29: * under the terms of either the GPL or the LGPL, and not to allow others to
! 30: * use your version of this file under the terms of the NPL, indicate your
! 31: * decision by deleting the provisions above and replace them with the notice
! 32: * and other provisions required by the GPL or the LGPL. If you do not delete
! 33: * the provisions above, a recipient may use your version of this file under
! 34: * the terms of any one of the NPL, the GPL or the LGPL.
! 35: *
! 36: * ***** END LICENSE BLOCK ***** */
! 37:
! 38: #import "NSBrowserView.h"
! 39: #import "nsCocoaBrowserService.h"
! 40:
! 41: // Embedding includes
! 42: #include "nsCWebBrowser.h"
! 43: #include "nsIInterfaceRequestor.h"
! 44: #include "nsIWebBrowserChrome.h"
! 45: #include "nsIEmbeddingSiteWindow.h"
! 46: #include "nsIWebProgressListener.h"
! 47: #include "nsIWebBrowser.h"
! 48: #include "nsIWebNavigation.h"
! 49: #include "nsIURI.h"
! 50: #include "nsIDOMWindow.h"
! 51: #include "nsWeakReference.h"
! 52:
! 53: // XPCOM and String includes
! 54: #include "nsCRT.h"
! 55: #include "nsXPIDLString.h"
! 56: #include "nsCOMPtr.h"
! 57:
! 58:
! 59: class nsCocoaBrowserListener : public nsSupportsWeakReference,
! 60: public nsIInterfaceRequestor,
! 61: public nsIWebBrowserChrome,
! 62: public nsIEmbeddingSiteWindow,
! 63: public nsIWebProgressListener
! 64: {
! 65: public:
! 66: nsCocoaBrowserListener(NSBrowserView* aView);
! 67: virtual ~nsCocoaBrowserListener();
! 68:
! 69: NS_DECL_ISUPPORTS
! 70: NS_DECL_NSIINTERFACEREQUESTOR
! 71: NS_DECL_NSIWEBBROWSERCHROME
! 72: NS_DECL_NSIEMBEDDINGSITEWINDOW
! 73: NS_DECL_NSIWEBPROGRESSLISTENER
! 74:
! 75: void AddListener(id <NSBrowserListener> aListener);
! 76: void RemoveListener(id <NSBrowserListener> aListener);
! 77: void SetContainer(id <NSBrowserContainer> aContainer);
! 78:
! 79: private:
! 80: NSBrowserView* mView; // WEAK - it owns us
! 81: NSMutableArray* mListeners;
! 82: id <NSBrowserContainer> mContainer;
! 83: PRBool mIsModal;
! 84: PRUint32 mChromeFlags;
! 85: };
! 86:
! 87: nsCocoaBrowserListener::nsCocoaBrowserListener(NSBrowserView* aView)
! 88: : mView(aView), mContainer(nsnull), mIsModal(PR_FALSE), mChromeFlags(0)
! 89: {
! 90: NS_INIT_ISUPPORTS();
! 91: mListeners = [[NSMutableArray alloc] init];
! 92: }
! 93:
! 94: nsCocoaBrowserListener::~nsCocoaBrowserListener()
! 95: {
! 96: [mListeners release];
! 97: mView = nsnull;
! 98: if (mContainer) {
! 99: [mContainer release];
! 100: }
! 101: }
! 102:
! 103: NS_IMPL_ISUPPORTS5(nsCocoaBrowserListener,
! 104: nsIInterfaceRequestor,
! 105: nsIWebBrowserChrome,
! 106: nsIEmbeddingSiteWindow,
! 107: nsIWebProgressListener,
! 108: nsISupportsWeakReference)
! 109:
! 110: // Implementation of nsIInterfaceRequestor
! 111: NS_IMETHODIMP
! 112: nsCocoaBrowserListener::GetInterface(const nsIID &aIID, void** aInstancePtr)
! 113: {
! 114: if (aIID.Equals(NS_GET_IID(nsIDOMWindow))) {
! 115: nsCOMPtr<nsIWebBrowser> browser = dont_AddRef([mView getWebBrowser]);
! 116: if (browser)
! 117: return browser->GetContentDOMWindow((nsIDOMWindow **) aInstancePtr);
! 118: }
! 119:
! 120: return QueryInterface(aIID, aInstancePtr);
! 121: }
! 122:
! 123: // Implementation of nsIWebBrowserChrome
! 124: /* void setStatus (in unsigned long statusType, in wstring status); */
! 125: NS_IMETHODIMP
! 126: nsCocoaBrowserListener::SetStatus(PRUint32 statusType, const PRUnichar *status)
! 127: {
! 128: if (!mContainer) {
! 129: return NS_ERROR_FAILURE;
! 130: }
! 131:
! 132: NSString* str = nsnull;
! 133: if (status && (*status != PRUnichar(0))) {
! 134: str = [NSString stringWithCharacters:status length:nsCRT::strlen(status)];
! 135: }
! 136:
! 137: [mContainer setStatus:str ofType:(NSStatusType)statusType];
! 138:
! 139: return NS_OK;
! 140: }
! 141:
! 142: /* attribute nsIWebBrowser webBrowser; */
! 143: NS_IMETHODIMP
! 144: nsCocoaBrowserListener::GetWebBrowser(nsIWebBrowser * *aWebBrowser)
! 145: {
! 146: NS_ENSURE_ARG_POINTER(aWebBrowser);
! 147: if (!mView) {
! 148: return NS_ERROR_FAILURE;
! 149: }
! 150: *aWebBrowser = [mView getWebBrowser];
! 151:
! 152: return NS_OK;
! 153: }
! 154: NS_IMETHODIMP
! 155: nsCocoaBrowserListener::SetWebBrowser(nsIWebBrowser * aWebBrowser)
! 156: {
! 157: if (!mView) {
! 158: return NS_ERROR_FAILURE;
! 159: }
! 160:
! 161: [mView setWebBrowser:aWebBrowser];
! 162:
! 163: return NS_OK;
! 164: }
! 165:
! 166: /* attribute unsigned long chromeFlags; */
! 167: NS_IMETHODIMP
! 168: nsCocoaBrowserListener::GetChromeFlags(PRUint32 *aChromeFlags)
! 169: {
! 170: NS_ENSURE_ARG_POINTER(aChromeFlags);
! 171: *aChromeFlags = mChromeFlags;
! 172: return NS_OK;
! 173: }
! 174: NS_IMETHODIMP
! 175: nsCocoaBrowserListener::SetChromeFlags(PRUint32 aChromeFlags)
! 176: {
! 177: // XXX Do nothing with them for now
! 178: mChromeFlags = aChromeFlags;
! 179: return NS_OK;
! 180: }
! 181:
! 182: /* void destroyBrowserWindow (); */
! 183: NS_IMETHODIMP
! 184: nsCocoaBrowserListener::DestroyBrowserWindow()
! 185: {
! 186: // XXX Could send this up to the container, but for now,
! 187: // we just destroy the enclosing window.
! 188: NSWindow* window = [mView window];
! 189:
! 190: if (window) {
! 191: [window close];
! 192: }
! 193:
! 194: return NS_OK;
! 195: }
! 196:
! 197: /* void sizeBrowserTo (in long aCX, in long aCY); */
! 198: NS_IMETHODIMP
! 199: nsCocoaBrowserListener::SizeBrowserTo(PRInt32 aCX, PRInt32 aCY)
! 200: {
! 201: if (mContainer) {
! 202: NSSize size;
! 203:
! 204: size.width = (float)aCX;
! 205: size.height = (float)aCY;
! 206:
! 207: [mContainer sizeBrowserTo:size];
! 208: }
! 209:
! 210: return NS_OK;
! 211: }
! 212:
! 213: /* void showAsModal (); */
! 214: NS_IMETHODIMP
! 215: nsCocoaBrowserListener::ShowAsModal()
! 216: {
! 217: if (!mView) {
! 218: return NS_ERROR_FAILURE;
! 219: }
! 220:
! 221: NSWindow* window = [mView window];
! 222:
! 223: if (!window) {
! 224: return NS_ERROR_FAILURE;
! 225: }
! 226:
! 227: mIsModal = PR_TRUE;
! 228: int result = [NSApp runModalForWindow:window];
! 229: mIsModal = PR_FALSE;
! 230:
! 231: return (nsresult)result;
! 232: }
! 233:
! 234: /* boolean isWindowModal (); */
! 235: NS_IMETHODIMP
! 236: nsCocoaBrowserListener::IsWindowModal(PRBool *_retval)
! 237: {
! 238: NS_ENSURE_ARG_POINTER(_retval);
! 239:
! 240: *_retval = mIsModal;
! 241:
! 242: return NS_OK;
! 243: }
! 244:
! 245: /* void exitModalEventLoop (in nsresult aStatus); */
! 246: NS_IMETHODIMP
! 247: nsCocoaBrowserListener::ExitModalEventLoop(nsresult aStatus)
! 248: {
! 249: [NSApp stopModalWithCode:(int)aStatus];
! 250:
! 251: return NS_OK;
! 252: }
! 253:
! 254: // Implementation of nsIEmbeddingSiteWindow
! 255: /* void setDimensions (in unsigned long flags, in long x, in long y, in long cx, in long cy); */
! 256: NS_IMETHODIMP
! 257: nsCocoaBrowserListener::SetDimensions(PRUint32 flags,
! 258: PRInt32 x,
! 259: PRInt32 y,
! 260: PRInt32 cx,
! 261: PRInt32 cy)
! 262: {
! 263: if (!mView) {
! 264: return NS_ERROR_FAILURE;
! 265: }
! 266:
! 267: NSWindow* window = [mView window];
! 268: if (!window) {
! 269: return NS_ERROR_FAILURE;
! 270: }
! 271:
! 272: if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_POSITION) {
! 273: NSPoint origin;
! 274: origin.x = (float)x;
! 275: origin.y = (float)y;
! 276: [window setFrameOrigin:origin];
! 277: }
! 278:
! 279: if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_OUTER) {
! 280: NSRect frame = [window frame];
! 281: frame.size.width = (float)cx;
! 282: frame.size.height = (float)cy;
! 283: [window setFrame:frame display:YES];
! 284: }
! 285: else if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER) {
! 286: NSSize size;
! 287: size.width = (float)cx;
! 288: size.height = (float)cy;
! 289: [window setContentSize:size];
! 290: }
! 291:
! 292: return NS_OK;
! 293: }
! 294:
! 295: /* void getDimensions (in unsigned long flags, out long x, out long y, out long cx, out long cy); */
! 296: NS_IMETHODIMP
! 297: nsCocoaBrowserListener::GetDimensions(PRUint32 flags,
! 298: PRInt32 *x,
! 299: PRInt32 *y,
! 300: PRInt32 *cx,
! 301: PRInt32 *cy)
! 302: {
! 303: NS_ENSURE_ARG_POINTER(x);
! 304: NS_ENSURE_ARG_POINTER(y);
! 305: NS_ENSURE_ARG_POINTER(cx);
! 306: NS_ENSURE_ARG_POINTER(cy);
! 307:
! 308: if (!mView) {
! 309: return NS_ERROR_FAILURE;
! 310: }
! 311:
! 312: NSWindow* window = [mView window];
! 313: if (!window) {
! 314: return NS_ERROR_FAILURE;
! 315: }
! 316:
! 317: NSRect frame = [window frame];
! 318: if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_POSITION) {
! 319: *x = (PRInt32)frame.origin.x;
! 320: *y = (PRInt32)frame.origin.y;
! 321: }
! 322: if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_OUTER) {
! 323: *cx = (PRInt32)frame.size.width;
! 324: *cy = (PRInt32)frame.size.height;
! 325: }
! 326: else if (flags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER) {
! 327: NSView* contentView = [window contentView];
! 328: NSRect contentFrame = [contentView frame];
! 329: *cx = (PRInt32)contentFrame.size.width;
! 330: *cy = (PRInt32)contentFrame.size.height;
! 331: }
! 332:
! 333: return NS_OK;
! 334: }
! 335:
! 336: /* void setFocus (); */
! 337: NS_IMETHODIMP
! 338: nsCocoaBrowserListener::SetFocus()
! 339: {
! 340: if (!mView) {
! 341: return NS_ERROR_FAILURE;
! 342: }
! 343:
! 344: NSWindow* window = [mView window];
! 345: if (!window) {
! 346: return NS_ERROR_FAILURE;
! 347: }
! 348:
! 349: [window makeKeyAndOrderFront:window];
! 350:
! 351: return NS_OK;
! 352: }
! 353:
! 354: /* attribute boolean visibility; */
! 355: NS_IMETHODIMP
! 356: nsCocoaBrowserListener::GetVisibility(PRBool *aVisibility)
! 357: {
! 358: NS_ENSURE_ARG_POINTER(aVisibility);
! 359:
! 360: if (!mView) {
! 361: return NS_ERROR_FAILURE;
! 362: }
! 363:
! 364: NSWindow* window = [mView window];
! 365: if (!window) {
! 366: return NS_ERROR_FAILURE;
! 367: }
! 368:
! 369: *aVisibility = [window isMiniaturized];
! 370:
! 371: return NS_OK;
! 372: }
! 373: NS_IMETHODIMP
! 374: nsCocoaBrowserListener::SetVisibility(PRBool aVisibility)
! 375: {
! 376: if (!mView) {
! 377: return NS_ERROR_FAILURE;
! 378: }
! 379:
! 380: NSWindow* window = [mView window];
! 381: if (!window) {
! 382: return NS_ERROR_FAILURE;
! 383: }
! 384:
! 385: if (aVisibility) {
! 386: [window deminiaturize:window];
! 387: }
! 388: else {
! 389: [window miniaturize:window];
! 390: }
! 391:
! 392: return NS_OK;
! 393: }
! 394:
! 395: /* attribute wstring title; */
! 396: NS_IMETHODIMP
! 397: nsCocoaBrowserListener::GetTitle(PRUnichar * *aTitle)
! 398: {
! 399: NS_ENSURE_ARG_POINTER(aTitle);
! 400:
! 401: if (!mContainer) {
! 402: return NS_ERROR_FAILURE;
! 403: }
! 404:
! 405: NSString* title = [mContainer title];
! 406: unsigned int length = [title length];
! 407: if (length) {
! 408: *aTitle = (PRUnichar*)nsMemory::Alloc((length+1)*sizeof(PRUnichar));
! 409: if (!*aTitle) {
! 410: return NS_ERROR_OUT_OF_MEMORY;
! 411: }
! 412: [title getCharacters:*aTitle];
! 413: }
! 414: else {
! 415: *aTitle = nsnull;
! 416: }
! 417:
! 418: return NS_OK;
! 419: }
! 420: NS_IMETHODIMP
! 421: nsCocoaBrowserListener::SetTitle(const PRUnichar * aTitle)
! 422: {
! 423: NS_ENSURE_ARG(aTitle);
! 424:
! 425: if (!mContainer) {
! 426: return NS_ERROR_FAILURE;
! 427: }
! 428:
! 429: NSString* str = [NSString stringWithCharacters:aTitle length:nsCRT::strlen(aTitle)];
! 430: [mContainer setTitle:str];
! 431:
! 432: return NS_OK;
! 433: }
! 434:
! 435: /* [noscript] readonly attribute voidPtr siteWindow; */
! 436: NS_IMETHODIMP
! 437: nsCocoaBrowserListener::GetSiteWindow(void * *aSiteWindow)
! 438: {
! 439: NS_ENSURE_ARG_POINTER(aSiteWindow);
! 440:
! 441: if (!mView) {
! 442: return NS_ERROR_FAILURE;
! 443: }
! 444:
! 445: NSWindow* window = [mView window];
! 446: if (!window) {
! 447: return NS_ERROR_FAILURE;
! 448: }
! 449:
! 450: *aSiteWindow = (void*)window;
! 451:
! 452: return NS_OK;
! 453: }
! 454:
! 455: // Implementation of nsIWebProgressListener
! 456: /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in unsigned long aStatus); */
! 457: NS_IMETHODIMP
! 458: nsCocoaBrowserListener::OnStateChange(nsIWebProgress *aWebProgress,
! 459: nsIRequest *aRequest,
! 460: PRInt32 aStateFlags,
! 461: PRUint32 aStatus)
! 462: {
! 463: NSEnumerator* enumerator = [mListeners objectEnumerator];
! 464: id obj;
! 465:
! 466: if (aStateFlags & nsIWebProgressListener::STATE_IS_NETWORK) {
! 467: if (aStateFlags & nsIWebProgressListener::STATE_START) {
! 468: while ((obj = [enumerator nextObject])) {
! 469: [obj onLoadingStarted];
! 470: }
! 471: }
! 472: else if (aStateFlags & nsIWebProgressListener::STATE_STOP) {
! 473: while ((obj = [enumerator nextObject])) {
! 474: [obj onLoadingCompleted:(NS_SUCCEEDED(aStatus))];
! 475: }
! 476: }
! 477: }
! 478:
! 479:
! 480: return NS_OK;
! 481: }
! 482:
! 483: /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
! 484: NS_IMETHODIMP
! 485: nsCocoaBrowserListener::OnProgressChange(nsIWebProgress *aWebProgress,
! 486: nsIRequest *aRequest,
! 487: PRInt32 aCurSelfProgress,
! 488: PRInt32 aMaxSelfProgress,
! 489: PRInt32 aCurTotalProgress,
! 490: PRInt32 aMaxTotalProgress)
! 491: {
! 492: NSEnumerator* enumerator = [mListeners objectEnumerator];
! 493: id obj;
! 494:
! 495: while ((obj = [enumerator nextObject])) {
! 496: [obj onProgressChange:aCurTotalProgress outOf:aMaxTotalProgress];
! 497: }
! 498:
! 499: return NS_OK;
! 500: }
! 501:
! 502: /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
! 503: NS_IMETHODIMP
! 504: nsCocoaBrowserListener::OnLocationChange(nsIWebProgress *aWebProgress,
! 505: nsIRequest *aRequest,
! 506: nsIURI *location)
! 507: {
! 508: nsXPIDLCString spec;
! 509:
! 510: location->GetSpec(getter_Copies(spec));
! 511: if (!spec) {
! 512: return NS_ERROR_FAILURE;
! 513: }
! 514:
! 515: const char* cstr = spec.get();
! 516: NSString* str = [NSString stringWithCString:cstr];
! 517: NSURL* url = [NSURL URLWithString:str];
! 518:
! 519: NSEnumerator* enumerator = [mListeners objectEnumerator];
! 520: id obj;
! 521:
! 522: while ((obj = [enumerator nextObject])) {
! 523: [obj onLocationChange:url];
! 524: }
! 525:
! 526: return NS_OK;
! 527: }
! 528:
! 529: /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
! 530: NS_IMETHODIMP
! 531: nsCocoaBrowserListener::OnStatusChange(nsIWebProgress *aWebProgress,
! 532: nsIRequest *aRequest,
! 533: nsresult aStatus,
! 534: const PRUnichar *aMessage)
! 535: {
! 536: return NS_OK;
! 537: }
! 538:
! 539: /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long state); */
! 540: NS_IMETHODIMP
! 541: nsCocoaBrowserListener::OnSecurityChange(nsIWebProgress *aWebProgress,
! 542: nsIRequest *aRequest,
! 543: PRInt32 state)
! 544: {
! 545: return NS_OK;
! 546: }
! 547:
! 548: void
! 549: nsCocoaBrowserListener::AddListener(id <NSBrowserListener> aListener)
! 550: {
! 551: [mListeners addObject:aListener];
! 552: }
! 553:
! 554: void
! 555: nsCocoaBrowserListener::RemoveListener(id <NSBrowserListener> aListener)
! 556: {
! 557: [mListeners removeObject:aListener];
! 558: }
! 559:
! 560: void
! 561: nsCocoaBrowserListener::SetContainer(id <NSBrowserContainer> aContainer)
! 562: {
! 563: [mContainer autorelease];
! 564:
! 565: mContainer = aContainer;
! 566:
! 567: [mContainer retain];
! 568: }
! 569:
! 570:
! 571: @implementation NSBrowserView
! 572:
! 573: - (id)initWithFrame:(NSRect)frame
! 574: {
! 575: [super initWithFrame:frame];
! 576:
! 577: nsresult rv = nsCocoaBrowserService::InitEmbedding();
! 578: if (NS_FAILED(rv)) {
! 579: // XXX need to throw
! 580: }
! 581:
! 582: _listener = new nsCocoaBrowserListener(self);
! 583: NS_ADDREF(_listener);
! 584:
! 585: // Create the web browser instance
! 586: nsCOMPtr<nsIWebBrowser> browser = do_CreateInstance(NS_WEBBROWSER_CONTRACTID, &rv);
! 587: if (NS_FAILED(rv)) {
! 588: // XXX need to throw
! 589: }
! 590:
! 591: _webBrowser = browser;
! 592: NS_ADDREF(_webBrowser);
! 593:
! 594: // Set the container nsIWebBrowserChrome
! 595: _webBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome *,
! 596: _listener));
! 597:
! 598: // Register as a listener for web progress
! 599: nsCOMPtr<nsIWeakReference> weak = do_GetWeakReference(NS_STATIC_CAST(nsIWebProgressListener*, _listener));
! 600: _webBrowser->AddWebBrowserListener(weak, NS_GET_IID(nsIWebProgressListener));
! 601:
! 602: // Hook up the widget hierarchy with us as the parent
! 603: nsCOMPtr<nsIBaseWindow> baseWin = do_QueryInterface(_webBrowser);
! 604: baseWin->InitWindow((NSView*)self, nsnull, 0, 0,
! 605: frame.size.width, frame.size.height);
! 606: baseWin->Create();
! 607:
! 608: return self;
! 609: }
! 610:
! 611: - (void)dealloc
! 612: {
! 613: NS_RELEASE(_listener);
! 614: NS_IF_RELEASE(_webBrowser);
! 615: nsCocoaBrowserService::TermEmbedding();
! 616:
! 617: [super dealloc];
! 618: }
! 619:
! 620: - (void)setFrame:(NSRect)frameRect
! 621: {
! 622: [super setFrame:frameRect];
! 623: if (_webBrowser) {
! 624: nsCOMPtr<nsIBaseWindow> window = do_QueryInterface(_webBrowser);
! 625: window->SetSize((PRInt32)frameRect.size.width,
! 626: (PRInt32)frameRect.size.height,
! 627: PR_TRUE);
! 628: }
! 629: }
! 630:
! 631: - (void)addListener:(id <NSBrowserListener>)listener
! 632: {
! 633: _listener->AddListener(listener);
! 634: }
! 635:
! 636: - (void)removeListener:(id <NSBrowserListener>)listener
! 637: {
! 638: _listener->RemoveListener(listener);
! 639: }
! 640:
! 641: - (void)setContainer:(id <NSBrowserContainer>)container
! 642: {
! 643: _listener->SetContainer(container);
! 644: }
! 645:
! 646: - (nsIDOMWindow*)getContentWindow
! 647: {
! 648: nsIDOMWindow* window;
! 649:
! 650: _webBrowser->GetContentDOMWindow(&window);
! 651:
! 652: return window;
! 653: }
! 654:
! 655: - (void)loadURI:(NSURL *)url flags:(unsigned int)flags
! 656: {
! 657: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 658:
! 659: NSString* spec = [url absoluteString];
! 660: int length = [spec length];
! 661: PRUnichar* specStr = nsMemory::Alloc((length+1) * sizeof(PRUnichar));
! 662: [spec getCharacters:specStr];
! 663: specStr[length] = PRUnichar(0);
! 664:
! 665:
! 666: PRUint32 navFlags = nsIWebNavigation::LOAD_FLAGS_NONE;
! 667: if (flags & NSLoadFlagsDontPutInHistory) {
! 668: navFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_HISTORY;
! 669: }
! 670: if (flags & NSLoadFlagsReplaceHistoryEntry) {
! 671: navFlags |= nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY;
! 672: }
! 673: if (flags & NSLoadFlagsBypassCacheAndProxy) {
! 674: navFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
! 675: nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY;
! 676: }
! 677:
! 678: nsresult rv = nav->LoadURI(specStr, navFlags, nsnull, nsnull, nsnull);
! 679: if (NS_FAILED(rv)) {
! 680: // XXX need to throw
! 681: }
! 682:
! 683: nsMemory::Free(specStr);
! 684: }
! 685:
! 686: - (void)reload:(unsigned int)flags
! 687: {
! 688: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 689:
! 690: PRUint32 navFlags = nsIWebNavigation::LOAD_FLAGS_NONE;
! 691: if (flags & NSLoadFlagsBypassCacheAndProxy) {
! 692: navFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
! 693: nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY;
! 694: }
! 695:
! 696: nsresult rv = nav->Reload(navFlags);
! 697: if (NS_FAILED(rv)) {
! 698: // XXX need to throw
! 699: }
! 700: }
! 701:
! 702: - (BOOL)canGoBack
! 703: {
! 704: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 705:
! 706: PRBool can;
! 707: nav->GetCanGoBack(&can);
! 708:
! 709: return can ? YES : NO;
! 710: }
! 711:
! 712: - (BOOL)canGoForward
! 713: {
! 714: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 715:
! 716: PRBool can;
! 717: nav->GetCanGoForward(&can);
! 718:
! 719: return can ? YES : NO;
! 720: }
! 721:
! 722: - (void)goBack
! 723: {
! 724: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 725:
! 726: nsresult rv = nav->GoBack();
! 727: if (NS_FAILED(rv)) {
! 728: // XXX need to throw
! 729: }
! 730: }
! 731:
! 732: - (void)goForward
! 733: {
! 734: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 735:
! 736: nsresult rv = nav->GoForward();
! 737: if (NS_FAILED(rv)) {
! 738: // XXX need to throw
! 739: }
! 740: }
! 741:
! 742: - (void)gotoIndex:(int)index
! 743: {
! 744: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 745:
! 746: nsresult rv = nav->GotoIndex(index);
! 747: if (NS_FAILED(rv)) {
! 748: // XXX need to throw
! 749: }
! 750: }
! 751:
! 752: - (void)stop:(unsigned int)flags
! 753: {
! 754: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 755:
! 756: nsresult rv = nav->Stop(flags);
! 757: if (NS_FAILED(rv)) {
! 758: // XXX need to throw
! 759: }
! 760: }
! 761:
! 762: - (NSURL*)getCurrentURI
! 763: {
! 764: nsCOMPtr<nsIURI> uri;
! 765: nsCOMPtr<nsIWebNavigation> nav = do_QueryInterface(_webBrowser);
! 766:
! 767: nav->GetCurrentURI(getter_AddRefs(uri));
! 768: if (!uri) {
! 769: return nsnull;
! 770: }
! 771:
! 772: nsXPIDLCString spec;
! 773: uri->GetSpec(getter_Copies(spec));
! 774:
! 775: const char* cstr = spec.get();
! 776: NSString* str = [NSString stringWithCString:cstr];
! 777: NSURL* url = [NSURL URLWithString:str];
! 778:
! 779: return url;
! 780: }
! 781:
! 782: - (nsIWebBrowser*)getWebBrowser
! 783: {
! 784: NS_IF_ADDREF(_webBrowser);
! 785: return _webBrowser;
! 786: }
! 787:
! 788: - (void)setWebBrowser:(nsIWebBrowser*)browser
! 789: {
! 790: _webBrowser = browser;
! 791:
! 792: if (_webBrowser) {
! 793: // Set the container nsIWebBrowserChrome
! 794: _webBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome *,
! 795: _listener));
! 796:
! 797: NSRect frame = [self frame];
! 798:
! 799: // Hook up the widget hierarchy with us as the parent
! 800: nsCOMPtr<nsIBaseWindow> baseWin = do_QueryInterface(_webBrowser);
! 801: baseWin->InitWindow((NSView*)self, nsnull, 0, 0,
! 802: frame.size.width, frame.size.height);
! 803: baseWin->Create();
! 804: }
! 805:
! 806: }
! 807:
! 808: @end
! 809:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>