diff --git a/content/base/src/nsGenericDOMDataNode.cpp b/content/base/src/nsGenericDOMDataNode.cpp index f992c6d6bf9c..2cb42abe082b 100644 --- a/content/base/src/nsGenericDOMDataNode.cpp +++ b/content/base/src/nsGenericDOMDataNode.cpp @@ -684,9 +684,13 @@ nsGenericDOMDataNode::HandleDOMEvent(nsIPresContext* aPresContext, nsresult ret = NS_OK; nsIDOMEvent* domEvent = nsnull; + PRBool externalDOMEvent = PR_FALSE; + if (NS_EVENT_FLAG_INIT & aFlags) { if (!aDOMEvent) { aDOMEvent = &domEvent; + } else { + externalDOMEvent = PR_TRUE; } aEvent->flags = aFlags; aFlags &= ~(NS_EVENT_FLAG_CANT_BUBBLE | NS_EVENT_FLAG_CANT_CANCEL); @@ -723,7 +727,7 @@ nsGenericDOMDataNode::HandleDOMEvent(nsIPresContext* aPresContext, if (NS_EVENT_FLAG_INIT & aFlags) { // We're leaving the DOM event loop so if we created a DOM event, // release here. - if (nsnull != *aDOMEvent) { + if (!externalDOMEvent && nsnull != *aDOMEvent) { if (0 != (*aDOMEvent)->Release()) { // Okay, so someone in the DOM loop (a listener, JS object) // still has a ref to the DOM Event but the internal data diff --git a/content/base/src/nsGenericElement.cpp b/content/base/src/nsGenericElement.cpp index 1e173a8dd93d..e7c6e7bec981 100644 --- a/content/base/src/nsGenericElement.cpp +++ b/content/base/src/nsGenericElement.cpp @@ -1071,6 +1071,7 @@ nsGenericElement::InternalIsSupported(const nsAReadableString& aFeature, feature.EqualsWithConversion("Events", PR_TRUE) || // feature.EqualsWithConversion("UIEvents", PR_TRUE) || feature.EqualsWithConversion("MouseEvents", PR_TRUE) || + feature.EqualsWithConversion("MouseScrollEvents", PR_TRUE) || feature.EqualsWithConversion("HTMLEvents", PR_TRUE) || feature.EqualsWithConversion("Range", PR_TRUE)) { if (!aVersion.Length() || aVersion.Equals(NS_LITERAL_STRING("2.0"))) { diff --git a/content/events/src/nsDOMEvent.cpp b/content/events/src/nsDOMEvent.cpp index 793fac21ed6c..d094061d464d 100644 --- a/content/events/src/nsDOMEvent.cpp +++ b/content/events/src/nsDOMEvent.cpp @@ -166,6 +166,10 @@ nsDOMEvent::nsDOMEvent(nsIPresContext* aPresContext, nsEvent* aEvent, mEvent = PR_NEWZAP(nsMouseEvent); mEvent->eventStructType = NS_MOUSE_EVENT; } + else if (eventType.EqualsIgnoreCase("MouseScrollEvents")) { + mEvent = PR_NEWZAP(nsMouseScrollEvent); + mEvent->eventStructType = NS_MOUSE_SCROLL_EVENT; + } else if (eventType.EqualsIgnoreCase("KeyEvents")) { mEvent = PR_NEWZAP(nsKeyEvent); mEvent->eventStructType = NS_KEY_EVENT; @@ -506,6 +510,7 @@ nsDOMEvent::GetDetail(PRInt32* aDetail) case NS_MOUSE_RIGHT_BUTTON_DOWN: case NS_MOUSE_RIGHT_CLICK: case NS_MOUSE_RIGHT_DOUBLECLICK: + case NS_USER_DEFINED_EVENT: *aDetail = ((nsMouseEvent*)mEvent)->clickCount; break; default: @@ -514,6 +519,12 @@ nsDOMEvent::GetDetail(PRInt32* aDetail) return NS_OK; } + case NS_MOUSE_SCROLL_EVENT: + { + *aDetail = ((nsMouseScrollEvent*)mEvent)->delta; + break; + } + default: *aDetail = 0; return NS_OK; @@ -1212,7 +1223,7 @@ nsDOMEvent::InitUIEvent(const nsAReadableString& aTypeArg, PRBool aCanBubbleArg, NS_IMETHODIMP nsDOMEvent::InitMouseEvent(const nsAReadableString & aTypeArg, PRBool aCanBubbleArg, PRBool aCancelableArg, - nsIDOMAbstractView *aViewArg, PRUint16 aDetailArg, PRInt32 aScreenXArg, + nsIDOMAbstractView *aViewArg, PRInt32 aDetailArg, PRInt32 aScreenXArg, PRInt32 aScreenYArg, PRInt32 aClientXArg, PRInt32 aClientYArg, PRBool aCtrlKeyArg, PRBool aAltKeyArg, PRBool aShiftKeyArg, PRBool aMetaKeyArg, PRUint16 aButtonArg, nsIDOMEventTarget *aRelatedTargetArg) @@ -1221,22 +1232,28 @@ nsDOMEvent::InitMouseEvent(const nsAReadableString & aTypeArg, PRBool aCanBubble mEvent->flags |= aCanBubbleArg ? NS_EVENT_FLAG_NONE : NS_EVENT_FLAG_CANT_BUBBLE; mEvent->flags |= aCancelableArg ? NS_EVENT_FLAG_NONE : NS_EVENT_FLAG_CANT_CANCEL; - if (mEvent->eventStructType == NS_MOUSE_EVENT) { - nsMouseEvent* mouseEvent = NS_STATIC_CAST(nsMouseEvent*, mEvent); - mouseEvent->isControl = aCtrlKeyArg; - mouseEvent->isAlt = aAltKeyArg; - mouseEvent->isShift = aShiftKeyArg; - mouseEvent->isMeta = aMetaKeyArg; - mouseEvent->point.x = aClientXArg; - mouseEvent->point.y = aClientYArg; - mouseEvent->refPoint.x = aScreenXArg; - mouseEvent->refPoint.y = aScreenYArg; + if (mEvent->eventStructType == NS_MOUSE_EVENT || mEvent->eventStructType == NS_MOUSE_SCROLL_EVENT) { + nsInputEvent* inputEvent = NS_STATIC_CAST(nsInputEvent*, mEvent); + inputEvent->isControl = aCtrlKeyArg; + inputEvent->isAlt = aAltKeyArg; + inputEvent->isShift = aShiftKeyArg; + inputEvent->isMeta = aMetaKeyArg; + inputEvent->point.x = aClientXArg; + inputEvent->point.y = aClientYArg; + inputEvent->refPoint.x = aScreenXArg; + inputEvent->refPoint.y = aScreenYArg; mScreenPoint.x = aScreenXArg; mScreenPoint.y = aScreenYArg; mClientPoint.x = aClientXArg; mClientPoint.y = aClientYArg; mButton = aButtonArg; - mouseEvent->clickCount = aDetailArg; + if (mEvent->eventStructType == NS_MOUSE_SCROLL_EVENT) { + nsMouseScrollEvent* scrollEvent = NS_STATIC_CAST(nsMouseScrollEvent*, mEvent); + scrollEvent->delta = aDetailArg; + } else { + nsMouseEvent* mouseEvent = NS_STATIC_CAST(nsMouseEvent*, mEvent); + mouseEvent->clickCount = aDetailArg; + } } //include a way to set view once we have more than one diff --git a/content/events/src/nsDOMEvent.h b/content/events/src/nsDOMEvent.h index 449681df5cb6..2f652be01ca1 100644 --- a/content/events/src/nsDOMEvent.h +++ b/content/events/src/nsDOMEvent.h @@ -161,7 +161,7 @@ public: NS_IMETHOD GetKeyCode(PRUint32* aKeyCode); NS_IMETHOD InitMouseEvent(const nsAReadableString & aTypeArg, PRBool aCanBubbleArg, PRBool aCancelableArg, - nsIDOMAbstractView *aViewArg, PRUint16 aDetailArg, + nsIDOMAbstractView *aViewArg, PRInt32 aDetailArg, PRInt32 aScreenXArg, PRInt32 aDcreenYArg, PRInt32 aClientXArg, PRInt32 aClientYArg, PRBool aCtrlKeyArg, PRBool aAltKeyArg, diff --git a/content/events/src/nsEventListenerManager.cpp b/content/events/src/nsEventListenerManager.cpp index bfcf4df00e58..44d28b4125e2 100644 --- a/content/events/src/nsEventListenerManager.cpp +++ b/content/events/src/nsEventListenerManager.cpp @@ -2342,7 +2342,7 @@ nsEventListenerManager::CreateEvent(nsIPresContext* aPresContext, nsAutoString str(aEventType); if (!aEvent && !str.EqualsIgnoreCase("MouseEvents") && !str.EqualsIgnoreCase("KeyEvents") && !str.EqualsIgnoreCase("HTMLEvents") && !str.EqualsIgnoreCase("MutationEvents") && - !str.EqualsIgnoreCase("Events")) { + !str.EqualsIgnoreCase("MouseScrollEvents") && !str.EqualsIgnoreCase("Events")) { return NS_ERROR_DOM_NOT_SUPPORTED_ERR; } diff --git a/content/events/src/nsEventStateManager.cpp b/content/events/src/nsEventStateManager.cpp index 80d4a7d7c8de..502ccd50aad4 100644 --- a/content/events/src/nsEventStateManager.cpp +++ b/content/events/src/nsEventStateManager.cpp @@ -93,6 +93,12 @@ #include "nsIOutlinerBoxObject.h" #include "nsIScrollableViewProvider.h" #include "nsIDOMDocumentRange.h" +#include "nsIDOMDocumentEvent.h" +#include "nsIDOMMouseEvent.h" +#include "nsIDOMEventTarget.h" +#include "nsIDOMDocumentView.h" +#include "nsIDOMAbstractView.h" +#include "nsIDOMNSUIEvent.h" #include "nsIDOMRange.h" #include "nsICaret.h" @@ -1200,63 +1206,6 @@ nsEventStateManager::ChangeTextSize(PRInt32 change) // -// DoTreeScroll -// -// Trees know best how to deal with scrolling, so use the tree scroll api's instead -// of just blindly scrolling the view. -// -nsresult -nsEventStateManager::DoTreeScroll(nsIPresContext* inPresContext, PRInt32 inNumLines, - PRBool inScrollPage, nsITreeFrame* inTreeFrame) -{ - PRInt32 scrollIndex, visibleRows; - inTreeFrame->GetIndexOfFirstVisibleRow(&scrollIndex); - inTreeFrame->GetNumberOfVisibleRows(&visibleRows); - - if (inScrollPage) - scrollIndex += ((inNumLines > 0) ? visibleRows : -visibleRows); - else - scrollIndex += inNumLines; - - if (scrollIndex < 0) - scrollIndex = 0; - else { - PRInt32 numRows; - inTreeFrame->GetRowCount(&numRows); - PRInt32 lastPageTopRow = numRows - visibleRows; - if (scrollIndex > lastPageTopRow) - scrollIndex = lastPageTopRow; - } - - inTreeFrame->ScrollToIndex(scrollIndex); - - // we have to do a sync update for mac because if we scroll too quickly - // w/out going back to the main event loop we can easily scroll the wrong - // bits and it looks like garbage (bug 63465). - nsIFrame* frame = nsnull; - if ( NS_SUCCEEDED(inTreeFrame->QueryInterface(NS_GET_IID(nsIFrame), - (void **)&frame)) ) { - nsIView* treeView = nsnull; - frame->GetView(inPresContext, &treeView); - if (!treeView) { - nsIFrame* frameWithView; - frame->GetParentWithView(inPresContext, &frameWithView); - if (frameWithView) - frameWithView->GetView(inPresContext, &treeView); - else - return NS_ERROR_FAILURE; - } - if (treeView) - ForceViewUpdate(treeView); - } - else - return NS_ERROR_FAILURE; - - return NS_OK; - -} // DoTreeScroll - - nsresult nsEventStateManager::DoWheelScroll(nsIPresContext* aPresContext, nsIFrame* aTargetFrame, @@ -1264,27 +1213,50 @@ nsEventStateManager::DoWheelScroll(nsIPresContext* aPresContext, PRInt32 numLines, PRBool scrollPage, PRBool aUseTargetFrame) { + nsCOMPtr targetContent; + aTargetFrame->GetContent(getter_AddRefs(targetContent)); + + nsCOMPtr targetDoc; + targetContent->GetDocument(*getter_AddRefs(targetDoc)); + if (!targetDoc) return NS_OK; + nsCOMPtr targetDOMDoc(do_QueryInterface(targetDoc)); + + nsCOMPtr event; + targetDOMDoc->CreateEvent(NS_LITERAL_STRING("MouseScrollEvents"), getter_AddRefs(event)); + if (event) { + nsCOMPtr mouseEvent(do_QueryInterface(event)); + nsCOMPtr docView = do_QueryInterface(targetDoc); + if (!docView) return nsnull; + nsCOMPtr view; + docView->GetDefaultView(getter_AddRefs(view)); + + if (scrollPage) + numLines = numLines > 0 ? nsIDOMNSUIEvent::SCROLL_PAGE_DOWN : nsIDOMNSUIEvent::SCROLL_PAGE_UP; + + mouseEvent->InitMouseEvent(NS_LITERAL_STRING("DOMMouseScroll"), PR_TRUE, PR_TRUE, + view, numLines, + msEvent->refPoint.x, msEvent->refPoint.y, + msEvent->point.x, msEvent->point.y, + msEvent->isControl, msEvent->isAlt, msEvent->isShift, msEvent->isMeta, + 0, nsnull); + PRBool allowDefault; + nsCOMPtr target(do_QueryInterface(targetContent)); + if (target) { + target->DispatchEvent(event, &allowDefault); + if (!allowDefault) + return NS_OK; + } + } + + targetDOMDoc->CreateEvent(NS_LITERAL_STRING("MouseScrollEvents"), getter_AddRefs(event)); + if (event) { + nsCOMPtr mouseEvent(do_QueryInterface(event)); + } + nsIView* focusView = nsnull; nsIScrollableView* sv = nsnull; nsIFrame* focusFrame = nsnull; - // Special case for tree/list frames - they handle their own scrolling - nsITreeFrame* treeFrame = nsnull; - nsCOMPtr outlinerBoxObject; - nsIFrame* curFrame = aTargetFrame; - - while (curFrame) { - if (NS_OK == curFrame->QueryInterface(NS_GET_IID(nsITreeFrame), - (void**) &treeFrame)) - break; - - outlinerBoxObject = do_QueryInterface(curFrame); - if (outlinerBoxObject) - break; - - curFrame->GetParent(&curFrame); - } - // Create a mouseout event that we fire to the content before // scrolling, to allow tooltips to disappear, etc. @@ -1300,27 +1272,8 @@ nsEventStateManager::DoWheelScroll(nsIPresContext* aPresContext, mouseOutEvent.isAlt = PR_FALSE; mouseOutEvent.isMeta = PR_FALSE; - nsCOMPtr targetContent; - aTargetFrame->GetContent(getter_AddRefs(targetContent)); - nsEventStatus mouseoutStatus = nsEventStatus_eIgnore; - if (treeFrame) { - if (targetContent) - targetContent->HandleDOMEvent(aPresContext, &mouseOutEvent, nsnull, - NS_EVENT_FLAG_INIT, &mouseoutStatus); - return DoTreeScroll(aPresContext, numLines, scrollPage, treeFrame); - } else if (outlinerBoxObject) { - if (targetContent) - targetContent->HandleDOMEvent(aPresContext, &mouseOutEvent, nsnull, - NS_EVENT_FLAG_INIT, &mouseoutStatus); - if (scrollPage) - outlinerBoxObject->ScrollByPages((numLines > 0) ? 1 : -1); - else - outlinerBoxObject->ScrollByLines(numLines); - return NS_OK; - } - nsCOMPtr presShell; aPresContext->GetShell(getter_AddRefs(presShell)); diff --git a/content/events/src/nsEventStateManager.h b/content/events/src/nsEventStateManager.h index 9d765c5a4ace..586d87764270 100644 --- a/content/events/src/nsEventStateManager.h +++ b/content/events/src/nsEventStateManager.h @@ -174,8 +174,6 @@ protected: nsIFrame* aTargetFrame, nsMouseScrollEvent* msEvent, PRInt32 numLines, PRBool scrollPage, PRBool aUseTargetFrame); - nsresult DoTreeScroll(nsIPresContext* inPresContext, PRInt32 inNumLines, - PRBool inScrollPage, nsITreeFrame* inTreeFrame); void ForceViewUpdate(nsIView* aView); nsresult getPrefService(); nsresult ChangeTextSize(PRInt32 change); diff --git a/content/xul/document/src/nsXULDocument.cpp b/content/xul/document/src/nsXULDocument.cpp index cf0daf2194ce..184d5283d77d 100644 --- a/content/xul/document/src/nsXULDocument.cpp +++ b/content/xul/document/src/nsXULDocument.cpp @@ -2388,9 +2388,17 @@ nsXULDocument::HandleDOMEvent(nsIPresContext* aPresContext, { nsresult ret = NS_OK; nsIDOMEvent* domEvent = nsnull; + PRBool externalDOMEvent = PR_FALSE; if (NS_EVENT_FLAG_INIT & aFlags) { - aDOMEvent = &domEvent; + if (aDOMEvent) { + if (*aDOMEvent) { + externalDOMEvent = PR_TRUE; + } + } + else { + aDOMEvent = &domEvent; + } aEvent->flags = aFlags; aFlags &= ~(NS_EVENT_FLAG_CANT_BUBBLE | NS_EVENT_FLAG_CANT_CANCEL); } @@ -2414,7 +2422,7 @@ nsXULDocument::HandleDOMEvent(nsIPresContext* aPresContext, if (NS_EVENT_FLAG_INIT & aFlags) { // We're leaving the DOM event loop so if we created a DOM event, release here. - if (nsnull != *aDOMEvent) { + if (nsnull != *aDOMEvent && !externalDOMEvent) { nsrefcnt rc; NS_RELEASE2(*aDOMEvent, rc); if (0 != rc) { diff --git a/dom/public/idl/events/nsIDOMMouseEvent.idl b/dom/public/idl/events/nsIDOMMouseEvent.idl index fb374937378b..40ad2923c300 100644 --- a/dom/public/idl/events/nsIDOMMouseEvent.idl +++ b/dom/public/idl/events/nsIDOMMouseEvent.idl @@ -61,7 +61,7 @@ interface nsIDOMMouseEvent : nsIDOMUIEvent in boolean canBubbleArg, in boolean cancelableArg, in nsIDOMAbstractView viewArg, - in unsigned short detailArg, + in long detailArg, in long screenXArg, in long screenYArg, in long clientXArg, diff --git a/dom/public/idl/events/nsIDOMNSUIEvent.idl b/dom/public/idl/events/nsIDOMNSUIEvent.idl index 5c0a5f3f848f..37fd23aa1903 100644 --- a/dom/public/idl/events/nsIDOMNSUIEvent.idl +++ b/dom/public/idl/events/nsIDOMNSUIEvent.idl @@ -43,6 +43,9 @@ [scriptable, uuid(a6cf90c4-15b3-11d2-932e-00805f8add32)] interface nsIDOMNSUIEvent : nsISupports { + const long SCROLL_PAGE_UP = -32768; + const long SCROLL_PAGE_DOWN = 32768; + boolean getPreventDefault(); readonly attribute long layerX; diff --git a/layout/xul/base/public/nsITreeBoxObject.idl b/layout/xul/base/public/nsITreeBoxObject.idl index aaa29fdef998..b548c80e6df6 100644 --- a/layout/xul/base/public/nsITreeBoxObject.idl +++ b/layout/xul/base/public/nsITreeBoxObject.idl @@ -46,6 +46,7 @@ interface nsITreeBoxObject : nsISupports { void ensureIndexIsVisible(in long rowIndex); void scrollToIndex(in long rowIndex); + void scrollByLines(in long numLines); nsIDOMElement getNextItem(in nsIDOMElement startItem, in long delta); nsIDOMElement getPreviousItem(in nsIDOMElement startItem, in long delta); diff --git a/layout/xul/base/public/nsITreeFrame.h b/layout/xul/base/public/nsITreeFrame.h index 04c347519e8e..e52d5c7bdc8a 100644 --- a/layout/xul/base/public/nsITreeFrame.h +++ b/layout/xul/base/public/nsITreeFrame.h @@ -57,6 +57,7 @@ public: NS_IMETHOD GetNextItem(nsIDOMElement* aStartItem, PRInt32 aDelta, nsIDOMElement** aResult) = 0; NS_IMETHOD GetPreviousItem(nsIDOMElement* aStartItem, PRInt32 aDelta, nsIDOMElement** aResult) = 0; NS_IMETHOD ScrollToIndex(PRInt32 aRowIndex) = 0; + NS_IMETHOD ScrollByLines(nsIPresContext* aPresContext, PRInt32 aNumLines)=0; NS_IMETHOD GetItemAtIndex(PRInt32 aIndex, nsIDOMElement** aResult) = 0; NS_IMETHOD GetIndexOfItem(nsIPresContext* aPresContext, nsIDOMElement* aElement, PRInt32* aResult) = 0; NS_IMETHOD GetNumberOfVisibleRows(PRInt32* aResult) = 0; diff --git a/layout/xul/base/src/nsTreeBoxObject.cpp b/layout/xul/base/src/nsTreeBoxObject.cpp index b524db18e0e5..e71ec317c47c 100644 --- a/layout/xul/base/src/nsTreeBoxObject.cpp +++ b/layout/xul/base/src/nsTreeBoxObject.cpp @@ -110,6 +110,19 @@ NS_IMETHODIMP nsTreeBoxObject::ScrollToIndex(PRInt32 aRowIndex) return treeFrame->ScrollToIndex(aRowIndex); } +NS_IMETHODIMP +nsTreeBoxObject::ScrollByLines(PRInt32 aNumLines) +{ + nsIFrame* frame = GetFrame(); + if (!frame) + return NS_OK; + + nsCOMPtr treeFrame(do_QueryInterface(frame)); + nsCOMPtr presContext; + mPresShell->GetPresContext(getter_AddRefs(presContext)); + return treeFrame->ScrollByLines(presContext, aNumLines); +} + /* nsIDOMElement getNextItem (in nsIDOMElement startItem, in long delta); */ NS_IMETHODIMP nsTreeBoxObject::GetNextItem(nsIDOMElement *aStartItem, PRInt32 aDelta, nsIDOMElement **aResult) { diff --git a/layout/xul/base/src/nsXULTreeFrame.cpp b/layout/xul/base/src/nsXULTreeFrame.cpp index 6a49a9f0987e..e13c8922a616 100644 --- a/layout/xul/base/src/nsXULTreeFrame.cpp +++ b/layout/xul/base/src/nsXULTreeFrame.cpp @@ -154,6 +154,58 @@ nsXULTreeFrame::ScrollToIndex(PRInt32 aRowIndex) return NS_OK; } +NS_IMETHODIMP +nsXULTreeFrame::ScrollByLines(nsIPresContext* aPresContext, PRInt32 aNumLines) +{ + PRInt32 scrollIndex, visibleRows; + GetIndexOfFirstVisibleRow(&scrollIndex); + GetNumberOfVisibleRows(&visibleRows); + + scrollIndex += aNumLines; + + if (scrollIndex < 0) + scrollIndex = 0; + else { + PRInt32 numRows; + GetRowCount(&numRows); + PRInt32 lastPageTopRow = numRows - visibleRows; + if (scrollIndex > lastPageTopRow) + scrollIndex = lastPageTopRow; + } + + ScrollToIndex(scrollIndex); + + // we have to do a sync update for mac because if we scroll too quickly + // w/out going back to the main event loop we can easily scroll the wrong + // bits and it looks like garbage (bug 63465). + nsIFrame* frame = nsnull; + if ( NS_SUCCEEDED(QueryInterface(NS_GET_IID(nsIFrame), (void **)&frame)) ) { + nsIView* treeView = nsnull; + frame->GetView(aPresContext, &treeView); + if (!treeView) { + nsIFrame* frameWithView; + frame->GetParentWithView(aPresContext, &frameWithView); + if (frameWithView) + frameWithView->GetView(aPresContext, &treeView); + else + return NS_ERROR_FAILURE; + } + if (treeView) { + nsCOMPtr vm; + if (treeView->GetViewManager(*getter_AddRefs(vm)) && nsnull != vm) { + // I'd use Composite here, but it doesn't always work. + // vm->Composite(); + vm->ForceUpdate(); + + } + } + } + else + return NS_ERROR_FAILURE; + + return NS_OK; +} + /* nsIDOMElement getNextItem (in nsIDOMElement startItem, in long delta); */ NS_IMETHODIMP nsXULTreeFrame::GetNextItem(nsIDOMElement *aStartItem, PRInt32 aDelta, nsIDOMElement **aResult) diff --git a/layout/xul/base/src/nsXULTreeFrame.h b/layout/xul/base/src/nsXULTreeFrame.h index fc68e5319a90..457b032233cf 100644 --- a/layout/xul/base/src/nsXULTreeFrame.h +++ b/layout/xul/base/src/nsXULTreeFrame.h @@ -59,6 +59,7 @@ public: NS_IMETHOD GetNextItem(nsIDOMElement* aStartItem, PRInt32 aDelta, nsIDOMElement** aResult); NS_IMETHOD GetPreviousItem(nsIDOMElement* aStartItem, PRInt32 aDelta, nsIDOMElement** aResult); NS_IMETHOD ScrollToIndex(PRInt32 aRowIndex); + NS_IMETHOD ScrollByLines(nsIPresContext* aPresContext, PRInt32 aNumLines); NS_IMETHOD GetItemAtIndex(PRInt32 aIndex, nsIDOMElement** aResult); NS_IMETHOD GetIndexOfItem(nsIPresContext* aPresContext, nsIDOMElement* aElement, PRInt32* aResult); NS_IMETHOD GetNumberOfVisibleRows(PRInt32 *aResult); diff --git a/xpfe/global/resources/content/bindings/outliner.xml b/xpfe/global/resources/content/bindings/outliner.xml index 17ef605df5a9..d6edd47f5f70 100644 --- a/xpfe/global/resources/content/bindings/outliner.xml +++ b/xpfe/global/resources/content/bindings/outliner.xml @@ -23,6 +23,10 @@ + + this.addEventListener("DOMMouseScroll", this._handleMouseScroll, true); + + @@ -58,6 +62,24 @@ true + + + + + + + this.addEventListener("DOMMouseScroll", this._handleMouseScroll, true); + + + + + + +