265 lines
9.3 KiB
C++
265 lines
9.3 KiB
C++
/* ***** BEGIN LICENSE BLOCK *****
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
* the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
* for the specific language governing rights and limitations under the
|
|
* License.
|
|
*
|
|
* The Original Code is Linden Lab Inc. (http://lindenlab.com) code.
|
|
*
|
|
* The Initial Developer of the Original Code is:
|
|
* Callum Prentice (callum@ubrowser.com)
|
|
*
|
|
* Portions created by the Initial Developer are Copyright (C) 2006
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Callum Prentice (callum@ubrowser.com)
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
* the provisions above, a recipient may use your version of this file under
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
*
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
#ifndef LLEMBEDDEDBROWSERWINDOW_H
|
|
#define LLEMBEDDEDBROWSERWINDOW_H
|
|
|
|
// Mozilla code has non-virtual destructors
|
|
#ifdef WIN32
|
|
#pragma warning( disable : 4265 ) // "class has virtual functions, but destructor is not virtual"
|
|
#endif
|
|
|
|
#include "nsIBaseWindow.h"
|
|
#include "nsIDOMEventListener.h"
|
|
#include "nsIDOMEventTarget.h"
|
|
#include "nsIInterfaceRequestor.h"
|
|
#include "nsIWebBrowserChrome.h"
|
|
#include "nsIWebNavigation.h"
|
|
#include "nsIWebProgressListener.h"
|
|
#include "nsIURIContentListener.h"
|
|
#include "nsWeakReference.h"
|
|
#include "nsIWebBrowser.h"
|
|
#include "nsIToolkit.h"
|
|
#include "nsIScriptGlobalObject.h"
|
|
#include "nsIScriptGlobalObjectOwner.h"
|
|
#include "nsIScriptContext.h"
|
|
|
|
#ifdef WIN32
|
|
#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual"
|
|
#endif
|
|
|
|
#include <string>
|
|
#include <list>
|
|
#include <algorithm>
|
|
|
|
#include "llmozlib2.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// manages the process of storing and emitting events that the consumer
|
|
// of the embedding class can observe
|
|
template< class T >
|
|
class LLEmbeddedBrowserWindowEmitter
|
|
{
|
|
public:
|
|
LLEmbeddedBrowserWindowEmitter() { };
|
|
~LLEmbeddedBrowserWindowEmitter() { };
|
|
|
|
typedef typename T::EventType EventType;
|
|
typedef std::list< T* > ObserverContainer;
|
|
typedef void( T::*observerMethod )( const EventType& );
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool addObserver( T* observerIn )
|
|
{
|
|
if ( ! observerIn )
|
|
return false;
|
|
|
|
if ( std::find( observers.begin(), observers.end(), observerIn ) != observers.end() )
|
|
return false;
|
|
|
|
observers.push_back( observerIn );
|
|
|
|
return true;
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
bool remObserver( T* observerIn )
|
|
{
|
|
if ( ! observerIn )
|
|
return false;
|
|
|
|
observers.remove( observerIn );
|
|
|
|
return true;
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
void update( observerMethod method, const EventType& msgIn )
|
|
{
|
|
typename std::list< T* >::iterator iter = observers.begin();
|
|
|
|
while( iter != observers.end() )
|
|
{
|
|
( ( *iter )->*method )( msgIn );
|
|
|
|
++iter;
|
|
};
|
|
};
|
|
|
|
protected:
|
|
ObserverContainer observers;
|
|
};
|
|
|
|
class LLEmbeddedBrowser;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// class for a "window" that holds a browser - there can be lots of these
|
|
class LLEmbeddedBrowserWindow :
|
|
public nsIInterfaceRequestor,
|
|
public nsIWebBrowserChrome,
|
|
public nsIWebProgressListener,
|
|
public nsIURIContentListener,
|
|
#ifdef SUPPORTS_WEAK_REFENCE
|
|
public nsSupportsWeakReference,
|
|
#endif
|
|
#ifdef NS_DECL_NSITOOLKITOBSERVER
|
|
public nsIToolkitObserver,
|
|
#endif
|
|
public nsIDOMEventListener
|
|
{
|
|
public:
|
|
LLEmbeddedBrowserWindow();
|
|
virtual ~LLEmbeddedBrowserWindow();
|
|
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSIINTERFACEREQUESTOR
|
|
NS_DECL_NSIWEBBROWSERCHROME
|
|
NS_DECL_NSIWEBPROGRESSLISTENER
|
|
NS_DECL_NSIURICONTENTLISTENER
|
|
NS_DECL_NSIDOMEVENTLISTENER
|
|
#ifdef NS_DECL_NSITOOLKITOBSERVER
|
|
NS_DECL_NSITOOLKITOBSERVER
|
|
#endif
|
|
// housekeeping
|
|
nsresult createBrowser( void* nativeWindowHandleIn, PRInt32 widthIn, PRInt32 heightIn, nsIWebBrowser** aBrowser );
|
|
void setParent( LLEmbeddedBrowser* parentIn ) { mParent = parentIn; };
|
|
PRBool setSize( PRInt16 widthIn, PRInt16 heightIn );
|
|
void focusBrowser( PRBool focusBrowserIn );
|
|
void scrollByLines( PRInt16 linesIn );
|
|
void setWindowId( int windowIdIn );
|
|
int getWindowId();
|
|
|
|
NS_METHOD NotifyInvalidated(nsIWidget*, PRInt32, PRInt32, PRInt32, PRInt32);
|
|
|
|
// random accessors
|
|
const PRInt16 getPercentComplete();
|
|
const std::string& getStatusMsg();
|
|
const std::string& getCurrentUri();
|
|
const std::string& getClickLinkHref();
|
|
const std::string& getClickLinkTarget();
|
|
|
|
// memory buffer management
|
|
unsigned char* grabWindow( int xIn, int yIn, int widthIn, int heightIn );
|
|
PRBool flipWindow( PRBool flip );
|
|
unsigned char* getPageBuffer();
|
|
PRInt16 getBrowserWidth();
|
|
PRInt16 getBrowserHeight();
|
|
PRInt16 getBrowserDepth();
|
|
PRInt32 getBrowserRowSpan();
|
|
|
|
// set background color that you see in between pages - default is white but sometimes useful to change
|
|
void setBackgroundColor( const PRUint8 redIn, const PRUint8 greenIn, const PRUint8 blueIn );
|
|
|
|
// change the caret color (we have different backgrounds to edit fields - black caret on black background == bad)
|
|
void setCaretColor( const PRUint8 redIn, const PRUint8 greenIn, const PRUint8 blueIn );
|
|
|
|
// can turn off updates to a page - e.g. when it's hidden by your windowing system
|
|
void setEnabled( PRBool enabledIn );
|
|
|
|
// navigation
|
|
void navigateStop();
|
|
PRBool navigateTo( const std::string uriIn );
|
|
PRBool canNavigateBack();
|
|
void navigateBack();
|
|
PRBool canNavigateForward();
|
|
void navigateForward();
|
|
void navigateReload();
|
|
|
|
// javascript access/control
|
|
std::string evaluateJavascript( std::string scriptIn );
|
|
|
|
// redirection when you hit a missing page
|
|
bool set404RedirectUrl( std::string redirect_url );
|
|
bool clr404RedirectUrl();
|
|
|
|
// mouse & keyboard events
|
|
void mouseDown( PRInt16 xPosIn, PRInt16 yPosIn );
|
|
void mouseUp( PRInt16 xPosIn, PRInt16 yPosIn );
|
|
void mouseMove( PRInt16 xPosIn, PRInt16 yPosIn );
|
|
void mouseLeftDoubleClick( PRInt16 xPosIn, PRInt16 yPosIn );
|
|
void keyPress( PRInt16 keyCode );
|
|
void unicodeInput( PRUint32 uni_char );
|
|
|
|
// allow consumers of this class and to observe browser events
|
|
bool addObserver( LLEmbeddedBrowserWindowObserver* observerIn );
|
|
bool remObserver( LLEmbeddedBrowserWindowObserver* observerIn );
|
|
|
|
// accessor/mutator for scheme that browser doesn't follow - e.g. secondlife.com://
|
|
void setNoFollowScheme( std::string schemeIn );
|
|
std::string getNoFollowScheme();
|
|
|
|
private:
|
|
PRBool sendMozillaMouseEvent( PRInt16 eventIn, PRInt16 xPosIn, PRInt16 yPosIn, PRUint32 clickCountIn );
|
|
PRBool sendMozillaKeyboardEvent( PRUint32 keyIn, PRUint32 ns_vk_code );
|
|
PRBool renderCaret();
|
|
PRBool enableToolkitObserver( PRBool enableIn );
|
|
|
|
LLEmbeddedBrowserWindowEmitter< LLEmbeddedBrowserWindowObserver > mEventEmitter;
|
|
|
|
LLEmbeddedBrowser* mParent;
|
|
PRInt16 mPercentComplete;
|
|
std::string mStatusText;
|
|
std::string mCurrentUri;
|
|
std::string mClickHref;
|
|
std::string mClickTarget;
|
|
std::string mNoFollowScheme;
|
|
nsCOMPtr< nsIWebBrowser > mWebBrowser;
|
|
nsCOMPtr< nsIBaseWindow > mBaseWindow;
|
|
nsCOMPtr< nsIWebNavigation > mWebNav;
|
|
int mWindowId;
|
|
unsigned char* mPageBuffer;
|
|
std::string m404RedirectUrl;
|
|
PRBool mEnabled;
|
|
PRBool mFlipBitmap;
|
|
PRInt32 mBrowserRowSpan;
|
|
PRInt16 mBrowserWidth;
|
|
PRInt16 mBrowserHeight;
|
|
PRInt16 mBrowserDepth;
|
|
PRUint8 mBkgRed;
|
|
PRUint8 mBkgGreen;
|
|
PRUint8 mBkgBlue;
|
|
PRUint8 mCaretRed;
|
|
PRUint8 mCaretGreen;
|
|
PRUint8 mCaretBlue;
|
|
};
|
|
|
|
#endif // LLEMBEDEDDBROWSERWINDOW_H
|