зеркало из https://github.com/mozilla/gecko-dev.git
Bug 309075 Right-clicking a partially off-screen link shouldn't scroll the page r+sr=roc
This commit is contained in:
Родитель
3120aa0ea8
Коммит
136d5491f6
|
@ -78,6 +78,8 @@
|
||||||
#include "nsPresContext.h"
|
#include "nsPresContext.h"
|
||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsIEventStateManager.h"
|
#include "nsIEventStateManager.h"
|
||||||
|
#include "nsIFocusController.h"
|
||||||
|
#include "nsPIDOMWindow.h"
|
||||||
|
|
||||||
#include "nsIFrame.h"
|
#include "nsIFrame.h"
|
||||||
|
|
||||||
|
@ -332,10 +334,10 @@ XULPopupListenerImpl::FireFocusOnTargetContent(nsIDOMNode* aTargetNode)
|
||||||
rv = aTargetNode->GetOwnerDocument(getter_AddRefs(domDoc));
|
rv = aTargetNode->GetOwnerDocument(getter_AddRefs(domDoc));
|
||||||
if(NS_SUCCEEDED(rv) && domDoc)
|
if(NS_SUCCEEDED(rv) && domDoc)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDocument> tempdoc = do_QueryInterface(domDoc);
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
|
||||||
|
|
||||||
// Get nsIDOMElement for targetNode
|
// Get nsIDOMElement for targetNode
|
||||||
nsIPresShell *shell = tempdoc->GetShellAt(0);
|
nsIPresShell *shell = doc->GetShellAt(0);
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
|
|
||||||
|
@ -369,9 +371,27 @@ XULPopupListenerImpl::FireFocusOnTargetContent(nsIDOMNode* aTargetNode)
|
||||||
nsCOMPtr<nsIContent> focusableContent = do_QueryInterface(element);
|
nsCOMPtr<nsIContent> focusableContent = do_QueryInterface(element);
|
||||||
nsIEventStateManager *esm = context->EventStateManager();
|
nsIEventStateManager *esm = context->EventStateManager();
|
||||||
|
|
||||||
if (focusableContent)
|
if (focusableContent) {
|
||||||
|
// Lock to scroll by SetFocus. See bug 309075.
|
||||||
|
nsCOMPtr<nsIFocusController> focusController = nsnull;
|
||||||
|
PRBool isAlreadySuppressed = PR_FALSE;
|
||||||
|
nsCOMPtr<nsPIDOMWindow> ourWindow =
|
||||||
|
do_QueryInterface(doc->GetScriptGlobalObject());
|
||||||
|
if (ourWindow) {
|
||||||
|
focusController = ourWindow->GetRootFocusController();
|
||||||
|
if (focusController) {
|
||||||
|
focusController->GetSuppressFocusScroll(&isAlreadySuppressed);
|
||||||
|
if (!isAlreadySuppressed)
|
||||||
|
focusController->SetSuppressFocusScroll(PR_TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
focusableContent->SetFocus(context);
|
focusableContent->SetFocus(context);
|
||||||
else if (!suppressBlur)
|
|
||||||
|
// Unlock scroll if it's needed.
|
||||||
|
if (focusController && !isAlreadySuppressed)
|
||||||
|
focusController->SetSuppressFocusScroll(PR_FALSE);
|
||||||
|
} else if (!suppressBlur)
|
||||||
esm->SetContentState(nsnull, NS_EVENT_STATE_FOCUS);
|
esm->SetContentState(nsnull, NS_EVENT_STATE_FOCUS);
|
||||||
|
|
||||||
esm->SetContentState(focusableContent, NS_EVENT_STATE_ACTIVE);
|
esm->SetContentState(focusableContent, NS_EVENT_STATE_ACTIVE);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче