e40d9d0db438424d4cc028b01d7106bb301c36a3
[WebKit-https.git] / WebKit / WebCoreSupport / WebChromeClient.mm
1 /*
2  * Copyright (C) 2006 Apple Computer, 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 "WebChromeClient.h"
30
31 #import "WebDefaultUIDelegate.h"
32 #import "WebFrameInternal.h"
33 #import "WebFrameView.h"
34 #import "WebNSURLRequestExtras.h"
35 #import "WebUIDelegate.h"
36 #import "WebUIDelegatePrivate.h"
37 #import "WebView.h"
38 #import "WebViewInternal.h"
39 #import <WebCore/FloatRect.h>
40 #import <WebCore/FrameLoadRequest.h>
41 #import <WebCore/PlatformString.h>
42 #import <WebCore/ResourceRequest.h>
43 #import <WebCore/Screen.h>
44 #import <wtf/PassRefPtr.h>
45
46 using namespace WebCore;
47
48 WebChromeClient::WebChromeClient(WebView *webView) 
49     : m_webView(webView)
50 {
51 }
52
53 void WebChromeClient::chromeDestroyed()
54 {
55     delete this;
56 }
57
58 // These functions scale between window and WebView coordinates because JavaScript/DOM operations 
59 // assume that the WebView and the window share the same coordinate system.
60
61 void WebChromeClient::setWindowRect(const FloatRect& rect)
62 {
63     NSRect windowRect = toDeviceSpace(rect, [m_webView window]);
64     [[m_webView _UIDelegateForwarder] webView:m_webView setFrame:windowRect];
65 }
66
67 FloatRect WebChromeClient::windowRect()
68 {
69     NSRect windowRect = [[m_webView _UIDelegateForwarder] webViewFrame:m_webView];
70     return toUserSpace(windowRect, [m_webView window]);
71 }
72
73 // FIXME: We need to add API for setting and getting this.
74 FloatRect WebChromeClient::pageRect()
75 {
76     return [m_webView frame];
77 }
78
79 float WebChromeClient::scaleFactor()
80 {
81     return [[m_webView window] userSpaceScaleFactor];
82 }
83
84 void WebChromeClient::focus()
85 {
86     [[m_webView _UIDelegateForwarder] webViewFocus:m_webView];
87 }
88
89 void WebChromeClient::unfocus()
90 {
91     [[m_webView _UIDelegateForwarder] webViewUnfocus:m_webView];
92 }
93
94 Page* WebChromeClient::createWindow(const FrameLoadRequest& request)
95 {
96     NSURLRequest *URLRequest = nil;
97     if (!request.isEmpty())
98         URLRequest = request.resourceRequest().nsURLRequest();
99
100     WebView *newWebView;
101     id delegate = [m_webView UIDelegate];
102     if ([delegate respondsToSelector:@selector(webView:createWebViewWithRequest:)])
103         newWebView = [delegate webView:m_webView createWebViewWithRequest:URLRequest];
104     else
105         newWebView = [[WebDefaultUIDelegate sharedUIDelegate] webView:m_webView createWebViewWithRequest:URLRequest];
106
107     return core(newWebView);
108 }
109
110 Page* WebChromeClient::createModalDialog(const FrameLoadRequest& request)
111 {
112     NSURLRequest *URLRequest = nil;
113     if (!request.isEmpty())
114         URLRequest = request.resourceRequest().nsURLRequest();
115
116     WebView *newWebView = nil;
117     id delegate = [m_webView UIDelegate];
118     if ([delegate respondsToSelector:@selector(webView:createWebViewModalDialogWithRequest:)])
119         newWebView = [delegate webView:m_webView createWebViewModalDialogWithRequest:URLRequest];
120     else if ([delegate respondsToSelector:@selector(webView:createWebViewWithRequest:)])
121         newWebView = [delegate webView:m_webView createWebViewWithRequest:URLRequest];
122     else
123         newWebView = [[WebDefaultUIDelegate sharedUIDelegate] webView:m_webView createWebViewWithRequest:URLRequest];
124
125     return core(newWebView);
126 }
127
128 void WebChromeClient::show()
129 {
130     [[m_webView _UIDelegateForwarder] webViewShow:m_webView];
131 }
132
133 bool WebChromeClient::canRunModal()
134 {
135     return [[m_webView UIDelegate] respondsToSelector:@selector(webViewRunModal:)];
136 }
137
138 void WebChromeClient::runModal()
139 {
140     [[m_webView UIDelegate] webViewRunModal:m_webView];
141 }
142
143 void WebChromeClient::setToolbarsVisible(bool b)
144 {
145     [[m_webView _UIDelegateForwarder] webView:m_webView setToolbarsVisible:b];
146 }
147
148 bool WebChromeClient::toolbarsVisible()
149 {
150     id delegate = [m_webView UIDelegate];
151     if ([delegate respondsToSelector:@selector(webViewAreToolbarsVisible:)])
152         return [delegate webViewAreToolbarsVisible:m_webView];
153     return [[WebDefaultUIDelegate sharedUIDelegate] webViewAreToolbarsVisible:m_webView];
154 }
155
156 void WebChromeClient::setStatusbarVisible(bool b)
157 {
158     [[m_webView _UIDelegateForwarder] webView:m_webView setStatusBarVisible:b];
159 }
160
161 bool WebChromeClient::statusbarVisible()
162 {
163     id delegate = [m_webView UIDelegate];
164     if ([delegate respondsToSelector:@selector(webViewIsStatusBarVisible:)])
165         return [delegate webViewIsStatusBarVisible:m_webView];
166     return [[WebDefaultUIDelegate sharedUIDelegate] webViewIsStatusBarVisible:m_webView];
167 }
168
169
170 void WebChromeClient::setScrollbarsVisible(bool b)
171 {
172     [[[m_webView mainFrame] frameView] setAllowsScrolling:b];
173 }
174
175 bool WebChromeClient::scrollbarsVisible()
176 {
177     return [[[m_webView mainFrame] frameView] allowsScrolling];
178 }
179
180 void WebChromeClient::setMenubarVisible(bool)
181 {
182     // The menubar is always visible in Mac OS X.
183     return;
184 }
185
186 bool WebChromeClient::menubarVisible()
187 {
188     // The menubar is always visible in Mac OS X.
189     return true;
190 }
191
192 void WebChromeClient::setResizable(bool b)
193 {
194     [[m_webView _UIDelegateForwarder] webView:m_webView setResizable:b];
195 }
196
197 void WebChromeClient::addMessageToConsole(const String& message, unsigned int lineNumber, const String& sourceURL)
198 {
199     id wd = [m_webView UIDelegate];
200     if ([wd respondsToSelector:@selector(webView:addMessageToConsole:)]) {
201         NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
202             (NSString *)message, @"message",
203             [NSNumber numberWithInt: lineNumber], @"lineNumber",
204             (NSString *)sourceURL, @"sourceURL",
205             NULL];
206         
207         [wd webView:m_webView addMessageToConsole:dictionary];
208     }    
209 }
210
211