7085ac807b9b0280a8d9719690512760822089fd
[WebKit-https.git] / Source / WebKit / mac / WebView / WebDelegateImplementationCaching.mm
1 /*
2  * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  * Copyright (C) 2006 David Smith (catfish.man@gmail.com)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer. 
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution. 
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission. 
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #import "WebDelegateImplementationCaching.h"
31
32 #import "WebKitLogging.h"
33 #import "WebView.h"
34 #import "WebViewData.h"
35 #import <wtf/ObjcRuntimeExtras.h>
36
37 @implementation WebView (WebDelegateImplementationCaching)
38
39 WebResourceDelegateImplementationCache* WebViewGetResourceLoadDelegateImplementations(WebView *webView)
40 {
41     static WebResourceDelegateImplementationCache empty;
42     if (!webView)
43         return &empty;
44     return &webView->_private->resourceLoadDelegateImplementations;
45 }
46
47 WebFrameLoadDelegateImplementationCache* WebViewGetFrameLoadDelegateImplementations(WebView *webView)
48 {
49     static WebFrameLoadDelegateImplementationCache empty;
50     if (!webView)
51         return &empty;
52     return &webView->_private->frameLoadDelegateImplementations;
53 }
54
55 WebScriptDebugDelegateImplementationCache* WebViewGetScriptDebugDelegateImplementations(WebView *webView)
56 {
57     static WebScriptDebugDelegateImplementationCache empty;
58     if (!webView)
59         return &empty;
60     return &webView->_private->scriptDebugDelegateImplementations;
61 }
62
63 WebHistoryDelegateImplementationCache* WebViewGetHistoryDelegateImplementations(WebView *webView)
64 {
65     static WebHistoryDelegateImplementationCache empty;
66     if (!webView)
67         return &empty;
68     return &webView->_private->historyDelegateImplementations;
69 }
70
71 // We use these functions to call the delegates and block exceptions. These functions are
72 // declared inside a WebView category to get direct access to the delegate data memebers,
73 // preventing more ObjC message dispatch and compensating for the expense of the @try/@catch.
74
75 typedef float (*ObjCMsgSendFPRet)(id, SEL, ...);
76 #if defined(__i386__)
77 static const ObjCMsgSendFPRet objc_msgSend_float_return = reinterpret_cast<ObjCMsgSendFPRet>(objc_msgSend_fpret);
78 #else
79 static const ObjCMsgSendFPRet objc_msgSend_float_return = reinterpret_cast<ObjCMsgSendFPRet>(objc_msgSend);
80 #endif
81
82 static inline id CallDelegate(WebView *self, id delegate, SEL selector)
83 {
84     if (!delegate || ![delegate respondsToSelector:selector])
85         return nil;
86     @try {
87         return wtfObjcMsgSend<id>(delegate, selector, self);
88     } @catch(id exception) {
89         ReportDiscardedDelegateException(selector, exception);
90     }
91     return nil;
92 }
93
94 static inline id CallDelegate(WebView *self, id delegate, SEL selector, id object)
95 {
96     if (!delegate || ![delegate respondsToSelector:selector])
97         return nil;
98     @try {
99         return wtfObjcMsgSend<id>(delegate, selector, self, object);
100     } @catch(id exception) {
101         ReportDiscardedDelegateException(selector, exception);
102     }
103     return nil;
104 }
105
106 static inline id CallDelegate(WebView *self, id delegate, SEL selector, NSRect rect)
107 {
108     if (!delegate || ![delegate respondsToSelector:selector])
109         return nil;
110     @try {
111         return wtfObjcMsgSend<id>(delegate, selector, self, rect);
112     } @catch(id exception) {
113         ReportDiscardedDelegateException(selector, exception);
114     }
115     return nil;
116 }
117
118 static inline id CallDelegate(WebView *self, id delegate, SEL selector, id object1, id object2)
119 {
120     if (!delegate || ![delegate respondsToSelector:selector])
121         return nil;
122     @try {
123         return wtfObjcMsgSend<id>(delegate, selector, self, object1, object2);
124     } @catch(id exception) {
125         ReportDiscardedDelegateException(selector, exception);
126     }
127     return nil;
128 }
129
130 static inline id CallDelegate(WebView *self, id delegate, SEL selector, id object, BOOL boolean)
131 {
132     if (!delegate || ![delegate respondsToSelector:selector])
133         return nil;
134     @try {
135         return wtfObjcMsgSend<id>(delegate, selector, self, object, boolean);
136     } @catch(id exception) {
137         ReportDiscardedDelegateException(selector, exception);
138     }
139     return nil;
140 }
141
142 static inline id CallDelegate(WebView *self, id delegate, SEL selector, id object1, id object2, id object3)
143 {
144     if (!delegate || ![delegate respondsToSelector:selector])
145         return nil;
146     @try {
147         return wtfObjcMsgSend<id>(delegate, selector, self, object1, object2, object3);
148     } @catch(id exception) {
149         ReportDiscardedDelegateException(selector, exception);
150     }
151     return nil;
152 }
153
154 static inline id CallDelegate(WebView *self, id delegate, SEL selector, id object, NSUInteger integer)
155 {
156     if (!delegate || ![delegate respondsToSelector:selector])
157         return nil;
158     @try {
159         return wtfObjcMsgSend<id>(delegate, selector, self, object, integer);
160     } @catch(id exception) {
161         ReportDiscardedDelegateException(selector, exception);
162     }
163     return nil;
164 }
165
166 static inline float CallDelegateReturningFloat(WebView *self, id delegate, SEL selector)
167 {
168     if (!delegate || ![delegate respondsToSelector:selector])
169         return 0.0f;
170     @try {
171         return objc_msgSend_float_return(delegate, selector, self);
172     } @catch(id exception) {
173         ReportDiscardedDelegateException(selector, exception);
174     }
175     return 0.0f;
176 }
177
178 static inline BOOL CallDelegateReturningBoolean(BOOL result, WebView *self, id delegate, SEL selector)
179 {
180     if (!delegate || ![delegate respondsToSelector:selector])
181         return result;
182     @try {
183         return wtfObjcMsgSend<BOOL>(delegate, selector, self);
184     } @catch(id exception) {
185         ReportDiscardedDelegateException(selector, exception);
186     }
187     return result;
188 }
189
190 static inline BOOL CallDelegateReturningBoolean(BOOL result, WebView *self, id delegate, SEL selector, id object)
191 {
192     if (!delegate || ![delegate respondsToSelector:selector])
193         return result;
194     @try {
195         return wtfObjcMsgSend<BOOL>(delegate, selector, self, object);
196     } @catch(id exception) {
197         ReportDiscardedDelegateException(selector, exception);
198     }
199     return result;
200 }
201
202 static inline BOOL CallDelegateReturningBoolean(BOOL result, WebView *self, id delegate, SEL selector, id object, BOOL boolean)
203 {
204     if (!delegate || ![delegate respondsToSelector:selector])
205         return result;
206     @try {
207         return wtfObjcMsgSend<BOOL>(delegate, selector, self, object, boolean);
208     } @catch(id exception) {
209         ReportDiscardedDelegateException(selector, exception);
210     }
211     return result;
212 }
213
214 static inline BOOL CallDelegateReturningBoolean(BOOL result, WebView *self, id delegate, SEL selector, id object, BOOL boolean, id object2)
215 {
216     if (!delegate || ![delegate respondsToSelector:selector])
217         return result;
218     @try {
219         return wtfObjcMsgSend<BOOL>(delegate, selector, self, object, boolean, object2);
220     } @catch(id exception) {
221         ReportDiscardedDelegateException(selector, exception);
222     }
223     return result;
224 }
225
226 static inline BOOL CallDelegateReturningBoolean(BOOL result, WebView *self, id delegate, SEL selector, id object1, id object2)
227 {
228     if (!delegate || ![delegate respondsToSelector:selector])
229         return result;
230     @try {
231         return wtfObjcMsgSend<BOOL>(delegate, selector, self, object1, object2);
232     } @catch(id exception) {
233         ReportDiscardedDelegateException(selector, exception);
234     }
235     return result;
236 }
237
238 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector)
239 {
240     if (!delegate)
241         return nil;
242     @try {
243         return wtfCallIMP<id>(implementation, delegate, selector, self);
244     } @catch(id exception) {
245         ReportDiscardedDelegateException(selector, exception);
246     }
247     return nil;
248 }
249
250 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, NSUInteger integer)
251 {
252     if (!delegate)
253         return nil;
254     @try {
255         return implementation(delegate, selector, self, integer);
256     } @catch(id exception) {
257         ReportDiscardedDelegateException(selector, exception);
258     }
259     return nil;
260 }
261
262 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object)
263 {
264     if (!delegate)
265         return nil;
266     @try {
267         return wtfCallIMP<id>(implementation, delegate, selector, self, object);
268     } @catch(id exception) {
269         ReportDiscardedDelegateException(selector, exception);
270     }
271     return nil;
272 }
273
274 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, id object2)
275 {
276     if (!delegate)
277         return nil;
278     @try {
279         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, object2);
280     } @catch(id exception) {
281         ReportDiscardedDelegateException(selector, exception);
282     }
283     return nil;
284 }
285
286 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, id object2, id object3)
287 {
288     if (!delegate)
289         return nil;
290     @try {
291         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, object2, object3);
292     } @catch(id exception) {
293         ReportDiscardedDelegateException(selector, exception);
294     }
295     return nil;
296 }
297
298 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, id object2, id object3, id object4)
299 {
300     if (!delegate)
301         return nil;
302     @try {
303         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, object2, object3, object4);
304     } @catch(id exception) {
305         ReportDiscardedDelegateException(selector, exception);
306     }
307     return nil;
308 }
309
310 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, NSInteger integer, id object2)
311 {
312     if (!delegate)
313         return nil;
314     @try {
315         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, integer, object2);
316     } @catch(id exception) {
317         ReportDiscardedDelegateException(selector, exception);
318     }
319     return nil;
320 }
321
322 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, NSInteger integer1, int integer2, id object2)
323 {
324     if (!delegate)
325         return nil;
326     @try {
327         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, integer1, integer2, object2);
328     } @catch(id exception) {
329         ReportDiscardedDelegateException(selector, exception);
330     }
331     return nil;
332 }
333
334 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, BOOL boolean, NSInteger integer1, int integer2, id object2)
335 {
336     if (!delegate)
337         return nil;
338     @try {
339         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, boolean, integer1, integer2, object2);
340     } @catch(id exception) {
341         ReportDiscardedDelegateException(selector, exception);
342     }
343     return nil;
344 }
345
346 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, id object2, NSInteger integer, id object3)
347 {
348     if (!delegate)
349         return nil;
350     @try {
351         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, object2, integer, object3);
352     } @catch(id exception) {
353         ReportDiscardedDelegateException(selector, exception);
354     }
355     return nil;
356 }
357
358 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, NSInteger integer1, id object2, NSInteger integer2, id object3)
359 {
360     if (!delegate)
361         return nil;
362     @try {
363         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, integer1, object2, integer2, object3);
364     } @catch(id exception) {
365         ReportDiscardedDelegateException(selector, exception);
366     }
367     return nil;
368 }
369
370 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, NSInteger integer, id object2, id object3, id object4)
371 {
372     if (!delegate)
373         return nil;
374     @try {
375         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, integer, object2, object3, object4);
376     } @catch(id exception) {
377         ReportDiscardedDelegateException(selector, exception);
378     }
379     return nil;
380 }
381
382 static inline id CallDelegate(IMP implementation, WebView *self, id delegate, SEL selector, id object1, NSTimeInterval interval, id object2, id object3)
383 {
384     if (!delegate)
385         return nil;
386     @try {
387         return wtfCallIMP<id>(implementation, delegate, selector, self, object1, interval, object2, object3);
388     } @catch(id exception) {
389         ReportDiscardedDelegateException(selector, exception);
390     }
391     return nil;
392 }
393
394 id CallUIDelegate(WebView *self, SEL selector)
395 {
396     return CallDelegate(self, self->_private->UIDelegate, selector);
397 }
398
399 id CallUIDelegate(WebView *self, SEL selector, id object)
400 {
401     return CallDelegate(self, self->_private->UIDelegate, selector, object);
402 }
403
404 id CallUIDelegate(WebView *self, SEL selector, id object, BOOL boolean)
405 {
406     return CallDelegate(self, self->_private->UIDelegate, selector, object, boolean);
407 }
408
409 id CallUIDelegate(WebView *self, SEL selector, NSRect rect)
410 {
411     return CallDelegate(self, self->_private->UIDelegate, selector, rect);
412 }
413
414 id CallUIDelegate(WebView *self, SEL selector, id object1, id object2)
415 {
416     return CallDelegate(self, self->_private->UIDelegate, selector, object1, object2);
417 }
418
419 id CallUIDelegate(WebView *self, SEL selector, id object1, id object2, id object3)
420 {
421     return CallDelegate(self, self->_private->UIDelegate, selector, object1, object2, object3);
422 }
423
424 id CallUIDelegate(WebView *self, SEL selector, id object, NSUInteger integer)
425 {
426     return CallDelegate(self, self->_private->UIDelegate, selector, object, integer);
427 }
428
429 float CallUIDelegateReturningFloat(WebView *self, SEL selector)
430 {
431     return CallDelegateReturningFloat(self, self->_private->UIDelegate, selector);
432 }
433
434 BOOL CallUIDelegateReturningBoolean(BOOL result, WebView *self, SEL selector)
435 {
436     return CallDelegateReturningBoolean(result, self, self->_private->UIDelegate, selector);
437 }
438
439 BOOL CallUIDelegateReturningBoolean(BOOL result, WebView *self, SEL selector, id object)
440 {
441     return CallDelegateReturningBoolean(result, self, self->_private->UIDelegate, selector, object);
442 }
443
444 BOOL CallUIDelegateReturningBoolean(BOOL result, WebView *self, SEL selector, id object, BOOL boolean)
445 {
446     return CallDelegateReturningBoolean(result, self, self->_private->UIDelegate, selector, object, boolean);
447 }
448
449 BOOL CallUIDelegateReturningBoolean(BOOL result, WebView *self, SEL selector, id object, BOOL boolean, id object2)
450 {
451     return CallDelegateReturningBoolean(result, self, self->_private->UIDelegate, selector, object, boolean, object2);
452 }
453
454 BOOL CallUIDelegateReturningBoolean(BOOL result, WebView *self, SEL selector, id object1, id object2)
455 {
456     return CallDelegateReturningBoolean(result, self, self->_private->UIDelegate, selector, object1, object2);
457 }
458
459 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector)
460 {
461     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector);
462 }
463
464 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, NSUInteger integer)
465 {
466     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, integer);
467 }
468
469 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, id object)
470 {
471     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, object);
472 }
473
474 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2)
475 {
476     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, object1, object2);
477 }
478
479 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, id object3)
480 {
481     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, object1, object2, object3);
482 }
483
484 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, id object3, id object4)
485 {
486     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, object1, object2, object3, object4);
487 }
488
489 id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, NSTimeInterval interval, id object2, id object3)
490 {
491     return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, object1, interval, object2, object3);
492 }
493
494 BOOL CallFrameLoadDelegateReturningBoolean(BOOL result, IMP implementation, WebView *self, SEL selector)
495 {
496     @try {
497         return reinterpret_cast<BOOL (*)(id, SEL, WebView *)>(objc_msgSend)(self->_private->frameLoadDelegate, selector, self);
498     } @catch(id exception) {
499         ReportDiscardedDelegateException(selector, exception);
500     }
501     return result;
502 }
503
504 id CallResourceLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2)
505 {
506     return CallDelegate(implementation, self, self->_private->resourceProgressDelegate, selector, object1, object2);
507 }
508
509 id CallResourceLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, id object3)
510 {
511     return CallDelegate(implementation, self, self->_private->resourceProgressDelegate, selector, object1, object2, object3);
512 }
513
514 id CallResourceLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, id object3, id object4)
515 {
516     return CallDelegate(implementation, self, self->_private->resourceProgressDelegate, selector, object1, object2, object3, object4);
517 }
518
519 id CallResourceLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, NSInteger integer, id object2)
520 {
521     return CallDelegate(implementation, self, self->_private->resourceProgressDelegate, selector, object1, integer, object2);
522 }
523
524 id CallResourceLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, NSInteger integer, id object3)
525 {
526     return CallDelegate(implementation, self, self->_private->resourceProgressDelegate, selector, object1, object2, integer, object3);
527 }
528
529 BOOL CallResourceLoadDelegateReturningBoolean(BOOL result, IMP implementation, WebView *self, SEL selector, id object1)
530 {
531     @try {
532         return wtfObjcMsgSend<BOOL>(self->_private->resourceProgressDelegate, selector, self, object1);
533     } @catch(id exception) {
534         ReportDiscardedDelegateException(selector, exception);
535     }
536     return result;
537 }
538
539 BOOL CallResourceLoadDelegateReturningBoolean(BOOL result, IMP implementation, WebView *self, SEL selector, id object1, id object2)
540 {
541     @try {
542         return wtfObjcMsgSend<BOOL>(self->_private->resourceProgressDelegate, selector, self, object1, object2);
543     } @catch(id exception) {
544         ReportDiscardedDelegateException(selector, exception);
545     }
546     return result;
547 }
548
549 BOOL CallResourceLoadDelegateReturningBoolean(BOOL result, IMP implementation, WebView *self, SEL selector, id object1, id object2, id object3)
550 {
551     @try {
552         return wtfObjcMsgSend<BOOL>(self->_private->resourceProgressDelegate, selector, self, object1, object2, object3);
553     } @catch(id exception) {
554         ReportDiscardedDelegateException(selector, exception);
555     }
556     return result;
557 }
558
559 id CallScriptDebugDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, NSInteger integer, id object3)
560 {
561     return CallDelegate(implementation, self, self->_private->scriptDebugDelegate, selector, object1, object2, integer, object3);
562 }
563
564 id CallScriptDebugDelegate(IMP implementation, WebView *self, SEL selector, id object1, NSInteger integer1, id object2, NSInteger integer2, id object3)
565 {
566     return CallDelegate(implementation, self, self->_private->scriptDebugDelegate, selector, object1, integer1, object2, integer2, object3);
567 }
568
569 id CallScriptDebugDelegate(IMP implementation, WebView *self, SEL selector, id object1, NSInteger integer, id object2, id object3, id object4)
570 {
571     return CallDelegate(implementation, self, self->_private->scriptDebugDelegate, selector, object1, integer, object2, object3, object4);
572 }
573
574 id CallScriptDebugDelegate(IMP implementation, WebView *self, SEL selector, id object1, NSInteger integer1, int integer2, id object2)
575 {
576     return CallDelegate(implementation, self, self->_private->scriptDebugDelegate, selector, object1, integer1, integer2, object2);
577 }
578
579 id CallScriptDebugDelegate(IMP implementation, WebView *self, SEL selector, id object1, BOOL boolean, NSInteger integer1, int integer2, id object2)
580 {
581     return CallDelegate(implementation, self, self->_private->scriptDebugDelegate, selector, object1, boolean, integer1, integer2, object2);
582 }
583
584 id CallHistoryDelegate(IMP implementation, WebView *self, SEL selector)
585 {
586     return CallDelegate(implementation, self, self->_private->historyDelegate, selector);
587 }
588
589 id CallHistoryDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2)
590 {
591     return CallDelegate(implementation, self, self->_private->historyDelegate, selector, object1, object2);
592 }
593
594 id CallHistoryDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2, id object3)
595 {
596     return CallDelegate(implementation, self, self->_private->historyDelegate, selector, object1, object2, object3);
597 }
598
599 // The form delegate needs to have it's own implementation, because the first argument is never the WebView
600
601 id CallFormDelegate(WebView *self, SEL selector, id object1, id object2)
602 {
603     id delegate = self->_private->formDelegate;
604     if (!delegate || ![delegate respondsToSelector:selector])
605         return nil;
606     @try {
607         return wtfObjcMsgSend<id>(delegate, selector, object1, object2);
608     } @catch(id exception) {
609         ReportDiscardedDelegateException(selector, exception);
610     }
611     return nil;
612 }
613
614 id CallFormDelegate(WebView *self, SEL selector, id object1, id object2, id object3)
615 {
616     id delegate = self->_private->formDelegate;
617     if (!delegate || ![delegate respondsToSelector:selector])
618         return nil;
619     @try {
620         return wtfObjcMsgSend<id>(delegate, selector, object1, object2, object3);
621     } @catch(id exception) {
622         ReportDiscardedDelegateException(selector, exception);
623     }
624     return nil;
625 }
626
627 id CallFormDelegate(WebView *self, SEL selector, id object1, id object2, id object3, id object4, id object5)
628 {
629     id delegate = self->_private->formDelegate;
630     if (!delegate || ![delegate respondsToSelector:selector])
631         return nil;
632     @try {
633         return wtfObjcMsgSend<id>(delegate, selector, object1, object2, object3, object4, object5);
634     } @catch(id exception) {
635         ReportDiscardedDelegateException(selector, exception);
636     }
637     return nil;
638 }
639
640 BOOL CallFormDelegateReturningBoolean(BOOL result, WebView *self, SEL selector, id object1, SEL selectorArg, id object2)
641 {
642     id delegate = self->_private->formDelegate;
643     if (!delegate || ![delegate respondsToSelector:selector])
644         return result;
645     @try {
646         return wtfObjcMsgSend<BOOL>(delegate, selector, object1, selectorArg, object2);
647     } @catch(id exception) {
648         ReportDiscardedDelegateException(selector, exception);
649     }
650     return result;
651 }
652
653 @end