d837b59afed25675289a11205108986f6d9f83ea
[WebKit-https.git] / WebCore / bridge / mac / BrowserExtensionMac.mm
1 /*
2  * Copyright (C) 2003 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "BrowserExtensionMac.h"
28
29 #import "KWQExceptions.h"
30 #import "MacFrame.h"
31 #import "WebCoreFrameBridge.h"
32 #import <kxmlcore/Assertions.h>
33 #import "FrameTree.h"
34
35 namespace WebCore {
36
37 BrowserExtensionMac::BrowserExtensionMac(Frame *frame)
38     : m_frame(Mac(frame))
39 {
40 }
41
42 void BrowserExtensionMac::openURLRequest(const KURL& url, const URLArgs& args)
43 {
44     if (url.protocol().lower() == "javascript") {
45         m_frame->createEmptyDocument();
46         m_frame->replaceContentsWithScriptResult(url);
47      } else {
48         m_frame->openURLRequest(url, args);
49     }
50 }
51
52 void BrowserExtensionMac::openURLNotify()
53 {
54 }
55
56 void BrowserExtensionMac::createNewWindow(const KURL &url, const URLArgs &urlArgs) 
57 {
58     createNewWindow(url, urlArgs, WindowArgs(), NULL);
59 }
60
61 void BrowserExtensionMac::createNewWindow(const KURL &url, 
62                                                 const URLArgs &urlArgs, 
63                                                 const WindowArgs &winArgs, 
64                                                 Frame*& part)
65 {
66     createNewWindow(url, urlArgs, winArgs, &part);
67 }
68
69 void BrowserExtensionMac::createNewWindow(const KURL &url, 
70                                                 const URLArgs &urlArgs, 
71                                                 const WindowArgs &winArgs, 
72                                                 Frame** partResult)
73
74     KWQ_BLOCK_EXCEPTIONS;
75
76     ASSERT(!winArgs.dialog || urlArgs.frameName.isEmpty());
77
78     if (partResult)
79         *partResult = NULL;
80
81     NSString *frameName = urlArgs.frameName.length() == 0 ? nil : urlArgs.frameName.getNSString();
82     if (frameName) {
83         // FIXME: Can't we just use m_frame->findFrame?
84         if (WebCoreFrameBridge *bridge = [m_frame->bridge() findFrameNamed:frameName]) {
85             if (!url.isEmpty()) {
86                 DOMString argsReferrer = urlArgs.metaData().get("referrer");
87                 NSString *referrer;
88                 if (!argsReferrer.isEmpty())
89                     referrer = argsReferrer;
90                 else
91                     referrer = [m_frame->bridge() referrer];
92
93                 [bridge loadURL:url.getNSURL() 
94                        referrer:referrer 
95                          reload:urlArgs.reload 
96                     userGesture:true 
97                          target:nil 
98                 triggeringEvent:nil 
99                            form:nil 
100                      formValues:nil];
101             }
102
103             [bridge focusWindow];
104
105             if (partResult)
106                 *partResult = [bridge impl];
107
108             return;
109         }
110     }
111     
112     WebCoreFrameBridge *bridge;
113     if (winArgs.dialog)
114         bridge = [m_frame->bridge() createModalDialogWithURL:url.getNSURL()];
115     else
116         bridge = [m_frame->bridge() createWindowWithURL:url.getNSURL() frameName:frameName];
117
118     if (!bridge)
119         return;
120     
121     if ([bridge impl])
122         [bridge impl]->tree()->setName(urlArgs.frameName);
123     
124     if (partResult)
125         *partResult = [bridge impl];
126     
127     [bridge setToolbarsVisible:winArgs.toolBarVisible || winArgs.locationBarVisible];
128     [bridge setStatusbarVisible:winArgs.statusBarVisible];
129     [bridge setScrollbarsVisible:winArgs.scrollBarsVisible];
130     [bridge setWindowIsResizable:winArgs.resizable];
131     
132     NSRect windowFrame = [bridge windowFrame];
133
134     NSSize size = { 1, 1 }; // workaround for 4213314
135     NSSize scaleRect = [[bridge webView] convertSize:size toView:nil];
136     float scaleX = scaleRect.width;
137     float scaleY = scaleRect.height;
138
139     // In JavaScript, the coordinate system of the window is the same as the coordinate system
140     // of the WebView, so we translate 'left' and 'top' from WebView coordinates to window coordinates.
141     // (If the screen resolution is scaled, window coordinates won't match WebView coordinates.)
142     if (winArgs.xSet)
143         windowFrame.origin.x = winArgs.x * scaleX;
144     if (winArgs.ySet) {
145         // In JavaScript, (0, 0) is the top left corner of the screen.
146         float screenTop = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]);
147         windowFrame.origin.y = screenTop - (winArgs.y * scaleY) - windowFrame.size.height;
148     }
149
150     // 'width' and 'height' specify the dimensions of the WebView, but we can only resize the window, 
151     // so we compute a delta, translate it to window coordinates, and use the translated delta 
152     // to resize the window.
153     NSRect webViewFrame = [[bridge webView] frame];
154     if (winArgs.widthSet) {
155         float widthDelta = (winArgs.width - webViewFrame.size.width) * scaleX;
156         windowFrame.size.width += widthDelta;
157     }
158     if (winArgs.heightSet) {
159         float heightDelta = (winArgs.height - webViewFrame.size.height) * scaleY;
160         windowFrame.size.height += heightDelta;
161         windowFrame.origin.y -= heightDelta;
162     }
163     
164     [bridge setWindowFrame:windowFrame];
165     
166     [bridge showWindow];
167     
168     KWQ_UNBLOCK_EXCEPTIONS;
169 }
170
171 void BrowserExtensionMac::setIconURL(const KURL &url)
172 {
173     KWQ_BLOCK_EXCEPTIONS;
174     [m_frame->bridge() setIconURL:url.getNSURL()];
175     KWQ_UNBLOCK_EXCEPTIONS;
176 }
177
178 void BrowserExtensionMac::setTypedIconURL(const KURL &url, const QString &type)
179 {
180     KWQ_BLOCK_EXCEPTIONS;
181     [m_frame->bridge() setIconURL:url.getNSURL() withType:type.getNSString()];
182     KWQ_UNBLOCK_EXCEPTIONS;
183 }
184
185 int BrowserExtensionMac::getHistoryLength()
186 {
187     return [m_frame->bridge() historyLength];
188 }
189
190 void BrowserExtensionMac::goBackOrForward(int distance)
191 {
192     KWQ_BLOCK_EXCEPTIONS;
193     [m_frame->bridge() goBackOrForward:distance];
194     KWQ_UNBLOCK_EXCEPTIONS;
195 }
196
197 bool BrowserExtensionMac::canRunModal()
198 {
199     KWQ_BLOCK_EXCEPTIONS;
200     return [m_frame->bridge() canRunModal];
201     KWQ_UNBLOCK_EXCEPTIONS;
202     return false;
203 }
204
205 bool BrowserExtensionMac::canRunModalNow()
206 {
207     KWQ_BLOCK_EXCEPTIONS;
208     return [m_frame->bridge() canRunModalNow];
209     KWQ_UNBLOCK_EXCEPTIONS;
210     return false;
211 }
212
213 void BrowserExtensionMac::runModal()
214 {
215     KWQ_BLOCK_EXCEPTIONS;
216     [m_frame->bridge() runModal];
217     KWQ_UNBLOCK_EXCEPTIONS;
218 }
219
220 }