📄 kjs_window.cpp
字号:
#endif
}
} else if (key == "width") {
bool ok;
double d = val.toDouble(&ok);
if (d != 0 || ok) {
#if !APPLE_CHANGES
d += 2*qApp->style().pixelMetric( QStyle::PM_DefaultFrameWidth ) + 2;
#endif
if (d > screen.width()) // should actually check workspace
d = screen.width();
if (d < 100)
d = 100;
winargs.width = (int)d;
#if APPLE_CHANGES
winargs.widthSet = true;
#endif
}
} else {
goto boolargs;
}
continue;
} else {
// leaving away the value gives true
key = s.stripWhiteSpace().lower();
val = "1";
}
boolargs:
if (key == "menubar")
winargs.menuBarVisible = (val == "1" || val == "yes");
else if (key == "toolbar")
winargs.toolBarsVisible = (val == "1" || val == "yes");
else if (key == "location") // ### missing in WindowArgs
winargs.toolBarsVisible = (val == "1" || val == "yes");
else if (key == "status" || key == "statusbar")
winargs.statusBarVisible = (val == "1" || val == "yes");
else if (key == "resizable")
winargs.resizable = (val == "1" || val == "yes");
else if (key == "fullscreen")
winargs.fullscreen = (val == "1" || val == "yes");
#if APPLE_CHANGES
else if (key == "scrollbars")
winargs.scrollbarsVisible = !(val == "0" || val == "no");
#endif
}
}
// prepare arguments
KURL url;
KHTMLPart* activePart = Window::retrieveActive(exec)->m_part;
if (!str.isEmpty())
{
if (activePart)
url = activePart->htmlDocument().completeURL(str).string();
}
KParts::URLArgs uargs;
uargs.frameName = frameName;
if ( uargs.frameName == "_top" )
{
while ( part->parentPart() )
part = part->parentPart();
const Window* window = Window::retrieveWindow(part);
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
part->scheduleLocationChange(url.url(), activePart->referrer(), false/*don't lock history*/, userGesture);
}
return Window::retrieve(part);
}
if ( uargs.frameName == "_parent" )
{
if ( part->parentPart() )
part = part->parentPart();
const Window* window = Window::retrieveWindow(part);
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
part->scheduleLocationChange(url.url(), activePart->referrer(), false/*don't lock history*/, userGesture);
}
return Window::retrieve(part);
}
uargs.serviceType = "text/html";
// request window (new or existing if framename is set)
KParts::ReadOnlyPart *newPart = 0L;
uargs.metaData()["referrer"] = activePart->referrer();
emit part->browserExtension()->createNewWindow("", uargs,winargs,newPart);
if (newPart && newPart->inherits("KHTMLPart")) {
KHTMLPart *khtmlpart = static_cast<KHTMLPart*>(newPart);
//qDebug("opener set to %p (this Window's part) in new Window %p (this Window=%p)",part,win,window);
khtmlpart->setOpener(part);
khtmlpart->setOpenedByJS(true);
if (khtmlpart->document().isNull()) {
DocumentImpl *oldDoc = part->xmlDocImpl();
if (oldDoc && oldDoc->baseURL() != 0)
khtmlpart->begin(oldDoc->baseURL());
else
khtmlpart->begin();
khtmlpart->write("<HTML><BODY>");
khtmlpart->end();
if (oldDoc) {
kdDebug(6070) << "Setting domain to " << oldDoc->domain().string() << endl;
khtmlpart->xmlDocImpl()->setDomain( oldDoc->domain(), true );
khtmlpart->xmlDocImpl()->setBaseURL( oldDoc->baseURL() );
}
}
#if APPLE_CHANGES
if (!url.isEmpty()) {
const Window* window = Window::retrieveWindow(khtmlpart);
if (!url.url().startsWith("javascript:", false) || (window && window->isSafeScript(exec))) {
bool userGesture = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter())->wasRunByUserGesture();
khtmlpart->scheduleLocationChange(url.url(), activePart->referrer(), false, userGesture);
}
}
#else
uargs.serviceType = QString::null;
if (uargs.frameName == "_blank")
uargs.frameName = QString::null;
if (!url.isEmpty()) {
uargs.metaData()["referrer"] = activePart->referrer();
emit khtmlpart->browserExtension()->openURLRequest(url,uargs);
}
#endif
return Window::retrieve(khtmlpart); // global object
} else
return Undefined();
}
}
#if APPLE_CHANGES
case Window::Print:
part->print();
return Undefined();
#endif
case Window::ScrollBy:
window->updateLayout();
if(args.size() >= 2 && widget)
widget->scrollBy(args[0].toInt32(exec), args[1].toInt32(exec));
return Undefined();
case Window::Scroll:
case Window::ScrollTo:
window->updateLayout();
if(args.size() >= 2 && widget)
widget->setContentsPos(args[0].toInt32(exec), args[1].toInt32(exec));
return Undefined();
case Window::MoveBy:
if(args.size() >= 2 && widget)
{
QWidget * tl = widget->topLevelWidget();
QRect sg = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(tl));
QPoint dest = tl->pos() + QPoint( args[0].toInt32(exec), args[1].toInt32(exec) );
// Security check (the spec talks about UniversalBrowserWrite to disable this check...)
if ( dest.x() >= sg.x() && dest.y() >= sg.x() &&
dest.x()+tl->width() <= sg.width()+sg.x() &&
dest.y()+tl->height() <= sg.height()+sg.y() )
tl->move( dest );
}
return Undefined();
case Window::MoveTo:
if(args.size() >= 2 && widget)
{
QWidget * tl = widget->topLevelWidget();
QRect sg = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(tl));
QPoint dest( args[0].toInt32(exec)+sg.x(), args[1].toInt32(exec)+sg.y() );
// Security check (the spec talks about UniversalBrowserWrite to disable this check...)
if ( dest.x() >= sg.x() && dest.y() >= sg.y() &&
dest.x()+tl->width() <= sg.width()+sg.x() &&
dest.y()+tl->height() <= sg.height()+sg.y() )
tl->move( dest );
}
return Undefined();
case Window::ResizeBy:
if(args.size() >= 2 && widget)
{
QWidget * tl = widget->topLevelWidget();
QSize dest = tl->size() + QSize( args[0].toInt32(exec), args[1].toInt32(exec) );
QRect sg = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(tl));
// Security check: within desktop limits and bigger than 100x100 (per spec)
if ( tl->x()+dest.width() <= sg.x()+sg.width() &&
tl->y()+dest.height() <= sg.y()+sg.height() &&
dest.width() >= 100 && dest.height() >= 100 )
{
// Take into account the window frame
int deltaWidth = tl->frameGeometry().width() - tl->width();
int deltaHeight = tl->frameGeometry().height() - tl->height();
tl->resize( dest.width() - deltaWidth, dest.height() - deltaHeight );
}
}
return Undefined();
case Window::ResizeTo:
if(args.size() >= 2 && widget)
{
QWidget * tl = widget->topLevelWidget();
QSize dest = QSize( args[0].toInt32(exec), args[1].toInt32(exec) );
QRect sg = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber(tl));
// Security check: within desktop limits and bigger than 100x100 (per spec)
if ( tl->x()+dest.width() <= sg.x()+sg.width() &&
tl->y()+dest.height() <= sg.y()+sg.height() &&
dest.width() >= 100 && dest.height() >= 100 )
{
// Take into account the window frame
int deltaWidth = tl->frameGeometry().width() - tl->width();
int deltaHeight = tl->frameGeometry().height() - tl->height();
tl->resize( dest.width() - deltaWidth, dest.height() - deltaHeight );
}
}
return Undefined();
case Window::SetTimeout:
if (!window->isSafeScript(exec))
return Undefined();
if (args.size() >= 2 && v.isA(StringType)) {
int i = args[1].toInt32(exec);
int r = (const_cast<Window*>(window))->installTimeout(s, i, true /*single shot*/);
return Number(r);
}
else if (args.size() >= 2 && v.isA(ObjectType) && Object::dynamicCast(v).implementsCall()) {
Value func = args[0];
int i = args[1].toInt32(exec);
// All arguments after the second should go to the function
// FIXME: could be more efficient
List funcArgs = args.copyTail().copyTail();
int r = (const_cast<Window*>(window))->installTimeout(func, funcArgs, i, true /*single shot*/);
return Number(r);
}
else
return Undefined();
case Window::SetInterval:
if (!window->isSafeScript(exec))
return Undefined();
if (args.size() >= 2 && v.isA(StringType)) {
int i = args[1].toInt32(exec);
int r = (const_cast<Window*>(window))->installTimeout(s, i, false);
return Number(r);
}
else if (args.size() >= 2 && !Object::dynamicCast(v).isNull() &&
Object::dynamicCast(v).implementsCall()) {
Value func = args[0];
int i = args[1].toInt32(exec);
// All arguments after the second should go to the function
// FIXME: could be more efficient
List funcArgs = args.copyTail().copyTail();
int r = (const_cast<Window*>(window))->installTimeout(func, funcArgs, i, false);
return Number(r);
}
else
return Undefined();
case Window::ClearTimeout:
case Window::ClearInterval:
if (!window->isSafeScript(exec))
return Undefined();
(const_cast<Window*>(window))->clearTimeout(v.toInt32(exec));
return Undefined();
case Window::Focus:
if (widget)
widget->setActiveWindow();
return Undefined();
case Window::GetSelection:
if (!window->isSafeScript(exec))
return Undefined();
return Value(window->selection());
case Window::Blur:
#if APPLE_CHANGES
KWQ(part)->unfocusWindow();
#else
// TODO
#endif
return Undefined();
case Window::Close:
/* From http://developer.netscape.com/docs/manuals/js/client/jsref/window.htm :
The close method closes only windows opened by JavaScript using the open method.
If you attempt to close any other window, a confirm is generated, which
lets the user choose whether the window closes.
This is a security feature to prevent "mail bombs" containing self.close().
However, if the window has only one document (the current one) in its
session history, the close is allowed without any confirm. This is a
special case for one-off windows that need to open other windows and
then dispose of themselves.
*/
if (!part->openedByJS())
{
// To conform to the SPEC, we only ask if the window
// has more than one entry in the history (NS does that too).
History history(exec,part);
if ( history.get( exec, lengthPropertyName ).toInt32(exec) <= 1
#if APPLE_CHANGES
// FIXME: How are we going to handle this?
#else
|| KMessageBox::questionYesNo( window->part()->view(), i18n("Close window?"), i18n("Confirmation Required") ) == KMessageBox::Yes
#endif
)
(const_cast<Window*>(window))->scheduleClose();
}
else
{
(const_cast<Window*>(window))->scheduleClose();
}
return Undefined();
case Window::CaptureEvents:
case Window::ReleaseEvents:
// If anyone implements these, they need the safescript security check.
if (!window->isSafeScript(exec))
return Undefined();
// Do nothing for now. These are NS-specific legacy calls.
break;
case Window::AddEventListener: {
if (!window->isSafeScript(exec))
return Undefined();
JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);
if (listener) {
DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(part->document().handle());
if (docimpl)
docimpl->addWindowEventListener(DOM::EventImpl::typeToId(args[0].toString(exec).string()),listener,args[2].toBoolean(exec));
}
return Undefined();
}
case Window::RemoveEventListener: {
if (!window->isSafeScript(exec))
return Undefined();
JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);
if (listener) {
DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(part->document().handle());
if (docimpl)
docimpl->removeWindowEventListener(DOM::EventImpl::typeToId(args[0].toString(exec).string()),listener,args[2].toBoolean(exec));
}
return Undefined();
}
}
return Undefined();
}
void Window::updateLayout() const
{
DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(m_part->document().handle());
if (docimpl) {
docimpl->updateLayoutIgnorePendingStylesheets();
}
}
////////////////////// ScheduledAction ////////////////////////
ScheduledAction::ScheduledAction(Object _func, List _args, bool _singleShot)
{
//kdDebug(6070) << "ScheduledAction::ScheduledAction(isFunction) " << this << endl;
func = _func;
args = _args;
isFunction = true;
singleShot = _singleShot;
}
ScheduledAction::ScheduledAction(const QString &_code, bool _singleShot)
{
//kdDebug(6070) << "ScheduledAction::ScheduledAction(!isFunction) " << this << endl;
//func = 0;
//args = 0;
code = _code;
isFunction = false;
singleShot = _singleShot;
}
void ScheduledAction::execute(Window *window)
{
ScriptInterpreter *interpreter = static_cast<ScriptInterpreter *>(KJSProxy::proxy(window->m_part)->interpreter());
interpreter->setProcessingTimerCallback(true);
//kdDebug(6070) << "ScheduledAction::execute " << this << end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -