Changeset 167343 in webkit
- Timestamp:
- Apr 15, 2014, 10:16:36 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r167340 r167343 1 2014-04-15 Dan Bernstein <mitz@apple.com> 2 3 [Cocoa] Add a form delegate method corresponding to willSubmitForm 4 https://bugs.webkit.org/show_bug.cgi?id=131718 5 6 Reviewed by Tim Horton. 7 8 * UIProcess/API/Cocoa/WKWebView.mm: 9 (-[WKWebView _setFormDelegate:]): Changed to define and create a FormClient (which derives 10 from API::FormClient and messages a delegate), and set it as the form client. 11 12 * UIProcess/API/Cocoa/_WKFormDelegate.h: Declared new delegate method. 13 14 * WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInFormDelegatePrivate.h: Added a 15 variant of willSubmitForm that returs a user object to pass to the delegate in the UI 16 process, giving it a temporary name with “new”. 17 18 * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm: 19 (-[WKWebProcessPlugInBrowserContextController _setFormDelegate:]): Changed willSubmitForm() 20 to check for the new bundle delegate method first and encode the user object as user data. 21 Moved the encoding of an NSObject <NSSecureCoding> as user data into a helper function. 22 1 23 2014-04-15 Hyowon Kim <hw1008.kim@samsung.com> 2 24 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm
r167274 r167343 29 29 #if WK_API_ENABLED 30 30 31 #import "APIFormClient.h" 31 32 #import "FindClient.h" 32 33 #import "NavigationState.h" … … 53 54 #import "WebCertificateInfo.h" 54 55 #import "WebContext.h" 56 #import "WebFormSubmissionListenerProxy.h" 55 57 #import "WebPageGroup.h" 56 58 #import "WebPageProxy.h" 57 59 #import "WebProcessProxy.h" 58 60 #import "_WKFindDelegate.h" 61 #import "_WKFormDelegate.h" 59 62 #import "_WKRemoteObjectRegistryInternal.h" 60 63 #import "_WKVisitedLinkProviderInternal.h" … … 1186 1189 { 1187 1190 _formDelegate = formDelegate; 1191 1192 class FormClient : public API::FormClient { 1193 public: 1194 explicit FormClient(WKWebView *webView) 1195 : m_webView(webView) 1196 { 1197 } 1198 1199 virtual ~FormClient() { } 1200 1201 virtual bool willSubmitForm(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebKit::WebFrameProxy* sourceFrame, const Vector<std::pair<WTF::String, WTF::String>>& textFieldValues, API::Object* userData, WebKit::WebFormSubmissionListenerProxy* listener) override 1202 { 1203 if (userData && userData->type() != API::Object::Type::Data) { 1204 ASSERT(!userData || userData->type() == API::Object::Type::Data); 1205 m_webView->_page->process().connection()->markCurrentlyDispatchedMessageAsInvalid(); 1206 return false; 1207 } 1208 1209 auto formDelegate = m_webView->_formDelegate.get(); 1210 1211 if (![formDelegate respondsToSelector:@selector(_webView:willSubmitFormValues:userObject:submissionHandler:)]) 1212 return false; 1213 1214 auto valueMap = adoptNS([[NSMutableDictionary alloc] initWithCapacity:textFieldValues.size()]); 1215 for (const auto& pair : textFieldValues) 1216 [valueMap setObject:pair.second forKey:pair.first]; 1217 1218 NSObject <NSSecureCoding> *userObject = nil; 1219 if (API::Data* data = static_cast<API::Data*>(userData)) { 1220 auto nsData = adoptNS([[NSData alloc] initWithBytesNoCopy:const_cast<void*>(static_cast<const void*>(data->bytes())) length:data->size() freeWhenDone:NO]); 1221 auto unarchiver = adoptNS([[NSKeyedUnarchiver alloc] initForReadingWithData:nsData.get()]); 1222 [unarchiver setRequiresSecureCoding:YES]; 1223 @try { 1224 userObject = [unarchiver decodeObjectOfClass:[NSObject class] forKey:@"userObject"]; 1225 } @catch (NSException *exception) { 1226 LOG_ERROR("Failed to decode user data: %@", exception); 1227 } 1228 } 1229 1230 [formDelegate _webView:m_webView willSubmitFormValues:valueMap.get() userObject:userObject submissionHandler:^{ 1231 listener->continueSubmission(); 1232 }]; 1233 return true; 1234 } 1235 1236 private: 1237 WKWebView *m_webView; 1238 }; 1239 1240 if (formDelegate) 1241 _page->setFormClient(std::make_unique<FormClient>(self)); 1242 else 1243 _page->setFormClient(nullptr); 1188 1244 } 1189 1245 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKFormDelegate.h
r167100 r167343 38 38 39 39 - (void)_webView:(WKWebView *)webView didStartInputSession:(id <_WKFormInputSession>)inputSession; 40 - (void)_webView:(WKWebView *)webView willSubmitFormValues:(NSDictionary *)values userObject:(NSObject <NSSecureCoding> *)userObject submissionHandler:(void (^)(void))submissionHandler; 40 41 41 42 #if TARGET_OS_IPHONE -
trunk/Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInFormDelegatePrivate.h
r167276 r167343 41 41 - (void)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller textDidChangeInTextField:(WKWebProcessPlugInNodeHandle *)textField inFrame:(WKWebProcessPlugInFrame *)frame initiatedByUserTyping:(BOOL)initiatedByUserTyping; 42 42 43 // FIXME: Once no one implements the above willSubmitForm:, remove "new" from the name. 44 // The return value is exposed in the UI process via the userObject parameter to [id <_WKFormDelegate> _webView:willSubmitFormValues:userObject:submissionHandler:]. 45 - (NSObject <NSSecureCoding> *)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller newWillSubmitForm:(WKWebProcessPlugInNodeHandle *)form toFrame:(WKWebProcessPlugInFrame *)frame fromFrame:(WKWebProcessPlugInFrame *)sourceFrame withValues:(NSDictionary *)values; 46 43 47 // The return value is exposed in the UI process via the userObject property of the _WKFormInputSession object. 44 48 - (NSObject <NSSecureCoding> *)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller willBeginInputSessionForElement:(WKWebProcessPlugInNodeHandle *)node inFrame:(WKWebProcessPlugInFrame *)frame; -
trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm
r167276 r167343 408 408 } 409 409 410 virtual void willSubmitForm(WebPage*, HTMLFormElement* formElement, WebFrame* frame, WebFrame* sourceFrame, const Vector<std::pair<WTF::String, WTF::String>>& values, RefPtr<API::Object>& userData) override 411 { 412 auto formDelegate = m_controller->_formDelegate.get(); 413 414 if ([formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:willSubmitForm:toFrame:fromFrame:withValues:)]) { 415 auto valueMap = adoptNS([[NSMutableDictionary alloc] initWithCapacity:values.size()]); 416 for (const auto& pair : values) 417 [valueMap setObject:pair.second forKey:pair.first]; 418 419 [formDelegate _webProcessPlugInBrowserContextController:m_controller willSubmitForm:wrapper(*InjectedBundleNodeHandle::getOrCreate(formElement).get()) toFrame:wrapper(*frame) fromFrame:wrapper(*sourceFrame) withValues:valueMap.get()]; 420 } 421 } 422 423 virtual void textDidChangeInTextField(WebPage*, HTMLInputElement* inputElement, WebFrame* frame, bool initiatedByUserTyping) override 424 { 425 auto formDelegate = m_controller->_formDelegate.get(); 426 427 if ([formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:textDidChangeInTextField:inFrame:initiatedByUserTyping:)]) 428 [formDelegate _webProcessPlugInBrowserContextController:m_controller textDidChangeInTextField:wrapper(*WebKit::InjectedBundleNodeHandle::getOrCreate(inputElement)) inFrame:wrapper(*frame) initiatedByUserTyping:initiatedByUserTyping]; 429 } 430 431 static void releaseNSData(unsigned char*, const void* untypedData) 432 { 433 [(NSData *)untypedData release]; 434 } 435 436 virtual void willBeginInputSession(WebPage*, Element* element, WebFrame* frame, RefPtr<API::Object>& userData) override 437 { 438 auto formDelegate = m_controller->_formDelegate.get(); 439 440 if (![formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:willBeginInputSessionForElement:inFrame:)]) 441 return; 442 443 NSObject <NSSecureCoding> *userObject = [formDelegate _webProcessPlugInBrowserContextController:m_controller willBeginInputSessionForElement:wrapper(*WebKit::InjectedBundleNodeHandle::getOrCreate(element)) inFrame:wrapper(*frame)]; 410 static void encodeUserObject(NSObject <NSSecureCoding> *userObject, RefPtr<API::Object>& userData) 411 { 444 412 if (!userObject) 445 413 return; … … 459 427 } 460 428 429 virtual void willSubmitForm(WebPage*, HTMLFormElement* formElement, WebFrame* frame, WebFrame* sourceFrame, const Vector<std::pair<WTF::String, WTF::String>>& values, RefPtr<API::Object>& userData) override 430 { 431 auto formDelegate = m_controller->_formDelegate.get(); 432 433 if ([formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:newWillSubmitForm:toFrame:fromFrame:withValues:)]) { 434 auto valueMap = adoptNS([[NSMutableDictionary alloc] initWithCapacity:values.size()]); 435 for (const auto& pair : values) 436 [valueMap setObject:pair.second forKey:pair.first]; 437 438 NSObject <NSSecureCoding> *userObject = [formDelegate _webProcessPlugInBrowserContextController:m_controller newWillSubmitForm:wrapper(*InjectedBundleNodeHandle::getOrCreate(formElement).get()) toFrame:wrapper(*frame) fromFrame:wrapper(*sourceFrame) withValues:valueMap.get()]; 439 encodeUserObject(userObject, userData); 440 } else if ([formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:willSubmitForm:toFrame:fromFrame:withValues:)]) { 441 auto valueMap = adoptNS([[NSMutableDictionary alloc] initWithCapacity:values.size()]); 442 for (const auto& pair : values) 443 [valueMap setObject:pair.second forKey:pair.first]; 444 445 [formDelegate _webProcessPlugInBrowserContextController:m_controller willSubmitForm:wrapper(*InjectedBundleNodeHandle::getOrCreate(formElement).get()) toFrame:wrapper(*frame) fromFrame:wrapper(*sourceFrame) withValues:valueMap.get()]; 446 } 447 } 448 449 virtual void textDidChangeInTextField(WebPage*, HTMLInputElement* inputElement, WebFrame* frame, bool initiatedByUserTyping) override 450 { 451 auto formDelegate = m_controller->_formDelegate.get(); 452 453 if ([formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:textDidChangeInTextField:inFrame:initiatedByUserTyping:)]) 454 [formDelegate _webProcessPlugInBrowserContextController:m_controller textDidChangeInTextField:wrapper(*WebKit::InjectedBundleNodeHandle::getOrCreate(inputElement)) inFrame:wrapper(*frame) initiatedByUserTyping:initiatedByUserTyping]; 455 } 456 457 static void releaseNSData(unsigned char*, const void* untypedData) 458 { 459 [(NSData *)untypedData release]; 460 } 461 462 virtual void willBeginInputSession(WebPage*, Element* element, WebFrame* frame, RefPtr<API::Object>& userData) override 463 { 464 auto formDelegate = m_controller->_formDelegate.get(); 465 466 if (![formDelegate respondsToSelector:@selector(_webProcessPlugInBrowserContextController:willBeginInputSessionForElement:inFrame:)]) 467 return; 468 469 NSObject <NSSecureCoding> *userObject = [formDelegate _webProcessPlugInBrowserContextController:m_controller willBeginInputSessionForElement:wrapper(*WebKit::InjectedBundleNodeHandle::getOrCreate(element)) inFrame:wrapper(*frame)]; 470 encodeUserObject(userObject, userData); 471 } 472 461 473 private: 462 474 WKWebProcessPlugInBrowserContextController *m_controller;
Note:
See TracChangeset
for help on using the changeset viewer.