+2017-11-07 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r224512 and r224521.
+ https://bugs.webkit.org/show_bug.cgi?id=179388
+
+ An API test added with this change is failing an assertion on
+ the bots. (Requested by ryanhaddad on #webkit).
+
+ Reverted changesets:
+
+ "[Attachment Support] Implement delegate hooks for attachment
+ element insertion and removal"
+ https://bugs.webkit.org/show_bug.cgi?id=179016
+ https://trac.webkit.org/changeset/224512
+
+ "Remove stray logging from a newly added API test"
+ https://trac.webkit.org/changeset/224521
+
2017-11-07 Antoine Quint <graouts@apple.com>
<video> does not respect pointer-events
m_editorUIUpdateTimerShouldCheckSpellingAndGrammar = options & FrameSelection::CloseTyping
&& !(options & FrameSelection::SpellCorrectionTriggered);
m_editorUIUpdateTimerWasTriggeredByDictation = options & FrameSelection::DictationTriggered;
- scheduleEditorUIUpdate();
+ m_editorUIUpdateTimer.startOneShot(0_s);
}
#if ENABLE(TELEPHONE_NUMBER_DETECTION) && !PLATFORM(IOS)
m_alternativeTextController->respondToChangedSelection(oldSelection);
m_oldSelectionForEditorUIUpdate = m_frame.selection().selection();
-
-#if ENABLE(ATTACHMENT_ELEMENT)
- notifyClientOfAttachmentUpdates();
-#endif
}
static Node* findFirstMarkable(Node* node)
return TextIterator::subrange(*contextRange, result.location, result.length);
}
-void Editor::scheduleEditorUIUpdate()
-{
- m_editorUIUpdateTimer.startOneShot(0_s);
-}
-
#if ENABLE(ATTACHMENT_ELEMENT)
-void Editor::didInsertAttachmentElement(HTMLAttachmentElement& attachment)
-{
- auto identifier = attachment.uniqueIdentifier();
- if (identifier.isEmpty())
- return;
-
- if (!m_removedAttachmentIdentifiers.take(identifier))
- m_insertedAttachmentIdentifiers.add(identifier);
- scheduleEditorUIUpdate();
-}
-
-void Editor::didRemoveAttachmentElement(HTMLAttachmentElement& attachment)
-{
- auto identifier = attachment.uniqueIdentifier();
- if (identifier.isEmpty())
- return;
-
- if (!m_insertedAttachmentIdentifiers.take(identifier))
- m_removedAttachmentIdentifiers.add(identifier);
- scheduleEditorUIUpdate();
-}
-
-void Editor::notifyClientOfAttachmentUpdates()
-{
- if (auto* editorClient = client()) {
- for (auto& identifier : m_removedAttachmentIdentifiers)
- editorClient->didRemoveAttachment(identifier);
- for (auto& identifier : m_insertedAttachmentIdentifiers)
- editorClient->didInsertAttachment(identifier);
- }
-
- m_removedAttachmentIdentifiers.clear();
- m_insertedAttachmentIdentifiers.clear();
-}
-
void Editor::insertAttachment(const String& identifier, const String& filename, const String& filepath, std::optional<String> contentType)
{
if (!contentType)
void Editor::insertAttachmentFromFile(const String& identifier, const String& filename, const String& contentType, Ref<File>&& file)
{
- auto attachment = HTMLAttachmentElement::create(HTMLNames::attachmentTag, document());
+ 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);
#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);
- void didInsertAttachmentElement(HTMLAttachmentElement&);
- void didRemoveAttachmentElement(HTMLAttachmentElement&);
#endif
private:
static RefPtr<SharedBuffer> dataInRTFFormat(NSAttributedString *);
#endif
- void scheduleEditorUIUpdate();
-
-#if ENABLE(ATTACHMENT_ELEMENT)
- void notifyClientOfAttachmentUpdates();
-#endif
-
void postTextStateChangeNotificationForCut(const String&, const VisibleSelection&);
Frame& m_frame;
EditorParagraphSeparator m_defaultParagraphSeparator { EditorParagraphSeparatorIsDiv };
bool m_overwriteModeEnabled { false };
-#if ENABLE(ATTACHMENT_ELEMENT)
- HashSet<String> m_insertedAttachmentIdentifiers;
- HashSet<String> m_removedAttachmentIdentifiers;
-#endif
-
VisibleSelection m_oldSelectionForEditorUIUpdate;
Timer m_editorUIUpdateTimer;
bool m_editorUIUpdateTimerShouldCheckSpellingAndGrammar { false };
#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)
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));
renderer->invalidate();
}
-Node::InsertedIntoAncestorResult HTMLAttachmentElement::insertedIntoAncestor(InsertionType type, ContainerNode& ancestor)
-{
- auto result = HTMLElement::insertedIntoAncestor(type, ancestor);
- if (auto* frame = document().frame()) {
- if (type.connectedToDocument)
- frame->editor().didInsertAttachmentElement(*this);
- }
- return result;
-}
-
-void HTMLAttachmentElement::removedFromAncestor(RemovalType type, ContainerNode& ancestor)
-{
- HTMLElement::removedFromAncestor(type, ancestor);
- if (auto* frame = document().frame()) {
- if (type.disconnectedFromDocument)
- frame->editor().didRemoveAttachmentElement(*this);
- }
-}
-
void HTMLAttachmentElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
{
if (name == progressAttr || name == subtitleAttr || name == titleAttr || name == typeAttr) {
HTMLElement::parseAttribute(name, value);
}
-String HTMLAttachmentElement::uniqueIdentifier() const
-{
- return attributeWithoutSynchronization(HTMLNames::webkitattachmentidAttr);
-}
-
-void HTMLAttachmentElement::setUniqueIdentifier(const String& identifier)
-{
- setAttributeWithoutSynchronization(HTMLNames::webkitattachmentidAttr, identifier);
-}
-
String HTMLAttachmentElement::attachmentTitle() const
{
auto& title = attributeWithoutSynchronization(titleAttr);
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;
- void setUniqueIdentifier(const String&);
-
- InsertedIntoAncestorResult insertedIntoAncestor(InsertionType, ContainerNode&) final;
- void removedFromAncestor(RemovalType, ContainerNode&) final;
+ WEBCORE_EXPORT String uniqueIdentifier() const { return m_uniqueIdentifier; }
+ void setUniqueIdentifier(const String& identifier) { m_uniqueIdentifier = identifier; }
WEBCORE_EXPORT String attachmentTitle() const;
String attachmentType() const;
private:
HTMLAttachmentElement(const QualifiedName&, Document&);
+ HTMLAttachmentElement(const QualifiedName&, Document&, const String& identifier);
virtual ~HTMLAttachmentElement();
RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
void parseAttribute(const QualifiedName&, const AtomicString&) final;
RefPtr<File> m_file;
+ String m_uniqueIdentifier;
};
} // namespace WebCore
vlink
vspace
webkitallowfullscreen
-webkitattachmentid
webkitattachmentpath
webkitdirectory
width
virtual void didApplyStyle() = 0;
virtual bool shouldMoveRangeAfterDelete(Range*, Range*) = 0;
-#if ENABLE(ATTACHMENT_ELEMENT)
- virtual void didInsertAttachment(const String&) { }
- virtual void didRemoveAttachment(const String&) { }
-#endif
-
virtual void didBeginEditing() = 0;
virtual void respondToChangedContents() = 0;
virtual void respondToChangedSelection(Frame*) = 0;
+2017-11-07 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r224512 and r224521.
+ https://bugs.webkit.org/show_bug.cgi?id=179388
+
+ An API test added with this change is failing an assertion on
+ the bots. (Requested by ryanhaddad on #webkit).
+
+ Reverted changesets:
+
+ "[Attachment Support] Implement delegate hooks for attachment
+ element insertion and removal"
+ https://bugs.webkit.org/show_bug.cgi?id=179016
+ https://trac.webkit.org/changeset/224512
+
+ "Remove stray logging from a newly added API test"
+ https://trac.webkit.org/changeset/224521
+
2017-11-07 Chris Dumez <cdumez@apple.com>
[Service Workers] Add support for "install" event
- (void)_webView:(WKWebView *)webView runBeforeUnloadConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler WK_API_AVAILABLE(macosx(10.13), ios(11.0));
- (void)_webView:(WKWebView *)webView editorStateDidChange:(NSDictionary *)editorState WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
-- (void)_webView:(WKWebView *)webView didRemoveAttachment:(_WKAttachment *)attachment WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
-- (void)_webView:(WKWebView *)webView didInsertAttachment:(_WKAttachment *)attachment WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
-
#if TARGET_OS_IPHONE
- (BOOL)_webView:(WKWebView *)webView shouldIncludeAppLinkActionsForElement:(_WKActivatedElementInfo *)element WK_API_AVAILABLE(ios(9.0));
- (NSArray *)_webView:(WKWebView *)webView actionsForElement:(_WKActivatedElementInfo *)element defaultActions:(NSArray<_WKElementAction *> *)defaultActions;
[uiDelegate _webView:self editorStateDidChange:dictionaryRepresentationForEditorState(_page->editorState())];
}
-#if ENABLE(ATTACHMENT_ELEMENT)
-
-- (void)_didInsertAttachment:(NSString *)identifier
-{
- id <WKUIDelegatePrivate> uiDelegate = (id <WKUIDelegatePrivate>)self.UIDelegate;
- if ([uiDelegate respondsToSelector:@selector(_webView:didInsertAttachment:)])
- [uiDelegate _webView:self didInsertAttachment:[wrapper(API::Attachment::create(identifier, *_page).leakRef()) autorelease]];
-}
-
-- (void)_didRemoveAttachment:(NSString *)identifier
-{
- id <WKUIDelegatePrivate> uiDelegate = (id <WKUIDelegatePrivate>)self.UIDelegate;
- if ([uiDelegate respondsToSelector:@selector(_webView:didRemoveAttachment:)])
- [uiDelegate _webView:self didRemoveAttachment:[wrapper(API::Attachment::create(identifier, *_page).leakRef()) autorelease]];
-}
-
-#endif // ENABLE(ATTACHMENT_ELEMENT)
-
#pragma mark iOS-specific methods
#if PLATFORM(IOS)
@property (nonatomic, readonly) UIEdgeInsets _computedUnobscuredSafeAreaInset;
#endif
-#if ENABLE(ATTACHMENT_ELEMENT)
-- (void)_didRemoveAttachment:(NSString *)identifier;
-- (void)_didInsertAttachment:(NSString *)identifier;
-#endif
-
- (WKPageRef)_pageForTesting;
- (WebKit::WebPageProxy*)_page;
: m_webView(webView) { }
void isPlayingAudioWillChange() final;
void isPlayingAudioDidChange() final;
-
-#if ENABLE(ATTACHMENT_ELEMENT)
- void didInsertAttachment(const String& identifier) final;
- void didRemoveAttachment(const String& identifier) final;
-#endif
-
protected:
WKWebView *m_webView;
};
#import "config.h"
#import "PageClientImplCocoa.h"
-#import "WKWebViewInternal.h"
+#import "WKWebViewPrivate.h"
namespace WebKit {
[m_webView didChangeValueForKey:NSStringFromSelector(@selector(_isPlayingAudio))];
#endif
}
-
-#if ENABLE(ATTACHMENT_ELEMENT)
-
-void PageClientImplCocoa::didInsertAttachment(const String& identifier)
-{
-#if WK_API_ENABLED
- [m_webView _didInsertAttachment:identifier];
-#else
- UNUSED_PARAM(identifier);
-#endif
-}
-
-void PageClientImplCocoa::didRemoveAttachment(const String& identifier)
-{
-#if WK_API_ENABLED
- [m_webView _didRemoveAttachment:identifier];
-#else
- UNUSED_PARAM(identifier);
-#endif
-}
-
-#endif
}
virtual void didChangeDataInteractionCaretRect(const WebCore::IntRect& previousCaretRect, const WebCore::IntRect& caretRect) = 0;
#endif
-#if ENABLE(ATTACHMENT_ELEMENT)
- virtual void didInsertAttachment(const String& identifier) { }
- virtual void didRemoveAttachment(const String& identifier) { }
-#endif
-
#if PLATFORM(GTK) || PLATFORM(WPE)
virtual JSGlobalContextRef javascriptGlobalContext() { return nullptr; }
#endif
m_process->send(Messages::WebPage::InsertAttachment(identifier, filename, contentType, IPC::SharedBufferDataReference { &data }, callbackID), m_pageID);
}
-void WebPageProxy::didInsertAttachment(const String& identifier)
-{
- m_pageClient.didInsertAttachment(identifier);
-}
-
-void WebPageProxy::didRemoveAttachment(const String& identifier)
-{
- m_pageClient.didRemoveAttachment(identifier);
-}
-
#endif // ENABLE(ATTACHMENT_ELEMENT)
} // namespace WebKit
void stopAllURLSchemeTasks();
-#if ENABLE(ATTACHMENT_ELEMENT)
- void didInsertAttachment(const String& identifier);
- void didRemoveAttachment(const String& identifier);
-#endif
-
PageClient& m_pageClient;
Ref<API::PageConfiguration> m_configuration;
StopURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier)
RequestStorageAccess(String subFrameHost, String topFrameHost, uint64_t contextID)
-
-#if ENABLE(ATTACHMENT_ELEMENT)
- DidInsertAttachment(String identifier)
- DidRemoveAttachment(String identifier)
-#endif
}
return result;
}
-#if ENABLE(ATTACHMENT_ELEMENT)
-
-void WebEditorClient::didInsertAttachment(const String& identifier)
-{
- m_page->send(Messages::WebPageProxy::DidInsertAttachment(identifier));
-}
-
-void WebEditorClient::didRemoveAttachment(const String& identifier)
-{
- m_page->send(Messages::WebPageProxy::DidRemoveAttachment(identifier));
-}
-
-#endif
-
void WebEditorClient::didApplyStyle()
{
m_page->didApplyStyle();
void didApplyStyle() final;
bool shouldMoveRangeAfterDelete(WebCore::Range*, WebCore::Range*) final;
-#if ENABLE(ATTACHMENT_ELEMENT)
- void didInsertAttachment(const String& identifier) final;
- void didRemoveAttachment(const String& identifier) final;
-#endif
-
void didBeginEditing() final;
void respondToChangedContents() final;
void respondToChangedSelection(WebCore::Frame*) final;
+2017-11-07 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r224512 and r224521.
+ https://bugs.webkit.org/show_bug.cgi?id=179388
+
+ An API test added with this change is failing an assertion on
+ the bots. (Requested by ryanhaddad on #webkit).
+
+ Reverted changesets:
+
+ "[Attachment Support] Implement delegate hooks for attachment
+ element insertion and removal"
+ https://bugs.webkit.org/show_bug.cgi?id=179016
+ https://trac.webkit.org/changeset/224512
+
+ "Remove stray logging from a newly added API test"
+ https://trac.webkit.org/changeset/224521
+
2017-11-06 Wenson Hsieh <wenson_hsieh@apple.com>
Remove stray logging from a newly added API test
#if WK_API_ENABLED
-@interface AttachmentUpdateObserver : NSObject <WKUIDelegatePrivate>
-@property (nonatomic, readonly) NSArray *inserted;
-@property (nonatomic, readonly) NSArray *removed;
-@end
-
-@implementation AttachmentUpdateObserver {
- RetainPtr<NSMutableArray<_WKAttachment *>> _inserted;
- RetainPtr<NSMutableArray<_WKAttachment *>> _removed;
-}
-
-- (instancetype)init
-{
- if (self = [super init]) {
- _inserted = adoptNS([[NSMutableArray alloc] init]);
- _removed = adoptNS([[NSMutableArray alloc] init]);
- }
- return self;
-}
-
-- (NSArray<_WKAttachment *> *)inserted
-{
- return _inserted.get();
-}
-
-- (NSArray<_WKAttachment *> *)removed
-{
- return _removed.get();
-}
-
-- (void)_webView:(WKWebView *)webView didInsertAttachment:(_WKAttachment *)attachment
-{
- [_inserted addObject:attachment];
-}
-
-- (void)_webView:(WKWebView *)webView didRemoveAttachment:(_WKAttachment *)attachment
-{
- [_removed addObject:attachment];
-}
-
-@end
-
-namespace TestWebKitAPI {
-
-class ObserveAttachmentUpdatesForScope {
-public:
- ObserveAttachmentUpdatesForScope(TestWKWebView *webView)
- : m_webView(webView)
- {
- m_previousDelegate = retainPtr(webView.UIDelegate);
- m_observer = adoptNS([[AttachmentUpdateObserver alloc] init]);
- webView.UIDelegate = m_observer.get();
- }
-
- ~ObserveAttachmentUpdatesForScope()
- {
- [m_webView setUIDelegate:m_previousDelegate.get()];
- }
-
- AttachmentUpdateObserver *observer() const { return m_observer.get(); }
-
- void expectAttachmentUpdates(NSArray<_WKAttachment *> *removed, NSArray<_WKAttachment *> *inserted)
- {
- BOOL removedAttachmentsMatch = [observer().removed isEqual:removed];
- if (!removedAttachmentsMatch)
- NSLog(@"Expected removed attachments: %@ to match %@.", observer().removed, removed);
- EXPECT_TRUE(removedAttachmentsMatch);
-
- BOOL insertedAttachmentsMatch = [observer().inserted isEqual:inserted];
- if (!insertedAttachmentsMatch)
- NSLog(@"Expected inserted attachments: %@ to match %@.", observer().inserted, inserted);
- EXPECT_TRUE(insertedAttachmentsMatch);
- }
-
-private:
- RetainPtr<AttachmentUpdateObserver> m_observer;
- RetainPtr<TestWKWebView> m_webView;
- RetainPtr<id> m_previousDelegate;
-};
-
-}
-
-@interface TestWKWebView (AttachmentTesting)
-@end
-
static RetainPtr<TestWKWebView> webViewForTestingAttachments()
{
auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
@implementation TestWKWebView (AttachmentTesting)
-- (BOOL)_synchronouslyExecuteEditCommand:(NSString *)command argument:(NSString *)argument
-{
- __block bool done = false;
- __block bool success;
- [self _executeEditCommand:command argument:argument completion:^(BOOL completionSuccess) {
- done = true;
- success = completionSuccess;
- }];
- TestWebKitAPI::Util::run(&done);
- return success;
-}
-
- (_WKAttachment *)synchronouslyInsertAttachmentWithFilename:(NSString *)filename contentType:(NSString *)contentType data:(NSData *)data options:(_WKAttachmentDisplayOptions *)options
{
__block bool done = false;
return [self stringByEvaluatingJavaScript:[NSString stringWithFormat:@"document.querySelector('%@').getAttribute('%@')", querySelector, attributeName]];
}
-- (void)expectUpdatesAfterCommand:(NSString *)command withArgument:(NSString *)argument expectedRemovals:(NSArray<_WKAttachment *> *)removed expectedInsertions:(NSArray<_WKAttachment *> *)inserted
-{
- TestWebKitAPI::ObserveAttachmentUpdatesForScope observer(self);
- EXPECT_TRUE([self _synchronouslyExecuteEditCommand:command argument:argument]);
- observer.expectAttachmentUpdates(removed, inserted);
-}
-
@end
namespace TestWebKitAPI {
TEST(WKAttachmentTests, AttachmentElementInsertion)
{
auto webView = webViewForTestingAttachments();
- RetainPtr<_WKAttachment> firstAttachment;
- RetainPtr<_WKAttachment> secondAttachment;
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- // Use the given content type for the attachment element's type.
- firstAttachment = retainPtr([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"]);
- observer.expectAttachmentUpdates(@[ ], @[ firstAttachment.get() ]);
- }
- {
- ObserveAttachmentUpdatesForScope scope(webView.get());
- // Since no content type is explicitly specified, compute it from the file extension.
- [webView _executeEditCommand:@"DeleteBackward" argument:nil completion:nil];
- secondAttachment = retainPtr([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"]);
- scope.expectAttachmentUpdates(@[ firstAttachment.get() ], @[ secondAttachment.get() ]);
- }
-}
-
-TEST(WKAttachmentTests, AttachmentUpdatesWhenInsertingAndDeletingNewline)
-{
- auto webView = webViewForTestingAttachments();
- RetainPtr<_WKAttachment> attachment;
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- attachment = retainPtr([webView synchronouslyInsertAttachmentWithFilename:@"foo.txt" contentType:@"text/plain" data:testHTMLData() options:nil]);
- observer.expectAttachmentUpdates(@[ ], @[attachment.get()]);
- }
- [webView expectUpdatesAfterCommand:@"InsertParagraph" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"DeleteBackward" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView stringByEvaluatingJavaScript:@"getSelection().collapse(document.body)"];
- [webView expectUpdatesAfterCommand:@"InsertParagraph" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"DeleteForward" withArgument:nil expectedRemovals:@[attachment.get()] expectedInsertions:@[]];
-}
-TEST(WKAttachmentTests, AttachmentUpdatesWhenUndoingAndRedoing)
-{
- auto webView = webViewForTestingAttachments();
- RetainPtr<_WKAttachment> attachment;
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- attachment = retainPtr([webView synchronouslyInsertAttachmentWithFilename:@"foo.txt" contentType:@"text/plain" data:testHTMLData() options:nil]);
- observer.expectAttachmentUpdates(@[ ], @[attachment.get()]);
- }
- [webView expectUpdatesAfterCommand:@"Undo" withArgument:nil expectedRemovals:@[attachment.get()] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"Redo" withArgument:nil expectedRemovals:@[] expectedInsertions:@[attachment.get()]];
- [webView expectUpdatesAfterCommand:@"DeleteBackward" withArgument:nil expectedRemovals:@[attachment.get()] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"Undo" withArgument:nil expectedRemovals:@[] expectedInsertions:@[attachment.get()]];
- [webView expectUpdatesAfterCommand:@"Redo" withArgument:nil expectedRemovals:@[attachment.get()] expectedInsertions:@[]];
-}
-
-TEST(WKAttachmentTests, AttachmentUpdatesWhenChangingFontStyles)
-{
- auto webView = webViewForTestingAttachments();
- RetainPtr<_WKAttachment> attachment;
- [webView _synchronouslyExecuteEditCommand:@"InsertText" argument:@"Hello"];
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- attachment = retainPtr([webView synchronouslyInsertAttachmentWithFilename:@"foo.txt" contentType:@"text/plain" data:testHTMLData() options:nil]);
- observer.expectAttachmentUpdates(@[ ], @[attachment.get()]);
- }
- [webView expectUpdatesAfterCommand:@"InsertText" withArgument:@"World" expectedRemovals:@[] expectedInsertions:@[]];
- [webView _synchronouslyExecuteEditCommand:@"SelectAll" argument:nil];
- [webView expectUpdatesAfterCommand:@"ToggleBold" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"ToggleItalic" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"ToggleUnderline" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
-
- // Inserting text should delete the current selection, removing the attachment in the process.
- [webView expectUpdatesAfterCommand:@"InsertText" withArgument:@"foo" expectedRemovals:@[attachment.get()] expectedInsertions:@[]];
-}
-
-TEST(WKAttachmentTests, AttachmentUpdatesWhenInsertingLists)
-{
- auto webView = webViewForTestingAttachments();
- RetainPtr<_WKAttachment> attachment;
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- attachment = retainPtr([webView synchronouslyInsertAttachmentWithFilename:@"foo.txt" contentType:@"text/plain" data:testHTMLData() options:nil]);
- observer.expectAttachmentUpdates(@[ ], @[attachment.get()]);
- }
- [webView expectUpdatesAfterCommand:@"InsertOrderedList" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- // This edit command behaves more like a "toggle", and will actually break us out of the list we just inserted.
- [webView expectUpdatesAfterCommand:@"InsertOrderedList" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"InsertUnorderedList" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
- [webView expectUpdatesAfterCommand:@"InsertUnorderedList" withArgument:nil expectedRemovals:@[] expectedInsertions:@[]];
-}
-
-TEST(WKAttachmentTests, AttachmentUpdatesWhenInsertingRichMarkup)
-{
- auto webView = webViewForTestingAttachments();
- RetainPtr<_WKAttachment> attachment;
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- [webView _synchronouslyExecuteEditCommand:@"InsertHTML" argument:@"<div><strong><attachment title='a' webkitattachmentid='a06fec41-9aa0-4c2c-ba3a-0149b54aad99'></attachment></strong></div>"];
- attachment = observer.observer().inserted[0];
- observer.expectAttachmentUpdates(@[ ], @[attachment.get()]);
- }
- {
- ObserveAttachmentUpdatesForScope observer(webView.get());
- [webView stringByEvaluatingJavaScript:@"document.querySelector('attachment').remove()"];
- [webView waitForNextPresentationUpdate];
- observer.expectAttachmentUpdates(@[attachment.get()], @[ ]);
- }
+ // 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