Home | History | Annotate | Download | only in mac
      1 /*
      2  * Copyright (C) 2006. 2007 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     14  *     its contributors may be used to endorse or promote products derived
     15  *     from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #import "config.h"
     30 #import "UIDelegate.h"
     31 
     32 #import "DumpRenderTree.h"
     33 #import "DumpRenderTreeDraggingInfo.h"
     34 #import "EventSendingController.h"
     35 #import "LayoutTestController.h"
     36 #import <WebKit/WebApplicationCache.h>
     37 #import <WebKit/WebFramePrivate.h>
     38 #import <WebKit/WebHTMLViewPrivate.h>
     39 #import <WebKit/WebQuotaManager.h>
     40 #import <WebKit/WebSecurityOriginPrivate.h>
     41 #import <WebKit/WebUIDelegatePrivate.h>
     42 #import <WebKit/WebView.h>
     43 #import <WebKit/WebViewPrivate.h>
     44 #import <wtf/Assertions.h>
     45 
     46 DumpRenderTreeDraggingInfo *draggingInfo = nil;
     47 
     48 @implementation UIDelegate
     49 
     50 - (void)webView:(WebView *)sender setFrame:(NSRect)frame
     51 {
     52     m_frame = frame;
     53 }
     54 
     55 - (NSRect)webViewFrame:(WebView *)sender
     56 {
     57     return m_frame;
     58 }
     59 
     60 - (void)webView:(WebView *)sender addMessageToConsole:(NSDictionary *)dictionary withSource:(NSString *)source
     61 {
     62     NSString *message = [dictionary objectForKey:@"message"];
     63     NSNumber *lineNumber = [dictionary objectForKey:@"lineNumber"];
     64 
     65     NSRange range = [message rangeOfString:@"file://"];
     66     if (range.location != NSNotFound)
     67         message = [[message substringToIndex:range.location] stringByAppendingString:[[message substringFromIndex:NSMaxRange(range)] lastPathComponent]];
     68 
     69     printf ("CONSOLE MESSAGE: line %d: %s\n", [lineNumber intValue], [message UTF8String]);
     70 }
     71 
     72 - (void)modalWindowWillClose:(NSNotification *)notification
     73 {
     74     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowWillCloseNotification object:nil];
     75     [NSApp abortModal];
     76 }
     77 
     78 - (void)webViewRunModal:(WebView *)sender
     79 {
     80     gLayoutTestController->setWindowIsKey(false);
     81     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modalWindowWillClose:) name:NSWindowWillCloseNotification object:nil];
     82     [NSApp runModalForWindow:[sender window]];
     83     gLayoutTestController->setWindowIsKey(true);
     84 }
     85 
     86 - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
     87 {
     88     if (!done)
     89         printf("ALERT: %s\n", [message UTF8String]);
     90 }
     91 
     92 - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
     93 {
     94     if (!done)
     95         printf("CONFIRM: %s\n", [message UTF8String]);
     96     return YES;
     97 }
     98 
     99 - (NSString *)webView:(WebView *)sender runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WebFrame *)frame
    100 {
    101     if (!done)
    102         printf("PROMPT: %s, default text: %s\n", [prompt UTF8String], [defaultText UTF8String]);
    103     return defaultText;
    104 }
    105 
    106 - (BOOL)webView:(WebView *)c runBeforeUnloadConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
    107 {
    108     if (!done)
    109         printf("CONFIRM NAVIGATION: %s\n", [message UTF8String]);
    110     return YES;
    111 }
    112 
    113 
    114 - (void)webView:(WebView *)sender dragImage:(NSImage *)anImage at:(NSPoint)viewLocation offset:(NSSize)initialOffset event:(NSEvent *)event pasteboard:(NSPasteboard *)pboard source:(id)sourceObj slideBack:(BOOL)slideFlag forView:(NSView *)view
    115 {
    116      assert(!draggingInfo);
    117      draggingInfo = [[DumpRenderTreeDraggingInfo alloc] initWithImage:anImage offset:initialOffset pasteboard:pboard source:sourceObj];
    118      [sender draggingUpdated:draggingInfo];
    119      [EventSendingController replaySavedEvents];
    120 }
    121 
    122 - (void)webViewFocus:(WebView *)webView
    123 {
    124     gLayoutTestController->setWindowIsKey(true);
    125 }
    126 
    127 - (void)webViewUnfocus:(WebView *)webView
    128 {
    129     gLayoutTestController->setWindowIsKey(false);
    130 }
    131 
    132 - (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
    133 {
    134     if (!gLayoutTestController->canOpenWindows())
    135         return nil;
    136 
    137     // Make sure that waitUntilDone has been called.
    138     ASSERT(gLayoutTestController->waitToDump());
    139 
    140     WebView *webView = createWebViewAndOffscreenWindow();
    141 
    142     if (gLayoutTestController->newWindowsCopyBackForwardList())
    143         [webView _loadBackForwardListFromOtherView:sender];
    144 
    145     return [webView autorelease];
    146 }
    147 
    148 - (void)webViewClose:(WebView *)sender
    149 {
    150     NSWindow* window = [sender window];
    151 
    152     if (gLayoutTestController->callCloseOnWebViews())
    153         [sender close];
    154 
    155     [window close];
    156 }
    157 
    158 - (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(WebSecurityOrigin *)origin database:(NSString *)databaseIdentifier
    159 {
    160     if (!done && gLayoutTestController->dumpDatabaseCallbacks()) {
    161         printf("UI DELEGATE DATABASE CALLBACK: exceededDatabaseQuotaForSecurityOrigin:{%s, %s, %i} database:%s\n", [[origin protocol] UTF8String], [[origin host] UTF8String],
    162             [origin port], [databaseIdentifier UTF8String]);
    163     }
    164 
    165     static const unsigned long long defaultQuota = 5 * 1024 * 1024;
    166     [[origin databaseQuotaManager] setQuota:defaultQuota];
    167 }
    168 
    169 - (void)webView:(WebView *)sender exceededApplicationCacheOriginQuotaForSecurityOrigin:(WebSecurityOrigin *)origin
    170 {
    171     if (!done && gLayoutTestController->dumpApplicationCacheDelegateCallbacks()) {
    172         printf("UI DELEGATE APPLICATION CACHE CALLBACK: exceededApplicationCacheOriginQuotaForSecurityOrigin:{%s, %s, %i}\n",
    173             [[origin protocol] UTF8String], [[origin host] UTF8String], [origin port]);
    174     }
    175 
    176     static const unsigned long long defaultOriginQuota = [WebApplicationCache defaultOriginQuota];
    177     [[origin applicationCacheQuotaManager] setQuota:defaultOriginQuota];
    178 }
    179 
    180 - (void)webView:(WebView *)sender setStatusText:(NSString *)text
    181 {
    182     if (gLayoutTestController->dumpStatusCallbacks())
    183         printf("UI DELEGATE STATUS CALLBACK: setStatusText:%s\n", [text UTF8String]);
    184 }
    185 
    186 - (void)webView:(WebView *)webView decidePolicyForGeolocationRequestFromOrigin:(WebSecurityOrigin *)origin frame:(WebFrame *)frame listener:(id<WebGeolocationPolicyListener>)listener
    187 {
    188     if (!gLayoutTestController->isGeolocationPermissionSet()) {
    189         if (!m_pendingGeolocationPermissionListeners)
    190             m_pendingGeolocationPermissionListeners = [[NSMutableSet set] retain];
    191         [m_pendingGeolocationPermissionListeners addObject:listener];
    192         return;
    193     }
    194 
    195     if (gLayoutTestController->geolocationPermission())
    196         [listener allow];
    197     else
    198         [listener deny];
    199 }
    200 
    201 - (void)didSetMockGeolocationPermission
    202 {
    203     ASSERT(gLayoutTestController->isGeolocationPermissionSet());
    204     if (m_pendingGeolocationPermissionListeners && !m_timer)
    205         m_timer = [NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerFired) userInfo:0 repeats:NO];
    206 }
    207 
    208 - (int)numberOfPendingGeolocationPermissionRequests
    209 {
    210     if (!m_pendingGeolocationPermissionListeners)
    211         return 0;
    212     return [m_pendingGeolocationPermissionListeners count];
    213 }
    214 
    215 
    216 - (void)timerFired
    217 {
    218     ASSERT(gLayoutTestController->isGeolocationPermissionSet());
    219     m_timer = 0;
    220     NSEnumerator* enumerator = [m_pendingGeolocationPermissionListeners objectEnumerator];
    221     id<WebGeolocationPolicyListener> listener;
    222     while ((listener = [enumerator nextObject])) {
    223         if (gLayoutTestController->geolocationPermission())
    224             [listener allow];
    225         else
    226             [listener deny];
    227     }
    228     [m_pendingGeolocationPermissionListeners removeAllObjects];
    229     [m_pendingGeolocationPermissionListeners release];
    230     m_pendingGeolocationPermissionListeners = nil;
    231 }
    232 
    233 - (BOOL)webView:(WebView *)sender shouldHaltPlugin:(DOMNode *)pluginNode
    234 {
    235     return NO;
    236 }
    237 
    238 - (BOOL)webView:(WebView *)webView supportsFullScreenForElement:(DOMElement*)element withKeyboard:(BOOL)withKeyboard
    239 {
    240     return YES;
    241 }
    242 
    243 - (void)webView:(WebView *)webView enterFullScreenForElement:(DOMElement*)element listener:(NSObject<WebKitFullScreenListener>*)listener
    244 {
    245     [listener webkitWillEnterFullScreen];
    246     [listener webkitDidEnterFullScreen];
    247 }
    248 
    249 - (void)webView:(WebView *)webView exitFullScreenForElement:(DOMElement*)element listener:(NSObject<WebKitFullScreenListener>*)listener
    250 {
    251     [listener webkitWillExitFullScreen];
    252     [listener webkitDidExitFullScreen];
    253 }
    254 
    255 - (BOOL)webView:(WebView *)webView didPressMissingPluginButton:(DOMElement *)element
    256 {
    257     printf("MISSING PLUGIN BUTTON PRESSED\n");
    258     return TRUE;
    259 }
    260 
    261 - (void)dealloc
    262 {
    263     [draggingInfo release];
    264     draggingInfo = nil;
    265     [m_pendingGeolocationPermissionListeners release];
    266     m_pendingGeolocationPermissionListeners = nil;
    267 
    268     [super dealloc];
    269 }
    270 
    271 @end
    272