23 #include "kjs_window.h"
26 #include <khtmlview.h>
27 #include <khtml_part.h>
28 #include <khtmlpart_p.h>
29 #include <khtml_settings.h>
30 #include <xml/dom2_eventsimpl.h>
31 #include <xml/dom_docimpl.h>
32 #include <dom/html_document.h>
33 #include <html/html_documentimpl.h>
34 #include <rendering/render_frames.h>
36 #include <config-khtml.h>
39 #include <QApplication>
40 #include <QDesktopWidget>
41 #include <qinputdialog.h>
42 #include "khtml_debug.h"
43 #include <kmessagebox.h>
45 #include <kparts/browserinterface.h>
46 #include <kwindowsystem.h>
49 #include <kbookmarkmanager.h>
50 #include <kbookmarkdialog.h>
54 #include <QTextDocument>
55 #include <kstringhandler.h>
57 #include "kjs_proxy.h"
58 #include "kjs_navigator.h"
59 #include "kjs_mozilla.h"
61 #include "kjs_range.h"
62 #include "kjs_traversal.h"
64 #include "kjs_events.h"
65 #include "kjs_audio.h"
66 #include "kjs_context2d.h"
67 #include "kjs_xpath.h"
68 #include "kjs_scriptable.h"
69 #include "xmlhttprequest.h"
70 #include "xmlserializer.h"
71 #include "domparser.h"
72 #include "kjs_arraybuffer.h"
73 #include "kjs_arraytyped.h"
75 #include <rendering/render_replaced.h>
83 class History :
public JSObject
85 friend class HistoryFunc;
88 : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype()), part(p) { }
89 using KJS::JSObject::getOwnPropertySlot;
90 bool getOwnPropertySlot(
ExecState *exec,
const Identifier &propertyName, PropertySlot &slot)
override;
92 const ClassInfo *classInfo()
const override
102 class External :
public JSObject
104 friend class ExternalFunc;
107 : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype()), part(p) { }
108 using KJS::JSObject::getOwnPropertySlot;
109 bool getOwnPropertySlot(
ExecState *exec,
const Identifier &propertyName, PropertySlot &slot)
override;
110 const ClassInfo *classInfo()
const override
115 enum { AddFavorite };
121 #include "kjs_window.lut.h"
142 const ClassInfo Screen::info = {
"Screen",
nullptr, &ScreenTable,
nullptr };
146 : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype()) {}
148 bool Screen::getOwnPropertySlot(
ExecState *exec,
const Identifier &propertyName, PropertySlot &slot)
151 qCDebug(KHTML_LOG) <<
"Screen::getPropertyName " << propertyName.
qstring();
153 return getStaticValueSlot<Screen, JSObject>(exec, &ScreenTable,
this, propertyName, slot);
158 QWidget *thisWidget = Window::retrieveActive(exec)->part()->widget();
163 return jsNumber(sg.
height());
165 return jsNumber(sg.
width());
168 return jsNumber(thisWidget->
depth());
170 #if HAVE_X11 && ! defined K_WS_QTONLY
172 return jsNumber(clipped.
x() - sg.
x());
178 #if HAVE_X11 && ! defined K_WS_QTONLY
180 return jsNumber(clipped.
y() - sg.
y());
186 #if HAVE_X11 && ! defined K_WS_QTONLY
188 return jsNumber(clipped.
height());
190 return jsNumber(100);
194 #if HAVE_X11 && ! defined K_WS_QTONLY
196 return jsNumber(clipped.
width());
198 return jsNumber(100);
203 return jsUndefined();
222 KJS_IMPLEMENT_PROTOFUNC(ConsoleFunc)
224 const ClassInfo Console::info = {
"Console",
nullptr, &ConsoleTable,
nullptr };
228 : JSObject(exec->lexicalInterpreter()->builtinObjectPrototype()) {}
230 bool Console::getOwnPropertySlot(
ExecState *exec,
const Identifier &propertyName, PropertySlot &slot)
233 qCDebug(KHTML_LOG) <<
"Console::getPropertyName " << propertyName.
qstring();
235 return getStaticFunctionSlot<ConsoleFunc, JSObject>(exec, &ConsoleTable,
this, propertyName, slot);
238 void printMessage(Console::MessageType msgType,
const UString &
message)
242 case Console::DebugType:
245 case Console::ErrorType:
248 case Console::InfoType:
251 case Console::LogType:
254 case Console::WarnType:
260 ASSERT_NOT_REACHED();
267 if (!args[0]->isString()) {
268 return jsUndefined();
270 UString output = args[0]->toString(exec);
272 return jsUndefined();
274 int size = output.
size();
278 for (
int i = 0; i < size; ++i) {
279 if (!(output[i] ==
'%')) {
287 switch (output[i + 1].uc) {
289 if (args[arg]->isString()) {
290 replace = args[arg]->toString(exec);
298 if (args[arg]->isNumber()) {
299 double val = args[arg]->toNumber(exec);
315 return jsUndefined();
317 composedOutput += output.
substr(last, i - last);
324 composedOutput = output;
326 composedOutput += output.
substr(last);
329 printMessage(msgType, composedOutput);
330 return jsUndefined();
336 case Console::Assert: {
337 JSType
type = args[0]->type();
338 bool assertFailed =
false;
340 case UnspecifiedType:
346 assertFailed = !args[0]->getBoolean();
351 case GetterSetterType:
352 assertFailed =
false;
356 ASSERT_NOT_REACHED();
362 if (args.
size() > 1 && args[1]->isString()) {
363 printMessage(Console::ErrorType, args[1]->getString());
365 printMessage(Console::ErrorType,
"Assert failed!");
368 return jsUndefined();
371 return consolePrintf(exec, Console::LogType, args);
373 return consolePrintf(exec, Console::DebugType, args);
375 return consolePrintf(exec, Console::WarnType, args);
377 return consolePrintf(exec, Console::ErrorType, args);
379 return consolePrintf(exec, Console::InfoType, args);
382 return jsUndefined();
384 return jsUndefined();
389 const ClassInfo Window::info = {
"Window", &DOMAbstractView::info, &WindowTable,
nullptr };
603 KJS_IMPLEMENT_PROTOFUNC(WindowFunc)
605 Window::Window(khtml::ChildFrame *p)
606 : JSGlobalObject(), m_frame(p), screen(nullptr), console(nullptr), history(nullptr), external(nullptr), loc(nullptr), m_evt(nullptr)
608 winq =
new WindowQObject(
this);
614 qDeleteAll(m_delayed);
620 JSObject *obj = retrieve(p)->getObject();
623 KHTMLPart *part = qobject_cast<KHTMLPart *>(p);
626 assert(
dynamic_cast<KJS::Window *
>(obj));
632 return static_cast<KJS::Window *
>(obj);
639 assert(
dynamic_cast<KJS::Window *
>(imp));
640 return static_cast<KJS::Window *
>(imp);
646 KHTMLPart *part = qobject_cast<KHTMLPart *>(p);
649 part = qobject_cast<KHTMLPart *>(p->
parent());
654 proxy = part->jScript();
658 qCDebug(KHTML_LOG) <<
"Window::retrieve part=" << part <<
" '" << part->
objectName() <<
"' interpreter=" << proxy->interpreter() <<
" window=" << proxy->interpreter()->
globalObject();
663 qCDebug(KHTML_LOG) <<
"Window::retrieve part=" << p <<
" '" << p->
objectName() <<
"' no jsproxy.";
665 return jsUndefined();
681 if (screen && !screen->marked()) {
684 if (console && !console->marked()) {
687 if (history && !history->marked()) {
690 if (external && !external->marked()) {
694 if (loc && !loc->marked()) {
700 foreach (DelayedAction *action, m_delayed) {
707 return "[object Window]";
710 bool Window::isCrossFrameAccessible(
int token)
const
739 bool Window::getOwnPropertySlot(
ExecState *exec,
const Identifier &propertyName, PropertySlot &slot)
742 qCDebug(KHTML_LOG) <<
"Window(" <<
this <<
")::getOwnPropertySlot " << propertyName.
qstring();
746 if (m_frame.isNull() || m_frame->m_part.isNull()) {
747 const HashEntry *entry = Lookup::findEntry(&WindowTable, propertyName);
749 switch (entry->
value) {
754 getSlotFromEntry<WindowFunc, Window>(entry,
this, slot);
760 slot.setUndefined(
this);
764 bool safe = isSafeScript(exec);
767 JSValue **val = getDirectLocation(propertyName);
770 fillDirectLocationSlot(slot, val);
775 const HashEntry *entry = Lookup::findEntry(&WindowTable, propertyName);
776 if (entry && isCrossFrameAccessible(entry->
value)) {
777 fillDirectLocationSlot(slot, val);
779 slot.setUndefined(
this);
787 const HashEntry *entry = Lookup::findEntry(&WindowTable, propertyName);
788 if (!safe && (!entry || !isCrossFrameAccessible(entry->
value))) {
789 slot.setUndefined(
this);
795 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part.data());
799 switch (entry->
value) {
804 getSlotFromEntry<WindowFunc, Window>(entry,
this, slot);
811 slot.setUndefined(
this);
820 slot.setUndefined(
this);
824 getSlotFromEntry<WindowFunc, Window>(entry,
this, slot);
830 if (pluginRootGet(exec, m_frame->m_scriptable.data(), propertyName, slot)) {
834 slot.setUndefined(
this);
841 slot.setCustom(
this, framePartGetter);
847 unsigned int i = propertyName.toArrayIndex(&ok);
848 if (ok && frameByIndex(i)) {
849 slot.setCustomIndex(
this, i, indexGetterAdapter<Window>);
855 if (doc && doc->isHTMLDocument()) {
857 if (info || doc->getElementById(propertyName.domString())) {
858 slot.setCustom(
this, namedItemGetter);
866 qCDebug(KHTML_LOG) <<
"WARNING: Window::get property not found: " << propertyName.
qstring();
869 return JSObject::getOwnPropertySlot(exec, propertyName, slot);
874 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
876 unsigned int len = frames.
count();
889 return Window::retrieve(frame);
891 return jsUndefined();
897 Window *thisObj =
static_cast<Window *
>(slot.slotBase());
898 KHTMLPart *part = qobject_cast<KHTMLPart *>(thisObj->m_frame->m_part);
900 return thisObj->retrieve(rop);
905 Window *thisObj =
static_cast<Window *
>(slot.slotBase());
906 KHTMLPart *part = qobject_cast<KHTMLPart *>(thisObj->m_frame->m_part);
912 return getDOMNode(exec, info->nd);
915 DOM::HTMLMappedNameCollectionImpl *coll =
new DOM::HTMLMappedNameCollectionImpl(doc,
916 DOM::HTMLCollectionImpl::DOCUMENT_NAMED_ITEMS, p.domString());
918 if (coll->length() == 1) {
919 info->nd =
static_cast<DOM::ElementImpl *
>(coll->firstItem());
921 return getDOMNode(exec, info->nd);
923 return getHTMLCollection(exec, coll);
927 DOM::ElementImpl *element = doc->getElementById(p.domString());
928 return getDOMNode(exec, element);
933 KHTMLPart *part = m_frame.isNull() ? nullptr : qobject_cast<KHTMLPart *>(m_frame->m_part);
937 return jsBoolean(
true);
941 return jsUndefined();
947 return jsBoolean(!part);
953 return retrieve(part);
957 if (!part->opener()) {
960 return retrieve(part->opener());
972 return jsUndefined();
978 return getDOMNode(exec, part->xmlDocImpl());
980 if (m_frame->m_partContainerElement) {
981 return getDOMNode(exec, m_frame->m_partContainerElement.data());
983 return jsUndefined();
986 return NodeConstructor::self(exec);
988 return getRangeConstructor(exec);
990 return getNodeFilterConstructor(exec);
992 return NodeListPseudoCtor::self(exec);
994 return getDOMExceptionConstructor(exec);
996 return RangeExceptionPseudoCtor::self(exec);
998 return getCSSRuleConstructor(exec);
1000 return ElementPseudoCtor::self(exec);
1001 case DocumentFragmentCtor:
1002 return DocumentFragmentPseudoCtor::self(exec);
1003 case HTMLElementCtor:
1004 return HTMLElementPseudoCtor::self(exec);
1005 case HTMLHtmlElementCtor:
1006 return HTMLHtmlElementPseudoCtor::self(exec);
1007 case HTMLHeadElementCtor:
1008 return HTMLHeadElementPseudoCtor::self(exec);
1009 case HTMLLinkElementCtor:
1010 return HTMLLinkElementPseudoCtor::self(exec);
1011 case HTMLTitleElementCtor:
1012 return HTMLTitleElementPseudoCtor::self(exec);
1013 case HTMLMetaElementCtor:
1014 return HTMLMetaElementPseudoCtor::self(exec);
1015 case HTMLBaseElementCtor:
1016 return HTMLBaseElementPseudoCtor::self(exec);
1017 case HTMLIsIndexElementCtor:
1018 return HTMLIsIndexElementPseudoCtor::self(exec);
1019 case HTMLStyleElementCtor:
1020 return HTMLStyleElementPseudoCtor::self(exec);
1021 case HTMLBodyElementCtor:
1022 return HTMLBodyElementPseudoCtor::self(exec);
1023 case HTMLFormElementCtor:
1024 return HTMLFormElementPseudoCtor::self(exec);
1025 case HTMLSelectElementCtor:
1026 return HTMLSelectElementPseudoCtor::self(exec);
1027 case HTMLOptGroupElementCtor:
1028 return HTMLOptGroupElementPseudoCtor::self(exec);
1029 case HTMLOptionElementCtor:
1030 return HTMLOptionElementPseudoCtor::self(exec);
1031 case HTMLInputElementCtor:
1032 return HTMLInputElementPseudoCtor::self(exec);
1033 case HTMLTextAreaElementCtor:
1034 return HTMLTextAreaElementPseudoCtor::self(exec);
1035 case HTMLButtonElementCtor:
1036 return HTMLButtonElementPseudoCtor::self(exec);
1037 case HTMLLabelElementCtor:
1038 return HTMLLabelElementPseudoCtor::self(exec);
1039 case HTMLFieldSetElementCtor:
1040 return HTMLFieldSetElementPseudoCtor::self(exec);
1041 case HTMLLegendElementCtor:
1042 return HTMLLegendElementPseudoCtor::self(exec);
1043 case HTMLUListElementCtor:
1044 return HTMLUListElementPseudoCtor::self(exec);
1045 case HTMLOListElementCtor:
1046 return HTMLOListElementPseudoCtor::self(exec);
1047 case HTMLDListElementCtor:
1048 return HTMLDListElementPseudoCtor::self(exec);
1049 case HTMLDirectoryElementCtor:
1050 return HTMLDirectoryElementPseudoCtor::self(exec);
1051 case HTMLMenuElementCtor:
1052 return HTMLMenuElementPseudoCtor::self(exec);
1053 case HTMLLIElementCtor:
1054 return HTMLLIElementPseudoCtor::self(exec);
1055 case HTMLDivElementCtor:
1056 return HTMLDivElementPseudoCtor::self(exec);
1057 case HTMLParagraphElementCtor:
1058 return HTMLParagraphElementPseudoCtor::self(exec);
1059 case HTMLHeadingElementCtor:
1060 return HTMLHeadingElementPseudoCtor::self(exec);
1061 case HTMLBlockQuoteElementCtor:
1062 return HTMLBlockQuoteElementPseudoCtor::self(exec);
1063 case HTMLQuoteElementCtor:
1064 return HTMLQuoteElementPseudoCtor::self(exec);
1065 case HTMLPreElementCtor:
1066 return HTMLPreElementPseudoCtor::self(exec);
1067 case HTMLBRElementCtor:
1068 return HTMLBRElementPseudoCtor::self(exec);
1069 case HTMLBaseFontElementCtor:
1070 return HTMLBaseFontElementPseudoCtor::self(exec);
1071 case HTMLFontElementCtor:
1072 return HTMLFontElementPseudoCtor::self(exec);
1073 case HTMLHRElementCtor:
1074 return HTMLHRElementPseudoCtor::self(exec);
1075 case HTMLModElementCtor:
1076 return HTMLModElementPseudoCtor::self(exec);
1077 case HTMLAnchorElementCtor:
1078 return HTMLAnchorElementPseudoCtor::self(exec);
1079 case HTMLImageElementCtor:
1080 return HTMLImageElementPseudoCtor::self(exec);
1081 case HTMLObjectElementCtor:
1082 return HTMLObjectElementPseudoCtor::self(exec);
1083 case HTMLParamElementCtor:
1084 return HTMLParamElementPseudoCtor::self(exec);
1085 case HTMLAppletElementCtor:
1086 return HTMLAppletElementPseudoCtor::self(exec);
1087 case HTMLMapElementCtor:
1088 return HTMLMapElementPseudoCtor::self(exec);
1089 case HTMLAreaElementCtor:
1090 return HTMLAreaElementPseudoCtor::self(exec);
1091 case HTMLScriptElementCtor:
1092 return HTMLScriptElementPseudoCtor::self(exec);
1093 case HTMLTableElementCtor:
1094 return HTMLTableElementPseudoCtor::self(exec);
1095 case HTMLTableCaptionElementCtor:
1096 return HTMLTableCaptionElementPseudoCtor::self(exec);
1097 case HTMLTableColElementCtor:
1098 return HTMLTableColElementPseudoCtor::self(exec);
1099 case HTMLTableSectionElementCtor:
1100 return HTMLTableSectionElementPseudoCtor::self(exec);
1101 case HTMLTableRowElementCtor:
1102 return HTMLTableRowElementPseudoCtor::self(exec);
1103 case HTMLTableCellElementCtor:
1104 return HTMLTableCellElementPseudoCtor::self(exec);
1105 case HTMLFrameSetElementCtor:
1106 return HTMLFrameSetElementPseudoCtor::self(exec);
1107 case HTMLLayerElementCtor:
1108 return HTMLLayerElementPseudoCtor::self(exec);
1109 case HTMLFrameElementCtor:
1110 return HTMLFrameElementPseudoCtor::self(exec);
1111 case HTMLIFrameElementCtor:
1112 return HTMLIFrameElementPseudoCtor::self(exec);
1113 case HTMLCollectionCtor:
1114 return HTMLCollectionPseudoCtor::self(exec);
1115 case HTMLCanvasElementCtor:
1116 return HTMLCanvasElementPseudoCtor::self(exec);
1118 return Context2DPseudoCtor::self(exec);
1120 return SVGAnglePseudoCtor::self(exec);
1121 case XPathResultCtor:
1122 return XPathResultPseudoCtor::self(exec);
1123 case XPathExpressionCtor:
1124 return XPathExpressionPseudoCtor::self(exec);
1125 case XPathNSResolverCtor:
1126 return XPathNSResolverPseudoCtor::self(exec);
1128 return DocumentPseudoCtor::self(exec);
1129 case HTMLDocumentCtor:
1130 return HTMLDocumentPseudoCtor::self(exec);
1131 case CSSStyleDeclarationCtor:
1132 return CSSStyleDeclarationPseudoCtor::self(exec);
1133 case StyleSheetCtor:
1134 return DOMStyleSheetPseudoCtor::self(exec);
1136 return EventConstructor::self(exec);
1137 case MessageEventCtor:
1138 return MessageEventPseudoCtor::self(exec);
1139 case HashChangeEventCtor:
1140 return HashChangeEventPseudoCtor::self(exec);
1141 case MutationEventCtor:
1142 return getMutationEventConstructor(exec);
1143 case KeyboardEventCtor:
1144 return getKeyboardEventConstructor(exec);
1145 case EventExceptionCtor:
1146 return getEventExceptionConstructor(exec);
1148 return history ? history :
1149 (
const_cast<Window *
>(
this)->history =
new History(exec, part));
1152 return external ? external :
1153 (
const_cast<Window *
>(
this)->external =
new External(exec, part));
1157 return getDOMEvent(exec, m_evt);
1160 qCDebug(KHTML_LOG) <<
"WARNING: window(" <<
this <<
"," << part->
objectName() <<
").event, no event!";
1162 return jsUndefined();
1165 if (!part->
view()) {
1166 return jsUndefined();
1173 return jsNumber(ret);
1176 if (!part->
view()) {
1177 return jsUndefined();
1184 return jsNumber(ret);
1187 return jsNumber(part->frames().count());
1191 return new MozillaSidebarExtension(exec, part);
1193 case ClientInformation: {
1195 JSValue *nav(
new Navigator(exec, part));
1196 const_cast<Window *
>(
this)->
put(exec,
"navigator", nav, DontDelete | ReadOnly | Internal);
1197 const_cast<Window *
>(
this)->
put(exec,
"clientInformation", nav, DontDelete | ReadOnly | Internal);
1201 case OffscreenBuffering:
1202 return jsBoolean(
true);
1205 #if HAVE_X11 && ! defined K_WS_QTONLY
1210 return jsNumber(token == OuterHeight ?
1211 inf.geometry().height() : inf.geometry().width());
1213 return jsNumber(token == OuterHeight ?
1222 return jsUndefined();
1225 if (!part->
view()) {
1226 return jsUndefined();
1233 if (!part->
view()) {
1234 return jsUndefined();
1240 if (!part->
view()) {
1241 return jsUndefined();
1246 if (!part->
view()) {
1247 return jsUndefined();
1252 return new JSObject();
1254 return screen ? screen :
1255 (
const_cast<Window *
>(
this)->screen =
new Screen(exec));
1257 return console ? console :
1258 (
const_cast<Window *
>(
this)->console =
new Console(exec));
1260 return new AudioConstructorImp(exec, part->xmlDocImpl());
1262 return new ImageConstructorImp(exec, part->xmlDocImpl());
1264 return new OptionConstructorImp(exec, part->xmlDocImpl());
1265 case XMLHttpRequest:
1266 return new XMLHttpRequestConstructorImp(exec, part->xmlDocImpl());
1268 return new XMLSerializerConstructorImp(exec);
1270 return new DOMParserConstructorImp(exec, part->xmlDocImpl());
1272 return new ArrayBufferConstructorImp(exec, part->xmlDocImpl());
1274 return new ArrayBufferConstructorImpInt8(exec, part->xmlDocImpl());
1276 return new ArrayBufferConstructorImpUint8(exec, part->xmlDocImpl());
1278 return new ArrayBufferConstructorImpInt16(exec, part->xmlDocImpl());
1280 return new ArrayBufferConstructorImpUint16(exec, part->xmlDocImpl());
1282 return new ArrayBufferConstructorImpInt32(exec, part->xmlDocImpl());
1284 return new ArrayBufferConstructorImpUint32(exec, part->xmlDocImpl());
1286 return new ArrayBufferConstructorImpFloat32(exec, part->xmlDocImpl());
1288 return new ArrayBufferConstructorImpFloat64(exec, part->xmlDocImpl());
1290 return getListener(exec, DOM::EventImpl::ABORT_EVENT);
1292 return getListener(exec, DOM::EventImpl::BLUR_EVENT);
1294 return getListener(exec, DOM::EventImpl::CHANGE_EVENT);
1296 return getListener(exec, DOM::EventImpl::KHTML_ECMA_CLICK_EVENT);
1298 return getListener(exec, DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT);
1300 return getListener(exec, DOM::EventImpl::KHTML_DRAGDROP_EVENT);
1302 return getListener(exec, DOM::EventImpl::ERROR_EVENT);
1304 return getListener(exec, DOM::EventImpl::FOCUS_EVENT);
1306 return getListener(exec, DOM::EventImpl::KEYDOWN_EVENT);
1308 return getListener(exec, DOM::EventImpl::KEYPRESS_EVENT);
1310 return getListener(exec, DOM::EventImpl::KEYUP_EVENT);
1312 return getListener(exec, DOM::EventImpl::LOAD_EVENT);
1314 return getListener(exec, DOM::EventImpl::MESSAGE_EVENT);
1316 return getListener(exec, DOM::EventImpl::MOUSEDOWN_EVENT);
1318 return getListener(exec, DOM::EventImpl::MOUSEMOVE_EVENT);
1320 return getListener(exec, DOM::EventImpl::MOUSEOUT_EVENT);
1322 return getListener(exec, DOM::EventImpl::MOUSEOVER_EVENT);
1324 return getListener(exec, DOM::EventImpl::MOUSEUP_EVENT);
1326 return getListener(exec, DOM::EventImpl::KHTML_MOVE_EVENT);
1328 return getListener(exec, DOM::EventImpl::RESET_EVENT);
1330 return getListener(exec, DOM::EventImpl::RESIZE_EVENT);
1332 return getListener(exec, DOM::EventImpl::SCROLL_EVENT);
1334 return getListener(exec, DOM::EventImpl::SELECT_EVENT);
1336 return getListener(exec, DOM::EventImpl::SUBMIT_EVENT);
1338 return getListener(exec, DOM::EventImpl::UNLOAD_EVENT);
1340 return getListener(exec, DOM::EventImpl::HASHCHANGE_EVENT);
1343 return jsUndefined();
1349 if (m_frame.isNull() || m_frame->m_part.isNull()) {
1357 if (attr != None && attr != DontDelete) {
1363 bool safe = isSafeScript(exec);
1365 if (
JSValue **slot = getDirectWriteLocation(propertyName)) {
1371 const HashEntry *entry = Lookup::findEntry(&WindowTable, propertyName);
1374 qCDebug(KHTML_LOG) <<
"Window(" <<
this <<
")::put " << propertyName.
qstring();
1376 if (entry->
value == _Location) {
1377 goURL(exec, value->toString(exec).qstring());
1381 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1383 switch (entry->
value) {
1385 if (isSafeScript(exec) && part->
settings()->windowStatusPolicy(part->
url().
host())
1386 == KHTMLSettings::KJSWindowStatusAllow) {
1387 UString s = value->toString(exec);
1392 case DefaultStatus: {
1393 if (isSafeScript(exec) && part->
settings()->windowStatusPolicy(part->
url().
host())
1394 == KHTMLSettings::KJSWindowStatusAllow) {
1395 UString s = value->toString(exec);
1401 if (isSafeScript(exec)) {
1402 setListener(exec, DOM::EventImpl::ABORT_EVENT, value);
1406 if (isSafeScript(exec)) {
1407 setListener(exec, DOM::EventImpl::BLUR_EVENT, value);
1411 if (isSafeScript(exec)) {
1412 setListener(exec, DOM::EventImpl::CHANGE_EVENT, value);
1416 if (isSafeScript(exec)) {
1417 setListener(exec, DOM::EventImpl::KHTML_ECMA_CLICK_EVENT, value);
1421 if (isSafeScript(exec)) {
1422 setListener(exec, DOM::EventImpl::KHTML_ECMA_DBLCLICK_EVENT, value);
1426 if (isSafeScript(exec)) {
1427 setListener(exec, DOM::EventImpl::KHTML_DRAGDROP_EVENT, value);
1431 if (isSafeScript(exec)) {
1432 setListener(exec, DOM::EventImpl::ERROR_EVENT, value);
1436 if (isSafeScript(exec)) {
1437 setListener(exec, DOM::EventImpl::FOCUS_EVENT, value);
1441 if (isSafeScript(exec)) {
1442 setListener(exec, DOM::EventImpl::KEYDOWN_EVENT, value);
1446 if (isSafeScript(exec)) {
1447 setListener(exec, DOM::EventImpl::KEYPRESS_EVENT, value);
1451 if (isSafeScript(exec)) {
1452 setListener(exec, DOM::EventImpl::KEYUP_EVENT, value);
1456 if (isSafeScript(exec)) {
1457 setListener(exec, DOM::EventImpl::LOAD_EVENT, value);
1461 if (isSafeScript(exec)) {
1462 setListener(exec, DOM::EventImpl::MESSAGE_EVENT, value);
1466 if (isSafeScript(exec)) {
1467 setListener(exec, DOM::EventImpl::MOUSEDOWN_EVENT, value);
1471 if (isSafeScript(exec)) {
1472 setListener(exec, DOM::EventImpl::MOUSEMOVE_EVENT, value);
1476 if (isSafeScript(exec)) {
1477 setListener(exec, DOM::EventImpl::MOUSEOUT_EVENT, value);
1481 if (isSafeScript(exec)) {
1482 setListener(exec, DOM::EventImpl::MOUSEOVER_EVENT, value);
1486 if (isSafeScript(exec)) {
1487 setListener(exec, DOM::EventImpl::MOUSEUP_EVENT, value);
1491 if (isSafeScript(exec)) {
1492 setListener(exec, DOM::EventImpl::KHTML_MOVE_EVENT, value);
1496 if (isSafeScript(exec)) {
1497 setListener(exec, DOM::EventImpl::RESET_EVENT, value);
1501 if (isSafeScript(exec)) {
1502 setListener(exec, DOM::EventImpl::RESIZE_EVENT, value);
1506 if (isSafeScript(exec)) {
1507 setListener(exec, DOM::EventImpl::SCROLL_EVENT, value);
1511 if (isSafeScript(exec)) {
1512 setListener(exec, DOM::EventImpl::SELECT_EVENT, value);
1516 if (isSafeScript(exec)) {
1517 setListener(exec, DOM::EventImpl::SUBMIT_EVENT, value);
1521 if (isSafeScript(exec)) {
1522 setListener(exec, DOM::EventImpl::UNLOAD_EVENT, value);
1526 if (isSafeScript(exec)) {
1527 setListener(exec, DOM::EventImpl::HASHCHANGE_EVENT, value);
1531 if (isSafeScript(exec)) {
1532 part->
setObjectName(value->toString(exec).qstring().toLocal8Bit().data());
1540 if (isSafeScript(exec) &&
1541 pluginRootPut(exec, m_frame->m_scriptable.data(), propertyName, value)) {
1550 bool Window::toBoolean(
ExecState *)
const
1552 return !m_frame.isNull() && !m_frame->m_part.isNull();
1555 DOM::AbstractViewImpl *Window::toAbstractView()
const
1557 KHTMLPart *part = ::qobject_cast<KHTMLPart *>(m_frame->m_part);
1558 if (!part || !part->xmlDocImpl()) {
1561 return part->xmlDocImpl()->defaultView();
1564 void Window::scheduleClose()
1571 void Window::closeNow()
1573 if (m_frame.isNull() || m_frame->m_part.isNull()) {
1576 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1589 void Window::afterScriptExecution()
1591 DOM::DocumentImpl::updateDocumentsRendering();
1594 foreach (DelayedAction *act, delayedActions) {
1595 if (!act->execute(
this)) {
1599 qDeleteAll(delayedActions);
1604 if (m_frame.isNull() || m_frame->m_part.isNull()) {
1612 if (activePart == m_frame->m_part) {
1616 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1621 if (!part->xmlDocImpl()) {
1627 KHTMLPart *activeKHTMLPart = qobject_cast<KHTMLPart *>(activePart);
1628 if (!activeKHTMLPart) {
1637 khtml::SecurityOrigin *actDomain = actDocument->origin();
1638 khtml::SecurityOrigin *thisDomain = thisDocument->origin();
1640 if (actDomain->canAccess(thisDomain)) {
1642 qCDebug(KHTML_LOG) <<
"JavaScript: access granted, domain is '" << actDomain.string() <<
"'";
1654 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1655 if (!part || !isSafeScript(exec)) {
1663 doc->setHTMLWindowEventListener(eventId, getJSEventListener(func,
true));
1668 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1669 if (!part || !isSafeScript(exec)) {
1670 return jsUndefined();
1674 return jsUndefined();
1678 if (listener &&
static_cast<JSEventListener *
>(listener)->listenerObj()) {
1679 return static_cast<JSEventListener *
>(listener)->listenerObj();
1685 JSEventListener *Window::getJSEventListener(
JSValue *val,
bool html)
1688 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1694 JSObject *listenerObject = val->getObject();
1695 JSObject *thisObject = listenerObject;
1698 if (!listenerObject->implementsCall() && part && part->jScript() && part->jScript()->interpreter()) {
1699 Interpreter *interpreter = part->jScript()->interpreter();
1703 JSObject *handleEventObject = handleEventValue->getObject();
1705 if (handleEventObject && handleEventObject->implementsCall()) {
1706 thisObject = listenerObject;
1707 listenerObject = handleEventObject;
1711 JSEventListener *existingListener = jsEventListeners.value(
QPair<void *, bool>(thisObject, html));
1712 if (existingListener) {
1713 assert(existingListener->isHTMLEventListener() == html);
1714 return existingListener;
1718 return new JSEventListener(listenerObject, thisObject,
this, html);
1721 JSLazyEventListener *Window::getJSLazyEventListener(
const QString &code,
const QString &srcUrl,
int line,
1722 const QString &name, DOM::NodeImpl *node,
bool svg)
1724 return new JSLazyEventListener(code, srcUrl, line, name,
this, node, svg);
1731 qDeleteAll(m_delayed);
1744 setPrototype(jsNull());
1748 while (it.hasNext()) {
1750 it.value()->clear();
1754 jsEventListeners.clear();
1757 KJSProxy *proxy = m_frame->m_jscript;
1759 winq =
new WindowQObject(
this);
1762 interpreter->initGlobalObject();
1767 void Window::setCurrentEvent(DOM::EventImpl *evt)
1775 Window *active = Window::retrieveActive(exec);
1776 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1777 KHTMLPart *active_part = qobject_cast<KHTMLPart *>(active->part());
1779 if (active_part && part) {
1784 if (!KHTMLPartPrivate::isJavaScriptURL(dstUrl) || isSafeScript(exec)) {
1787 }
else if (!part && m_frame->m_partContainerElement) {
1790 emit b->
openUrlRequest(
QUrl(m_frame->m_partContainerElement.data()->document()->completeURL(url)));
1796 class DelayedGoHistory:
public Window::DelayedAction
1799 DelayedGoHistory(
int _steps): steps(_steps)
1802 bool execute(Window *win)
override
1804 win->goHistory(steps);
1811 void Window::delayedGoHistory(
int steps)
1813 m_delayed.append(
new DelayedGoHistory(steps));
1816 void Window::goHistory(
int steps)
1818 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1838 void KJS::Window::resizeTo(
QWidget *tl,
int width,
int height)
1840 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1853 if (width < 100 || height < 100) {
1875 if (right > sg.
right()) {
1878 if (bottom > sg.
bottom()) {
1879 moveByY = - bottom + sg.
bottom();
1881 if (moveByX || moveByY) {
1886 bool Window::targetIsExistingWindow(
KHTMLPart *ourPart,
const QString &frameName)
1889 if (normalized ==
"_top" || normalized ==
"_self" || normalized ==
"_parent") {
1904 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
1906 return jsUndefined();
1911 if (!v->isUndefinedOrNull()) {
1912 str = v->toString(exec).qstring();
1918 KHTMLPart *p = qobject_cast<KHTMLPart *>(Window::retrieveActive(exec)->m_frame->m_part);
1924 return jsUndefined();
1931 QString frameName = args.
size() > 1 ? args[1]->toString(exec).qstring() :
QString(
"_blank");
1934 if (targetIsExistingWindow(part, frameName)) {
1935 policy = KHTMLSettings::KJSWindowOpenAllow;
1938 if (policy == KHTMLSettings::KJSWindowOpenAsk) {
1944 caption +=
i18n(
"Confirmation: JavaScript Popup");
1947 i18n(
"This site is requesting to open up a new browser "
1948 "window via JavaScript.\n"
1949 "Do you want to allow this?") :
1950 i18n(
"<qt>This site is requesting to open<p>%1</p>in a new browser window via JavaScript.<br />"
1953 policy = KHTMLSettings::KJSWindowOpenAllow;
1955 }
else if (policy == KHTMLSettings::KJSWindowOpenSmart) {
1958 policy = KHTMLSettings::KJSWindowOpenAllow;
1964 if (v && v->type() != UndefinedType && v->toString(exec).size() > 0) {
1965 features = v->toString(exec).qstring();
1973 if (policy != KHTMLSettings::KJSWindowOpenAllow) {
1978 m_suppressedWindowInfo.append(SuppressedWindowInfo(url, frameName, features));
1980 return jsUndefined();
1982 return executeOpenWindow(exec, url, frameName, features);
1988 KHTMLPart *p = qobject_cast<KHTMLPart *>(m_frame->m_part);
1994 static const QRegExp m(
",|\\b\\s+(?!=)");
1999 winargs.setMenuBarVisible(
false);
2000 winargs.setToolBarsVisible(
false);
2001 winargs.setStatusBarVisible(
false);
2002 winargs.setScrollBarsVisible(
false);
2005 while (it != flist.
end()) {
2014 if (key ==
"left" || key ==
"screenx") {
2015 winargs.setX((
int)val.
toFloat() + screen.
x());
2016 if (winargs.x() < screen.
x() || winargs.x() > screen.
right()) {
2017 winargs.setX(screen.
x());
2019 }
else if (key ==
"top" || key ==
"screeny") {
2020 winargs.setY((
int)val.
toFloat() + screen.
y());
2021 if (winargs.y() < screen.
y() || winargs.y() > screen.
bottom()) {
2022 winargs.setY(screen.
y());
2024 }
else if (key ==
"height") {
2026 if (winargs.height() > screen.
height()) {
2027 winargs.setHeight(screen.
height());
2029 if (winargs.height() < 100) {
2030 winargs.setHeight(100);
2032 }
else if (key ==
"width") {
2034 if (winargs.width() > screen.
width()) {
2035 winargs.setWidth(screen.
width());
2037 if (winargs.width() < 100) {
2038 winargs.setWidth(100);
2050 if (key ==
"menubar") {
2051 winargs.setMenuBarVisible(val ==
"1" || val ==
"yes");
2052 }
else if (key ==
"toolbar") {
2053 winargs.setToolBarsVisible(val ==
"1" || val ==
"yes");
2054 }
else if (key ==
"location") {
2055 winargs.setToolBarsVisible(val ==
"1" || val ==
"yes");
2056 }
else if (key ==
"status" || key ==
"statusbar") {
2057 winargs.setStatusBarVisible(val ==
"1" || val ==
"yes");
2058 }
else if (key ==
"scrollbars") {
2059 winargs.setScrollBarsVisible(val ==
"1" || val ==
"yes");
2060 }
else if (key ==
"resizable") {
2061 winargs.setResizable(val ==
"1" || val ==
"yes");
2062 }
else if (key ==
"fullscreen") {
2063 winargs.setFullScreen(val ==
"1" || val ==
"yes");
2076 Window::retrieveWindow(p)->goURL(exec, url.
url());
2077 return Window::retrieve(p);
2083 Window::retrieveWindow(p)->goURL(exec, url.
url());
2084 return Window::retrieve(p);
2087 Window::retrieveWindow(p)->goURL(exec, url.
url());
2088 return Window::retrieve(p);
2091 Window::retrieveWindow(p)->goURL(exec, url.
url(),
true);
2092 return Window::retrieve(p);
2094 args.setMimeType(
"text/html");
2095 args.setActionRequestedByUser(
false);
2100 if (newPart && qobject_cast<KHTMLPart *>(newPart)) {
2103 khtmlpart->setOpener(p);
2104 khtmlpart->setOpenedByJS(
true);
2107 khtmlpart->
write(
"<HTML><BODY>");
2111 khtmlpart->docImpl()->setOrigin(p->docImpl()->origin());
2112 khtmlpart->docImpl()->setBaseURL(p->docImpl()->baseURL());
2122 return Window::retrieve(khtmlpart);
2124 return jsUndefined();
2128 void Window::forgetSuppressedWindows()
2130 m_suppressedWindowInfo.clear();
2133 void Window::showSuppressedWindows()
2135 KHTMLPart *part = qobject_cast<KHTMLPart *>(m_frame->m_part);
2140 m_suppressedWindowInfo.
clear();
2141 foreach (
const SuppressedWindowInfo &info, suppressedWindowInfo) {
2142 executeOpenWindow(exec, info.url, info.frameName, info.features);
2146 class DelayedClose:
public Window::DelayedAction
2149 bool execute(Window *win)
override
2151 win->scheduleClose();
2160 KJS_CHECK_THIS(Window, thisObj);
2164 if (
id == Window::ValueOf ||
id == Window::ToString) {
2165 return jsString(
"[object Window]");
2173 return jsUndefined();
2179 s = v->toString(exec);
2189 case Window::Alert: {
2191 if (!widget->dialogsAllowed()) {
2192 return jsUndefined();
2194 if (part && part->xmlDocImpl()) {
2195 part->xmlDocImpl()->updateRendering();
2201 return jsUndefined();
2203 case Window::Confirm: {
2205 if (!widget->dialogsAllowed()) {
2206 return jsUndefined();
2208 if (part && part->xmlDocImpl()) {
2209 part->xmlDocImpl()->updateRendering();
2217 case Window::Prompt: {
2219 #ifndef KONQ_EMBEDDED
2220 if (!widget->dialogsAllowed()) {
2221 return jsUndefined();
2223 if (part && part->xmlDocImpl()) {
2224 part->xmlDocImpl()->updateRendering();
2230 if (args.
size() >= 2)
2233 args[1]->
toString(exec).qstring(), &ok);
2239 return jsString(
UString(str2));
2244 return jsUndefined();
2247 case Window::GetComputedStyle: {
2248 if (!part || !part->xmlDocImpl()) {
2249 return jsUndefined();
2251 DOM::NodeImpl *arg0 = toNode(args[0]);
2252 if (!arg0 || arg0->nodeType() != DOM::Node::ELEMENT_NODE) {
2253 return jsUndefined();
2255 return getDOMCSSStyleDeclaration(exec, part->xmlDocImpl()->defaultView()->getComputedStyle(
2256 static_cast<DOM::ElementImpl *
>(arg0), args[1]->toString(exec).domString().implementation()));
2259 return window->openWindow(exec, args);
2260 case Window::Close: {
2271 bool doClose =
false;
2272 if (!part->openedByJS()) {
2275 History history(exec, part);
2277 if (history.get(exec,
"length")->toInt32(exec) <= 1) {
2283 i18n(
"Close window?"),
i18n(
"Confirmation Required"),
2297 if (Window::retrieveActive(exec) == window) {
2301 widget->closeChildDialogs();
2306 w->m_delayed.append(
new DelayedClose);
2312 return jsUndefined();
2314 case Window::GetSelection:
2315 return new KJS::DOMSelection(exec, part->xmlDocImpl());
2317 case Window::Navigate:
2319 return jsUndefined();
2320 case Window::Focus: {
2323 if (policy == KHTMLSettings::KJSWindowFocusAllow && widget) {
2333 return jsUndefined();
2337 return jsUndefined();
2339 case Window::AToB: {
2341 return jsUndefined();
2344 char *binData = s.
ascii();
2346 if (
id == Window::AToB) {
2352 for (
int i = 0; i < out.
size(); i++) {
2353 d[i].uc = (uchar) out[i];
2356 return jsString(ret);
2358 case Window::PostMessage: {
2360 if (!part->xmlDocImpl()) {
2361 setDOMException(exec, DOM::DOMException::SECURITY_ERR);
2362 return jsUndefined();
2365 QString sourceOrigin = part->xmlDocImpl()->origin()->toString();
2366 QString targetOrigin = args[1]->toString(exec).qstring();
2367 QUrl targetURL(targetOrigin);
2372 !(targetURL.isValid() && !targetURL.isRelative() && !targetURL.isEmpty())) {
2373 setDOMException(exec, DOM::DOMException::SYNTAX_ERR);
2374 return jsUndefined();
2380 JSValue *payload = cloneData(exec, args[0]);
2383 window->m_delayed.append(
new DelayedPostMessage(part, sourceOrigin, targetOrigin, payload));
2389 if (!
window->isSafeScript(exec)) {
2390 return jsUndefined();
2394 case Window::ScrollBy:
2395 if (args.
size() == 2 && widget) {
2396 widget->
scrollBy(args[0]->toInt32(exec), args[1]->toInt32(exec));
2398 return jsUndefined();
2399 case Window::Scroll:
2400 case Window::ScrollTo:
2401 if (args.
size() == 2 && widget) {
2402 widget->
setContentsPos(args[0]->toInt32(exec), args[1]->toInt32(exec));
2404 return jsUndefined();
2405 case Window::MoveBy: {
2408 if (policy == KHTMLSettings::KJSWindowMoveAllow && args.
size() == 2 && widget) {
2414 QPoint dest = tl->
pos() +
QPoint(args[0]->toInt32(exec), args[1]->toInt32(exec));
2416 if (dest.
x() >= sg.
x() && dest.
y() >= sg.
x() &&
2423 return jsUndefined();
2425 case Window::MoveTo: {
2428 if (policy == KHTMLSettings::KJSWindowMoveAllow && args.
size() == 2 && widget) {
2434 QPoint dest(args[0]->toInt32(exec) + sg.
x(), args[1]->toInt32(exec) + sg.
y());
2436 if (dest.
x() >= sg.
x() && dest.
y() >= sg.
y() &&
2443 return jsUndefined();
2445 case Window::ResizeBy: {
2448 if (policy == KHTMLSettings::KJSWindowResizeAllow
2449 && args.
size() == 2 && widget) {
2453 geom.
width() + args[0]->toInt32(exec),
2454 geom.
height() + args[1]->toInt32(exec));
2456 return jsUndefined();
2458 case Window::ResizeTo: {
2461 if (policy == KHTMLSettings::KJSWindowResizeAllow
2462 && args.
size() == 2 && widget) {
2464 window->resizeTo(tl, args[0]->toInt32(exec), args[1]->toInt32(exec));
2466 return jsUndefined();
2468 case Window::SetTimeout:
2469 case Window::SetInterval: {
2472 if (args.
size() == 0) {
2473 return jsUndefined();
2475 if (args.
size() > 1) {
2476 singleShot = (
id == Window::SetTimeout);
2477 i = args[1]->toInt32(exec);
2483 if (v->type() == StringType) {
2487 JSObject *func = v->getObject();
2491 while (it != args.
end()) {
2497 if (args.
size() < 2) {
2498 funcArgs.
append(jsNumber(i));
2500 int r = (
const_cast<Window *
>(
window))->winq->installTimeout(func, funcArgs, i, singleShot);
2503 return jsUndefined();
2506 case Window::ClearTimeout:
2507 case Window::ClearInterval:
2508 (
const_cast<Window *
>(
window))->winq->clearTimeout(v->toInt32(exec));
2509 return jsUndefined();
2516 case Window::CaptureEvents:
2517 case Window::ReleaseEvents:
2520 case Window::AddEventListener: {
2521 JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);
2525 docimpl->addWindowEventListener(EventName::fromString(args[0]->
toString(exec).domString()), listener, args[2]->toBoolean(exec));
2527 qCWarning(KHTML_LOG) <<
"document missing on Window::AddEventListener. why?";
2530 return jsUndefined();
2532 case Window::RemoveEventListener: {
2533 JSEventListener *listener = Window::retrieveActive(exec)->getJSEventListener(args[1]);
2537 docimpl->removeWindowEventListener(EventName::fromString(args[0]->
toString(exec).domString()), listener, args[2]->toBoolean(exec));
2539 qCWarning(KHTML_LOG) <<
"document missing on Window::RemoveEventListener. why?";
2542 return jsUndefined();
2546 return jsUndefined();
2551 ScheduledAction::ScheduledAction(JSObject *_func,
const List &_args,
const DateTimeMS &_nextTime,
int _interval,
bool _singleShot,
2555 func =
static_cast<JSObject *
>(_func);
2558 singleShot = _singleShot;
2559 nextTime = _nextTime;
2560 interval = _interval;
2565 ScheduledAction::ScheduledAction(
const QString &_code,
const DateTimeMS &_nextTime,
int _interval,
bool _singleShot,
int _timerId)
2573 singleShot = _singleShot;
2574 nextTime = _nextTime;
2575 interval = _interval;
2580 bool ScheduledAction::execute(Window *window)
2588 interpreter->setProcessingTimerCallback(
true);
2592 if (func->implementsCall()) {
2599 JSObject *obj(window);
2600 func->call(exec, obj, args);
2613 interpreter->setProcessingTimerCallback(
false);
2617 void ScheduledAction::mark()
2619 if (func && !func->marked()) {
2624 ScheduledAction::~ScheduledAction()
2632 WindowQObject::WindowQObject(Window *w)
2636 if (!parent->m_frame) {
2639 connect(parent->m_frame, SIGNAL(destroyed()),
2640 this, SLOT(parentDestroyed()));
2643 currentlyDispatching =
false;
2646 WindowQObject::~WindowQObject()
2652 void WindowQObject::parentDestroyed()
2656 while (!scheduledActions.isEmpty()) {
2657 delete scheduledActions.takeFirst();
2659 scheduledActions.clear();
2662 void WindowQObject::pauseTimers()
2665 if (pauseLevel == 1) {
2666 pauseStart = DateTimeMS::now();
2670 void WindowQObject::resumeTimers()
2672 if (pauseLevel == 1) {
2677 DateTimeMS earliestDispatch = curTime.addMSecs(5);
2678 int delay = pauseStart.msecsTo(curTime);
2680 action->nextTime = action->nextTime.addMSecs(delay);
2681 if (earliestDispatch > action->nextTime) {
2682 action->nextTime = earliestDispatch;
2688 timerEvent(
nullptr);
2694 int WindowQObject::installTimeout(
const Identifier &handler,
int t,
bool singleShot)
2696 int id = ++lastTimerId;
2700 DateTimeMS nextTime = DateTimeMS::now().addMSecs(t);
2703 scheduledActions.append(action);
2708 int WindowQObject::installTimeout(
JSValue *func,
List args,
int t,
bool singleShot)
2710 JSObject *objFunc = func->getObject();
2714 int id = ++lastTimerId;
2719 DateTimeMS nextTime = DateTimeMS::now().addMSecs(t);
2721 scheduledActions.append(action);
2726 void WindowQObject::clearTimeout(
int timerId)
2729 if (action->timerId == timerId) {
2730 scheduledActions.removeAll(action);
2731 if (!action->executing) {
2739 bool WindowQObject::hasTimers()
const
2741 return scheduledActions.count();
2744 void WindowQObject::mark()
2755 if (scheduledActions.isEmpty()) {
2763 currentlyDispatching =
true;
2771 if (current >= action->nextTime) {
2772 toExecute.
append(action);
2778 if (!scheduledActions.count(action)) {
2782 action->executing =
true;
2784 if (parent->part()) {
2785 bool ok = action->execute(parent);
2787 scheduledActions.removeAll(action);
2791 if (action->singleShot) {
2792 scheduledActions.removeAll(action);
2795 action->executing =
false;
2797 if (!scheduledActions.count(action)) {
2800 action->nextTime = action->nextTime.addMSecs(action->interval);
2804 currentlyDispatching =
false;
2811 parent->afterScriptExecution();
2820 if (c.mTime < mTime) {
2824 if (c.mTime > mTime) {
2831 bool DateTimeMS::operator >(
const DateTimeMS &other)
const
2833 if (mDate > other.mDate) {
2837 if (mDate < other.mDate) {
2841 return mTime > other.mTime;
2844 bool DateTimeMS::operator >=(
const DateTimeMS &other)
const
2846 if (mDate > other.mDate) {
2850 if (mDate < other.mDate) {
2854 return mTime >= other.mTime;
2857 int DateTimeMS::msecsTo(
const DateTimeMS &other)
const
2859 int d = mDate.
daysTo(other.mDate);
2860 int ms = mTime.
msecsTo(other.mTime);
2861 return d * 24 * 60 * 60 * 1000 + ms;
2870 if (t.mTime < before) {
2876 void WindowQObject::setNextTimer()
2878 if (currentlyDispatching) {
2882 if (scheduledActions.isEmpty()) {
2888 while (it.hasNext()) {
2889 const DateTimeMS &currTime = it.next()->nextTime;
2890 if (nextTime > currTime) {
2891 nextTime = currTime;
2895 int nextInterval = DateTimeMS::now().msecsTo(nextTime);
2896 if (nextInterval < 0) {
2899 timerIds.append(startTimer(nextInterval));
2902 void WindowQObject::killTimers()
2904 for (
int i = 0; i < timerIds.size(); ++i) {
2905 killTimer(timerIds.at(i));
2910 void WindowQObject::timeoutClose()
2917 const ClassInfo Location::info = {
"Location",
nullptr, &LocationTable,
nullptr };
2935 KJS_IMPLEMENT_PROTOFUNC(LocationFunc)
2936 Location::Location(khtml::ChildFrame *f) : m_frame(f)
2941 Location::~Location()
2951 bool Location::getOwnPropertySlot(
ExecState *exec,
const Identifier &p, PropertySlot &slot)
2954 qCDebug(KHTML_LOG) <<
"Location::getOwnPropertySlot " << p.
qstring() <<
" m_part=" << (
void *)m_frame->m_part;
2957 if (m_frame.isNull() || m_frame->m_part.isNull()) {
2958 return jsUndefined();
2961 const HashEntry *entry = Lookup::findEntry(&LocationTable, p);
2965 if (entry->
value == Replace) {
2966 getSlotFromEntry<LocationFunc, Location>(entry,
this, slot);
2971 const Window *
window = Window::retrieveWindow(m_frame->m_part);
2972 if (!window || !
window->isSafeScript(exec)) {
2973 slot.setUndefined(
this);
2978 getSlotFromEntry<LocationFunc, Location>(entry,
this, slot);
2982 return JSObject::getOwnPropertySlot(exec, p, slot);
2987 QUrl url = m_frame->m_part->
url();
2992 return jsString(
"");
2998 if (url.
port() > 0) {
3001 return jsString(str);
3010 return jsString(
"about:blank");
3018 return jsString(
"");
3030 return jsUndefined();
3036 qCDebug(KHTML_LOG) <<
"Location::put " << p.
qstring() <<
" m_part=" << (
void *)m_frame->m_part;
3038 if (m_frame.isNull() || m_frame->m_part.isNull()) {
3042 Window *
window = Window::retrieveWindow(m_frame->m_part);
3047 QUrl url = m_frame->m_part->
url();
3049 const HashEntry *entry = Lookup::findEntry(&LocationTable, p);
3054 if (entry->
value != Href && !
window->isSafeScript(exec)) {
3058 QString str = v->toString(exec).qstring();
3059 switch (entry->
value) {
3061 KHTMLPart *p = qobject_cast<KHTMLPart *>(Window::retrieveActive(exec)->part());
3120 Window *
window = Window::retrieveWindow(m_frame->m_part);
3121 if (window &&
window->isSafeScript(exec)) {
3125 return jsUndefined();
3131 Window *
window = Window::retrieveWindow(m_frame->m_part);
3132 if (window &&
window->isSafeScript(exec)) {
3133 QUrl url = m_frame->m_part->
url();
3135 return "about:blank";
3148 KJS_CHECK_THIS(Location, thisObj);
3153 return jsUndefined();
3158 if (!
window->isSafeScript(exec) &&
id != Location::Replace) {
3159 return jsUndefined();
3163 case Location::Assign:
3166 case Location::Replace:
3169 case Location::Reload: {
3170 KHTMLPart *khtmlpart = qobject_cast<KHTMLPart *>(part);
3178 case Location::ToString:
3181 return jsUndefined();
3186 const ClassInfo External::info = {
"External",
nullptr,
nullptr,
nullptr };
3192 KJS_IMPLEMENT_PROTOFUNC(ExternalFunc)
3194 bool External::getOwnPropertySlot(
ExecState *exec,
const Identifier &p, PropertySlot &propertySlot)
3196 return getStaticFunctionSlot<ExternalFunc, JSObject>(exec, &ExternalTable,
this, p, propertySlot);
3201 KJS_CHECK_THIS(External, thisObj);
3202 External *external =
static_cast<External *
>(thisObj);
3206 return jsUndefined();
3210 case External::AddFavorite: {
3211 #ifndef KONQ_EMBEDDED
3213 if (!widget->dialogsAllowed()) {
3214 return jsUndefined();
3216 part->xmlDocImpl()->updateRendering();
3217 if (args.
size() != 1 && args.
size() != 2) {
3218 return jsUndefined();
3221 QString url = args[0]->toString(exec).qstring();
3223 if (args.
size() == 2) {
3224 title = args[1]->toString(exec).qstring();
3229 return jsUndefined();
3233 question =
i18n(
"Do you want a bookmark pointing to the location \"%1\" to be added to your collection?",
3236 question =
i18n(
"Do you want a bookmark pointing to the location \"%1\" titled \"%2\" to be added to your collection?",
3245 caption +=
i18n(
"JavaScript Attempted Bookmark Insert");
3248 widget, question, caption,
3252 dlg.addBookmark(title,
QUrl(url), KIO::iconNameForUrl(
QUrl(url)));
3255 return jsUndefined();
3260 return jsUndefined();
3263 return jsUndefined();
3268 const ClassInfo History::info = {
"History",
nullptr,
nullptr,
nullptr };
3277 KJS_IMPLEMENT_PROTOFUNC(HistoryFunc)
3279 bool History::getOwnPropertySlot(
ExecState *exec,
const Identifier &p, PropertySlot &slot)
3281 return getStaticPropertySlot<HistoryFunc, History, JSObject>(exec, &HistoryTable,
this, p, slot);
3310 return jsNumber(length.
toUInt());
3314 return jsUndefined();
3320 KJS_CHECK_THIS(History, thisObj);
3321 History *history =
static_cast<History *
>(thisObj);
3326 n = v->toInteger(exec);
3334 case History::Forward:
3341 return jsUndefined();
3349 history->part->openUrl(history->part->url());
3353 Window *
window = Window::retrieveWindow(history->part);
3354 window->delayedGoHistory(steps);
3356 return jsUndefined();
3361 #include "moc_kjs_window.cpp"