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

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

Issue 2797943002: Set plugin focus via element dispatch (Closed)
Patch Set: Dispatch to DOM onblur/onfocus first, then call plugin 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
4082 if (view()) {
4083 FrameViewBase* oldFrameViewBase =
4084 frameViewBaseForElement(*oldFocusedElement);
4085 if (oldFrameViewBase)
4086 oldFrameViewBase->setFocused(false, params.type);
4087 else
4088 view()->setFocused(false, params.type);
4089 }
4090 } 4066 }
4091 4067
4092 if (newFocusedElement) 4068 if (newFocusedElement)
4093 updateStyleAndLayoutTreeForNode(newFocusedElement); 4069 updateStyleAndLayoutTreeForNode(newFocusedElement);
4094 if (newFocusedElement && newFocusedElement->isFocusable()) { 4070 if (newFocusedElement && newFocusedElement->isFocusable()) {
4095 if (isRootEditableElement(*newFocusedElement) && 4071 if (isRootEditableElement(*newFocusedElement) &&
4096 !acceptsEditingFocus(*newFocusedElement)) { 4072 !acceptsEditingFocus(*newFocusedElement)) {
4097 // delegate blocks focus change 4073 // delegate blocks focus change
4098 focusChangeBlocked = true; 4074 focusChangeBlocked = true;
4099 goto SetFocusedElementDone; 4075 goto SetFocusedElementDone;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4144 4120
4145 if (m_focusedElement != newFocusedElement) { 4121 if (m_focusedElement != newFocusedElement) {
4146 // handler shifted focus 4122 // handler shifted focus
4147 focusChangeBlocked = true; 4123 focusChangeBlocked = true;
4148 goto SetFocusedElementDone; 4124 goto SetFocusedElementDone;
4149 } 4125 }
4150 } 4126 }
4151 4127
4152 if (isRootEditableElement(*m_focusedElement)) 4128 if (isRootEditableElement(*m_focusedElement))
4153 frame()->spellChecker().didBeginEditing(m_focusedElement.get()); 4129 frame()->spellChecker().didBeginEditing(m_focusedElement.get());
4154
4155 // eww, I suck. set the qt focus correctly
4156 // ### find a better place in the code for this
4157 if (view()) {
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 }
4173 } 4130 }
4174 4131
4175 if (!focusChangeBlocked && m_focusedElement) { 4132 if (!focusChangeBlocked && m_focusedElement) {
4176 // Create the AXObject cache in a focus change because Chromium relies on 4133 // Create the AXObject cache in a focus change because Chromium relies on
4177 // it. 4134 // it.
4178 if (AXObjectCache* cache = axObjectCache()) 4135 if (AXObjectCache* cache = axObjectCache())
4179 cache->handleFocusedUIElementChanged(oldFocusedElement, 4136 cache->handleFocusedUIElementChanged(oldFocusedElement,
4180 newFocusedElement); 4137 newFocusedElement);
4181 } 4138 }
4182 4139
(...skipping 2468 matching lines...) Expand 10 before | Expand all | Expand 10 after
6651 } 6608 }
6652 6609
6653 void showLiveDocumentInstances() { 6610 void showLiveDocumentInstances() {
6654 WeakDocumentSet& set = liveDocumentSet(); 6611 WeakDocumentSet& set = liveDocumentSet();
6655 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); 6612 fprintf(stderr, "There are %u documents currently alive:\n", set.size());
6656 for (blink::Document* document : set) 6613 for (blink::Document* document : set)
6657 fprintf(stderr, "- Document %p URL: %s\n", document, 6614 fprintf(stderr, "- Document %p URL: %s\n", document,
6658 document->url().getString().utf8().data()); 6615 document->url().getString().utf8().data());
6659 } 6616 }
6660 #endif 6617 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698