bool FocusController::setFocusedElement(Element* element, PassRefPtr<LocalFrame> newFocusedFrame, FocusType type) { RefPtr<LocalFrame> oldFocusedFrame = focusedFrame(); RefPtr<Document> oldDocument = oldFocusedFrame ? oldFocusedFrame->document() : 0; Element* oldFocusedElement = oldDocument ? oldDocument->focusedElement() : 0; if (element && oldFocusedElement == element) return true; // FIXME: Might want to disable this check for caretBrowsing if (oldFocusedElement && oldFocusedElement->isRootEditableElement() && !relinquishesEditingFocus(oldFocusedElement)) return false; RefPtr<Document> newDocument = nullptr; if (element) newDocument = &element->document(); else if (newFocusedFrame) newDocument = newFocusedFrame->document(); if (newDocument && oldDocument == newDocument && newDocument->focusedElement() == element) return true; if (oldDocument && oldDocument != newDocument) oldDocument->setFocusedElement(nullptr); if (newFocusedFrame && !newFocusedFrame->page()) { setFocusedFrame(nullptr); return false; } setFocusedFrame(newFocusedFrame); // Setting the focused node can result in losing our last reft to node when JS event handlers fire. RefPtr<Element> protect ALLOW_UNUSED = element; if (newDocument) { bool successfullyFocused = newDocument->setFocusedElement(element, type); if (!successfullyFocused) return false; } return true; }
bool FocusController::setFocusedNode(Node* node, PassRefPtr<Frame> newFocusedFrame) { RefPtr<Frame> oldFocusedFrame = focusedFrame(); RefPtr<Document> oldDocument = oldFocusedFrame ? oldFocusedFrame->document() : 0; Node* oldFocusedNode = oldDocument ? oldDocument->focusedNode() : 0; if (oldFocusedNode == node) return true; // FIXME: Might want to disable this check for caretBrowsing if (oldFocusedNode && oldFocusedNode->rootEditableElement() == oldFocusedNode && !relinquishesEditingFocus(oldFocusedNode)) return false; #if ENABLE(WKC_SPATIAL_NAVI) // Set input method state before changing the focused node, so that the // input method can still have a chance to finish the ongoing composition // session. m_page->editorClient()->setInputMethodState(node ? node->shouldUseInputMethod() : false); #endif clearSelectionIfNeeded(oldFocusedFrame.get(), newFocusedFrame.get(), node); if (!node) { if (oldDocument) oldDocument->setFocusedNode(0); #if ENABLE(WKC_SPATIAL_NAVI) #else m_page->editorClient()->setInputMethodState(false); #endif return true; } RefPtr<Document> newDocument = node->document(); if (newDocument && newDocument->focusedNode() == node) { #if ENABLE(WKC_SPATIAL_NAVI) #else m_page->editorClient()->setInputMethodState(node->shouldUseInputMethod()); #endif return true; } if (oldDocument && oldDocument != newDocument) oldDocument->setFocusedNode(0); setFocusedFrame(newFocusedFrame); #if 1 // added at webkit.org trunk r65748 // Setting the focused node can result in losing our last reft to node when JS event handlers fire. RefPtr<Node> protect = node; #endif if (newDocument) newDocument->setFocusedNode(node); #if ENABLE(WKC_SPATIAL_NAVI) // do nothing #else #if 1 // modified at webkit.org trunk r65748 if (newDocument->focusedNode() == node) m_page->editorClient()->setInputMethodState(node->shouldUseInputMethod()); #else m_page->editorClient()->setInputMethodState(node->shouldUseInputMethod()); #endif #endif return true; }