Diff
Modified: trunk/Source/WebKit/ChangeLog (242319 => 242320)
--- trunk/Source/WebKit/ChangeLog 2019-03-02 22:57:18 UTC (rev 242319)
+++ trunk/Source/WebKit/ChangeLog 2019-03-03 00:02:34 UTC (rev 242320)
@@ -1,3 +1,28 @@
+2019-03-02 Tim Horton <[email protected]>
+
+ Move EditingRange <-> Range methods to EditingRange instead of WebPage
+ https://bugs.webkit.org/show_bug.cgi?id=195201
+
+ Reviewed by Sam Weinig.
+
+ * Shared/EditingRange.h:
+ * Shared/EditingRange.cpp:
+ Also, modernize the coders.
+
+ * Sources.txt:
+ * WebKit.xcodeproj/project.pbxproj:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::insertTextAsync):
+ (WebKit::WebPage::getMarkedRangeAsync):
+ (WebKit::WebPage::getSelectedRangeAsync):
+ (WebKit::WebPage::characterIndexForPointAsync):
+ (WebKit::WebPage::firstRectForCharacterRangeAsync):
+ (WebKit::WebPage::setCompositionAsync):
+ (WebKit::WebPage::rangeFromEditingRange): Deleted.
+ * WebProcess/WebPage/mac/WebPageMac.mm:
+ (WebKit::WebPage::insertDictatedTextAsync):
+ (WebKit::WebPage::attributedSubstringForCharacterRangeAsync):
+
2019-03-02 Wenson Hsieh <[email protected]>
[iOS] Programmatic paste access should be granted when copying and pasting within the same origin
Added: trunk/Source/WebKit/Shared/EditingRange.cpp (0 => 242320)
--- trunk/Source/WebKit/Shared/EditingRange.cpp (rev 0)
+++ trunk/Source/WebKit/Shared/EditingRange.cpp 2019-03-03 00:02:34 UTC (rev 242320)
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "EditingRange.h"
+
+#include <WebCore/Frame.h>
+#include <WebCore/FrameSelection.h>
+#include <WebCore/TextIterator.h>
+#include <WebCore/VisibleUnits.h>
+
+namespace WebKit {
+
+RefPtr<WebCore::Range> EditingRange::toRange(WebCore::Frame& frame, const EditingRange& range, EditingRangeIsRelativeTo editingRangeIsRelativeTo)
+{
+ ASSERT(range.location != notFound);
+
+ // Sanitize the input, because TextIterator::rangeFromLocationAndLength takes signed integers.
+ if (range.location > INT_MAX)
+ return nullptr;
+ int length;
+ if (range.length <= INT_MAX && range.location + range.length <= INT_MAX)
+ length = static_cast<int>(range.length);
+ else
+ length = INT_MAX - range.location;
+
+ if (editingRangeIsRelativeTo == EditingRangeIsRelativeTo::EditableRoot) {
+ // Our critical assumption is that this code path is called by input methods that
+ // concentrate on a given area containing the selection.
+ // We have to do this because of text fields and textareas. The DOM for those is not
+ // directly in the document DOM, so serialization is problematic. Our solution is
+ // to use the root editable element of the selection start as the positional base.
+ // That fits with AppKit's idea of an input context.
+ return WebCore::TextIterator::rangeFromLocationAndLength(frame.selection().rootEditableElementOrDocumentElement(), static_cast<int>(range.location), length);
+ }
+
+ ASSERT(editingRangeIsRelativeTo == EditingRangeIsRelativeTo::Paragraph);
+
+ const WebCore::VisibleSelection& selection = frame.selection().selection();
+ RefPtr<WebCore::Range> selectedRange = selection.toNormalizedRange();
+ if (!selectedRange)
+ return nullptr;
+
+ RefPtr<WebCore::Range> paragraphRange = makeRange(startOfParagraph(selection.visibleStart()), selection.visibleEnd());
+ if (!paragraphRange)
+ return nullptr;
+
+ WebCore::ContainerNode& rootNode = paragraphRange.get()->startContainer().treeScope().rootNode();
+ int paragraphStartIndex = WebCore::TextIterator::rangeLength(WebCore::Range::create(rootNode.document(), &rootNode, 0, ¶graphRange->startContainer(), paragraphRange->startOffset()).ptr());
+ return WebCore::TextIterator::rangeFromLocationAndLength(&rootNode, paragraphStartIndex + static_cast<int>(range.location), length);
+}
+
+EditingRange EditingRange::fromRange(WebCore::Frame& frame, const WebCore::Range* range, EditingRangeIsRelativeTo editingRangeIsRelativeTo)
+{
+ ASSERT(editingRangeIsRelativeTo == EditingRangeIsRelativeTo::EditableRoot);
+
+ size_t location;
+ size_t length;
+ if (!range || !WebCore::TextIterator::getLocationAndLengthFromRange(frame.selection().rootEditableElementOrDocumentElement(), range, location, length))
+ return { };
+
+ EditingRange editingRange(location, length);
+ if (!editingRange.isValid())
+ return { };
+
+ return editingRange;
+}
+
+} // namespace WebKit
+
+namespace IPC {
+
+void ArgumentCoder<WebKit::EditingRange>::encode(Encoder& encoder, const WebKit::EditingRange& editingRange)
+{
+ encoder << editingRange.location;
+ encoder << editingRange.length;
+}
+
+Optional<WebKit::EditingRange> ArgumentCoder<WebKit::EditingRange>::decode(Decoder& decoder)
+{
+ WebKit::EditingRange editingRange;
+
+ if (!decoder.decode(editingRange.location))
+ return WTF::nullopt;
+ if (!decoder.decode(editingRange.length))
+ return WTF::nullopt;
+
+ return editingRange;
+}
+
+} // namespace IPC
Modified: trunk/Source/WebKit/Shared/EditingRange.h (242319 => 242320)
--- trunk/Source/WebKit/Shared/EditingRange.h 2019-03-02 22:57:18 UTC (rev 242319)
+++ trunk/Source/WebKit/Shared/EditingRange.h 2019-03-03 00:02:34 UTC (rev 242320)
@@ -23,11 +23,16 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef EditingRange_h
-#define EditingRange_h
+#pragma once
#include "ArgumentCoders.h"
+#include <wtf/RefPtr.h>
+namespace WebCore {
+class Frame;
+class Range;
+}
+
namespace WebKit {
enum class EditingRangeIsRelativeTo : uint8_t {
@@ -51,6 +56,9 @@
// (notFound, 0) is notably valid.
bool isValid() const { return location + length >= location; }
+ static RefPtr<WebCore::Range> toRange(WebCore::Frame&, const EditingRange&, EditingRangeIsRelativeTo = EditingRangeIsRelativeTo::EditableRoot);
+ static EditingRange fromRange(WebCore::Frame&, const WebCore::Range*, EditingRangeIsRelativeTo = EditingRangeIsRelativeTo::EditableRoot);
+
#if defined(__OBJC__)
EditingRange(NSRange range)
{
@@ -78,7 +86,8 @@
}
namespace IPC {
-template<> struct ArgumentCoder<WebKit::EditingRange> : SimpleArgumentCoder<WebKit::EditingRange> { };
+template<> struct ArgumentCoder<WebKit::EditingRange> {
+ static void encode(Encoder&, const WebKit::EditingRange&);
+ static Optional<WebKit::EditingRange> decode(Decoder&);
+};
}
-
-#endif // EditingRange_h
Modified: trunk/Source/WebKit/Sources.txt (242319 => 242320)
--- trunk/Source/WebKit/Sources.txt 2019-03-02 22:57:18 UTC (rev 242319)
+++ trunk/Source/WebKit/Sources.txt 2019-03-03 00:02:34 UTC (rev 242320)
@@ -106,6 +106,7 @@
Shared/BlobDataFileReferenceWithSandboxExtension.cpp @no-unify
Shared/CacheModel.cpp
Shared/ContextMenuContextData.cpp
+Shared/EditingRange.cpp
Shared/EditorState.cpp
Shared/FontInfo.cpp
Shared/FrameInfoData.cpp
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (242319 => 242320)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2019-03-02 22:57:18 UTC (rev 242319)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2019-03-03 00:02:34 UTC (rev 242320)
@@ -2723,6 +2723,7 @@
2D8786221BDB58FF00D02ABB /* APIUserStyleSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIUserStyleSheet.h; sourceTree = "<group>"; };
2D8949EE182044F600E898AA /* PlatformCALayerRemoteTiledBacking.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlatformCALayerRemoteTiledBacking.cpp; sourceTree = "<group>"; };
2D8949EF182044F600E898AA /* PlatformCALayerRemoteTiledBacking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformCALayerRemoteTiledBacking.h; sourceTree = "<group>"; };
+ 2D9CD5EE21FA75EE0029ACFA /* EditingRange.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditingRange.cpp; sourceTree = "<group>"; };
2D9EA30C1A96CB59002D2807 /* WKPageInjectedBundleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPageInjectedBundleClient.h; sourceTree = "<group>"; };
2D9EA30E1A96CBFF002D2807 /* WebPageInjectedBundleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebPageInjectedBundleClient.h; sourceTree = "<group>"; };
2D9EA3101A96D9EB002D2807 /* WebPageInjectedBundleClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebPageInjectedBundleClient.cpp; sourceTree = "<group>"; };
@@ -5026,6 +5027,7 @@
99F642D21FABE378009621E9 /* CoordinateSystem.h */,
C517388012DF8F4F00EE3F47 /* DragControllerAction.h */,
0FB659221208B4DB0044816C /* DrawingAreaInfo.h */,
+ 2D9CD5EE21FA75EE0029ACFA /* EditingRange.cpp */,
E105FE5318D7B9DE008F57A8 /* EditingRange.h */,
8CFECE931490F140002AAA32 /* EditorState.cpp */,
1AA41AB412C02EC4002BE67B /* EditorState.h */,
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (242319 => 242320)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2019-03-02 22:57:18 UTC (rev 242319)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2019-03-03 00:02:34 UTC (rev 242320)
@@ -5045,7 +5045,7 @@
bool replacesText = false;
if (replacementEditingRange.location != notFound) {
- if (auto replacementRange = rangeFromEditingRange(frame, replacementEditingRange, static_cast<EditingRangeIsRelativeTo>(editingRangeIsRelativeTo))) {
+ if (auto replacementRange = EditingRange::toRange(frame, replacementEditingRange, static_cast<EditingRangeIsRelativeTo>(editingRangeIsRelativeTo))) {
SetForScope<bool> isSelectingTextWhileInsertingAsynchronously(m_isSelectingTextWhileInsertingAsynchronously, suppressSelectionUpdate);
frame.selection().setSelection(VisibleSelection(*replacementRange, SEL_DEFAULT_AFFINITY));
replacesText = replacementEditingRange.length;
@@ -5066,49 +5066,25 @@
void WebPage::getMarkedRangeAsync(CallbackID callbackID)
{
Frame& frame = m_page->focusController().focusedOrMainFrame();
-
- RefPtr<Range> range = frame.editor().compositionRange();
- size_t location;
- size_t length;
- if (!range || !TextIterator::getLocationAndLengthFromRange(frame.selection().rootEditableElementOrDocumentElement(), range.get(), location, length)) {
- location = notFound;
- length = 0;
- }
-
- send(Messages::WebPageProxy::EditingRangeCallback(EditingRange(location, length), callbackID));
+ auto editingRange = EditingRange::fromRange(frame, frame.editor().compositionRange().get());
+ send(Messages::WebPageProxy::EditingRangeCallback(editingRange, callbackID));
}
void WebPage::getSelectedRangeAsync(CallbackID callbackID)
{
Frame& frame = m_page->focusController().focusedOrMainFrame();
-
- size_t location;
- size_t length;
- RefPtr<Range> range = frame.selection().toNormalizedRange();
- if (!range || !TextIterator::getLocationAndLengthFromRange(frame.selection().rootEditableElementOrDocumentElement(), range.get(), location, length)) {
- location = notFound;
- length = 0;
- }
-
- send(Messages::WebPageProxy::EditingRangeCallback(EditingRange(location, length), callbackID));
+ auto editingRange = EditingRange::fromRange(frame, frame.selection().toNormalizedRange().get());
+ send(Messages::WebPageProxy::EditingRangeCallback(editingRange, callbackID));
}
void WebPage::characterIndexForPointAsync(const WebCore::IntPoint& point, CallbackID callbackID)
{
- uint64_t index = notFound;
-
HitTestResult result = m_page->mainFrame().eventHandler().hitTestResultAtPoint(point);
Frame* frame = result.innerNonSharedNode() ? result.innerNodeFrame() : &m_page->focusController().focusedOrMainFrame();
RefPtr<Range> range = frame->rangeForPoint(result.roundedPointInInnerNodeFrame());
- if (range) {
- size_t location;
- size_t length;
- if (TextIterator::getLocationAndLengthFromRange(frame->selection().rootEditableElementOrDocumentElement(), range.get(), location, length))
- index = static_cast<uint64_t>(location);
- }
-
- send(Messages::WebPageProxy::UnsignedCallback(index, callbackID));
+ auto editingRange = EditingRange::fromRange(*frame, range.get());
+ send(Messages::WebPageProxy::UnsignedCallback(static_cast<uint64_t>(editingRange.location), callbackID));
}
void WebPage::firstRectForCharacterRangeAsync(const EditingRange& editingRange, CallbackID callbackID)
@@ -5116,7 +5092,7 @@
Frame& frame = m_page->focusController().focusedOrMainFrame();
IntRect result(IntPoint(0, 0), IntSize(0, 0));
- RefPtr<Range> range = rangeFromEditingRange(frame, editingRange);
+ RefPtr<Range> range = EditingRange::toRange(frame, editingRange);
if (!range) {
send(Messages::WebPageProxy::RectForCharacterRangeCallback(result, EditingRange(notFound, 0), callbackID));
return;
@@ -5135,7 +5111,7 @@
if (frame.selection().selection().isContentEditable()) {
RefPtr<Range> replacementRange;
if (replacementEditingRange.location != notFound) {
- replacementRange = rangeFromEditingRange(frame, replacementEditingRange);
+ replacementRange = EditingRange::toRange(frame, replacementEditingRange);
if (replacementRange)
frame.selection().setSelection(VisibleSelection(*replacementRange, SEL_DEFAULT_AFFINITY));
}
@@ -6122,45 +6098,6 @@
#endif
}
-RefPtr<WebCore::Range> WebPage::rangeFromEditingRange(WebCore::Frame& frame, const EditingRange& range, EditingRangeIsRelativeTo editingRangeIsRelativeTo)
-{
- ASSERT(range.location != notFound);
-
- // Sanitize the input, because TextIterator::rangeFromLocationAndLength takes signed integers.
- if (range.location > INT_MAX)
- return 0;
- int length;
- if (range.length <= INT_MAX && range.location + range.length <= INT_MAX)
- length = static_cast<int>(range.length);
- else
- length = INT_MAX - range.location;
-
- if (editingRangeIsRelativeTo == EditingRangeIsRelativeTo::EditableRoot) {
- // Our critical assumption is that this code path is called by input methods that
- // concentrate on a given area containing the selection.
- // We have to do this because of text fields and textareas. The DOM for those is not
- // directly in the document DOM, so serialization is problematic. Our solution is
- // to use the root editable element of the selection start as the positional base.
- // That fits with AppKit's idea of an input context.
- return TextIterator::rangeFromLocationAndLength(frame.selection().rootEditableElementOrDocumentElement(), static_cast<int>(range.location), length);
- }
-
- ASSERT(editingRangeIsRelativeTo == EditingRangeIsRelativeTo::Paragraph);
-
- const VisibleSelection& selection = frame.selection().selection();
- RefPtr<Range> selectedRange = selection.toNormalizedRange();
- if (!selectedRange)
- return 0;
-
- RefPtr<Range> paragraphRange = makeRange(startOfParagraph(selection.visibleStart()), selection.visibleEnd());
- if (!paragraphRange)
- return 0;
-
- ContainerNode& rootNode = paragraphRange.get()->startContainer().treeScope().rootNode();
- int paragraphStartIndex = TextIterator::rangeLength(Range::create(rootNode.document(), &rootNode, 0, ¶graphRange->startContainer(), paragraphRange->startOffset()).ptr());
- return TextIterator::rangeFromLocationAndLength(&rootNode, paragraphStartIndex + static_cast<int>(range.location), length);
-}
-
void WebPage::didChangeScrollOffsetForFrame(Frame* frame)
{
if (!frame->isMainFrame())
Modified: trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm (242319 => 242320)
--- trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm 2019-03-02 22:57:18 UTC (rev 242319)
+++ trunk/Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm 2019-03-03 00:02:34 UTC (rev 242320)
@@ -326,7 +326,7 @@
Ref<Frame> protector(frame);
if (replacementEditingRange.location != notFound) {
- RefPtr<Range> replacementRange = rangeFromEditingRange(frame, replacementEditingRange);
+ RefPtr<Range> replacementRange = EditingRange::toRange(frame, replacementEditingRange);
if (replacementRange)
frame.selection().setSelection(VisibleSelection(*replacementRange, SEL_DEFAULT_AFFINITY));
}
@@ -348,7 +348,7 @@
return;
}
- RefPtr<Range> range = rangeFromEditingRange(frame, editingRange);
+ RefPtr<Range> range = EditingRange::toRange(frame, editingRange);
if (!range) {
send(Messages::WebPageProxy::AttributedStringForCharacterRangeCallback({ }, EditingRange(), callbackID));
return;