[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