Diff
Modified: trunk/Source/WebKit/ChangeLog (236864 => 236865)
--- trunk/Source/WebKit/ChangeLog 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/ChangeLog 2018-10-05 00:47:05 UTC (rev 236865)
@@ -1,3 +1,79 @@
+2018-10-04 Wenson Hsieh <wenson_hs...@apple.com>
+
+ [Cocoa] Add SPI to expose typing attributes at the current selection on WKWebView
+ https://bugs.webkit.org/show_bug.cgi?id=190119
+ <rdar://problem/44767062>
+
+ Reviewed by Tim Horton.
+
+ Add support for new WebKit2 SPI to notify the UI delegate about font attributes when the editor state changes
+ (e.g. due to selection changes, or executing an edit command). See below for more detail.
+
+ Test: FontAttributes.FontAttributesAfterChangingSelection
+
+ * Shared/EditorState.cpp:
+ (WebKit::EditorState::PostLayoutData::encode const):
+ (WebKit::EditorState::PostLayoutData::decode):
+ * Shared/EditorState.h:
+
+ Add a new optional `FontAttributes` member to EditorState's post-layout data. FontAttributes are computed and
+ sent over IPC only if the UI delegate implements the new delegate hook which requires information about font
+ attributes.
+
+ * Shared/WebPageCreationParameters.cpp:
+ (WebKit::WebPageCreationParameters::encode const):
+ (WebKit::WebPageCreationParameters::decode):
+ * Shared/WebPageCreationParameters.h:
+
+ Add a new flag for the UI process to let a new web page know whether it should additionally compute font
+ attributes when computing editor state.
+
+ * UIProcess/API/APIUIClient.h:
+ (API::UIClient::needsFontAttributes const):
+ (API::UIClient::didChangeFontAttributes):
+ * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _didChangeEditorState]):
+ * UIProcess/Cocoa/UIDelegate.h:
+ * UIProcess/Cocoa/UIDelegate.mm:
+ (WebKit::UIDelegate::setDelegate):
+ (WebKit::UIDelegate::UIClient::didChangeFontAttributes):
+
+ Call out to the UI delegate with a font attribute dictionary, created via FontAttributes on EditorState's
+ post-layout data.
+
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::setUIClient):
+
+ Update whether or not the UI process needs to know about font attributes. The UI process only requires font
+ attribute information if the UI delegate implements `-_webView:didChangeFontAttributes:`.
+
+ (WebKit::WebPageProxy::setNeedsFontAttributes):
+ (WebKit::WebPageProxy::creationParameters):
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/ios/WebPageProxyIOS.mm:
+ (WebKit::WebPageProxy::editorStateChanged):
+ * UIProcess/mac/WebPageProxyMac.mm:
+ (WebKit::WebPageProxy::editorStateChanged):
+
+ Update the cached font attributes in the UI process when receiving a new editor state update.
+
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::m_cpuLimit):
+ (WebKit::WebPage::editorState const):
+ (WebKit::WebPage::setNeedsFontAttributes):
+
+ Add a new IPC hook to update whether or not the page should additionally compute font attributes. In the case
+ where the UI delegate changes from something that does not require font attributes to one that does, we
+ additionally schedule an editor state update.
+
+ (WebKit::WebPage::updateFontAttributesAfterEditorStateChange):
+
+ Private helper function to plumb FontAttributes to the UI client after an editor state change.
+
+ * WebProcess/WebPage/WebPage.h:
+ * WebProcess/WebPage/WebPage.messages.in:
+
2018-10-04 Jeremy Jones <jere...@apple.com>
Unify implementation in VideoFullscreenInterfaceAVKit
Modified: trunk/Source/WebKit/Shared/EditorState.cpp (236864 => 236865)
--- trunk/Source/WebKit/Shared/EditorState.cpp 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/Shared/EditorState.cpp 2018-10-05 00:47:05 UTC (rev 236865)
@@ -138,6 +138,7 @@
encoder << paragraphContextForCandidateRequest;
encoder << stringForCandidateRequest;
#endif
+ encoder << fontAttributes;
encoder << canCut;
encoder << canCopy;
encoder << canPaste;
@@ -200,6 +201,13 @@
return false;
#endif
+ std::optional<std::optional<FontAttributes>> optionalFontAttributes;
+ decoder >> optionalFontAttributes;
+ if (!optionalFontAttributes)
+ return false;
+
+ result.fontAttributes = optionalFontAttributes.value();
+
if (!decoder.decode(result.canCut))
return false;
if (!decoder.decode(result.canCopy))
Modified: trunk/Source/WebKit/Shared/EditorState.h (236864 => 236865)
--- trunk/Source/WebKit/Shared/EditorState.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/Shared/EditorState.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -27,6 +27,7 @@
#include "ArgumentCoders.h"
#include <WebCore/Color.h>
+#include <WebCore/FontAttributes.h>
#include <WebCore/IntRect.h>
#include <wtf/text/WTFString.h>
@@ -114,6 +115,8 @@
String stringForCandidateRequest;
#endif
+ std::optional<WebCore::FontAttributes> fontAttributes;
+
bool canCut { false };
bool canCopy { false };
bool canPaste { false };
Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp (236864 => 236865)
--- trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp 2018-10-05 00:47:05 UTC (rev 236865)
@@ -110,6 +110,7 @@
#if ENABLE(SERVICE_WORKER)
encoder << hasRegisteredServiceWorkers;
#endif
+ encoder << needsFontAttributes;
encoder << iceCandidateFilteringEnabled;
encoder << enumeratingAllNetworkInterfacesEnabled;
encoder << userContentWorlds;
@@ -305,6 +306,9 @@
return std::nullopt;
#endif
+ if (!decoder.decode(parameters.needsFontAttributes))
+ return std::nullopt;
+
if (!decoder.decode(parameters.iceCandidateFilteringEnabled))
return std::nullopt;
Modified: trunk/Source/WebKit/Shared/WebPageCreationParameters.h (236864 => 236865)
--- trunk/Source/WebKit/Shared/WebPageCreationParameters.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/Shared/WebPageCreationParameters.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -173,6 +173,8 @@
bool hasRegisteredServiceWorkers { true };
#endif
+ bool needsFontAttributes { false };
+
// WebRTC members.
bool iceCandidateFilteringEnabled { true };
bool enumeratingAllNetworkInterfacesEnabled { false };
Modified: trunk/Source/WebKit/UIProcess/API/APIUIClient.h (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/API/APIUIClient.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/API/APIUIClient.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -40,6 +40,7 @@
namespace WebCore {
class ResourceRequest;
+struct FontAttributes;
struct SecurityOriginData;
struct WindowFeatures;
}
@@ -123,6 +124,9 @@
completionHandler(currentQuota);
}
+ virtual bool needsFontAttributes() const { return false; }
+ virtual void didChangeFontAttributes(const WebCore::FontAttributes&) { }
+
virtual bool runOpenPanel(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, OpenPanelParameters*, WebKit::WebOpenPanelResultListenerProxy*) { return false; }
virtual void decidePolicyForGeolocationPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, Function<void(bool)>&) { }
virtual bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, SecurityOrigin&, SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) { return false; }
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -121,6 +121,8 @@
- (void)_webView:(WKWebView *)webView requestStorageAccessPanelForDomain:(NSString *)requestingDomain underCurrentDomain:(NSString *)currentDomain completionHandler:(void (^)(BOOL result))completionHandler WK_API_AVAILABLE(macosx(10.14), ios(12.0));
+- (void)_webView:(WKWebView *)webView didChangeFontAttributes:(NSDictionary<NSString *, id> *)fontAttributes 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;
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-10-05 00:47:05 UTC (rev 236865)
@@ -1250,6 +1250,10 @@
- (void)_didChangeEditorState
{
id <WKUIDelegatePrivate> uiDelegate = (id <WKUIDelegatePrivate>)self.UIDelegate;
+
+ // FIXME: We should either rename -_webView:editorStateDidChange: to clarify that it's only intended for use when testing,
+ // or remove it entirely and use -_webView:didChangeFontAttributes: instead once text alignment is supported in the set of
+ // font attributes.
if ([uiDelegate respondsToSelector:@selector(_webView:editorStateDidChange:)])
[uiDelegate _webView:self editorStateDidChange:dictionaryRepresentationForEditorState(_page->editorState())];
}
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -121,6 +121,8 @@
void didExceedBackgroundResourceLimitWhileInForeground(WebPageProxy&, WKResourceLimit) final;
void saveDataToFileInDownloadsFolder(WebPageProxy*, const WTF::String&, const WTF::String&, const WebCore::URL&, API::Data&) final;
#endif
+ bool needsFontAttributes() const final { return m_uiDelegate.m_delegateMethods.webViewDidChangeFontAttributes; }
+ void didChangeFontAttributes(const WebCore::FontAttributes&) final;
bool decidePolicyForUserMediaPermissionRequest(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionRequestProxy&) final;
bool checkUserMediaPermissionForOrigin(WebPageProxy&, WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, UserMediaPermissionCheckProxy&) final;
void mediaCaptureStateDidChange(WebCore::MediaProducer::MediaStateFlags) final;
@@ -198,6 +200,7 @@
bool webViewRequestUserMediaAuthorizationForDevicesURLMainFrameURLDecisionHandler : 1;
bool webViewCheckUserMediaPermissionForURLMainFrameURLFrameIdentifierDecisionHandler : 1;
bool webViewMediaCaptureStateDidChange : 1;
+ bool webViewDidChangeFontAttributes : 1;
#if PLATFORM(IOS)
#if HAVE(APP_LINKS)
bool webViewShouldIncludeAppLinkActionsForElement : 1;
Modified: trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm 2018-10-05 00:47:05 UTC (rev 236865)
@@ -50,6 +50,7 @@
#import "_WKContextMenuElementInfo.h"
#import "_WKFrameHandleInternal.h"
#import "_WKHitTestResultInternal.h"
+#import <WebCore/FontAttributes.h>
#import <WebCore/SecurityOriginData.h>
#import <WebCore/URL.h>
#import <wtf/BlockPtr.h>
@@ -152,6 +153,7 @@
m_delegateMethods.webViewRequestUserMediaAuthorizationForDevicesURLMainFrameURLDecisionHandler = [delegate respondsToSelector:@selector(_webView:requestUserMediaAuthorizationForDevices:url:mainFrameURL:decisionHandler:)];
m_delegateMethods.webViewCheckUserMediaPermissionForURLMainFrameURLFrameIdentifierDecisionHandler = [delegate respondsToSelector:@selector(_webView:checkUserMediaPermissionForURL:mainFrameURL:frameIdentifier:decisionHandler:)];
m_delegateMethods.webViewMediaCaptureStateDidChange = [delegate respondsToSelector:@selector(_webView:mediaCaptureStateDidChange:)];
+ m_delegateMethods.webViewDidChangeFontAttributes = [delegate respondsToSelector:@selector(_webView:didChangeFontAttributes:)];
m_delegateMethods.dataDetectionContextForWebView = [delegate respondsToSelector:@selector(_dataDetectionContextForWebView:)];
m_delegateMethods.webViewImageOrMediaDocumentSizeChanged = [delegate respondsToSelector:@selector(_webView:imageOrMediaDocumentSizeChanged:)];
@@ -883,6 +885,15 @@
}
#endif
+void UIDelegate::UIClient::didChangeFontAttributes(const WebCore::FontAttributes& fontAttributes)
+{
+ if (!needsFontAttributes())
+ return;
+
+ auto privateUIDelegate = (id <WKUIDelegatePrivate>)m_uiDelegate.m_delegate.get();
+ [privateUIDelegate _webView:m_uiDelegate.m_webView didChangeFontAttributes:fontAttributes.createDictionary().get()];
+}
+
bool UIDelegate::UIClient::decidePolicyForUserMediaPermissionRequest(WebPageProxy& page, WebFrameProxy& frame, API::SecurityOrigin& userMediaOrigin, API::SecurityOrigin& topLevelOrigin, UserMediaPermissionRequestProxy& request)
{
#if ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-10-05 00:47:05 UTC (rev 236865)
@@ -606,6 +606,7 @@
m_process->send(Messages::WebPage::SetCanRunBeforeUnloadConfirmPanel(m_uiClient->canRunBeforeUnloadConfirmPanel()), m_pageID);
setCanRunModal(m_uiClient->canRunModal());
+ setNeedsFontAttributes(m_uiClient->needsFontAttributes());
}
void WebPageProxy::setIconLoadingClient(std::unique_ptr<API::IconLoadingClient>&& iconLoadingClient)
@@ -1733,6 +1734,30 @@
m_process->send(Messages::WebPage::ValidateCommand(commandName, callbackID), m_pageID);
}
+void WebPageProxy::updateFontAttributesAfterEditorStateChange()
+{
+ m_cachedFontAttributesAtSelectionStart.reset();
+
+ if (m_editorState.isMissingPostLayoutData)
+ return;
+
+ if (auto fontAttributes = m_editorState.postLayoutData().fontAttributes) {
+ m_uiClient->didChangeFontAttributes(*fontAttributes);
+ m_cachedFontAttributesAtSelectionStart = WTFMove(fontAttributes);
+ }
+}
+
+void WebPageProxy::setNeedsFontAttributes(bool needsFontAttributes)
+{
+ if (m_needsFontAttributes == needsFontAttributes)
+ return;
+
+ m_needsFontAttributes = needsFontAttributes;
+
+ if (isValid())
+ m_process->send(Messages::WebPage::SetNeedsFontAttributes(needsFontAttributes), m_pageID);
+}
+
bool WebPageProxy::maintainsInactiveSelection() const
{
// Regardless of what the client wants to do, keep selections if a local Inspector is open.
@@ -6354,6 +6379,8 @@
parameters.applicationManifest = m_configuration->applicationManifest() ? std::optional<WebCore::ApplicationManifest>(m_configuration->applicationManifest()->applicationManifest()) : std::nullopt;
#endif
+ parameters.needsFontAttributes = m_needsFontAttributes;
+
m_process->addWebUserContentControllerProxy(m_userContentController, parameters);
return parameters;
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -1847,6 +1847,9 @@
void continueNavigationInNewProcess(API::Navigation&, Ref<WebProcessProxy>&&);
+ void setNeedsFontAttributes(bool);
+ void updateFontAttributesAfterEditorStateChange();
+
WeakPtr<PageClient> m_pageClient;
Ref<API::PageConfiguration> m_configuration;
@@ -2259,6 +2262,8 @@
RunLoop::Timer<WebPageProxy> m_resetRecentCrashCountTimer;
unsigned m_recentCrashCount { 0 };
+
+ bool m_needsFontAttributes { false };
};
} // namespace WebKit
Modified: trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm 2018-10-05 00:47:05 UTC (rev 236865)
@@ -1053,7 +1053,6 @@
bool couldChangeSecureInputState = m_editorState.isInPasswordField != editorState.isInPasswordField || m_editorState.selectionIsNone;
m_editorState = editorState;
- m_cachedFontAttributesAtSelectionStart.reset();
// Selection being none is a temporary state when editing. Flipping secure input state too quickly was causing trouble (not fully understood).
if (couldChangeSecureInputState && !editorState.selectionIsNone)
@@ -1065,6 +1064,7 @@
// We always need to notify the client on iOS to make sure the selection is redrawn,
// even during composition to support phrase boundary gesture.
pageClient().selectionDidChange();
+ updateFontAttributesAfterEditorStateChange();
}
void WebPageProxy::showValidationMessage(const IntRect& anchorClientRect, const String& message)
Modified: trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm (236864 => 236865)
--- trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/UIProcess/mac/WebPageProxyMac.mm 2018-10-05 00:47:05 UTC (rev 236865)
@@ -650,7 +650,6 @@
bool couldChangeSecureInputState = m_editorState.isInPasswordField != editorState.isInPasswordField || m_editorState.selectionIsNone;
m_editorState = editorState;
- m_cachedFontAttributesAtSelectionStart.reset();
// Selection being none is a temporary state when editing. Flipping secure input state too quickly was causing trouble (not fully understood).
if (couldChangeSecureInputState && !editorState.selectionIsNone)
@@ -660,6 +659,7 @@
return;
pageClient().selectionDidChange();
+ updateFontAttributesAfterEditorStateChange();
}
void WebPageProxy::startWindowDrag()
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (236864 => 236865)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp 2018-10-05 00:47:05 UTC (rev 236865)
@@ -599,6 +599,8 @@
ServiceWorkerProvider::singleton().setMayHaveRegisteredServiceWorkers();
#endif
+ m_needsFontAttributes = parameters.needsFontAttributes;
+
#if ENABLE(WEB_RTC)
if (!parameters.iceCandidateFilteringEnabled)
disableICECandidateFiltering();
@@ -935,6 +937,9 @@
postLayoutData.canCopy = editor.canCopy();
postLayoutData.canPaste = editor.canPaste();
+ if (m_needsFontAttributes)
+ postLayoutData.fontAttributes = editor.fontAttributesAtSelectionStart();
+
#if PLATFORM(COCOA)
if (result.isContentEditable && !selection.isNone()) {
if (auto editingStyle = EditingStyle::styleAtSelectionStart(selection)) {
@@ -2491,6 +2496,17 @@
executeEditingCommand(commandName, argument);
}
+void WebPage::setNeedsFontAttributes(bool needsFontAttributes)
+{
+ if (m_needsFontAttributes == needsFontAttributes)
+ return;
+
+ m_needsFontAttributes = needsFontAttributes;
+
+ if (m_needsFontAttributes)
+ sendPartialEditorStateAndSchedulePostLayoutUpdate();
+}
+
void WebPage::restoreSessionInternal(const Vector<BackForwardListItemState>& itemStates, WasRestoredByAPIRequest restoredByAPIRequest, WebBackForwardListProxy::OverwriteExistingItem overwrite)
{
for (const auto& itemState : itemStates) {
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (236864 => 236865)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2018-10-05 00:47:05 UTC (rev 236865)
@@ -1179,6 +1179,8 @@
void executeEditCommand(const String&, const String&);
void setEditable(bool);
+ void setNeedsFontAttributes(bool);
+
void mouseEvent(const WebMouseEvent&);
void keyEvent(const WebKeyboardEvent&);
@@ -1740,6 +1742,7 @@
#endif
bool m_isSuspended { false };
+ bool m_needsFontAttributes { false };
};
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (236864 => 236865)
--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in 2018-10-05 00:47:05 UTC (rev 236865)
@@ -209,6 +209,8 @@
ValidateCommand(String name, WebKit::CallbackID callbackID)
ExecuteEditCommand(String name, String argument)
+ SetNeedsFontAttributes(bool needsFontAttributes)
+
RequestFontAttributesAtSelectionStart(WebKit::CallbackID callbackID)
DidRemoveEditCommand(uint64_t commandID)
Modified: trunk/Tools/ChangeLog (236864 => 236865)
--- trunk/Tools/ChangeLog 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Tools/ChangeLog 2018-10-05 00:47:05 UTC (rev 236865)
@@ -1,3 +1,28 @@
+2018-10-04 Wenson Hsieh <wenson_hs...@apple.com>
+
+ [Cocoa] Add SPI to expose typing attributes at the current selection on WKWebView
+ https://bugs.webkit.org/show_bug.cgi?id=190119
+ <rdar://problem/44767062>
+
+ Reviewed by Tim Horton.
+
+ Add a new API test that loads a document containing various rich text styles. This test moves the selection
+ around the document and checks the last set of font attributes received via the new UI delegate hook.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKitCocoa/FontAttributes.mm: Added.
+ (-[FontAttributesListener _webView:didChangeFontAttributes:]):
+ (-[FontAttributesListener lastFontAttributes]):
+ (-[TestWKWebView selectElementWithIdentifier:]):
+ (-[TestWKWebView fontAttributesAfterNextPresentationUpdate]):
+ (ColorExpectation::ColorExpectation):
+ (ShadowExpectation::ShadowExpectation):
+ (checkColor):
+ (checkShadow):
+ (checkFont):
+ (webViewForTestingFontAttributes):
+ * TestWebKitAPI/Tests/WebKitCocoa/rich-text-attributes.html: Added.
+
2018-10-04 Alan Coon <alanc...@apple.com>
Unreviewed, add self as contributor.
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (236864 => 236865)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-10-05 00:35:25 UTC (rev 236864)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-10-05 00:47:05 UTC (rev 236865)
@@ -108,6 +108,8 @@
2E691AF31D79E75E00129407 /* large-video-playing-scroll-away.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E691AF21D79E75400129407 /* large-video-playing-scroll-away.html */; };
2E7765CD16C4D80A00BA2BB1 /* mainIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E7765CC16C4D80A00BA2BB1 /* mainIOS.mm */; };
2E7765CF16C4D81100BA2BB1 /* mainMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E7765CE16C4D81100BA2BB1 /* mainMac.mm */; };
+ 2E92B8F7216490D4005B64F0 /* rich-text-attributes.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E92B8F6216490C3005B64F0 /* rich-text-attributes.html */; };
+ 2E92B8FA2164A0C1005B64F0 /* FontAttributes.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2E92B8F8216490EA005B64F0 /* FontAttributes.mm */; };
2E9896151D8F093800739892 /* text-and-password-inputs.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2E9896141D8F092B00739892 /* text-and-password-inputs.html */; };
2EB29D5E1F762DB90023A5F1 /* dump-datatransfer-types.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 2EB29D5D1F762DA50023A5F1 /* dump-datatransfer-types.html */; };
2EBD9D0A2134730D002DA758 /* video.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 07CD32F72065B72A0064A4BE /* video.html */; };
@@ -1154,6 +1156,7 @@
F6FDDDD614241C6F004F1729 /* push-state.html in Copy Resources */,
A12DDC001E8373E700CF6CAE /* rendered-image-excluding-overflow.html in Copy Resources */,
F46849C01EEF5EF300B937FE /* rich-and-plain-text.html in Copy Resources */,
+ 2E92B8F7216490D4005B64F0 /* rich-text-attributes.html in Copy Resources */,
0F5651F91FCE513500310FBC /* scroll-to-anchor.html in Copy Resources */,
F4E0A296211FC5FB00AF7C7F /* selected-text-and-textarea.html in Copy Resources */,
F4D65DA81F5E4704009D8C27 /* selected-text-image-link-and-editable.html in Copy Resources */,
@@ -1356,6 +1359,8 @@
2E7765CC16C4D80A00BA2BB1 /* mainIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = mainIOS.mm; sourceTree = "<group>"; };
2E7765CE16C4D81100BA2BB1 /* mainMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = mainMac.mm; sourceTree = "<group>"; };
2E7EF7AC1F266A8100DFB67C /* AppKitSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppKitSPI.h; sourceTree = "<group>"; };
+ 2E92B8F6216490C3005B64F0 /* rich-text-attributes.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "rich-text-attributes.html"; sourceTree = "<group>"; };
+ 2E92B8F8216490EA005B64F0 /* FontAttributes.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FontAttributes.mm; sourceTree = "<group>"; };
2E9896141D8F092B00739892 /* text-and-password-inputs.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "text-and-password-inputs.html"; sourceTree = "<group>"; };
2EB29D5D1F762DA50023A5F1 /* dump-datatransfer-types.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "dump-datatransfer-types.html"; sourceTree = "<group>"; };
2ECFF5541D9B12F800B55394 /* NowPlayingControlsTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NowPlayingControlsTests.mm; sourceTree = "<group>"; };
@@ -2340,6 +2345,7 @@
CDA29B2820FD2A9900F15CED /* ExitFullscreenOnEnterPiP.mm */,
2D8104CB1BEC13E70020DA46 /* FindInPage.mm */,
2D1FE0AF1AD465C1006CD9E6 /* FixedLayoutSize.mm */,
+ 2E92B8F8216490EA005B64F0 /* FontAttributes.mm */,
5CB5B3BD1FFC517E00C27BB0 /* FrameHandleSerialization.mm */,
CD78E11A1DB7EA360014A2DE /* FullscreenDelegate.mm */,
3F1B52681D3D7129008D60C4 /* FullscreenLayoutConstraints.mm */,
@@ -2760,6 +2766,7 @@
F41AB99A1EF4692C0083FA08 /* prevent-start.html */,
A12DDBFF1E8373C100CF6CAE /* rendered-image-excluding-overflow.html */,
F46849BF1EEF5EDC00B937FE /* rich-and-plain-text.html */,
+ 2E92B8F6216490C3005B64F0 /* rich-text-attributes.html */,
F4E0A295211FC5A300AF7C7F /* selected-text-and-textarea.html */,
F4D65DA71F5E46C0009D8C27 /* selected-text-image-link-and-editable.html */,
F4E3D80720F708E4007B58C5 /* significant-text-milestone-article.html */,
@@ -3800,6 +3807,7 @@
7A909A7F1D877480007E10F8 /* FloatRect.cpp in Sources */,
7A909A801D877480007E10F8 /* FloatSize.cpp in Sources */,
F4BC0B142146C849002A0478 /* FocusPreservationTests.mm in Sources */,
+ 2E92B8FA2164A0C1005B64F0 /* FontAttributes.mm in Sources */,
1CAD1F861E5CE7DA00AF2C2C /* FontCache.cpp in Sources */,
F456AB1C213EDBA300CB2CEF /* FontManagerTests.mm in Sources */,
7CCE7EF51A411AE600447C4C /* ForceRepaint.cpp in Sources */,
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/FontAttributes.mm (0 => 236865)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/FontAttributes.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/FontAttributes.mm 2018-10-05 00:47:05 UTC (rev 236865)
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2018 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"
+
+#if PLATFORM(COCOA) && WK_API_ENABLED
+
+#import "NSFontPanelTesting.h"
+#import "PlatformUtilities.h"
+#import "Test.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKUIDelegatePrivate.h>
+#import <cmath>
+#import <wtf/Optional.h>
+
+@interface FontAttributesListener : NSObject <WKUIDelegatePrivate>
+@property (nonatomic, readonly) NSDictionary *lastFontAttributes;
+@end
+
+@implementation FontAttributesListener {
+ RetainPtr<NSDictionary> _lastFontAttributes;
+}
+
+- (void)_webView:(WKWebView *)webView didChangeFontAttributes:(NSDictionary<NSString *, id> *)fontAttributes
+{
+ _lastFontAttributes = fontAttributes;
+}
+
+- (NSDictionary *)lastFontAttributes
+{
+ return _lastFontAttributes.get();
+}
+
+@end
+
+@interface TestWKWebView (FontAttributesTesting)
+- (void)selectElementWithIdentifier:(NSString *)identifier;
+- (NSDictionary *)fontAttributesAfterNextPresentationUpdate;
+@end
+
+@implementation TestWKWebView (FontAttributesTesting)
+
+- (void)selectElementWithIdentifier:(NSString *)identifier
+{
+ [self objectByEvaluatingJavaScript:[NSString stringWithFormat:
+ @"element = document.getElementById('%@');"
+ "range = document.createRange();"
+ "range.selectNodeContents(element);"
+ "getSelection().removeAllRanges();"
+ "getSelection().addRange(range)", identifier]];
+}
+
+- (NSDictionary *)fontAttributesAfterNextPresentationUpdate
+{
+ [self waitForNextPresentationUpdate];
+ return [(FontAttributesListener *)self.UIDelegate lastFontAttributes];
+}
+
+@end
+
+#if PLATFORM(MAC)
+#define PlatformColor NSColor
+#define PlatformFont NSFont
+#else
+#define PlatformColor UIColor
+#define PlatformFont UIFont
+static NSString *const NSSuperscriptAttributeName = @"NSSuperscript";
+#endif
+
+namespace TestWebKitAPI {
+
+enum class Nullity : uint8_t { Null, NonNull };
+
+struct ColorExpectation {
+ ColorExpectation(CGFloat redValue, CGFloat greenValue, CGFloat blueValue, CGFloat alphaValue)
+ : red(redValue)
+ , green(greenValue)
+ , blue(blueValue)
+ , alpha(alphaValue)
+ , nullity(Nullity::NonNull)
+ {
+ }
+
+ ColorExpectation() = default;
+
+ CGFloat red { 0 };
+ CGFloat green { 0 };
+ CGFloat blue { 0 };
+ CGFloat alpha { 0 };
+ Nullity nullity { Nullity::Null };
+};
+
+struct ShadowExpectation {
+ ShadowExpectation(CGFloat opacityValue, CGFloat blurRadiusValue)
+ : opacity(opacityValue)
+ , blurRadius(blurRadiusValue)
+ , nullity(Nullity::NonNull)
+ {
+ }
+
+ ShadowExpectation() = default;
+
+ CGFloat opacity { 0 };
+ CGFloat blurRadius { 0 };
+ Nullity nullity { Nullity::Null };
+};
+
+struct FontExpectation {
+ const char* fontName;
+ CGFloat fontSize;
+};
+
+static void checkColor(PlatformColor *color, ColorExpectation&& expectation)
+{
+ if (expectation.nullity == Nullity::Null) {
+ EXPECT_NULL(color);
+ return;
+ }
+
+ EXPECT_NOT_NULL(color);
+
+ CGFloat observedRed = 0;
+ CGFloat observedGreen = 0;
+ CGFloat observedBlue = 0;
+ CGFloat observedAlpha = 0;
+ [color getRed:&observedRed green:&observedGreen blue:&observedBlue alpha:&observedAlpha];
+ EXPECT_EQ(expectation.red, std::round(observedRed * 255));
+ EXPECT_EQ(expectation.green, std::round(observedGreen * 255));
+ EXPECT_EQ(expectation.blue, std::round(observedBlue * 255));
+ EXPECT_LT(std::abs(expectation.alpha - observedAlpha), 0.0001);
+}
+
+static void checkShadow(NSShadow *shadow, ShadowExpectation&& expectation)
+{
+ if (expectation.nullity == Nullity::Null) {
+ EXPECT_NULL(shadow);
+ return;
+ }
+
+ EXPECT_NOT_NULL(shadow);
+
+ CGFloat observedAlpha = 0;
+ [shadow.shadowColor getRed:nullptr green:nullptr blue:nullptr alpha:&observedAlpha];
+ EXPECT_LT(std::abs(expectation.opacity - observedAlpha), 0.0001);
+ EXPECT_EQ(expectation.blurRadius, shadow.shadowBlurRadius);
+}
+
+static void checkFont(PlatformFont *font, FontExpectation&& expectation)
+{
+ EXPECT_WK_STREQ(expectation.fontName, font.fontName);
+ EXPECT_EQ(expectation.fontSize, font.pointSize);
+}
+
+static RetainPtr<TestWKWebView> webViewForTestingFontAttributes()
+{
+ auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 320, 500)]);
+ [webView synchronouslyLoadTestPageNamed:@"rich-text-attributes"];
+ [webView stringByEvaluatingJavaScript:@"document.body.focus()"];
+ return webView;
+}
+
+TEST(FontAttributes, FontAttributesAfterChangingSelection)
+{
+ auto delegate = adoptNS([FontAttributesListener new]);
+ auto webView = webViewForTestingFontAttributes();
+ [webView setUIDelegate:delegate.get()];
+
+ {
+ [webView selectElementWithIdentifier:@"one"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 227, 36, 0, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { 255, 199, 119, 1 });
+ checkFont(attributes[NSFontAttributeName], { "Helvetica-Bold", 48 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleSingle, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"two"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 102, 157, 52, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { 255, 197, 171, 1 });
+ checkFont(attributes[NSFontAttributeName], { "Helvetica-Bold", 48 });
+ checkShadow(attributes[NSShadowAttributeName], { 0.470588, 5 });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleSingle, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"three"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 255, 106, 0, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { });
+ checkFont(attributes[NSFontAttributeName], { "Menlo-Italic", 18 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"four"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 255, 255, 255, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { 0, 0, 0, 1 });
+ checkFont(attributes[NSFontAttributeName], { "Avenir-Book", 24 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"five"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 131, 16, 0, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { });
+ checkFont(attributes[NSFontAttributeName], { "TimesNewRomanPS-BoldMT", 24 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"six"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 255, 64, 19, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { });
+ checkFont(attributes[NSFontAttributeName], { "Avenir-Black", 18 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"seven"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { 235, 235, 235, 1 });
+ checkColor(attributes[NSBackgroundColorAttributeName], { 78, 122, 39, 1 });
+ checkFont(attributes[NSFontAttributeName], { "Avenir-BookOblique", 12 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(-1, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"eight"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { });
+ checkColor(attributes[NSBackgroundColorAttributeName], { });
+ checkFont(attributes[NSFontAttributeName], { "Avenir-Book", 12 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(1, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"nine"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { });
+ checkColor(attributes[NSBackgroundColorAttributeName], { });
+ checkFont(attributes[NSFontAttributeName], { "Georgia", 36 });
+ checkShadow(attributes[NSShadowAttributeName], { 0.658824, 9 });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+ {
+ [webView selectElementWithIdentifier:@"ten"];
+ NSDictionary *attributes = [webView fontAttributesAfterNextPresentationUpdate];
+ checkColor(attributes[NSForegroundColorAttributeName], { });
+ checkColor(attributes[NSBackgroundColorAttributeName], { });
+ checkFont(attributes[NSFontAttributeName], { "Avenir-BookOblique", 18 });
+ checkShadow(attributes[NSShadowAttributeName], { });
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSStrikethroughStyleAttributeName] integerValue]);
+ EXPECT_EQ(NSUnderlineStyleNone, [attributes[NSUnderlineStyleAttributeName] integerValue]);
+ EXPECT_EQ(0, [attributes[NSSuperscriptAttributeName] integerValue]);
+ }
+}
+
+} // namespace TestWebKitAPI
+
+#endif
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/rich-text-attributes.html (0 => 236865)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/rich-text-attributes.html (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/rich-text-attributes.html 2018-10-05 00:47:05 UTC (rev 236865)
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf8">
+<html>
+<head>
+ <style>
+ body, html {
+ font-family: "Helvetica";
+ }
+ </style>
+</head>
+<body contenteditable>
+ <div>
+ <div style="text-align: left;">
+ <span id="one" style="font-size: 48px; font-weight: bold; color: rgb(227, 36, 0); background-color: rgb(255, 199, 119); text-decoration: line-through;">One</span><span id="two" style="caret-color: rgb(102, 157, 52); color: rgb(102, 157, 52); background-color: rgb(255, 197, 171); text-decoration: underline; font-weight: bold; font-size: 48px; text-shadow: rgba(0, 0, 0, 0.470588) 0px 0px 5px;">Two</span>
+ </div>
+ <div style="text-align: center;">
+ <span id="three" style="color: rgb(255, 106, 0); font-family: Menlo; font-size: 18px; font-style: italic;">Three</span><span style="font-size: 24px;"><span id="four" style="font-family: Avenir-Book; background-color: rgb(0, 0, 0); color: rgb(255, 255, 255);">Four</span><span id="five" style="color: rgb(131, 16, 0); font-weight: bold; font-family: 'Times New Roman';">Five</span></span>
+ </div>
+ </div>
+ <div style="text-align: left;">
+ <ul>
+ <li><span id="six" style="color: rgb(255, 64, 19); font-family: Avenir-Book; font-size: 18px; font-weight: bold;">Six</span><br></li>
+ <li><span id="seven" style="font-family: Avenir-Book; font-style: italic; color: rgb(235, 235, 235); background-color: rgb(78, 122, 39); vertical-align: sub; font-size: 12px;">Seven</span></li>
+ </ul>
+ <ol>
+ <li><span id="eight" style="font-family: Avenir-Book; vertical-align: super; font-size: 12px;">Eight</span></li>
+ <li><span id="nine" style="font-family: Georgia; font-style: normal; font-size: 36px; text-shadow: rgba(0, 0, 0, 0.658824) 0px 0px 9px;">Nine</span></li>
+ </ol>
+ <div style="text-align: right;">
+ <span id="ten" style="font-family: Avenir-Book; font-size: 18px; font-style: oblique;">Ten</span>
+ </div>
+ </div>
+</body>
+</html>
\ No newline at end of file