93136401c0910d87a14b61711ae75ce941e95b0c
[WebKit-https.git] / WebCore / bridge / mac / BrowserExtensionMac.mm
1 /*
2  * Copyright (C) 2003, 2004, 2005, 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  * 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 "BlockExceptions.h"
30 #import "FloatRect.h"
31 #import "FrameMac.h"
32 #import "FrameTree.h"
33 #import "Page.h"
34 #import "Screen.h"
35 #import "WebCoreFrameBridge.h"
36 #import "WebCorePageBridge.h"
37
38 namespace WebCore {
39
40 BrowserExtensionMac::BrowserExtensionMac(Frame *frame)
41     : m_frame(Mac(frame))
42 {
43 }
44
45 void BrowserExtensionMac::createNewWindow(const ResourceRequest& request) 
46 {
47     createNewWindow(request, WindowArgs(), NULL);
48 }
49
50 void BrowserExtensionMac::createNewWindow(const ResourceRequest& request, 
51                                           const WindowArgs& winArgs, 
52                                           Frame*& part)
53 {
54     createNewWindow(request, winArgs, &part);
55 }
56
57 void BrowserExtensionMac::createNewWindow(const ResourceRequest& request, 
58                                           const WindowArgs& winArgs, 
59                                           Frame** partResult)
60
61     BEGIN_BLOCK_OBJC_EXCEPTIONS;
62
63     ASSERT(!winArgs.dialog || request.frameName.isEmpty());
64
65     if (partResult)
66         *partResult = NULL;
67     
68     const KURL& url = request.url();
69
70     NSString *frameName = request.frameName.isEmpty() ? nil : (NSString*)request.frameName;
71     if (frameName) {
72         // FIXME: Can't we just use m_frame->findFrame?
73         if (WebCoreFrameBridge *frameBridge = [m_frame->bridge() findFrameNamed:frameName]) {
74             if (!url.isEmpty()) {
75                 String argsReferrer = request.referrer();
76                 NSString *referrer;
77                 if (!argsReferrer.isEmpty())
78                     referrer = argsReferrer;
79                 else
80                     referrer = [frameBridge referrer];
81
82                 [frameBridge loadURL:url.getNSURL() 
83                        referrer:referrer 
84                          reload:request.reload 
85                     userGesture:true 
86                          target:nil 
87                 triggeringEvent:nil 
88                            form:nil 
89                      formValues:nil];
90             }
91
92             [frameBridge activateWindow];
93
94             if (partResult)
95                 *partResult = [frameBridge impl];
96
97             return;
98         }
99     }
100     
101     WebCorePageBridge *pageBridge;
102     if (winArgs.dialog)
103         pageBridge = [m_frame->bridge() createModalDialogWithURL:url.getNSURL()];
104     else
105         pageBridge = [m_frame->bridge() createWindowWithURL:url.getNSURL()];
106     if (!pageBridge)
107         return;
108     
109     WebCoreFrameBridge *frameBridge = [pageBridge mainFrame];
110     if ([frameBridge impl])
111         [frameBridge impl]->tree()->setName(AtomicString(request.frameName));
112     
113     if (partResult)
114         *partResult = [frameBridge impl];
115     
116     [frameBridge setToolbarsVisible:winArgs.toolBarVisible || winArgs.locationBarVisible];
117     [frameBridge setStatusbarVisible:winArgs.statusBarVisible];
118     [frameBridge setScrollbarsVisible:winArgs.scrollbarsVisible];
119     [frameBridge setWindowIsResizable:winArgs.resizable];
120     
121     NSRect windowRect = [pageBridge impl]->windowRect();
122     if (winArgs.xSet)
123       windowRect.origin.x = winArgs.x;
124     if (winArgs.ySet)
125       windowRect.origin.y = winArgs.y;
126     
127     // 'width' and 'height' specify the dimensions of the WebView, but we can only resize the window, 
128     // so we compute a WebView delta and apply it to the window.
129     NSRect webViewRect = [[pageBridge outerView] frame];
130     if (winArgs.widthSet)
131       windowRect.size.width += winArgs.width - webViewRect.size.width;
132     if (winArgs.heightSet)
133       windowRect.size.height += winArgs.height - webViewRect.size.height;
134     
135     [pageBridge impl]->setWindowRect(windowRect);
136     
137     [frameBridge showWindow];
138     
139     END_BLOCK_OBJC_EXCEPTIONS;
140 }
141
142 int BrowserExtensionMac::getHistoryLength()
143 {
144     return [m_frame->bridge() historyLength];
145 }
146
147 void BrowserExtensionMac::goBackOrForward(int distance)
148 {
149     BEGIN_BLOCK_OBJC_EXCEPTIONS;
150     [m_frame->bridge() goBackOrForward:distance];
151     END_BLOCK_OBJC_EXCEPTIONS;
152 }
153
154 KURL BrowserExtensionMac::historyURL(int distance)
155 {
156     BEGIN_BLOCK_OBJC_EXCEPTIONS;
157     return KURL([m_frame->bridge() historyURL:distance]);
158     END_BLOCK_OBJC_EXCEPTIONS;
159     return KURL();
160 }
161
162 bool BrowserExtensionMac::canRunModal()
163 {
164     BEGIN_BLOCK_OBJC_EXCEPTIONS;
165     return [m_frame->bridge() canRunModal];
166     END_BLOCK_OBJC_EXCEPTIONS;
167     return false;
168 }
169
170 bool BrowserExtensionMac::canRunModalNow()
171 {
172     BEGIN_BLOCK_OBJC_EXCEPTIONS;
173     return [m_frame->bridge() canRunModalNow];
174     END_BLOCK_OBJC_EXCEPTIONS;
175     return false;
176 }
177
178 void BrowserExtensionMac::runModal()
179 {
180     BEGIN_BLOCK_OBJC_EXCEPTIONS;
181     [m_frame->bridge() runModal];
182     END_BLOCK_OBJC_EXCEPTIONS;
183 }
184
185 }