diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index f6008f7b493..1352ea58048 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -67,6 +67,10 @@ #include "nsIGlobalHistory.h" #include "prmem.h" #include "nsXPIDLString.h" +#include "nsIDOMHTMLElement.h" +#include "nsIDOMHTMLDocument.h" +#include "nsLayoutCID.h" +#include "nsIDOMRange.h" #ifndef XP_MAC #include "nsMultiMixedConv.h" // for @@ -606,7 +610,8 @@ static NS_DEFINE_IID(kIBrowserWindowIID, NS_IBROWSER_WINDOW_IID); static NS_DEFINE_IID(kIClipboardCommandsIID, NS_ICLIPBOARDCOMMANDS_IID); static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID); static NS_DEFINE_IID(kISessionHistoryIID, NS_ISESSION_HISTORY_IID); - +static NS_DEFINE_IID(kIDOMHTMLDocumentIID, NS_IDOMHTMLDOCUMENT_IID); +static NS_DEFINE_CID(kCDOMRangeCID, NS_RANGE_CID); // XXX not sure static NS_DEFINE_IID(kILinkHandlerIID, NS_ILINKHANDLER_IID); @@ -4134,7 +4139,60 @@ nsWebShell::PasteSelection(void) NS_IMETHODIMP nsWebShell::SelectAll(void) { - return NS_ERROR_FAILURE; + nsresult rv; + + nsCOMPtr docViewer; + rv = mContentViewer->QueryInterface(kIDocumentViewerIID, + getter_AddRefs(docViewer)); + if (NS_FAILED(rv) || !docViewer) return rv; + + nsCOMPtr presShell; + rv = docViewer->GetPresShell(*getter_AddRefs(presShell)); + if (NS_FAILED(rv) || !presShell) return rv; + + nsCOMPtr selection; + rv = presShell->GetSelection(SELECTION_NORMAL, getter_AddRefs(selection)); + if (NS_FAILED(rv) || !selection) return rv; + + // Get the document object + nsCOMPtr doc; + rv = docViewer->GetDocument(*getter_AddRefs(doc)); + if (NS_FAILED(rv) || !doc) return rv; + + + nsCOMPtr htmldoc; + rv = doc->QueryInterface(kIDOMHTMLDocumentIID, (void**)&htmldoc); + if (NS_FAILED(rv) || !htmldoc) return rv; + + nsCOMPtrbodyElement; + rv = htmldoc->GetBody(getter_AddRefs(bodyElement)); + if (NS_FAILED(rv) || !bodyElement) return rv; + + nsCOMPtrbodyNode = do_QueryInterface(bodyElement); + if (!bodyNode) return NS_ERROR_NO_INTERFACE; + +#if 0 + rv = selection->Collapse(bodyNode, 0); + if (NS_FAILED(rv)) return rv; + + nsCOMPtrrange; + rv = selection->GetRangeAt(0, getter_AddRefs(range)); + if (NS_FAILED(rv) || !range) return rv; +#endif + + rv = selection->ClearSelection(); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr range; + rv = nsComponentManager::CreateInstance(kCDOMRangeCID, nsnull, + nsIDOMRange::GetIID(), + getter_AddRefs(range)); + + rv = range->SelectNodeContents(bodyNode); + if (NS_FAILED(rv)) return rv; + + rv = selection->AddRange(range); + return rv; } NS_IMETHODIMP diff --git a/mozilla/suite/browser/navigator.js b/mozilla/suite/browser/navigator.js index 2c19a15853c..a02aba2f7c5 100644 --- a/mozilla/suite/browser/navigator.js +++ b/mozilla/suite/browser/navigator.js @@ -680,6 +680,14 @@ function OpenSearch(tabName, searchStr) } } + function BrowserSelectAll() { + if (appCore != null) { + appCore.selectAll(); + } else { + dump("BrowserAppCore has not been created!\n"); + } + } + function BrowserFind() { if (appCore != null) { appCore.find(); diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index f6008f7b493..1352ea58048 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -67,6 +67,10 @@ #include "nsIGlobalHistory.h" #include "prmem.h" #include "nsXPIDLString.h" +#include "nsIDOMHTMLElement.h" +#include "nsIDOMHTMLDocument.h" +#include "nsLayoutCID.h" +#include "nsIDOMRange.h" #ifndef XP_MAC #include "nsMultiMixedConv.h" // for @@ -606,7 +610,8 @@ static NS_DEFINE_IID(kIBrowserWindowIID, NS_IBROWSER_WINDOW_IID); static NS_DEFINE_IID(kIClipboardCommandsIID, NS_ICLIPBOARDCOMMANDS_IID); static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID); static NS_DEFINE_IID(kISessionHistoryIID, NS_ISESSION_HISTORY_IID); - +static NS_DEFINE_IID(kIDOMHTMLDocumentIID, NS_IDOMHTMLDOCUMENT_IID); +static NS_DEFINE_CID(kCDOMRangeCID, NS_RANGE_CID); // XXX not sure static NS_DEFINE_IID(kILinkHandlerIID, NS_ILINKHANDLER_IID); @@ -4134,7 +4139,60 @@ nsWebShell::PasteSelection(void) NS_IMETHODIMP nsWebShell::SelectAll(void) { - return NS_ERROR_FAILURE; + nsresult rv; + + nsCOMPtr docViewer; + rv = mContentViewer->QueryInterface(kIDocumentViewerIID, + getter_AddRefs(docViewer)); + if (NS_FAILED(rv) || !docViewer) return rv; + + nsCOMPtr presShell; + rv = docViewer->GetPresShell(*getter_AddRefs(presShell)); + if (NS_FAILED(rv) || !presShell) return rv; + + nsCOMPtr selection; + rv = presShell->GetSelection(SELECTION_NORMAL, getter_AddRefs(selection)); + if (NS_FAILED(rv) || !selection) return rv; + + // Get the document object + nsCOMPtr doc; + rv = docViewer->GetDocument(*getter_AddRefs(doc)); + if (NS_FAILED(rv) || !doc) return rv; + + + nsCOMPtr htmldoc; + rv = doc->QueryInterface(kIDOMHTMLDocumentIID, (void**)&htmldoc); + if (NS_FAILED(rv) || !htmldoc) return rv; + + nsCOMPtrbodyElement; + rv = htmldoc->GetBody(getter_AddRefs(bodyElement)); + if (NS_FAILED(rv) || !bodyElement) return rv; + + nsCOMPtrbodyNode = do_QueryInterface(bodyElement); + if (!bodyNode) return NS_ERROR_NO_INTERFACE; + +#if 0 + rv = selection->Collapse(bodyNode, 0); + if (NS_FAILED(rv)) return rv; + + nsCOMPtrrange; + rv = selection->GetRangeAt(0, getter_AddRefs(range)); + if (NS_FAILED(rv) || !range) return rv; +#endif + + rv = selection->ClearSelection(); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr range; + rv = nsComponentManager::CreateInstance(kCDOMRangeCID, nsnull, + nsIDOMRange::GetIID(), + getter_AddRefs(range)); + + rv = range->SelectNodeContents(bodyNode); + if (NS_FAILED(rv)) return rv; + + rv = selection->AddRange(range); + return rv; } NS_IMETHODIMP diff --git a/mozilla/xpfe/AppCores/idl/BrowserAppCore.idl b/mozilla/xpfe/AppCores/idl/BrowserAppCore.idl index 34f017a2bb4..93bd1b1fdbc 100644 --- a/mozilla/xpfe/AppCores/idl/BrowserAppCore.idl +++ b/mozilla/xpfe/AppCores/idl/BrowserAppCore.idl @@ -40,6 +40,7 @@ interface BrowserAppCore : BaseAppCore void close(); void exit(); + void selectAll(); void find(); void findNext(); diff --git a/mozilla/xpfe/AppCores/public/nsIDOMBrowserAppCore.h b/mozilla/xpfe/AppCores/public/nsIDOMBrowserAppCore.h index c12c5f4f3b1..21219ba7425 100644 --- a/mozilla/xpfe/AppCores/public/nsIDOMBrowserAppCore.h +++ b/mozilla/xpfe/AppCores/public/nsIDOMBrowserAppCore.h @@ -89,6 +89,8 @@ public: NS_IMETHOD Exit()=0; + NS_IMETHOD SelectAll()=0; + NS_IMETHOD Find()=0; NS_IMETHOD FindNext()=0; @@ -123,6 +125,7 @@ public: NS_IMETHOD Print(); \ NS_IMETHOD Close(); \ NS_IMETHOD Exit(); \ + NS_IMETHOD SelectAll(); \ NS_IMETHOD Find(); \ NS_IMETHOD FindNext(); \ @@ -156,6 +159,7 @@ public: NS_IMETHOD Print() { return _to Print(); } \ NS_IMETHOD Close() { return _to Close(); } \ NS_IMETHOD Exit() { return _to Exit(); } \ + NS_IMETHOD SelectAll() { return _to SelectAll(); } \ NS_IMETHOD Find() { return _to Find(); } \ NS_IMETHOD FindNext() { return _to FindNext(); } \ diff --git a/mozilla/xpfe/AppCores/src/nsBrowserAppCore.cpp b/mozilla/xpfe/AppCores/src/nsBrowserAppCore.cpp index 6cab5ce1c76..a2a218145f6 100644 --- a/mozilla/xpfe/AppCores/src/nsBrowserAppCore.cpp +++ b/mozilla/xpfe/AppCores/src/nsBrowserAppCore.cpp @@ -21,6 +21,7 @@ #include "nsIBrowserWindow.h" #include "nsIWebShell.h" +#include "nsIClipboardCommands.h" #include "pratom.h" #include "prprf.h" #include "nsIComponentManager.h" @@ -2254,6 +2255,13 @@ nsBrowserAppCore::Exit() return NS_OK; } +NS_IMETHODIMP +nsBrowserAppCore::SelectAll() +{ + nsCOMPtr clip(do_QueryInterface(mContentAreaWebShell)); + return clip->SelectAll(); +} + void nsBrowserAppCore::InitializeSearch( nsIFindComponent *finder ) { diff --git a/mozilla/xpfe/AppCores/src/nsBrowserAppCore.h b/mozilla/xpfe/AppCores/src/nsBrowserAppCore.h index 3a9e641166d..357de60cfcf 100644 --- a/mozilla/xpfe/AppCores/src/nsBrowserAppCore.h +++ b/mozilla/xpfe/AppCores/src/nsBrowserAppCore.h @@ -95,6 +95,7 @@ class nsBrowserAppCore : public nsBaseAppCore, NS_IMETHOD Copy(); NS_IMETHOD Close(); NS_IMETHOD Exit(); + NS_IMETHOD SelectAll(); NS_IMETHOD Find(); NS_IMETHOD FindNext(); NS_IMETHOD SetDocumentCharset(const nsString& aCharset); diff --git a/mozilla/xpfe/AppCores/src/nsJSBrowserAppCore.cpp b/mozilla/xpfe/AppCores/src/nsJSBrowserAppCore.cpp index bf5dfdc48a4..9abf38d6988 100644 --- a/mozilla/xpfe/AppCores/src/nsJSBrowserAppCore.cpp +++ b/mozilla/xpfe/AppCores/src/nsJSBrowserAppCore.cpp @@ -1429,6 +1429,48 @@ BrowserAppCoreExit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval } +// +// Native method SelectAll +// +PR_STATIC_CALLBACK(JSBool) +BrowserAppCoreSelectAll(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMBrowserAppCore *nativeThis = (nsIDOMBrowserAppCore*)nsJSUtils::nsGetNativeThis(cx, obj); + + *rval = JSVAL_NULL; + + nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx); + nsCOMPtr secMan; + if (NS_OK != scriptCX->GetSecurityManager(getter_AddRefs(secMan))) { + return JS_FALSE; + } + { + PRBool ok; + secMan->CheckScriptAccess(scriptCX, obj, "browserappcore.selectall", PR_FALSE, &ok); + if (!ok) { + //Need to throw error here + return JS_FALSE; + } + } + + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + + if (NS_OK != nativeThis->SelectAll()) { + return JS_FALSE; + } + + *rval = JSVAL_VOID; + } + + return JS_TRUE; +} + + // // Native method Find // @@ -1572,6 +1614,7 @@ static JSFunctionSpec BrowserAppCoreMethods[] = {"print", BrowserAppCorePrint, 0}, {"close", BrowserAppCoreClose, 0}, {"exit", BrowserAppCoreExit, 0}, + {"selectAll", BrowserAppCoreSelectAll, 0}, {"find", BrowserAppCoreFind, 0}, {"findNext", BrowserAppCoreFindNext, 0}, {0} diff --git a/mozilla/xpfe/browser/resources/content/navigator.js b/mozilla/xpfe/browser/resources/content/navigator.js index 2c19a15853c..a02aba2f7c5 100644 --- a/mozilla/xpfe/browser/resources/content/navigator.js +++ b/mozilla/xpfe/browser/resources/content/navigator.js @@ -680,6 +680,14 @@ function OpenSearch(tabName, searchStr) } } + function BrowserSelectAll() { + if (appCore != null) { + appCore.selectAll(); + } else { + dump("BrowserAppCore has not been created!\n"); + } + } + function BrowserFind() { if (appCore != null) { appCore.find();