Changeset 252126 in webkit
- Timestamp:
- Nov 6, 2019 12:06:32 AM (4 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r252086 r252126 1 2019-11-06 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK] Implement support for Pointer Lock API 4 https://bugs.webkit.org/show_bug.cgi?id=202956 5 6 Reviewed by Carlos Alberto Lopez Perez. 7 8 Enable Pointer Lock for GTK port. 9 10 * Source/cmake/OptionsGTK.cmake: 11 1 12 2019-11-05 Fujii Hironori <Hironori.Fujii@sony.com> 2 13 -
trunk/LayoutTests/ChangeLog
r252123 r252126 1 2019-11-06 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK] Implement support for Pointer Lock API 4 https://bugs.webkit.org/show_bug.cgi?id=202956 5 6 Reviewed by Carlos Alberto Lopez Perez. 7 8 Unskip Pointer Lock tests and update expectations for tests still failing. 9 10 * platform/gtk/TestExpectations: 11 * platform/gtk/pointer-lock/mouse-event-delivery-expected.txt: Added. 12 1 13 2019-11-05 Kate Cheney <katherine_cheney@apple.com> 2 14 -
trunk/LayoutTests/platform/gtk/TestExpectations
r252121 r252126 531 531 Bug(GTK) legacy-animation-engine/compositing/visible-rect [ Skip ] 532 532 533 # Pointer Lock is not implemented.534 webkit.org/b/99036 pointer-lock [ Skip ]535 # As well as testing fullscreen functionality, these tests also utilize the pointer lock feature.536 webkit.org/b/99036 http/tests/fullscreen [ Skip ]537 webkit.org/b/99036 http/tests/pointer-lock [ Skip ]538 webkit.org/b/99036 fast/shadow-dom/pointerlockelement-in-shadow-tree.html [ Skip ]539 webkit.org/b/99036 fast/shadow-dom/pointerlockelement-in-slot.html [ Skip ]540 541 533 # IETC flexbox failures 542 534 webkit.org/b/85211 ietestcenter/css3/flexbox/flexbox-align-stretch-001.htm [ ImageOnlyFailure ] … … 2532 2524 webkit.org/b/202245 http/tests/workers/service/client-removed-from-clients-while-in-page-cache.html [ Timeout ] 2533 2525 webkit.org/b/202245 http/tests/workers/service/registration-clear-redundant-worker.html [ Timeout ] 2526 2527 webkit.org/b/99036 pointer-lock/pointerlockchange-event-on-lock-lost.html [ Timeout ] 2528 webkit.org/b/99036 pointer-lock/pointerlockelement-null-when-pending.html [ Timeout ] 2534 2529 2535 2530 #//////////////////////////////////////////////////////////////////////////////////////// … … 3878 3873 webkit.org/b/203677 svg/W3C-SVG-1.1/painting-fill-05-b.svg [ Failure ] 3879 3874 3875 webkit.org/b/99036 pointer-lock/locked-element-iframe-removed-from-dom.html [ Failure ] 3876 webkit.org/b/99036 pointer-lock/pointerlockchange-pointerlockerror-events.html [ Failure ] 3877 3880 3878 #//////////////////////////////////////////////////////////////////////////////////////// 3881 3879 # End of non-crashing, non-flaky tests failing -
trunk/Source/WebKit/ChangeLog
r252125 r252126 1 2019-11-06 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK] Implement support for Pointer Lock API 4 https://bugs.webkit.org/show_bug.cgi?id=202956 5 6 Reviewed by Carlos Alberto Lopez Perez. 7 8 Add platform specific implementation of Pointer Lock for the GTK port. 9 10 * PlatformGTK.cmake: Generate code for pointer-constraints and relative-pointer Wayland protocols. 11 * Shared/NativeWebMouseEvent.h: Add optional mouse movement delta. 12 * Shared/gtk/NativeWebMouseEventGtk.cpp: 13 (WebKit::NativeWebMouseEvent::NativeWebMouseEvent): Pass movement delta to WebEventFactory::createWebMouseEvent(). 14 * Shared/gtk/WebEventFactory.cpp: 15 (WebKit::WebEventFactory::createWebMouseEvent): Initialize deltaX and deltaY for motion events using the received delta. 16 * Shared/gtk/WebEventFactory.h: Add optional mouse movement delta. 17 * SourcesGTK.txt: Add new files to compilation. 18 * UIProcess/API/glib/WebKitUIClient.cpp: Add implementation for requestPointerLock and didLosePointerLock. 19 * UIProcess/API/glib/WebKitWebView.cpp: 20 (webkitWebViewRequestPointerLock): Call webkitWebViewBaseRequestPointerLock(). 21 (webkitWebViewDidLosePointerLock): Call webkitWebViewBaseDidLosePointerLock(). 22 * UIProcess/API/glib/WebKitWebViewPrivate.h: 23 * UIProcess/API/gtk/WebKitWebViewBase.cpp: 24 (webkitWebViewBaseDispose): Unlock the pointer and release the PointerLockManager. 25 (webkitWebViewBaseHandleMouseEvent): Initialize the mouse movement delta for motion events and save the current event. 26 (webkitWebViewBaseMotionNotifyEvent): Let PointerLockManager handle motion events while pointer is locked. 27 (webkitWebViewBaseRequestPointerLock): Create a PointerLockManager and request it to lock the pointer. 28 (webkitWebViewBaseDidLosePointerLock): Request PointerLockManager to unlock the pointer. 29 * UIProcess/API/gtk/WebKitWebViewBasePrivate.h: 30 * UIProcess/gtk/PointerLockManager.cpp: Added. 31 (WebKit::PointerLockManager::create): 32 (WebKit::PointerLockManager::PointerLockManager): 33 (WebKit::PointerLockManager::~PointerLockManager): 34 (WebKit::PointerLockManager::lock): 35 (WebKit::PointerLockManager::unlock): 36 (WebKit::PointerLockManager::handleMotion): 37 * UIProcess/gtk/PointerLockManager.h: Added. 38 (WebKit::PointerLockManager::didReceiveMotionEvent): 39 * UIProcess/gtk/PointerLockManagerWayland.cpp: Added. 40 (WebKit::PointerLockManagerWayland::PointerLockManagerWayland): 41 (WebKit::PointerLockManagerWayland::~PointerLockManagerWayland): 42 (WebKit::PointerLockManagerWayland::lock): 43 (WebKit::PointerLockManagerWayland::unlock): 44 * UIProcess/gtk/PointerLockManagerWayland.h: Added. 45 * UIProcess/gtk/PointerLockManagerX11.cpp: Added. 46 (WebKit::PointerLockManagerX11::PointerLockManagerX11): 47 (WebKit::PointerLockManagerX11::didReceiveMotionEvent): 48 * UIProcess/gtk/PointerLockManagerX11.h: Added. 49 1 50 2019-11-05 Chris Dumez <cdumez@apple.com> 2 51 -
trunk/Source/WebKit/PlatformGTK.cmake
r251181 r252126 50 50 list(APPEND WebKit_DERIVED_SOURCES 51 51 ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c 52 ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-protocol.c 53 ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-protocol.c 52 54 ) 53 55 endif () … … 548 550 OUTPUT ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c 549 551 DEPENDS ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml 550 COMMAND wayland-scanner server-header < ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml > ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandServerProtocol.h 551 COMMAND wayland-scanner client-header < ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml > ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.h 552 COMMAND wayland-scanner code < ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml > ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c 552 COMMAND ${WAYLAND_SCANNER} server-header ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandServerProtocol.h 553 COMMAND ${WAYLAND_SCANNER} client-header ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.h 554 COMMAND ${WAYLAND_SCANNER} code ${WEBKIT_DIR}/Shared/gtk/WebKitWaylandProtocol.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/WebKitWaylandClientProtocol.c 555 VERBATIM 556 ) 557 558 add_custom_command( 559 OUTPUT ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-protocol.c 560 DEPENDS ${WAYLAND_PROTOCOLS_DATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml 561 COMMAND ${WAYLAND_SCANNER} code ${WAYLAND_PROTOCOLS_DATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-protocol.c 562 COMMAND ${WAYLAND_SCANNER} client-header ${WAYLAND_PROTOCOLS_DATADIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/pointer-constraints-unstable-v1-client-protocol.h 563 VERBATIM 564 ) 565 566 add_custom_command( 567 OUTPUT ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-protocol.c 568 DEPENDS ${WAYLAND_PROTOCOLS_DATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml 569 COMMAND ${WAYLAND_SCANNER} code ${WAYLAND_PROTOCOLS_DATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-protocol.c 570 COMMAND ${WAYLAND_SCANNER} client-header ${WAYLAND_PROTOCOLS_DATADIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml ${DERIVED_SOURCES_WEBKIT2GTK_DIR}/relative-pointer-unstable-v1-client-protocol.h 571 VERBATIM 553 572 ) 554 573 endif () -
trunk/Source/WebKit/Shared/NativeWebMouseEvent.h
r251320 r252126 61 61 #elif PLATFORM(GTK) 62 62 NativeWebMouseEvent(const NativeWebMouseEvent&); 63 NativeWebMouseEvent(GdkEvent*, int );63 NativeWebMouseEvent(GdkEvent*, int, Optional<WebCore::IntPoint>); 64 64 #elif PLATFORM(IOS_FAMILY) 65 65 NativeWebMouseEvent(::WebEvent *); -
trunk/Source/WebKit/Shared/gtk/NativeWebMouseEventGtk.cpp
r95901 r252126 32 32 namespace WebKit { 33 33 34 NativeWebMouseEvent::NativeWebMouseEvent(GdkEvent* event, int eventClickCount )35 : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, eventClickCount ))34 NativeWebMouseEvent::NativeWebMouseEvent(GdkEvent* event, int eventClickCount, Optional<WebCore::IntPoint> delta) 35 : WebMouseEvent(WebEventFactory::createWebMouseEvent(event, eventClickCount, delta)) 36 36 , m_nativeEvent(gdk_event_copy(event)) 37 37 { … … 39 39 40 40 NativeWebMouseEvent::NativeWebMouseEvent(const NativeWebMouseEvent& event) 41 : WebMouseEvent(WebEventFactory::createWebMouseEvent(event.nativeEvent(), event.clickCount() ))41 : WebMouseEvent(WebEventFactory::createWebMouseEvent(event.nativeEvent(), event.clickCount(), WebCore::IntPoint(event.deltaX(), event.deltaY()))) 42 42 , m_nativeEvent(gdk_event_copy(event.nativeEvent())) 43 43 { -
trunk/Source/WebKit/Shared/gtk/WebEventFactory.cpp
r251650 r252126 136 136 } 137 137 138 WebMouseEvent WebEventFactory::createWebMouseEvent(const GdkEvent* event, int currentClickCount )138 WebMouseEvent WebEventFactory::createWebMouseEvent(const GdkEvent* event, int currentClickCount, Optional<IntPoint> delta) 139 139 { 140 140 double x, y, xRoot, yRoot; … … 149 149 150 150 WebEvent::Type type = static_cast<WebEvent::Type>(0); 151 IntPoint movementDelta; 151 152 152 153 GdkEventType eventType = gdk_event_get_event_type(event); … … 156 157 case GDK_LEAVE_NOTIFY: 157 158 type = WebEvent::MouseMove; 159 if (delta) 160 movementDelta = delta.value(); 158 161 break; 159 162 case GDK_BUTTON_PRESS: … … 180 183 IntPoint(x, y), 181 184 IntPoint(xRoot, yRoot), 182 0 /* deltaX */,183 0 /* deltaY */,185 movementDelta.x(), 186 movementDelta.y(), 184 187 0 /* deltaZ */, 185 188 currentClickCount, -
trunk/Source/WebKit/Shared/gtk/WebEventFactory.h
r251650 r252126 35 35 class WebEventFactory { 36 36 public: 37 static WebMouseEvent createWebMouseEvent(const GdkEvent*, int );37 static WebMouseEvent createWebMouseEvent(const GdkEvent*, int, Optional<WebCore::IntPoint>); 38 38 static WebWheelEvent createWebWheelEvent(const GdkEvent*); 39 39 static WebWheelEvent createWebWheelEvent(const GdkEvent*, WebWheelEvent::Phase, WebWheelEvent::Phase momentumPhase); -
trunk/Source/WebKit/SourcesGTK.txt
r251181 r252126 241 241 UIProcess/gtk/InputMethodFilter.cpp 242 242 UIProcess/gtk/KeyBindingTranslator.cpp 243 UIProcess/gtk/PointerLockManager.cpp @no-unify 244 UIProcess/gtk/PointerLockManagerWayland.cpp @no-unify 245 UIProcess/gtk/PointerLockManagerX11.cpp @no-unify 243 246 UIProcess/gtk/RemoteWebInspectorProxyGtk.cpp 244 247 UIProcess/gtk/TextCheckerGtk.cpp @no-unify -
trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp
r250707 r252126 251 251 } 252 252 253 #if ENABLE(POINTER_LOCK) 254 void requestPointerLock(WebPageProxy* page) final 255 { 256 webkitWebViewRequestPointerLock(m_webView); 257 } 258 259 void didLosePointerLock(WebPageProxy*) final 260 { 261 webkitWebViewDidLosePointerLock(m_webView); 262 } 263 #endif 264 265 253 266 WebKitWebView* m_webView; 254 267 }; -
trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp
r251181 r252126 2628 2628 } 2629 2629 2630 #if ENABLE(POINTER_LOCK) 2631 void webkitWebViewRequestPointerLock(WebKitWebView* webView) 2632 { 2633 #if PLATFORM(GTK) 2634 webkitWebViewBaseRequestPointerLock(WEBKIT_WEB_VIEW_BASE(webView)); 2635 #endif 2636 } 2637 2638 void webkitWebViewDidLosePointerLock(WebKitWebView* webView) 2639 { 2640 #if PLATFORM(GTK) 2641 webkitWebViewBaseDidLosePointerLock(WEBKIT_WEB_VIEW_BASE(webView)); 2642 #endif 2643 } 2644 #endif 2645 2630 2646 #if PLATFORM(WPE) 2631 2647 /** -
trunk/Source/WebKit/UIProcess/API/glib/WebKitWebViewPrivate.h
r251181 r252126 104 104 void webkitWebViewDidChangePageID(WebKitWebView*); 105 105 void webkitWebViewDidReceiveUserMessage(WebKitWebView*, WebKit::UserMessage&&, CompletionHandler<void(WebKit::UserMessage&&)>&&); 106 107 #if ENABLE(POINTER_LOCK) 108 void webkitWebViewRequestPointerLock(WebKitWebView*); 109 void webkitWebViewDidLosePointerLock(WebKitWebView*); 110 #endif -
trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp
r251650 r252126 39 39 #include "NativeWebWheelEvent.h" 40 40 #include "PageClientImpl.h" 41 #include "PointerLockManager.h" 41 42 #include "ViewGestureController.h" 42 43 #include "WebEventFactory.h" … … 196 197 TouchEventsMap touchEvents; 197 198 IntSize contentsSize; 199 GUniquePtr<GdkEvent> lastMotionEvent; 198 200 199 201 GtkWindow* toplevelOnScreenWindow { nullptr }; … … 230 232 RunLoop::Timer<WebKitWebViewBasePrivate> releaseEmojiChooserTimer; 231 233 #endif 234 235 std::unique_ptr<PointerLockManager> pointerLockManager; 232 236 }; 233 237 … … 556 560 webkitWebViewBaseCompleteEmojiChooserRequest(webView, emptyString()); 557 561 #endif 562 if (webView->priv->pointerLockManager) { 563 webView->priv->pointerLockManager->unlock(); 564 webView->priv->pointerLockManager = nullptr; 565 } 558 566 webView->priv->pageProxy->close(); 559 567 webView->priv->acceleratedBackingStore = nullptr; … … 822 830 823 831 int clickCount = 0; 832 Optional<IntPoint> movementDelta; 824 833 GdkEventType eventType = gdk_event_get_event_type(event); 825 834 switch (eventType) { … … 851 860 break; 852 861 case GDK_MOTION_NOTIFY: 862 // Pointer Lock. 7.1 Attributes: movementX/Y must be updated regardless of pointer lock state. 863 if (priv->lastMotionEvent) { 864 double currentX, currentY; 865 gdk_event_get_root_coords(event, ¤tX, ¤tY); 866 double previousX, previousY; 867 gdk_event_get_root_coords(priv->lastMotionEvent.get(), &previousX, &previousY); 868 movementDelta = IntPoint(currentX - previousX, currentY - previousY); 869 } 870 priv->lastMotionEvent.reset(gdk_event_copy(event)); 871 break; 853 872 case GDK_ENTER_NOTIFY: 854 873 case GDK_LEAVE_NOTIFY: … … 858 877 } 859 878 860 priv->pageProxy->handleMouseEvent(NativeWebMouseEvent(event, clickCount ));879 priv->pageProxy->handleMouseEvent(NativeWebMouseEvent(event, clickCount, movementDelta)); 861 880 } 862 881 … … 960 979 auto* widgetClass = GTK_WIDGET_CLASS(webkit_web_view_base_parent_class); 961 980 return widgetClass->motion_notify_event ? widgetClass->motion_notify_event(widget, event) : GDK_EVENT_PROPAGATE; 981 } 982 983 if (priv->pointerLockManager) { 984 priv->pointerLockManager->didReceiveMotionEvent(reinterpret_cast<GdkEvent*>(event)); 985 return GDK_EVENT_STOP; 962 986 } 963 987 … … 1838 1862 } 1839 1863 #endif 1864 1865 void webkitWebViewBaseRequestPointerLock(WebKitWebViewBase* webViewBase) 1866 { 1867 WebKitWebViewBasePrivate* priv = webViewBase->priv; 1868 RELEASE_ASSERT(!priv->pointerLockManager); 1869 if (!priv->lastMotionEvent) { 1870 GtkWidget* viewWidget = GTK_WIDGET(webViewBase); 1871 auto* device = gdk_seat_get_pointer(gdk_display_get_default_seat(gtk_widget_get_display(viewWidget))); 1872 int x, y; 1873 GdkModifierType state; 1874 gdk_window_get_device_position(gtk_widget_get_window(viewWidget), device, &x, &y, &state); 1875 priv->lastMotionEvent.reset(gdk_event_new(GDK_MOTION_NOTIFY)); 1876 priv->lastMotionEvent->motion.x = x; 1877 priv->lastMotionEvent->motion.y = y; 1878 int rootX, rootY; 1879 gdk_window_get_root_coords(gtk_widget_get_window(viewWidget), x, y, &rootX, &rootY); 1880 priv->lastMotionEvent->motion.x_root = rootX; 1881 priv->lastMotionEvent->motion.y_root = rootY; 1882 priv->lastMotionEvent->motion.state = state; 1883 } 1884 priv->pointerLockManager = PointerLockManager::create(*priv->pageProxy, priv->lastMotionEvent.get()); 1885 if (priv->pointerLockManager->lock()) { 1886 priv->pageProxy->didAllowPointerLock(); 1887 return; 1888 } 1889 1890 priv->pointerLockManager = nullptr; 1891 priv->pageProxy->didDenyPointerLock(); 1892 } 1893 1894 void webkitWebViewBaseDidLosePointerLock(WebKitWebViewBase* webViewBase) 1895 { 1896 WebKitWebViewBasePrivate* priv = webViewBase->priv; 1897 if (!priv->pointerLockManager) 1898 return; 1899 1900 priv->pointerLockManager->unlock(); 1901 priv->pointerLockManager = nullptr; 1902 } -
trunk/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBasePrivate.h
r251650 r252126 102 102 int webkitWebViewBaseRenderHostFileDescriptor(WebKitWebViewBase*); 103 103 #endif 104 105 void webkitWebViewBaseRequestPointerLock(WebKitWebViewBase*); 106 void webkitWebViewBaseDidLosePointerLock(WebKitWebViewBase*); -
trunk/Source/cmake/OptionsGTK.cmake
r251656 r252126 161 161 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETWORK_CACHE_SPECULATIVE_REVALIDATION PRIVATE ON) 162 162 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_OFFSCREEN_CANVAS PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES}) 163 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_POINTER_LOCK PRIVATE ON) 163 164 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SERVICE_WORKER PRIVATE ON) 164 165 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SHAREABLE_RESOURCE PUBLIC ON) … … 344 345 345 346 find_package(Wayland REQUIRED) 347 find_package(WaylandProtocols 1.12 REQUIRED) 346 348 endif () 347 349 -
trunk/Tools/ChangeLog
r252125 r252126 1 2019-11-06 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK] Implement support for Pointer Lock API 4 https://bugs.webkit.org/show_bug.cgi?id=202956 5 6 Reviewed by Carlos Alberto Lopez Perez. 7 8 * WebKitTestRunner/gtk/EventSenderProxyGtk.cpp: 9 (WTR::getGDKKeySymForKeyRef): Handle escape key. 10 1 11 2019-11-05 Chris Dumez <cdumez@apple.com> 2 12 -
trunk/Tools/WebKitTestRunner/gtk/EventSenderProxyGtk.cpp
r248846 r252126 271 271 if (WKStringIsEqualToUTF8CString(keyRef, "F12")) 272 272 return GDK_KEY_F12; 273 if (WKStringIsEqualToUTF8CString(keyRef, "escape")) 274 return GDK_KEY_Escape; 273 275 274 276 size_t bufferSize = WKStringGetMaximumUTF8CStringSize(keyRef);
Note: See TracChangeset
for help on using the changeset viewer.