2 * Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #import "BrowserExtensionMac.h"
29 #import "KWQExceptions.h"
31 #import "WebCoreFrameBridge.h"
32 #import <kxmlcore/Assertions.h>
37 BrowserExtensionMac::BrowserExtensionMac(Frame *frame)
42 void BrowserExtensionMac::openURLRequest(const KURL& url, const URLArgs& args)
44 if (url.protocol().lower() == "javascript") {
45 m_frame->createEmptyDocument();
46 m_frame->replaceContentsWithScriptResult(url);
48 m_frame->openURLRequest(url, args);
52 void BrowserExtensionMac::openURLNotify()
56 void BrowserExtensionMac::createNewWindow(const KURL &url, const URLArgs &urlArgs)
58 createNewWindow(url, urlArgs, WindowArgs(), NULL);
61 void BrowserExtensionMac::createNewWindow(const KURL &url,
62 const URLArgs &urlArgs,
63 const WindowArgs &winArgs,
66 createNewWindow(url, urlArgs, winArgs, &part);
69 void BrowserExtensionMac::createNewWindow(const KURL &url,
70 const URLArgs &urlArgs,
71 const WindowArgs &winArgs,
76 ASSERT(!winArgs.dialog || urlArgs.frameName.isEmpty());
81 NSString *frameName = urlArgs.frameName.length() == 0 ? nil : urlArgs.frameName.getNSString();
83 // FIXME: Can't we just use m_frame->findFrame?
84 if (WebCoreFrameBridge *bridge = [m_frame->bridge() findFrameNamed:frameName]) {
86 DOMString argsReferrer = urlArgs.metaData().get("referrer");
88 if (!argsReferrer.isEmpty())
89 referrer = argsReferrer;
91 referrer = [m_frame->bridge() referrer];
93 [bridge loadURL:url.getNSURL()
103 [bridge focusWindow];
106 *partResult = [bridge impl];
112 WebCoreFrameBridge *bridge;
114 bridge = [m_frame->bridge() createModalDialogWithURL:url.getNSURL()];
116 bridge = [m_frame->bridge() createWindowWithURL:url.getNSURL() frameName:frameName];
122 [bridge impl]->tree()->setName(urlArgs.frameName);
125 *partResult = [bridge impl];
127 [bridge setToolbarsVisible:winArgs.toolBarVisible || winArgs.locationBarVisible];
128 [bridge setStatusbarVisible:winArgs.statusBarVisible];
129 [bridge setScrollbarsVisible:winArgs.scrollBarsVisible];
130 [bridge setWindowIsResizable:winArgs.resizable];
132 NSRect windowFrame = [bridge windowFrame];
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;
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.)
143 windowFrame.origin.x = winArgs.x * scaleX;
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;
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;
158 if (winArgs.heightSet) {
159 float heightDelta = (winArgs.height - webViewFrame.size.height) * scaleY;
160 windowFrame.size.height += heightDelta;
161 windowFrame.origin.y -= heightDelta;
164 [bridge setWindowFrame:windowFrame];
168 KWQ_UNBLOCK_EXCEPTIONS;
171 void BrowserExtensionMac::setIconURL(const KURL &url)
173 KWQ_BLOCK_EXCEPTIONS;
174 [m_frame->bridge() setIconURL:url.getNSURL()];
175 KWQ_UNBLOCK_EXCEPTIONS;
178 void BrowserExtensionMac::setTypedIconURL(const KURL &url, const QString &type)
180 KWQ_BLOCK_EXCEPTIONS;
181 [m_frame->bridge() setIconURL:url.getNSURL() withType:type.getNSString()];
182 KWQ_UNBLOCK_EXCEPTIONS;
185 int BrowserExtensionMac::getHistoryLength()
187 return [m_frame->bridge() historyLength];
190 void BrowserExtensionMac::goBackOrForward(int distance)
192 KWQ_BLOCK_EXCEPTIONS;
193 [m_frame->bridge() goBackOrForward:distance];
194 KWQ_UNBLOCK_EXCEPTIONS;
197 bool BrowserExtensionMac::canRunModal()
199 KWQ_BLOCK_EXCEPTIONS;
200 return [m_frame->bridge() canRunModal];
201 KWQ_UNBLOCK_EXCEPTIONS;
205 bool BrowserExtensionMac::canRunModalNow()
207 KWQ_BLOCK_EXCEPTIONS;
208 return [m_frame->bridge() canRunModalNow];
209 KWQ_UNBLOCK_EXCEPTIONS;
213 void BrowserExtensionMac::runModal()
215 KWQ_BLOCK_EXCEPTIONS;
216 [m_frame->bridge() runModal];
217 KWQ_UNBLOCK_EXCEPTIONS;