Mozilla/mozilla/webshell/tests/viewer/nsViewerApp.cpp
dougt%netscape.com c01e94cad7 nsIComponentManager API Changes (bug 98553)
a) create a new nsIComponentManager with only four functions on it:
CreateInstance CreateInstanceByContractID GetClassInfo GetClassInfoByContractID.

b) rename the old nsIComponentManager to nsIComponentManagerObsolete.

c) fixes callers which use to access the nsIComponentManager for component
registration functionality.  These callers will temporary use the
nsIComponentManagerObsolete interface.

d) Create a new API NS_GetComponentManager() which mirrors the
NS_GetServiceManager()

e) Perserves the old NS_GetGlobalComponentManager().  Note the cast usage.

r/sr = rpotts@netscape.com  alecf@netscape.com  brendan@mozilla.org


git-svn-id: svn://10.0.0.236/trunk@110748 18797224-902f-48f8-a5cc-f745e15eee43
2001-12-19 00:12:41 +00:00

1649 lines
47 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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 Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@netscape.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 NPL, 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 NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifdef NGPREFS
#define INITGUID
#endif
#include "nsCOMPtr.h"
#include "nsReadableUtils.h"
#include "nsXPBaseWindow.h"
#include "nsViewerApp.h"
#include "nsBrowserWindow.h"
#include "nsWidgetsCID.h"
#include "nsWindowCreator.h"
#include "nsIAppShell.h"
#include "nsIPref.h"
#include "nsIWindowWatcher.h"
// Form Processor
#include "nsIFormProcessor.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIEventQueueService.h"
#include "nsIInterfaceRequestor.h"
#include "nsIInterfaceRequestorUtils.h"
#include "nsWebCrawler.h"
#include "nsSpecialSystemDirectory.h" // For exe dir
#include "prprf.h"
#include "plstr.h"
#include "prenv.h"
#include "nsIScriptGlobalObject.h"
#include "nsIScriptContext.h"
#include "nsGUIEvent.h"
// Needed for Dialog GUI
#include "nsICheckButton.h"
#include "nsILabel.h"
#include "nsIButton.h"
#include "nsITextWidget.h"
#include "nsILookAndFeel.h"
#include "nsColor.h"
#include "nsWidgetSupport.h"
#include "nsVector.h"
// XXX For font setting below
#include "nsFont.h"
#include "nsUnitConversion.h"
#include "nsIDeviceContext.h"
#include "nsIDOMHTMLSelectElement.h"
// new widget stuff
#ifdef USE_LOCAL_WIDGETS
extern nsresult NS_NewButton(nsIButton** aControl);
extern nsresult NS_NewLabel(nsILabel** aControl);
extern nsresult NS_NewTextWidget(nsITextWidget** aControl);
extern nsresult NS_NewCheckButton(nsICheckButton** aControl);
#endif
// cookie
#include "nsICookieService.h"
#define DIALOG_FONT "Helvetica"
#define DIALOG_FONT_SIZE 10
#if defined(XP_PC) && !defined(XP_OS2)
#include "JSConsole.h"
#ifdef NGPREFS
#include "ngprefs.h"
#endif
#endif
#ifdef XP_WIN
#include <crtdbg.h>
#endif
extern nsresult NS_NewXPBaseWindowFactory(nsIFactory** aFactory);
extern "C" void NS_SetupRegistry();
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
static NS_DEFINE_IID(kAppShellCID, NS_APPSHELL_CID);
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
static NS_DEFINE_IID(kXPBaseWindowCID, NS_XPBASE_WINDOW_CID);
static NS_DEFINE_IID(kCookieServiceCID, NS_COOKIESERVICE_CID);
static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID);
static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID);
static NS_DEFINE_IID(kIPrefIID, NS_IPREF_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIXPBaseWindowIID, NS_IXPBASE_WINDOW_IID);
static NS_DEFINE_CID(kFormProcessorCID, NS_FORMPROCESSOR_CID);
static NS_DEFINE_IID(kIDOMHTMLSelectElementIID, NS_IDOMHTMLSELECTELEMENT_IID);
#define DEFAULT_WIDTH 620
#define DEFAULT_HEIGHT 400
nsViewerApp::nsViewerApp()
{
NS_INIT_REFCNT();
char * text = PR_GetEnv("NGLAYOUT_HOME");
mStartURL.AssignWithConversion(text ? text : "resource:/res/samples/test0.html");
//rickg 20Nov98: For the sake of a good demo, pre-load a decent URL...
// mStartURL = text ? text : "http://developer.netscape.com/software/communicator/ngl/index.html";
mDelay = 1;
mRepeatCount = 1;
mNumSamples = 14;
mAllowPlugins = PR_TRUE;
mIsInitialized = PR_FALSE;
mWidth = DEFAULT_WIDTH;
mHeight = DEFAULT_HEIGHT;
mJustShutdown = PR_FALSE;
}
nsViewerApp::~nsViewerApp()
{
Destroy();
}
NS_IMPL_THREADSAFE_ADDREF(nsViewerApp)
NS_IMPL_THREADSAFE_RELEASE(nsViewerApp)
nsresult
nsViewerApp::QueryInterface(REFNSIID aIID, void** aInstancePtrResult)
{
NS_PRECONDITION(nsnull != aInstancePtrResult, "null pointer");
if (nsnull == aInstancePtrResult) {
return NS_ERROR_NULL_POINTER;
}
if (aIID.Equals(kISupportsIID)) {
nsISupports* tmp = this;
*aInstancePtrResult = (void*) tmp;
NS_ADDREF_THIS();
return NS_OK;
}
#if defined(NS_DEBUG)
/*
* Check for the debug-only interface indicating thread-safety
*/
static NS_DEFINE_IID(kIsThreadsafeIID, NS_ISTHREADSAFE_IID);
if (aIID.Equals(kIsThreadsafeIID)) {
return NS_OK;
}
#endif /* NS_DEBUG */
return NS_NOINTERFACE;
}
void
nsViewerApp::Destroy()
{
// Close all of our windows
nsBrowserWindow::CloseAllWindows();
// Release the crawler
if (nsnull != mCrawler) {
// break cycle between crawler and window.
mCrawler->SetBrowserWindow(nsnull);
NS_RELEASE(mCrawler);
}
if (nsnull != mPrefs) {
NS_RELEASE(mPrefs);
}
}
class nsTestFormProcessor : public nsIFormProcessor {
public:
nsTestFormProcessor();
NS_IMETHOD ProcessValue(nsIDOMHTMLElement *aElement,
const nsString& aName,
nsString& aValue);
NS_IMETHOD ProvideContent(const nsString& aFormType,
nsVoidArray& aContent,
nsString& aAttribute);
NS_DECL_ISUPPORTS
};
NS_IMPL_ISUPPORTS1(nsTestFormProcessor, nsIFormProcessor);
nsTestFormProcessor::nsTestFormProcessor()
{
NS_INIT_REFCNT();
}
NS_METHOD
nsTestFormProcessor::ProcessValue(nsIDOMHTMLElement *aElement,
const nsString& aName,
nsString& aValue)
{
#ifdef DEBUG_kmcclusk
char *name = ToNewCString(aName);
char *value = ToNewCString(aValue);
printf("ProcessValue: name %s value %s\n", name, value);
delete [] name;
delete [] value;
#endif
return NS_OK;
}
NS_METHOD nsTestFormProcessor::ProvideContent(const nsString& aFormType,
nsVoidArray& aContent,
nsString& aAttribute)
{
return NS_OK;
}
nsresult
nsViewerApp::AutoregisterComponents()
{
nsresult rv = nsComponentManager::AutoRegister(nsIComponentManagerObsolete::NS_Startup,
NULL /* default */);
return rv;
}
nsresult
nsViewerApp::SetupRegistry()
{
nsresult rv;
AutoregisterComponents();
NS_SetupRegistry();
// Register our browser window factory
nsIFactory* bwf;
NS_NewXPBaseWindowFactory(&bwf);
nsComponentManager::RegisterFactory(kXPBaseWindowCID, 0, 0, bwf, PR_FALSE);
NS_RELEASE(bwf);
// register the cookie manager
nsCOMPtr<nsICookieService> cookieService =
do_GetService(kCookieServiceCID, &rv);
if (NS_FAILED(rv) || (nsnull == cookieService)) {
#ifdef DEBUG
printf("Unable to instantiate Cookie Manager\n");
#endif
}
// Register a form processor. The form processor has the opportunity to
// modify the value's passed during form submission.
nsTestFormProcessor* testFormProcessor = new nsTestFormProcessor();
nsCOMPtr<nsISupports> formProcessor;
rv = testFormProcessor->QueryInterface(kISupportsIID, getter_AddRefs(formProcessor));
if (NS_SUCCEEDED(rv) && formProcessor) {
rv = nsServiceManager::RegisterService(kFormProcessorCID, formProcessor);
}
return NS_OK;
}
nsresult
nsViewerApp::Initialize(int argc, char** argv)
{
nsresult rv;
rv = SetupRegistry();
if (NS_OK != rv) {
return rv;
}
// Create the Event Queue for the UI thread...
rv = nsServiceManager::GetService(kEventQueueServiceCID,
kIEventQueueServiceIID,
(nsISupports **)&mEventQService);
if (NS_OK != rv) {
NS_ASSERTION(PR_FALSE, "Could not obtain the event queue service");
return rv;
}
printf("Going to create the event queue\n");
rv = mEventQService->CreateThreadEventQueue();
if (NS_OK != rv) {
NS_ASSERTION(PR_FALSE, "Could not create the event queue for the the thread");
return rv;
}
InitializeWindowCreator();
// Create widget application shell
rv = nsComponentManager::CreateInstance(kAppShellCID, nsnull, kIAppShellIID,
(void**)&mAppShell);
if (NS_OK != rv) {
return rv;
}
mAppShell->Create(&argc, argv);
mAppShell->SetDispatchListener((nsDispatchListener*) this);
// Load preferences
rv = nsComponentManager::CreateInstance(kPrefCID, NULL, kIPrefIID,
(void **) &mPrefs);
if (NS_OK != rv) {
return rv;
}
mPrefs->ReadUserPrefs(nsnull);
// Finally process our arguments
rv = ProcessArguments(argc, argv);
mIsInitialized = PR_TRUE;
return rv;
}
/* InitializeWindowCreator creates and hands off an object with a callback
to a window creation function. This is how all new windows are opened,
except any created directly by the viewer app. */
nsresult
nsViewerApp::InitializeWindowCreator()
{
// create an nsWindowCreator and give it to the WindowWatcher service
nsWindowCreator *creatorCallback = new nsWindowCreator(this);
if (creatorCallback) {
nsCOMPtr<nsIWindowCreator> windowCreator(dont_QueryInterface(NS_STATIC_CAST(nsIWindowCreator *, creatorCallback)));
if (windowCreator) {
nsCOMPtr<nsIWindowWatcher> wwatch(do_GetService("@mozilla.org/embedcomp/window-watcher;1"));
if (wwatch) {
wwatch->SetWindowCreator(windowCreator);
return NS_OK;
}
}
}
return NS_ERROR_FAILURE;
}
nsresult
nsViewerApp::Exit()
{
nsresult rv = NS_OK;
if (mAppShell) {
Destroy();
mAppShell->Exit();
NS_RELEASE(mAppShell);
}
// Unregister the test form processor registered in nsViewerApp::SetupRegistry
rv = nsServiceManager::UnregisterService(kFormProcessorCID);
return rv;
}
static void
PrintHelpInfo(char **argv)
{
fprintf(stderr, "Usage: %s [options] [starting url]\n", argv[0]);
fprintf(stderr, "-M -- measure (and show) page load time\n");
fprintf(stderr, "-p[#] -- autload tests 0-#\n");
fprintf(stderr, "-q -- jiggles window width after page has autoloaded\n");
fprintf(stderr, "-f filename -- read a list of URLs to autoload from <filename>\n");
fprintf(stderr, "-d # -- set the delay between autoloads to # (in milliseconds)\n");
fprintf(stderr, "-np -- no plugins\n");
fprintf(stderr, "-v -- verbose (debug noise)\n");
fprintf(stderr, "-r # -- how many times a page is loaded when autoloading\n");
fprintf(stderr, "-o dirname -- create an output file for the frame dump of each page\n and put it in <dirname>. <dirname> must include the trailing\n <slash> character appropriate for your OS\n");
fprintf(stderr, "-rd dirname -- specify a regression directory whose contents are from\n a previous -o run to compare against with this run\n");
fprintf(stderr, "-regnostyle -- exclude style data from the regression test output: valid only with -o and -rd\n");
fprintf(stderr, "-h # -- the initial height of the viewer window\n");
fprintf(stderr, "-w # -- the initial width of the viewer window\n");
fprintf(stderr, "-C -- enable crawler\n");
fprintf(stderr, "-R filename -- record pages crawled to in <filename>\n");
fprintf(stderr, "-S domain -- add a domain/host that is safe to crawl (e.g. www.netscape.com)\n");
fprintf(stderr, "-A domain -- add a domain/host that should be avoided (e.g. microsoft.com)\n");
fprintf(stderr, "-N pages -- set the max # of pages to crawl\n");
fprintf(stderr, "-x -- startup and just shutdown to test for leaks under Purify\n");
fprintf(stderr, "-Prt -- number of the printer test 1=regression, no printout \n");
fprintf(stderr, "-B -- Setting for regression output 1=brief, 2=verbose \n");
#if defined(NS_DEBUG) && defined(XP_WIN)
fprintf(stderr, "-md # -- set the crt debug flags to #\n");
#endif
}
static void
AddTestDocsFromFile(nsWebCrawler* aCrawler, const nsString& aFileName)
{
NS_LossyConvertUCS2toASCII cfn(aFileName);
#ifdef XP_PC
FILE* fp = fopen(cfn.get(), "rb");
#else
FILE* fp = fopen(cfn.get(), "r");
#endif
if (nsnull==fp)
{
fprintf(stderr, "Input file not found: %s\n", cfn.get());
exit (-1);
}
nsAutoString line;
for (;;) {
char linebuf[2000];
char* cp = fgets(linebuf, sizeof(linebuf), fp);
if (nsnull == cp) {
break;
}
if (linebuf[0] == '#') {
continue;
}
// strip crlf's from the line
int len = strlen(linebuf);
if (0 != len) {
if (('\n' == linebuf[len-1]) || ('\r' == linebuf[len-1])) {
linebuf[--len] = 0;
}
}
if (0 != len) {
if (('\n' == linebuf[len-1]) || ('\r' == linebuf[len-1])) {
linebuf[--len] = 0;
}
}
// Add non-empty lines to the test list
if (0 != len) {
line.AssignWithConversion(linebuf);
aCrawler->AddURL(line);
}
}
fclose(fp);
}
NS_IMETHODIMP
nsViewerApp::ProcessArguments(int argc, char** argv)
{
mCrawler = new nsWebCrawler(this);
NS_ADDREF(mCrawler);
int i;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
if (PL_strcmp(argv[i], "-x") == 0) {
mJustShutdown = PR_TRUE;
}
#if defined(NS_DEBUG) && defined(XP_WIN)
else if (PL_strcmp(argv[i], "-md") == 0) {
int old = _CrtSetDbgFlag(0);
old |= _CRTDBG_CHECK_ALWAYS_DF;
_CrtSetDbgFlag(old);
}
#endif
#if defined(XP_MACOSX)
else if (PL_strncmp(argv[i], "-psn_", 5) == 0) {
continue;
}
#endif
else if (PL_strncmp(argv[i], "-p", 2) == 0) {
char *optionalSampleStopIndex = &(argv[i][2]);
if ('\0' != *optionalSampleStopIndex)
{
if (1!=sscanf(optionalSampleStopIndex, "%d", &mNumSamples))
{
PrintHelpInfo(argv);
exit(-1);
}
}
mDoPurify = PR_TRUE;
mCrawler->SetExitOnDone(PR_TRUE);
mCrawl = PR_TRUE;
}
else if (PL_strcmp(argv[i], "-q") == 0) {
mCrawler->EnableJiggleLayout();
mCrawler->SetExitOnDone(PR_TRUE);
mCrawl = PR_TRUE;
}
else if (PL_strcmp(argv[i], "-f") == 0) {
mLoadTestFromFile = PR_TRUE;
i++;
if (i>=argc || nsnull==argv[i] || nsnull==*(argv[i]))
{
PrintHelpInfo(argv);
exit(-1);
}
mInputFileName.AssignWithConversion(argv[i]);
mCrawler->SetExitOnDone(PR_TRUE);
mCrawl = PR_TRUE;
}
else if (PL_strcmp(argv[i], "-rd") == 0) {
i++;
if (i>=argc || nsnull==argv[i] || nsnull==*(argv[i])) {
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->SetEnableRegression(PR_TRUE);
mCrawler->SetRegressionDir(NS_ConvertASCIItoUCS2(argv[i]));
}
else if (PL_strcmp(argv[i], "-o") == 0) {
i++;
if (i>=argc || nsnull==argv[i] || nsnull==*(argv[i]))
{
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->SetOutputDir(NS_ConvertASCIItoUCS2(argv[i]));
}
else if (PL_strcmp(argv[i], "-w") == 0) {
int width;
i++;
if (i>=argc || 1!=sscanf(argv[i], "%d", &width))
{
PrintHelpInfo(argv);
exit(-1);
}
mWidth = width > 0 ? width : DEFAULT_WIDTH;
}
else if (PL_strcmp(argv[i], "-h") == 0) {
int height;
i++;
if (i>=argc || 1!=sscanf(argv[i], "%d", &height))
{
PrintHelpInfo(argv);
exit(-1);
}
mHeight = height > 0 ? height : DEFAULT_HEIGHT;
}
else if (PL_strcmp(argv[i], "-r") == 0) {
i++;
if (i>=argc || 1!=sscanf(argv[i], "%d", &mRepeatCount))
{
PrintHelpInfo(argv);
exit(-1);
}
}
else if (PL_strcmp(argv[i], "-C") == 0) {
mCrawler->EnableCrawler();
mCrawler->SetExitOnDone(PR_TRUE);
mCrawl = PR_TRUE;
}
else if (PL_strcmp(argv[i], "-R") == 0) {
i++;
if (i>=argc) {
PrintHelpInfo(argv);
exit(-1);
}
FILE* fp = fopen(argv[i], "w");
if (nsnull == fp) {
fprintf(stderr, "can't create '%s'\n", argv[i]);
exit(-1);
}
mCrawler->SetRecordFile(fp);
}
else if (PL_strcmp(argv[i], "-S") == 0) {
i++;
if (i>=argc) {
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->AddSafeDomain(NS_ConvertASCIItoUCS2(argv[i]));
}
else if (PL_strcmp(argv[i], "-A") == 0) {
i++;
if (i>=argc) {
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->AddAvoidDomain(NS_ConvertASCIItoUCS2(argv[i]));
}
else if (PL_strcmp(argv[i], "-N") == 0) {
int pages;
i++;
if (i>=argc || 1!=sscanf(argv[i], "%d", &pages)) {
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->SetMaxPages(pages);
}
else if (PL_strcmp(argv[i], "-np") == 0) {
mAllowPlugins = PR_FALSE;
}
else if (PL_strcmp(argv[i], "-v") == 0) {
mCrawler->SetVerbose(PR_TRUE);
}
else if (PL_strcmp(argv[i], "-M") == 0) {
mShowLoadTimes = PR_TRUE;
}
else if (PL_strcmp(argv[i], "-?") == 0) {
PrintHelpInfo(argv);
}
else if (PL_strcmp(argv[i], "-B") == 0) {
int regressionOutput;
i++;
if (i>=argc || 1!=sscanf(argv[i], "%d", &regressionOutput)){
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->RegressionOutput(regressionOutput);
}
else if (PL_strcmp(argv[i], "-Prt") == 0) {
int printTestType;
i++;
if (i>=argc || 1!=sscanf(argv[i], "%d", &printTestType)){
PrintHelpInfo(argv);
exit(-1);
}
mCrawler->SetPrintTest(printTestType);
}
else if(PL_strcmp(argv[i], "-regnostyle") == 0) {
mCrawler->IncludeStyleData(PR_FALSE);
}
}
else
break;
}
if (i < argc) {
mStartURL.AssignWithConversion(argv[i]);
#if defined(XP_UNIX) || defined(XP_BEOS)
if (argv[i][0] == '/') {
mStartURL.Assign(NS_LITERAL_STRING("file:") + mStartURL);
}
#endif
}
return NS_OK;
}
NS_IMETHODIMP
nsViewerApp::OpenWindow()
{
// Create browser window
// XXX Some piece of code needs to properly hold the reference to this
// browser window. For the time being the reference is released by the
// browser event handling code during processing of the NS_DESTROY event...
nsBrowserWindow* bw = new nsNativeBrowserWindow();
NS_ENSURE_TRUE(bw, NS_ERROR_FAILURE);
NS_ADDREF(bw);
bw->SetApp(this);
bw->SetShowLoadTimes(mShowLoadTimes);
bw->Init(mAppShell, nsRect(0, 0, mWidth, mHeight),
(PRUint32(~0) & ~nsIWebBrowserChrome::CHROME_OPENAS_CHROME), mAllowPlugins);
bw->SetVisibility(PR_TRUE);
nsBrowserWindow* bwCurrent;
mCrawler->GetBrowserWindow(&bwCurrent);
if (!bwCurrent) {
mCrawler->SetBrowserWindow(bw);
bw->SetWebCrawler(mCrawler);
}
NS_IF_RELEASE(bwCurrent);
if (mDoPurify) {
for (PRInt32 i = 0; i < mRepeatCount; i++) {
for (int docnum = 0; docnum < mNumSamples; docnum++) {
char url[500];
PR_snprintf(url, 500, "%s/test%d.html", SAMPLES_BASE_URL, docnum);
mCrawler->AddURL(NS_ConvertASCIItoUCS2(url));
}
}
mCrawler->Start();
}
else if (mLoadTestFromFile) {
for (PRInt32 i = 0; i < mRepeatCount; i++) {
AddTestDocsFromFile(mCrawler, mInputFileName);
}
mCrawler->Start();
}
else if (mCrawl) {
mCrawler->AddURL(mStartURL);
mCrawler->Start();
}
else {
bw->GoTo(mStartURL.get());
}
NS_RELEASE(bw);
return NS_OK;
}
NS_IMETHODIMP
nsViewerApp::CloseWindow(nsBrowserWindow* aBrowserWindow)
{
aBrowserWindow->Destroy();
nsBrowserWindow* bw;
mCrawler->GetBrowserWindow(&bw);
if (bw == aBrowserWindow) {
mCrawler->SetBrowserWindow(nsnull);
}
NS_IF_RELEASE(bw);
NS_RELEASE(aBrowserWindow);
return NS_OK;
}
NS_IMETHODIMP
nsViewerApp::ViewSource(nsString& aURL)
{
// Create browser window
// XXX Some piece of code needs to properly hold the reference to this
// browser window. For the time being the reference is released by the
// browser event handling code during processing of the NS_DESTROY event...
nsBrowserWindow* bw = new nsNativeBrowserWindow();
NS_ENSURE_TRUE(bw, NS_ERROR_FAILURE);
NS_ADDREF(bw);
bw->SetApp(this);
bw->Init(mAppShell, nsRect(0, 0, 620, 400), PRUint32(~0), mAllowPlugins);
bw->SetTitle(NS_LITERAL_STRING("View Source").get());
bw->SetVisibility(PR_TRUE);
bw->GoTo(PromiseFlatString(NS_LITERAL_STRING("view-source:") + aURL).get());
NS_RELEASE(bw);
return NS_OK;
}
NS_IMETHODIMP
nsViewerApp::OpenWindow(PRUint32 aNewChromeMask, nsBrowserWindow*& aNewWindow)
{
// Create browser window
nsBrowserWindow* bw = new nsNativeBrowserWindow();
NS_ENSURE_TRUE(bw, NS_ERROR_FAILURE);
NS_ADDREF(bw);
bw->SetApp(this);
bw->Init(mAppShell, nsRect(0, 0, 620, 400), aNewChromeMask, mAllowPlugins);
// Defer showing chrome windows until the chrome has loaded
if (!(aNewChromeMask & nsIWebBrowserChrome::CHROME_OPENAS_CHROME))
bw->SetVisibility(PR_TRUE);
aNewWindow = bw;
return NS_OK;
}
//----------------------------------------
// nsDispatchListener implementation
void
nsViewerApp::AfterDispatch()
{
}
//----------------------------------------
#include "prenv.h"
#include "resources.h"
#include "nsIPresShell.h"
#include "nsIDocument.h"
#include "nsIURL.h"
#ifndef XP_PC
#ifndef XP_MAC
#define _MAX_PATH 512
#endif
#endif
#define DEBUG_EMPTY "(none)"
static PRInt32 gDebugRobotLoads = 5000;
static char gVerifyDir[_MAX_PATH];
static PRBool gVisualDebug = PR_TRUE;
// Robot
static nsIWidget * mRobotDialog = nsnull;
static nsIButton * mCancelBtn;
static nsIButton * mStartBtn;
static nsITextWidget * mVerDirTxt;
static nsITextWidget * mStopAfterTxt;
static nsICheckButton * mUpdateChkBtn;
// Site
static nsIWidget * mSiteDialog = nsnull;
static nsIButton * mSiteCancelBtn;
static nsIButton * mSitePrevBtn;
static nsIButton * mSiteNextBtn;
static nsILabel * mSiteLabel;
static nsIButton * mSiteJumpBtn;
static nsITextWidget * mSiteIndexTxt;
static NS_DEFINE_IID(kLookAndFeelCID, NS_LOOKANDFEEL_CID);
static NS_DEFINE_IID(kButtonCID, NS_BUTTON_CID);
static NS_DEFINE_IID(kTextFieldCID, NS_TEXTFIELD_CID);
static NS_DEFINE_IID(kWindowCID, NS_WINDOW_CID);
static NS_DEFINE_IID(kCheckButtonCID, NS_CHECKBUTTON_CID);
static NS_DEFINE_IID(kLabelCID, NS_LABEL_CID);
static NS_DEFINE_IID(kILookAndFeelIID, NS_ILOOKANDFEEL_IID);
static NS_DEFINE_IID(kIButtonIID, NS_IBUTTON_IID);
static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID);
static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID);
static NS_DEFINE_IID(kICheckButtonIID, NS_ICHECKBUTTON_IID);
static NS_DEFINE_IID(kILabelIID, NS_ILABEL_IID);
static void* GetWidgetNativeData(nsISupports* aObject)
{
void* result = nsnull;
nsIWidget* widget;
if (NS_OK == aObject->QueryInterface(kIWidgetIID,(void**)&widget))
{
result = widget->GetNativeData(NS_NATIVE_WIDGET);
NS_RELEASE(widget);
}
return result;
}
#if defined(XP_PC) && !defined(XP_OS2)
extern JSConsole *gConsole;
// XXX temporary robot code until it's made XP
extern HINSTANCE gInstance, gPrevInstance;
extern "C" NS_EXPORT int DebugRobot(
nsVoidArray * workList, nsIDocShell * ww,
int imax, char * verify_dir,
void (*yieldProc)(const char *));
void yieldProc(const char * str)
{
// Process messages
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
GetMessage(&msg, NULL, 0, 0);
if (!JSConsole::sAccelTable ||
!gConsole ||
!gConsole->GetMainWindow() ||
!TranslateAccelerator(gConsole->GetMainWindow(),
JSConsole::sAccelTable, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
#endif
/**--------------------------------------------------------------------------------
* HandleRobotEvent
*--------------------------------------------------------------------------------
*/
static
nsEventStatus PR_CALLBACK HandleRobotEvent(nsGUIEvent *aEvent)
{
nsEventStatus result = nsEventStatus_eIgnore;
if (aEvent == nsnull || aEvent->widget == nsnull) {
return result;
}
switch(aEvent->message) {
case NS_MOUSE_LEFT_BUTTON_UP: {
if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mCancelBtn)) {
NS_ShowWidget(mRobotDialog,PR_FALSE);
} else if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mStartBtn)) {
nsString str;
PRUint32 size;
mStopAfterTxt->GetText(str, 255, size);
char * cStr = ToNewCString(str);
sscanf(cStr, "%d", &gDebugRobotLoads);
if (gDebugRobotLoads <= 0) {
gDebugRobotLoads = 5000;
}
delete[] cStr;
mVerDirTxt->GetText(str, 255, size);
str.ToCString(gVerifyDir, (PRInt32)_MAX_PATH);
if (!strcmp(gVerifyDir,DEBUG_EMPTY)) {
gVerifyDir[0] = '\0';
}
PRBool state = PR_FALSE;
mUpdateChkBtn->GetState(state);
gVisualDebug = state ? PR_TRUE: PR_FALSE;
}
} break;
case NS_PAINT:
#ifndef XP_UNIX
// paint the background
if (aEvent->widget == mRobotDialog ) {
nsIRenderingContext *drawCtx = ((nsPaintEvent*)aEvent)->renderingContext;
drawCtx->SetColor(aEvent->widget->GetBackgroundColor());
drawCtx->FillRect(*(((nsPaintEvent*)aEvent)->rect));
return nsEventStatus_eIgnore;
}
#endif
return nsEventStatus_eIgnore;
break;
default:
result = nsEventStatus_eIgnore;
} //switch
return result;
}
//--------------------------------------------
//
//--------------------------------------------
static
PRBool CreateRobotDialog(nsIWidget * aParent)
{
PRBool result = PR_TRUE;
if (mRobotDialog != nsnull) {
NS_ShowWidget(mRobotDialog,PR_TRUE);
NS_SetFocusToWidget(mStartBtn);
return PR_TRUE;
}
nsILabel * label;
nsIDeviceContext* dc = aParent->GetDeviceContext();
float t2d;
dc->GetTwipsToDevUnits(t2d);
nsFont font(DIALOG_FONT, NS_FONT_STYLE_NORMAL, NS_FONT_VARIANT_NORMAL,
NS_FONT_WEIGHT_NORMAL, 0,
nscoord(t2d * NSIntPointsToTwips(DIALOG_FONT_SIZE)));
NS_RELEASE(dc);
nscoord dialogWidth = 375;
// create a Dialog
//
nsRect rect;
rect.SetRect(0, 0, dialogWidth, 162);
nsComponentManager::CreateInstance(kWindowCID, nsnull, kIWidgetIID, (void**)&mRobotDialog);
if (nsnull == mRobotDialog)
return PR_FALSE;
nsIWidget* dialogWidget = nsnull;
if (NS_OK == mRobotDialog->QueryInterface(kIWidgetIID,(void**)&dialogWidget))
{
dialogWidget->Create(aParent, rect, HandleRobotEvent, NULL);
NS_RELEASE(dialogWidget);
}
//mRobotDialog->SetLabel("Debug Robot Options");
nscoord txtHeight = 24;
nscolor textBGColor = NS_RGB(255,255,255);
nscolor textFGColor = NS_RGB(255,255,255);
nsILookAndFeel * lookAndFeel;
if (NS_OK == nsComponentManager::CreateInstance(kLookAndFeelCID, nsnull, kILookAndFeelIID, (void**)&lookAndFeel)) {
lookAndFeel->GetMetric(nsILookAndFeel::eMetric_TextFieldHeight, txtHeight);
lookAndFeel->GetColor(nsILookAndFeel::eColor_TextBackground, textBGColor);
lookAndFeel->GetColor(nsILookAndFeel::eColor_TextForeground, textFGColor);
}
nscoord w = 65;
nscoord x = 5;
nscoord y = 10;
// Create Update CheckButton
rect.SetRect(x, y, 150, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewCheckButton(&mUpdateChkBtn);
#else
nsComponentManager::CreateInstance(kCheckButtonCID, nsnull, kICheckButtonIID, (void**)&mUpdateChkBtn);
#endif
NS_CreateCheckButton(mRobotDialog, mUpdateChkBtn,rect,HandleRobotEvent,&font);
mUpdateChkBtn->SetLabel(NS_ConvertASCIItoUCS2("Update Display (Visual)"));
mUpdateChkBtn->SetState(PR_TRUE);
y += 24 + 2;
// Create Label
w = 115;
rect.SetRect(x, y+3, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewLabel(&label);
#else
nsComponentManager::CreateInstance(kLabelCID, nsnull, kILabelIID, (void**)&label);
#endif
NS_CreateLabel(mRobotDialog,label,rect,HandleRobotEvent,&font);
label->SetAlignment(eAlign_Right);
label->SetLabel(NS_ConvertASCIItoUCS2("Verfication Directory:"));
x += w + 1;
// Create TextField
nsIWidget* widget = nsnull;
rect.SetRect(x, y, 225, txtHeight);
#ifdef USE_LOCAL_WIDGETS
NS_NewTextWidget(&mVerDirTxt);
#else
nsComponentManager::CreateInstance(kTextFieldCID, nsnull, kITextWidgetIID, (void**)&mVerDirTxt);
#endif
NS_CreateTextWidget(mRobotDialog,mVerDirTxt,rect,HandleRobotEvent,&font);
if (mVerDirTxt && NS_OK == mVerDirTxt->QueryInterface(kIWidgetIID,(void**)&widget))
{
widget->SetBackgroundColor(textBGColor);
widget->SetForegroundColor(textFGColor);
}
nsString str; str.AssignWithConversion(DEBUG_EMPTY);
PRUint32 size;
mVerDirTxt->SetText(str,size);
y += txtHeight + 2;
x = 5;
w = 55;
rect.SetRect(x, y+4, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewLabel(&label);
#else
nsComponentManager::CreateInstance(kLabelCID, nsnull, kILabelIID, (void**)&label);
#endif
NS_CreateLabel(mRobotDialog,label,rect,HandleRobotEvent,&font);
label->SetAlignment(eAlign_Right);
label->SetLabel(NS_ConvertASCIItoUCS2("Stop after:"));
x += w + 2;
// Create TextField
rect.SetRect(x, y, 75, txtHeight);
#ifdef USE_LOCAL_WIDGETS
NS_NewTextWidget(&mStopAfterTxt);
#else
nsComponentManager::CreateInstance(kTextFieldCID, nsnull, kITextWidgetIID, (void**)&mStopAfterTxt);
#endif
NS_CreateTextWidget(mRobotDialog,mStopAfterTxt,rect,HandleRobotEvent,&font);
if (mStopAfterTxt && NS_OK == mStopAfterTxt->QueryInterface(kIWidgetIID,(void**)&widget))
{
widget->SetBackgroundColor(textBGColor);
widget->SetForegroundColor(textFGColor);
mStopAfterTxt->SetText(NS_ConvertASCIItoUCS2("5000"),size);
}
x += 75 + 2;
w = 75;
rect.SetRect(x, y+4, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewLabel(&label);
#else
nsComponentManager::CreateInstance(kLabelCID, nsnull, kILabelIID, (void**)&label);
#endif
NS_CreateLabel(mRobotDialog,label,rect,HandleRobotEvent,&font);
label->SetAlignment(eAlign_Left);
label->SetLabel(NS_ConvertASCIItoUCS2("(page loads)"));
y += txtHeight + 2;
y += 10;
w = 75;
nscoord xx = (dialogWidth - (2*w)) / 3;
// Create Find Start Button
rect.SetRect(xx, y, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewButton(&mStartBtn);
#else
nsComponentManager::CreateInstance(kButtonCID, nsnull, kIButtonIID, (void**)&mStartBtn);
#endif
NS_CreateButton(mRobotDialog,mStartBtn,rect,HandleRobotEvent,&font);
mStartBtn->SetLabel(NS_ConvertASCIItoUCS2("Start"));
xx += w + xx;
// Create Cancel Button
rect.SetRect(xx, y, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewButton(&mCancelBtn);
#else
nsComponentManager::CreateInstance(kButtonCID, nsnull, kIButtonIID, (void**)&mCancelBtn);
#endif
NS_CreateButton(mRobotDialog,mCancelBtn,rect,HandleRobotEvent,&font);
mCancelBtn->SetLabel(NS_ConvertASCIItoUCS2("Cancel"));
NS_ShowWidget(mRobotDialog,PR_TRUE);
NS_SetFocusToWidget(mStartBtn);
return result;
}
NS_IMETHODIMP
nsViewerApp::CreateRobot(nsBrowserWindow* aWindow)
{
if (CreateRobotDialog(aWindow->mWindow))
{
nsIPresShell* shell = aWindow->GetPresShell();
if (nsnull != shell) {
nsCOMPtr<nsIDocument> doc;
shell->GetDocument(getter_AddRefs(doc));
if (doc) {
char * str;
nsCOMPtr<nsIURI> uri;
doc->GetDocumentURL(getter_AddRefs(uri));
nsresult rv = uri->GetSpec(&str);
if (NS_FAILED(rv)) {
return rv;
}
nsVoidArray * gWorkList = new nsVoidArray();
{
nsString* tempStr = new nsString;
if ( tempStr )
tempStr->AssignWithConversion(str);
gWorkList->AppendElement(tempStr);
}
#if defined(XP_PC) && defined(NS_DEBUG) && !defined(XP_OS2)
DebugRobot(
gWorkList,
gVisualDebug ? aWindow->mDocShell : nsnull,
gDebugRobotLoads,
PL_strdup(gVerifyDir),
yieldProc);
#endif
nsCRT::free(str);
}
}
}
return NS_OK;
}
//----------------------------------------
static nsBrowserWindow* gWinData;
static int gTop100Pointer = 0;
static int gTop100LastPointer = 0;
static const char *const gTop100List[] = {
"http://www.yahoo.com",
"http://www.netscape.com",
"http://www.mozilla.org",
"http://www.microsoft.com",
"http://www.excite.com",
"http://www.mckinley.com",
"http://www.city.net",
"http://www.webcrawler.com",
"http://www.mirabilis.com",
"http://www.infoseek.com",
"http://www.warnerbros.com",
"http://www.cnn.com",
"http://www.altavista.com",
"http://www.usatoday.com",
"http://www.disney.com",
"http://www.starwave.com",
"http://www.hotwired.com",
"http://www.hotbot.com",
"http://www.amazon.com",
"http://www.intel.com",
"http://www.mp3.com",
"http://www.ebay.com",
"http://www.msn.com",
"http://www.lycos.com",
"http://www.pointcast.com",
"http://www.cnet.com",
"http://www.search.com",
"http://www.news.com",
"http://www.download.com",
"http://www.geocities.com",
"http://www.aol.com",
"http://members.aol.com",
"http://www.imdb.com",
"http://uk.imdb.com",
"http://www.macromedia.com",
"http://www.infobeat.com",
"http://www.fxweb.com",
"http://www.whowhere.com",
"http://www.real.com",
"http://www.sportsline.com",
"http://www.dejanews.com",
"http://www.cmpnet.com",
"http://www.go2net.com",
"http://www.metacrawler.com",
"http://www.playsite.com",
"http://www.stocksite.com",
"http://www.sony.com",
"http://www.music.sony.com",
"http://www.station.sony.com",
"http://www.scea.sony.com",
"http://www.infospace.com",
"http://www.zdnet.com",
"http://www.hotfiles.com",
"http://www.chathouse.com",
"http://www.looksmart.com",
"http://www.imaginegames.com",
"http://www.rsac.org",
"http://www.apple.com",
"http://www.beseen.com",
"http://www.dogpile.com",
"http://www.xoom.com",
"http://www.tucows.com",
"http://www.freethemes.com",
"http://www.winfiles.com",
"http://www.vservers.com",
"http://www.mtv.com",
"http://www.the-xfiles.com",
"http://www.datek.com",
"http://www.cyberthrill.com",
"http://www.surplusdirect.com",
"http://www.tomshardware.com",
"http://www.bigyellow.com",
"http://www.100hot.com",
"http://www.messagemates.com",
"http://www.onelist.com",
"http://www.ea.com",
"http://www.bullfrog.co.uk",
"http://www.travelocity.com",
"http://www.ibm.com",
"http://www.bigcharts.com",
"http://www.davesclassics.com",
"http://www.goto.com",
"http://www.weather.com",
"http://www.gamespot.com",
"http://www.bloomberg.com",
"http://www.winzip.com",
"http://www.filez.com",
"http://www.westwood.com",
"http://www.internet.com",
"http://www.cardmaster.com",
"http://www.creaf.com",
"http://netaddress.usa.net",
"http://www.occ.com",
"http://www.as.org",
"http://www.drudgereport.com",
"http://www.hardradio.com",
"http://www.fifa.com",
"http://www.attitude.com",
"http://www.happypuppy.com",
"http://www.gamesdomain.com",
"http://www.onsale.com",
"http://www.tm.com",
"http://www.xlnc1.com",
"http://www.greatsports.com",
"http://www.discovery.com",
"http://www.nai.com",
"http://www.nasa.gov",
"http://www.ogr.com",
"http://www.warzone.com",
"http://www.gamestats.com",
"http://www.winamp.com",
"http://java.sun.com",
"http://www.hp.com",
"http://www.cdnow.com",
"http://www.nytimes.com",
"http://www.majorleaguebaseball.com",
"http://www.washingtonpost.com",
"http://www.planetquake.com",
"http://www.wsj.com",
"http://www.slashdot.org",
"http://www.adobe.com",
"http://www.quicken.com",
"http://www.talkcity.com",
"http://www.developer.com",
"http://www.mapquest.com",
"http://www.bluemountain.com",
"http://www.the-park.com",
"http://www.pathfinder.com",
"http://www.macaddict.com",
0
};
/**--------------------------------------------------------------------------------
* HandleSiteEvent
*--------------------------------------------------------------------------------
*/
static
nsEventStatus PR_CALLBACK HandleSiteEvent(nsGUIEvent *aEvent)
{
nsEventStatus result = nsEventStatus_eIgnore;
if (aEvent == nsnull || aEvent->widget == nsnull) {
return result;
}
switch(aEvent->message) {
case NS_MOUSE_LEFT_BUTTON_UP: {
if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mSiteCancelBtn)) {
NS_ShowWidget(mSiteDialog,PR_FALSE);
} else if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mSiteIndexTxt)) {
// no op
} else {
PRInt32 oldIndex = gTop100Pointer;
if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mSitePrevBtn)) {
gTop100Pointer--;
} else if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mSiteNextBtn)) {
gTop100Pointer++;
} else {
nsString str;
PRUint32 size;
PRInt32 inx;
mSiteIndexTxt->GetText(str, 255, size);
char * cStr = ToNewCString(str);
sscanf(cStr, "%d", &inx);
if (inx >= 0 && inx < gTop100LastPointer) {
gTop100Pointer = inx;
}
delete[] cStr;
}
PRBool loadPage = PR_FALSE;
if (gTop100Pointer < 0) {
gTop100Pointer = 0;
} else if (gTop100Pointer >= gTop100LastPointer) {
gTop100Pointer = gTop100LastPointer-1;
} else {
loadPage = PR_TRUE;
}
NS_EnableWidget(mSitePrevBtn, gTop100Pointer > 0);
NS_EnableWidget(mSiteNextBtn, gTop100Pointer < (gTop100LastPointer-1));
if (gWinData && loadPage && oldIndex != gTop100Pointer) {
nsString urlStr; urlStr.AssignWithConversion(gTop100List[gTop100Pointer]);
mSiteLabel->SetLabel(urlStr);
gWinData->GoTo(urlStr.get());
}
nsAutoString str;
str.AppendInt(gTop100Pointer);
PRUint32 size;
mSiteIndexTxt->SetText(str, size);
}
} break;
case NS_PAINT:
#ifndef XP_UNIX
// paint the background
if (aEvent->widget->GetNativeData(NS_NATIVE_WIDGET) == GetWidgetNativeData(mSiteDialog) ) {
nsIRenderingContext *drawCtx = ((nsPaintEvent*)aEvent)->renderingContext;
drawCtx->SetColor(aEvent->widget->GetBackgroundColor());
drawCtx->FillRect(*(((nsPaintEvent*)aEvent)->rect));
return nsEventStatus_eIgnore;
}
#endif
break;
default:
result = nsEventStatus_eIgnore;
}
return result;
}
//-----------------------------------------
//--
//-----------------------------------------
static
PRBool CreateSiteDialog(nsIWidget * aParent)
{
// Dynamically find the index of the last pointer
gTop100LastPointer = 0;
const char * p;
do {
p = gTop100List[gTop100LastPointer++];
} while (p);
gTop100LastPointer--;
PRBool result = PR_TRUE;
if (mSiteDialog == nsnull) {
nsILabel * label;
nsIDeviceContext* dc = aParent->GetDeviceContext();
float t2d;
dc->GetTwipsToDevUnits(t2d);
nsFont font(DIALOG_FONT, NS_FONT_STYLE_NORMAL, NS_FONT_VARIANT_NORMAL,
NS_FONT_WEIGHT_NORMAL, 0,
nscoord(t2d * NSIntPointsToTwips(DIALOG_FONT_SIZE)));
NS_RELEASE(dc);
nscoord dialogWidth = 375;
// create a Dialog
//
nsRect rect;
rect.SetRect(0, 0, dialogWidth, 125+24+10);
nsIWidget* widget = nsnull;
nsComponentManager::CreateInstance(kWindowCID, nsnull,
kIWidgetIID, (void**)&mSiteDialog);
if (nsnull == mSiteDialog)
return PR_FALSE;
if (NS_OK == mSiteDialog->QueryInterface(kIWidgetIID,(void**)&widget))
{
widget->Create((nsIWidget *) nsnull, rect, HandleSiteEvent, NULL);
//mSiteDialog->SetLabel("Top 100 Site Walker");
}
//mSiteDialog->SetClientData(this);
nsAutoString titleStr(NS_LITERAL_STRING("Top "));
titleStr.AppendInt(gTop100LastPointer);
titleStr.Append(NS_LITERAL_STRING(" Sites"));
mSiteDialog->SetTitle(titleStr);
nscoord w = 65;
nscoord x = 5;
nscoord y = 10;
// Create Label
w = 50;
rect.SetRect(x, y+3, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewLabel(&label);
#else
nsComponentManager::CreateInstance(kLabelCID, nsnull, kILabelIID, (void**)&label);
#endif
NS_CreateLabel(mSiteDialog,label,rect,HandleSiteEvent,&font);
label->SetAlignment(eAlign_Right);
label->SetLabel(NS_ConvertASCIItoUCS2("Site:"));
x += w + 1;
w = 250;
rect.SetRect(x, y+3, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewLabel(&mSiteLabel);
#else
nsComponentManager::CreateInstance(kLabelCID, nsnull, kILabelIID, (void**)&mSiteLabel);
#endif
NS_CreateLabel(mSiteDialog,mSiteLabel,rect,HandleSiteEvent,&font);
mSiteLabel->SetAlignment(eAlign_Left);
mSiteLabel->SetLabel(nsAutoString());
y += 34;
w = 75;
nscoord spacing = (dialogWidth - (3*w)) / 4;
x = spacing;
// Create Previous Button
rect.SetRect(x, y, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewButton(&mSitePrevBtn);
#else
nsComponentManager::CreateInstance(kButtonCID, nsnull, kIButtonIID, (void**)&mSitePrevBtn);
#endif
NS_CreateButton(mSiteDialog,mSitePrevBtn,rect,HandleSiteEvent,&font);
mSitePrevBtn->SetLabel(NS_ConvertASCIItoUCS2("<< Previous"));
x += spacing + w;
// Create Next Button
rect.SetRect(x, y, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewButton(&mSiteNextBtn);
#else
nsComponentManager::CreateInstance(kButtonCID, nsnull, kIButtonIID, (void**)&mSiteNextBtn);
#endif
NS_CreateButton(mSiteDialog,mSiteNextBtn,rect,HandleSiteEvent,&font);
mSiteNextBtn->SetLabel(NS_ConvertASCIItoUCS2("Next >>"));
x += spacing + w;
// Create Cancel Button
rect.SetRect(x, y, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewButton(&mSiteCancelBtn);
#else
nsComponentManager::CreateInstance(kButtonCID, nsnull, kIButtonIID, (void**)&mSiteCancelBtn);
#endif
NS_CreateButton(mSiteDialog,mSiteCancelBtn,rect,HandleSiteEvent,&font);
mSiteCancelBtn->SetLabel(NS_ConvertASCIItoUCS2("Cancel"));
/////////////////////////
w = 65;
x = spacing;
y += 24 + 10;
nscoord txtHeight = 24;
nscolor textBGColor = NS_RGB(255,255,255);
nscolor textFGColor = NS_RGB(255,255,255);
nsILookAndFeel * lookAndFeel;
if (NS_OK == nsComponentManager::CreateInstance(kLookAndFeelCID, nsnull, kILookAndFeelIID, (void**)&lookAndFeel)) {
lookAndFeel->GetMetric(nsILookAndFeel::eMetric_TextFieldHeight, txtHeight);
lookAndFeel->GetColor(nsILookAndFeel::eColor_TextBackground, textBGColor);
lookAndFeel->GetColor(nsILookAndFeel::eColor_TextForeground, textFGColor);
}
// Create TextField
rect.SetRect(x, y, w, txtHeight);
#ifdef USE_LOCAL_WIDGETS
NS_NewTextWidget(&mSiteIndexTxt);
#else
nsComponentManager::CreateInstance(kTextFieldCID, nsnull, kITextWidgetIID, (void**)&mSiteIndexTxt);
#endif
NS_CreateTextWidget(mSiteDialog,mSiteIndexTxt,rect,HandleSiteEvent,&font);
if (mVerDirTxt && NS_OK == mSiteIndexTxt->QueryInterface(kIWidgetIID,(void**)&widget)) {
widget->SetBackgroundColor(textBGColor);
widget->SetForegroundColor(textFGColor);
}
NS_IF_RELEASE(lookAndFeel);
nsString str;
str.AppendInt(0);
PRUint32 size;
mSiteIndexTxt->SetText(str,size);
x += spacing + w;
w = 100;
// Create Jump Button
rect.SetRect(x, y, w, 24);
#ifdef USE_LOCAL_WIDGETS
NS_NewButton(&mSiteJumpBtn);
#else
nsComponentManager::CreateInstance(kButtonCID, nsnull, kIButtonIID, (void**)&mSiteJumpBtn);
#endif
NS_CreateButton(mSiteDialog,mSiteJumpBtn,rect,HandleSiteEvent,&font);
mSiteJumpBtn->SetLabel(NS_ConvertASCIItoUCS2("Jump to Index"));
}
NS_ShowWidget(mSiteDialog,PR_TRUE);
NS_SetFocusToWidget(mSiteNextBtn);
// Init
NS_EnableWidget(mSitePrevBtn,PR_FALSE);
if (gWinData) {
nsString urlStr; urlStr.AssignWithConversion(gTop100List[gTop100Pointer]);
gWinData->GoTo(urlStr.get());
mSiteLabel->SetLabel(urlStr);
}
return result;
}
NS_IMETHODIMP
nsViewerApp::CreateSiteWalker(nsBrowserWindow* aWindow)
{
if (nsnull == gWinData) {
gWinData = aWindow;
NS_ADDREF(aWindow);
}
CreateSiteDialog(aWindow->mWindow);
return NS_OK;
}
//----------------------------------------
#if defined(XP_PC) && !defined(XP_OS2)
#include "jsconsres.h"
static void DestroyConsole()
{
if (gConsole) {
gConsole->SetNotification(NULL);
delete gConsole;
gConsole = NULL;
}
}
static void ShowConsole(nsBrowserWindow* aWindow)
{
HWND hWnd = (HWND)aWindow->mWindow->GetNativeData(NS_NATIVE_WIDGET);
if (!gConsole) {
// load the accelerator table for the console
if (!JSConsole::sAccelTable) {
JSConsole::sAccelTable = LoadAccelerators(gInstance,
MAKEINTRESOURCE(ACCELERATOR_TABLE));
}
nsIScriptContext *context = nsnull;
nsCOMPtr<nsIScriptGlobalObject> scriptGlobal(do_GetInterface(aWindow->mDocShell));
if (scriptGlobal) {
if ((NS_OK == scriptGlobal->GetContext(&context)) && context) {
// create the console
gConsole = JSConsole::CreateConsole();
gConsole->SetContext(context);
// lifetime of the context is still unclear at this point.
// Anyway, as long as the web widget is alive the context is alive.
// Maybe the context shouldn't even be RefCounted
context->Release();
gConsole->SetNotification(DestroyConsole);
}
}
else {
MessageBox(hWnd, "Unable to load JavaScript", "Viewer Error", MB_ICONSTOP);
}
}
}
#endif
NS_IMETHODIMP
nsViewerApp::CreateJSConsole(nsBrowserWindow* aWindow)
{
#if defined(XP_PC) && !defined(XP_OS2)
if (nsnull == gConsole) {
ShowConsole(aWindow);
}
#endif
return NS_OK;
}
NS_IMETHODIMP
nsViewerApp::DoPrefs(nsBrowserWindow* aWindow)
{
#if defined(XP_PC) && defined(NGPREFS) && !defined(XP_OS2)
INGLayoutPrefs *pPrefs;
CoInitialize(NULL);
HRESULT res = CoCreateInstance(CLSID_NGLayoutPrefs, NULL,
CLSCTX_INPROC_SERVER,
IID_INGLayoutPrefs, (void**)&pPrefs);
if (SUCCEEDED(res)) {
pPrefs->Show(NULL);
pPrefs->Release();
}
CoUninitialize();
#endif
return NS_OK;
}