JavaScriptCore
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Oct 2004 22:43:55 +0000 (22:43 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Oct 2004 22:43:55 +0000 (22:43 +0000)
        Fixed access to DOM object via WebScriptObject API.
        The execution context for DOM objects wasn't being found.
        <rdar://problem/3831372> The valueForKey method for @"offsetLeft" on a paragraph element causes a crash.

        Reviewed by Chris.

        * bindings/objc/WebScriptObject.mm:
        (_didExecute):
        (-[WebScriptObject KJS::Bindings::]):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject stringRepresentation]):
        * bindings/objc/WebScriptObjectPrivate.h:

WebCore:
        Fixed access to DOM object via WebScriptObject API.
        The execution context for DOM objects wasn't being found.
        <rdar://problem/3831372> The valueForKey method for @"offsetLeft" on a paragraph element causes a crash.
        Reviewed by Chris

        Fixed <rdar://problem/3831063> regions use left offset instead of top offset
Reviewed by John

        * khtml/khtml_part.h:
        * khtml/rendering/render_object.cpp:
        (RenderObject::addDashboardRegions):
        * kwq/DOM.mm:
        (-[DOMNode isContentEditable]):
        (-[DOMNode KJS::Bindings::]):
        * kwq/KWQKHTMLPart.h:
        * kwq/KWQKHTMLPart.mm:
        (KWQKHTMLPart::executionContextForDOM):

WebBrowser:
        Added debugging code (disable) to assist in debugging DOM/WebScriptObjects.

        Reviewed by Chris.

        * LocationChangeHandler.m:
        (-[Logger logMessage:]):
        (-[LocationChangeHandler webView:locationChangeDone:forDataSource:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7820 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/bindings/objc/WebScriptObject.mm
JavaScriptCore/bindings/objc/WebScriptObjectPrivate.h
WebCore/ChangeLog-2005-08-23
WebCore/khtml/khtml_part.h
WebCore/khtml/rendering/render_object.cpp
WebCore/kwq/DOM.mm
WebCore/kwq/KWQKHTMLPart.h
WebCore/kwq/KWQKHTMLPart.mm

index db26d69e48ca0cdb67da51f3d81ffdfadffb6022..8497d28975bfab7e55364c094de8c1ef565f4328 100644 (file)
@@ -1,3 +1,21 @@
+2004-10-12  Richard Williamson   <rjw@apple.com>
+
+        Fixed access to DOM object via WebScriptObject API.
+        The execution context for DOM objects wasn't being found.      
+        <rdar://problem/3831372> The valueForKey method for @"offsetLeft" on a paragraph element causes a crash.
+
+        Reviewed by Chris.
+
+        * bindings/objc/WebScriptObject.mm:
+        (_didExecute):
+        (-[WebScriptObject KJS::Bindings::]):
+        (-[WebScriptObject callWebScriptMethod:withArguments:]):
+        (-[WebScriptObject evaluateWebScript:]):
+        (-[WebScriptObject setValue:forKey:]):
+        (-[WebScriptObject valueForKey:]):
+        (-[WebScriptObject stringRepresentation]):
+        * bindings/objc/WebScriptObjectPrivate.h:
+
 2004-10-09  Darin Adler  <darin@apple.com>
 
         Reviewed by Kevin.
index c07d624bca3fc35f4fa7f625bfb2d4025dd37024..690c5998bb27b6382ddacb569b75e603c97ca92e 100644 (file)
@@ -49,7 +49,7 @@ using namespace KJS::Bindings;
 
 #define LOG_EXCEPTION(exec) \
     if (Interpreter::shouldPrintExceptions()) \
-        NSLog (@"%s:%d:  JavaScript exception:  %s\n", __FILE__, __LINE__, exec->exception().toObject(exec).get(exec, messagePropertyName).toString(exec).ascii());
+        NSLog (@"%s:%d:[%d]  JavaScript exception:  %s\n", __FILE__, __LINE__, getpid(), exec->exception().toObject(exec).get(exec, messagePropertyName).toString(exec).ascii());
 
 @implementation WebScriptObjectPrivate
 
@@ -59,10 +59,10 @@ using namespace KJS::Bindings;
 
 static void _didExecute(WebScriptObject *obj)
 {
-    ExecState *exec = obj->_private->root->interpreter()->globalExec();
+    ExecState *exec = [obj _executionContext]->interpreter()->globalExec();
     KJSDidExecuteFunctionPtr func = Instance::didExecuteFunction();
     if (func)
-        func (exec, static_cast<KJS::ObjectImp*>(obj->_private->root->rootObjectImp()));
+        func (exec, static_cast<KJS::ObjectImp*>([obj _executionContext]->rootObjectImp()));
 }
 
 - (void)_initializeWithObjectImp:(KJS::ObjectImp *)imp root:(const Bindings::RootObject *)root
@@ -97,6 +97,11 @@ static void _didExecute(WebScriptObject *obj)
     return _private->imp;
 }
 
+- (const KJS::Bindings::RootObject *)_executionContext
+{
+    return _private->root;
+}
+
 - (void)dealloc
 {
     removeNativeReference(_private->imp);
@@ -149,8 +154,11 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (id)callWebScriptMethod:(NSString *)name withArguments:(NSArray *)args
 {
+    if (![self _executionContext])
+        return nil;
+
     // Lookup the function object.
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     
     Value v = convertObjcValueToValue(exec, &name, ObjcObjectType);
@@ -176,7 +184,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     }
 
     // Convert and return the result of the function call.
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:_private->root];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
 
     _didExecute(self);
         
@@ -185,14 +193,17 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (id)evaluateWebScript:(NSString *)script
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return nil;
+
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Object thisObj = Object(const_cast<ObjectImp*>([self _imp]));
     Value result;
     
     Interpreter::lock();
     
     Value v = convertObjcValueToValue(exec, &script, ObjcObjectType);
-    Completion completion = _private->root->interpreter()->evaluate(UString(), 0, v.toString(exec));
+    Completion completion = [self _executionContext]->interpreter()->evaluate(UString(), 0, v.toString(exec));
     ComplType type = completion.complType();
     
     if (type == Normal) {
@@ -211,7 +222,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         result = Undefined();
     }
 
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:_private->root];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
 
     _didExecute(self);
     
@@ -220,7 +231,10 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (void)setValue:(id)value forKey:(NSString *)key
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return;
+
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     Value v = convertObjcValueToValue(exec, &key, ObjcObjectType);
     [self _imp]->put (exec, Identifier (v.toString(exec)), (convertObjcValueToValue(exec, &value, ObjcObjectType)));
@@ -235,7 +249,10 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (id)valueForKey:(NSString *)key
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return nil;
+        
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     Value v = convertObjcValueToValue(exec, &key, ObjcObjectType);
     Value result = [self _imp]->get (exec, Identifier (v.toString(exec)));
@@ -246,7 +263,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         result = Undefined();
     }
 
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:_private->root];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
 
     _didExecute(self);
     
@@ -255,7 +272,10 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (void)removeWebScriptKey:(NSString *)key;
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return;
+        
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     Value v = convertObjcValueToValue(exec, &key, ObjcObjectType);
     [self _imp]->deleteProperty (exec, Identifier (v.toString(exec)));
@@ -272,7 +292,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 {
     Interpreter::lock();
     Object thisObj = Object(const_cast<ObjectImp*>([self _imp]));
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     
     id result = convertValueToObjcValue(exec, thisObj, ObjcObjectType).objectValue;
 
@@ -287,7 +307,10 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (id)webScriptValueAtIndex:(unsigned int)index;
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return nil;
+
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     Value result = [self _imp]->get (exec, (unsigned)index);
     Interpreter::unlock();
@@ -297,7 +320,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         result = Undefined();
     }
 
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:_private->root];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
 
     _didExecute(self);
 
@@ -306,7 +329,10 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (void)setWebScriptValueAtIndex:(unsigned int)index value:(id)value;
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return;
+
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     [self _imp]->put (exec, (unsigned)index, (convertObjcValueToValue(exec, &value, ObjcObjectType)));
     Interpreter::unlock();
@@ -320,7 +346,10 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (void)setException: (NSString *)description;
 {
-    ExecState *exec = _private->root->interpreter()->globalExec();
+    if (![self _executionContext])
+        return;
+
+    ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Object err = Error::create(exec, GeneralError, [description UTF8String]);
     exec->setException (err);
 }
index e72b708cc44debef9a793db3954282989cfd2af5..3419cfcb871c6c75203ed9670ebb68d3160c16e4 100644 (file)
@@ -19,6 +19,7 @@
 - (void)_initializeWithObjectImp:(KJS::ObjectImp *)imp root:(const KJS::Bindings::RootObject *)root;
 - (void)_initializeScriptDOMNodeImp;
 - (KJS::ObjectImp *)_imp;
+- (const KJS::Bindings::RootObject *)_executionContext;
 @end
 
 @interface WebScriptObjectPrivate : NSObject
index c5f8e0c8c92be6462ed73297137edec8d431a39f..3ad605fac7eb0b913f7b5b57ab6ac95164ec22b8 100644 (file)
@@ -1,3 +1,23 @@
+2004-10-12  Richard Williamson   <rjw@apple.com>
+
+        Fixed access to DOM object via WebScriptObject API.
+        The execution context for DOM objects wasn't being found.      
+        <rdar://problem/3831372> The valueForKey method for @"offsetLeft" on a paragraph element causes a crash.
+        Reviewed by Chris
+
+        Fixed <rdar://problem/3831063> regions use left offset instead of top offset
+       Reviewed by John
+
+        * khtml/khtml_part.h:
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::addDashboardRegions):
+        * kwq/DOM.mm:
+        (-[DOMNode isContentEditable]):
+        (-[DOMNode KJS::Bindings::]):
+        * kwq/KWQKHTMLPart.h:
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::executionContextForDOM):
+
 2004-10-12  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Hyatt
index 72b7e7f5a428f82a68c01ccd43fc0619b6368ed2..d94a6294127723194ee35f4579ff58e3d9e8946e 100644 (file)
@@ -1263,9 +1263,11 @@ private:
 #if APPLE_CHANGES
   public:
 #endif
+
   DOM::HTMLDocumentImpl *docImpl() const;
   DOM::DocumentImpl *xmlDocImpl() const;
   void replaceDocImpl(DOM::DocumentImpl* newDoc);
+  
 #if APPLE_CHANGES
   private:
 #endif
index 3ff7cfb04299b852f5836eaa32819b656a182237..ec1da91a2a12afa5637426ee9e12891d4a381860 100644 (file)
@@ -2257,7 +2257,7 @@ void RenderObject::addDashboardRegions (QValueList<DashboardRegionValue>& region
             int x, y;
             absolutePosition (x, y);
             region.bounds.setX (x + styleRegion.offset.left.value);
-            region.bounds.setY (y + styleRegion.offset.left.value);
+            region.bounds.setY (y + styleRegion.offset.top.value);
             
             regions.append (region);
         }
index d0bba23cf975de0520bb059e1e0bfa552060ab73..ebf883e62e956e6bdeb6f9d3b7c180af3dccb88f 100644 (file)
 #import "html_elementimpl.h"
 #import "htmltags.h"
 
+#import "khtml_part.h"
+
 #import "DOMEventsInternal.h"
 #import "DOMHTML.h"
 #import "DOMInternal.h"
 #import "DOMPrivate.h"
 #import "KWQAssertions.h"
 #import "KWQFoundationExtras.h"
+#import "KWQKHTMLPart.h"
 
 using DOM::Attr;
 using DOM::AttrImpl;
@@ -611,6 +614,23 @@ inline Document DocumentImpl::createInstance(DocumentImpl *impl)
     return [self _nodeImpl]->isContentEditable();
 }
 
+- (const KJS::Bindings::RootObject *)_executionContext
+{
+    NodeImpl *n = [self _nodeImpl];
+    if (!n)
+        return 0;
+    
+    DocumentImpl *doc = n->getDocument();
+    if (!doc)
+        return 0;
+    
+    KWQKHTMLPart *p = KWQ(doc->part());
+    if (!p)
+        return 0;
+        
+    return p->executionContextForDOM();
+}
+
 @end
 
 //------------------------------------------------------------------------------------------
index 0d0305d2b01f3911cb7d67d9cd232bf8c86c0301..9cb934ce99facba1cc1a39fc623576083ddbd689 100644 (file)
@@ -338,6 +338,7 @@ public:
     bool shouldBeginEditing(const DOM::Range &) const;
     bool shouldEndEditing(const DOM::Range &) const;
 
+    KJS::Bindings::RootObject *executionContextForDOM();
     KJS::Bindings::RootObject *bindingRootObject();
     
     WebScriptObject *windowScriptObject();
index 15a3f93ee740425dc39a94dc8277e4f92b3e37c5..1ffb7c985b5feeb4434028a8b9476ce2d966b192 100644 (file)
@@ -1368,6 +1368,11 @@ bool KWQKHTMLPart::tabsToAllControls() const
     return handlingOptionTab;
 }
 
+KJS::Bindings::RootObject *KWQKHTMLPart::executionContextForDOM()
+{
+    return bindingRootObject();
+}
+
 KJS::Bindings::RootObject *KWQKHTMLPart::bindingRootObject()
 {
     if (!_bindingRoot) {