Diff
Modified: trunk/Source/WebCore/ChangeLog (224237 => 224238)
--- trunk/Source/WebCore/ChangeLog 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/ChangeLog 2017-10-31 19:29:12 UTC (rev 224238)
@@ -1,3 +1,31 @@
+2017-10-31 Wenson Hsieh <wenson_hs...@apple.com>
+
+ [Attachment Support] Implement WKWebView SPI for inserting attachment elements
+ https://bugs.webkit.org/show_bug.cgi?id=179013
+ <rdar://problem/35249668>
+
+ Reviewed by Tim Horton.
+
+ Adds Editor helper methods to insert an attachment element at the current selection.
+
+ Test: WKAttachmentTests.AttachmentElementInsertion
+
+ * editing/Editor.cpp:
+ (WebCore::Editor::insertAttachment):
+ (WebCore::Editor::insertAttachmentFromFile):
+ * editing/Editor.h:
+
+ Add two new helpers for inserting attachment elements, either from a filename or a data blob. This is a wrapper
+ around Editor::replaceSelectionWithFragment.
+
+ * html/HTMLAttachmentElement.cpp:
+ (WebCore::HTMLAttachmentElement::HTMLAttachmentElement):
+ (WebCore::HTMLAttachmentElement::create):
+ * html/HTMLAttachmentElement.h:
+
+ Add a unique identifier string to HTMLAttachmentElement. This unique identifier allows the UI process to
+ reference and indirectly manipulate attachment elements.
+
2017-10-31 Alex Christensen <achristen...@webkit.org>
Fix custom header field setting with reloads and asynchronous navigation action policy decisions
Modified: trunk/Source/WebCore/PAL/ChangeLog (224237 => 224238)
--- trunk/Source/WebCore/PAL/ChangeLog 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/PAL/ChangeLog 2017-10-31 19:29:12 UTC (rev 224238)
@@ -1,3 +1,24 @@
+2017-10-31 Wenson Hsieh <wenson_hs...@apple.com>
+
+ [Attachment Support] Implement WKWebView SPI for inserting attachment elements
+ https://bugs.webkit.org/show_bug.cgi?id=179013
+ <rdar://problem/35249668>
+
+ Reviewed by Tim Horton.
+
+ Add a PAL library function to convert a file size to a human-readable string. On Cocoa platforms, this is a
+ wrapper around NSLocalizedFileSizeDescription; otherwise, we fall back to a naive platform-agnostic
+ implementation in FileSizeFormatter.cpp.
+
+ * PAL.xcodeproj/project.pbxproj:
+ * pal/CMakeLists.txt:
+ * pal/FileSizeFormatter.cpp: Added.
+ (fileSizeDescription):
+ * pal/FileSizeFormatter.h: Added.
+ * pal/cocoa/FileSizeFormatterCocoa.mm: Added.
+ (fileSizeDescription):
+ * pal/spi/cocoa/NSFileSizeFormatterSPI.h: Added.
+
2017-10-27 Keith Miller <keith_mil...@apple.com>
Move iOS specific sources to unified sources
Modified: trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj (224237 => 224238)
--- trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj 2017-10-31 19:29:12 UTC (rev 224238)
@@ -141,6 +141,10 @@
A3AB6E651F3D217F009C14B1 /* SystemSleepListenerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = A3AB6E631F3D217F009C14B1 /* SystemSleepListenerMac.mm */; };
A3C66CDC1F462D6A009E6EE9 /* SessionID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3C66CDA1F462D6A009E6EE9 /* SessionID.cpp */; };
A3C66CDD1F462D6A009E6EE9 /* SessionID.h in Headers */ = {isa = PBXBuildFile; fileRef = A3C66CDB1F462D6A009E6EE9 /* SessionID.h */; };
+ F442915E1FA52473002CC93E /* NSFileSizeFormatterSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = F442915D1FA52473002CC93E /* NSFileSizeFormatterSPI.h */; };
+ F44291601FA5261E002CC93E /* FileSizeFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = F442915F1FA5261E002CC93E /* FileSizeFormatter.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ F44291641FA52670002CC93E /* FileSizeFormatter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F44291621FA52670002CC93E /* FileSizeFormatter.cpp */; };
+ F44291681FA52705002CC93E /* FileSizeFormatterCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = F44291661FA52705002CC93E /* FileSizeFormatterCocoa.mm */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -283,6 +287,10 @@
A3C66CDA1F462D6A009E6EE9 /* SessionID.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SessionID.cpp; sourceTree = "<group>"; };
A3C66CDB1F462D6A009E6EE9 /* SessionID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionID.h; sourceTree = "<group>"; };
C2147A4A1EFD0AA600056FA5 /* CopyPALHeaders.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = CopyPALHeaders.xcconfig; sourceTree = "<group>"; };
+ F442915D1FA52473002CC93E /* NSFileSizeFormatterSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSFileSizeFormatterSPI.h; sourceTree = "<group>"; };
+ F442915F1FA5261E002CC93E /* FileSizeFormatter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileSizeFormatter.h; sourceTree = "<group>"; };
+ F44291621FA52670002CC93E /* FileSizeFormatter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileSizeFormatter.cpp; sourceTree = "<group>"; };
+ F44291661FA52705002CC93E /* FileSizeFormatterCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FileSizeFormatterCocoa.mm; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -362,6 +370,7 @@
0C2DA1311F3BEB4900DBC317 /* NSColorSPI.h */,
0C2DA1321F3BEB4900DBC317 /* NSExtensionSPI.h */,
0C2DA1331F3BEB4900DBC317 /* NSFileManagerSPI.h */,
+ F442915D1FA52473002CC93E /* NSFileSizeFormatterSPI.h */,
0C2DA1341F3BEB4900DBC317 /* NSStringSPI.h */,
0C2DA1351F3BEB4900DBC317 /* NSTouchBarSPI.h */,
0C2DA1361F3BEB4900DBC317 /* NSURLConnectionSPI.h */,
@@ -471,6 +480,8 @@
A3788E9F1F05B7CE00679425 /* system */,
A30D411D1F0DD0AC00B71954 /* text */,
0C2D9E721EEF5AF600DBC317 /* ExportMacros.h */,
+ F44291621FA52670002CC93E /* FileSizeFormatter.cpp */,
+ F442915F1FA5261E002CC93E /* FileSizeFormatter.h */,
A39DE74D1F7C443C007BCB00 /* HysteresisActivity.h */,
0708AC321F4C874A001F788F /* Logger.h */,
07377ADB1F5777D70027F16D /* LoggerHelper.h */,
@@ -517,6 +528,7 @@
1C4876DE1F8D831300CCEEBD /* cocoa */ = {
isa = PBXGroup;
children = (
+ F44291661FA52705002CC93E /* FileSizeFormatterCocoa.mm */,
1C4876DF1F8D837500CCEEBD /* LoggingCocoa.mm */,
);
path = cocoa;
@@ -612,6 +624,7 @@
0C5AF91A1F43A4C7002EAC02 /* DataDetectorsUISPI.h in Headers */,
A1175B571F6B470500C4B9F0 /* DefaultSearchProvider.h in Headers */,
0C2D9E731EEF5AF600DBC317 /* ExportMacros.h in Headers */,
+ F44291601FA5261E002CC93E /* FileSizeFormatter.h in Headers */,
A10265871F56746100B4C844 /* FoundationSPI.h in Headers */,
0C5AF91B1F43A4C7002EAC02 /* GraphicsServicesSPI.h in Headers */,
A102658E1F567E9D00B4C844 /* HIServicesSPI.h in Headers */,
@@ -647,6 +660,7 @@
0C77858F1F45130F00F4EBB6 /* NSEventSPI.h in Headers */,
0C2DA14E1F3BEB4900DBC317 /* NSExtensionSPI.h in Headers */,
0C2DA14F1F3BEB4900DBC317 /* NSFileManagerSPI.h in Headers */,
+ F442915E1FA52473002CC93E /* NSFileSizeFormatterSPI.h in Headers */,
0C7785901F45130F00F4EBB6 /* NSFontSPI.h in Headers */,
A10826FE1F58A433004772AC /* NSGraphicsSPI.h in Headers */,
0C7785911F45130F00F4EBB6 /* NSImmediateActionGestureRecognizerSPI.h in Headers */,
@@ -784,6 +798,8 @@
0CF99CA81F738437007EE793 /* CoreMediaSoftLink.cpp in Sources */,
1C09D0561E31C46500725F18 /* CryptoDigestCommonCrypto.cpp in Sources */,
A1175B581F6B470500C4B9F0 /* DefaultSearchProvider.cpp in Sources */,
+ F44291641FA52670002CC93E /* FileSizeFormatter.cpp in Sources */,
+ F44291681FA52705002CC93E /* FileSizeFormatterCocoa.mm in Sources */,
A30D41221F0DD0EA00B71954 /* KillRing.cpp in Sources */,
A30D41251F0DD12D00B71954 /* KillRingMac.mm in Sources */,
1C4876D81F8D7F4E00CCEEBD /* Logging.cpp in Sources */,
Modified: trunk/Source/WebCore/PAL/pal/CMakeLists.txt (224237 => 224238)
--- trunk/Source/WebCore/PAL/pal/CMakeLists.txt 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/PAL/pal/CMakeLists.txt 2017-10-31 19:29:12 UTC (rev 224238)
@@ -1,4 +1,5 @@
set(PAL_SOURCES
+ FileSizeFormatter.cpp
Logging.cpp
SessionID.cpp
Copied: trunk/Source/WebCore/PAL/pal/FileSizeFormatter.cpp (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebCore/PAL/pal/FileSizeFormatter.cpp (rev 0)
+++ trunk/Source/WebCore/PAL/pal/FileSizeFormatter.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 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 "FileSizeFormatter.h"
+
+#if !PLATFORM(COCOA)
+
+String fileSizeDescription(uint64_t size)
+{
+ // FIXME: These strings should be localized, but that would require bringing LocalizedStrings into PAL.
+ // See <https://bugs.webkit.org/show_bug.cgi?id=179019> for more details.
+ if (size < 1000)
+ return String::format("%tu bytes", size);
+ if (size < 1000000)
+ return String::format("%.1f KB", size / 1000.);
+ if (size < 1000000000)
+ return String::format("%.1f MB", size / 1000000.);
+ return String::format("%.1f GB", size / 1000000000.);
+}
+
+#endif
Copied: trunk/Source/WebCore/PAL/pal/FileSizeFormatter.h (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebCore/PAL/pal/FileSizeFormatter.h (rev 0)
+++ trunk/Source/WebCore/PAL/pal/FileSizeFormatter.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include <wtf/text/WTFString.h>
+
+PAL_EXPORT String fileSizeDescription(uint64_t);
Copied: trunk/Source/WebCore/PAL/pal/cocoa/FileSizeFormatterCocoa.mm (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebCore/PAL/pal/cocoa/FileSizeFormatterCocoa.mm (rev 0)
+++ trunk/Source/WebCore/PAL/pal/cocoa/FileSizeFormatterCocoa.mm 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 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 "FileSizeFormatter.h"
+
+#import "NSFileSizeFormatterSPI.h"
+
+String fileSizeDescription(uint64_t size)
+{
+ return NSLocalizedFileSizeDescription(size, 0, 0);
+}
Copied: trunk/Source/WebCore/PAL/pal/spi/cocoa/NSFileSizeFormatterSPI.h (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebCore/PAL/pal/spi/cocoa/NSFileSizeFormatterSPI.h (rev 0)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/NSFileSizeFormatterSPI.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#if USE(APPLE_INTERNAL_SDK)
+
+#import <Foundation/NSFileSizeFormatter.h>
+
+#else
+
+typedef uint64_t NSFileSizeFormatterOptions;
+extern "C" NSString *NSLocalizedFileSizeDescription(uint64_t size, uint64_t maximumDisplayedValue, NSFileSizeFormatterOptions);
+
+#endif
Modified: trunk/Source/WebCore/editing/Editor.cpp (224237 => 224238)
--- trunk/Source/WebCore/editing/Editor.cpp 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/editing/Editor.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -47,6 +47,7 @@
#include "EditorClient.h"
#include "EventHandler.h"
#include "EventNames.h"
+#include "File.h"
#include "FocusController.h"
#include "Frame.h"
#include "FrameLoader.h"
@@ -53,6 +54,7 @@
#include "FrameTree.h"
#include "FrameView.h"
#include "GraphicsContext.h"
+#include "HTMLAttachmentElement.h"
#include "HTMLCollection.h"
#include "HTMLFormControlElement.h"
#include "HTMLFrameOwnerElement.h"
@@ -98,6 +100,7 @@
#include "UserTypingGestureIndicator.h"
#include "VisibleUnits.h"
#include "markup.h"
+#include <pal/FileSizeFormatter.h>
#include <pal/system/Sound.h>
#include <pal/text/KillRing.h>
#include <wtf/unicode/CharacterNames.h>
@@ -3728,6 +3731,39 @@
return TextIterator::subrange(*contextRange, result.location, result.length);
}
+#if ENABLE(ATTACHMENT_ELEMENT)
+
+void Editor::insertAttachment(const String& identifier, const String& filename, const String& filepath, std::optional<String> contentType)
+{
+ if (!contentType)
+ contentType = File::contentTypeForFile(filename);
+ insertAttachmentFromFile(identifier, filename, *contentType, File::create(filepath));
+}
+
+void Editor::insertAttachment(const String& identifier, const String& filename, Ref<SharedBuffer>&& data, std::optional<String> contentType)
+{
+ if (!contentType)
+ contentType = File::contentTypeForFile(filename);
+ insertAttachmentFromFile(identifier, filename, *contentType, File::create(Blob::create(data, *contentType), filename));
+}
+
+void Editor::insertAttachmentFromFile(const String& identifier, const String& filename, const String& contentType, Ref<File>&& file)
+{
+ auto attachment = HTMLAttachmentElement::create(HTMLNames::attachmentTag, document(), identifier);
+ attachment->setAttribute(HTMLNames::titleAttr, filename);
+ attachment->setAttribute(HTMLNames::subtitleAttr, fileSizeDescription(file->size()));
+ attachment->setAttribute(HTMLNames::typeAttr, contentType);
+ attachment->setUniqueIdentifier(identifier);
+ attachment->setFile(file.ptr());
+
+ auto fragmentToInsert = document().createDocumentFragment();
+ fragmentToInsert->appendChild(attachment.get());
+
+ replaceSelectionWithFragment(fragmentToInsert.get(), false, false, true);
+}
+
+#endif // ENABLE(ATTACHMENT_ELEMENT)
+
void Editor::handleAcceptedCandidate(TextCheckingResult acceptedCandidate)
{
const VisibleSelection& selection = m_frame.selection().selection();
Modified: trunk/Source/WebCore/editing/Editor.h (224237 => 224238)
--- trunk/Source/WebCore/editing/Editor.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/editing/Editor.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -63,7 +63,9 @@
class EditCommandComposition;
class EditorClient;
class EditorInternalCommand;
+class File;
class Frame;
+class HTMLAttachmentElement;
class HTMLElement;
class HitTestResult;
class KeyboardEvent;
@@ -498,9 +500,18 @@
void setIsGettingDictionaryPopupInfo(bool b) { m_isGettingDictionaryPopupInfo = b; }
bool isGettingDictionaryPopupInfo() const { return m_isGettingDictionaryPopupInfo; }
+#if ENABLE(ATTACHMENT_ELEMENT)
+ WEBCORE_EXPORT void insertAttachment(const String& identifier, const String& filename, const String& filepath, std::optional<String> contentType = std::nullopt);
+ WEBCORE_EXPORT void insertAttachment(const String& identifier, const String& filename, Ref<SharedBuffer>&& data, std::optional<String> contentType = std::nullopt);
+#endif
+
private:
Document& document() const;
+#if ENABLE(ATTACHMENT_ELEMENT)
+ void insertAttachmentFromFile(const String& identifier, const String& filename, const String& contentType, Ref<File>&&);
+#endif
+
bool canDeleteRange(Range*) const;
bool canSmartReplaceWithPasteboard(Pasteboard&);
void pasteAsPlainTextWithPasteboard(Pasteboard&);
Modified: trunk/Source/WebCore/html/HTMLAttachmentElement.cpp (224237 => 224238)
--- trunk/Source/WebCore/html/HTMLAttachmentElement.cpp 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/html/HTMLAttachmentElement.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -28,20 +28,29 @@
#if ENABLE(ATTACHMENT_ELEMENT)
+#include "Editor.h"
#include "File.h"
+#include "Frame.h"
#include "HTMLNames.h"
#include "RenderAttachment.h"
+#include <wtf/UUID.h>
namespace WebCore {
using namespace HTMLNames;
-HTMLAttachmentElement::HTMLAttachmentElement(const QualifiedName& tagName, Document& document)
+HTMLAttachmentElement::HTMLAttachmentElement(const QualifiedName& tagName, Document& document, const String& identifier)
: HTMLElement(tagName, document)
+ , m_uniqueIdentifier(identifier)
{
ASSERT(hasTagName(attachmentTag));
}
+HTMLAttachmentElement::HTMLAttachmentElement(const QualifiedName& tagName, Document& document)
+ : HTMLAttachmentElement(tagName, document, createCanonicalUUIDString())
+{
+}
+
HTMLAttachmentElement::~HTMLAttachmentElement() = default;
Ref<HTMLAttachmentElement> HTMLAttachmentElement::create(const QualifiedName& tagName, Document& document)
@@ -49,6 +58,11 @@
return adoptRef(*new HTMLAttachmentElement(tagName, document));
}
+Ref<HTMLAttachmentElement> HTMLAttachmentElement::create(const QualifiedName& tagName, Document& document, const String& identifier)
+{
+ return adoptRef(*new HTMLAttachmentElement(tagName, document, identifier));
+}
+
RenderPtr<RenderElement> HTMLAttachmentElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
{
return createRenderer<RenderAttachment>(*this, WTFMove(style));
Modified: trunk/Source/WebCore/html/HTMLAttachmentElement.h (224237 => 224238)
--- trunk/Source/WebCore/html/HTMLAttachmentElement.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebCore/html/HTMLAttachmentElement.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -37,10 +37,14 @@
class HTMLAttachmentElement final : public HTMLElement {
public:
static Ref<HTMLAttachmentElement> create(const QualifiedName&, Document&);
+ static Ref<HTMLAttachmentElement> create(const QualifiedName&, Document&, const String& identifier);
WEBCORE_EXPORT File* file() const;
void setFile(File*);
+ WEBCORE_EXPORT String uniqueIdentifier() const { return m_uniqueIdentifier; }
+ void setUniqueIdentifier(const String& identifier) { m_uniqueIdentifier = identifier; }
+
WEBCORE_EXPORT String attachmentTitle() const;
String attachmentType() const;
@@ -48,6 +52,7 @@
private:
HTMLAttachmentElement(const QualifiedName&, Document&);
+ HTMLAttachmentElement(const QualifiedName&, Document&, const String& identifier);
virtual ~HTMLAttachmentElement();
RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
@@ -63,6 +68,7 @@
void parseAttribute(const QualifiedName&, const AtomicString&) final;
RefPtr<File> m_file;
+ String m_uniqueIdentifier;
};
} // namespace WebCore
Modified: trunk/Source/WebKit/ChangeLog (224237 => 224238)
--- trunk/Source/WebKit/ChangeLog 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/ChangeLog 2017-10-31 19:29:12 UTC (rev 224238)
@@ -1,3 +1,65 @@
+2017-10-31 Wenson Hsieh <wenson_hs...@apple.com>
+
+ [Attachment Support] Implement WKWebView SPI for inserting attachment elements
+ https://bugs.webkit.org/show_bug.cgi?id=179013
+ <rdar://problem/35249668>
+
+ Reviewed by Tim Horton.
+
+ Adds native SPI to insert attachment elements given a filename, an optional MIME type, and a data blob. See
+ change-by-change comments below for more detail. Covered by a new API test.
+
+ * PlatformMac.cmake:
+ * Shared/API/APIObject.h:
+ * Shared/API/Cocoa/WebKitPrivate.h:
+ * UIProcess/API/APIAttachment.cpp: Copied from Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h.
+ (API::Attachment::create):
+ (API::Attachment::Attachment):
+ (API::Attachment::~Attachment):
+
+ Introduce API::Attachment, which represents a platform-agnostic Attachment.
+
+ * UIProcess/API/APIAttachment.h: Copied from Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h.
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _insertAttachmentWithFilename:contentType:data:options:completion:]):
+
+ Adds support for inserting a new attachment element. Calls out to WebPageProxy to insert the attachment from the
+ given data blob, and creates a new API-object-backed _WKAttachment.
+
+ (-[WKWebView _executeEditCommand:argument:completion:]):
+
+ Support passing in a nil completion block.
+
+ * UIProcess/API/Cocoa/WKWebViewInternal.h:
+ * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+ * UIProcess/API/Cocoa/_WKAttachment.h: Copied from Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h.
+ * UIProcess/API/Cocoa/_WKAttachment.mm: Copied from Source/WebCore/html/HTMLAttachmentElement.h.
+
+ Introduces _WKAttachment, an Objective C wrapper around the API::Attachment.
+
+ (-[_WKAttachment _apiObject]):
+ (-[_WKAttachment isEqual:]):
+ (-[_WKAttachment uniqueIdentifier]):
+ (-[_WKAttachment hash]):
+
+ Add _WKAttachment, a WebKit SPI object that wraps an attachment element unique identifier. Also, allow
+ _WKAttachment to be used as a hashable NSDictionary key.
+
+ (-[_WKAttachment description]):
+ * UIProcess/API/Cocoa/_WKAttachmentInternal.h: Copied from Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h.
+ (API::wrapper):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::insertAttachment):
+
+ Implement IPC support for inserting an attachment.
+
+ * UIProcess/WebPageProxy.h:
+ * WebKit.xcodeproj/project.pbxproj:
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::insertAttachment):
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+
2017-10-31 Alex Christensen <achristen...@webkit.org>
Fix custom header field setting with reloads and asynchronous navigation action policy decisions
Modified: trunk/Source/WebKit/Platform/cocoa/SharedMemoryCocoa.cpp (224237 => 224238)
--- trunk/Source/WebKit/Platform/cocoa/SharedMemoryCocoa.cpp 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/Platform/cocoa/SharedMemoryCocoa.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -31,6 +31,7 @@
#include "Logging.h"
#include "MachPort.h"
#include <WebCore/MachSendRight.h>
+#include <WebCore/SharedBuffer.h>
#include <mach/mach_error.h>
#include <mach/mach_port.h>
#include <mach/vm_map.h>
Modified: trunk/Source/WebKit/PlatformMac.cmake (224237 => 224238)
--- trunk/Source/WebKit/PlatformMac.cmake 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/PlatformMac.cmake 2017-10-31 19:29:12 UTC (rev 224238)
@@ -222,6 +222,7 @@
UIProcess/API/Cocoa/WKWebsiteDataStore.mm
UIProcess/API/Cocoa/WKWindowFeatures.mm
UIProcess/API/Cocoa/_WKActivatedElementInfo.mm
+ UIProcess/API/Cocoa/_WKAttachment.mm
UIProcess/API/Cocoa/_WKAutomationSession.mm
UIProcess/API/Cocoa/_WKAutomationSessionConfiguration.mm
UIProcess/API/Cocoa/_WKContextMenuElementInfo.mm
Modified: trunk/Source/WebKit/Shared/API/APIObject.h (224237 => 224238)
--- trunk/Source/WebKit/Shared/API/APIObject.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/Shared/API/APIObject.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -97,6 +97,7 @@
// UIProcess types
ApplicationCacheManager,
+ Attachment,
AutomationSession,
BackForwardList,
BackForwardListItem,
Modified: trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h (224237 => 224238)
--- trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -30,6 +30,7 @@
#import <WebKit/WKWebViewConfigurationPrivate.h>
#import <WebKit/WKWebViewPrivate.h>
#import <WebKit/_WKActivatedElementInfo.h>
+#import <WebKit/_WKAttachment.h>
#import <WebKit/_WKElementAction.h>
#import <WebKit/_WKFocusedElementInfo.h>
#import <WebKit/_WKFormInputSession.h>
Copied: trunk/Source/WebKit/UIProcess/API/APIAttachment.cpp (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebKit/UIProcess/API/APIAttachment.cpp (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/APIAttachment.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017 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 "APIAttachment.h"
+
+#include <wtf/text/WTFString.h>
+
+namespace API {
+
+Ref<Attachment> Attachment::create(const WTF::String& identifier, WebKit::WebPageProxy& webPage)
+{
+ return adoptRef(*new Attachment(identifier, webPage));
+}
+
+Attachment::Attachment(const WTF::String& identifier, WebKit::WebPageProxy& webPage)
+ : m_identifier(identifier)
+ , m_webPage(webPage.createWeakPtr())
+{
+}
+
+Attachment::~Attachment()
+{
+}
+
+}
Copied: trunk/Source/WebKit/UIProcess/API/APIAttachment.h (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebKit/UIProcess/API/APIAttachment.h (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/APIAttachment.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#include "APIObject.h"
+#include <WebKit/WKBase.h>
+#include <WebKit/WebPageProxy.h>
+#include <wtf/WeakPtr.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+class WebPageProxy;
+}
+
+namespace API {
+
+class Attachment final : public ObjectImpl<Object::Type::Attachment> {
+public:
+ static Ref<Attachment> create(const WTF::String& identifier, WebKit::WebPageProxy&);
+ virtual ~Attachment();
+
+ const WTF::String& identifier() const { return m_identifier; }
+
+private:
+ explicit Attachment(const WTF::String& identifier, WebKit::WebPageProxy&);
+
+ WTF::String m_identifier;
+ WeakPtr<WebKit::WebPageProxy> m_webPage;
+};
+
+} // namespace API
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (224237 => 224238)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2017-10-31 19:29:12 UTC (rev 224238)
@@ -99,6 +99,7 @@
#import <WebCore/SQLiteDatabaseTracker.h>
#import <WebCore/SchemeRegistry.h>
#import <WebCore/Settings.h>
+#import <WebCore/SharedBuffer.h>
#import <WebCore/ValidationBubble.h>
#import <WebCore/ViewportArguments.h>
#import <WebCore/WritingMode.h>
@@ -110,6 +111,7 @@
#import <wtf/Optional.h>
#import <wtf/RetainPtr.h>
#import <wtf/SetForScope.h>
+#import <wtf/UUID.h>
#import <wtf/spi/darwin/dyldSPI.h>
#import <wtf/text/TextStream.h>
@@ -4168,6 +4170,23 @@
_page->close();
}
+- (_WKAttachment *)_insertAttachmentWithFilename:(NSString *)filename contentType:(NSString *)contentType data:(NSData *)data options:(_WKAttachmentDisplayOptions *)options completion:(void(^)(BOOL success))completionHandler
+{
+#if ENABLE(ATTACHMENT_ELEMENT)
+ auto identifier = createCanonicalUUIDString();
+
+ auto buffer = WebCore::SharedBuffer::create(data);
+ _page->insertAttachment(identifier, filename, contentType.length ? std::optional<String> { contentType } : std::nullopt, buffer.get(), [capturedHandler = makeBlockPtr(completionHandler), capturedBuffer = buffer.copyRef()] (WebKit::CallbackBase::Error error) {
+ if (capturedHandler)
+ capturedHandler(error == WebKit::CallbackBase::Error::None);
+ });
+
+ return [wrapper(API::Attachment::create(identifier, *_page).leakRef()) autorelease];
+#else
+ return nil;
+#endif
+}
+
- (void)_evaluateJavaScriptWithoutUserGesture:(NSString *)_javascript_String completionHandler:(void (^)(id, NSError *))completionHandler
{
[self _evaluateJavaScript:_javascript_String forceUserGesture:NO completionHandler:completionHandler];
@@ -6033,7 +6052,8 @@
- (void)_executeEditCommand:(NSString *)command argument:(NSString *)argument completion:(void (^)(BOOL))completion
{
_page->executeEditCommand(command, argument, [capturedCompletionBlock = makeBlockPtr(completion)](WebKit::CallbackBase::Error error) {
- capturedCompletionBlock(error == WebKit::CallbackBase::Error::None);
+ if (capturedCompletionBlock)
+ capturedCompletionBlock(error == WebKit::CallbackBase::Error::None);
});
}
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h (224237 => 224238)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -29,6 +29,7 @@
#import "SameDocumentNavigationType.h"
#import "WKWebViewConfiguration.h"
+#import "_WKAttachmentInternal.h"
#import <wtf/RefPtr.h>
#import <wtf/RetainPtr.h>
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (224237 => 224238)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -28,6 +28,7 @@
#if WK_API_ENABLED
#import <WebKit/_WKActivatedElementInfo.h>
+#import <WebKit/_WKAttachment.h>
#import <WebKit/_WKFindOptions.h>
#import <WebKit/_WKLayoutMode.h>
#import <WebKit/_WKOverlayScrollbarStyle.h>
@@ -177,6 +178,8 @@
@property (nonatomic, setter=_setBackgroundExtendsBeyondPage:) BOOL _backgroundExtendsBeyondPage WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(8.0));
+- (_WKAttachment *)_insertAttachmentWithFilename:(NSString *)filename contentType:(NSString *)contentType data:(NSData *)data options:(_WKAttachmentDisplayOptions *)options completion:(void(^)(BOOL success))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+
#if TARGET_OS_IPHONE
// DERECATED: The setters of the three following function are deprecated, please use overrideLayoutParameters.
// Define the smallest size a page take with a regular viewport.
Copied: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachment.h (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachment.h (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachment.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#import <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED
+
+typedef NS_ENUM(NSInteger, _WKAttachmentDisplayMode) {
+ _WKAttachmentDisplayModeAuto = 1,
+ _WKAttachmentDisplayModeInPlace,
+ _WKAttachmentDisplayModeAsIcon
+} WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+
+WK_CLASS_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA))
+@interface _WKAttachmentDisplayOptions : NSObject
+@property (nonatomic) _WKAttachmentDisplayMode mode;
+@property (nonatomic) BOOL expandsImageToMaximumWidth;
+@end
+
+WK_CLASS_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA))
+@interface _WKAttachment : NSObject
+@end
+
+#endif
Copied: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachment.mm (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachment.mm (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachment.mm 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#import "config.h"
+#import "_WKAttachment.h"
+
+#if WK_API_ENABLED
+
+#import "APIAttachment.h"
+#import "_WKAttachmentInternal.h"
+
+using namespace WebKit;
+
+@implementation _WKAttachmentDisplayOptions : NSObject
+
+- (instancetype)init
+{
+ if (self = [super init]) {
+ _mode = _WKAttachmentDisplayModeAuto;
+ _expandsImageToMaximumWidth = NO;
+ }
+ return self;
+}
+
+@end
+
+@implementation _WKAttachment
+
+- (API::Object&)_apiObject
+{
+ return *_attachment;
+}
+
+- (BOOL)isEqual:(id)object
+{
+ return [object isKindOfClass:[_WKAttachment class]] && [self.uniqueIdentifier isEqual:[(_WKAttachment *)object uniqueIdentifier]];
+}
+
+- (NSString *)uniqueIdentifier
+{
+ return _attachment->identifier();
+}
+
+- (NSUInteger)hash
+{
+ return [self.uniqueIdentifier hash];
+}
+
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"<%@ id='%@'>", [self class], self.uniqueIdentifier];
+}
+
+@end
+
+#endif // WK_API_ENABLED
Copied: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachmentInternal.h (from rev 224237, trunk/Source/WebKit/Shared/API/Cocoa/WebKitPrivate.h) (0 => 224238)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachmentInternal.h (rev 0)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKAttachmentInternal.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#pragma once
+
+#import "APIAttachment.h"
+#import "_WKAttachment.h"
+
+namespace API {
+
+inline _WKAttachment *wrapper(API::Attachment& attachment)
+{
+ ASSERT([attachment.wrapper() isKindOfClass:[_WKAttachment class]]);
+ return (_WKAttachment *)attachment.wrapper();
+}
+
+}
+
+@interface _WKAttachment () <WKObject> {
+@package
+ API::ObjectStorage<API::Attachment> _attachment;
+}
+@end
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (224237 => 224238)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -7105,4 +7105,14 @@
});
}
+#if ENABLE(ATTACHMENT_ELEMENT)
+
+void WebPageProxy::insertAttachment(const String& identifier, const String& filename, std::optional<String> contentType, SharedBuffer& data, Function<void(CallbackBase::Error)>&& callback)
+{
+ auto callbackID = m_callbacks.put(WTFMove(callback), m_process->throttler().backgroundActivityToken());
+ m_process->send(Messages::WebPage::InsertAttachment(identifier, filename, contentType, IPC::SharedBufferDataReference { &data }, callbackID), m_pageID);
+}
+
+#endif // ENABLE(ATTACHMENT_ELEMENT)
+
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (224237 => 224238)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -1211,6 +1211,10 @@
void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, uint64_t webProcessContextId);
+#if ENABLE(ATTACHMENT_ELEMENT)
+ void insertAttachment(const String& identifier, const String& filename, std::optional<String> contentType, WebCore::SharedBuffer& data, Function<void(CallbackBase::Error)>&&);
+#endif
+
private:
WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, Ref<API::PageConfiguration>&&);
void platformInitialize();
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (224237 => 224238)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2017-10-31 19:29:12 UTC (rev 224238)
@@ -720,6 +720,8 @@
2DFC7DBB1BCCC19500C1548C /* WebViewImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DFC7DB91BCCC19500C1548C /* WebViewImpl.h */; };
2DFC7DBC1BCCC19500C1548C /* WebViewImpl.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DFC7DBA1BCCC19500C1548C /* WebViewImpl.mm */; };
2DFF7B6F1DA4CFAF00814614 /* WKBackForwardListItemPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DFF7B6E1DA4CFAF00814614 /* WKBackForwardListItemPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 2E5C770E1FA7D429005932C3 /* APIAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E5C770C1FA7D429005932C3 /* APIAttachment.h */; };
+ 2E5C770F1FA7D429005932C3 /* APIAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E5C770D1FA7D429005932C3 /* APIAttachment.cpp */; };
2E7A944A1BBD97C300945547 /* _WKFocusedElementInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
31099973146C75A20029DEB9 /* WebNotificationClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31099971146C759B0029DEB9 /* WebNotificationClient.cpp */; };
310999C7146C9E3D0029DEB9 /* WebNotificationClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 31099968146C71F50029DEB9 /* WebNotificationClient.h */; };
@@ -2083,6 +2085,9 @@
EDCA71B7128DDA8C00201B26 /* WKBundlePageOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A22F1001289FCD90085E74F /* WKBundlePageOverlay.cpp */; };
F036978815F4BF0500C3A80E /* WebColorPicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F036978715F4BF0500C3A80E /* WebColorPicker.cpp */; };
F409BA181E6E64BC009DA28E /* WKDragDestinationAction.h in Headers */ = {isa = PBXBuildFile; fileRef = F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ F44291921FA591C9002CC93E /* _WKAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = F44291911FA59107002CC93E /* _WKAttachment.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ F44291941FA59311002CC93E /* _WKAttachment.mm in Sources */ = {isa = PBXBuildFile; fileRef = F44291931FA59311002CC93E /* _WKAttachment.mm */; };
+ F44291961FA5942A002CC93E /* _WKAttachmentInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = F44291951FA5942A002CC93E /* _WKAttachmentInternal.h */; };
F44DFEB21E9E752F0038D196 /* WebIconUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = F44DFEB01E9E752F0038D196 /* WebIconUtilities.h */; };
F44DFEB31E9E752F0038D196 /* WebIconUtilities.mm in Sources */ = {isa = PBXBuildFile; fileRef = F44DFEB11E9E752F0038D196 /* WebIconUtilities.mm */; };
F496A4311F58A272004C1757 /* DragDropInteractionState.h in Headers */ = {isa = PBXBuildFile; fileRef = F496A42F1F58A272004C1757 /* DragDropInteractionState.h */; };
@@ -3020,6 +3025,8 @@
2DFC7DB91BCCC19500C1548C /* WebViewImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewImpl.h; sourceTree = "<group>"; };
2DFC7DBA1BCCC19500C1548C /* WebViewImpl.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewImpl.mm; sourceTree = "<group>"; };
2DFF7B6E1DA4CFAF00814614 /* WKBackForwardListItemPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBackForwardListItemPrivate.h; sourceTree = "<group>"; };
+ 2E5C770C1FA7D429005932C3 /* APIAttachment.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APIAttachment.h; sourceTree = "<group>"; };
+ 2E5C770D1FA7D429005932C3 /* APIAttachment.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = APIAttachment.cpp; sourceTree = "<group>"; };
2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _WKFocusedElementInfo.h; sourceTree = "<group>"; };
31099968146C71F50029DEB9 /* WebNotificationClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebNotificationClient.h; sourceTree = "<group>"; };
31099971146C759B0029DEB9 /* WebNotificationClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebNotificationClient.cpp; sourceTree = "<group>"; };
@@ -4528,6 +4535,9 @@
ECBFC1DB1E6A4D66000300C7 /* ExtraPublicSymbolsForTAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtraPublicSymbolsForTAPI.h; sourceTree = "<group>"; };
F036978715F4BF0500C3A80E /* WebColorPicker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebColorPicker.cpp; sourceTree = "<group>"; };
F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKDragDestinationAction.h; sourceTree = "<group>"; };
+ F44291911FA59107002CC93E /* _WKAttachment.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _WKAttachment.h; sourceTree = "<group>"; };
+ F44291931FA59311002CC93E /* _WKAttachment.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKAttachment.mm; sourceTree = "<group>"; };
+ F44291951FA5942A002CC93E /* _WKAttachmentInternal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _WKAttachmentInternal.h; sourceTree = "<group>"; };
F44DFEB01E9E752F0038D196 /* WebIconUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebIconUtilities.h; path = ios/WebIconUtilities.h; sourceTree = "<group>"; };
F44DFEB11E9E752F0038D196 /* WebIconUtilities.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebIconUtilities.mm; path = ios/WebIconUtilities.mm; sourceTree = "<group>"; };
F496A42F1F58A272004C1757 /* DragDropInteractionState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DragDropInteractionState.h; path = ios/DragDropInteractionState.h; sourceTree = "<group>"; };
@@ -5748,6 +5758,9 @@
37A5E01218BBF937000A081E /* _WKActivatedElementInfo.h */,
37A5E01118BBF937000A081E /* _WKActivatedElementInfo.mm */,
379A873518BBFA4300588AF2 /* _WKActivatedElementInfoInternal.h */,
+ F44291911FA59107002CC93E /* _WKAttachment.h */,
+ F44291931FA59311002CC93E /* _WKAttachment.mm */,
+ F44291951FA5942A002CC93E /* _WKAttachmentInternal.h */,
99E714C11C1249E600665B3A /* _WKAutomationDelegate.h */,
990D28A71C6404B000986977 /* _WKAutomationSession.h */,
990D28AD1C65190400986977 /* _WKAutomationSession.mm */,
@@ -7142,6 +7155,8 @@
37C4C08318149C2A003688B9 /* Cocoa */,
BC8A501311765F4500757573 /* cpp */,
BC111B47112F616900337BAB /* mac */,
+ 2E5C770D1FA7D429005932C3 /* APIAttachment.cpp */,
+ 2E5C770C1FA7D429005932C3 /* APIAttachment.h */,
99C81D5B1C20E817005C4C82 /* APIAutomationClient.h */,
990D28B31C6526D400986977 /* APIAutomationSessionClient.h */,
7C89D2B11A6B068C003A5FDE /* APIContentRuleList.cpp */,
@@ -8406,6 +8421,8 @@
files = (
37A5E01418BBF93F000A081E /* _WKActivatedElementInfo.h in Headers */,
379A873618BBFA4300588AF2 /* _WKActivatedElementInfoInternal.h in Headers */,
+ F44291921FA591C9002CC93E /* _WKAttachment.h in Headers */,
+ F44291961FA5942A002CC93E /* _WKAttachmentInternal.h in Headers */,
99E714C51C124A0400665B3A /* _WKAutomationDelegate.h in Headers */,
990D28AB1C6420C600986977 /* _WKAutomationSession.h in Headers */,
99788ACB1F421DDA00C08000 /* _WKAutomationSessionConfiguration.h in Headers */,
@@ -8480,6 +8497,7 @@
A182D5B51BE6BD250087A7CC /* AccessibilityIOS.h in Headers */,
A7D792D81767CCA300881CBE /* ActivityAssertion.h in Headers */,
BC64697011DBE603006455B0 /* APIArray.h in Headers */,
+ 2E5C770E1FA7D429005932C3 /* APIAttachment.h in Headers */,
99C81D5D1C21F38B005C4C82 /* APIAutomationClient.h in Headers */,
990D28C01C6553F100986977 /* APIAutomationSessionClient.h in Headers */,
1A3DD206125E5A2F004515E6 /* APIClient.h in Headers */,
@@ -10046,6 +10064,7 @@
buildActionMask = 2147483647;
files = (
37A5E01318BBF937000A081E /* _WKActivatedElementInfo.mm in Sources */,
+ F44291941FA59311002CC93E /* _WKAttachment.mm in Sources */,
990D28B21C65209400986977 /* _WKAutomationSession.mm in Sources */,
99788ACC1F421DE200C08000 /* _WKAutomationSessionConfiguration.mm in Sources */,
1A5704F71BE01FF400874AF1 /* _WKContextMenuElementInfo.mm in Sources */,
@@ -10078,6 +10097,7 @@
A182D5B41BE6BD250087A7CC /* AccessibilityIOS.mm in Sources */,
A7D792D61767CB6E00881CBE /* ActivityAssertion.cpp in Sources */,
BC64696F11DBE603006455B0 /* APIArray.cpp in Sources */,
+ 2E5C770F1FA7D429005932C3 /* APIAttachment.cpp in Sources */,
7C89D2B31A6B068C003A5FDE /* APIContentRuleList.cpp in Sources */,
7C3A06A71AAB903E009D74BA /* APIContentRuleListStore.cpp in Sources */,
7CEFA9621AC0999300B910FD /* APIContentRuleListStoreCocoa.mm in Sources */,
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (224237 => 224238)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2017-10-31 19:29:12 UTC (rev 224238)
@@ -163,6 +163,7 @@
#include <WebCore/MIMETypeRegistry.h>
#include <WebCore/MainFrame.h>
#include <WebCore/MouseEvent.h>
+#include <WebCore/NotImplemented.h>
#include <WebCore/Page.h>
#include <WebCore/PageConfiguration.h>
#include <WebCore/PlatformKeyboardEvent.h>
@@ -5764,4 +5765,15 @@
callback(wasGranted);
}
+#if ENABLE(ATTACHMENT_ELEMENT)
+
+void WebPage::insertAttachment(const String& identifier, const String& filename, std::optional<String> contentType, const IPC::DataReference& data, CallbackID callbackID)
+{
+ auto& frame = m_page->focusController().focusedOrMainFrame();
+ frame.editor().insertAttachment(identifier, filename, SharedBuffer::create(data.data(), data.size()), contentType);
+ send(Messages::WebPageProxy::VoidCallback(callbackID));
+}
+
+#endif // ENABLE(ATTACHMENT_ELEMENT)
+
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (224237 => 224238)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2017-10-31 19:29:12 UTC (rev 224238)
@@ -153,6 +153,7 @@
}
namespace WebKit {
+class DataReference;
class DrawingArea;
class DownloadID;
class FindController;
@@ -998,6 +999,10 @@
void requestStorageAccess(String&& subFrameHost, String&& topFrameHost, WTF::Function<void (bool)>&& callback);
void storageAccessResponse(bool wasGranted, uint64_t contextId);
+#if ENABLE(ATTACHMENT_ELEMENT)
+ void insertAttachment(const String& identifier, const String& filename, std::optional<String> contentType, const IPC::DataReference&, CallbackID);
+#endif
+
private:
WebPage(uint64_t pageID, WebPageCreationParameters&&);
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (224237 => 224238)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2017-10-31 19:29:12 UTC (rev 224238)
@@ -484,4 +484,8 @@
URLSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceError error)
StorageAccessResponse(bool wasGranted, uint64_t contextId)
+
+#if ENABLE(ATTACHMENT_ELEMENT)
+ InsertAttachment(String identifier, String filename, std::optional<String> contentType, IPC::DataReference data, WebKit::CallbackID callbackID)
+#endif
}
Modified: trunk/Tools/ChangeLog (224237 => 224238)
--- trunk/Tools/ChangeLog 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Tools/ChangeLog 2017-10-31 19:29:12 UTC (rev 224238)
@@ -1,3 +1,22 @@
+2017-10-31 Wenson Hsieh <wenson_hs...@apple.com>
+
+ [Attachment Support] Implement WKWebView SPI for inserting attachment elements
+ https://bugs.webkit.org/show_bug.cgi?id=179013
+ <rdar://problem/35249668>
+
+ Reviewed by Tim Horton.
+
+ Adds a new API test suite to exercise attachment element insertion and manipulation.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm: Added.
+ (webViewForTestingAttachments):
+ (testHTMLData):
+ (testImageData):
+ (-[TestWKWebView synchronouslyInsertAttachmentWithFilename:contentType:data:options:]):
+ (-[TestWKWebView valueOfAttribute:forQuerySelector:]):
+ (TestWebKitAPI::TEST):
+
2017-10-31 Alex Christensen <achristen...@webkit.org>
Fix custom header field setting with reloads and asynchronous navigation action policy decisions
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (224237 => 224238)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2017-10-31 19:21:37 UTC (rev 224237)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2017-10-31 19:29:12 UTC (rev 224238)
@@ -89,6 +89,7 @@
2E1DFDF11D42E1E400714A00 /* large-video-seek-to-beginning-and-play-after-ending.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E1DFDF01D42E14400714A00 /* large-video-seek-to-beginning-and-play-after-ending.html */; };
2E205BA41F527746005952DD /* AccessibilityTestsIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E205BA31F527746005952DD /* AccessibilityTestsIOS.mm */; };
2E54F40D1D7BC84200921ADF /* large-video-mutes-onplaying.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E54F40C1D7BC83900921ADF /* large-video-mutes-onplaying.html */; };
+ 2E5C77071FA70136005932C3 /* WKAttachmentTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E5C77061FA70136005932C3 /* WKAttachmentTests.mm */; };
2E691AEA1D78B53600129407 /* large-videos-paused-video-hides-controls.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E691AE81D78B52B00129407 /* large-videos-paused-video-hides-controls.html */; };
2E691AEB1D78B53600129407 /* large-videos-playing-video-keeps-controls.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E691AE91D78B52B00129407 /* large-videos-playing-video-keeps-controls.html */; };
2E691AED1D78B91000129407 /* large-videos-playing-muted-video-hides-controls.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E691AEC1D78B90200129407 /* large-videos-playing-muted-video-hides-controls.html */; };
@@ -1168,6 +1169,7 @@
2E1DFDF01D42E14400714A00 /* large-video-seek-to-beginning-and-play-after-ending.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-video-seek-to-beginning-and-play-after-ending.html"; sourceTree = "<group>"; };
2E205BA31F527746005952DD /* AccessibilityTestsIOS.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AccessibilityTestsIOS.mm; sourceTree = "<group>"; };
2E54F40C1D7BC83900921ADF /* large-video-mutes-onplaying.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-video-mutes-onplaying.html"; sourceTree = "<group>"; };
+ 2E5C77061FA70136005932C3 /* WKAttachmentTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WKAttachmentTests.mm; sourceTree = "<group>"; };
2E691AE81D78B52B00129407 /* large-videos-paused-video-hides-controls.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-videos-paused-video-hides-controls.html"; sourceTree = "<group>"; };
2E691AE91D78B52B00129407 /* large-videos-playing-video-keeps-controls.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-videos-playing-video-keeps-controls.html"; sourceTree = "<group>"; };
2E691AEC1D78B90200129407 /* large-videos-playing-muted-video-hides-controls.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-videos-playing-muted-video-hides-controls.html"; sourceTree = "<group>"; };
@@ -2074,6 +2076,7 @@
51714EB61CF8C7A4004723C4 /* WebProcessKillIDBCleanup.mm */,
5120C83C1E6750790025B250 /* WebsiteDataStoreCustomPaths.mm */,
5C9E56841DF9143D00C9EE33 /* WebsitePolicies.mm */,
+ 2E5C77061FA70136005932C3 /* WKAttachmentTests.mm */,
1F83571A1D3FFB0E00E3967B /* WKBackForwardList.mm */,
5CE354D81E70D9C300BEFE3B /* WKContentExtensionStore.mm */,
2D838B1E1EEF3A5B009B980E /* WKContentViewEditingActions.mm */,
@@ -2440,7 +2443,6 @@
BC9096411255616000083756 /* WebKit */ = {
isa = PBXGroup;
children = (
- 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */,
0F139E741A423A4600F590F5 /* cocoa */,
C0C5D3BB14598B6F00A802A6 /* mac */,
BC90977B125571AE00083756 /* Resources */,
@@ -2478,6 +2480,7 @@
F660AA0C15A5F061003A1243 /* GetInjectedBundleInitializationUserDataCallback.cpp */,
F660AA0F15A5F624003A1243 /* GetInjectedBundleInitializationUserDataCallback_Bundle.cpp */,
07CE1CF21F06A7E000BF89F5 /* GetUserMediaNavigation.mm */,
+ 07E499901F9E56A1002F1EF3 /* GetUserMediaReprompt.mm */,
4BFDFFA8131477770061F24B /* HitTestResultNodeHandle.cpp */,
4BFDFFA61314776C0061F24B /* HitTestResultNodeHandle_Bundle.cpp */,
BC575AAC126E83B9006F0F12 /* InjectedBundleBasic.cpp */,
@@ -3277,7 +3280,6 @@
46397B951DC2C850009A78AE /* DOMNode.mm in Sources */,
7CCE7EBC1A411A7E00447C4C /* DOMNodeFromJSObject.mm in Sources */,
7CCE7EBD1A411A7E00447C4C /* DOMRangeOfString.mm in Sources */,
- 07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */,
7CCE7EEC1A411AE600447C4C /* DOMWindowExtensionBasic.cpp in Sources */,
7CCE7EED1A411AE600447C4C /* DOMWindowExtensionNoCache.cpp in Sources */,
7CCE7F231A411AF600447C4C /* Download.mm in Sources */,
@@ -3324,6 +3326,7 @@
7CCE7EF91A411AE600447C4C /* GetInjectedBundleInitializationUserDataCallback.cpp in Sources */,
7CCE7EE21A411A9A00447C4C /* GetPIDAfterAbortedProcessLaunch.cpp in Sources */,
07CE1CF31F06A7E000BF89F5 /* GetUserMediaNavigation.mm in Sources */,
+ 07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */,
316BDBAC1E7207F100DE0D5A /* GPUBuffer.mm in Sources */,
315231CA1EB3B3C700A22A16 /* GPUCommandQueue.mm in Sources */,
3162AE9C1E6F2FF5000E4DBC /* GPUDevice.mm in Sources */,
@@ -3521,6 +3524,7 @@
7CCE7F1C1A411AE600447C4C /* WillSendSubmitEvent.cpp in Sources */,
7CCE7ED81A411A7E00447C4C /* WillSendSubmitEvent.mm in Sources */,
7CCE7ED91A411A7E00447C4C /* WindowlessWebViewWithMedia.mm in Sources */,
+ 2E5C77071FA70136005932C3 /* WKAttachmentTests.mm in Sources */,
1F83571B1D3FFB2300E3967B /* WKBackForwardList.mm in Sources */,
7CCE7F2E1A411B1000447C4C /* WKBrowsingContextGroupTest.mm in Sources */,
7CCE7F2F1A411B1000447C4C /* WKBrowsingContextLoadDelegateTest.mm in Sources */,
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm (0 => 224238)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKAttachmentTests.mm 2017-10-31 19:29:12 UTC (rev 224238)
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#import "config.h"
+
+#import "PlatformUtilities.h"
+#import "TestWKWebView.h"
+#import <WebKit/WebKit.h>
+#import <WebKit/WebKitPrivate.h>
+#import <wtf/RetainPtr.h>
+
+#if WK_API_ENABLED
+
+static RetainPtr<TestWKWebView> webViewForTestingAttachments()
+{
+ auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ [configuration _setAttachmentElementEnabled:YES];
+
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500) configuration:configuration.get()]);
+ [webView synchronouslyLoadHTMLString:@"<body contenteditable></body><script>document.body.focus();</script>"];
+
+ return webView;
+}
+
+static NSData *testHTMLData()
+{
+ return [@"<a href=''>This is some HTML data</a>" dataUsingEncoding:NSUTF8StringEncoding];
+}
+
+static NSData *testImageData()
+{
+ NSURL *url = "" mainBundle] URLForResource:@"icon" withExtension:@"png" subdirectory:@"TestWebKitAPI.resources"];
+ return [NSData dataWithContentsOfURL:url];
+}
+
+@implementation TestWKWebView (AttachmentTesting)
+
+- (_WKAttachment *)synchronouslyInsertAttachmentWithFilename:(NSString *)filename contentType:(NSString *)contentType data:(NSData *)data options:(_WKAttachmentDisplayOptions *)options
+{
+ __block bool done = false;
+ RetainPtr<_WKAttachment> attachment = [self _insertAttachmentWithFilename:filename contentType:contentType data:data options:options completion:^(BOOL) {
+ done = true;
+ }];
+ TestWebKitAPI::Util::run(&done);
+ return attachment.autorelease();
+}
+
+- (NSString *)valueOfAttribute:(NSString *)attributeName forQuerySelector:(NSString *)querySelector
+{
+ return [self stringByEvaluatingJavaScript:[NSString stringWithFormat:@"document.querySelector('%@').getAttribute('%@')", querySelector, attributeName]];
+}
+
+@end
+
+namespace TestWebKitAPI {
+
+TEST(WKAttachmentTests, AttachmentElementInsertion)
+{
+ auto webView = webViewForTestingAttachments();
+
+ // Use the given content type for the attachment element's type.
+ [webView synchronouslyInsertAttachmentWithFilename:@"foo" contentType:@"text/html" data:testHTMLData() options:nil];
+ EXPECT_WK_STREQ(@"foo", [webView valueOfAttribute:@"title" forQuerySelector:@"attachment"]);
+ EXPECT_WK_STREQ(@"text/html", [webView valueOfAttribute:@"type" forQuerySelector:@"attachment"]);
+ EXPECT_WK_STREQ(@"38 bytes", [webView valueOfAttribute:@"subtitle" forQuerySelector:@"attachment"]);
+
+ // Since no content type is explicitly specified, compute it from the file extension.
+ [webView _executeEditCommand:@"DeleteBackward" argument:nil completion:nil];
+ [webView synchronouslyInsertAttachmentWithFilename:@"bar.png" contentType:nil data:testImageData() options:nil];
+ EXPECT_WK_STREQ(@"bar.png", [webView valueOfAttribute:@"title" forQuerySelector:@"attachment"]);
+ EXPECT_WK_STREQ(@"image/png", [webView valueOfAttribute:@"type" forQuerySelector:@"attachment"]);
+ EXPECT_WK_STREQ(@"37 KB", [webView valueOfAttribute:@"subtitle" forQuerySelector:@"attachment"]);
+}
+
+} // namespace TestWebKitAPI
+
+#endif // WK_API_ENABLED