Changeset 167343 in webkit


Ignore:
Timestamp:
Apr 15, 2014, 10:16:36 PM (11 years ago)
Author:
mitz@apple.com
Message:

[Cocoa] Add a form delegate method corresponding to willSubmitForm
https://bugs.webkit.org/show_bug.cgi?id=131718

Reviewed by Tim Horton.

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _setFormDelegate:]): Changed to define and create a FormClient (which derives
from API::FormClient and messages a delegate), and set it as the form client.

  • UIProcess/API/Cocoa/_WKFormDelegate.h: Declared new delegate method.
  • WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInFormDelegatePrivate.h: Added a

variant of willSubmitForm that returs a user object to pass to the delegate in the UI
process, giving it a temporary name with “new”.

  • WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm:

(-[WKWebProcessPlugInBrowserContextController _setFormDelegate:]): Changed willSubmitForm()
to check for the new bundle delegate method first and encode the user object as user data.
Moved the encoding of an NSObject <NSSecureCoding> as user data into a helper function.

Location:
trunk/Source/WebKit2
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r167340 r167343  
     12014-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
    1232014-04-15  Hyowon Kim  <hw1008.kim@samsung.com>
    224
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r167274 r167343  
    2929#if WK_API_ENABLED
    3030
     31#import "APIFormClient.h"
    3132#import "FindClient.h"
    3233#import "NavigationState.h"
     
    5354#import "WebCertificateInfo.h"
    5455#import "WebContext.h"
     56#import "WebFormSubmissionListenerProxy.h"
    5557#import "WebPageGroup.h"
    5658#import "WebPageProxy.h"
    5759#import "WebProcessProxy.h"
    5860#import "_WKFindDelegate.h"
     61#import "_WKFormDelegate.h"
    5962#import "_WKRemoteObjectRegistryInternal.h"
    6063#import "_WKVisitedLinkProviderInternal.h"
     
    11861189{
    11871190    _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);
    11881244}
    11891245
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKFormDelegate.h

    r167100 r167343  
    3838
    3939- (void)_webView:(WKWebView *)webView didStartInputSession:(id <_WKFormInputSession>)inputSession;
     40- (void)_webView:(WKWebView *)webView willSubmitFormValues:(NSDictionary *)values userObject:(NSObject <NSSecureCoding> *)userObject submissionHandler:(void (^)(void))submissionHandler;
    4041
    4142#if TARGET_OS_IPHONE
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInFormDelegatePrivate.h

    r167276 r167343  
    4141- (void)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller textDidChangeInTextField:(WKWebProcessPlugInNodeHandle *)textField inFrame:(WKWebProcessPlugInFrame *)frame initiatedByUserTyping:(BOOL)initiatedByUserTyping;
    4242
     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
    4347// The return value is exposed in the UI process via the userObject property of the _WKFormInputSession object.
    4448- (NSObject <NSSecureCoding> *)_webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller willBeginInputSessionForElement:(WKWebProcessPlugInNodeHandle *)node inFrame:(WKWebProcessPlugInFrame *)frame;
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm

    r167276 r167343  
    408408        }
    409409
    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        {
    444412            if (!userObject)
    445413                return;
     
    459427        }
    460428
     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
    461473    private:
    462474        WKWebProcessPlugInBrowserContextController *m_controller;
Note: See TracChangeset for help on using the changeset viewer.