зеркало из https://github.com/mozilla/gecko-dev.git
Pref accessibility.browsewithcaret implemented, bug=49508, r=sfraser, sr=waterson
This commit is contained in:
Родитель
50e7e91688
Коммит
ab4d0dcaee
|
@ -72,11 +72,19 @@
|
|||
#include "nsIMarkupDocumentViewer.h"
|
||||
#include "nsITreeFrame.h"
|
||||
#include "nsIScrollableViewProvider.h"
|
||||
#include "nsIDOMNSDocument.h"
|
||||
|
||||
#include "nsIDOMRange.h"
|
||||
#include "nsICaret.h"
|
||||
#include "nsILookAndFeel.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsIFormControl.h"
|
||||
|
||||
//we will use key binding by default now. this wil lbreak viewer for now
|
||||
#define NON_KEYBINDING 0
|
||||
#define NON_KEYBINDING 0
|
||||
|
||||
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
||||
static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID);
|
||||
|
||||
nsIContent * gLastFocusedContent = 0; // Strong reference
|
||||
nsIDocument * gLastFocusedDocument = 0; // Strong reference
|
||||
|
@ -125,6 +133,7 @@ nsEventStateManager::nsEventStateManager()
|
|||
mFirstBlurEvent = nsnull;
|
||||
mFirstFocusEvent = nsnull;
|
||||
mAccessKeys = nsnull;
|
||||
mBrowseWithCaret = PR_FALSE;
|
||||
hHover = PR_FALSE;
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
|
@ -375,7 +384,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
currentFocus->HandleDOMEvent(aPresContext, &focusevent, nsnull, NS_EVENT_FLAG_INIT, &status);
|
||||
}
|
||||
|
||||
globalObject->HandleDOMEvent(aPresContext, &focusevent, nsnull, NS_EVENT_FLAG_INIT, &status);
|
||||
globalObject->HandleDOMEvent(aPresContext, &focusevent, nsnull, NS_EVENT_FLAG_INIT, &status);
|
||||
NS_IF_RELEASE(mCurrentFocus);
|
||||
mCurrentFocus = currentFocus; // we kept this reference above
|
||||
NS_IF_RELEASE(gLastFocusedContent);
|
||||
|
@ -390,8 +399,17 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
NS_IF_ADDREF(gLastFocusedDocument);
|
||||
}
|
||||
}
|
||||
|
||||
// Set mBrowseWithCaret to value of preference if we're in HTML (don't use caret in XUL)
|
||||
if (mDocument) {
|
||||
mBrowseWithCaret = PR_FALSE;
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(mDocument));
|
||||
if (htmlDoc)
|
||||
mPrefService->GetBoolPref("accessibility.browsewithcaret", &mBrowseWithCaret);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case NS_LOSTFOCUS:
|
||||
{
|
||||
// Hold the blur, wait for the focus so we can query the style of the focus
|
||||
|
@ -399,7 +417,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
// at that time.
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case NS_ACTIVATE:
|
||||
{
|
||||
// If we have a command dispatcher, and if it has a focused window and a
|
||||
|
@ -421,7 +439,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
// Obtain focus info from the command dispatcher.
|
||||
focusController->GetFocusedWindow(getter_AddRefs(focusedWindow));
|
||||
focusController->GetFocusedElement(getter_AddRefs(focusedElement));
|
||||
|
||||
|
||||
focusController->SetSuppressFocusScroll(PR_TRUE);
|
||||
}
|
||||
|
||||
|
@ -961,7 +979,7 @@ nsEventStateManager::GetParentScrollingView(nsMouseScrollEvent *aEvent,
|
|||
if (!rootFrame) return NS_ERROR_FAILURE;
|
||||
|
||||
presShell->GetPresContext(&presCtxOuter); //addrefs
|
||||
|
||||
|
||||
nsPoint eventPoint;
|
||||
rootFrame->GetOrigin(eventPoint);
|
||||
eventPoint += aEvent->point;
|
||||
|
@ -981,12 +999,12 @@ nsEventStateManager::GetParentScrollingView(nsMouseScrollEvent *aEvent,
|
|||
if (rv != NS_OK) return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
||||
nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
||||
nsEvent *aEvent,
|
||||
nsIFrame* aTargetFrame,
|
||||
nsEventStatus* aStatus,
|
||||
|
@ -995,7 +1013,7 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
|||
NS_ENSURE_ARG(aPresContext);
|
||||
NS_ENSURE_ARG_POINTER(aStatus);
|
||||
mCurrentTarget = aTargetFrame;
|
||||
NS_IF_RELEASE(mCurrentTargetContent);
|
||||
NS_IF_RELEASE(mCurrentTargetContent);
|
||||
nsresult ret = NS_OK;
|
||||
|
||||
NS_ASSERTION(mCurrentTarget, "mCurrentTarget is null");
|
||||
|
@ -1189,13 +1207,19 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
|||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case NS_DRAGDROP_DROP:
|
||||
case NS_DRAGDROP_EXIT:
|
||||
// clean up after ourselves. make sure we do this _after_ the event, else we'll
|
||||
// clean up too early!
|
||||
GenerateDragDropEnterExit(aPresContext, (nsGUIEvent*)aEvent);
|
||||
break;
|
||||
|
||||
case NS_KEY_UP:
|
||||
if (mBrowseWithCaret)
|
||||
MoveFocusToCaret();
|
||||
break;
|
||||
|
||||
case NS_KEY_PRESS:
|
||||
if (nsEventStatus_eConsumeNoDefault != *aStatus) {
|
||||
nsKeyEvent* keyEvent = (nsKeyEvent*)aEvent;
|
||||
|
@ -1212,9 +1236,9 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
|||
*aStatus = nsEventStatus_eConsumeNoDefault;
|
||||
break;
|
||||
|
||||
//the problem is that viewer does not have xul so we cannot completely eliminate these
|
||||
//the problem is that viewer does not have xul so we cannot completely eliminate these
|
||||
#if NON_KEYBINDING
|
||||
case NS_VK_PAGE_DOWN:
|
||||
case NS_VK_PAGE_DOWN:
|
||||
case NS_VK_PAGE_UP:
|
||||
if (!mCurrentFocus) {
|
||||
nsIScrollableView* sv = GetNearestScrollingView(aView);
|
||||
|
@ -2005,8 +2029,10 @@ PRBool
|
|||
nsEventStateManager::ChangeFocus(nsIContent* aFocusContent, nsIFrame* aTargetFrame, PRBool aSetFocus)
|
||||
{
|
||||
aFocusContent->SetFocus(mPresContext);
|
||||
MoveCaretToFocus();
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsEventStateManager::ShiftFocus(PRBool forward)
|
||||
|
@ -2024,20 +2050,25 @@ nsEventStateManager::ShiftFocus(PRBool forward)
|
|||
|
||||
if (nsnull == mCurrentFocus) {
|
||||
mCurrentFocus = mDocument->GetRootContent();
|
||||
if (nsnull == mCurrentFocus) {
|
||||
if (nsnull == mCurrentFocus) {
|
||||
return;
|
||||
}
|
||||
mCurrentTabIndex = forward ? 1 : 0;
|
||||
topOfDoc = PR_TRUE;
|
||||
}
|
||||
|
||||
nsIFrame* primaryFrame;
|
||||
nsIFrame* primaryFrame = nsnull;
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
if (mPresContext) {
|
||||
nsresult rv = mPresContext->GetShell(getter_AddRefs(shell));
|
||||
if (NS_SUCCEEDED(rv) && shell){
|
||||
if (topOfDoc) {
|
||||
primaryFrame = nsnull;
|
||||
if (mBrowseWithCaret) {
|
||||
nsCOMPtr<nsIContent> caretFocus;
|
||||
PRUint32 caretOffset;
|
||||
GetCaretLocation(getter_AddRefs(caretFocus), &primaryFrame, &caretOffset);
|
||||
}
|
||||
else if (topOfDoc) {
|
||||
primaryFrame = nsnull;
|
||||
}
|
||||
else {
|
||||
shell->GetPrimaryFrameFor(mCurrentFocus, &primaryFrame);
|
||||
|
@ -2943,7 +2974,11 @@ nsEventStateManager::SendFocusBlur(nsIPresContext* aPresContext, nsIContent *aCo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// For accessibility.browsewithcaret option, we must make the caret visible in text nodes
|
||||
if (presShell && mBrowseWithCaret)
|
||||
EnsureCaretVisible(presShell, aContent);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -3124,3 +3159,209 @@ nsresult NS_NewEventStateManager(nsIEventStateManager** aInstancePtrResult)
|
|||
return manager->Init();
|
||||
}
|
||||
|
||||
|
||||
nsresult nsEventStateManager::GetCaretLocation(nsIContent **aCaretContent,
|
||||
nsIFrame **aCaretFrame, PRUint32* aCaretOffset)
|
||||
{
|
||||
// In order to return the nsIContent and nsIFrame of the caret's position,
|
||||
// we need to get a pres shell, and then get the selection from it
|
||||
|
||||
*aCaretFrame = nsnull;
|
||||
*aCaretContent = nsnull;
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
if (mPresContext)
|
||||
rv = mPresContext->GetShell(getter_AddRefs(shell));
|
||||
|
||||
nsCOMPtr<nsIFrameSelection> selectionFrame;
|
||||
if (shell)
|
||||
rv = shell->GetFrameSelection(getter_AddRefs(selectionFrame));
|
||||
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
if (selectionFrame)
|
||||
rv = selectionFrame->GetSelection(nsISelectionController::SELECTION_NORMAL,
|
||||
getter_AddRefs(domSelection));
|
||||
|
||||
nsCOMPtr<nsIDOMNode> focusDomNode;
|
||||
if (domSelection) {
|
||||
rv = domSelection->GetAnchorNode(getter_AddRefs(focusDomNode));
|
||||
typedef PRInt32* PRInt32_ptr;
|
||||
domSelection->GetAnchorOffset(PRInt32_ptr(aCaretOffset));
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIContent> selectionContent(do_QueryInterface(focusDomNode));
|
||||
|
||||
nsIFrame *primaryFrame = nsnull;
|
||||
if (selectionContent)
|
||||
rv = shell->GetPrimaryFrameFor(selectionContent, &primaryFrame);
|
||||
|
||||
*aCaretFrame = primaryFrame;
|
||||
*aCaretContent = selectionContent;
|
||||
NS_ADDREF(*aCaretContent);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsEventStateManager::MoveFocusToCaret()
|
||||
{
|
||||
// mBrowseWithCaret equals the pref accessibility.browsewithcaret
|
||||
// When it's true, the user can arrow around the browser as if it's a
|
||||
// read only text editor.
|
||||
// If they cursor over a focusable element, then send focus to it
|
||||
nsCOMPtr<nsIContent> caretContent;
|
||||
nsIFrame *caretFrame;
|
||||
PRUint32 caretOffset;
|
||||
nsresult rv = GetCaretLocation(getter_AddRefs(caretContent),
|
||||
&caretFrame, &caretOffset);
|
||||
|
||||
if (caretContent) {
|
||||
// First check to see if our caret is at the very end of a node
|
||||
// If so, the caret is actually sitting in front of the next
|
||||
// logical frame's primary node - so for this case we need to
|
||||
// change caretContent to that node.
|
||||
nsCOMPtr<nsIContent> origCaretContent(caretContent);
|
||||
nsAutoString nodeValue;
|
||||
nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(caretContent));
|
||||
domNode->GetNodeValue(nodeValue);
|
||||
|
||||
if (nodeValue.Length() == caretOffset) {
|
||||
// Yes, indeed we were at the end of the last node
|
||||
nsCOMPtr<nsIBidirectionalEnumerator> frameTraversal;
|
||||
rv = NS_NewFrameTraversal(getter_AddRefs(frameTraversal),
|
||||
EXTENSIVE, mPresContext, caretFrame);
|
||||
|
||||
do {
|
||||
// Get the next logical frame, and set the start of
|
||||
// focusable elements. Search for focusable elements from there.
|
||||
// Continue getting next frame until the primary node for the frame
|
||||
// we are on changes - we don't want to be stuck in the same place
|
||||
frameTraversal->Next();
|
||||
nsISupports* currentItem;
|
||||
frameTraversal->CurrentItem(¤tItem);
|
||||
caretFrame = NS_STATIC_CAST(nsIFrame*, currentItem);
|
||||
if (caretFrame)
|
||||
caretFrame->GetContent(getter_AddRefs(caretContent));
|
||||
else break;
|
||||
}
|
||||
while (caretContent && caretContent == origCaretContent);
|
||||
}
|
||||
|
||||
// We now have the correct start node in caretContent!
|
||||
// Search for focusable elements, starting with caretContent
|
||||
// Keep going up while we look - an ancestory might be focusable
|
||||
|
||||
// jst: We could end the loop earlier, such as when we're no longer
|
||||
// in the same frame, by comparing getPrimaryFrameFor(caretContent)
|
||||
// with a variable holding the starting caretContent
|
||||
nsCOMPtr<nsIAtom> tag;
|
||||
while (caretContent && NS_SUCCEEDED(rv)) {
|
||||
// Keep testing while caretContent is equal to something,
|
||||
// eventually we'll run out of ancestors
|
||||
|
||||
domNode = do_QueryInterface(caretContent);
|
||||
if (!domNode)
|
||||
break;
|
||||
|
||||
domNode->GetNodeValue(nodeValue);
|
||||
caretContent->GetTag(*getter_AddRefs(tag));
|
||||
if (caretContent.get() == mCurrentFocus)
|
||||
break; // already focused on this node, this whole thing's moot
|
||||
|
||||
// For now, all we're going to focus on during this move by
|
||||
// cursor is ordinary links
|
||||
// Add more focusable tags here later if necessary ...
|
||||
if (nsHTMLAtoms::a == tag.get()) {
|
||||
// We are on a link, so change focus to it.
|
||||
ChangeFocus(caretContent, caretFrame, PR_TRUE);
|
||||
break;
|
||||
}
|
||||
// Get the parent
|
||||
nsIContent* parent;
|
||||
caretContent->GetParent(parent);
|
||||
caretContent = dont_AddRef(parent);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsresult nsEventStateManager::MoveCaretToFocus()
|
||||
{
|
||||
// If in HTML content and the pref accessibility.browsewithcaret is TRUE,
|
||||
// then always move the caret to beginning of a new focus
|
||||
|
||||
if (mBrowseWithCaret && mPresContext) {
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
mPresContext->GetShell(getter_AddRefs(shell));
|
||||
if (shell) {
|
||||
// rangeDoc is a document interface we can create a range with
|
||||
nsCOMPtr<nsIDOMNSDocument> rangeDoc(do_QueryInterface(mDocument));
|
||||
nsCOMPtr<nsIDOMNode> currentFocusNode(do_QueryInterface(mCurrentFocus));
|
||||
nsCOMPtr<nsIFrameSelection> frameSelection;
|
||||
shell->GetFrameSelection(getter_AddRefs(frameSelection));
|
||||
nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(currentFocusNode));
|
||||
|
||||
if (frameSelection && currentFocusNode && rangeDoc && !formControl) {
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
frameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL,
|
||||
getter_AddRefs(domSelection));
|
||||
if (domSelection) {
|
||||
// First clear the selection
|
||||
domSelection ->RemoveAllRanges();
|
||||
nsCOMPtr<nsIDOMRange> newRange;
|
||||
nsresult rv = rangeDoc->CreateRange(getter_AddRefs(newRange));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// If we could create a new range, then set it to the current focus node
|
||||
// And then collapse the selection
|
||||
newRange->SelectNodeContents(currentFocusNode);
|
||||
domSelection->AddRange(newRange);
|
||||
domSelection->CollapseToStart();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsEventStateManager::EnsureCaretVisible(nsIPresShell* aPresShell, nsIContent *aContent)
|
||||
{
|
||||
// When browsing with caret, make sure caret is visible after new focus
|
||||
nsCOMPtr<nsIFrameSelection> frameSelection;
|
||||
aPresShell->GetFrameSelection(getter_AddRefs(frameSelection));
|
||||
nsCOMPtr<nsICaret> caret;
|
||||
aPresShell->GetCaret(getter_AddRefs(caret));
|
||||
|
||||
if (frameSelection && caret) {
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
frameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL,
|
||||
getter_AddRefs(domSelection));
|
||||
|
||||
if (domSelection) {
|
||||
nsCOMPtr<nsIDOMNode> focusDomNode;
|
||||
domSelection->GetAnchorNode(getter_AddRefs(focusDomNode));
|
||||
// first, tell the caret which selection to use
|
||||
if (!aContent) {
|
||||
caret->SetCaretDOMSelection(domSelection);
|
||||
// otherwise, aContent == nsnull, so item is focusable
|
||||
// in that case, let focus handlers take care of setting the caret's dom selection
|
||||
}
|
||||
nsCOMPtr<nsISelectionController> selCon(do_QueryInterface(aPresShell));
|
||||
if (!selCon)
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
selCon->SetCaretEnabled(PR_TRUE);
|
||||
caret->SetCaretVisible(PR_TRUE);
|
||||
|
||||
PRInt32 pixelWidth = 1;
|
||||
nsCOMPtr<nsILookAndFeel> lookNFeel(do_GetService(kLookAndFeelCID));
|
||||
if (lookNFeel)
|
||||
lookNFeel->GetMetric(nsILookAndFeel::eMetric_MultiLineCaretWidth, pixelWidth);
|
||||
caret->SetCaretWidth(pixelWidth);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -106,8 +106,8 @@ protected:
|
|||
void UpdateCursor(nsIPresContext* aPresContext, nsEvent* aEvent, nsIFrame* aTargetFrame, nsEventStatus* aStatus);
|
||||
void GenerateMouseEnterExit(nsIPresContext* aPresContext, nsGUIEvent* aEvent);
|
||||
void GenerateDragDropEnterExit(nsIPresContext* aPresContext, nsGUIEvent* aEvent);
|
||||
NS_IMETHOD SetClickCount(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
NS_IMETHOD CheckForAndDispatchClick(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
NS_IMETHOD SetClickCount(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
NS_IMETHOD CheckForAndDispatchClick(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
PRBool ChangeFocus(nsIContent* aFocus, nsIFrame* aFocusFrame, PRBool aSetFocus);
|
||||
void ShiftFocus(PRBool foward);
|
||||
NS_IMETHOD GetNextTabbableContent(nsIContent* aRootContent, nsIFrame* aFrame, PRBool foward, nsIContent** aResult);
|
||||
|
@ -141,6 +141,12 @@ protected:
|
|||
|
||||
PRBool mSuppressFocusChange; // Used only for Ender text fields to suppress a focus firing on mouse down
|
||||
|
||||
// Return the location of the caret
|
||||
nsresult GetCaretLocation(nsIContent **caretContent, nsIFrame **caretFrame, PRUint32 *caretOffset);
|
||||
nsresult MoveFocusToCaret();
|
||||
nsresult MoveCaretToFocus();
|
||||
nsresult EnsureCaretVisible(nsIPresShell* aPresShell, nsIContent *aContent);
|
||||
|
||||
//Any frames here must be checked for validity in ClearFrameRefs
|
||||
nsIFrame* mCurrentTarget;
|
||||
nsIContent* mCurrentTargetContent;
|
||||
|
@ -148,7 +154,7 @@ protected:
|
|||
nsIFrame* mLastMouseOverFrame;
|
||||
nsCOMPtr<nsIContent> mLastMouseOverContent;
|
||||
nsIFrame* mLastDragOverFrame;
|
||||
|
||||
|
||||
// member variables for the d&d gesture state machine
|
||||
PRBool mIsTrackingDragGesture;
|
||||
nsPoint mGestureDownPoint;
|
||||
|
@ -191,6 +197,9 @@ protected:
|
|||
|
||||
//Pref for using hierarchical hover (possibly expensive) or not
|
||||
PRBool hHover;
|
||||
|
||||
// So we don't have to keep checking accessibility.browsewithcaret pref
|
||||
PRBool mBrowseWithCaret;
|
||||
};
|
||||
|
||||
extern nsresult NS_NewEventStateManager(nsIEventStateManager** aInstancePtrResult);
|
||||
|
|
|
@ -10,10 +10,10 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
<bindings id="htmlBindings"
|
||||
xmlns="http://www.mozilla.org/xbl"
|
||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
|
||||
<binding id="browserBase">
|
||||
<handlers>
|
||||
|
||||
|
||||
<handler event="draggesture">
|
||||
<!--
|
||||
nsDragAndDrop.startDrag(event, contentAreaDNDObserver);
|
||||
|
@ -29,7 +29,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
nsDragAndDrop.drop(event, contentAreaDNDObserver);
|
||||
-->
|
||||
</handler>
|
||||
|
||||
|
||||
<handler event="keypress" key=" ">
|
||||
<![CDATA[
|
||||
var v = document.commandDispatcher.focusedElement;
|
||||
|
@ -67,13 +67,13 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
return true;
|
||||
]]>
|
||||
</handler>
|
||||
<handler event="keypress" keycode="VK_PAGE_UP" command="cmd_scrollPageUp"/>
|
||||
<handler event="keypress" keycode="VK_PAGE_DOWN" command="cmd_scrollPageDown"/>
|
||||
|
||||
<handler event="keypress" keycode="VK_UP" command="cmd_scrollLineUp"/>
|
||||
<handler event="keypress" keycode="VK_DOWN" command="cmd_scrollLineDown"/>
|
||||
<handler event="keypress" keycode="VK_LEFT" command="cmd_scrollLeft"/>
|
||||
<handler event="keypress" keycode="VK_RIGHT" command="cmd_scrollRight"/>
|
||||
<handler event="keypress" keycode="VK_PAGE_UP" command="cmd_scrollPageUp" />
|
||||
<handler event="keypress" keycode="VK_PAGE_DOWN" command="cmd_scrollPageDown" />
|
||||
|
||||
<handler event="keypress" keycode="VK_UP" command="cmd_scrollLineUp" />
|
||||
<handler event="keypress" keycode="VK_DOWN" command="cmd_scrollLineDown" />
|
||||
<handler event="keypress" keycode="VK_LEFT" command="cmd_scrollLeft" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" command="cmd_scrollRight" />
|
||||
|
||||
<handler event="keypress" keycode="VK_HOME" command="cmd_scrollTop"/>
|
||||
<handler event="keypress" keycode="VK_END" command="cmd_scrollBottom"/>
|
||||
|
@ -119,7 +119,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
|
||||
<binding id="inputFieldsBase">
|
||||
<handlers>
|
||||
|
||||
|
||||
<handler event="keypress" id="key_home" keycode="VK_HOME"
|
||||
command="cmd_beginLine"/>
|
||||
<handler event="keypress" id="key_end" keycode="VK_END"
|
||||
|
@ -151,7 +151,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
command="cmd_cut"/>
|
||||
<handler event="keypress" id="key_paste" key="v" modifiers="accel"
|
||||
command="cmd_paste"/>
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
command="cmd_undo"/>
|
||||
|
||||
</handlers>
|
||||
|
@ -190,7 +190,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
command="cmd_cut"/>
|
||||
<handler event="keypress" id="key_paste" key="v" modifiers="accel"
|
||||
command="cmd_paste"/>
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
command="cmd_undo"/>
|
||||
|
||||
</handlers>
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
command="cmd_deleteCharBackward"/>
|
||||
<handler event="keypress" id="key_delforw" key="d" modifiers="control"
|
||||
command="cmd_deleteCharForward"/>
|
||||
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
@ -105,7 +104,20 @@
|
|||
</handlers>
|
||||
</binding>
|
||||
|
||||
<binding id="browser"/>
|
||||
<binding id="browser">
|
||||
<handlers>
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="alt" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="alt" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="alt,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="alt,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
<binding id="editor">
|
||||
<handlers>
|
||||
|
|
|
@ -79,6 +79,16 @@
|
|||
<handler event="keypress" keycode="VK_INSERT" modifiers="shift" command="cmd_paste"/>
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="control" command="cmd_scrollTop"/>
|
||||
<handler event="keypress" keycode="VK_END" modifiers="control" command="cmd_scrollBottom"/>
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
|
|
@ -127,6 +127,16 @@
|
|||
<handler event="keypress" keycode="VK_F20" command="cmd_cut" />
|
||||
<handler event="keypress" keycode="VK_F16" command="cmd_copy" />
|
||||
<handler event="keypress" keycode="VK_F18" command="cmd_paste" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
|
|
@ -84,6 +84,16 @@
|
|||
<handler event="keypress" keycode="VK_INSERT" modifiers="shift" command="cmd_paste"/>
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="control" command="cmd_scrollTop"/>
|
||||
<handler event="keypress" keycode="VK_END" modifiers="control" command="cmd_scrollBottom"/>
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
|
|
@ -4247,7 +4247,7 @@ GlobalWindowImpl::RegisterEventListener(const char* aEventName,
|
|||
nsCOMPtr<nsIScriptContext> scriptCX;
|
||||
nsJSUtils::nsGetDynamicScriptContext(cx, getter_AddRefs(scriptCX));
|
||||
if (!scriptCX ||
|
||||
NS_FAILED(manager->RegisterScriptEventListener(scriptCX, this,
|
||||
NS_FAILED(manager->RegisterScriptEventListener(scriptCX, this,
|
||||
eventName,
|
||||
aIID))) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
@ -4406,7 +4406,7 @@ GlobalWindowImpl::GetOnchange(jsval* aOnchange)
|
|||
{
|
||||
return NS_OK;
|
||||
}
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP
|
||||
GlobalWindowImpl::SetOnchange(jsval aOnchange)
|
||||
{
|
||||
return RegisterEventListener("onchange", NS_GET_IID(nsIDOMFormListener));
|
||||
|
@ -4974,48 +4974,39 @@ const char *sCutString = "cmd_cut";
|
|||
const char *sPasteString = "cmd_paste";
|
||||
const char *sSelectAllString = "cmd_selectAll";
|
||||
|
||||
const char *sScrollTopString = "cmd_scrollTop";
|
||||
const char *sScrollBottomString = "cmd_scrollBottom";
|
||||
const char *sScrollPageUpString = "cmd_scrollPageUp";
|
||||
const char *sScrollPageDownString = "cmd_scrollPageDown";
|
||||
const char *sScrollLineUpString = "cmd_scrollLineUp";
|
||||
const char *sScrollLineDownString = "cmd_scrollLineDown";
|
||||
const char *sScrollLeftString = "cmd_scrollLeft";
|
||||
const char *sScrollRightString = "cmd_scrollRight";
|
||||
|
||||
// These are so the browser can use editor navigation key bindings
|
||||
// helps with accessibility (boolean pref accessibility.browsewithcaret)
|
||||
|
||||
const char *sSelectCharPreviousString = "cmd_selectCharPrevious";
|
||||
const char *sSelectCharNextString = "cmd_selectCharNext";
|
||||
|
||||
const char *sWordPreviousString = "cmd_wordPrevious";
|
||||
const char *sWordNextString = "cmd_wordNext";
|
||||
const char *sSelectWordPreviousString = "cmd_selectWordPrevious";
|
||||
const char *sSelectWordNextString = "cmd_selectWordNext";
|
||||
|
||||
const char *sBeginLineString = "cmd_beginLine";
|
||||
const char *sEndLineString = "cmd_endLine";
|
||||
const char *sSelectBeginLineString = "cmd_selectBeginLine";
|
||||
const char *sSelectEndLineString = "cmd_selectEndLine";
|
||||
|
||||
const char *sScrollTopString = "cmd_scrollTop";
|
||||
const char *sScrollBottomString = "cmd_scrollBottom";
|
||||
const char *sSelectLinePreviousString = "cmd_selectLinePrevious";
|
||||
const char *sSelectLineNextString = "cmd_selectLineNext";
|
||||
|
||||
const char *sMoveTopString = "cmd_moveTop";
|
||||
const char *sMoveBottomString = "cmd_moveBottom";
|
||||
const char *sSelectMoveTopString = "cmd_selectTop";
|
||||
const char *sSelectMoveBottomString = "cmd_selectBottom";
|
||||
const char *sSelectPagePreviousString = "cmd_selectPagePrevious";
|
||||
const char *sSelectPageNextString = "cmd_selectPageNext";
|
||||
|
||||
const char *sDownString = "cmd_linedown";
|
||||
const char *sUpString = "cmd_lineup";
|
||||
const char *sSelectDownString = "cmd_selectLineDown";
|
||||
const char *sSelectUpString = "cmd_selectLineUp";
|
||||
|
||||
const char *sLeftString = "cmd_charPrevious";
|
||||
const char *sRightString = "cmd_charNext";
|
||||
const char *sSelectLeftString = "cmd_selectCharPrevious";
|
||||
const char *sSelectRightString = "cmd_selectCharNext";
|
||||
|
||||
|
||||
const char *sWordLeftString = "cmd_wordPrevious";
|
||||
const char *sWordRightString = "cmd_wordNext";
|
||||
const char *sSelectWordLeftString = "cmd_selectWordPrevious";
|
||||
const char *sSelectWordRightString = "cmd_selectWordNext";
|
||||
|
||||
const char *sScrollPageUp = "cmd_scrollPageUp";
|
||||
const char *sScrollPageDown = "cmd_scrollPageDown";
|
||||
|
||||
const char *sScrollLineUp = "cmd_scrollLineUp";
|
||||
const char *sScrollLineDown = "cmd_scrollLineDown";
|
||||
|
||||
const char *sMovePageUp = "cmd_scrollPageUp";
|
||||
const char *sMovePageDown = "cmd_scrollPageDown";
|
||||
const char *sSelectMovePageUp = "cmd_selectPageUp";
|
||||
const char *sSelectMovePageDown = "cmd_selectPageDown";
|
||||
|
||||
const char *sScrollLeft = "cmd_scrollLeft";
|
||||
const char *sScrollRight = "cmd_scrollRight";
|
||||
const char *sSelectMoveTopString = "cmd_selectMoveTop";
|
||||
const char *sSelectMoveBottomString = "cmd_selectMoveBottom";
|
||||
|
||||
NS_IMPL_ADDREF(nsDOMWindowController)
|
||||
NS_IMPL_RELEASE(nsDOMWindowController)
|
||||
|
@ -5030,6 +5021,12 @@ nsDOMWindowController::nsDOMWindowController(nsIDOMWindowInternal *aWindow)
|
|||
{
|
||||
NS_INIT_REFCNT();
|
||||
mWindow = aWindow;
|
||||
|
||||
// Set browse with caret flag so we don't need to every time
|
||||
mBrowseWithCaret = PR_FALSE;
|
||||
nsCOMPtr<nsIPref> prefs(do_GetService(kPrefServiceCID));
|
||||
if (prefs)
|
||||
prefs->GetBoolPref("accessibility.browsewithcaret", &mBrowseWithCaret);
|
||||
}
|
||||
|
||||
nsresult
|
||||
|
@ -5123,44 +5120,38 @@ NS_IMETHODIMP nsDOMWindowController::SupportsCommand(const PRUnichar *aCommand,
|
|||
NS_ENSURE_ARG_POINTER(aResult);
|
||||
|
||||
*aResult = PR_FALSE;
|
||||
|
||||
if (nsCAutoString(sCopyString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectAllString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sCutString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sPasteString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollTopString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollBottomString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollPageUpString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollPageDownString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollLineUpString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollLineDownString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollLeftString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollRightString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectCharPreviousString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectCharNextString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sWordPreviousString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sWordNextString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectWordPreviousString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectWordNextString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sBeginLineString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sEndLineString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectBeginLineString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectEndLineString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollTopString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollBottomString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sMoveTopString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sMoveBottomString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectLinePreviousString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectLineNextString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectPagePreviousString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectPageNextString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectMoveTopString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectMoveBottomString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sDownString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sUpString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sLeftString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sRightString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectDownString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectUpString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectLeftString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectRightString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sWordLeftString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sWordRightString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectWordLeftString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectWordRightString).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollPageUp).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollPageDown).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollLineUp).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollLineDown).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sMovePageUp).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sMovePageDown).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectMovePageUp).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sSelectMovePageDown).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollLeft).EqualsWithConversion(aCommand) ||
|
||||
nsCAutoString(sScrollRight).EqualsWithConversion(aCommand)) {
|
||||
*aResult = PR_TRUE;
|
||||
}
|
||||
nsCAutoString(sSelectMoveBottomString).EqualsWithConversion(aCommand)
|
||||
) {
|
||||
*aResult=PR_TRUE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -5170,68 +5161,74 @@ NS_IMETHODIMP nsDOMWindowController::DoCommand(const PRUnichar *aCommand)
|
|||
NS_ENSURE_ARG_POINTER(aCommand);
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsIContentViewerEdit> editInterface;
|
||||
nsCOMPtr<nsISelectionController> selCont;
|
||||
rv = GetEditInterface(getter_AddRefs(editInterface));
|
||||
nsCOMPtr<nsIPresShell> presShell;
|
||||
if (NS_FAILED(rv))
|
||||
if (!editInterface)
|
||||
return rv;
|
||||
|
||||
if (nsCAutoString(sCopyString).EqualsWithConversion(aCommand)) {
|
||||
rv = editInterface->CopySelection();
|
||||
}
|
||||
else if (nsCAutoString(sCutString).EqualsWithConversion(aCommand)) {
|
||||
rv = editInterface->CutSelection();
|
||||
}
|
||||
else if (nsCAutoString(sPasteString).EqualsWithConversion(aCommand)) {
|
||||
rv = editInterface->Paste();
|
||||
}
|
||||
else if (nsCAutoString(sSelectAllString).EqualsWithConversion(aCommand)) {
|
||||
rv = editInterface->SelectAll();
|
||||
}
|
||||
else if (nsCAutoString(sScrollPageUp).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->ScrollPage(PR_FALSE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollPageDown).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->ScrollPage(PR_TRUE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollLineUp).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->ScrollLine(PR_FALSE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollLineDown).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->ScrollLine(PR_TRUE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollLeft).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->ScrollHorizontal(PR_TRUE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollRight).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->ScrollHorizontal(PR_FALSE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollTopString).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->CompleteScroll(PR_FALSE);
|
||||
}
|
||||
else if (nsCAutoString(sScrollBottomString).EqualsWithConversion(aCommand)) {
|
||||
NS_ENSURE_SUCCESS(GetSelectionController(getter_AddRefs(selCont)),
|
||||
NS_ERROR_FAILURE);
|
||||
return selCont->CompleteScroll(PR_TRUE);
|
||||
}
|
||||
if (nsCAutoString(sCopyString).EqualsWithConversion(aCommand))
|
||||
return editInterface->CopySelection();
|
||||
if (nsCAutoString(sSelectAllString).EqualsWithConversion(aCommand))
|
||||
return editInterface->SelectAll();
|
||||
if (nsCAutoString(sCutString).EqualsWithConversion(aCommand))
|
||||
return editInterface->CutSelection();
|
||||
|
||||
return NS_OK;
|
||||
nsCOMPtr<nsISelectionController> selCont;
|
||||
rv = GetSelectionController(getter_AddRefs(selCont));
|
||||
if (!selCont)
|
||||
return rv;
|
||||
|
||||
if (nsCAutoString(sPasteString).EqualsWithConversion(aCommand))
|
||||
rv = editInterface->Paste();
|
||||
else if (nsCAutoString(sScrollTopString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->CompleteMove(PR_FALSE, PR_FALSE): selCont->CompleteScroll(PR_FALSE));
|
||||
else if (nsCAutoString(sScrollBottomString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->CompleteMove(PR_TRUE, PR_FALSE): selCont->CompleteScroll(PR_TRUE));
|
||||
else if (nsCAutoString(sScrollPageUpString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->PageMove(PR_FALSE, PR_FALSE): selCont->ScrollPage(PR_FALSE));
|
||||
else if (nsCAutoString(sScrollPageDownString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->PageMove(PR_TRUE, PR_FALSE): selCont->ScrollPage(PR_TRUE));
|
||||
else if (nsCAutoString(sScrollLineUpString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->LineMove(PR_FALSE, PR_FALSE): selCont->ScrollLine(PR_FALSE));
|
||||
else if (nsCAutoString(sScrollLineDownString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->LineMove(PR_TRUE, PR_FALSE): selCont->ScrollLine(PR_TRUE));
|
||||
else if (nsCAutoString(sScrollLeftString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->CharacterMove(PR_FALSE, PR_FALSE): selCont->ScrollHorizontal(PR_TRUE));
|
||||
else if (nsCAutoString(sScrollRightString).EqualsWithConversion(aCommand))
|
||||
rv = (mBrowseWithCaret? selCont->CharacterMove(PR_TRUE, PR_FALSE): selCont->ScrollHorizontal(PR_FALSE));
|
||||
// These commands are so the browser can use editor navigation key bindings -
|
||||
// Helps with accessibility - aaronl@chorus.net
|
||||
else if (nsCAutoString(sSelectCharPreviousString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->CharacterMove(PR_FALSE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectCharNextString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->CharacterMove(PR_TRUE, PR_TRUE);
|
||||
else if (nsCAutoString(sWordPreviousString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->WordMove(PR_FALSE, PR_FALSE);
|
||||
else if (nsCAutoString(sWordNextString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->WordMove(PR_TRUE, PR_FALSE);
|
||||
else if (nsCAutoString(sSelectWordPreviousString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->WordMove(PR_FALSE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectWordNextString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->WordMove(PR_TRUE, PR_TRUE);
|
||||
else if (nsCAutoString(sBeginLineString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->IntraLineMove(PR_FALSE, PR_FALSE);
|
||||
else if (nsCAutoString(sEndLineString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->IntraLineMove(PR_TRUE, PR_FALSE);
|
||||
else if (nsCAutoString(sSelectBeginLineString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->IntraLineMove(PR_FALSE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectEndLineString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->IntraLineMove(PR_TRUE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectLinePreviousString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->LineMove(PR_FALSE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectLineNextString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->LineMove(PR_TRUE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectMoveTopString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->CompleteMove(PR_FALSE, PR_TRUE);
|
||||
else if (nsCAutoString(sSelectMoveBottomString).EqualsWithConversion(aCommand))
|
||||
rv = selCont->CompleteMove(PR_TRUE, PR_TRUE);
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsDOMWindowController::OnEvent(const PRUnichar *aEventName)
|
||||
{
|
||||
return NS_OK;
|
||||
|
|
|
@ -104,7 +104,7 @@ public:
|
|||
NS_IMETHOD SetOpenerWindow(nsIDOMWindowInternal *aOpener);
|
||||
NS_IMETHOD SetGlobalObjectOwner(nsIScriptGlobalObjectOwner* aOwner);
|
||||
NS_IMETHOD GetGlobalObjectOwner(nsIScriptGlobalObjectOwner** aOwner);
|
||||
NS_IMETHOD HandleDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent,
|
||||
NS_IMETHOD HandleDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent,
|
||||
nsIDOMEvent** aDOMEvent, PRUint32 aFlags,
|
||||
nsEventStatus* aEventStatus);
|
||||
|
||||
|
@ -272,7 +272,7 @@ protected:
|
|||
nsCOMPtr<nsIPrincipal> mDocumentPrincipal;
|
||||
};
|
||||
|
||||
/*
|
||||
/*
|
||||
* Timeout struct that holds information about each JavaScript
|
||||
* timeout.
|
||||
*/
|
||||
|
@ -412,13 +412,14 @@ public:
|
|||
nsDOMWindowController( nsIDOMWindowInternal* aWindow );
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSICONTROLLER
|
||||
|
||||
|
||||
private:
|
||||
nsresult GetPresShell(nsIPresShell **aPresShell);
|
||||
nsresult GetEditInterface( nsIContentViewerEdit** aEditInterface);
|
||||
nsresult GetEditInterface( nsIContentViewerEdit** aEditInterface);
|
||||
nsresult GetSelectionController(nsISelectionController ** aSelCon);
|
||||
|
||||
nsIDOMWindowInternal *mWindow;
|
||||
PRBool mBrowseWithCaret;
|
||||
};
|
||||
#endif // DOM_CONTROLLER
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ nsCaret::nsCaret()
|
|||
, mCaretTwipsWidth(-1)
|
||||
, mCaretPixelsWidth(1)
|
||||
, mVisible(PR_FALSE)
|
||||
, mReadOnly(PR_TRUE)
|
||||
, mReadOnly(PR_FALSE)
|
||||
, mDrawn(PR_FALSE)
|
||||
, mShowWhenSelection(PR_FALSE)
|
||||
, mLastCaretFrame(nsnull)
|
||||
|
@ -780,12 +780,11 @@ void nsCaret::DrawCaret()
|
|||
|
||||
mCaretRect.IntersectRect(clipRect, caretRect);
|
||||
}
|
||||
/*
|
||||
if (mReadOnly)
|
||||
inRendContext.SetColor(NS_RGB(85, 85, 85)); // we are drawing it; gray
|
||||
*/
|
||||
|
||||
mRendContext->SetColor(NS_RGB(255,255,255));
|
||||
|
||||
if (mReadOnly)
|
||||
mRendContext->SetColor(NS_RGB(85, 85, 85)); // we are drawing it; gray
|
||||
else
|
||||
mRendContext->SetColor(NS_RGB(255,255,255));
|
||||
mRendContext->InvertRect(mCaretRect);
|
||||
|
||||
PRBool emptyClip; // I know what you're thinking. "Did he fire six shots or only five?"
|
||||
|
|
|
@ -67,7 +67,7 @@ nsCaret::nsCaret()
|
|||
, mCaretTwipsWidth(-1)
|
||||
, mCaretPixelsWidth(1)
|
||||
, mVisible(PR_FALSE)
|
||||
, mReadOnly(PR_TRUE)
|
||||
, mReadOnly(PR_FALSE)
|
||||
, mDrawn(PR_FALSE)
|
||||
, mShowWhenSelection(PR_FALSE)
|
||||
, mLastCaretFrame(nsnull)
|
||||
|
@ -780,12 +780,11 @@ void nsCaret::DrawCaret()
|
|||
|
||||
mCaretRect.IntersectRect(clipRect, caretRect);
|
||||
}
|
||||
/*
|
||||
if (mReadOnly)
|
||||
inRendContext.SetColor(NS_RGB(85, 85, 85)); // we are drawing it; gray
|
||||
*/
|
||||
|
||||
mRendContext->SetColor(NS_RGB(255,255,255));
|
||||
|
||||
if (mReadOnly)
|
||||
mRendContext->SetColor(NS_RGB(85, 85, 85)); // we are drawing it; gray
|
||||
else
|
||||
mRendContext->SetColor(NS_RGB(255,255,255));
|
||||
mRendContext->InvertRect(mCaretRect);
|
||||
|
||||
PRBool emptyClip; // I know what you're thinking. "Did he fire six shots or only five?"
|
||||
|
|
|
@ -72,11 +72,19 @@
|
|||
#include "nsIMarkupDocumentViewer.h"
|
||||
#include "nsITreeFrame.h"
|
||||
#include "nsIScrollableViewProvider.h"
|
||||
#include "nsIDOMNSDocument.h"
|
||||
|
||||
#include "nsIDOMRange.h"
|
||||
#include "nsICaret.h"
|
||||
#include "nsILookAndFeel.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsIFormControl.h"
|
||||
|
||||
//we will use key binding by default now. this wil lbreak viewer for now
|
||||
#define NON_KEYBINDING 0
|
||||
#define NON_KEYBINDING 0
|
||||
|
||||
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
||||
static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID);
|
||||
|
||||
nsIContent * gLastFocusedContent = 0; // Strong reference
|
||||
nsIDocument * gLastFocusedDocument = 0; // Strong reference
|
||||
|
@ -125,6 +133,7 @@ nsEventStateManager::nsEventStateManager()
|
|||
mFirstBlurEvent = nsnull;
|
||||
mFirstFocusEvent = nsnull;
|
||||
mAccessKeys = nsnull;
|
||||
mBrowseWithCaret = PR_FALSE;
|
||||
hHover = PR_FALSE;
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
|
@ -375,7 +384,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
currentFocus->HandleDOMEvent(aPresContext, &focusevent, nsnull, NS_EVENT_FLAG_INIT, &status);
|
||||
}
|
||||
|
||||
globalObject->HandleDOMEvent(aPresContext, &focusevent, nsnull, NS_EVENT_FLAG_INIT, &status);
|
||||
globalObject->HandleDOMEvent(aPresContext, &focusevent, nsnull, NS_EVENT_FLAG_INIT, &status);
|
||||
NS_IF_RELEASE(mCurrentFocus);
|
||||
mCurrentFocus = currentFocus; // we kept this reference above
|
||||
NS_IF_RELEASE(gLastFocusedContent);
|
||||
|
@ -390,8 +399,17 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
NS_IF_ADDREF(gLastFocusedDocument);
|
||||
}
|
||||
}
|
||||
|
||||
// Set mBrowseWithCaret to value of preference if we're in HTML (don't use caret in XUL)
|
||||
if (mDocument) {
|
||||
mBrowseWithCaret = PR_FALSE;
|
||||
nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(mDocument));
|
||||
if (htmlDoc)
|
||||
mPrefService->GetBoolPref("accessibility.browsewithcaret", &mBrowseWithCaret);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case NS_LOSTFOCUS:
|
||||
{
|
||||
// Hold the blur, wait for the focus so we can query the style of the focus
|
||||
|
@ -399,7 +417,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
// at that time.
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case NS_ACTIVATE:
|
||||
{
|
||||
// If we have a command dispatcher, and if it has a focused window and a
|
||||
|
@ -421,7 +439,7 @@ nsEventStateManager::PreHandleEvent(nsIPresContext* aPresContext,
|
|||
// Obtain focus info from the command dispatcher.
|
||||
focusController->GetFocusedWindow(getter_AddRefs(focusedWindow));
|
||||
focusController->GetFocusedElement(getter_AddRefs(focusedElement));
|
||||
|
||||
|
||||
focusController->SetSuppressFocusScroll(PR_TRUE);
|
||||
}
|
||||
|
||||
|
@ -961,7 +979,7 @@ nsEventStateManager::GetParentScrollingView(nsMouseScrollEvent *aEvent,
|
|||
if (!rootFrame) return NS_ERROR_FAILURE;
|
||||
|
||||
presShell->GetPresContext(&presCtxOuter); //addrefs
|
||||
|
||||
|
||||
nsPoint eventPoint;
|
||||
rootFrame->GetOrigin(eventPoint);
|
||||
eventPoint += aEvent->point;
|
||||
|
@ -981,12 +999,12 @@ nsEventStateManager::GetParentScrollingView(nsMouseScrollEvent *aEvent,
|
|||
if (rv != NS_OK) return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
||||
nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
||||
nsEvent *aEvent,
|
||||
nsIFrame* aTargetFrame,
|
||||
nsEventStatus* aStatus,
|
||||
|
@ -995,7 +1013,7 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
|||
NS_ENSURE_ARG(aPresContext);
|
||||
NS_ENSURE_ARG_POINTER(aStatus);
|
||||
mCurrentTarget = aTargetFrame;
|
||||
NS_IF_RELEASE(mCurrentTargetContent);
|
||||
NS_IF_RELEASE(mCurrentTargetContent);
|
||||
nsresult ret = NS_OK;
|
||||
|
||||
NS_ASSERTION(mCurrentTarget, "mCurrentTarget is null");
|
||||
|
@ -1189,13 +1207,19 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
|||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case NS_DRAGDROP_DROP:
|
||||
case NS_DRAGDROP_EXIT:
|
||||
// clean up after ourselves. make sure we do this _after_ the event, else we'll
|
||||
// clean up too early!
|
||||
GenerateDragDropEnterExit(aPresContext, (nsGUIEvent*)aEvent);
|
||||
break;
|
||||
|
||||
case NS_KEY_UP:
|
||||
if (mBrowseWithCaret)
|
||||
MoveFocusToCaret();
|
||||
break;
|
||||
|
||||
case NS_KEY_PRESS:
|
||||
if (nsEventStatus_eConsumeNoDefault != *aStatus) {
|
||||
nsKeyEvent* keyEvent = (nsKeyEvent*)aEvent;
|
||||
|
@ -1212,9 +1236,9 @@ nsEventStateManager::PostHandleEvent(nsIPresContext* aPresContext,
|
|||
*aStatus = nsEventStatus_eConsumeNoDefault;
|
||||
break;
|
||||
|
||||
//the problem is that viewer does not have xul so we cannot completely eliminate these
|
||||
//the problem is that viewer does not have xul so we cannot completely eliminate these
|
||||
#if NON_KEYBINDING
|
||||
case NS_VK_PAGE_DOWN:
|
||||
case NS_VK_PAGE_DOWN:
|
||||
case NS_VK_PAGE_UP:
|
||||
if (!mCurrentFocus) {
|
||||
nsIScrollableView* sv = GetNearestScrollingView(aView);
|
||||
|
@ -2005,8 +2029,10 @@ PRBool
|
|||
nsEventStateManager::ChangeFocus(nsIContent* aFocusContent, nsIFrame* aTargetFrame, PRBool aSetFocus)
|
||||
{
|
||||
aFocusContent->SetFocus(mPresContext);
|
||||
MoveCaretToFocus();
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsEventStateManager::ShiftFocus(PRBool forward)
|
||||
|
@ -2024,20 +2050,25 @@ nsEventStateManager::ShiftFocus(PRBool forward)
|
|||
|
||||
if (nsnull == mCurrentFocus) {
|
||||
mCurrentFocus = mDocument->GetRootContent();
|
||||
if (nsnull == mCurrentFocus) {
|
||||
if (nsnull == mCurrentFocus) {
|
||||
return;
|
||||
}
|
||||
mCurrentTabIndex = forward ? 1 : 0;
|
||||
topOfDoc = PR_TRUE;
|
||||
}
|
||||
|
||||
nsIFrame* primaryFrame;
|
||||
nsIFrame* primaryFrame = nsnull;
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
if (mPresContext) {
|
||||
nsresult rv = mPresContext->GetShell(getter_AddRefs(shell));
|
||||
if (NS_SUCCEEDED(rv) && shell){
|
||||
if (topOfDoc) {
|
||||
primaryFrame = nsnull;
|
||||
if (mBrowseWithCaret) {
|
||||
nsCOMPtr<nsIContent> caretFocus;
|
||||
PRUint32 caretOffset;
|
||||
GetCaretLocation(getter_AddRefs(caretFocus), &primaryFrame, &caretOffset);
|
||||
}
|
||||
else if (topOfDoc) {
|
||||
primaryFrame = nsnull;
|
||||
}
|
||||
else {
|
||||
shell->GetPrimaryFrameFor(mCurrentFocus, &primaryFrame);
|
||||
|
@ -2943,7 +2974,11 @@ nsEventStateManager::SendFocusBlur(nsIPresContext* aPresContext, nsIContent *aCo
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// For accessibility.browsewithcaret option, we must make the caret visible in text nodes
|
||||
if (presShell && mBrowseWithCaret)
|
||||
EnsureCaretVisible(presShell, aContent);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -3124,3 +3159,209 @@ nsresult NS_NewEventStateManager(nsIEventStateManager** aInstancePtrResult)
|
|||
return manager->Init();
|
||||
}
|
||||
|
||||
|
||||
nsresult nsEventStateManager::GetCaretLocation(nsIContent **aCaretContent,
|
||||
nsIFrame **aCaretFrame, PRUint32* aCaretOffset)
|
||||
{
|
||||
// In order to return the nsIContent and nsIFrame of the caret's position,
|
||||
// we need to get a pres shell, and then get the selection from it
|
||||
|
||||
*aCaretFrame = nsnull;
|
||||
*aCaretContent = nsnull;
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
if (mPresContext)
|
||||
rv = mPresContext->GetShell(getter_AddRefs(shell));
|
||||
|
||||
nsCOMPtr<nsIFrameSelection> selectionFrame;
|
||||
if (shell)
|
||||
rv = shell->GetFrameSelection(getter_AddRefs(selectionFrame));
|
||||
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
if (selectionFrame)
|
||||
rv = selectionFrame->GetSelection(nsISelectionController::SELECTION_NORMAL,
|
||||
getter_AddRefs(domSelection));
|
||||
|
||||
nsCOMPtr<nsIDOMNode> focusDomNode;
|
||||
if (domSelection) {
|
||||
rv = domSelection->GetAnchorNode(getter_AddRefs(focusDomNode));
|
||||
typedef PRInt32* PRInt32_ptr;
|
||||
domSelection->GetAnchorOffset(PRInt32_ptr(aCaretOffset));
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIContent> selectionContent(do_QueryInterface(focusDomNode));
|
||||
|
||||
nsIFrame *primaryFrame = nsnull;
|
||||
if (selectionContent)
|
||||
rv = shell->GetPrimaryFrameFor(selectionContent, &primaryFrame);
|
||||
|
||||
*aCaretFrame = primaryFrame;
|
||||
*aCaretContent = selectionContent;
|
||||
NS_ADDREF(*aCaretContent);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsEventStateManager::MoveFocusToCaret()
|
||||
{
|
||||
// mBrowseWithCaret equals the pref accessibility.browsewithcaret
|
||||
// When it's true, the user can arrow around the browser as if it's a
|
||||
// read only text editor.
|
||||
// If they cursor over a focusable element, then send focus to it
|
||||
nsCOMPtr<nsIContent> caretContent;
|
||||
nsIFrame *caretFrame;
|
||||
PRUint32 caretOffset;
|
||||
nsresult rv = GetCaretLocation(getter_AddRefs(caretContent),
|
||||
&caretFrame, &caretOffset);
|
||||
|
||||
if (caretContent) {
|
||||
// First check to see if our caret is at the very end of a node
|
||||
// If so, the caret is actually sitting in front of the next
|
||||
// logical frame's primary node - so for this case we need to
|
||||
// change caretContent to that node.
|
||||
nsCOMPtr<nsIContent> origCaretContent(caretContent);
|
||||
nsAutoString nodeValue;
|
||||
nsCOMPtr<nsIDOMNode> domNode(do_QueryInterface(caretContent));
|
||||
domNode->GetNodeValue(nodeValue);
|
||||
|
||||
if (nodeValue.Length() == caretOffset) {
|
||||
// Yes, indeed we were at the end of the last node
|
||||
nsCOMPtr<nsIBidirectionalEnumerator> frameTraversal;
|
||||
rv = NS_NewFrameTraversal(getter_AddRefs(frameTraversal),
|
||||
EXTENSIVE, mPresContext, caretFrame);
|
||||
|
||||
do {
|
||||
// Get the next logical frame, and set the start of
|
||||
// focusable elements. Search for focusable elements from there.
|
||||
// Continue getting next frame until the primary node for the frame
|
||||
// we are on changes - we don't want to be stuck in the same place
|
||||
frameTraversal->Next();
|
||||
nsISupports* currentItem;
|
||||
frameTraversal->CurrentItem(¤tItem);
|
||||
caretFrame = NS_STATIC_CAST(nsIFrame*, currentItem);
|
||||
if (caretFrame)
|
||||
caretFrame->GetContent(getter_AddRefs(caretContent));
|
||||
else break;
|
||||
}
|
||||
while (caretContent && caretContent == origCaretContent);
|
||||
}
|
||||
|
||||
// We now have the correct start node in caretContent!
|
||||
// Search for focusable elements, starting with caretContent
|
||||
// Keep going up while we look - an ancestory might be focusable
|
||||
|
||||
// jst: We could end the loop earlier, such as when we're no longer
|
||||
// in the same frame, by comparing getPrimaryFrameFor(caretContent)
|
||||
// with a variable holding the starting caretContent
|
||||
nsCOMPtr<nsIAtom> tag;
|
||||
while (caretContent && NS_SUCCEEDED(rv)) {
|
||||
// Keep testing while caretContent is equal to something,
|
||||
// eventually we'll run out of ancestors
|
||||
|
||||
domNode = do_QueryInterface(caretContent);
|
||||
if (!domNode)
|
||||
break;
|
||||
|
||||
domNode->GetNodeValue(nodeValue);
|
||||
caretContent->GetTag(*getter_AddRefs(tag));
|
||||
if (caretContent.get() == mCurrentFocus)
|
||||
break; // already focused on this node, this whole thing's moot
|
||||
|
||||
// For now, all we're going to focus on during this move by
|
||||
// cursor is ordinary links
|
||||
// Add more focusable tags here later if necessary ...
|
||||
if (nsHTMLAtoms::a == tag.get()) {
|
||||
// We are on a link, so change focus to it.
|
||||
ChangeFocus(caretContent, caretFrame, PR_TRUE);
|
||||
break;
|
||||
}
|
||||
// Get the parent
|
||||
nsIContent* parent;
|
||||
caretContent->GetParent(parent);
|
||||
caretContent = dont_AddRef(parent);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsresult nsEventStateManager::MoveCaretToFocus()
|
||||
{
|
||||
// If in HTML content and the pref accessibility.browsewithcaret is TRUE,
|
||||
// then always move the caret to beginning of a new focus
|
||||
|
||||
if (mBrowseWithCaret && mPresContext) {
|
||||
nsCOMPtr<nsIPresShell> shell;
|
||||
mPresContext->GetShell(getter_AddRefs(shell));
|
||||
if (shell) {
|
||||
// rangeDoc is a document interface we can create a range with
|
||||
nsCOMPtr<nsIDOMNSDocument> rangeDoc(do_QueryInterface(mDocument));
|
||||
nsCOMPtr<nsIDOMNode> currentFocusNode(do_QueryInterface(mCurrentFocus));
|
||||
nsCOMPtr<nsIFrameSelection> frameSelection;
|
||||
shell->GetFrameSelection(getter_AddRefs(frameSelection));
|
||||
nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(currentFocusNode));
|
||||
|
||||
if (frameSelection && currentFocusNode && rangeDoc && !formControl) {
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
frameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL,
|
||||
getter_AddRefs(domSelection));
|
||||
if (domSelection) {
|
||||
// First clear the selection
|
||||
domSelection ->RemoveAllRanges();
|
||||
nsCOMPtr<nsIDOMRange> newRange;
|
||||
nsresult rv = rangeDoc->CreateRange(getter_AddRefs(newRange));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// If we could create a new range, then set it to the current focus node
|
||||
// And then collapse the selection
|
||||
newRange->SelectNodeContents(currentFocusNode);
|
||||
domSelection->AddRange(newRange);
|
||||
domSelection->CollapseToStart();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsEventStateManager::EnsureCaretVisible(nsIPresShell* aPresShell, nsIContent *aContent)
|
||||
{
|
||||
// When browsing with caret, make sure caret is visible after new focus
|
||||
nsCOMPtr<nsIFrameSelection> frameSelection;
|
||||
aPresShell->GetFrameSelection(getter_AddRefs(frameSelection));
|
||||
nsCOMPtr<nsICaret> caret;
|
||||
aPresShell->GetCaret(getter_AddRefs(caret));
|
||||
|
||||
if (frameSelection && caret) {
|
||||
nsCOMPtr<nsISelection> domSelection;
|
||||
frameSelection->GetSelection(nsISelectionController::SELECTION_NORMAL,
|
||||
getter_AddRefs(domSelection));
|
||||
|
||||
if (domSelection) {
|
||||
nsCOMPtr<nsIDOMNode> focusDomNode;
|
||||
domSelection->GetAnchorNode(getter_AddRefs(focusDomNode));
|
||||
// first, tell the caret which selection to use
|
||||
if (!aContent) {
|
||||
caret->SetCaretDOMSelection(domSelection);
|
||||
// otherwise, aContent == nsnull, so item is focusable
|
||||
// in that case, let focus handlers take care of setting the caret's dom selection
|
||||
}
|
||||
nsCOMPtr<nsISelectionController> selCon(do_QueryInterface(aPresShell));
|
||||
if (!selCon)
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
selCon->SetCaretEnabled(PR_TRUE);
|
||||
caret->SetCaretVisible(PR_TRUE);
|
||||
|
||||
PRInt32 pixelWidth = 1;
|
||||
nsCOMPtr<nsILookAndFeel> lookNFeel(do_GetService(kLookAndFeelCID));
|
||||
if (lookNFeel)
|
||||
lookNFeel->GetMetric(nsILookAndFeel::eMetric_MultiLineCaretWidth, pixelWidth);
|
||||
caret->SetCaretWidth(pixelWidth);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -106,8 +106,8 @@ protected:
|
|||
void UpdateCursor(nsIPresContext* aPresContext, nsEvent* aEvent, nsIFrame* aTargetFrame, nsEventStatus* aStatus);
|
||||
void GenerateMouseEnterExit(nsIPresContext* aPresContext, nsGUIEvent* aEvent);
|
||||
void GenerateDragDropEnterExit(nsIPresContext* aPresContext, nsGUIEvent* aEvent);
|
||||
NS_IMETHOD SetClickCount(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
NS_IMETHOD CheckForAndDispatchClick(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
NS_IMETHOD SetClickCount(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
NS_IMETHOD CheckForAndDispatchClick(nsIPresContext* aPresContext, nsMouseEvent *aEvent, nsEventStatus* aStatus);
|
||||
PRBool ChangeFocus(nsIContent* aFocus, nsIFrame* aFocusFrame, PRBool aSetFocus);
|
||||
void ShiftFocus(PRBool foward);
|
||||
NS_IMETHOD GetNextTabbableContent(nsIContent* aRootContent, nsIFrame* aFrame, PRBool foward, nsIContent** aResult);
|
||||
|
@ -141,6 +141,12 @@ protected:
|
|||
|
||||
PRBool mSuppressFocusChange; // Used only for Ender text fields to suppress a focus firing on mouse down
|
||||
|
||||
// Return the location of the caret
|
||||
nsresult GetCaretLocation(nsIContent **caretContent, nsIFrame **caretFrame, PRUint32 *caretOffset);
|
||||
nsresult MoveFocusToCaret();
|
||||
nsresult MoveCaretToFocus();
|
||||
nsresult EnsureCaretVisible(nsIPresShell* aPresShell, nsIContent *aContent);
|
||||
|
||||
//Any frames here must be checked for validity in ClearFrameRefs
|
||||
nsIFrame* mCurrentTarget;
|
||||
nsIContent* mCurrentTargetContent;
|
||||
|
@ -148,7 +154,7 @@ protected:
|
|||
nsIFrame* mLastMouseOverFrame;
|
||||
nsCOMPtr<nsIContent> mLastMouseOverContent;
|
||||
nsIFrame* mLastDragOverFrame;
|
||||
|
||||
|
||||
// member variables for the d&d gesture state machine
|
||||
PRBool mIsTrackingDragGesture;
|
||||
nsPoint mGestureDownPoint;
|
||||
|
@ -191,6 +197,9 @@ protected:
|
|||
|
||||
//Pref for using hierarchical hover (possibly expensive) or not
|
||||
PRBool hHover;
|
||||
|
||||
// So we don't have to keep checking accessibility.browsewithcaret pref
|
||||
PRBool mBrowseWithCaret;
|
||||
};
|
||||
|
||||
extern nsresult NS_NewEventStateManager(nsIEventStateManager** aInstancePtrResult);
|
||||
|
|
|
@ -10,10 +10,10 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
<bindings id="htmlBindings"
|
||||
xmlns="http://www.mozilla.org/xbl"
|
||||
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
|
||||
<binding id="browserBase">
|
||||
<handlers>
|
||||
|
||||
|
||||
<handler event="draggesture">
|
||||
<!--
|
||||
nsDragAndDrop.startDrag(event, contentAreaDNDObserver);
|
||||
|
@ -29,7 +29,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
nsDragAndDrop.drop(event, contentAreaDNDObserver);
|
||||
-->
|
||||
</handler>
|
||||
|
||||
|
||||
<handler event="keypress" key=" ">
|
||||
<![CDATA[
|
||||
var v = document.commandDispatcher.focusedElement;
|
||||
|
@ -67,13 +67,13 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
return true;
|
||||
]]>
|
||||
</handler>
|
||||
<handler event="keypress" keycode="VK_PAGE_UP" command="cmd_scrollPageUp"/>
|
||||
<handler event="keypress" keycode="VK_PAGE_DOWN" command="cmd_scrollPageDown"/>
|
||||
|
||||
<handler event="keypress" keycode="VK_UP" command="cmd_scrollLineUp"/>
|
||||
<handler event="keypress" keycode="VK_DOWN" command="cmd_scrollLineDown"/>
|
||||
<handler event="keypress" keycode="VK_LEFT" command="cmd_scrollLeft"/>
|
||||
<handler event="keypress" keycode="VK_RIGHT" command="cmd_scrollRight"/>
|
||||
<handler event="keypress" keycode="VK_PAGE_UP" command="cmd_scrollPageUp" />
|
||||
<handler event="keypress" keycode="VK_PAGE_DOWN" command="cmd_scrollPageDown" />
|
||||
|
||||
<handler event="keypress" keycode="VK_UP" command="cmd_scrollLineUp" />
|
||||
<handler event="keypress" keycode="VK_DOWN" command="cmd_scrollLineDown" />
|
||||
<handler event="keypress" keycode="VK_LEFT" command="cmd_scrollLeft" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" command="cmd_scrollRight" />
|
||||
|
||||
<handler event="keypress" keycode="VK_HOME" command="cmd_scrollTop"/>
|
||||
<handler event="keypress" keycode="VK_END" command="cmd_scrollBottom"/>
|
||||
|
@ -119,7 +119,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
|
||||
<binding id="inputFieldsBase">
|
||||
<handlers>
|
||||
|
||||
|
||||
<handler event="keypress" id="key_home" keycode="VK_HOME"
|
||||
command="cmd_beginLine"/>
|
||||
<handler event="keypress" id="key_end" keycode="VK_END"
|
||||
|
@ -151,7 +151,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
command="cmd_cut"/>
|
||||
<handler event="keypress" id="key_paste" key="v" modifiers="accel"
|
||||
command="cmd_paste"/>
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
command="cmd_undo"/>
|
||||
|
||||
</handlers>
|
||||
|
@ -190,7 +190,7 @@ Can't yet put script tags in XBL (hyatt has the bug)
|
|||
command="cmd_cut"/>
|
||||
<handler event="keypress" id="key_paste" key="v" modifiers="accel"
|
||||
command="cmd_paste"/>
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
<handler event="keypress" id="key_undo" key="z" modifiers="accel"
|
||||
command="cmd_undo"/>
|
||||
|
||||
</handlers>
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
command="cmd_deleteCharBackward"/>
|
||||
<handler event="keypress" id="key_delforw" key="d" modifiers="control"
|
||||
command="cmd_deleteCharForward"/>
|
||||
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
@ -105,7 +104,20 @@
|
|||
</handlers>
|
||||
</binding>
|
||||
|
||||
<binding id="browser"/>
|
||||
<binding id="browser">
|
||||
<handlers>
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="alt" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="alt" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="alt,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="alt,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
<binding id="editor">
|
||||
<handlers>
|
||||
|
|
|
@ -79,6 +79,16 @@
|
|||
<handler event="keypress" keycode="VK_INSERT" modifiers="shift" command="cmd_paste"/>
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="control" command="cmd_scrollTop"/>
|
||||
<handler event="keypress" keycode="VK_END" modifiers="control" command="cmd_scrollBottom"/>
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
|
|
@ -127,6 +127,16 @@
|
|||
<handler event="keypress" keycode="VK_F20" command="cmd_cut" />
|
||||
<handler event="keypress" keycode="VK_F16" command="cmd_copy" />
|
||||
<handler event="keypress" keycode="VK_F18" command="cmd_paste" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
|
|
@ -84,6 +84,16 @@
|
|||
<handler event="keypress" keycode="VK_INSERT" modifiers="shift" command="cmd_paste"/>
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="control" command="cmd_scrollTop"/>
|
||||
<handler event="keypress" keycode="VK_END" modifiers="control" command="cmd_scrollBottom"/>
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control" command="cmd_wordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control" command="cmd_wordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="control,shift" command="cmd_selectWordPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="control,shift" command="cmd_selectWordNext" />
|
||||
<handler event="keypress" keycode="VK_LEFT" modifiers="shift" command="cmd_selectCharPrevious" />
|
||||
<handler event="keypress" keycode="VK_RIGHT" modifiers="shift" command="cmd_selectCharNext" />
|
||||
<handler event="keypress" keycode="VK_HOME" modifiers="shift" command="cmd_selectBeginLine" />
|
||||
<handler event="keypress" keycode="VK_END" modifiers="shift" command="cmd_selectEndLine" />
|
||||
<handler event="keypress" keycode="VK_UP" modifiers="shift" command="cmd_selectLinePrevious" />
|
||||
<handler event="keypress" keycode="VK_DOWN" modifiers="shift" command="cmd_selectLineNext" />
|
||||
</handlers>
|
||||
</binding>
|
||||
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
// SYNTAX HINTS: dashes are delimiters. Use underscores instead.
|
||||
// SYNTAX HINTS: dashes are delimiters. Use underscores instead.
|
||||
// The first character after a period must be alphabetic.
|
||||
|
||||
pref("network.search.url","http://cgi.netscape.com/cgi-bin/url_search.cgi?search=");
|
||||
|
@ -40,7 +40,7 @@ pref("general.startup.addressbook", false);
|
|||
pref("general.open_location.last_url", "");
|
||||
|
||||
// 0 = blank, 1 = home (browser.startup.homepage), 2 = last
|
||||
pref("browser.startup.page", 1);
|
||||
pref("browser.startup.page", 1);
|
||||
pref("browser.startup.homepage", "chrome://navigator/locale/navigator.properties");
|
||||
// "browser.startup.homepage_override" was for 4.x
|
||||
pref("browser.startup.homepage_override.1", true);
|
||||
|
@ -73,6 +73,10 @@ pref("browser.toolbars.showbutton.net2phone", true);
|
|||
pref("browser.toolbars.showbutton.print", true);
|
||||
pref("browser.toolbars.showbutton.search", true);
|
||||
|
||||
pref("accessibility.browsewithcaret", false);
|
||||
pref("accessibility.usetexttospeech", "");
|
||||
pref("accessibility.usebrailledisplay", "");
|
||||
|
||||
// Dialog modality issues
|
||||
pref("browser.prefWindowModal", true);
|
||||
pref("browser.show_about_as_stupid_modal_window", false);
|
||||
|
|
Загрузка…
Ссылка в новой задаче