From f1cf76f9e7cb4ca436140429ff9523470373c5ec Mon Sep 17 00:00:00 2001 From: "mjudge%netscape.com" Date: Wed, 14 Jun 2000 02:57:26 +0000 Subject: [PATCH] fixing regressions from 34986 ender-lite. adding new selection controller sensitivity. r=saari git-svn-id: svn://10.0.0.236/trunk@72174 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/base/nsPresShell.cpp | 42 +++++++++++++++++--- mozilla/layout/html/base/src/nsPresShell.cpp | 42 +++++++++++++++++--- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/mozilla/layout/base/nsPresShell.cpp b/mozilla/layout/base/nsPresShell.cpp index 42fa5e93c4c..b67be02a8dd 100644 --- a/mozilla/layout/base/nsPresShell.cpp +++ b/mozilla/layout/base/nsPresShell.cpp @@ -83,6 +83,7 @@ #include "nsHTMLToTXTSinkStream.h" #include "nsXIFDTD.h" #include "nsIFrameSelection.h" +#include "nsIDOMNSHTMLInputElement.h" //optimization for ::DoXXX commands #include "nsViewsCID.h" #include "nsIFrameManager.h" #include "nsISupportsPrimitives.h" @@ -2687,16 +2688,45 @@ PresShell::DoCopy() nsString buffer; nsresult rv; - nsIDOMSelection* sel; - GetSelection(nsISelectionController::SELECTION_NORMAL, &sel); + nsCOMPtr sel; + + nsCOMPtr manager; + nsCOMPtr content; + rv = mPresContext->GetEventStateManager(getter_AddRefs(manager)); + if (NS_FAILED(rv) || !manager) + return rv?rv:NS_ERROR_FAILURE; + rv = manager->GetFocusedContent(getter_AddRefs(content)); + if (NS_SUCCEEDED(rv) && content) + { + + //check to see if we need to get selection from frame + //optimization that MAY need to be expanded as more things implement their own "selection" + nsCOMPtr htmlElement(do_QueryInterface(content)); + if (htmlElement) + { + nsIFrame *htmlInputFrame; + rv = GetPrimaryFrameFor(content, &htmlInputFrame); + if (NS_FAILED(rv) || !htmlInputFrame) + return rv?rv:NS_ERROR_FAILURE; + nsCOMPtr selCon; + rv = htmlInputFrame->GetSelectionController(mPresContext,getter_AddRefs(selCon)); + if (NS_FAILED(rv) || !selCon) + return rv?rv:NS_ERROR_FAILURE; + rv = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(sel)); + } + } + if (!sel) //get selection from this PresShell + rv = GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(sel)); - if (sel != nsnull) - doc->CreateXIF(buffer,sel); - NS_IF_RELEASE(sel); + if (NS_FAILED(rv) || !sel) + return rv?rv:NS_ERROR_FAILURE; + + doc->CreateXIF(buffer,sel); // Get the Clipboard NS_WITH_SERVICE(nsIClipboard, clipboard, kCClipboardCID, &rv); - if (NS_FAILED(rv)) return rv; + if (NS_FAILED(rv)) + return rv; if ( clipboard ) { // Create a transferable for putting data on the Clipboard diff --git a/mozilla/layout/html/base/src/nsPresShell.cpp b/mozilla/layout/html/base/src/nsPresShell.cpp index 42fa5e93c4c..b67be02a8dd 100644 --- a/mozilla/layout/html/base/src/nsPresShell.cpp +++ b/mozilla/layout/html/base/src/nsPresShell.cpp @@ -83,6 +83,7 @@ #include "nsHTMLToTXTSinkStream.h" #include "nsXIFDTD.h" #include "nsIFrameSelection.h" +#include "nsIDOMNSHTMLInputElement.h" //optimization for ::DoXXX commands #include "nsViewsCID.h" #include "nsIFrameManager.h" #include "nsISupportsPrimitives.h" @@ -2687,16 +2688,45 @@ PresShell::DoCopy() nsString buffer; nsresult rv; - nsIDOMSelection* sel; - GetSelection(nsISelectionController::SELECTION_NORMAL, &sel); + nsCOMPtr sel; + + nsCOMPtr manager; + nsCOMPtr content; + rv = mPresContext->GetEventStateManager(getter_AddRefs(manager)); + if (NS_FAILED(rv) || !manager) + return rv?rv:NS_ERROR_FAILURE; + rv = manager->GetFocusedContent(getter_AddRefs(content)); + if (NS_SUCCEEDED(rv) && content) + { + + //check to see if we need to get selection from frame + //optimization that MAY need to be expanded as more things implement their own "selection" + nsCOMPtr htmlElement(do_QueryInterface(content)); + if (htmlElement) + { + nsIFrame *htmlInputFrame; + rv = GetPrimaryFrameFor(content, &htmlInputFrame); + if (NS_FAILED(rv) || !htmlInputFrame) + return rv?rv:NS_ERROR_FAILURE; + nsCOMPtr selCon; + rv = htmlInputFrame->GetSelectionController(mPresContext,getter_AddRefs(selCon)); + if (NS_FAILED(rv) || !selCon) + return rv?rv:NS_ERROR_FAILURE; + rv = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(sel)); + } + } + if (!sel) //get selection from this PresShell + rv = GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(sel)); - if (sel != nsnull) - doc->CreateXIF(buffer,sel); - NS_IF_RELEASE(sel); + if (NS_FAILED(rv) || !sel) + return rv?rv:NS_ERROR_FAILURE; + + doc->CreateXIF(buffer,sel); // Get the Clipboard NS_WITH_SERVICE(nsIClipboard, clipboard, kCClipboardCID, &rv); - if (NS_FAILED(rv)) return rv; + if (NS_FAILED(rv)) + return rv; if ( clipboard ) { // Create a transferable for putting data on the Clipboard