[webkit-changes] cvs commit: WebCore/kwq KWQKHTMLPart.h
KWQKHTMLPart.mm WebCoreBridge.h WebCoreBridge.mm
Vicki
vicki at opensource.apple.com
Fri Nov 18 17:26:51 PST 2005
vicki 05/11/18 17:26:51
Modified: . ChangeLog
khtml/ecma kjs_events.cpp kjs_window.cpp kjs_window.h
khtml/html html_baseimpl.cpp htmlnames.h
khtml/xml EventNames.h dom2_eventsimpl.cpp dom2_eventsimpl.h
kwq KWQKHTMLPart.h KWQKHTMLPart.mm WebCoreBridge.h
WebCoreBridge.mm
Log:
Changes by Darin, reviewed by Beth and Vicki.
- fix <rdar://problem/3939265> support "before unload" event and onbeforeunload handler (supported by both IE and Mozilla)
* khtml/ecma/kjs_events.cpp:
(KJS::JSAbstractEventListener::handleEvent):
* khtml/ecma/kjs_window.cpp:
(KJS::Window::getValueProperty):
(KJS::Window::put):
* khtml/ecma/kjs_window.h:
(KJS::Window::):
* khtml/html/html_baseimpl.cpp:
(HTMLBodyElementImpl::parseMappedAttribute):
(HTMLFrameElementImpl::parseMappedAttribute):
(HTMLFrameSetElementImpl::parseMappedAttribute):
* khtml/html/htmlnames.h:
* khtml/xml/EventNames.h:
* khtml/xml/dom2_eventsimpl.cpp:
(DOM::EventImpl::storesResultAsString):
(DOM::EventImpl::storeResult):
(DOM::BeforeUnloadEventImpl::BeforeUnloadEventImpl):
(DOM::BeforeUnloadEventImpl::storesResultAsString):
(DOM::BeforeUnloadEventImpl::storeResult):
* khtml/xml/dom2_eventsimpl.h:
(DOM::BeforeUnloadEventImpl::result):
* kwq/KWQKHTMLPart.h:
* kwq/KWQKHTMLPart.mm:
(KWQKHTMLPart::shouldClose):
* kwq/WebCoreBridge.h:
* kwq/WebCoreBridge.mm:
(-[WebCoreBridge shouldClose]):
Revision Changes Path
1.383 +34 -0 WebCore/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/WebCore/ChangeLog,v
retrieving revision 1.382
retrieving revision 1.383
diff -u -r1.382 -r1.383
--- ChangeLog 18 Nov 2005 23:42:02 -0000 1.382
+++ ChangeLog 19 Nov 2005 01:26:40 -0000 1.383
@@ -1,3 +1,37 @@
+2005-11-18 Vicki Murley <vicki at apple.com>
+
+ Changes by Darin, reviewed by Beth and Vicki.
+
+ - fix <rdar://problem/3939265> support "before unload" event and onbeforeunload handler (supported by both IE and Mozilla)
+
+ * khtml/ecma/kjs_events.cpp:
+ (KJS::JSAbstractEventListener::handleEvent):
+ * khtml/ecma/kjs_window.cpp:
+ (KJS::Window::getValueProperty):
+ (KJS::Window::put):
+ * khtml/ecma/kjs_window.h:
+ (KJS::Window::):
+ * khtml/html/html_baseimpl.cpp:
+ (HTMLBodyElementImpl::parseMappedAttribute):
+ (HTMLFrameElementImpl::parseMappedAttribute):
+ (HTMLFrameSetElementImpl::parseMappedAttribute):
+ * khtml/html/htmlnames.h:
+ * khtml/xml/EventNames.h:
+ * khtml/xml/dom2_eventsimpl.cpp:
+ (DOM::EventImpl::storesResultAsString):
+ (DOM::EventImpl::storeResult):
+ (DOM::BeforeUnloadEventImpl::BeforeUnloadEventImpl):
+ (DOM::BeforeUnloadEventImpl::storesResultAsString):
+ (DOM::BeforeUnloadEventImpl::storeResult):
+ * khtml/xml/dom2_eventsimpl.h:
+ (DOM::BeforeUnloadEventImpl::result):
+ * kwq/KWQKHTMLPart.h:
+ * kwq/KWQKHTMLPart.mm:
+ (KWQKHTMLPart::shouldClose):
+ * kwq/WebCoreBridge.h:
+ * kwq/WebCoreBridge.mm:
+ (-[WebCoreBridge shouldClose]):
+
2005-11-18 Beth Dakin <bdakin at apple.com>
Reviewed by Darin.
1.69 +9 -5 WebCore/khtml/ecma/kjs_events.cpp
Index: kjs_events.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/ecma/kjs_events.cpp,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- kjs_events.cpp 26 Oct 2005 07:23:39 -0000 1.68
+++ kjs_events.cpp 19 Nov 2005 01:26:44 -0000 1.69
@@ -131,7 +131,7 @@
retval = handleEventFunc->call(exec, listener, args);
else
retval = listener->call(exec, thisObj, args);
-
+
window->setCurrentEvent( 0 );
interpreter->setCurrentEvent( 0 );
if ( exec->hadException() ) {
@@ -151,10 +151,14 @@
if (Interpreter::shouldPrintExceptions())
printf("(event handler):%s\n", message);
exec->clearException();
- } else if (html) {
- QVariant ret = ValueToVariant(exec, retval);
- if (ret.type() == QVariant::Bool && ret.toBool() == false)
- evt->preventDefault();
+ } else {
+ if (!retval->isUndefinedOrNull() && evt->storesResultAsString())
+ evt->storeResult(retval->toString(exec).domString());
+ if (html) {
+ QVariant ret = ValueToVariant(exec, retval);
+ if (ret.type() == QVariant::Bool && ret.toBool() == false)
+ evt->preventDefault();
+ }
}
DOM::DocumentImpl::updateDocumentsRendering();
1.188 +7 -1 WebCore/khtml/ecma/kjs_window.cpp
Index: kjs_window.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/ecma/kjs_window.cpp,v
retrieving revision 1.187
retrieving revision 1.188
diff -u -r1.187 -r1.188
--- kjs_window.cpp 9 Nov 2005 02:46:27 -0000 1.187
+++ kjs_window.cpp 19 Nov 2005 01:26:44 -0000 1.188
@@ -949,7 +949,9 @@
return getListener(exec,selectEvent);
case Onsubmit:
return getListener(exec,submitEvent);
- case Onunload:
+ case Onbeforeunload:
+ return getListener(exec, beforeunloadEvent);
+ case Onunload:
return getListener(exec,scrollEvent);
}
assert(0);
@@ -1236,6 +1238,10 @@
if (isSafeScript(exec))
setListener(exec,submitEvent,value);
return;
+ case Onbeforeunload:
+ if (isSafeScript(exec))
+ setListener(exec, beforeunloadEvent, value);
+ return;
case Onunload:
if (isSafeScript(exec))
setListener(exec,scrollEvent,value);
1.57 +1 -1 WebCore/khtml/ecma/kjs_window.h
Index: kjs_window.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/ecma/kjs_window.h,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -r1.56 -r1.57
--- kjs_window.h 9 Nov 2005 02:46:27 -0000 1.56
+++ kjs_window.h 19 Nov 2005 01:26:45 -0000 1.57
@@ -151,7 +151,7 @@
Onabort, Onblur, Onchange, Onclick, Ondblclick, Ondragdrop, Onerror,
Onfocus, Onkeydown, Onkeypress, Onkeyup, Onload, Onmousedown, Onmousemove,
Onmouseout, Onmouseover, Onmouseup, OnWindowMouseWheel, Onmove, Onreset, Onresize, Onscroll, Onsearch,
- Onselect, Onsubmit, Onunload,
+ Onselect, Onsubmit, Onunload, Onbeforeunload,
Statusbar, Toolbar, FrameElement, ShowModalDialog };
protected:
ValueImp *getListener(ExecState *exec, const DOM::AtomicString &eventType) const;
1.84 +9 -0 WebCore/khtml/html/html_baseimpl.cpp
Index: html_baseimpl.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/html/html_baseimpl.cpp,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -r1.83 -r1.84
--- html_baseimpl.cpp 8 Nov 2005 08:10:57 -0000 1.83
+++ html_baseimpl.cpp 19 Nov 2005 01:26:46 -0000 1.84
@@ -154,6 +154,9 @@
} else if (attr->name() == onloadAttr) {
getDocument()->setHTMLWindowEventListener(loadEvent,
getDocument()->createHTMLEventListener(attr->value().qstring(), NULL));
+ } else if (attr->name() == onbeforeunloadAttr) {
+ getDocument()->setHTMLWindowEventListener(beforeunloadEvent,
+ getDocument()->createHTMLEventListener(attr->value().qstring(), NULL));
} else if (attr->name() == onunloadAttr) {
getDocument()->setHTMLWindowEventListener(unloadEvent,
getDocument()->createHTMLEventListener(attr->value().qstring(), NULL));
@@ -423,6 +426,9 @@
} else if (attr->name() == onloadAttr) {
setHTMLEventListener(loadEvent,
getDocument()->createHTMLEventListener(attr->value().qstring(), this));
+ } else if (attr->name() == onbeforeunloadAttr) {
+ setHTMLEventListener(beforeunloadEvent,
+ getDocument()->createHTMLEventListener(attr->value().qstring(), this));
} else if (attr->name() == onunloadAttr) {
setHTMLEventListener(unloadEvent,
getDocument()->createHTMLEventListener(attr->value().qstring(), this));
@@ -707,6 +713,9 @@
} else if (attr->name() == onloadAttr) {
setHTMLEventListener(loadEvent,
getDocument()->createHTMLEventListener(attr->value().qstring(), this));
+ } else if (attr->name() == onbeforeunloadAttr) {
+ setHTMLEventListener(beforeunloadEvent,
+ getDocument()->createHTMLEventListener(attr->value().qstring(), this));
} else if (attr->name() == onunloadAttr) {
setHTMLEventListener(unloadEvent,
getDocument()->createHTMLEventListener(attr->value().qstring(), this));
1.9 +1 -0 WebCore/khtml/html/htmlnames.h
Index: htmlnames.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/html/htmlnames.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- htmlnames.h 10 Sep 2005 06:10:08 -0000 1.8
+++ htmlnames.h 19 Nov 2005 01:26:46 -0000 1.9
@@ -224,6 +224,7 @@
macro(onbeforecopy) \
macro(onbeforecut) \
macro(onbeforepaste) \
+ macro(onbeforeunload) \
macro(onblur) \
macro(onchange) \
macro(onclick) \
1.3 +1 -0 WebCore/khtml/xml/EventNames.h
Index: EventNames.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/EventNames.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- EventNames.h 3 Sep 2005 23:10:01 -0000 1.2
+++ EventNames.h 19 Nov 2005 01:26:46 -0000 1.3
@@ -59,6 +59,7 @@
macro(mouseover) \
macro(mouseup) \
macro(mousewheel) \
+ macro(beforeunload) \
macro(paste) \
macro(readystatechange) \
macro(reset) \
1.41 +26 -0 WebCore/khtml/xml/dom2_eventsimpl.cpp
Index: dom2_eventsimpl.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom2_eventsimpl.cpp,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- dom2_eventsimpl.cpp 25 Oct 2005 16:39:25 -0000 1.40
+++ dom2_eventsimpl.cpp 19 Nov 2005 01:26:46 -0000 1.41
@@ -128,6 +128,15 @@
return false;
}
+bool EventImpl::storesResultAsString() const
+{
+ return false;
+}
+
+void EventImpl::storeResult(const DOMString&)
+{
+}
+
// -----------------------------------------------------------------------------
UIEventImpl::UIEventImpl()
@@ -572,4 +581,21 @@
{
}
+// -----------------------------------------------------------------------------
+
+BeforeUnloadEventImpl::BeforeUnloadEventImpl()
+ : EventImpl(beforeunloadEvent, false, false)
+{
+}
+
+bool BeforeUnloadEventImpl::storesResultAsString() const
+{
+ return true;
+}
+
+void BeforeUnloadEventImpl::storeResult(const DOMString& s)
+{
+ m_result = s.impl();
+}
+
}
1.34 +17 -0 WebCore/khtml/xml/dom2_eventsimpl.h
Index: dom2_eventsimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom2_eventsimpl.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- dom2_eventsimpl.h 25 Oct 2005 16:39:25 -0000 1.33
+++ dom2_eventsimpl.h 19 Nov 2005 01:26:47 -0000 1.34
@@ -81,6 +81,9 @@
void setDefaultPrevented(bool defaultPrevented) { m_defaultPrevented = defaultPrevented; }
bool getCancelBubble() const { return m_cancelBubble; }
+ virtual bool storesResultAsString() const;
+ virtual void storeResult(const DOMString&);
+
protected:
bool dispatched() const { return m_target; }
@@ -400,6 +403,20 @@
virtual void setDragImageElement(NodeImpl *, const QPoint &) = 0;
};
+class BeforeUnloadEventImpl : public EventImpl
+{
+public:
+ BeforeUnloadEventImpl();
+
+ virtual bool storesResultAsString() const;
+ virtual void storeResult(const DOMString&);
+
+ DOMString result() const { return m_result.get(); }
+
+private:
+ SharedPtr<DOMStringImpl> m_result;
+};
+
} // namespace
#endif
1.233 +2 -0 WebCore/kwq/KWQKHTMLPart.h
Index: KWQKHTMLPart.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQKHTMLPart.h,v
retrieving revision 1.232
retrieving revision 1.233
diff -u -r1.232 -r1.233
--- KWQKHTMLPart.h 9 Nov 2005 02:46:28 -0000 1.232
+++ KWQKHTMLPart.h 19 Nov 2005 01:26:47 -0000 1.233
@@ -204,6 +204,8 @@
bool statusbarVisible();
bool toolbarVisible();
+ bool shouldClose();
+
void KWQKHTMLPart::addMessageToConsole(const QString &message, unsigned int lineNumber, const QString &sourceID);
using KHTMLPart::xmlDocImpl;
khtml::RenderObject *renderer() const;
1.689 +36 -23 WebCore/kwq/KWQKHTMLPart.mm
Index: KWQKHTMLPart.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQKHTMLPart.mm,v
retrieving revision 1.688
retrieving revision 1.689
diff -u -r1.688 -r1.689
--- KWQKHTMLPart.mm 17 Nov 2005 01:04:34 -0000 1.688
+++ KWQKHTMLPart.mm 19 Nov 2005 01:26:47 -0000 1.689
@@ -88,29 +88,9 @@
#undef _KWQ_TIMING
-using namespace DOM::EventNames;
-using namespace DOM::HTMLNames;
-
-using DOM::AtomicString;
-using DOM::ClipboardEventImpl;
-using DOM::DocumentFragmentImpl;
-using DOM::DocumentImpl;
-using DOM::DocumentMarker;
-using DOM::DOMString;
-using DOM::ElementImpl;
-using DOM::EventImpl;
-using DOM::HTMLDocumentImpl;
-using DOM::HTMLElementImpl;
-using DOM::HTMLFormElementImpl;
-using DOM::HTMLFrameElementImpl;
-using DOM::HTMLGenericFormElementImpl;
-using DOM::HTMLTableCellElementImpl;
-using DOM::Node;
-using DOM::NodeImpl;
-using DOM::Position;
-using DOM::Range;
-using DOM::RangeImpl;
-using DOM::TextImpl;
+using namespace DOM;
+using namespace EventNames;
+using namespace HTMLNames;
using khtml::Cache;
using khtml::CharacterIterator;
@@ -4378,3 +4358,36 @@
{
[_bridge handledOnloadEvents];
}
+
+bool KWQKHTMLPart::shouldClose()
+{
+ KWQ_BLOCK_EXCEPTIONS;
+
+ if (![_bridge canRunBeforeUnloadConfirmPanel])
+ return true;
+
+ SharedPtr<DocumentImpl> document = xmlDocImpl();
+ if (!document)
+ return true;
+ HTMLElementImpl* body = document->body();
+ if (!body)
+ return true;
+
+ SharedPtr<BeforeUnloadEventImpl> event = new BeforeUnloadEventImpl;
+ event->setTarget(document.get());
+ int exception = 0;
+ body->dispatchGenericEvent(event.get(), exception);
+ if (!event->defaultPrevented() && document)
+ document->defaultEventHandler(event.get());
+ if (event->result().isNull())
+ return true;
+
+ QString text = event->result().qstring();
+ text.replace(QChar('\\'), backslashAsCurrencySymbol());
+
+ return [_bridge runBeforeUnloadConfirmPanelWithMessage:text.getNSString()];
+
+ KWQ_UNBLOCK_EXCEPTIONS;
+
+ return true;
+}
1.349 +3 -0 WebCore/kwq/WebCoreBridge.h
Index: WebCoreBridge.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/WebCoreBridge.h,v
retrieving revision 1.348
retrieving revision 1.349
diff -u -r1.348 -r1.349
--- WebCoreBridge.h 24 Sep 2005 01:19:05 -0000 1.348
+++ WebCoreBridge.h 19 Nov 2005 01:26:48 -0000 1.349
@@ -368,6 +368,7 @@
- (int)numPendingOrLoadingRequests;
- (BOOL)doneProcessingData;
+- (BOOL)shouldClose;
- (void)setDrawsBackground:(BOOL)drawsBackround;
@@ -520,6 +521,8 @@
- (void)runJavaScriptAlertPanelWithMessage:(NSString *)message;
- (BOOL)runJavaScriptConfirmPanelWithMessage:(NSString *)message;
- (BOOL)runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText returningText:(NSString **)result;
+- (BOOL)canRunBeforeUnloadConfirmPanel;
+- (BOOL)runBeforeUnloadConfirmPanelWithMessage:(NSString *)message;
- (void)addMessageToConsole:(NSDictionary *)message;
- (id <WebCoreResourceHandle>)startLoadingResource:(id <WebCoreResourceLoader>)loader withURL:(NSURL *)URL customHeaders:(NSDictionary *)customHeaders;
1.432 +5 -0 WebCore/kwq/WebCoreBridge.mm
Index: WebCoreBridge.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/WebCoreBridge.mm,v
retrieving revision 1.431
retrieving revision 1.432
diff -u -r1.431 -r1.432
--- WebCoreBridge.mm 15 Nov 2005 22:53:44 -0000 1.431
+++ WebCoreBridge.mm 19 Nov 2005 01:26:48 -0000 1.432
@@ -1466,6 +1466,11 @@
return YES;
}
+- (BOOL)shouldClose
+{
+ return _part->shouldClose();
+}
+
- (NSColor *)bodyBackgroundColor
{
return _part->bodyBackgroundColor();
More information about the webkit-changes
mailing list