diff options
Diffstat (limited to 'khtml/ecma/kjs_window.cpp')
-rw-r--r-- | khtml/ecma/kjs_window.cpp | 2935 |
1 files changed, 0 insertions, 2935 deletions
diff --git a/khtml/ecma/kjs_window.cpp b/khtml/ecma/kjs_window.cpp deleted file mode 100644 index 8d96380ab..000000000 --- a/khtml/ecma/kjs_window.cpp +++ /dev/null @@ -1,2935 +0,0 @@ -// -*- c-basic-offset: 2 -*- -/* - * This file is part of the KDE libraries - * Copyright (C) 2000-2003 Harri Porten (porten@kde.org) - * Copyright (C) 2001-2003 David Faure (faure@kde.org) - * Copyright (C) 2003 Apple Computer, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "config.h" - -#include "khtmlview.h" -#include "khtml_part.h" -#include "khtmlpart_p.h" -#include "khtml_settings.h" -#include "xml/dom2_eventsimpl.h" -#include "xml/dom_docimpl.h" -#include "misc/htmltags.h" -#include "html/html_documentimpl.h" -#include "rendering/render_frames.h" - -#include <tqstylesheet.h> -#include <tqtimer.h> -#include <tqpaintdevicemetrics.h> -#include <tqapplication.h> -#include <kdebug.h> -#include <kmessagebox.h> -#include <kinputdialog.h> -#include <klocale.h> -#include <kmdcodec.h> -#include <kparts/browserinterface.h> -#include <twin.h> - -#if defined Q_WS_X11 && ! defined K_WS_QTONLY -#include <twinmodule.h> // schroder -#endif - -#ifndef KONQ_EMBEDDED -#include <kbookmarkmanager.h> -#endif -#include <kglobalsettings.h> -#include <assert.h> -#include <tqstyle.h> -#include <tqobjectlist.h> -#include <kstringhandler.h> - -#include "kjs_proxy.h" -#include "kjs_window.h" -#include "kjs_navigator.h" -#include "kjs_mozilla.h" -#include "kjs_html.h" -#include "kjs_range.h" -#include "kjs_traversal.h" -#include "kjs_css.h" -#include "kjs_events.h" -#include "kjs_views.h" -#include "xmlhttprequest.h" -#include "xmlserializer.h" -#include "domparser.h" - -using namespace KJS; - -namespace KJS { - - class History : public ObjectImp { - friend class HistoryFunc; - public: - History(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - Value getValueProperty(ExecState *exec, int token) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { Back, Forward, Go, Length }; - private: - TQGuardedPtr<KHTMLPart> part; - }; - - class External : public ObjectImp { - friend class ExternalFunc; - public: - External(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual const ClassInfo* classInfo() const { return &info; } - static const ClassInfo info; - enum { AddFavorite }; - private: - TQGuardedPtr<KHTMLPart> part; - }; - - class FrameArray : public ObjectImp { - public: - FrameArray(ExecState *exec, KHTMLPart *p) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()), part(p) { } - virtual Value get(ExecState *exec, const Identifier &propertyName) const; - virtual Value call(ExecState *exec, Object &thisObj, const List &args); - virtual bool implementsCall() const { return true; } - private: - TQGuardedPtr<KHTMLPart> part; - }; - -#ifdef Q_WS_QWS - class KonquerorFunc : public DOMFunction { - public: - KonquerorFunc(ExecState *exec, const Konqueror* k, const char* name) - : DOMFunction(exec), konqueror(k), m_name(name) { } - virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); - - private: - const Konqueror* konqueror; - TQCString m_name; - }; -#endif -} // namespace KJS - -#include "kjs_window.lut.h" -#include "rendering/render_replaced.h" - -////////////////////// Screen Object //////////////////////// -namespace KJS { -// table for screen object -/* -@begin ScreenTable 7 - height Screen::Height DontEnum|ReadOnly - width Screen::Width DontEnum|ReadOnly - colorDepth Screen::ColorDepth DontEnum|ReadOnly - pixelDepth Screen::PixelDepth DontEnum|ReadOnly - availLeft Screen::AvailLeft DontEnum|ReadOnly - availTop Screen::AvailTop DontEnum|ReadOnly - availHeight Screen::AvailHeight DontEnum|ReadOnly - availWidth Screen::AvailWidth DontEnum|ReadOnly -@end -*/ - -const ClassInfo Screen::info = { "Screen", 0, &ScreenTable, 0 }; - -// We set the object prototype so that toString is implemented -Screen::Screen(ExecState *exec) - : ObjectImp(exec->interpreter()->builtinObjectPrototype()) {} - -Value Screen::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Screen::get " << p.qstring() << endl; -#endif - return lookupGetValue<Screen,ObjectImp>(exec,p,&ScreenTable,this); -} - -Value Screen::getValueProperty(ExecState *exec, int token) const -{ -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - KWinModule info(0, KWinModule::INFO_DESKTOP); -#endif - TQWidget *thisWidget = Window::retrieveActive(exec)->part()->widget(); - TQRect sg = KGlobalSettings::desktopGeometry(thisWidget); - - switch( token ) { - case Height: - return Number(sg.height()); - case Width: - return Number(sg.width()); - case ColorDepth: - case PixelDepth: { - TQPaintDeviceMetrics m(TQApplication::desktop()); - return Number(m.depth()); - } - case AvailLeft: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.x()-sg.x()); -#else - return Number(10); -#endif - } - case AvailTop: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.y()-sg.y()); -#else - return Number(10); -#endif - } - case AvailHeight: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.height()); -#else - return Number(100); -#endif - } - case AvailWidth: { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - TQRect clipped = info.workArea().intersect(sg); - return Number(clipped.width()); -#else - return Number(100); -#endif - } - default: - kdDebug(6070) << "WARNING: Screen::getValueProperty unhandled token " << token << endl; - return Undefined(); - } -} - -////////////////////// Window Object //////////////////////// - -const ClassInfo Window::info = { "Window", &DOMAbstractView::info, &WindowTable, 0 }; - -/* -@begin WindowTable 162 - atob Window::AToB DontDelete|Function 1 - btoa Window::BToA DontDelete|Function 1 - closed Window::Closed DontDelete|ReadOnly - crypto Window::Crypto DontDelete|ReadOnly - defaultStatus Window::DefaultStatus DontDelete - defaultstatus Window::DefaultStatus DontDelete - status Window::Status DontDelete - document Window::Document DontDelete|ReadOnly - frameElement Window::FrameElement DontDelete|ReadOnly - frames Window::Frames DontDelete|ReadOnly - history Window::_History DontDelete|ReadOnly - external Window::_External DontDelete|ReadOnly - event Window::Event DontDelete|ReadOnly - innerHeight Window::InnerHeight DontDelete|ReadOnly - innerWidth Window::InnerWidth DontDelete|ReadOnly - length Window::Length DontDelete|ReadOnly - location Window::_Location DontDelete - name Window::Name DontDelete - navigator Window::_Navigator DontDelete|ReadOnly - clientInformation Window::ClientInformation DontDelete|ReadOnly - konqueror Window::_Konqueror DontDelete|ReadOnly - offscreenBuffering Window::OffscreenBuffering DontDelete|ReadOnly - opener Window::Opener DontDelete|ReadOnly - outerHeight Window::OuterHeight DontDelete|ReadOnly - outerWidth Window::OuterWidth DontDelete|ReadOnly - pageXOffset Window::PageXOffset DontDelete|ReadOnly - pageYOffset Window::PageYOffset DontDelete|ReadOnly - parent Window::Parent DontDelete|ReadOnly - personalbar Window::Personalbar DontDelete|ReadOnly - screenX Window::ScreenX DontDelete|ReadOnly - screenY Window::ScreenY DontDelete|ReadOnly - scrollbars Window::Scrollbars DontDelete|ReadOnly - scroll Window::Scroll DontDelete|Function 2 - scrollBy Window::ScrollBy DontDelete|Function 2 - scrollTo Window::ScrollTo DontDelete|Function 2 - scrollX Window::ScrollX DontDelete|ReadOnly - scrollY Window::ScrollY DontDelete|ReadOnly - moveBy Window::MoveBy DontDelete|Function 2 - moveTo Window::MoveTo DontDelete|Function 2 - resizeBy Window::ResizeBy DontDelete|Function 2 - resizeTo Window::ResizeTo DontDelete|Function 2 - self Window::Self DontDelete|ReadOnly - window Window::_Window DontDelete|ReadOnly - top Window::Top DontDelete|ReadOnly - screen Window::_Screen DontDelete|ReadOnly - alert Window::Alert DontDelete|Function 1 - confirm Window::Confirm DontDelete|Function 1 - prompt Window::Prompt DontDelete|Function 2 - open Window::Open DontDelete|Function 3 - setTimeout Window::SetTimeout DontDelete|Function 2 - clearTimeout Window::ClearTimeout DontDelete|Function 1 - focus Window::Focus DontDelete|Function 0 - blur Window::Blur DontDelete|Function 0 - close Window::Close DontDelete|Function 0 - setInterval Window::SetInterval DontDelete|Function 2 - clearInterval Window::ClearInterval DontDelete|Function 1 - captureEvents Window::CaptureEvents DontDelete|Function 0 - releaseEvents Window::ReleaseEvents DontDelete|Function 0 - print Window::Print DontDelete|Function 0 - addEventListener Window::AddEventListener DontDelete|Function 3 - removeEventListener Window::RemoveEventListener DontDelete|Function 3 -# Normally found in prototype. Add to window object itself to make them -# accessible in closed and cross-site windows - valueOf Window::ValueOf DontDelete|Function 0 - toString Window::ToString DontDelete|Function 0 -# IE extension - navigate Window::Navigate DontDelete|Function 1 -# Mozilla extension - sidebar Window::SideBar DontDelete|ReadOnly - getComputedStyle Window::GetComputedStyle DontDelete|Function 2 - -# Warning, when adding a function to this object you need to add a case in Window::get - -# Event handlers -# IE also has: onactivate, onbefore/afterprint, onbeforedeactivate/unload, oncontrolselect, -# ondeactivate, onhelp, onmovestart/end, onresizestart/end, onscroll. -# It doesn't have onabort, onchange, ondragdrop (but NS has that last one). - onabort Window::Onabort DontDelete - onblur Window::Onblur DontDelete - onchange Window::Onchange DontDelete - onclick Window::Onclick DontDelete - ondblclick Window::Ondblclick DontDelete - ondragdrop Window::Ondragdrop DontDelete - onerror Window::Onerror DontDelete - onfocus Window::Onfocus DontDelete - onkeydown Window::Onkeydown DontDelete - onkeypress Window::Onkeypress DontDelete - onkeyup Window::Onkeyup DontDelete - onload Window::Onload DontDelete - onmousedown Window::Onmousedown DontDelete - onmousemove Window::Onmousemove DontDelete - onmouseout Window::Onmouseout DontDelete - onmouseover Window::Onmouseover DontDelete - onmouseup Window::Onmouseup DontDelete - onmove Window::Onmove DontDelete - onreset Window::Onreset DontDelete - onresize Window::Onresize DontDelete - onselect Window::Onselect DontDelete - onsubmit Window::Onsubmit DontDelete - onunload Window::Onunload DontDelete - -# Constructors/constant tables - Node Window::Node DontDelete - Event Window::EventCtor DontDelete - Range Window::Range DontDelete - NodeFilter Window::NodeFilter DontDelete - DOMException Window::DOMException DontDelete - CSSRule Window::CSSRule DontDelete - MutationEvent Window::MutationEventCtor DontDelete - KeyboardEvent Window::KeyboardEventCtor DontDelete - EventException Window::EventExceptionCtor DontDelete - Image Window::Image DontDelete|ReadOnly - Option Window::Option DontDelete|ReadOnly - XMLHttpRequest Window::XMLHttpRequest DontDelete|ReadOnly - XMLSerializer Window::XMLSerializer DontDelete|ReadOnly - DOMParser Window::DOMParser DontDelete|ReadOnly - -# Mozilla dom emulation ones. - Element Window::ElementCtor DontDelete - Document Window::DocumentCtor DontDelete - #this one is an alias since we don't have a separate XMLDocument - XMLDocument Window::DocumentCtor DontDelete - HTMLElement Window::HTMLElementCtor DontDelete - HTMLDocument Window::HTMLDocumentCtor DontDelete - HTMLHtmlElement Window::HTMLHtmlElementCtor DontDelete - HTMLHeadElement Window::HTMLHeadElementCtor DontDelete - HTMLLinkElement Window::HTMLLinkElementCtor DontDelete - HTMLTitleElement Window::HTMLTitleElementCtor DontDelete - HTMLMetaElement Window::HTMLMetaElementCtor DontDelete - HTMLBaseElement Window::HTMLBaseElementCtor DontDelete - HTMLIsIndexElement Window::HTMLIsIndexElementCtor DontDelete - HTMLStyleElement Window::HTMLStyleElementCtor DontDelete - HTMLBodyElement Window::HTMLBodyElementCtor DontDelete - HTMLFormElement Window::HTMLFormElementCtor DontDelete - HTMLSelectElement Window::HTMLSelectElementCtor DontDelete - HTMLOptGroupElement Window::HTMLOptGroupElementCtor DontDelete - HTMLOptionElement Window::HTMLOptionElementCtor DontDelete - HTMLInputElement Window::HTMLInputElementCtor DontDelete - HTMLTextAreaElement Window::HTMLTextAreaElementCtor DontDelete - HTMLButtonElement Window::HTMLButtonElementCtor DontDelete - HTMLLabelElement Window::HTMLLabelElementCtor DontDelete - HTMLFieldSetElement Window::HTMLFieldSetElementCtor DontDelete - HTMLLegendElement Window::HTMLLegendElementCtor DontDelete - HTMLUListElement Window::HTMLUListElementCtor DontDelete - HTMLOListElement Window::HTMLOListElementCtor DontDelete - HTMLDListElement Window::HTMLDListElementCtor DontDelete - HTMLDirectoryElement Window::HTMLDirectoryElementCtor DontDelete - HTMLMenuElement Window::HTMLMenuElementCtor DontDelete - HTMLLIElement Window::HTMLLIElementCtor DontDelete - HTMLDivElement Window::HTMLDivElementCtor DontDelete - HTMLParagraphElement Window::HTMLParagraphElementCtor DontDelete - HTMLHeadingElement Window::HTMLHeadingElementCtor DontDelete - HTMLBlockQuoteElement Window::HTMLBlockQuoteElementCtor DontDelete - HTMLQuoteElement Window::HTMLQuoteElementCtor DontDelete - HTMLPreElement Window::HTMLPreElementCtor DontDelete - HTMLBRElement Window::HTMLBRElementCtor DontDelete - HTMLBaseFontElement Window::HTMLBaseFontElementCtor DontDelete - HTMLFontElement Window::HTMLFontElementCtor DontDelete - HTMLHRElement Window::HTMLHRElementCtor DontDelete - HTMLModElement Window::HTMLModElementCtor DontDelete - HTMLAnchorElement Window::HTMLAnchorElementCtor DontDelete - HTMLImageElement Window::HTMLImageElementCtor DontDelete - HTMLObjectElement Window::HTMLObjectElementCtor DontDelete - HTMLParamElement Window::HTMLParamElementCtor DontDelete - HTMLAppletElement Window::HTMLAppletElementCtor DontDelete - HTMLMapElement Window::HTMLMapElementCtor DontDelete - HTMLAreaElement Window::HTMLAreaElementCtor DontDelete - HTMLScriptElement Window::HTMLScriptElementCtor DontDelete - HTMLTableElement Window::HTMLTableElementCtor DontDelete - HTMLTableCaptionElement Window::HTMLTableCaptionElementCtor DontDelete - HTMLTableColElement Window::HTMLTableColElementCtor DontDelete - HTMLTableSectionElement Window::HTMLTableSectionElementCtor DontDelete - HTMLTableRowElement Window::HTMLTableRowElementCtor DontDelete - HTMLTableCellElement Window::HTMLTableCellElementCtor DontDelete - HTMLFrameSetElement Window::HTMLFrameSetElementCtor DontDelete - HTMLLayerElement Window::HTMLLayerElementCtor DontDelete - HTMLFrameElement Window::HTMLFrameElementCtor DontDelete - HTMLIFrameElement Window::HTMLIFrameElementCtor DontDelete - CSSStyleDeclaration Window::CSSStyleDeclarationCtor DontDelete -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(WindowFunc) - -Window::Window(khtml::ChildFrame *p) - : ObjectImp(/*no proto*/), m_frame(p), screen(0), history(0), external(0), m_frames(0), loc(0), m_evt(0) -{ - winq = new WindowQObject(this); - //kdDebug(6070) << "Window::Window this=" << this << " part=" << m_part << " " << m_part->name() << endl; -} - -Window::~Window() -{ - delete winq; -} - -Window *Window::retrieveWindow(KParts::ReadOnlyPart *p) -{ - Object obj = Object::dynamicCast( retrieve( p ) ); -#ifndef NDEBUG - // obj should never be null, except when javascript has been disabled in that part. - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(p); - if ( part && part->jScriptEnabled() ) - { - assert( obj.isValid() ); -#ifndef QWS - assert( dynamic_cast<KJS::Window*>(obj.imp()) ); // type checking -#endif - } -#endif - if ( !obj.isValid() ) // JS disabled - return 0; - return static_cast<KJS::Window*>(obj.imp()); -} - -Window *Window::retrieveActive(ExecState *exec) -{ - ValueImp *imp = exec->interpreter()->globalObject().imp(); - assert( imp ); -#ifndef QWS - assert( dynamic_cast<KJS::Window*>(imp) ); -#endif - return static_cast<KJS::Window*>(imp); -} - -Value Window::retrieve(KParts::ReadOnlyPart *p) -{ - assert(p); - KHTMLPart * part = ::tqqt_cast<KHTMLPart *>(p); - KJSProxy *proxy = 0L; - if (!part) { - part = ::tqqt_cast<KHTMLPart *>(p->parent()); - if (part) - proxy = part->framejScript(p); - } else - proxy = part->jScript(); - if (proxy) { -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window::retrieve part=" << part << " '" << part->name() << "' interpreter=" << proxy->interpreter() << " window=" << proxy->interpreter()->globalObject().imp() << endl; -#endif - return proxy->interpreter()->globalObject(); // the Global object is the "window" - } else { -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window::retrieve part=" << p << " '" << p->name() << "' no jsproxy." << endl; -#endif - return Undefined(); // This can happen with JS disabled on the domain of that window - } -} - -Location *Window::location() const -{ - if (!loc) - const_cast<Window*>(this)->loc = new Location(m_frame); - return loc; -} - -ObjectImp* Window::frames( ExecState* exec ) const -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (part) - return m_frames ? m_frames : - (const_cast<Window*>(this)->m_frames = new FrameArray(exec, part)); - return 0L; -} - -// reference our special objects during garbage collection -void Window::mark() -{ - ObjectImp::mark(); - if (screen && !screen->marked()) - screen->mark(); - if (history && !history->marked()) - history->mark(); - if (external && !external->marked()) - external->mark(); - if (m_frames && !m_frames->marked()) - m_frames->mark(); - //kdDebug(6070) << "Window::mark " << this << " marking loc=" << loc << endl; - if (loc && !loc->marked()) - loc->mark(); - if (winq) - winq->mark(); -} - -bool Window::hasProperty(ExecState *exec, const Identifier &p) const -{ - // we don't want any operations on a closed window - if (m_frame.isNull() || m_frame->m_part.isNull()) - return ( p == "closed" ); - - if (ObjectImp::hasProperty(exec, p)) - return true; - - if (Lookup::findEntry(&WindowTable, p)) - return true; - - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return false; - - TQString q = p.qstring(); - if (part->findFramePart(p.qstring())) - return true; - // allow window[1] or parent[1] etc. (#56983) - bool ok; - unsigned int i = p.toArrayIndex(&ok); - if (ok) { - TQPtrList<KParts::ReadOnlyPart> frames = part->frames(); - unsigned int len = frames.count(); - if (i < len) - return true; - } - - // allow shortcuts like 'Image1' instead of document.images.Image1 - if (part->document().isHTMLDocument()) { // might be XML - DOM::HTMLDocument doc = part->htmlDocument(); - // Keep in sync with tryGet - - if (static_cast<DOM::DocumentImpl*>(doc.handle())->underDocNamedCache().get(p.qstring())) - return true; - - return !doc.getElementById(p.string()).isNull(); - } - - return false; -} - -UString Window::toString(ExecState *) const -{ - return "[object Window]"; -} - -Value Window::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window("<<this<<")::get " << p.qstring() << endl; -#endif - // we want only limited operations on a closed window - if (m_frame.isNull() || m_frame->m_part.isNull()) { - const HashEntry* entry = Lookup::findEntry(&WindowTable, p); - if (entry) { - switch (entry->value) { - case Closed: - return Boolean(true); - case _Location: - return Null(); - case ValueOf: - case ToString: - return lookupOrCreateFunction<WindowFunc>(exec,p, this, entry->value, - entry->params, entry->attr); - default: - break; - } - } - return Undefined(); - } - - // Look for overrides first - ValueImp *val = getDirect(p); - if (val) { - //kdDebug(6070) << "Window::get found dynamic property '" << p.ascii() << "'" << endl; - return isSafeScript(exec) ? Value(val) : Undefined(); - } - - const HashEntry* entry = Lookup::findEntry(&WindowTable, p); - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - - // properties that work on all windows - if (entry) { - // ReadOnlyPart first - switch(entry->value) { - case Closed: - return Boolean( false ); - case _Location: - // No isSafeScript test here, we must be able to _set_ location.href (#49819) - return Value(location()); - case _Window: - case Self: - return retrieve(m_frame->m_part); - default: - break; - } - if (!part) - return Undefined(); - // KHTMLPart next - switch(entry->value) { - case Frames: - return Value(frames(exec)); - case Opener: - if (!part->opener()) - return Null(); // ### a null Window might be better, but == null - else // doesn't work yet - return retrieve(part->opener()); - case Parent: - return retrieve(part->parentPart() ? part->parentPart() : (KHTMLPart*)part); - case Top: { - KHTMLPart *p = part; - while (p->parentPart()) - p = p->parentPart(); - return retrieve(p); - } - case Alert: - case Confirm: - case Prompt: - case Open: - case Close: - case Focus: - case Blur: - case AToB: - case BToA: - case GetComputedStyle: - case ValueOf: - case ToString: - return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); - default: - break; - } - } else if (!part) { - // not a KHTMLPart - TQString rvalue; - KParts::LiveConnectExtension::Type rtype; - unsigned long robjid; - if (m_frame->m_liveconnect && - isSafeScript(exec) && - m_frame->m_liveconnect->get(0, p.qstring(), rtype, robjid, rvalue)) - return getLiveConnectValue(m_frame->m_liveconnect, p.qstring(), rtype, rvalue, robjid); - return Undefined(); - } - // properties that only work on safe windows - if (isSafeScript(exec) && entry) - { - //kdDebug(6070) << "token: " << entry->value << endl; - switch( entry->value ) { - case Crypto: - return Undefined(); // ### - case DefaultStatus: - return String(UString(part->jsDefaultStatusBarText())); - case Status: - return String(UString(part->jsStatusBarText())); - case Document: - if (part->document().isNull()) { - kdDebug(6070) << "Document.write: adding <HTML><BODY> to create document" << endl; - part->begin(); - part->write("<HTML><BODY>"); - part->end(); - } - return getDOMNode(exec,part->document()); - case FrameElement: - if (m_frame->m_frame) - return getDOMNode(exec,m_frame->m_frame->element()); - else - return Undefined(); - case Node: - return NodeConstructor::self(exec); - case Range: - return getRangeConstructor(exec); - case NodeFilter: - return getNodeFilterConstructor(exec); - case DOMException: - return getDOMExceptionConstructor(exec); - case CSSRule: - return getCSSRuleConstructor(exec); - case ElementCtor: - return ElementPseudoCtor::self(exec); - case HTMLElementCtor: - return HTMLElementPseudoCtor::self(exec); - case HTMLHtmlElementCtor: - return HTMLHtmlElementPseudoCtor::self(exec); - case HTMLHeadElementCtor: - return HTMLHeadElementPseudoCtor::self(exec); - case HTMLLinkElementCtor: - return HTMLLinkElementPseudoCtor::self(exec); - case HTMLTitleElementCtor: - return HTMLTitleElementPseudoCtor::self(exec); - case HTMLMetaElementCtor: - return HTMLMetaElementPseudoCtor::self(exec); - case HTMLBaseElementCtor: - return HTMLBaseElementPseudoCtor::self(exec); - case HTMLIsIndexElementCtor: - return HTMLIsIndexElementPseudoCtor::self(exec); - case HTMLStyleElementCtor: - return HTMLStyleElementPseudoCtor::self(exec); - case HTMLBodyElementCtor: - return HTMLBodyElementPseudoCtor::self(exec); - case HTMLFormElementCtor: - return HTMLFormElementPseudoCtor::self(exec); - case HTMLSelectElementCtor: - return HTMLSelectElementPseudoCtor::self(exec); - case HTMLOptGroupElementCtor: - return HTMLOptGroupElementPseudoCtor::self(exec); - case HTMLOptionElementCtor: - return HTMLOptionElementPseudoCtor::self(exec); - case HTMLInputElementCtor: - return HTMLInputElementPseudoCtor::self(exec); - case HTMLTextAreaElementCtor: - return HTMLTextAreaElementPseudoCtor::self(exec); - case HTMLButtonElementCtor: - return HTMLButtonElementPseudoCtor::self(exec); - case HTMLLabelElementCtor: - return HTMLLabelElementPseudoCtor::self(exec); - case HTMLFieldSetElementCtor: - return HTMLFieldSetElementPseudoCtor::self(exec); - case HTMLLegendElementCtor: - return HTMLLegendElementPseudoCtor::self(exec); - case HTMLUListElementCtor: - return HTMLUListElementPseudoCtor::self(exec); - case HTMLOListElementCtor: - return HTMLOListElementPseudoCtor::self(exec); - case HTMLDListElementCtor: - return HTMLDListElementPseudoCtor::self(exec); - case HTMLDirectoryElementCtor: - return HTMLDirectoryElementPseudoCtor::self(exec); - case HTMLMenuElementCtor: - return HTMLMenuElementPseudoCtor::self(exec); - case HTMLLIElementCtor: - return HTMLLIElementPseudoCtor::self(exec); - case HTMLDivElementCtor: - return HTMLDivElementPseudoCtor::self(exec); - case HTMLParagraphElementCtor: - return HTMLParagraphElementPseudoCtor::self(exec); - case HTMLHeadingElementCtor: - return HTMLHeadingElementPseudoCtor::self(exec); - case HTMLBlockQuoteElementCtor: - return HTMLBlockQuoteElementPseudoCtor::self(exec); - case HTMLQuoteElementCtor: - return HTMLQuoteElementPseudoCtor::self(exec); - case HTMLPreElementCtor: - return HTMLPreElementPseudoCtor::self(exec); - case HTMLBRElementCtor: - return HTMLBRElementPseudoCtor::self(exec); - case HTMLBaseFontElementCtor: - return HTMLBaseFontElementPseudoCtor::self(exec); - case HTMLFontElementCtor: - return HTMLFontElementPseudoCtor::self(exec); - case HTMLHRElementCtor: - return HTMLHRElementPseudoCtor::self(exec); - case HTMLModElementCtor: - return HTMLModElementPseudoCtor::self(exec); - case HTMLAnchorElementCtor: - return HTMLAnchorElementPseudoCtor::self(exec); - case HTMLImageElementCtor: - return HTMLImageElementPseudoCtor::self(exec); - case HTMLObjectElementCtor: - return HTMLObjectElementPseudoCtor::self(exec); - case HTMLParamElementCtor: - return HTMLParamElementPseudoCtor::self(exec); - case HTMLAppletElementCtor: - return HTMLAppletElementPseudoCtor::self(exec); - case HTMLMapElementCtor: - return HTMLMapElementPseudoCtor::self(exec); - case HTMLAreaElementCtor: - return HTMLAreaElementPseudoCtor::self(exec); - case HTMLScriptElementCtor: - return HTMLScriptElementPseudoCtor::self(exec); - case HTMLTableElementCtor: - return HTMLTableElementPseudoCtor::self(exec); - case HTMLTableCaptionElementCtor: - return HTMLTableCaptionElementPseudoCtor::self(exec); - case HTMLTableColElementCtor: - return HTMLTableColElementPseudoCtor::self(exec); - case HTMLTableSectionElementCtor: - return HTMLTableSectionElementPseudoCtor::self(exec); - case HTMLTableRowElementCtor: - return HTMLTableRowElementPseudoCtor::self(exec); - case HTMLTableCellElementCtor: - return HTMLTableCellElementPseudoCtor::self(exec); - case HTMLFrameSetElementCtor: - return HTMLFrameSetElementPseudoCtor::self(exec); - case HTMLLayerElementCtor: - return HTMLLayerElementPseudoCtor::self(exec); - case HTMLFrameElementCtor: - return HTMLFrameElementPseudoCtor::self(exec); - case HTMLIFrameElementCtor: - return HTMLIFrameElementPseudoCtor::self(exec); - case DocumentCtor: - return DocumentPseudoCtor::self(exec); - case HTMLDocumentCtor: - return HTMLDocumentPseudoCtor::self(exec); - case CSSStyleDeclarationCtor: - return CSSStyleDeclarationPseudoCtor::self(exec); - case EventCtor: - return EventConstructor::self(exec); - case MutationEventCtor: - return getMutationEventConstructor(exec); - case KeyboardEventCtor: - return getKeyboardEventConstructor(exec); - case EventExceptionCtor: - return getEventExceptionConstructor(exec); - case _History: - return Value(history ? history : - (const_cast<Window*>(this)->history = new History(exec,part))); - - case _External: - return Value(external ? external : - (const_cast<Window*>(this)->external = new External(exec,part))); - - case Event: - if (m_evt) - return getDOMEvent(exec,*m_evt); - else { -#ifdef KJS_VERBOSE - kdDebug(6070) << "WARNING: window(" << this << "," << part->name() << ").event, no event!" << endl; -#endif - return Undefined(); - } - case InnerHeight: - if (!part->view()) - return Undefined(); - khtml::RenderWidget::flushWidgetResizes(); // make sure frames have their final size - return Number(part->view()->visibleHeight()); - case InnerWidth: - if (!part->view()) - return Undefined(); - khtml::RenderWidget::flushWidgetResizes(); // make sure frames have their final size - return Number(part->view()->visibleWidth()); - case Length: - return Number(part->frames().count()); - case Name: - return String(part->name()); - case SideBar: - return Value(new MozillaSidebarExtension(exec, part)); - case _Navigator: - case ClientInformation: { - // Store the navigator in the object so we get the same one each time. - Value nav( new Navigator(exec, part) ); - const_cast<Window *>(this)->put(exec, "navigator", nav, DontDelete|ReadOnly|Internal); - const_cast<Window *>(this)->put(exec, "clientInformation", nav, DontDelete|ReadOnly|Internal); - return nav; - } -#ifdef Q_WS_QWS - case _Konqueror: { - Value k( new Konqueror(part) ); - const_cast<Window *>(this)->put(exec, "konqueror", k, DontDelete|ReadOnly|Internal); - return k; - } -#endif - case OffscreenBuffering: - return Boolean(true); - case OuterHeight: - case OuterWidth: - { -#if defined Q_WS_X11 && ! defined K_WS_QTONLY - if (!part->widget()) - return Number(0); - KWin::WindowInfo inf = KWin::windowInfo(part->widget()->topLevelWidget()->winId()); - return Number(entry->value == OuterHeight ? - inf.geometry().height() : inf.geometry().width()); -#else - return Number(entry->value == OuterHeight ? - part->view()->height() : part->view()->width()); -#endif - } - case PageXOffset: - return Number(part->view()->contentsX()); - case PageYOffset: - return Number(part->view()->contentsY()); - case Personalbar: - return Undefined(); // ### - case ScreenLeft: - case ScreenX: { - if (!part->view()) - return Undefined(); - TQRect sg = KGlobalSettings::desktopGeometry(part->view()); - return Number(part->view()->mapToGlobal(TQPoint(0,0)).x() + sg.x()); - } - case ScreenTop: - case ScreenY: { - if (!part->view()) - return Undefined(); - TQRect sg = KGlobalSettings::desktopGeometry(part->view()); - return Number(part->view()->mapToGlobal(TQPoint(0,0)).y() + sg.y()); - } - case ScrollX: { - if (!part->view()) - return Undefined(); - return Number(part->view()->contentsX()); - } - case ScrollY: { - if (!part->view()) - return Undefined(); - return Number(part->view()->contentsY()); - } - case Scrollbars: - return Undefined(); // ### - case _Screen: - return Value(screen ? screen : - (const_cast<Window*>(this)->screen = new Screen(exec))); - case Image: - return Value(new ImageConstructorImp(exec, part->document())); - case Option: - return Value(new OptionConstructorImp(exec, part->document())); - case XMLHttpRequest: - return Value(new XMLHttpRequestConstructorImp(exec, part->document())); - case XMLSerializer: - return Value(new XMLSerializerConstructorImp(exec)); - case DOMParser: - return Value(new DOMParserConstructorImp(exec, part->xmlDocImpl())); - case Scroll: // compatibility - case ScrollBy: - case ScrollTo: - case MoveBy: - case MoveTo: - case ResizeBy: - case ResizeTo: - case CaptureEvents: - case ReleaseEvents: - case AddEventListener: - case RemoveEventListener: - case SetTimeout: - case ClearTimeout: - case SetInterval: - case ClearInterval: - case Print: - return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); - // IE extension - case Navigate: - // Disabled in NS-compat mode. Supported by default - can't hurt, unless someone uses - // if (navigate) to test for IE (unlikely). - if ( exec->interpreter()->compatMode() == Interpreter::NetscapeCompat ) - return Undefined(); - return lookupOrCreateFunction<WindowFunc>(exec,p,this,entry->value,entry->params,entry->attr); - case Onabort: - return getListener(exec,DOM::EventImpl::ABORT_EVENT); - case Onblur: - return getListener(exec,DOM::EventImpl::BLUR_EVENT); - case Onchange: - return getListener(exec,DOM::EventImpl::CHANGE_EVENT); - case Onclick: - return getListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT); - case Ondblclick: - return getListener(exec,DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT); - case Ondragdrop: - return getListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT); - case Onerror: - return getListener(exec,DOM::EventImpl::ERROR_EVENT); - case Onfocus: - return getListener(exec,DOM::EventImpl::FOCUS_EVENT); - case Onkeydown: - return getListener(exec,DOM::EventImpl::KEYDOWN_EVENT); - case Onkeypress: - return getListener(exec,DOM::EventImpl::KEYPRESS_EVENT); - case Onkeyup: - return getListener(exec,DOM::EventImpl::KEYUP_EVENT); - case Onload: - return getListener(exec,DOM::EventImpl::LOAD_EVENT); - case Onmousedown: - return getListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT); - case Onmousemove: - return getListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT); - case Onmouseout: - return getListener(exec,DOM::EventImpl::MOUSEOUT_EVENT); - case Onmouseover: - return getListener(exec,DOM::EventImpl::MOUSEOVER_EVENT); - case Onmouseup: - return getListener(exec,DOM::EventImpl::MOUSEUP_EVENT); - case Onmove: - return getListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT); - case Onreset: - return getListener(exec,DOM::EventImpl::RESET_EVENT); - case Onresize: - return getListener(exec,DOM::EventImpl::RESIZE_EVENT); - case Onselect: - return getListener(exec,DOM::EventImpl::SELECT_EVENT); - case Onsubmit: - return getListener(exec,DOM::EventImpl::SUBMIT_EVENT); - case Onunload: - return getListener(exec,DOM::EventImpl::UNLOAD_EVENT); - } - } - - // doing the remainder of ObjectImp::get() that is not covered by - // the getDirect() call above. - // #### guessed position. move further up or down? - Object proto = Object::dynamicCast(prototype()); - assert(proto.isValid()); - if (p == specialPrototypePropertyName) - return isSafeScript(exec) ? Value(proto) : Undefined(); - Value val2 = proto.get(exec, p); - if (!val2.isA(UndefinedType)) { - return isSafeScript(exec) ? val2 : Undefined(); - } - - KParts::ReadOnlyPart *rop = part->findFramePart( p.qstring() ); - if (rop) - return retrieve(rop); - - // allow window[1] or parent[1] etc. (#56983) - bool ok; - unsigned int i = p.toArrayIndex(&ok); - if (ok) { - TQPtrList<KParts::ReadOnlyPart> frames = part->frames(); - unsigned int len = frames.count(); - if (i < len) { - KParts::ReadOnlyPart* frame = frames.at(i); - if (frame) - return Window::retrieve(frame); - } - } - - //Check for images, forms, objects, etc. - if (isSafeScript(exec) && part->document().isHTMLDocument()) { // might be XML - DOM::DocumentImpl* docImpl = part->xmlDocImpl(); - DOM::ElementMappingCache::ItemInfo* info = docImpl->underDocNamedCache().get(p.qstring()); - if (info) { - //May be a false positive, but we can try to avoid doing it the hard way in - //simpler cases. The trickiness here is that the cache is kept under both - //name and id, but we sometimes ignore id for IE compat - DOM::DOMString propertyDOMString = p.string(); - if (info->nd && DOM::HTMLMappedNameCollectionImpl::matchesName(info->nd, - DOM::HTMLCollectionImpl::WINDOW_NAMED_ITEMS, propertyDOMString)) { - return getDOMNode(exec, info->nd); - } else { - //Can't tell it just like that, so better go through collection and count stuff. This is the slow path... - DOM::HTMLMappedNameCollection coll(docImpl, DOM::HTMLCollectionImpl::WINDOW_NAMED_ITEMS, propertyDOMString); - - if (coll.length() == 1) - return getDOMNode(exec, coll.firstItem()); - else if (coll.length() > 1) - return getHTMLCollection(exec, coll); - } - } - DOM::Element element = part->document().getElementById(p.string()); - if ( !element.isNull() ) - return getDOMNode(exec, element ); - } - - // This isn't necessarily a bug. Some code uses if(!window.blah) window.blah=1 - // But it can also mean something isn't loaded or implemented, hence the WARNING to help grepping. -#ifdef KJS_VERBOSE - kdDebug(6070) << "WARNING: Window::get property not found: " << p.qstring() << endl; -#endif - return Undefined(); -} - -void Window::put(ExecState* exec, const Identifier &propertyName, const Value &value, int attr) -{ - // we don't want any operations on a closed window - if (m_frame.isNull() || m_frame->m_part.isNull()) { - // ### throw exception? allow setting of some props like location? - return; - } - - // Called by an internal KJS call (e.g. InterpreterImp's constructor) ? - // If yes, save time and jump directly to ObjectImp. - if ( (attr != None && attr != DontDelete) || - // Same thing if we have a local override (e.g. "var location") - ( isSafeScript( exec ) && ObjectImp::getDirect(propertyName) ) ) - { - ObjectImp::put( exec, propertyName, value, attr ); - return; - } - - const HashEntry* entry = Lookup::findEntry(&WindowTable, propertyName); - if (entry && !m_frame.isNull() && !m_frame->m_part.isNull()) - { -#ifdef KJS_VERBOSE - kdDebug(6070) << "Window("<<this<<")::put " << propertyName.qstring() << endl; -#endif - switch( entry->value) { - case _Location: - goURL(exec, value.toString(exec).qstring(), false /*don't lock history*/); - return; - default: - break; - } - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (part) { - switch( entry->value ) { - case Status: { - if (isSafeScript(exec) && part->settings()->windowStatusPolicy(part->url().host()) - == KHTMLSettings::KJSWindowStatusAllow) { - String s = value.toString(exec); - part->setJSStatusBarText(s.value().qstring()); - } - return; - } - case DefaultStatus: { - if (isSafeScript(exec) && part->settings()->windowStatusPolicy(part->url().host()) - == KHTMLSettings::KJSWindowStatusAllow) { - String s = value.toString(exec); - part->setJSDefaultStatusBarText(s.value().qstring()); - } - return; - } - case Onabort: - if (isSafeScript(exec)) - setListener(exec, DOM::EventImpl::ABORT_EVENT,value); - return; - case Onblur: - if (isSafeScript(exec)) - setListener(exec, DOM::EventImpl::BLUR_EVENT,value); - return; - case Onchange: - if (isSafeScript(exec)) - setListener(exec, DOM::EventImpl::CHANGE_EVENT,value); - return; - case Onclick: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_ECMA_CLICK_EVENT,value); - return; - case Ondblclick: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT,value); - return; - case Ondragdrop: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_DRAGDROP_EVENT,value); - return; - case Onerror: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::ERROR_EVENT,value); - return; - case Onfocus: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::FOCUS_EVENT,value); - return; - case Onkeydown: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KEYDOWN_EVENT,value); - return; - case Onkeypress: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KEYPRESS_EVENT,value); - return; - case Onkeyup: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KEYUP_EVENT,value); - return; - case Onload: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::LOAD_EVENT,value); - return; - case Onmousedown: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEDOWN_EVENT,value); - return; - case Onmousemove: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEMOVE_EVENT,value); - return; - case Onmouseout: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEOUT_EVENT,value); - return; - case Onmouseover: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEOVER_EVENT,value); - return; - case Onmouseup: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::MOUSEUP_EVENT,value); - return; - case Onmove: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::KHTML_MOVE_EVENT,value); - return; - case Onreset: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::RESET_EVENT,value); - return; - case Onresize: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::RESIZE_EVENT,value); - return; - case Onselect: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::SELECT_EVENT,value); - return; - case Onsubmit: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::SUBMIT_EVENT,value); - return; - case Onunload: - if (isSafeScript(exec)) - setListener(exec,DOM::EventImpl::UNLOAD_EVENT,value); - return; - case Name: - if (isSafeScript(exec)) - part->setName( value.toString(exec).qstring().local8Bit().data() ); - return; - default: - break; - } - } - } - if (m_frame->m_liveconnect && - isSafeScript(exec) && - m_frame->m_liveconnect->put(0, propertyName.qstring(), value.toString(exec).qstring())) - return; - if (isSafeScript(exec)) { - //kdDebug(6070) << "Window("<<this<<")::put storing " << propertyName.qstring() << endl; - ObjectImp::put(exec, propertyName, value, attr); - } -} - -bool Window::toBoolean(ExecState *) const -{ - return !m_frame.isNull() && !m_frame->m_part.isNull(); -} - -DOM::AbstractView Window::toAbstractView() const -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return DOM::AbstractView(); - return part->document().defaultView(); -} - -void Window::scheduleClose() -{ - kdDebug(6070) << "Window::scheduleClose window.close() " << m_frame << endl; - Q_ASSERT(winq); - TQTimer::singleShot( 0, winq, TQT_SLOT( timeoutClose() ) ); -} - -void Window::closeNow() -{ - if (m_frame.isNull() || m_frame->m_part.isNull()) { - kdDebug(6070) << k_funcinfo << "part is deleted already" << endl; - } else { - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) { - kdDebug(6070) << "closeNow on non KHTML part" << endl; - } else { - //kdDebug(6070) << k_funcinfo << " -> closing window" << endl; - // We want to make sure that window.open won't find this part by name. - part->setName( 0 ); - part->deleteLater(); - part = 0; - } - } -} - -void Window::afterScriptExecution() -{ - DOM::DocumentImpl::updateDocumentsRendering(); - TQValueList<DelayedAction> delayedActions = m_delayed; - m_delayed.clear(); - TQValueList<DelayedAction>::Iterator it = delayedActions.begin(); - for ( ; it != delayedActions.end() ; ++it ) - { - switch ((*it).actionId) { - case DelayedClose: - scheduleClose(); - return; // stop here, in case of multiple actions - case DelayedGoHistory: - goHistory( (*it).param.toInt() ); - break; - case NullAction: - // FIXME: anything needs to be done here? This is warning anyways. - break; - }; - } -} - -bool Window::checkIsSafeScript(KParts::ReadOnlyPart *activePart) const -{ - if (m_frame.isNull() || m_frame->m_part.isNull()) { // part deleted ? can't grant access - kdDebug(6070) << "Window::isSafeScript: accessing deleted part !" << endl; - return false; - } - if (!activePart) { - kdDebug(6070) << "Window::isSafeScript: current interpreter's part is 0L!" << endl; - return false; - } - if ( activePart == m_frame->m_part ) // Not calling from another frame, no problem. - return true; - - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return true; // not a KHTMLPart - - if ( part->document().isNull() ) - return true; // allow to access a window that was just created (e.g. with window.open("about:blank")) - - DOM::HTMLDocument thisDocument = part->htmlDocument(); - if ( thisDocument.isNull() ) { - kdDebug(6070) << "Window::isSafeScript: trying to access an XML document !?" << endl; - return false; - } - - KHTMLPart *activeKHTMLPart = ::tqqt_cast<KHTMLPart *>(activePart); - if (!activeKHTMLPart) - return true; // not a KHTMLPart - - DOM::HTMLDocument actDocument = activeKHTMLPart->htmlDocument(); - if ( actDocument.isNull() ) { - kdDebug(6070) << "Window::isSafeScript: active part has no document!" << endl; - return false; - } - DOM::DOMString actDomain = actDocument.domain(); - DOM::DOMString thisDomain = thisDocument.domain(); - - if ( actDomain == thisDomain ) { -#ifdef KJS_VERBOSE - //kdDebug(6070) << "JavaScript: access granted, domain is '" << actDomain.string() << "'" << endl; -#endif - return true; - } - - kdDebug(6070) << "WARNING: JavaScript: access denied for current frame '" << actDomain.string() << "' to frame '" << thisDomain.string() << "'" << endl; - // TODO after 3.1: throw security exception (exec->setException()) - return false; -} - -void Window::setListener(ExecState *exec, int eventId, Value func) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part || !isSafeScript(exec)) - return; - DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl*>(part->htmlDocument().handle()); - if (!doc) - return; - - doc->setHTMLWindowEventListener(eventId,getJSEventListener(func,true)); -} - -Value Window::getListener(ExecState *exec, int eventId) const -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part || !isSafeScript(exec)) - return Undefined(); - DOM::DocumentImpl *doc = static_cast<DOM::DocumentImpl*>(part->htmlDocument().handle()); - if (!doc) - return Undefined(); - - DOM::EventListener *listener = doc->getHTMLWindowEventListener(eventId); - if (listener && static_cast<JSEventListener*>(listener)->listenerObjImp()) - return static_cast<JSEventListener*>(listener)->listenerObj(); - else - return Null(); -} - - -JSEventListener *Window::getJSEventListener(const Value& val, bool html) -{ - // This function is so hot that it's worth coding it directly with imps. - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part || val.type() != ObjectType) - return 0; - - // It's ObjectType, so it must be valid. - Object listenerObject = Object::dynamicCast(val); - ObjectImp *listenerObjectImp = listenerObject.imp(); - - // 'listener' is not a simple ecma function. (Always use sanity checks: Better safe than sorry!) - if (!listenerObject.implementsCall() && part && part->jScript() && part->jScript()->interpreter()) - { - Interpreter *interpreter = part->jScript()->interpreter(); - - // 'listener' probably is an EventListener object containing a 'handleEvent' function. - Value handleEventValue = listenerObject.get(interpreter->globalExec(), Identifier("handleEvent")); - Object handleEventObject = Object::dynamicCast(handleEventValue); - - if(handleEventObject.isValid() && handleEventObject.implementsCall()) - { - listenerObject = handleEventObject; - listenerObjectImp = handleEventObject.imp(); - } - } - - JSEventListener *existingListener = jsEventListeners[listenerObjectImp]; - if (existingListener) { - if ( existingListener->isHTMLEventListener() != html ) - // The existingListener will have the wrong type, so onclick= will behave like addEventListener or vice versa. - kdWarning() << "getJSEventListener: event listener already found but with html=" << !html << " - please report this, we thought it would never happen" << endl; - return existingListener; - } - - // Note that the JSEventListener constructor adds it to our jsEventListeners list - return new JSEventListener(listenerObject, listenerObjectImp, Object(this), html); -} - -JSLazyEventListener *Window::getJSLazyEventListener(const TQString& code, const TQString& name, DOM::NodeImpl *node) -{ - return new JSLazyEventListener(code, name, Object(this), node); -} - -void Window::clear( ExecState *exec ) -{ - delete winq; - winq = 0L; - // Get rid of everything, those user vars could hold references to DOM nodes - deleteAllProperties( exec ); - - // Break the dependency between the listeners and their object - TQPtrDictIterator<JSEventListener> it(jsEventListeners); - for (; it.current(); ++it) - it.current()->clear(); - // Forget about the listeners (the DOM::NodeImpls will delete them) - jsEventListeners.clear(); - - if (m_frame) { - KJSProxy* proxy = m_frame->m_jscript; - if (proxy) // i.e. JS not disabled - { - winq = new WindowQObject(this); - // Now recreate a working global object for the next URL that will use us - KJS::Interpreter *interpreter = proxy->interpreter(); - interpreter->initGlobalObject(); - } - } -} - -void Window::setCurrentEvent( DOM::Event *evt ) -{ - m_evt = evt; - //kdDebug(6070) << "Window " << this << " (part=" << m_part << ")::setCurrentEvent m_evt=" << evt << endl; -} - -void Window::goURL(ExecState* exec, const TQString& url, bool lockHistory) -{ - Window* active = Window::retrieveActive(exec); - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - KHTMLPart *active_part = ::tqqt_cast<KHTMLPart *>(active->part()); - // Complete the URL using the "active part" (running interpreter) - if (active_part && part) { - if (url[0] == TQChar('#')) { - part->gotoAnchor(url.mid(1)); - } else { - TQString dstUrl = active_part->htmlDocument().completeURL(url).string(); - kdDebug(6070) << "Window::goURL dstUrl=" << dstUrl << endl; - - // check if we're allowed to inject javascript - // SYNC check with khtml_part.cpp::slotRedirect! - if ( isSafeScript(exec) || - dstUrl.find(TQString::fromLatin1("javascript:"), 0, false) != 0 ) - part->scheduleRedirection(-1, - dstUrl, - lockHistory); - } - } else if (!part && !m_frame->m_part.isNull()) { - KParts::BrowserExtension *b = KParts::BrowserExtension::childObject(m_frame->m_part); - if (b) - b->emit openURLRequest(m_frame->m_frame->element()->getDocument()->completeURL(url)); - kdDebug() << "goURL for ROPart" << endl; - } -} - -KParts::ReadOnlyPart *Window::part() const { - return m_frame.isNull() ? 0L : static_cast<KParts::ReadOnlyPart *>(m_frame->m_part); -} - -void Window::delayedGoHistory( int steps ) -{ - m_delayed.append( DelayedAction( DelayedGoHistory, steps ) ); -} - -void Window::goHistory( int steps ) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if(!part) - // TODO history readonlypart - return; - KParts::BrowserExtension *ext = part->browserExtension(); - if(!ext) - return; - KParts::BrowserInterface *iface = ext->browserInterface(); - - if ( !iface ) - return; - - iface->callMethod( "goHistory(int)", steps ); - //emit ext->goHistory(steps); -} - -void KJS::Window::resizeTo(TQWidget* tl, int width, int height) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if(!part) - // TODO resizeTo readonlypart - return; - KParts::BrowserExtension *ext = part->browserExtension(); - if (!ext) { - kdDebug(6070) << "Window::resizeTo found no browserExtension" << endl; - return; - } - - // Security check: within desktop limits and bigger than 100x100 (per spec) - if ( width < 100 || height < 100 ) { - kdDebug(6070) << "Window::resizeTo refused, window would be too small ("<<width<<","<<height<<")" << endl; - return; - } - - TQRect sg = KGlobalSettings::desktopGeometry(tl); - - if ( width > sg.width() || height > sg.height() ) { - kdDebug(6070) << "Window::resizeTo refused, window would be too big ("<<width<<","<<height<<")" << endl; - return; - } - - kdDebug(6070) << "resizing to " << width << "x" << height << endl; - - emit ext->resizeTopLevelWidget( width, height ); - - // If the window is out of the desktop, move it up/left - // (maybe we should use workarea instead of sg, otherwise the window ends up below kicker) - int right = tl->x() + tl->frameGeometry().width(); - int bottom = tl->y() + tl->frameGeometry().height(); - int moveByX = 0; - int moveByY = 0; - if ( right > sg.right() ) - moveByX = - right + sg.right(); // always <0 - if ( bottom > sg.bottom() ) - moveByY = - bottom + sg.bottom(); // always <0 - if ( moveByX || moveByY ) - emit ext->moveTopLevelWidget( tl->x() + moveByX , tl->y() + moveByY ); -} - -Value Window::openWindow(ExecState *exec, const List& args) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - if (!part) - return Undefined(); - KHTMLView *widget = part->view(); - Value v = args[0]; - TQString str; - if (v.isValid() && !v.isA(UndefinedType)) - str = v.toString(exec).qstring(); - - // prepare arguments - KURL url; - if (!str.isEmpty()) - { - KHTMLPart* p = ::tqqt_cast<KHTMLPart *>(Window::retrieveActive(exec)->m_frame->m_part); - if ( p ) - url = p->htmlDocument().completeURL(str).string(); - if ( !p || - !static_cast<DOM::DocumentImpl*>(p->htmlDocument().handle())->isURLAllowed(url.url()) ) - return Undefined(); - } - - KHTMLSettings::KJSWindowOpenPolicy policy = - part->settings()->windowOpenPolicy(part->url().host()); - if ( policy == KHTMLSettings::KJSWindowOpenAsk ) { - emit part->browserExtension()->requestFocus(part); - TQString caption; - if (!part->url().host().isEmpty()) - caption = part->url().host() + " - "; - caption += i18n( "Confirmation: JavaScript Popup" ); - if ( KMessageBox::questionYesNo(widget, - str.isEmpty() ? - i18n( "This site is requesting to open up a new browser " - "window via JavaScript.\n" - "Do you want to allow this?" ) : - i18n( "<qt>This site is requesting to open<p>%1</p>in a new browser window via JavaScript.<br />" - "Do you want to allow this?</qt>").arg(KStringHandler::csqueeze(url.htmlURL(), 100)), - caption, i18n("Allow"), i18n("Do Not Allow") ) == KMessageBox::Yes ) - policy = KHTMLSettings::KJSWindowOpenAllow; - } else if ( policy == KHTMLSettings::KJSWindowOpenSmart ) - { - // window.open disabled unless from a key/mouse event - if (static_cast<ScriptInterpreter *>(exec->interpreter())->isWindowOpenAllowed()) - policy = KHTMLSettings::KJSWindowOpenAllow; - } - - TQString frameName = args.size() > 1 ? args[1].toString(exec).qstring() : TQString("_blank"); - - v = args[2]; - TQString features; - if (!v.isNull() && v.type() != UndefinedType && v.toString(exec).size() > 0) { - features = v.toString(exec).qstring(); - // Buggy scripts have ' at beginning and end, cut those - if (features.startsWith("\'") && features.endsWith("\'")) - features = features.mid(1, features.length()-2); - } - - if ( policy != KHTMLSettings::KJSWindowOpenAllow ) { - if ( url.isEmpty() ) - part->setSuppressedPopupIndicator(true, 0); - else { - part->setSuppressedPopupIndicator(true, part); - m_suppressedWindowInfo.append( SuppressedWindowInfo( url, frameName, features ) ); - } - return Undefined(); - } else { - return executeOpenWindow(exec, url, frameName, features); - } -} - -Value Window::executeOpenWindow(ExecState *exec, const KURL& url, const TQString& frameName, const TQString& features) -{ - KHTMLPart *p = ::tqqt_cast<KHTMLPart *>(m_frame->m_part); - KHTMLView *widget = p->view(); - KParts::WindowArgs winargs; - - // scan feature argument - if (!features.isEmpty()) { - // specifying window params means false defaults - winargs.menuBarVisible = false; - winargs.toolBarsVisible = false; - winargs.statusBarVisible = false; - winargs.scrollBarsVisible = false; - TQStringList flist = TQStringList::split(',', features); - TQStringList::ConstIterator it = flist.begin(); - while (it != flist.end()) { - TQString s = *it++; - TQString key, val; - int pos = s.find('='); - if (pos >= 0) { - key = s.left(pos).stripWhiteSpace().lower(); - val = s.mid(pos + 1).stripWhiteSpace().lower(); - TQRect screen = KGlobalSettings::desktopGeometry(widget->topLevelWidget()); - - if (key == "left" || key == "screenx") { - winargs.x = (int)val.toFloat() + screen.x(); - if (winargs.x < screen.x() || winargs.x > screen.right()) - winargs.x = screen.x(); // only safe choice until size is determined - } else if (key == "top" || key == "screeny") { - winargs.y = (int)val.toFloat() + screen.y(); - if (winargs.y < screen.y() || winargs.y > screen.bottom()) - winargs.y = screen.y(); // only safe choice until size is determined - } else if (key == "height") { - winargs.height = (int)val.toFloat() + 2*tqApp->style().pixelMetric( TQStyle::PM_DefaultFrameWidth ) + 2; - if (winargs.height > screen.height()) // should actually check workspace - winargs.height = screen.height(); - if (winargs.height < 100) - winargs.height = 100; - } else if (key == "width") { - winargs.width = (int)val.toFloat() + 2*tqApp->style().pixelMetric( TQStyle::PM_DefaultFrameWidth ) + 2; - if (winargs.width > screen.width()) // should actually check workspace - winargs.width = screen.width(); - if (winargs.width < 100) - winargs.width = 100; - } 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 == "scrollbars") - winargs.scrollBarsVisible = (val == "1" || val == "yes"); - else if (key == "resizable") - winargs.resizable = (val == "1" || val == "yes"); - else if (key == "fullscreen") - winargs.fullscreen = (val == "1" || val == "yes"); - } - } - - KParts::URLArgs uargs; - uargs.frameName = frameName; - - if ( uargs.frameName.lower() == "_top" ) - { - while ( p->parentPart() ) - p = p->parentPart(); - Window::retrieveWindow(p)->goURL(exec, url.url(), false /*don't lock history*/); - return Window::retrieve(p); - } - if ( uargs.frameName.lower() == "_parent" ) - { - if ( p->parentPart() ) - p = p->parentPart(); - Window::retrieveWindow(p)->goURL(exec, url.url(), false /*don't lock history*/); - return Window::retrieve(p); - } - if ( uargs.frameName.lower() == "_self") - { - Window::retrieveWindow(p)->goURL(exec, url.url(), false /*don't lock history*/); - return Window::retrieve(p); - } - if ( uargs.frameName.lower() == "replace" ) - { - Window::retrieveWindow(p)->goURL(exec, url.url(), true /*lock history*/); - return Window::retrieve(p); - } - uargs.serviceType = "text/html"; - - // request window (new or existing if framename is set) - KParts::ReadOnlyPart *newPart = 0L; - emit p->browserExtension()->createNewWindow(KURL(), uargs,winargs,newPart); - if (newPart && ::tqqt_cast<KHTMLPart*>(newPart)) { - KHTMLPart *khtmlpart = static_cast<KHTMLPart*>(newPart); - //tqDebug("opener set to %p (this Window's part) in new Window %p (this Window=%p)",part,win,window); - khtmlpart->setOpener(p); - khtmlpart->setOpenedByJS(true); - if (khtmlpart->document().isNull()) { - khtmlpart->begin(); - khtmlpart->write("<HTML><BODY>"); - khtmlpart->end(); - if ( p->docImpl() ) { - //kdDebug(6070) << "Setting domain to " << p->docImpl()->domain().string() << endl; - khtmlpart->docImpl()->setDomain( p->docImpl()->domain()); - khtmlpart->docImpl()->setBaseURL( p->docImpl()->baseURL() ); - } - } - uargs.serviceType = TQString::null; - if (uargs.frameName.lower() == "_blank") - uargs.frameName = TQString::null; - if (!url.isEmpty()) - emit khtmlpart->browserExtension()->openURLRequest(url,uargs); - return Window::retrieve(khtmlpart); // global object - } else - return Undefined(); -} - -void Window::forgetSuppressedWindows() -{ - m_suppressedWindowInfo.clear(); -} - -void Window::showSuppressedWindows() -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>( m_frame->m_part ); - KJS::Interpreter *interpreter = part->jScript()->interpreter(); - ExecState *exec = interpreter->globalExec(); - - TQValueList<SuppressedWindowInfo> suppressedWindowInfo = m_suppressedWindowInfo; - m_suppressedWindowInfo.clear(); - TQValueList<SuppressedWindowInfo>::Iterator it = suppressedWindowInfo.begin(); - for ( ; it != suppressedWindowInfo.end() ; ++it ) { - executeOpenWindow(exec, (*it).url, (*it).frameName, (*it).features); - } -} - -Value WindowFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( Window, thisObj ); - - // these should work no matter whether the window is already - // closed or not - if (id == Window::ValueOf || id == Window::ToString) { - return String("[object Window]"); - } - - Window *window = static_cast<Window *>(thisObj.imp()); - TQString str, str2; - - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(window->m_frame->m_part); - if (!part) - return Undefined(); - - KHTMLView *widget = part->view(); - Value v = args[0]; - UString s; - if (v.isValid() && !v.isA(UndefinedType)) { - s = v.toString(exec); - str = s.qstring(); - } - - TQString caption; - if (part && !part->url().host().isEmpty()) - caption = part->url().host() + " - "; - caption += "JavaScript"; // TODO: i18n - // functions that work everywhere - switch(id) { - case Window::Alert: - if (!widget->dialogsAllowed()) - return Undefined(); - if ( part && part->xmlDocImpl() ) - part->xmlDocImpl()->updateRendering(); - if ( part ) - emit part->browserExtension()->requestFocus(part); - KMessageBox::error(widget, TQStyleSheet::convertFromPlainText(str, TQStyleSheetItem::WhiteSpaceNormal), caption); - return Undefined(); - case Window::Confirm: - if (!widget->dialogsAllowed()) - return Undefined(); - if ( part && part->xmlDocImpl() ) - part->xmlDocImpl()->updateRendering(); - if ( part ) - emit part->browserExtension()->requestFocus(part); - return Boolean((KMessageBox::warningYesNo(widget, TQStyleSheet::convertFromPlainText(str), caption, - KStdGuiItem::ok(), KStdGuiItem::cancel()) == KMessageBox::Yes)); - case Window::Prompt: -#ifndef KONQ_EMBEDDED - if (!widget->dialogsAllowed()) - return Undefined(); - if ( part && part->xmlDocImpl() ) - part->xmlDocImpl()->updateRendering(); - if ( part ) - emit part->browserExtension()->requestFocus(part); - bool ok; - if (args.size() >= 2) - str2 = KInputDialog::getText(caption, - TQStyleSheet::convertFromPlainText(str), - args[1].toString(exec).qstring(), &ok, widget); - else - str2 = KInputDialog::getText(caption, - TQStyleSheet::convertFromPlainText(str), - TQString::null, &ok, widget); - if ( ok ) - return String(str2); - else - return Null(); -#else - return Undefined(); -#endif - case Window::GetComputedStyle: { - if ( !part || !part->xmlDocImpl() ) - return Undefined(); - DOM::Node arg0 = toNode(args[0]); - if (arg0.nodeType() != DOM::Node::ELEMENT_NODE) - return Undefined(); // throw exception? - else - return getDOMCSSStyleDeclaration(exec, part->document().defaultView().getComputedStyle(static_cast<DOM::Element>(arg0), - args[1].toString(exec).string())); - } - case Window::Open: - return window->openWindow(exec, args); - 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. - */ - bool doClose = false; - 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, "length" ).toInt32(exec) <= 1 ) - { - doClose = true; - } - else - { - // Can we get this dialog with tabs??? Does it close the window or the tab in that case? - emit part->browserExtension()->requestFocus(part); - if ( KMessageBox::questionYesNo( window->part()->widget(), - i18n("Close window?"), i18n("Confirmation Required"), - KStdGuiItem::close(), KStdGuiItem::cancel() ) - == KMessageBox::Yes ) - doClose = true; - } - } - else - doClose = true; - - if (doClose) - { - // If this is the current window (the one the interpreter runs in), - // then schedule a delayed close (so that the script terminates first). - // But otherwise, close immediately. This fixes w=window.open("","name");w.close();window.open("name"); - if ( Window::retrieveActive(exec) == window ) { - if (widget) { - // quit all dialogs of this view - // this fixes 'setTimeout('self.close()',1000); alert("Hi");' crash - widget->closeChildDialogs(); - } - //kdDebug() << "scheduling delayed close" << endl; - // We'll close the window at the end of the script execution - Window* w = const_cast<Window*>(window); - w->m_delayed.append( Window::DelayedAction( Window::DelayedClose ) ); - } else { - //kdDebug() << "closing NOW" << endl; - (const_cast<Window*>(window))->closeNow(); - } - } - return Undefined(); - } - case Window::Navigate: - window->goURL(exec, args[0].toString(exec).qstring(), false /*don't lock history*/); - return Undefined(); - case Window::Focus: { - KHTMLSettings::KJSWindowFocusPolicy policy = - part->settings()->windowFocusPolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowFocusAllow && widget) { - widget->topLevelWidget()->raise(); - KWin::deIconifyWindow( widget->topLevelWidget()->winId() ); - widget->setActiveWindow(); - emit part->browserExtension()->requestFocus(part); - } - return Undefined(); - } - case Window::Blur: - // TODO - return Undefined(); - case Window::BToA: - case Window::AToB: { - if (!s.is8Bit()) - return Undefined(); - TQByteArray in, out; - char *binData = s.ascii(); - in.setRawData( binData, s.size() ); - if (id == Window::AToB) - KCodecs::base64Decode( in, out ); - else - KCodecs::base64Encode( in, out ); - in.resetRawData( binData, s.size() ); - UChar *d = new UChar[out.size()]; - for (uint i = 0; i < out.size(); i++) - d[i].uc = (uchar) out[i]; - UString ret(d, out.size(), false /*no copy*/); - return String(ret); - } - - }; - - - // now unsafe functions.. - if (!window->isSafeScript(exec)) - return Undefined(); - - switch (id) { - case Window::ScrollBy: - if(args.size() == 2 && widget) - widget->scrollBy(args[0].toInt32(exec), args[1].toInt32(exec)); - return Undefined(); - case Window::Scroll: - case Window::ScrollTo: - if(args.size() == 2 && widget) - widget->setContentsPos(args[0].toInt32(exec), args[1].toInt32(exec)); - return Undefined(); - case Window::MoveBy: { - KHTMLSettings::KJSWindowMovePolicy policy = - part->settings()->windowMovePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowMoveAllow && args.size() == 2 && widget) - { - KParts::BrowserExtension *ext = part->browserExtension(); - if (ext) { - TQWidget * tl = widget->topLevelWidget(); - TQRect sg = KGlobalSettings::desktopGeometry(tl); - - TQPoint dest = tl->pos() + TQPoint( 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() ) - emit ext->moveTopLevelWidget( dest.x(), dest.y() ); - } - } - return Undefined(); - } - case Window::MoveTo: { - KHTMLSettings::KJSWindowMovePolicy policy = - part->settings()->windowMovePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowMoveAllow && args.size() == 2 && widget) - { - KParts::BrowserExtension *ext = part->browserExtension(); - if (ext) { - TQWidget * tl = widget->topLevelWidget(); - TQRect sg = KGlobalSettings::desktopGeometry(tl); - - TQPoint 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() ) - emit ext->moveTopLevelWidget( dest.x(), dest.y() ); - } - } - return Undefined(); - } - case Window::ResizeBy: { - KHTMLSettings::KJSWindowResizePolicy policy = - part->settings()->windowResizePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowResizeAllow - && args.size() == 2 && widget) - { - TQWidget * tl = widget->topLevelWidget(); - TQRect geom = tl->frameGeometry(); - window->resizeTo( tl, - geom.width() + args[0].toInt32(exec), - geom.height() + args[1].toInt32(exec) ); - } - return Undefined(); - } - case Window::ResizeTo: { - KHTMLSettings::KJSWindowResizePolicy policy = - part->settings()->windowResizePolicy(part->url().host()); - if(policy == KHTMLSettings::KJSWindowResizeAllow - && args.size() == 2 && widget) - { - TQWidget * tl = widget->topLevelWidget(); - window->resizeTo( tl, args[0].toInt32(exec), args[1].toInt32(exec) ); - } - return Undefined(); - } - case Window::SetTimeout: - case Window::SetInterval: { - bool singleShot; - int i; // timeout interval - if (args.size() == 0) - return Undefined(); - if (args.size() > 1) { - singleShot = (id == Window::SetTimeout); - i = args[1].toInt32(exec); - } else { - // second parameter is missing. Emulate Mozilla behavior. - singleShot = true; - i = 4; - } - if (v.isA(StringType)) { - int r = (const_cast<Window*>(window))->winq->installTimeout(Identifier(s), i, singleShot ); - return Number(r); - } - else if (v.isA(ObjectType) && Object::dynamicCast(v).implementsCall()) { - Object func = Object::dynamicCast(v); - List funcArgs; - ListIterator it = args.begin(); - int argno = 0; - while (it != args.end()) { - Value arg = it++; - if (argno++ >= 2) - funcArgs.append(arg); - } - if (args.size() < 2) - funcArgs.append(Number(i)); - int r = (const_cast<Window*>(window))->winq->installTimeout(func, funcArgs, i, singleShot ); - return Number(r); - } - else - return Undefined(); - } - case Window::ClearTimeout: - case Window::ClearInterval: - (const_cast<Window*>(window))->winq->clearTimeout(v.toInt32(exec)); - return Undefined(); - case Window::Print: - if ( widget ) { - // ### TODO emit onbeforeprint event - widget->print(); - // ### TODO emit onafterprint event - } - case Window::CaptureEvents: - case Window::ReleaseEvents: - // Do nothing for now. These are NS-specific legacy calls. - break; - case Window::AddEventListener: { - JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]); - if (listener) { - DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(part->document().handle()); - docimpl->addWindowEventListener(DOM::EventImpl::typeToId(args[0].toString(exec).string()),listener,args[2].toBoolean(exec)); - } - return Undefined(); - } - case Window::RemoveEventListener: { - JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]); - if (listener) { - DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(part->document().handle()); - docimpl->removeWindowEventListener(DOM::EventImpl::typeToId(args[0].toString(exec).string()),listener,args[2].toBoolean(exec)); - } - return Undefined(); - } - - } - return Undefined(); -} - -////////////////////// ScheduledAction //////////////////////// - -// KDE 4: Make those parameters const ... & -ScheduledAction::ScheduledAction(Object _func, List _args, DateTimeMS _nextTime, int _interval, bool _singleShot, - int _timerId) -{ - //kdDebug(6070) << "ScheduledAction::ScheduledAction(isFunction) " << this << endl; - func = static_cast<ObjectImp*>(_func.imp()); - args = _args; - isFunction = true; - singleShot = _singleShot; - nextTime = _nextTime; - interval = _interval; - executing = false; - timerId = _timerId; -} - -// KDE 4: Make it const TQString & -ScheduledAction::ScheduledAction(TQString _code, DateTimeMS _nextTime, int _interval, bool _singleShot, int _timerId) -{ - //kdDebug(6070) << "ScheduledAction::ScheduledAction(!isFunction) " << this << endl; - //func = 0; - //args = 0; - func = 0; - code = _code; - isFunction = false; - singleShot = _singleShot; - nextTime = _nextTime; - interval = _interval; - executing = false; - timerId = _timerId; -} - -bool ScheduledAction::execute(Window *window) -{ - KHTMLPart *part = ::tqqt_cast<KHTMLPart *>(window->m_frame->m_part); - if (!part || !part->jScriptEnabled()) - return false; - ScriptInterpreter *interpreter = static_cast<ScriptInterpreter *>(part->jScript()->interpreter()); - - interpreter->setProcessingTimerCallback(true); - - //kdDebug(6070) << "ScheduledAction::execute " << this << endl; - if (isFunction) { - if (func->implementsCall()) { - // #### check this - Q_ASSERT( part ); - if ( part ) - { - KJS::Interpreter *interpreter = part->jScript()->interpreter(); - ExecState *exec = interpreter->globalExec(); - Q_ASSERT( window == interpreter->globalObject().imp() ); - Object obj( window ); - func->call(exec,obj,args); // note that call() creates its own execution state for the func call - if (exec->hadException()) - exec->clearException(); - - // Update our document's rendering following the execution of the timeout callback. - part->document().updateRendering(); - } - } - } - else { - part->executeScript(DOM::Node(), code); - } - - interpreter->setProcessingTimerCallback(false); - return true; -} - -void ScheduledAction::mark() -{ - if (func && !func->marked()) - func->mark(); - args.mark(); -} - -ScheduledAction::~ScheduledAction() -{ - //kdDebug(6070) << "ScheduledAction::~ScheduledAction " << this << endl; -} - -////////////////////// WindowQObject //////////////////////// - -WindowQObject::WindowQObject(Window *w) - : parent(w) -{ - //kdDebug(6070) << "WindowQObject::WindowQObject " << this << endl; - if ( !parent->m_frame ) - kdDebug(6070) << "WARNING: null part in " << k_funcinfo << endl; - else - connect( parent->m_frame, TQT_SIGNAL( destroyed() ), - this, TQT_SLOT( parentDestroyed() ) ); - pausedTime = 0; - lastTimerId = 0; - currentlyDispatching = false; -} - -WindowQObject::~WindowQObject() -{ - //kdDebug(6070) << "WindowQObject::~WindowQObject " << this << endl; - parentDestroyed(); // reuse same code -} - -void WindowQObject::parentDestroyed() -{ - killTimers(); - - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) - delete it.current(); - scheduledActions.clear(); -} - -int WindowQObject::installTimeout(const Identifier &handler, int t, bool singleShot) -{ - int id = ++lastTimerId; - if (t < 10) t = 10; - DateTimeMS nextTime = DateTimeMS::now().addMSecs(-pausedTime + t); - - ScheduledAction *action = new ScheduledAction(handler.qstring(),nextTime,t,singleShot,id); - scheduledActions.append(action); - setNextTimer(); - return id; -} - -int WindowQObject::installTimeout(const Value &func, List args, int t, bool singleShot) -{ - Object objFunc = Object::dynamicCast( func ); - if (!objFunc.isValid()) - return 0; - int id = ++lastTimerId; - if (t < 10) t = 10; - - DateTimeMS nextTime = DateTimeMS::now().addMSecs(-pausedTime + t); - ScheduledAction *action = new ScheduledAction(objFunc,args,nextTime,t,singleShot,id); - scheduledActions.append(action); - setNextTimer(); - return id; -} - -void WindowQObject::clearTimeout(int timerId) -{ - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) { - ScheduledAction *action = it.current(); - if (action->timerId == timerId) { - scheduledActions.removeRef(action); - if (!action->executing) - delete action; - return; - } - } -} - -bool WindowQObject::hasTimers() const -{ - return scheduledActions.count(); -} - -void WindowQObject::mark() -{ - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) - it.current()->mark(); -} - -void WindowQObject::timerEvent(TQTimerEvent *) -{ - killTimers(); - - if (scheduledActions.isEmpty()) - return; - - currentlyDispatching = true; - - - DateTimeMS currentActual = DateTimeMS::now(); - DateTimeMS currentAdjusted = currentActual.addMSecs(-pausedTime); - - // Work out which actions are to be executed. We take a separate copy of - // this list since the main one may be modified during action execution - TQPtrList<ScheduledAction> toExecute; - TQPtrListIterator<ScheduledAction> it(scheduledActions); - for (; it.current(); ++it) - if (currentAdjusted >= it.current()->nextTime) - toExecute.append(it.current()); - - // ### verify that the window can't be closed (and action deleted) during execution - it = TQPtrListIterator<ScheduledAction>(toExecute); - for (; it.current(); ++it) { - ScheduledAction *action = it.current(); - if (!scheduledActions.containsRef(action)) // removed by clearTimeout() - continue; - - action->executing = true; // prevent deletion in clearTimeout() - - if (parent->part()) { - bool ok = action->execute(parent); - if ( !ok ) // e.g. JS disabled - scheduledActions.removeRef( action ); - } - - if (action->singleShot) { - scheduledActions.removeRef(action); - } - - action->executing = false; - - if (!scheduledActions.containsRef(action)) - delete action; - else - action->nextTime = action->nextTime.addMSecs(action->interval); - } - - pausedTime += currentActual.msecsTo(DateTimeMS::now()); - - currentlyDispatching = false; - - // Work out when next event is to occur - setNextTimer(); -} - -DateTimeMS DateTimeMS::addMSecs(int s) const -{ - DateTimeMS c = *this; - c.mTime = TQT_TQTIME_OBJECT(mTime.addMSecs(s)); - if (s > 0) - { - if (c.mTime < mTime) - c.mDate = TQT_TQDATE_OBJECT(mDate.addDays(1)); - } - else - { - if (c.mTime > mTime) - c.mDate = TQT_TQDATE_OBJECT(mDate.addDays(-1)); - } - return c; -} - -bool DateTimeMS::operator >(const DateTimeMS &other) const -{ - if (mDate > other.mDate) - return true; - - if (mDate < other.mDate) - return false; - - return mTime > other.mTime; -} - -bool DateTimeMS::operator >=(const DateTimeMS &other) const -{ - if (mDate > other.mDate) - return true; - - if (mDate < other.mDate) - return false; - - return mTime >= other.mTime; -} - -int DateTimeMS::msecsTo(const DateTimeMS &other) const -{ - int d = mDate.daysTo(other.mDate); - int ms = mTime.msecsTo(other.mTime); - return d*24*60*60*1000 + ms; -} - - -DateTimeMS DateTimeMS::now() -{ - DateTimeMS t; - TQTime before = TQTime::currentTime(); - t.mDate = TQDate::currentDate(); - t.mTime = TQTime::currentTime(); - if (t.mTime < before) - t.mDate = TQDate::currentDate(); // prevent race condition in hacky way :) - return t; -} - -void WindowQObject::setNextTimer() -{ - if (currentlyDispatching) - return; // Will schedule at the end - - if (scheduledActions.isEmpty()) - return; - - TQPtrListIterator<ScheduledAction> it(scheduledActions); - DateTimeMS nextTime = it.current()->nextTime; - for (++it; it.current(); ++it) - if (nextTime > it.current()->nextTime) - nextTime = it.current()->nextTime; - - DateTimeMS nextTimeActual = nextTime.addMSecs(pausedTime); - int nextInterval = DateTimeMS::now().msecsTo(nextTimeActual); - if (nextInterval < 0) - nextInterval = 0; - startTimer(nextInterval); -} - -void WindowQObject::timeoutClose() -{ - parent->closeNow(); -} - -Value FrameArray::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "FrameArray::get " << p.qstring() << " part=" << (void*)part << endl; -#endif - if (part.isNull()) - return Undefined(); - - TQPtrList<KParts::ReadOnlyPart> frames = part->frames(); - unsigned int len = frames.count(); - if (p == lengthPropertyName) - return Number(len); - else if (p== "location") // non-standard property, but works in NS and IE - { - Object obj = Object::dynamicCast( Window::retrieve( part ) ); - if ( obj.isValid() ) - return obj.get( exec, "location" ); - return Undefined(); - } - - // check for the name or number - KParts::ReadOnlyPart *frame = part->findFramePart(p.qstring()); - if (!frame) { - bool ok; - unsigned int i = p.toArrayIndex(&ok); - if (ok && i < len) - frame = frames.at(i); - } - - // we are potentially fetching a reference to a another Window object here. - // i.e. we may be accessing objects from another interpreter instance. - // Therefore we have to be a bit careful with memory management. - if (frame) { - return Window::retrieve(frame); - } - - // Fun IE quirk: name lookup in there is actually done by document.all - // hence, it can find non-frame things (and even let them hide frame ones!) - // We don't quite do that, but do this as a fallback. - DOM::DocumentImpl* doc = static_cast<DOM::DocumentImpl*>(part->document().handle()); - if (doc) { - DOM::HTMLCollectionImpl docuAll(doc, DOM::HTMLCollectionImpl::DOC_ALL); - DOM::NodeImpl* node = docuAll.namedItem(p.string()); - if (node) { - if (node->id() == ID_FRAME || node->id() == ID_IFRAME) { - //Return the Window object. - KHTMLPart* part = static_cast<DOM::HTMLFrameElementImpl*>(node)->contentPart(); - if (part) - return Value(Window::retrieveWindow(part)); - else - return Undefined(); - } else { - //Just a regular node.. - return getDOMNode(exec, node); - } - } - } else { - kdWarning(6070) << "Missing own document in FrameArray::get()" << endl; - } - - return ObjectImp::get(exec, p); -} - -Value FrameArray::call(ExecState *exec, Object &/*thisObj*/, const List &args) -{ - //IE supports a subset of the get functionality as call... - //... basically, when the return is a window, it supports that, otherwise it - //errors out. We do a cheap-and-easy emulation of that, and just do the same - //thing as get does. - if (args.size() == 1) - return get(exec, Identifier(args[0].toString(exec))); - - return Undefined(); -} - - -////////////////////// Location Object //////////////////////// - -const ClassInfo Location::info = { "Location", 0, &LocationTable, 0 }; -/* -@begin LocationTable 11 - hash Location::Hash DontDelete - host Location::Host DontDelete - hostname Location::Hostname DontDelete - href Location::Href DontDelete - pathname Location::Pathname DontDelete - port Location::Port DontDelete - protocol Location::Protocol DontDelete - search Location::Search DontDelete - [[==]] Location::EqualEqual DontDelete|ReadOnly - assign Location::Assign DontDelete|Function 1 - toString Location::ToString DontDelete|Function 0 - replace Location::Replace DontDelete|Function 1 - reload Location::Reload DontDelete|Function 0 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(LocationFunc) -Location::Location(khtml::ChildFrame *f) : m_frame(f) -{ - //kdDebug(6070) << "Location::Location " << this << " m_part=" << (void*)m_part << endl; -} - -Location::~Location() -{ - //kdDebug(6070) << "Location::~Location " << this << " m_part=" << (void*)m_part << endl; -} - -KParts::ReadOnlyPart *Location::part() const { - return m_frame ? static_cast<KParts::ReadOnlyPart *>(m_frame->m_part) : 0L; -} - -Value Location::get(ExecState *exec, const Identifier &p) const -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Location::get " << p.qstring() << " m_part=" << (void*)m_frame->m_part << endl; -#endif - - if (m_frame.isNull() || m_frame->m_part.isNull()) - return Undefined(); - - const HashEntry *entry = Lookup::findEntry(&LocationTable, p); - - // properties that work on all Location objects - if ( entry && entry->value == Replace ) - return lookupOrCreateFunction<LocationFunc>(exec,p,this,entry->value,entry->params,entry->attr); - - // XSS check - const Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( !window || !window->isSafeScript(exec) ) - return Undefined(); - - KURL url = m_frame->m_part->url(); - if (entry) - switch (entry->value) { - case Hash: - return String( url.ref().isNull() ? TQString("") : "#" + url.ref() ); - case Host: { - UString str = url.host(); - if (url.port()) - str += ":" + TQString::number((int)url.port()); - return String(str); - // Note: this is the IE spec. The NS spec swaps the two, it says - // "The hostname property is the concatenation of the host and port properties, separated by a colon." - // Bleh. - } - case Hostname: - return String( url.host() ); - case Href: - if (url.isEmpty()) - return String("about:blank"); - else if (!url.hasPath()) - return String( url.prettyURL()+"/" ); - else - return String( url.prettyURL() ); - case Pathname: - if (url.isEmpty()) - return String(""); - return String( url.path().isEmpty() ? TQString("/") : url.path() ); - case Port: - return String( url.port() ? TQString::number((int)url.port()) : TQString::fromLatin1("") ); - case Protocol: - return String( url.protocol()+":" ); - case Search: - return String( url.query() ); - case EqualEqual: // [[==]] - return String(toString(exec)); - case ToString: - return lookupOrCreateFunction<LocationFunc>(exec,p,this,entry->value,entry->params,entry->attr); - } - // Look for overrides - ValueImp * val = ObjectImp::getDirect(p); - if (val) - return Value(val); - if (entry && (entry->attr & Function)) - return lookupOrCreateFunction<LocationFunc>(exec,p,this,entry->value,entry->params,entry->attr); - - return Undefined(); -} - -void Location::put(ExecState *exec, const Identifier &p, const Value &v, int attr) -{ -#ifdef KJS_VERBOSE - kdDebug(6070) << "Location::put " << p.qstring() << " m_part=" << (void*)m_frame->m_part << endl; -#endif - if (m_frame.isNull() || m_frame->m_part.isNull()) - return; - - const Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( !window ) - return; - - KURL url = m_frame->m_part->url(); - - const HashEntry *entry = Lookup::findEntry(&LocationTable, p); - - if (entry) { - - // XSS check. Only new hrefs can be set from other sites - if (entry->value != Href && !window->isSafeScript(exec)) - return; - - TQString str = v.toString(exec).qstring(); - switch (entry->value) { - case Href: { - KHTMLPart* p =::tqqt_cast<KHTMLPart*>(Window::retrieveActive(exec)->part()); - if ( p ) - url = p->htmlDocument().completeURL( str ).string(); - else - url = str; - break; - } - case Hash: - // when the hash is already the same ignore it - if (str == url.ref()) return; - url.setRef(str); - break; - case Host: { - TQString host = str.left(str.find(":")); - TQString port = str.mid(str.find(":")+1); - url.setHost(host); - url.setPort(port.toUInt()); - break; - } - case Hostname: - url.setHost(str); - break; - case Pathname: - url.setPath(str); - break; - case Port: - url.setPort(str.toUInt()); - break; - case Protocol: - url.setProtocol(str); - break; - case Search: - url.setQuery(str); - break; - } - } else { - ObjectImp::put(exec, p, v, attr); - return; - } - - Window::retrieveWindow(m_frame->m_part)->goURL(exec, url.url(), false /* don't lock history*/ ); -} - -Value Location::toPrimitive(ExecState *exec, Type) const -{ - if (m_frame) { - Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( window && window->isSafeScript(exec) ) - return String(toString(exec)); - } - return Undefined(); -} - -UString Location::toString(ExecState *exec) const -{ - if (m_frame) { - Window* window = Window::retrieveWindow( m_frame->m_part ); - if ( window && window->isSafeScript(exec) ) - { - KURL url = m_frame->m_part->url(); - if (url.isEmpty()) - return "about:blank"; - else if (!url.hasPath()) - return url.prettyURL()+"/"; - else - return url.prettyURL(); - } - } - return ""; -} - -Value LocationFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( Location, thisObj ); - Location *location = static_cast<Location *>(thisObj.imp()); - KParts::ReadOnlyPart *part = location->part(); - - if (!part) return Undefined(); - - Window* window = Window::retrieveWindow(part); - - if ( !window->isSafeScript(exec) && id != Location::Replace) - return Undefined(); - - switch (id) { - case Location::Assign: - case Location::Replace: - Window::retrieveWindow(part)->goURL(exec, args[0].toString(exec).qstring(), - id == Location::Replace); - break; - case Location::Reload: { - KHTMLPart *khtmlpart = ::tqqt_cast<KHTMLPart *>(part); - if (khtmlpart) - khtmlpart->scheduleRedirection(-1, part->url().url(), true/*lock history*/); - else - part->openURL(part->url()); - break; - } - case Location::ToString: - return String(location->toString(exec)); - } - return Undefined(); -} - -////////////////////// External Object //////////////////////// - -const ClassInfo External::info = { "External", 0, 0, 0 }; -/* -@begin ExternalTable 4 - addFavorite External::AddFavorite DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(ExternalFunc) - -Value External::get(ExecState *exec, const Identifier &p) const -{ - return lookupGetFunction<ExternalFunc,ObjectImp>(exec,p,&ExternalTable,this); -} - -Value ExternalFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( External, thisObj ); - External *external = static_cast<External *>(thisObj.imp()); - - KHTMLPart *part = external->part; - if (!part) - return Undefined(); - - KHTMLView *widget = part->view(); - - switch (id) { - case External::AddFavorite: - { -#ifndef KONQ_EMBEDDED - if (!widget->dialogsAllowed()) - return Undefined(); - part->xmlDocImpl()->updateRendering(); - if (args.size() != 1 && args.size() != 2) - return Undefined(); - - TQString url = args[0].toString(exec).qstring(); - TQString title; - if (args.size() == 2) - title = args[1].toString(exec).qstring(); - - // AK - don't do anything yet, for the moment i - // just wanted the base js handling code in cvs - return Undefined(); - - TQString question; - if ( title.isEmpty() ) - question = i18n("Do you want a bookmark pointing to the location \"%1\" to be added to your collection?") - .arg(url); - else - question = i18n("Do you want a bookmark pointing to the location \"%1\" titled \"%2\" to be added to your collection?") - .arg(url).arg(title); - - emit part->browserExtension()->requestFocus(part); - - TQString caption; - if (!part->url().host().isEmpty()) - caption = part->url().host() + " - "; - caption += i18n("JavaScript Attempted Bookmark Insert"); - - if (KMessageBox::warningYesNo( - widget, question, caption, - i18n("Insert"), i18n("Disallow")) == KMessageBox::Yes) - { - KBookmarkManager *mgr = KBookmarkManager::userBookmarksManager(); - mgr->addBookmarkDialog(url,title); - } -#else - return Undefined(); -#endif - break; - } - default: - return Undefined(); - } - - return Undefined(); -} - -////////////////////// History Object //////////////////////// - -const ClassInfo History::info = { "History", 0, 0, 0 }; -/* -@begin HistoryTable 4 - length History::Length DontDelete|ReadOnly - back History::Back DontDelete|Function 0 - forward History::Forward DontDelete|Function 0 - go History::Go DontDelete|Function 1 -@end -*/ -IMPLEMENT_PROTOFUNC_DOM(HistoryFunc) - -Value History::get(ExecState *exec, const Identifier &p) const -{ - return lookupGet<HistoryFunc,History,ObjectImp>(exec,p,&HistoryTable,this); -} - -Value History::getValueProperty(ExecState *, int token) const -{ - // if previous or next is implemented, make sure its not a major - // privacy leak (see i.e. http://security.greymagic.com/adv/gm005-op/) - switch (token) { - case Length: - { - if ( !part ) - return Number( 0 ); - - KParts::BrowserExtension *ext = part->browserExtension(); - if ( !ext ) - return Number( 0 ); - - KParts::BrowserInterface *iface = ext->browserInterface(); - if ( !iface ) - return Number( 0 ); - - TQVariant length = iface->property( "historyLength" ); - - if ( length.type() != TQVariant::UInt ) - return Number( 0 ); - - return Number( length.toUInt() ); - } - default: - kdDebug(6070) << "WARNING: Unhandled token in History::getValueProperty : " << token << endl; - return Undefined(); - } -} - -Value HistoryFunc::tryCall(ExecState *exec, Object &thisObj, const List &args) -{ - KJS_CHECK_THIS( History, thisObj ); - History *history = static_cast<History *>(thisObj.imp()); - - Value v = args[0]; - Number n; - if(v.isValid()) - n = v.toInteger(exec); - - int steps; - switch (id) { - case History::Back: - steps = -1; - break; - case History::Forward: - steps = 1; - break; - case History::Go: - steps = n.intValue(); - break; - default: - return Undefined(); - } - - // Special case for go(0) from a frame -> reload only the frame - // go(i!=0) from a frame navigates into the history of the frame only, - // in both IE and NS (but not in Mozilla).... we can't easily do that - // in Konqueror... - if (!steps) // add && history->part->parentPart() to get only frames, but doesn't matter - { - history->part->openURL( history->part->url() ); /// ## need args.reload=true? - } else - { - // Delay it. - // Testcase: history.back(); alert("hello"); - Window* window = Window::retrieveWindow( history->part ); - window->delayedGoHistory( steps ); - } - return Undefined(); -} - -///////////////////////////////////////////////////////////////////////////// - -#ifdef Q_WS_QWS - -const ClassInfo Konqueror::info = { "Konqueror", 0, 0, 0 }; - -bool Konqueror::hasProperty(ExecState *exec, const Identifier &p) const -{ - if ( p.qstring().startsWith( "goHistory" ) ) return false; - - return true; -} - -Value Konqueror::get(ExecState *exec, const Identifier &p) const -{ - if ( p == "goHistory" || part->url().protocol() != "http" || part->url().host() != "localhost" ) - return Undefined(); - - KParts::BrowserExtension *ext = part->browserExtension(); - if ( ext ) { - KParts::BrowserInterface *iface = ext->browserInterface(); - if ( iface ) { - TQVariant prop = iface->property( p.qstring().latin1() ); - - if ( prop.isValid() ) { - switch( prop.type() ) { - case TQVariant::Int: - return Number( prop.toInt() ); - case TQVariant::String: - return String( prop.toString() ); - default: - break; - } - } - } - } - - return Value( new KonquerorFunc(exec, this, p.qstring().latin1() ) ); -} - -Value KonquerorFunc::tryCall(ExecState *exec, Object &, const List &args) -{ - KParts::BrowserExtension *ext = konqueror->part->browserExtension(); - - if (!ext) - return Undefined(); - - KParts::BrowserInterface *iface = ext->browserInterface(); - - if ( !iface ) - return Undefined(); - - TQCString n = m_name.data(); - n += "()"; - iface->callMethod( n.data(), TQVariant() ); - - return Undefined(); -} - -UString Konqueror::toString(ExecState *) const -{ - return UString("[object Konqueror]"); -} - -#endif -///////////////////////////////////////////////////////////////////////////// -} //namespace KJS - -#include "kjs_window.moc" |