KWQKHTMLPartBrowserExtension.mm [plain text]
/*
* Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "KWQKHTMLPartBrowserExtension.h"
#import "KWQExceptions.h"
#import "WebCoreBridge.h"
#import "khtml_part.h"
KHTMLPartBrowserExtension::KHTMLPartBrowserExtension(KHTMLPart *part)
: _part(KWQ(part)), _browserInterface(_part)
{
}
void KHTMLPartBrowserExtension::openURLRequest(const KURL &url,
const KParts::URLArgs &args)
{
if (url.protocol().lower() == "javascript") {
_part->createEmptyDocument();
_part->replaceContentsWithScriptResult(url);
} else {
_part->openURLRequest(url, args);
}
}
void KHTMLPartBrowserExtension::openURLNotify()
{
}
void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
const KParts::URLArgs &urlArgs)
{
createNewWindow(url, urlArgs, KParts::WindowArgs(), NULL);
}
void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
const KParts::URLArgs &urlArgs,
const KParts::WindowArgs &winArgs,
KParts::ReadOnlyPart *&part)
{
createNewWindow(url, urlArgs, winArgs, &part);
}
void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
const KParts::URLArgs &urlArgs,
const KParts::WindowArgs &winArgs,
KParts::ReadOnlyPart **partResult)
{
KWQ_BLOCK_EXCEPTIONS;
NSString *frameName = urlArgs.frameName.length() == 0 ? nil : urlArgs.frameName.getNSString();
WebCoreBridge *bridge;
NSString *referrer;
QString argsReferrer = urlArgs.metaData()["referrer"];
if (argsReferrer.length() > 0) {
referrer = argsReferrer.getNSString();
} else {
referrer = [_part->bridge() referrer];
}
ASSERT(!winArgs.dialog || urlArgs.frameName.isEmpty());
if (partResult)
*partResult = NULL;
if (frameName != nil) {
bridge = [_part->bridge() findFrameNamed:frameName];
if (bridge != nil) {
if (!url.isEmpty()) {
[bridge loadURL:url.getNSURL() referrer:referrer reload:urlArgs.reload userGesture:true target:nil triggeringEvent:nil form:nil formValues:nil];
}
[bridge focusWindow];
if (partResult) {
*partResult = [bridge part];
}
return;
}
}
if (winArgs.dialog)
bridge = [_part->bridge() createModalDialogWithURL:url.getNSURL()];
else
bridge = [_part->bridge() createWindowWithURL:url.getNSURL() frameName:frameName];
if (!bridge)
return;
if (!winArgs.toolBarsVisible) {
[bridge setToolbarsVisible:NO];
}
if (!winArgs.statusBarVisible) {
[bridge setStatusBarVisible:NO];
}
if (!winArgs.scrollbarsVisible) {
[bridge setScrollbarsVisible:NO];
}
if (!winArgs.resizable) {
[bridge setWindowIsResizable:NO];
}
if (winArgs.xSet || winArgs.ySet || winArgs.widthSet || winArgs.heightSet) {
NSRect frame = [bridge windowFrame];
NSRect contentRect = [bridge windowContentRect];
if (winArgs.xSet) {
frame.origin.x = winArgs.x;
}
if (winArgs.ySet) {
float heightForFlip = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]);
frame.origin.y = heightForFlip - (winArgs.y + frame.size.height);
}
if (winArgs.widthSet) {
frame.size.width += winArgs.width - contentRect.size.width;
}
if (winArgs.heightSet) {
float heightDelta = winArgs.height - contentRect.size.height;
frame.size.height += heightDelta;
frame.origin.y -= heightDelta;
}
[bridge setWindowFrame:frame];
}
[bridge showWindow];
if ([bridge part]) {
[bridge part]->setName(urlArgs.frameName);
}
if (partResult) {
*partResult = [bridge part];
}
KWQ_UNBLOCK_EXCEPTIONS;
}
void KHTMLPartBrowserExtension::setIconURL(const KURL &url)
{
KWQ_BLOCK_EXCEPTIONS;
[_part->bridge() setIconURL:url.getNSURL()];
KWQ_UNBLOCK_EXCEPTIONS;
}
void KHTMLPartBrowserExtension::setTypedIconURL(const KURL &url, const QString &type)
{
KWQ_BLOCK_EXCEPTIONS;
[_part->bridge() setIconURL:url.getNSURL() withType:type.getNSString()];
KWQ_UNBLOCK_EXCEPTIONS;
}
bool KHTMLPartBrowserExtension::canRunModal()
{
KWQ_BLOCK_EXCEPTIONS;
return [_part->bridge() canRunModal];
KWQ_UNBLOCK_EXCEPTIONS;
return false;
}
bool KHTMLPartBrowserExtension::canRunModalNow()
{
KWQ_BLOCK_EXCEPTIONS;
return [_part->bridge() canRunModalNow];
KWQ_UNBLOCK_EXCEPTIONS;
return false;
}
void KHTMLPartBrowserExtension::runModal()
{
KWQ_BLOCK_EXCEPTIONS;
[_part->bridge() runModal];
KWQ_UNBLOCK_EXCEPTIONS;
}