Chromium Code Reviews| Index: Source/WebKit/chromium/src/WebFrameImpl.cpp |
| diff --git a/Source/WebKit/chromium/src/WebFrameImpl.cpp b/Source/WebKit/chromium/src/WebFrameImpl.cpp |
| index 849b55cd57bd9508a36e838157a401dbf93ba911..b6c122b9b2743f3939d8bf02333c19a0c94fe651 100644 |
| --- a/Source/WebKit/chromium/src/WebFrameImpl.cpp |
| +++ b/Source/WebKit/chromium/src/WebFrameImpl.cpp |
| @@ -85,6 +85,7 @@ |
| #include "DocumentMarkerController.h" |
| #include "Editor.h" |
| #include "EventHandler.h" |
| +#include "FocusController.h" |
| #include "FormState.h" |
| #include "FrameLoadRequest.h" |
| #include "FrameLoader.h" |
| @@ -98,6 +99,7 @@ |
| #include "HTMLLinkElement.h" |
| #include "HTMLNames.h" |
| #include "HistoryItem.h" |
| +#include "HitTestResult.h" |
| #include "InspectorController.h" |
| #include "Page.h" |
| #include "painting/GraphicsContextBuilder.h" |
| @@ -1112,10 +1114,29 @@ bool WebFrameImpl::firstRectForCharacterRange(unsigned location, unsigned length |
| return false; |
| IntRect intRect = frame()->editor()->firstRectForRange(range.get()); |
| rect = WebRect(intRect.x(), intRect.y(), intRect.width(), intRect.height()); |
| + // When inside an text control, don't adjust the range. |
| + if (!selectionRoot) |
| + rect = frame()->view()->contentsToWindow(rect); |
|
James Su
2011/03/03 04:08:03
IMHO, we should return frame based position in Web
Robert Sesek
2011/03/18 21:33:36
Why? That seems unnecessary and makes this CL more
|
| return true; |
| } |
| +unsigned WebFrameImpl::characterIndexForPoint(const WebPoint& webPoint) const |
| +{ |
| + if (!frame()) |
| + return notFound; |
| + |
| + IntPoint point = frame()->view()->windowToContents(webPoint); |
|
James Su
2011/03/03 04:08:03
Same as above.
|
| + HitTestResult result = frame()->eventHandler()->hitTestResultAtPoint(point, false); |
| + Range* range = characterRangeAtPoint(result.point()); |
| + if (!range) |
| + return notFound; |
| + |
| + unsigned location, length; |
| + getLocationAndLengthFromRange(range, location, length); |
| + return location; |
| +} |
| + |
| bool WebFrameImpl::executeCommand(const WebString& name) |
| { |
| ASSERT(frame()); |
| @@ -2274,4 +2295,61 @@ void WebFrameImpl::loadJavaScriptURL(const KURL& url) |
| m_frame->document()->loader()->writer()->replaceDocument(scriptResult); |
| } |
| +// This function is copied from /WebKit2/WebPage/mac/WebPageMac.mm. |
| +Range* WebFrameImpl::characterRangeAtPoint(const IntPoint& point) const |
| +{ |
| + VisiblePosition position = frame()->visiblePositionForPoint(point); |
| + if (position.isNull()) |
| + return NULL; |
| + |
| + VisiblePosition previous = position.previous(); |
| + if (previous.isNotNull()) { |
| + Range* previousCharacterRange = makeRange(previous, position).get(); |
| + IntRect rect = frame()->editor()->firstRectForRange(previousCharacterRange); |
| + if (rect.contains(point)) |
| + return previousCharacterRange; |
| + } |
| + |
| + VisiblePosition next = position.next(); |
| + if (next.isNotNull()) { |
| + Range* nextCharacterRange = makeRange(position, next).get(); |
| + IntRect rect = frame()->editor()->firstRectForRange(nextCharacterRange); |
| + if (rect.contains(point)) |
| + return nextCharacterRange; |
| + } |
| + |
| + return NULL; |
| +} |
| + |
| +// This function is copied from /WebKit2/WebPage/WebPage.cpp. |
| +bool WebFrameImpl::getLocationAndLengthFromRange(Range* range, unsigned& location, unsigned& length) const |
| +{ |
| + location = notFound; |
| + length = 0; |
| + |
| + if (!range || !range->startContainer()) |
| + return false; |
| + |
| + Element* selectionRoot = range->ownerDocument()->frame()->selection()->rootEditableElement(); |
| + Element* scope = selectionRoot ? selectionRoot : range->ownerDocument()->documentElement(); |
| + |
| + // Mouse events may cause TSM to attempt to create an NSRange for a portion of the view |
| + // that is not inside the current editable region. These checks ensure we don't produce |
| + // potentially invalid data when responding to such requests. |
| + if (range->startContainer() != scope && !range->startContainer()->isDescendantOf(scope)) |
| + return false; |
| + if (range->endContainer() != scope && !range->endContainer()->isDescendantOf(scope)) |
| + return false; |
| + |
| + RefPtr<Range> testRange = Range::create(scope->document(), scope, 0, range->startContainer(), range->startOffset()); |
| + ASSERT(testRange->startContainer() == scope); |
| + location = TextIterator::rangeLength(testRange.get()); |
| + |
| + ExceptionCode ec; |
| + testRange->setEnd(range->endContainer(), range->endOffset(), ec); |
| + ASSERT(testRange->startContainer() == scope); |
| + length = TextIterator::rangeLength(testRange.get()) - location; |
| + return true; |
| +} |
| + |
| } // namespace WebKit |