Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Side by Side Diff: Source/core/dom/Document.cpp

Issue 26149002: Don't dispatch blur/focus events if the element's page is not focused. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 #include "core/loader/FrameLoader.h" 138 #include "core/loader/FrameLoader.h"
139 #include "core/loader/FrameLoaderClient.h" 139 #include "core/loader/FrameLoaderClient.h"
140 #include "core/loader/ImageLoader.h" 140 #include "core/loader/ImageLoader.h"
141 #include "core/loader/appcache/ApplicationCacheHost.h" 141 #include "core/loader/appcache/ApplicationCacheHost.h"
142 #include "core/page/Chrome.h" 142 #include "core/page/Chrome.h"
143 #include "core/page/ChromeClient.h" 143 #include "core/page/ChromeClient.h"
144 #include "core/page/ContentSecurityPolicy.h" 144 #include "core/page/ContentSecurityPolicy.h"
145 #include "core/page/DOMSecurityPolicy.h" 145 #include "core/page/DOMSecurityPolicy.h"
146 #include "core/page/DOMWindow.h" 146 #include "core/page/DOMWindow.h"
147 #include "core/page/EventHandler.h" 147 #include "core/page/EventHandler.h"
148 #include "core/page/FocusController.h"
148 #include "core/page/Frame.h" 149 #include "core/page/Frame.h"
149 #include "core/page/FrameTree.h" 150 #include "core/page/FrameTree.h"
150 #include "core/page/FrameView.h" 151 #include "core/page/FrameView.h"
151 #include "core/page/History.h" 152 #include "core/page/History.h"
152 #include "core/page/MouseEventWithHitTestResults.h" 153 #include "core/page/MouseEventWithHitTestResults.h"
153 #include "core/page/Page.h" 154 #include "core/page/Page.h"
154 #include "core/page/PageConsole.h" 155 #include "core/page/PageConsole.h"
155 #include "core/page/PointerLockController.h" 156 #include "core/page/PointerLockController.h"
156 #include "core/page/Settings.h" 157 #include "core/page/Settings.h"
157 #include "core/page/animation/AnimationController.h" 158 #include "core/page/animation/AnimationController.h"
(...skipping 3139 matching lines...) Expand 10 before | Expand all | Expand 10 after
3297 if (oldFocusedElement->active()) 3298 if (oldFocusedElement->active())
3298 oldFocusedElement->setActive(false); 3299 oldFocusedElement->setActive(false);
3299 3300
3300 oldFocusedElement->setFocus(false); 3301 oldFocusedElement->setFocus(false);
3301 3302
3302 // Dispatch a change event for text fields or textareas that have been e dited 3303 // Dispatch a change event for text fields or textareas that have been e dited
3303 if (oldFocusedElement->wasChangedSinceLastFormControlChangeEvent()) 3304 if (oldFocusedElement->wasChangedSinceLastFormControlChangeEvent())
3304 oldFocusedElement->dispatchFormControlChangeEvent(); 3305 oldFocusedElement->dispatchFormControlChangeEvent();
3305 3306
3306 // Dispatch the blur event and let the node do any other blur related ac tivities (important for text fields) 3307 // Dispatch the blur event and let the node do any other blur related ac tivities (important for text fields)
3307 oldFocusedElement->dispatchBlurEvent(newFocusedElement.get()); 3308 // If old element's page is unfocused, blur event will have already been dispatched
3309 if (page() && page()->focusController().isFocused()) {
tkent 2013/10/08 22:47:20 I remembered no elements could be focusable if a d
3310 oldFocusedElement->dispatchBlurEvent(newFocusedElement.get());
3308 3311
3309 if (m_focusedElement) { 3312 if (m_focusedElement) {
3310 // handler shifted focus 3313 // handler shifted focus
3311 focusChangeBlocked = true; 3314 focusChangeBlocked = true;
3312 newFocusedElement = 0; 3315 newFocusedElement = 0;
3313 } 3316 }
3314 3317
3315 oldFocusedElement->dispatchFocusOutEvent(eventNames().focusoutEvent, new FocusedElement.get()); // DOM level 3 name for the bubbling blur event. 3318 oldFocusedElement->dispatchFocusOutEvent(eventNames().focusoutEvent, newFocusedElement.get()); // DOM level 3 name for the bubbling blur event.
3316 // FIXME: We should remove firing DOMFocusOutEvent event when we are sur e no content depends 3319 // FIXME: We should remove firing DOMFocusOutEvent event when we are sure no content depends
3317 // on it, probably when <rdar://problem/8503958> is resolved. 3320 // on it, probably when <rdar://problem/8503958> is resolved.
3318 oldFocusedElement->dispatchFocusOutEvent(eventNames().DOMFocusOutEvent, newFocusedElement.get()); // DOM level 2 name for compatibility. 3321 oldFocusedElement->dispatchFocusOutEvent(eventNames().DOMFocusOutEve nt, newFocusedElement.get()); // DOM level 2 name for compatibility.
3319 3322
3320 if (m_focusedElement) { 3323 if (m_focusedElement) {
3321 // handler shifted focus 3324 // handler shifted focus
3322 focusChangeBlocked = true; 3325 focusChangeBlocked = true;
3323 newFocusedElement = 0; 3326 newFocusedElement = 0;
3327 }
3324 } 3328 }
3325 3329
3326 if (oldFocusedElement->isRootEditableElement()) 3330 if (oldFocusedElement->isRootEditableElement())
3327 frame()->editor().didEndEditing(); 3331 frame()->editor().didEndEditing();
3328 3332
3329 if (view()) { 3333 if (view()) {
3330 Widget* oldWidget = widgetForElement(oldFocusedElement.get()); 3334 Widget* oldWidget = widgetForElement(oldFocusedElement.get());
3331 if (oldWidget) 3335 if (oldWidget)
3332 oldWidget->setFocus(false); 3336 oldWidget->setFocus(false);
3333 else 3337 else
3334 view()->setFocus(false); 3338 view()->setFocus(false);
3335 } 3339 }
3336 3340
3337 // Autofill client may have modified the value of newFocusedElement, thu s require 3341 // Autofill client may have modified the value of newFocusedElement, thu s require
3338 // a layout update here, otherwise it will assert at newFocusedElement-> isFocusable(). 3342 // a layout update here, otherwise it will assert at newFocusedElement-> isFocusable().
3339 // See crbug.com/251163. 3343 // See crbug.com/251163.
3340 updateLayoutIgnorePendingStylesheets(); 3344 updateLayoutIgnorePendingStylesheets();
3341 } 3345 }
3342 3346
3343 if (newFocusedElement && newFocusedElement->isFocusable()) { 3347 if (newFocusedElement && newFocusedElement->isFocusable()) {
3344 if (newFocusedElement->isRootEditableElement() && !acceptsEditingFocus(n ewFocusedElement.get())) { 3348 if (newFocusedElement->isRootEditableElement() && !acceptsEditingFocus(n ewFocusedElement.get())) {
3345 // delegate blocks focus change 3349 // delegate blocks focus change
3346 focusChangeBlocked = true; 3350 focusChangeBlocked = true;
3347 goto SetFocusedElementDone; 3351 goto SetFocusedElementDone;
3348 } 3352 }
3349 // Set focus on the new node 3353 // Set focus on the new node
3350 m_focusedElement = newFocusedElement; 3354 m_focusedElement = newFocusedElement;
3351 3355
3352 // Dispatch the focus event and let the node do any other focus related activities (important for text fields) 3356 // Dispatch the focus event and let the node do any other focus related activities (important for text fields)
3353 m_focusedElement->dispatchFocusEvent(oldFocusedElement.get(), direction) ; 3357 // If page is unfocused, focus event will be dispatched on page focus, d on't duplicate
3358 if (page() && page()->focusController().isFocused()) {
3359 m_focusedElement->dispatchFocusEvent(oldFocusedElement.get(), direct ion);
3354 3360
3355 if (m_focusedElement != newFocusedElement) { 3361 if (m_focusedElement != newFocusedElement) {
3356 // handler shifted focus 3362 // handler shifted focus
3357 focusChangeBlocked = true; 3363 focusChangeBlocked = true;
3358 goto SetFocusedElementDone; 3364 goto SetFocusedElementDone;
3365 }
3366
3367 m_focusedElement->dispatchFocusInEvent(eventNames().focusinEvent, ol dFocusedElement.get()); // DOM level 3 bubbling focus event.
3368
3369 if (m_focusedElement != newFocusedElement) {
3370 // handler shifted focus
3371 focusChangeBlocked = true;
3372 goto SetFocusedElementDone;
3373 }
3374
3375 // FIXME: We should remove firing DOMFocusInEvent event when we are sure no content depends
3376 // on it, probably when <rdar://problem/8503958> is m.
3377 m_focusedElement->dispatchFocusInEvent(eventNames().DOMFocusInEvent, oldFocusedElement.get()); // DOM level 2 for compatibility.
3378
3379 if (m_focusedElement != newFocusedElement) {
3380 // handler shifted focus
3381 focusChangeBlocked = true;
3382 goto SetFocusedElementDone;
3383 }
3359 } 3384 }
3360 3385
3361 m_focusedElement->dispatchFocusInEvent(eventNames().focusinEvent, oldFoc usedElement.get()); // DOM level 3 bubbling focus event.
3362
3363 if (m_focusedElement != newFocusedElement) {
3364 // handler shifted focus
3365 focusChangeBlocked = true;
3366 goto SetFocusedElementDone;
3367 }
3368
3369 // FIXME: We should remove firing DOMFocusInEvent event when we are sure no content depends
3370 // on it, probably when <rdar://problem/8503958> is m.
3371 m_focusedElement->dispatchFocusInEvent(eventNames().DOMFocusInEvent, old FocusedElement.get()); // DOM level 2 for compatibility.
3372
3373 if (m_focusedElement != newFocusedElement) {
3374 // handler shifted focus
3375 focusChangeBlocked = true;
3376 goto SetFocusedElementDone;
3377 }
3378 m_focusedElement->setFocus(true); 3386 m_focusedElement->setFocus(true);
3379 3387
3380 if (m_focusedElement->isRootEditableElement()) 3388 if (m_focusedElement->isRootEditableElement())
3381 frame()->editor().didBeginEditing(m_focusedElement.get()); 3389 frame()->editor().didBeginEditing(m_focusedElement.get());
3382 3390
3383 // eww, I suck. set the qt focus correctly 3391 // eww, I suck. set the qt focus correctly
3384 // ### find a better place in the code for this 3392 // ### find a better place in the code for this
3385 if (view()) { 3393 if (view()) {
3386 Widget* focusWidget = widgetForElement(m_focusedElement.get()); 3394 Widget* focusWidget = widgetForElement(m_focusedElement.get());
3387 if (focusWidget) { 3395 if (focusWidget) {
(...skipping 1924 matching lines...) Expand 10 before | Expand all | Expand 10 after
5312 { 5320 {
5313 return DocumentLifecycleNotifier::create(this); 5321 return DocumentLifecycleNotifier::create(this);
5314 } 5322 }
5315 5323
5316 DocumentLifecycleNotifier* Document::lifecycleNotifier() 5324 DocumentLifecycleNotifier* Document::lifecycleNotifier()
5317 { 5325 {
5318 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier()); 5326 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier());
5319 } 5327 }
5320 5328
5321 } // namespace WebCore 5329 } // namespace WebCore
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698