Chromium Code Reviews| Index: Source/web/WebViewImpl.cpp |
| diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp |
| index 42857729789e1f6301438c0e88742060f96b5778..99d5d87b01f731c762cf2f0c614551a3ec176649 100644 |
| --- a/Source/web/WebViewImpl.cpp |
| +++ b/Source/web/WebViewImpl.cpp |
| @@ -518,18 +518,23 @@ void WebViewImpl::mouseContextMenu(const WebMouseEvent& event) |
| // Find the right target frame. See issue 1186900. |
| HitTestResult result = hitTestResultForWindowPos(pme.position()); |
| - LocalFrame* targetFrame; |
| + Frame* targetFrame; |
| if (result.innerNonSharedNode()) |
| targetFrame = result.innerNonSharedNode()->document().frame(); |
| else |
| targetFrame = m_page->focusController().focusedOrMainFrame(); |
| + if (!targetFrame->isLocalFrame()) |
| + return; |
| + |
| + LocalFrame* targetLocalFrame = toLocalFrame(targetFrame); |
| + |
| #if OS(WIN) |
| - targetFrame->view()->setCursor(pointerCursor()); |
| + targetLocalFrame->view()->setCursor(pointerCursor()); |
| #endif |
| m_contextMenuAllowed = true; |
| - targetFrame->eventHandler().sendContextMenuEvent(pme); |
| + targetLocalFrame->eventHandler().sendContextMenuEvent(pme); |
| m_contextMenuAllowed = false; |
| // Actually showing the context menu is handled by the ContextMenuClient |
| // implementation... |
| @@ -870,7 +875,8 @@ bool WebViewImpl::handleKeyEvent(const WebKeyboardEvent& event) |
| return true; |
| } |
| - RefPtr<LocalFrame> frame = focusedWebCoreFrame(); |
| + // TODO(kenrb): Handle the remote frame case. Possibly move eventHandler() to Frame? |
| + RefPtr<LocalFrame> frame = toLocalFrame(focusedWebCoreFrame()); |
| if (!frame) |
| return false; |
| @@ -925,7 +931,7 @@ bool WebViewImpl::handleCharEvent(const WebKeyboardEvent& event) |
| if (m_pagePopup) |
| return m_pagePopup->handleKeyEvent(PlatformKeyboardEventBuilder(event)); |
| - LocalFrame* frame = focusedWebCoreFrame(); |
| + LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); |
| if (!frame) |
| return suppress; |
| @@ -1270,8 +1276,10 @@ bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) |
| page()->contextMenuController().clearContextMenu(); |
| m_contextMenuAllowed = true; |
| - LocalFrame* focusedFrame = page()->focusController().focusedOrMainFrame(); |
| - bool handled = focusedFrame->eventHandler().sendContextMenuEventForKey(); |
| + Frame* focusedFrame = page()->focusController().focusedOrMainFrame(); |
| + if (!focusedFrame->isLocalFrame()) |
| + return false; |
| + bool handled = toLocalFrame(focusedFrame)->eventHandler().sendContextMenuEventForKey(); |
| m_contextMenuAllowed = false; |
| return handled; |
| } |
| @@ -1279,7 +1287,7 @@ bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event) |
| bool WebViewImpl::keyEventDefault(const WebKeyboardEvent& event) |
| { |
| - LocalFrame* frame = focusedWebCoreFrame(); |
| + LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); |
|
dcheng
2014/03/17 18:17:44
Hmm... is focusedWebCoreFrame() eventually going t
kenrb
2014/03/18 20:01:19
I don't know. There might be reasons to return foc
|
| if (!frame) |
| return false; |
| @@ -1392,7 +1400,7 @@ void WebViewImpl::hideSelectPopup() |
| bool WebViewImpl::bubblingScroll(ScrollDirection scrollDirection, ScrollGranularity scrollGranularity) |
| { |
| - LocalFrame* frame = focusedWebCoreFrame(); |
| + LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); |
| if (!frame) |
| return false; |
| @@ -1445,7 +1453,7 @@ void WebViewImpl::closePagePopup(PagePopup* popup) |
| m_pagePopup = nullptr; |
| } |
| -LocalFrame* WebViewImpl::focusedWebCoreFrame() const |
| +Frame* WebViewImpl::focusedWebCoreFrame() const |
| { |
| return m_page ? m_page->focusController().focusedOrMainFrame() : 0; |
| } |
| @@ -1825,10 +1833,11 @@ void WebViewImpl::setFocus(bool enable) |
| m_page->focusController().setFocused(enable); |
| if (enable) { |
| m_page->focusController().setActive(true); |
| - RefPtr<LocalFrame> focusedFrame = m_page->focusController().focusedFrame(); |
| - if (focusedFrame) { |
| - Element* element = focusedFrame->document()->focusedElement(); |
| - if (element && focusedFrame->selection().selection().isNone()) { |
| + RefPtr<Frame> focusedFrame = m_page->focusController().focusedFrame(); |
| + if (focusedFrame && focusedFrame->isLocalFrame()) { |
| + LocalFrame* localFrame = toLocalFrame(focusedFrame.get()); |
| + Element* element = localFrame->document()->focusedElement(); |
| + if (element && localFrame->selection().selection().isNone()) { |
| // If the selection was cleared while the WebView was not |
| // focused, then the focus element shows with a focus ring but |
| // no caret and does respond to keyboard inputs. |
| @@ -1840,7 +1849,7 @@ void WebViewImpl::setFocus(bool enable) |
| // instead. Note that this has the side effect of moving the |
| // caret back to the beginning of the text. |
| Position position(element, 0, Position::PositionIsOffsetInAnchor); |
| - focusedFrame->selection().setSelection(VisibleSelection(position, SEL_DEFAULT_AFFINITY)); |
| + localFrame->selection().setSelection(VisibleSelection(position, SEL_DEFAULT_AFFINITY)); |
| } |
| } |
| } |
| @@ -1856,14 +1865,14 @@ void WebViewImpl::setFocus(bool enable) |
| if (!frame) |
| return; |
| - RefPtr<LocalFrame> focusedFrame = m_page->focusController().focusedFrame(); |
| - if (focusedFrame) { |
| + RefPtr<Frame> focusedFrame = m_page->focusController().focusedFrame(); |
| + if (focusedFrame && focusedFrame->isLocalFrame()) { |
| // Finish an ongoing composition to delete the composition node. |
| - if (focusedFrame->inputMethodController().hasComposition()) { |
| + if (toLocalFrame(focusedFrame.get())->inputMethodController().hasComposition()) { |
| if (m_autofillClient) |
| m_autofillClient->setIgnoreTextChanges(true); |
| - focusedFrame->inputMethodController().confirmComposition(); |
| + toLocalFrame(focusedFrame.get())->inputMethodController().confirmComposition(); |
| if (m_autofillClient) |
| m_autofillClient->setIgnoreTextChanges(false); |
| @@ -1879,7 +1888,7 @@ bool WebViewImpl::setComposition( |
| int selectionStart, |
| int selectionEnd) |
| { |
| - LocalFrame* focused = focusedWebCoreFrame(); |
| + LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused || !m_imeAcceptEvents) |
| return false; |
| @@ -1945,7 +1954,7 @@ bool WebViewImpl::confirmComposition(const WebString& text) |
| bool WebViewImpl::confirmComposition(const WebString& text, ConfirmCompositionBehavior selectionBehavior) |
| { |
| - LocalFrame* focused = focusedWebCoreFrame(); |
| + LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused || !m_imeAcceptEvents) |
| return false; |
| @@ -1957,7 +1966,7 @@ bool WebViewImpl::confirmComposition(const WebString& text, ConfirmCompositionBe |
| bool WebViewImpl::compositionRange(size_t* location, size_t* length) |
| { |
| - LocalFrame* focused = focusedWebCoreFrame(); |
| + LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused || !m_imeAcceptEvents) |
| return false; |
| @@ -1979,7 +1988,7 @@ WebTextInputInfo WebViewImpl::textInputInfo() |
| { |
| WebTextInputInfo info; |
| - LocalFrame* focused = focusedWebCoreFrame(); |
| + LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return info; |
| @@ -2105,7 +2114,7 @@ WebString WebViewImpl::inputModeOfFocusedElement() |
| bool WebViewImpl::selectionBounds(WebRect& anchor, WebRect& focus) const |
| { |
| - const LocalFrame* frame = focusedWebCoreFrame(); |
| + const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); |
| if (!frame) |
| return false; |
| FrameSelection& selection = frame->selection(); |
| @@ -2149,7 +2158,7 @@ InputMethodContext* WebViewImpl::inputMethodContext() |
| if (!m_imeAcceptEvents) |
| return 0; |
| - LocalFrame* focusedFrame = focusedWebCoreFrame(); |
| + LocalFrame* focusedFrame = toLocalFrame(focusedWebCoreFrame()); |
| if (!focusedFrame) |
| return 0; |
| @@ -2188,7 +2197,7 @@ void WebViewImpl::didHideCandidateWindow() |
| bool WebViewImpl::selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const |
| { |
| - const LocalFrame* frame = focusedWebCoreFrame(); |
| + const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); |
| if (!frame) |
| return false; |
| FrameSelection& selection = frame->selection(); |
| @@ -2201,14 +2210,14 @@ bool WebViewImpl::selectionTextDirection(WebTextDirection& start, WebTextDirecti |
| bool WebViewImpl::isSelectionAnchorFirst() const |
| { |
| - if (const LocalFrame* frame = focusedWebCoreFrame()) |
| + if (const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame())) |
| return frame->selection().selection().isBaseFirst(); |
| return false; |
| } |
| bool WebViewImpl::setEditableSelectionOffsets(int start, int end) |
| { |
| - const LocalFrame* focused = focusedWebCoreFrame(); |
| + const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return false; |
| return focused->inputMethodController().setEditableSelectionOffsets(PlainTextRange(start, end)); |
| @@ -2216,7 +2225,7 @@ bool WebViewImpl::setEditableSelectionOffsets(int start, int end) |
| bool WebViewImpl::setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines) |
| { |
| - const LocalFrame* focused = focusedWebCoreFrame(); |
| + const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return false; |
| @@ -2236,7 +2245,7 @@ bool WebViewImpl::setCompositionFromExistingText(int compositionStart, int compo |
| WebVector<WebCompositionUnderline> WebViewImpl::compositionUnderlines() const |
| { |
| - const LocalFrame* focused = focusedWebCoreFrame(); |
| + const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return WebVector<WebCompositionUnderline>(); |
| const Vector<CompositionUnderline>& underlines = focused->inputMethodController().customCompositionUnderlines(); |
| @@ -2250,7 +2259,7 @@ WebVector<WebCompositionUnderline> WebViewImpl::compositionUnderlines() const |
| void WebViewImpl::extendSelectionAndDelete(int before, int after) |
| { |
| - LocalFrame* focused = focusedWebCoreFrame(); |
| + LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return; |
| if (WebPlugin* plugin = focusedPluginIfInputMethodSupported(focused)) { |
| @@ -2262,7 +2271,7 @@ void WebViewImpl::extendSelectionAndDelete(int before, int after) |
| bool WebViewImpl::isSelectionEditable() const |
| { |
| - if (const LocalFrame* frame = focusedWebCoreFrame()) |
| + if (const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame())) |
| return frame->selection().isContentEditable(); |
| return false; |
| } |
| @@ -2281,7 +2290,7 @@ WebColor WebViewImpl::backgroundColor() const |
| bool WebViewImpl::caretOrSelectionRange(size_t* location, size_t* length) |
| { |
| - const LocalFrame* focused = focusedWebCoreFrame(); |
| + const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return false; |
| @@ -2300,7 +2309,7 @@ void WebViewImpl::setTextDirection(WebTextDirection direction) |
| // the text direction of the selected node and updates its DOM "dir" |
| // attribute and its CSS "direction" property. |
| // So, we just call the function as Safari does. |
| - const LocalFrame* focused = focusedWebCoreFrame(); |
| + const LocalFrame* focused = toLocalFrame(focusedWebCoreFrame()); |
| if (!focused) |
| return; |
| @@ -2437,15 +2446,16 @@ WebFrame* WebViewImpl::findFrameByName( |
| WebFrame* WebViewImpl::focusedFrame() |
| { |
| - return WebFrameImpl::fromFrame(focusedWebCoreFrame()); |
| + return WebFrameImpl::fromFrame(toLocalFrame(focusedWebCoreFrame())); |
| } |
| void WebViewImpl::setFocusedFrame(WebFrame* frame) |
| { |
| if (!frame) { |
| // Clears the focused frame if any. |
| - if (LocalFrame* focusedFrame = focusedWebCoreFrame()) |
| - focusedFrame->selection().setFocused(false); |
| + Frame* focusedFrame = focusedWebCoreFrame(); |
| + if (focusedFrame && focusedFrame->isLocalFrame()) |
| + toLocalFrame(focusedFrame)->selection().setFocused(false); |
| return; |
| } |
| LocalFrame* webcoreFrame = toWebFrameImpl(frame)->frame(); |
| @@ -2456,19 +2466,23 @@ void WebViewImpl::setInitialFocus(bool reverse) |
| { |
| if (!m_page) |
| return; |
| - LocalFrame* frame = page()->focusController().focusedOrMainFrame(); |
| - if (Document* document = frame->document()) |
| - document->setFocusedElement(nullptr); |
| + Frame* frame = page()->focusController().focusedOrMainFrame(); |
| + if (frame->isLocalFrame()) { |
| + if (Document* document = toLocalFrame(frame)->document()) |
| + document->setFocusedElement(nullptr); |
| + } |
| page()->focusController().setInitialFocus(reverse ? FocusTypeBackward : FocusTypeForward); |
| } |
| void WebViewImpl::clearFocusedElement() |
| { |
| - RefPtr<LocalFrame> frame = focusedWebCoreFrame(); |
| - if (!frame) |
| + RefPtr<Frame> frame = focusedWebCoreFrame(); |
| + if (!frame || !frame->isLocalFrame()) |
| return; |
| - RefPtr<Document> document = frame->document(); |
| + LocalFrame* localFrame = toLocalFrame(frame.get()); |
| + |
| + RefPtr<Document> document = localFrame->document(); |
| if (!document) |
| return; |
| @@ -2485,7 +2499,7 @@ void WebViewImpl::clearFocusedElement() |
| // processing keyboard events even though focus has been moved to the page and |
| // keystrokes get eaten as a result. |
| if (oldFocusedElement->isContentEditable() || oldFocusedElement->isTextFormControl()) |
| - frame->selection().clear(); |
| + localFrame->selection().clear(); |
| } |
| void WebViewImpl::scrollFocusedNodeIntoView() |
| @@ -3320,14 +3334,14 @@ void WebViewImpl::showContextMenu() |
| page()->contextMenuController().clearContextMenu(); |
| m_contextMenuAllowed = true; |
| - if (LocalFrame* focusedFrame = page()->focusController().focusedOrMainFrame()) |
| + if (LocalFrame* focusedFrame = toLocalFrame(page()->focusController().focusedOrMainFrame())) |
| focusedFrame->eventHandler().sendContextMenuEventForKey(); |
| m_contextMenuAllowed = false; |
| } |
| WebString WebViewImpl::getSmartClipData(WebRect rect) |
| { |
| - LocalFrame* frame = focusedWebCoreFrame(); |
| + LocalFrame* frame = toLocalFrame(focusedWebCoreFrame()); |
| if (!frame) |
| return WebString(); |
| return WebCore::SmartClip(frame).dataForRect(rect).toString(); |
| @@ -3560,11 +3574,11 @@ NotificationPresenterImpl* WebViewImpl::notificationPresenterImpl() |
| Element* WebViewImpl::focusedElement() const |
| { |
| - LocalFrame* frame = m_page->focusController().focusedFrame(); |
| - if (!frame) |
| + Frame* frame = m_page->focusController().focusedFrame(); |
| + if (!frame || !frame->isLocalFrame()) |
| return 0; |
| - Document* document = frame->document(); |
| + Document* document = toLocalFrame(frame)->document(); |
| if (!document) |
| return 0; |