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

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

Issue 2797943002: Set plugin focus via element dispatch (Closed)
Patch Set: Set plugin focus after dispatching DOM events and making sure focus has not changed. Created 3 years, 8 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
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 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All
7 * rights reserved. 7 * rights reserved.
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
9 * (http://www.torchmobile.com/) 9 * (http://www.torchmobile.com/)
10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 // rule (d) above 368 // rule (d) above
369 WTF::Unicode::CharDecompositionType decompType = 369 WTF::Unicode::CharDecompositionType decompType =
370 WTF::Unicode::decompositionType(c); 370 WTF::Unicode::decompositionType(c);
371 if (decompType == WTF::Unicode::DecompositionFont || 371 if (decompType == WTF::Unicode::DecompositionFont ||
372 decompType == WTF::Unicode::DecompositionCompat) 372 decompType == WTF::Unicode::DecompositionCompat)
373 return false; 373 return false;
374 374
375 return true; 375 return true;
376 } 376 }
377 377
378 static FrameViewBase* frameViewBaseForElement(const Element& focusedElement) {
379 // Return either plugin or frame.
380 // TODO(joelhockey): FrameViewBase class will soon be removed. It will be
381 // replaced with Focusable ABC that FrameView and PluginView will implement
382 // and this method will return Focusable.
383 if (isHTMLPlugInElement(focusedElement))
384 return toHTMLPlugInElement(focusedElement).plugin();
385
386 LayoutObject* layoutObject = focusedElement.layoutObject();
387 if (!layoutObject || !layoutObject->isLayoutPart())
388 return 0;
389 return toLayoutPart(layoutObject)->frameViewBase();
390 }
391
392 static bool acceptsEditingFocus(const Element& element) { 378 static bool acceptsEditingFocus(const Element& element) {
393 DCHECK(hasEditableStyle(element)); 379 DCHECK(hasEditableStyle(element));
394 380
395 return element.document().frame() && rootEditableElement(element); 381 return element.document().frame() && rootEditableElement(element);
396 } 382 }
397 383
398 uint64_t Document::s_globalTreeVersion = 0; 384 uint64_t Document::s_globalTreeVersion = 0;
399 385
400 static bool s_threadedParsingEnabledForTesting = true; 386 static bool s_threadedParsingEnabledForTesting = true;
401 387
(...skipping 3644 matching lines...) Expand 10 before | Expand all | Expand 10 after
4046 // Remove focus from the existing focus node (if any) 4032 // Remove focus from the existing focus node (if any)
4047 if (oldFocusedElement) { 4033 if (oldFocusedElement) {
4048 oldFocusedElement->setFocused(false); 4034 oldFocusedElement->setFocused(false);
4049 4035
4050 // Dispatch the blur event and let the node do any other blur related 4036 // Dispatch the blur event and let the node do any other blur related
4051 // activities (important for text fields) 4037 // activities (important for text fields)
4052 // If page lost focus, blur event will have already been dispatched 4038 // If page lost focus, blur event will have already been dispatched
4053 if (page() && (page()->focusController().isFocused())) { 4039 if (page() && (page()->focusController().isFocused())) {
4054 oldFocusedElement->dispatchBlurEvent(newFocusedElement, params.type, 4040 oldFocusedElement->dispatchBlurEvent(newFocusedElement, params.type,
4055 params.sourceCapabilities); 4041 params.sourceCapabilities);
4056
4057 if (m_focusedElement) { 4042 if (m_focusedElement) {
4058 // handler shifted focus 4043 // handler shifted focus
4059 focusChangeBlocked = true; 4044 focusChangeBlocked = true;
4060 newFocusedElement = nullptr; 4045 newFocusedElement = nullptr;
4061 } 4046 }
4062 4047
4063 // 'focusout' is a DOM level 3 name for the bubbling blur event. 4048 // 'focusout' is a DOM level 3 name for the bubbling blur event.
4064 oldFocusedElement->dispatchFocusOutEvent(EventTypeNames::focusout, 4049 oldFocusedElement->dispatchFocusOutEvent(EventTypeNames::focusout,
4065 newFocusedElement, 4050 newFocusedElement,
4066 params.sourceCapabilities); 4051 params.sourceCapabilities);
4067 // 'DOMFocusOut' is a DOM level 2 name for compatibility. 4052 // 'DOMFocusOut' is a DOM level 2 name for compatibility.
4068 // FIXME: We should remove firing DOMFocusOutEvent event when we are sure 4053 // FIXME: We should remove firing DOMFocusOutEvent event when we are sure
4069 // no content depends on it, probably when <rdar://problem/8503958> is 4054 // no content depends on it, probably when <rdar://problem/8503958> is
4070 // resolved. 4055 // resolved.
4071 oldFocusedElement->dispatchFocusOutEvent(EventTypeNames::DOMFocusOut, 4056 oldFocusedElement->dispatchFocusOutEvent(EventTypeNames::DOMFocusOut,
4072 newFocusedElement, 4057 newFocusedElement,
4073 params.sourceCapabilities); 4058 params.sourceCapabilities);
4074 4059
4075 if (m_focusedElement) { 4060 if (m_focusedElement) {
4076 // handler shifted focus 4061 // handler shifted focus
4077 focusChangeBlocked = true; 4062 focusChangeBlocked = true;
4078 newFocusedElement = nullptr; 4063 newFocusedElement = nullptr;
4079 } 4064 }
4080 } 4065 }
4081 4066
4082 if (view()) { 4067 if (isHTMLPlugInElement(oldFocusedElement)) {
4083 FrameViewBase* oldFrameViewBase = 4068 if (PluginView* plugin = toHTMLPlugInElement(oldFocusedElement)->plugin())
4084 frameViewBaseForElement(*oldFocusedElement); 4069 plugin->setFocused(false, params.type);
4085 if (oldFrameViewBase)
4086 oldFrameViewBase->setFocused(false, params.type);
4087 else
4088 view()->setFocused(false, params.type);
4089 } 4070 }
4090 } 4071 }
4091 4072
4092 if (newFocusedElement) 4073 if (newFocusedElement)
4093 updateStyleAndLayoutTreeForNode(newFocusedElement); 4074 updateStyleAndLayoutTreeForNode(newFocusedElement);
4094 if (newFocusedElement && newFocusedElement->isFocusable()) { 4075 if (newFocusedElement && newFocusedElement->isFocusable()) {
4095 if (isRootEditableElement(*newFocusedElement) && 4076 if (isRootEditableElement(*newFocusedElement) &&
4096 !acceptsEditingFocus(*newFocusedElement)) { 4077 !acceptsEditingFocus(*newFocusedElement)) {
4097 // delegate blocks focus change 4078 // delegate blocks focus change
4098 focusChangeBlocked = true; 4079 focusChangeBlocked = true;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
4145 if (m_focusedElement != newFocusedElement) { 4126 if (m_focusedElement != newFocusedElement) {
4146 // handler shifted focus 4127 // handler shifted focus
4147 focusChangeBlocked = true; 4128 focusChangeBlocked = true;
4148 goto SetFocusedElementDone; 4129 goto SetFocusedElementDone;
4149 } 4130 }
4150 } 4131 }
4151 4132
4152 if (isRootEditableElement(*m_focusedElement)) 4133 if (isRootEditableElement(*m_focusedElement))
4153 frame()->spellChecker().didBeginEditing(m_focusedElement.get()); 4134 frame()->spellChecker().didBeginEditing(m_focusedElement.get());
4154 4135
4155 // eww, I suck. set the qt focus correctly 4136 if (isHTMLPlugInElement(m_focusedElement)) {
4156 // ### find a better place in the code for this 4137 if (PluginView* plugin = toHTMLPlugInElement(m_focusedElement)->plugin())
4157 if (view()) { 4138 plugin->setFocused(true, params.type);
4158 FrameViewBase* focusFrameViewBase =
4159 frameViewBaseForElement(*m_focusedElement);
4160 if (focusFrameViewBase) {
4161 // Make sure a FrameViewBase has the right size before giving it focus.
4162 // Otherwise, we are testing edge cases of the FrameViewBase code.
4163 // Specifically, in WebCore this does not work well for text fields.
4164 updateStyleAndLayout();
4165 // Re-get the FrameViewBase in case updating the layout changed things.
4166 focusFrameViewBase = frameViewBaseForElement(*m_focusedElement);
4167 }
4168 if (focusFrameViewBase)
4169 focusFrameViewBase->setFocused(true, params.type);
4170 else
4171 view()->setFocused(true, params.type);
4172 } 4139 }
4173 } 4140 }
4174 4141
4175 if (!focusChangeBlocked && m_focusedElement) { 4142 if (!focusChangeBlocked && m_focusedElement) {
4176 // Create the AXObject cache in a focus change because Chromium relies on 4143 // Create the AXObject cache in a focus change because Chromium relies on
4177 // it. 4144 // it.
4178 if (AXObjectCache* cache = axObjectCache()) 4145 if (AXObjectCache* cache = axObjectCache())
4179 cache->handleFocusedUIElementChanged(oldFocusedElement, 4146 cache->handleFocusedUIElementChanged(oldFocusedElement,
4180 newFocusedElement); 4147 newFocusedElement);
4181 } 4148 }
(...skipping 2469 matching lines...) Expand 10 before | Expand all | Expand 10 after
6651 } 6618 }
6652 6619
6653 void showLiveDocumentInstances() { 6620 void showLiveDocumentInstances() {
6654 WeakDocumentSet& set = liveDocumentSet(); 6621 WeakDocumentSet& set = liveDocumentSet();
6655 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); 6622 fprintf(stderr, "There are %u documents currently alive:\n", set.size());
6656 for (blink::Document* document : set) 6623 for (blink::Document* document : set)
6657 fprintf(stderr, "- Document %p URL: %s\n", document, 6624 fprintf(stderr, "- Document %p URL: %s\n", document,
6658 document->url().getString().utf8().data()); 6625 document->url().getString().utf8().data());
6659 } 6626 }
6660 #endif 6627 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698