- Revision
- 165022
- Author
- enr...@apple.com
- Date
- 2014-03-03 17:00:00 -0800 (Mon, 03 Mar 2014)
Log Message
[iOS WebKit2]: Text fields don't zoom in when focused
https://bugs.webkit.org/show_bug.cgi?id=129632
<rdar://problem/16185230>
Reviewed by Benjamin Poulain.
When focusing the node we need to zoom and center it and possibly
scroll to make it visible.
On iPad we only scroll, without zooming.
* Shared/AssistedNodeInformation.cpp:
(WebKit::AssistedNodeInformation::encode):
(WebKit::AssistedNodeInformation::decode):
* Shared/AssistedNodeInformation.h:
(WebKit::AssistedNodeInformation::AssistedNodeInformation):
* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/ios/WKContentView.h:
* UIProcess/ios/WKContentView.mm:
(-[WKContentView _scrollToRect:withOrigin:minimumScrollDistance:]):
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _displayFormNodeInputView]):
(-[WKContentView _startAssistingNode:]):
* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::getAssistedNodeInformation):
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (165021 => 165022)
--- trunk/Source/WebKit2/ChangeLog 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/ChangeLog 2014-03-04 01:00:00 UTC (rev 165022)
@@ -1,3 +1,30 @@
+2014-03-03 Enrica Casucci <enr...@apple.com>
+
+ [iOS WebKit2]: Text fields don't zoom in when focused
+ https://bugs.webkit.org/show_bug.cgi?id=129632
+ <rdar://problem/16185230>
+
+ Reviewed by Benjamin Poulain.
+
+ When focusing the node we need to zoom and center it and possibly
+ scroll to make it visible.
+ On iPad we only scroll, without zooming.
+
+ * Shared/AssistedNodeInformation.cpp:
+ (WebKit::AssistedNodeInformation::encode):
+ (WebKit::AssistedNodeInformation::decode):
+ * Shared/AssistedNodeInformation.h:
+ (WebKit::AssistedNodeInformation::AssistedNodeInformation):
+ * UIProcess/API/Cocoa/WKWebViewInternal.h:
+ * UIProcess/ios/WKContentView.h:
+ * UIProcess/ios/WKContentView.mm:
+ (-[WKContentView _scrollToRect:withOrigin:minimumScrollDistance:]):
+ * UIProcess/ios/WKContentViewInteraction.mm:
+ (-[WKContentView _displayFormNodeInputView]):
+ (-[WKContentView _startAssistingNode:]):
+ * WebProcess/WebPage/ios/WebPageIOS.mm:
+ (WebKit::WebPage::getAssistedNodeInformation):
+
2014-03-03 Sam Weinig <s...@webkit.org>
Fix ASSERT and leaks introduced in recent "Support IOS Accessibility in WK2" patch
Modified: trunk/Source/WebKit2/Shared/AssistedNodeInformation.cpp (165021 => 165022)
--- trunk/Source/WebKit2/Shared/AssistedNodeInformation.cpp 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/Shared/AssistedNodeInformation.cpp 2014-03-04 01:00:00 UTC (rev 165022)
@@ -64,6 +64,8 @@
void AssistedNodeInformation::encode(IPC::ArgumentEncoder& encoder) const
{
encoder << elementRect;
+ encoder << minimumScaleFactor;
+ encoder << maximumScaleFactor;
encoder << hasNextNode;
encoder << hasPreviousNode;
encoder << isAutocorrect;
@@ -84,6 +86,12 @@
if (!decoder.decode(result.elementRect))
return false;
+ if (!decoder.decode(result.minimumScaleFactor))
+ return false;
+
+ if (!decoder.decode(result.maximumScaleFactor))
+ return false;
+
if (!decoder.decode(result.hasNextNode))
return false;
Modified: trunk/Source/WebKit2/Shared/AssistedNodeInformation.h (165021 => 165022)
--- trunk/Source/WebKit2/Shared/AssistedNodeInformation.h 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/Shared/AssistedNodeInformation.h 2014-03-04 01:00:00 UTC (rev 165022)
@@ -93,7 +93,9 @@
struct AssistedNodeInformation {
AssistedNodeInformation()
- : hasNextNode(false)
+ : minimumScaleFactor(-INFINITY)
+ , maximumScaleFactor(INFINITY)
+ , hasNextNode(false)
, hasPreviousNode(false)
, isAutocorrect(false)
, isMultiSelect(false)
@@ -106,6 +108,8 @@
}
WebCore::IntRect elementRect;
+ double minimumScaleFactor;
+ double maximumScaleFactor;
bool hasNextNode;
bool hasPreviousNode;
bool isAutocorrect;
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h (165021 => 165022)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h 2014-03-04 01:00:00 UTC (rev 165022)
@@ -59,6 +59,7 @@
- (RetainPtr<CGImageRef>)_takeViewSnapshot;
+- (BOOL)_scrollToRect:(WebCore::FloatRect)targetRect origin:(WebCore::FloatPoint)origin minimumScrollDistance:(float)minimumScrollDistance;
- (BOOL)_zoomToRect:(WebCore::FloatRect)targetRect withOrigin:(WebCore::FloatPoint)origin fitEntireRect:(BOOL)fitEntireRect minimumScale:(double)minimumScale maximumScale:(double)maximumScale minimumScrollDistance:(float)minimumScrollDistance;
- (void)_zoomOutWithOrigin:(WebCore::FloatPoint)origin;
#endif
Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.h (165021 => 165022)
--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.h 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.h 2014-03-04 01:00:00 UTC (rev 165022)
@@ -79,6 +79,7 @@
- (RetainPtr<CGImageRef>)_takeViewSnapshot;
- (void)_setAccessibilityWebProcessToken:(NSData *)data;
+- (BOOL)_scrollToRect:(CGRect)targetRect withOrigin:(CGPoint)origin minimumScrollDistance:(CGFloat)minimumScrollDistance;
- (BOOL)_zoomToRect:(CGRect)targetRect withOrigin:(CGPoint)origin fitEntireRect:(BOOL)fitEntireRect minimumScale:(double)minimumScale maximumScale:(double)maximumScale minimumScrollDistance:(CGFloat)minimumScrollDistance;
- (void)_zoomOutWithOrigin:(CGPoint)origin;
Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (165021 => 165022)
--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm 2014-03-04 01:00:00 UTC (rev 165022)
@@ -306,6 +306,11 @@
return [_webView _takeViewSnapshot];
}
+- (BOOL)_scrollToRect:(CGRect)targetRect withOrigin:(CGPoint)origin minimumScrollDistance:(CGFloat)minimumScrollDistance
+{
+ return [_webView _scrollToRect:targetRect origin:origin minimumScrollDistance:minimumScrollDistance];
+}
+
- (BOOL)_zoomToRect:(CGRect)targetRect withOrigin:(CGPoint)origin fitEntireRect:(BOOL)fitEntireRect minimumScale:(double)minimumScale maximumScale:(double)maximumScale minimumScrollDistance:(CGFloat)minimumScrollDistance
{
return [_webView _zoomToRect:targetRect withOrigin:origin fitEntireRect:fitEntireRect minimumScale:minimumScale maximumScale:maximumScale minimumScrollDistance:minimumScrollDistance];
Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm (165021 => 165022)
--- trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm 2014-03-04 01:00:00 UTC (rev 165022)
@@ -406,7 +406,15 @@
- (void)_displayFormNodeInputView
{
- // FIXME: This is the place where we should zoom to node
+ if (UICurrentUserInterfaceIdiomIsPad())
+ [self _scrollToRect:_assistedNodeInformation.elementRect withOrigin:_page->editorState().caretRectAtStart.location() minimumScrollDistance:0];
+ else
+ [self _zoomToRect:_assistedNodeInformation.elementRect
+ withOrigin:_page->editorState().caretRectAtStart.location()
+ fitEntireRect:YES minimumScale:_assistedNodeInformation.minimumScaleFactor
+ maximumScale:_assistedNodeInformation.maximumScaleFactor
+ minimumScrollDistance:0];
+
[self _updateAccessory];
}
@@ -1850,7 +1858,8 @@
break;
}
[self reloadInputViews];
- [self _updateAccessory];
+ [self _displayFormNodeInputView];
+
// _inputPeripheral has been initialized in inputView called by reloadInputViews.
[_inputPeripheral beginEditing];
}
Modified: trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm (165021 => 165022)
--- trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm 2014-03-04 00:49:19 UTC (rev 165021)
+++ trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm 2014-03-04 01:00:00 UTC (rev 165022)
@@ -1583,6 +1583,8 @@
void WebPage::getAssistedNodeInformation(AssistedNodeInformation& information)
{
information.elementRect = m_page->focusController().focusedOrMainFrame().view()->contentsToRootView(m_assistedNode->renderer()->absoluteBoundingBoxRect());
+ information.minimumScaleFactor = m_viewportConfiguration.minimumScale();
+ information.maximumScaleFactor = m_viewportConfiguration.maximumScale();
information.hasNextNode = hasFocusableNode(m_assistedNode.get(), m_page.get(), true);
information.hasPreviousNode = hasFocusableNode(m_assistedNode.get(), m_page.get(), false);