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