WebCore:
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Jan 2005 22:41:22 +0000 (22:41 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Jan 2005 22:41:22 +0000 (22:41 +0000)
Fixed <rdar://problem/3753030> Need to ensure same origin for plugin binding invocations (origin security rules)

Keep track of originating execution context and target execution
context for native JS object wrappers, and perform appropriate
security checks.

        Reviewed by David Harrison.

        * khtml/ecma/kjs_binding.cpp:
        (ScriptInterpreter::isGlobalObject):
        (ScriptInterpreter::isSafeScript):
        (ScriptInterpreter::interpreterForGlobalObject):
        * khtml/ecma/kjs_binding.h:
        * khtml/ecma/kjs_window.cpp:
        (Window::interpreter):
        (Window::isSafeScript):
        * khtml/ecma/kjs_window.h:
        * kwq/DOMInternal.mm:
        (-[WebScriptObject _initializeScriptDOMNodeImp]):
        * kwq/KWQKHTMLPart.mm:
        (KWQKHTMLPart::windowScriptObject):
        (KWQKHTMLPart::windowScriptNPObject):
        * kwq/WebCoreBridge.mm:
        (rootForView):
        (-[WebCoreBridge init]):

JavaScriptCore:
Fixed <rdar://problem/3753030> Need to ensure same origin for plugin binding invocations (origin security rules)

Keep track of originating execution context and target execution
context for native JS object wrappers, and perform appropriate
security checks.

        Reviewed by David Harrison.

        * bindings/NP_jsobject.cpp:
        (_isSafeScript):
        (_NPN_CreateScriptObject):
        (_NPN_Invoke):
        (_NPN_Evaluate):
        (_NPN_GetProperty):
        (_NPN_SetProperty):
        (_NPN_RemoveProperty):
        (_NPN_HasProperty):
        (_NPN_HasMethod):
        (_NPN_SetException):
        * bindings/NP_jsobject.h:
        * bindings/c/c_instance.cpp:
        (CInstance::CInstance):
        (CInstance::stringValue):
        * bindings/c/c_instance.h:
        * bindings/c/c_utility.cpp:
        (convertValueToNPVariant):
        * bindings/jni/jni_instance.cpp:
        (JavaInstance::JavaInstance):
        (JavaInstance::valueOf):
        * bindings/jni/jni_instance.h:
        * bindings/objc/WebScriptObject.mm:
        (-[WebScriptObject _initializeWithObjectImp:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        (-[WebScriptObject _initWithObjectImp:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        (-[WebScriptObject KJS::Bindings::]):
        (-[WebScriptObject _setOriginExecutionContext:KJS::Bindings::]):
        (-[WebScriptObject _isSafeScript]):
        (-[WebScriptObject callWebScriptMethod:withArguments:]):
        (-[WebScriptObject evaluateWebScript:]):
        (-[WebScriptObject setValue:forKey:]):
        (-[WebScriptObject valueForKey:]):
        (-[WebScriptObject removeWebScriptKey:]):
        (-[WebScriptObject stringRepresentation]):
        (-[WebScriptObject webScriptValueAtIndex:]):
        (-[WebScriptObject setWebScriptValueAtIndex:value:]):
        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
        * bindings/objc/WebScriptObjectPrivate.h:
        * bindings/objc/objc_instance.h:
        * bindings/objc/objc_runtime.mm:
        (convertValueToObjcObject):
        * bindings/objc/objc_utility.mm:
        (KJS::Bindings::convertValueToObjcValue):
        * bindings/runtime.cpp:
        (Instance::Instance):
        (Instance::operator=):
        * bindings/runtime.h:
        (KJS::Bindings::Instance::Instance):
        (KJS::Bindings::Instance::setExecutionContext):
        (KJS::Bindings::Instance::executionContext):
        * bindings/runtime_root.cpp:
        (RootObject::setInterpreter):
        * bindings/runtime_root.h:
        * kjs/interpreter.h:
        (KJS::Interpreter::isGlobalObject):
        (KJS::Interpreter::interpreterForGlobalObject):
        (KJS::Interpreter::isSafeScript):

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

26 files changed:
JavaScriptCore/ChangeLog
JavaScriptCore/bindings/NP_jsobject.cpp
JavaScriptCore/bindings/NP_jsobject.h
JavaScriptCore/bindings/c/c_instance.cpp
JavaScriptCore/bindings/c/c_instance.h
JavaScriptCore/bindings/c/c_utility.cpp
JavaScriptCore/bindings/jni/jni_instance.cpp
JavaScriptCore/bindings/jni/jni_instance.h
JavaScriptCore/bindings/objc/WebScriptObject.mm
JavaScriptCore/bindings/objc/WebScriptObjectPrivate.h
JavaScriptCore/bindings/objc/objc_instance.h
JavaScriptCore/bindings/objc/objc_runtime.mm
JavaScriptCore/bindings/objc/objc_utility.mm
JavaScriptCore/bindings/runtime.cpp
JavaScriptCore/bindings/runtime.h
JavaScriptCore/bindings/runtime_root.cpp
JavaScriptCore/bindings/runtime_root.h
JavaScriptCore/kjs/interpreter.h
WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/kjs_binding.cpp
WebCore/khtml/ecma/kjs_binding.h
WebCore/khtml/ecma/kjs_window.cpp
WebCore/khtml/ecma/kjs_window.h
WebCore/kwq/DOMInternal.mm
WebCore/kwq/KWQKHTMLPart.mm
WebCore/kwq/WebCoreBridge.mm

index 70fc90f2ff48c4e2459679a55fec3a51836ed210..a5516bc48cf54c8071babc946414c1cc5b36ad32 100644 (file)
@@ -1,3 +1,71 @@
+2005-01-17  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/3753030> Need to ensure same origin for plugin binding invocations (origin security rules)
+
+       Keep track of originating execution context and target execution
+       context for native JS object wrappers, and perform appropriate
+       security checks.
+
+        Reviewed by David Harrison.
+
+        * bindings/NP_jsobject.cpp:
+        (_isSafeScript):
+        (_NPN_CreateScriptObject):
+        (_NPN_Invoke):
+        (_NPN_Evaluate):
+        (_NPN_GetProperty):
+        (_NPN_SetProperty):
+        (_NPN_RemoveProperty):
+        (_NPN_HasProperty):
+        (_NPN_HasMethod):
+        (_NPN_SetException):
+        * bindings/NP_jsobject.h:
+        * bindings/c/c_instance.cpp:
+        (CInstance::CInstance):
+        (CInstance::stringValue):
+        * bindings/c/c_instance.h:
+        * bindings/c/c_utility.cpp:
+        (convertValueToNPVariant):
+        * bindings/jni/jni_instance.cpp:
+        (JavaInstance::JavaInstance):
+        (JavaInstance::valueOf):
+        * bindings/jni/jni_instance.h:
+        * bindings/objc/WebScriptObject.mm:
+        (-[WebScriptObject _initializeWithObjectImp:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
+        (-[WebScriptObject _initWithObjectImp:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
+        (-[WebScriptObject KJS::Bindings::]):
+        (-[WebScriptObject _setOriginExecutionContext:KJS::Bindings::]):
+        (-[WebScriptObject _isSafeScript]):
+        (-[WebScriptObject callWebScriptMethod:withArguments:]):
+        (-[WebScriptObject evaluateWebScript:]):
+        (-[WebScriptObject setValue:forKey:]):
+        (-[WebScriptObject valueForKey:]):
+        (-[WebScriptObject removeWebScriptKey:]):
+        (-[WebScriptObject stringRepresentation]):
+        (-[WebScriptObject webScriptValueAtIndex:]):
+        (-[WebScriptObject setWebScriptValueAtIndex:value:]):
+        (+[WebScriptObject _convertValueToObjcValue:KJS::originExecutionContext:Bindings::executionContext:Bindings::]):
+        * bindings/objc/WebScriptObjectPrivate.h:
+        * bindings/objc/objc_instance.h:
+        * bindings/objc/objc_runtime.mm:
+        (convertValueToObjcObject):
+        * bindings/objc/objc_utility.mm:
+        (KJS::Bindings::convertValueToObjcValue):
+        * bindings/runtime.cpp:
+        (Instance::Instance):
+        (Instance::operator=):
+        * bindings/runtime.h:
+        (KJS::Bindings::Instance::Instance):
+        (KJS::Bindings::Instance::setExecutionContext):
+        (KJS::Bindings::Instance::executionContext):
+        * bindings/runtime_root.cpp:
+        (RootObject::setInterpreter):
+        * bindings/runtime_root.h:
+        * kjs/interpreter.h:
+        (KJS::Interpreter::isGlobalObject):
+        (KJS::Interpreter::interpreterForGlobalObject):
+        (KJS::Interpreter::isSafeScript):
+
 === Safari-179 ===
 
 2005-01-13  Vicki Murley <vicki@apple.com>
index 001cdb8e39d6af64ba2cd76fa12fdca0409ed402..efa71fffb6075159f8e89bee1209ef86914bd2df 100644 (file)
@@ -85,14 +85,26 @@ Identifier identiferFromNPIdentifier(const NPUTF8 *name)
     return identifier;
 }
 
-NPObject *_NPN_CreateScriptObject (NPP npp, KJS::ObjectImp *imp, KJS::Bindings::RootObject *root)
+static bool _isSafeScript(JavaScriptObject *obj)
+{
+    if (obj->originExecutionContext) {
+       Interpreter *originInterpreter = obj->originExecutionContext->interpreter();
+       if (originInterpreter) {
+           return originInterpreter->isSafeScript (obj->executionContext->interpreter());
+       }
+    }
+    return true;
+}
+
+NPObject *_NPN_CreateScriptObject (NPP npp, KJS::ObjectImp *imp, const KJS::Bindings::RootObject *originExecutionContext, const KJS::Bindings::RootObject *executionContext)
 {
     JavaScriptObject *obj = (JavaScriptObject *)_NPN_CreateObject(npp, NPScriptObjectClass);
 
     obj->imp = imp;
-    obj->root = root;    
+    obj->originExecutionContext = originExecutionContext;    
+    obj->executionContext = executionContext;    
 
-    addNativeReference (root, imp);
+    addNativeReference (executionContext, imp);
     
     return (NPObject *)obj;
 }
@@ -117,37 +129,51 @@ bool _NPN_Invoke (NPP npp, NPObject *o, NPIdentifier methodName, const NPVariant
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
         
+       if (!_isSafeScript(obj))
+           return false;
+           
         PrivateIdentifier *i = (PrivateIdentifier *)methodName;
         if (!i->isString)
             return false;
             
-        // Lookup the function object.
-        ExecState *exec = obj->root->interpreter()->globalExec();
-        Interpreter::lock();
-        Value func = obj->imp->get (exec, identiferFromNPIdentifier(i->value.string));
-        Interpreter::unlock();
-
-        if (func.isNull()) {
-            NPN_InitializeVariantAsNull(result);
-            return false;
-        }
-        else if ( func.type() == UndefinedType) {
-            NPN_InitializeVariantAsUndefined(result);
-            return false;
-        }
-        else {
-            // Call the function object.
-            ObjectImp *funcImp = static_cast<ObjectImp*>(func.imp());
-            Object thisObj = Object(const_cast<ObjectImp*>(obj->imp));
-            List argList = listFromVariantArgs(exec, args, argCount);
-            Interpreter::lock();
-            Value resultV = funcImp->call (exec, thisObj, argList);
-            Interpreter::unlock();
-
-            // Convert and return the result of the function call.
-            convertValueToNPVariant(exec, resultV, result);
-            return true;
-        }
+       // Special case the "eval" method.
+       if (methodName == _NPN_GetStringIdentifier("eval")) {
+           if (argCount != 1)
+               return false;
+           if (args[0].type != NPVariantType_String)
+               return false;
+           
+           return _NPN_Evaluate (npp, o, (NPString *)&args[0].value.stringValue, result);
+       }
+       else {
+           // Lookup the function object.
+           ExecState *exec = obj->executionContext->interpreter()->globalExec();
+           Interpreter::lock();
+           Value func = obj->imp->get (exec, identiferFromNPIdentifier(i->value.string));
+           Interpreter::unlock();
+
+           if (func.isNull()) {
+               NPN_InitializeVariantAsNull(result);
+               return false;
+           }
+           else if ( func.type() == UndefinedType) {
+               NPN_InitializeVariantAsUndefined(result);
+               return false;
+           }
+           else {
+               // Call the function object.
+               ObjectImp *funcImp = static_cast<ObjectImp*>(func.imp());
+               Object thisObj = Object(const_cast<ObjectImp*>(obj->imp));
+               List argList = listFromVariantArgs(exec, args, argCount);
+               Interpreter::lock();
+               Value resultV = funcImp->call (exec, thisObj, argList);
+               Interpreter::unlock();
+
+               // Convert and return the result of the function call.
+               convertValueToNPVariant(exec, resultV, result);
+               return true;
+           }
+       }
     }
     else {
         if (o->_class->invoke) {
@@ -163,7 +189,10 @@ bool _NPN_Evaluate (NPP npp, NPObject *o, NPString *s, NPVariant *variant)
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
 
-        ExecState *exec = obj->root->interpreter()->globalExec();
+       if (!_isSafeScript(obj))
+           return false;
+
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
         Object thisObj = Object(const_cast<ObjectImp*>(obj->imp));
         Value result;
         
@@ -171,7 +200,7 @@ bool _NPN_Evaluate (NPP npp, NPObject *o, NPString *s, NPVariant *variant)
         NPUTF16 *scriptString;
         unsigned int UTF16Length;
         convertNPStringToUTF16 (s, &scriptString, &UTF16Length);    // requires free() of returned memory.
-        Completion completion = obj->root->interpreter()->evaluate(UString(), 0, UString((const UChar *)scriptString,UTF16Length));
+        Completion completion = obj->executionContext->interpreter()->evaluate(UString(), 0, UString((const UChar *)scriptString,UTF16Length));
         ComplType type = completion.complType();
         
         if (type == Normal) {
@@ -198,7 +227,11 @@ bool _NPN_GetProperty (NPP npp, NPObject *o, NPIdentifier propertyName, NPVarian
 {
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
-        ExecState *exec = obj->root->interpreter()->globalExec();
+
+       if (!_isSafeScript(obj))
+           return false;
+
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
 
         PrivateIdentifier *i = (PrivateIdentifier *)propertyName;
         if (i->isString) {
@@ -254,7 +287,10 @@ bool _NPN_SetProperty (NPP npp, NPObject *o, NPIdentifier propertyName, const NP
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
 
-        ExecState *exec = obj->root->interpreter()->globalExec();
+       if (!_isSafeScript(obj))
+           return false;
+
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
         Interpreter::lock();
         Value result;
         PrivateIdentifier *i = (PrivateIdentifier *)propertyName;
@@ -278,7 +314,11 @@ bool _NPN_RemoveProperty (NPP npp, NPObject *o, NPIdentifier propertyName)
 {
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
-        ExecState *exec = obj->root->interpreter()->globalExec();
+
+       if (!_isSafeScript(obj))
+           return false;
+
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
 
         PrivateIdentifier *i = (PrivateIdentifier *)propertyName;
         if (i->isString) {
@@ -310,12 +350,16 @@ bool _NPN_HasProperty(NPP npp, NPObject *o, NPIdentifier propertyName)
 {
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
-        ExecState *exec = obj->root->interpreter()->globalExec();
+
+       if (!_isSafeScript(obj))
+           return false;
+
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
 
         PrivateIdentifier *i = (PrivateIdentifier *)propertyName;
         // String identifier?
         if (i->isString) {
-            ExecState *exec = obj->root->interpreter()->globalExec();
+            ExecState *exec = obj->executionContext->interpreter()->globalExec();
             Interpreter::lock();
             bool result = obj->imp->hasProperty (exec, identiferFromNPIdentifier(i->value.string));
             Interpreter::unlock();
@@ -340,12 +384,15 @@ bool _NPN_HasMethod(NPP npp, NPObject *o, NPIdentifier methodName)
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
         
+       if (!_isSafeScript(obj))
+           return false;
+
         PrivateIdentifier *i = (PrivateIdentifier *)methodName;
         if (!i->isString)
             return false;
             
         // Lookup the function object.
-        ExecState *exec = obj->root->interpreter()->globalExec();
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
         Interpreter::lock();
         Value func = obj->imp->get (exec, identiferFromNPIdentifier(i->value.string));
         Interpreter::unlock();
@@ -368,7 +415,7 @@ void _NPN_SetException (NPObject *o, NPString *message)
 {
     if (o->_class == NPScriptObjectClass) {
         JavaScriptObject *obj = (JavaScriptObject *)o; 
-        ExecState *exec = obj->root->interpreter()->globalExec();
+        ExecState *exec = obj->executionContext->interpreter()->globalExec();
         Interpreter::lock();
         char *msg = (char *)malloc (message->UTF8Length + 1);
         strncpy (msg, message->UTF8Characters, message->UTF8Length);
index 90be0f65d4aaa36f28e9b870aba5ed7d6ce4ecd2..356f30e57ae18ab8405a1198a781c726c4539931 100644 (file)
@@ -41,10 +41,11 @@ typedef struct
 {
     NPObject object;
     KJS::ObjectImp *imp;
-    KJS::Bindings::RootObject *root;
+    const KJS::Bindings::RootObject *originExecutionContext;
+    const KJS::Bindings::RootObject *executionContext;
 } JavaScriptObject;
 
-NPObject *_NPN_CreateScriptObject (NPP npp, KJS::ObjectImp *imp, KJS::Bindings::RootObject *root);
+NPObject *_NPN_CreateScriptObject (NPP npp, KJS::ObjectImp *imp, const KJS::Bindings::RootObject *originExecutionContext, const KJS::Bindings::RootObject *executionContext);
 
 #ifdef __cplusplus
 }
index 6b0c1882a1df8950f0533a5eaf5a4ccafad4f5a5..9428bb4e3fccaebc22a0256160f1758dc6f2dde5 100644 (file)
@@ -46,6 +46,7 @@ CInstance::CInstance (NPObject *o)
 {
     _object = _NPN_RetainObject (o);
     _class = 0;
+    setExecutionContext (0);
 };
 
 CInstance::~CInstance () 
@@ -59,6 +60,7 @@ CInstance::CInstance (const CInstance &other) : Instance()
 {
     _object = _NPN_RetainObject (other._object);
     _class = 0;
+    setExecutionContext (other.executionContext());
 };
 
 CInstance &CInstance::operator=(const CInstance &other){
@@ -203,8 +205,9 @@ KJS::Value CInstance::defaultValue (KJS::Type hint) const
 
 KJS::Value CInstance::stringValue() const
 {
-    // FIXME:  Implement something sensible, like calling toString...
-    KJS::String v("");
+    char buf[1024];
+    snprintf (buf, 1024, "NPObject %p, NPClass %p", _object, _object->_class);
+    KJS::String v(buf);
     return v;
 }
 
index 780c58e0aa12d657ed167236878650e9713bfc1f..96d248c370658f765d043aad9f27b85eb35dbf19 100644 (file)
@@ -63,13 +63,9 @@ public:
     
     NPObject *getObject() const { return _object; }
 
-    void setExecutionContext (RootObject *r) { _root = r; }
-    const RootObject *executionContext() const { return _root; }
-    
 private:
     mutable CClass *_class;
     NPObject *_object;
-    RootObject *_root;
 };
 
 } // namespace Bindings
index e8cc2afe0d0c4a6b70cdc4f56d7179e0aea6489b..509f2d898188ec8f54783307b2023a67c7fadc2c 100644 (file)
@@ -25,6 +25,7 @@
 #include <c_instance.h> 
 #include <c_utility.h> 
 #include <internal.h>
+#include <npruntime_impl.h>
 #include <npruntime_priv.h>
 #include <runtime.h>
 #include <runtime_object.h>
@@ -99,6 +100,30 @@ void convertValueToNPVariant (KJS::ExecState *exec, const KJS::Value &value, NPV
             CInstance *instance = static_cast<CInstance*>(imp->getInternalInstance());
             NPN_InitializeVariantWithObject (result, instance->getObject());
         }
+       else {
+
+           KJS::Interpreter *originInterpreter = exec->interpreter();
+            const Bindings::RootObject *originExecutionContext = rootForInterpreter(originInterpreter);
+
+           KJS::Interpreter *interpreter = 0;
+           if (originInterpreter->isGlobalObject(value)) {
+               interpreter = originInterpreter->interpreterForGlobalObject (value.imp());
+           }
+
+           if (!interpreter)
+               interpreter = originInterpreter;
+               
+            const Bindings::RootObject *executionContext = rootForInterpreter(interpreter);
+            if (!executionContext) {
+                Bindings::RootObject *newExecutionContext = new KJS::Bindings::RootObject(0);
+                newExecutionContext->setInterpreter (interpreter);
+                executionContext = newExecutionContext;
+            }
+    
+           NPObject *obj = _NPN_CreateScriptObject (0, objectImp, originExecutionContext, executionContext);
+           NPN_InitializeVariantWithObject (result, obj);
+           _NPN_ReleaseObject (obj);
+       }
     }
     else
         NPN_InitializeVariantAsUndefined(result);
index acbbe0cfcb9694ec5c3ee3d66b15f0383a23db42..a7941a5ac4dd8fda4a23954409c5e98d8225ecd8 100644 (file)
@@ -45,7 +45,7 @@ JavaInstance::JavaInstance (jobject instance, const RootObject *r)
 {
     _instance = new JObjectWrapper (instance);
     _class = 0;
-    _root = r;
+    setExecutionContext (r);
 };
 
 JavaInstance::~JavaInstance () 
@@ -60,7 +60,6 @@ JavaInstance::JavaInstance (const JavaInstance &other) : Instance()
     _instance->ref();
     // Classes are kept around forever.
     _class = other._class;
-    _root = other._root;
 };
 
 #define NUM_LOCAL_REFS 64
@@ -346,9 +345,6 @@ KJS::Value JavaInstance::valueOf() const
     return stringValue();
 };
 
-void JavaInstance::setExecutionContext (RootObject *r) { _root = r; }
-const RootObject *JavaInstance::executionContext() const { return _root; }
-
 JObjectWrapper::JObjectWrapper(jobject instance)
 {
     assert (instance != 0);
index a7ff27107b8320a2dbbca6e7735f42dbcfeb78fa..16c3e5c911e55bdfb3b137204990b1787235791e 100644 (file)
@@ -96,9 +96,6 @@ public:
     virtual Value invokeMethod (ExecState *exec, const MethodList &method, const List &args);
     virtual Value invokeDefaultMethod (ExecState *exec, const List &args);
 
-    virtual void setExecutionContext (RootObject *r);
-    virtual const RootObject *executionContext() const;
-
     jobject javaInstance() const { return _instance->_instance; }
     
     Value stringValue() const;
@@ -108,7 +105,6 @@ public:
 private:
     JObjectWrapper *_instance;
     mutable JavaClass *_class;
-    const RootObject *_root;
 };
 
 } // namespace Bindings
index e276de1425bca79f5cc89cfc2869c51bd072a94f..4069af5b80ff659791a8bd6b24b836b60150a5df 100644 (file)
@@ -65,15 +65,16 @@ static void _didExecute(WebScriptObject *obj)
         func (exec, static_cast<KJS::ObjectImp*>([obj _executionContext]->rootObjectImp()));
 }
 
-- (void)_initializeWithObjectImp:(KJS::ObjectImp *)imp root:(const Bindings::RootObject *)root
+- (void)_initializeWithObjectImp:(KJS::ObjectImp *)imp originExecutionContext:(const Bindings::RootObject *)originExecutionContext executionContext:(const Bindings::RootObject *)executionContext
 {
     _private->imp = imp;
-    _private->root = root;    
+    _private->executionContext = executionContext;    
+    _private->originExecutionContext = originExecutionContext;    
 
-    addNativeReference (root, imp);
+    addNativeReference (executionContext, imp);
 }
 
-- _initWithObjectImp:(KJS::ObjectImp *)imp root:(const Bindings::RootObject *)root
+- _initWithObjectImp:(KJS::ObjectImp *)imp originExecutionContext:(const Bindings::RootObject *)originExecutionContext executionContext:(const Bindings::RootObject *)executionContext
 {
     assert (imp != 0);
     //assert (root != 0);
@@ -82,7 +83,7 @@ static void _didExecute(WebScriptObject *obj)
 
     _private = [[WebScriptObjectPrivate alloc] init];
 
-    [self _initializeWithObjectImp:imp root:root];
+    [self _initializeWithObjectImp:imp originExecutionContext:originExecutionContext executionContext:executionContext];
     
     return self;
 }
@@ -99,7 +100,28 @@ static void _didExecute(WebScriptObject *obj)
 
 - (const KJS::Bindings::RootObject *)_executionContext
 {
-    return _private->root;
+    return _private->executionContext;
+}
+
+- (const KJS::Bindings::RootObject *)_originExecutionContext
+{
+    return _private->originExecutionContext;
+}
+
+- (void)_setOriginExecutionContext:(const KJS::Bindings::RootObject *)originExecutionContext
+{
+    _private->originExecutionContext = originExecutionContext;
+}
+
+- (BOOL)_isSafeScript
+{
+    if ([self _originExecutionContext]) {
+       Interpreter *originInterpreter = [self _originExecutionContext]->interpreter();
+       if (originInterpreter) {
+           return originInterpreter->isSafeScript ([self _executionContext]->interpreter());
+       }
+    }
+    return true;
 }
 
 - (void)dealloc
@@ -157,8 +179,12 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return nil;
 
+    if (![self _isSafeScript])
+       return nil;
+
     // Lookup the function object.
     ExecState *exec = [self _executionContext]->interpreter()->globalExec();
+
     Interpreter::lock();
     
     Value v = convertObjcValueToValue(exec, &name, ObjcObjectType);
@@ -184,7 +210,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     }
 
     // Convert and return the result of the function call.
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result originExecutionContext:[self _originExecutionContext] executionContext:[self _executionContext]];
 
     _didExecute(self);
         
@@ -196,7 +222,11 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return nil;
 
+    if (![self _isSafeScript])
+       return nil;
+
     ExecState *exec = [self _executionContext]->interpreter()->globalExec();
+
     Object thisObj = Object(const_cast<ObjectImp*>([self _imp]));
     Value result;
     
@@ -222,7 +252,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         result = Undefined();
     }
 
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result originExecutionContext:[self _originExecutionContext] executionContext:[self _executionContext]];
 
     _didExecute(self);
     
@@ -234,7 +264,11 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return;
 
+    if (![self _isSafeScript])
+       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)));
@@ -252,7 +286,11 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return nil;
         
+    if (![self _isSafeScript])
+       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)));
@@ -263,7 +301,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         result = Undefined();
     }
 
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result originExecutionContext:[self _originExecutionContext] executionContext:[self _executionContext]];
 
     _didExecute(self);
     
@@ -275,7 +313,11 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return;
         
+    if (![self _isSafeScript])
+       return;
+
     ExecState *exec = [self _executionContext]->interpreter()->globalExec();
+
     Interpreter::lock();
     Value v = convertObjcValueToValue(exec, &key, ObjcObjectType);
     [self _imp]->deleteProperty (exec, Identifier (v.toString(exec)));
@@ -290,6 +332,9 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
 
 - (NSString *)stringRepresentation
 {
+    if (![self _isSafeScript])
+       return @"Undefined";
+
     Interpreter::lock();
     Object thisObj = Object(const_cast<ObjectImp*>([self _imp]));
     ExecState *exec = [self _executionContext]->interpreter()->globalExec();
@@ -310,6 +355,9 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return nil;
 
+    if (![self _isSafeScript])
+       return nil;
+
     ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     Value result = [self _imp]->get (exec, (unsigned)index);
@@ -320,7 +368,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         result = Undefined();
     }
 
-    id resultObj = [WebScriptObject _convertValueToObjcValue:result root:[self _executionContext]];
+    id resultObj = [WebScriptObject _convertValueToObjcValue:result originExecutionContext:[self _originExecutionContext] executionContext:[self _executionContext]];
 
     _didExecute(self);
 
@@ -332,6 +380,9 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     if (![self _executionContext])
         return;
 
+    if (![self _isSafeScript])
+       return;
+
     ExecState *exec = [self _executionContext]->interpreter()->globalExec();
     Interpreter::lock();
     [self _imp]->put (exec, (unsigned)index, (convertObjcValueToValue(exec, &value, ObjcObjectType)));
@@ -354,7 +405,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
     exec->setException (err);
 }
 
-+ (id)_convertValueToObjcValue:(KJS::Value)value root:(const Bindings::RootObject *)root
++ (id)_convertValueToObjcValue:(KJS::Value)value originExecutionContext:(const Bindings::RootObject *)originExecutionContext executionContext:(const Bindings::RootObject *)root
 {
     id result = 0;
 
@@ -369,7 +420,7 @@ static KJS::List listFromNSArray(ExecState *exec, NSArray *array)
         }
         // Convert to a WebScriptObject
         else {
-            result = [[[WebScriptObject alloc] _initWithObjectImp:objectImp root:root] autorelease];
+            result = [[[WebScriptObject alloc] _initWithObjectImp:objectImp originExecutionContext:originExecutionContext executionContext:root] autorelease];
         }
     }
     
index 3419cfcb871c6c75203ed9670ebb68d3160c16e4..1edad2ad746cd5e6d9aa2825d787e0afd295a04f 100644 (file)
 #include <JavaScriptCore/value.h>
 
 @interface WebScriptObject (Private)
-+ (id)_convertValueToObjcValue:(KJS::Value)value root:(const KJS::Bindings::RootObject *)root;
++ (id)_convertValueToObjcValue:(KJS::Value)value originExecutionContext:(const KJS::Bindings::RootObject *)originExecutionContext executionContext:(const KJS::Bindings::RootObject *)executionContext;
 - _init;
-- _initWithObjectImp:(KJS::ObjectImp *)imp root:(const KJS::Bindings::RootObject *)root;
-- (void)_initializeWithObjectImp:(KJS::ObjectImp *)imp root:(const KJS::Bindings::RootObject *)root;
+- _initWithObjectImp:(KJS::ObjectImp *)imp originExecutionContext:(const KJS::Bindings::RootObject *)originExecutionContext executionContext:(const KJS::Bindings::RootObject *)executionContext ;
+- (void)_initializeWithObjectImp:(KJS::ObjectImp *)imp originExecutionContext:(const KJS::Bindings::RootObject *)originExecutionContext executionContext:(const KJS::Bindings::RootObject *)executionContext ;
 - (void)_initializeScriptDOMNodeImp;
 - (KJS::ObjectImp *)_imp;
 - (const KJS::Bindings::RootObject *)_executionContext;
+- (void)_setOriginExecutionContext:(const KJS::Bindings::RootObject *)originExecutionContext;
+- (const KJS::Bindings::RootObject *)_originExecutionContext;
 @end
 
 @interface WebScriptObjectPrivate : NSObject
 {
     KJS::ObjectImp *imp;
-    const KJS::Bindings::RootObject *root;
+    const KJS::Bindings::RootObject *executionContext;
+    const KJS::Bindings::RootObject *originExecutionContext;
     BOOL isCreatedByDOMWrapper;
 }
 @end
index b55a689809098533e9d68ce4d26458af4f6c5ebc..5b3bb81720ab5c482bdf0a388132c3ece3dccc38 100644 (file)
@@ -71,15 +71,11 @@ public:
     Value numberValue() const;
     Value booleanValue() const;
     
-    void setExecutionContext (RootObject *r) { _root = r; }
-    const RootObject *executionContext() const { return _root; }
-
 private:
     ObjectStructPtr _instance;
     mutable ObjcClass *_class;
     ObjectStructPtr _pool;
     long _beginCount;
-    RootObject *_root;
 };
 
 } // namespace Bindings
index 155a7a78a7d5901f246c0e40a65c5f5accebae5b..8c83e57963055e7fe690540d3e2b65c193f5e1c6 100644 (file)
@@ -136,7 +136,7 @@ static id convertValueToObjcObject (KJS::ExecState *exec, const KJS::Value &valu
         newRoot->setInterpreter (exec->interpreter());
         root = newRoot;
     }
-    return [WebScriptObject _convertValueToObjcValue:value root:root];
+    return [WebScriptObject _convertValueToObjcValue:value originExecutionContext:root executionContext:root ];
 }
 
 
index 1b6a6b3ad000bfe418791873f1161f93f0d2af55..85e7cdab40b3487600836e7fdd2385ea77d9ee55 100644 (file)
@@ -92,16 +92,29 @@ ObjcValue KJS::Bindings::convertValueToObjcValue (KJS::ExecState *exec, const KJ
     ObjcValue result;
     double d = 0;
    
-    d = value.toNumber(exec);
+    if (!ObjcObjectType)
+       d = value.toNumber(exec);
+       
     switch (type){
         case ObjcObjectType: {
-            const Bindings::RootObject *root = rootForInterpreter(exec->interpreter());
-            if (!root) {
-                Bindings::RootObject *newRoot = new KJS::Bindings::RootObject(0);
-                newRoot->setInterpreter (exec->interpreter());
-                root = newRoot;
+           KJS::Interpreter *originInterpreter = exec->interpreter();
+            const Bindings::RootObject *originExecutionContext = rootForInterpreter(originInterpreter);
+
+           KJS::Interpreter *interpreter = 0;
+           if (originInterpreter->isGlobalObject(value)) {
+               interpreter = originInterpreter->interpreterForGlobalObject (value.imp());
+           }
+
+           if (!interpreter)
+               interpreter = originInterpreter;
+               
+            const Bindings::RootObject *executionContext = rootForInterpreter(interpreter);
+            if (!executionContext) {
+                Bindings::RootObject *newExecutionContext = new KJS::Bindings::RootObject(0);
+                newExecutionContext->setInterpreter (interpreter);
+                executionContext = newExecutionContext;
             }
-            result.objectValue = [WebScriptObject _convertValueToObjcValue:value root:root];
+            result.objectValue = [WebScriptObject _convertValueToObjcValue:value originExecutionContext:originExecutionContext executionContext:executionContext ];
         }
         break;
         
@@ -135,8 +148,6 @@ ObjcValue KJS::Bindings::convertValueToObjcValue (KJS::ExecState *exec, const KJ
             result.doubleValue = (double)d;
         }
         break;
-            
-        break;
 
         case ObjcVoidType: {
             bzero (&result, sizeof(ObjcValue));
index a5bb2c78ebf95efa4ef5477eca47da4824a75ebe..1867d1919ed04395b3592d4ff5a07d9696d36d98 100644 (file)
@@ -120,3 +120,18 @@ Object Instance::createRuntimeObject (BindingLanguage language, void *myInterfac
     
     return theObject;
 }
+
+Instance::Instance (const Instance &other) 
+{
+    setExecutionContext (other.executionContext());
+};
+
+Instance &Instance::operator=(const Instance &other)
+{
+    if (this == &other)
+        return *this;
+
+    setExecutionContext (other.executionContext());
+    
+    return *this;
+}
index a39446cd17d877d09d3ca29fa16b5bf3e3086d6c..d5c2e2379f1b107a3ac0b64dae383dc73d775179 100644 (file)
@@ -140,6 +140,12 @@ public:
 
     static Object createRuntimeObject (BindingLanguage language, void *myInterface);
 
+    Instance () : _executionContext(0) {};
+    
+    Instance (const Instance &other);
+
+    Instance &operator=(const Instance &other);
+
     // These functions are called before and after the main entry points into
     // the native implementations.  They can be used to establish and cleanup
     // any needed state.
@@ -160,12 +166,13 @@ public:
     
     virtual Value valueOf() const { return String(getClass()->name()); };
     
-    virtual void setExecutionContext (RootObject *r) = 0;
-    virtual const RootObject *executionContext () const = 0;
+    void setExecutionContext (const RootObject *r) { _executionContext = r; }
+    const RootObject *executionContext() const { return _executionContext; }
     
     virtual ~Instance() {};
     
-private:
+protected:
+    const RootObject *_executionContext;
 };
 
 class Array
index e827c7c32b09611f15ab03b4bd88a2ee2fa4bf4a..c48543918ae86bf18cf17228e12ac1b126dbfc52 100644 (file)
@@ -352,3 +352,9 @@ void RootObject::removeAllNativeReferences ()
     }
 }
 
+void RootObject::setInterpreter (KJS::Interpreter *i)
+{
+    _interpreter = i;
+}
+
+
index 72996b63e257f6bd17cf73b7e4287ac3647da83b..bbfb828072afdee84d6e9e9d5f452e2487f30e4a 100644 (file)
@@ -70,7 +70,7 @@ public:
     
     KJS::ObjectImp *rootObjectImp() const { return _imp; }
     
-    void setInterpreter (KJS::Interpreter *i) { _interpreter = i; }
+    void setInterpreter (KJS::Interpreter *i);
     KJS::Interpreter *interpreter() const { return _interpreter; }
 
     void removeAllNativeReferences ();
@@ -88,7 +88,7 @@ public:
     static void dispatchToJavaScriptThread(JSObjectCallContext *context);
     
     const void *nativeHandle() const { return _nativeHandle; }
-    
+
 private:
     const void *_nativeHandle;
     KJS::ObjectImp *_imp;
index e619020d11192aa813c645e93adbf9b468235fb8..94f4674e2bc281b7c93481aab1ccbc057985b900 100644 (file)
@@ -361,6 +361,34 @@ namespace KJS {
 
     void saveBuiltins (SavedBuiltins &) const;
     void restoreBuiltins (const SavedBuiltins &);
+
+#if APPLE_CHANGES
+    /**
+     * Determine if the value is a global object (for any interpreter).  This may
+     * be difficult to determine for multiple uses of JSC in a process that are
+     * logically independent of each other.  In the case of WebCore, this method
+     * is used to determine if an object is the Window object so we can perform
+     * security checks.
+     */
+    virtual bool isGlobalObject(const Value &v) { return false; }
+    
+    /** 
+     * Find the interpreter for a particular global object.  This should really
+     * be a static method, but we can't do that is C++.  Again, as with isGlobalObject()
+     * implementation really need to know about all instances of Interpreter
+     * created in an application to correctly implement this method.  The only
+     * override of this method is currently in WebCore.
+     */
+    virtual Interpreter *interpreterForGlobalObject (const ValueImp *imp) { return 0; }
+    
+    /**
+     * Determine if the it is 'safe' to execute code in the target interpreter from an
+     * object that originated in this interpreter.  This check is used to enforce WebCore
+     * cross frame security rules.  In particular, attempts to access 'bound' objects are
+     * not allowed unless isSafeScript returns true.
+     */
+    virtual bool isSafeScript (const Interpreter *target) { return true; }
+#endif
     
   private:
     InterpreterImp *rep;
index 7264b6967011110f81c82d13884fed5d03a3afba..b4bcde1985cc17eefd63696ef4979a622f7f6ec4 100644 (file)
@@ -1,3 +1,31 @@
+2005-01-17  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/3753030> Need to ensure same origin for plugin binding invocations (origin security rules)
+
+       Keep track of originating execution context and target execution
+       context for native JS object wrappers, and perform appropriate
+       security checks.
+
+        Reviewed by David Harrison.
+
+        * khtml/ecma/kjs_binding.cpp:
+        (ScriptInterpreter::isGlobalObject):
+        (ScriptInterpreter::isSafeScript):
+        (ScriptInterpreter::interpreterForGlobalObject):
+        * khtml/ecma/kjs_binding.h:
+        * khtml/ecma/kjs_window.cpp:
+        (Window::interpreter):
+        (Window::isSafeScript):
+        * khtml/ecma/kjs_window.h:
+        * kwq/DOMInternal.mm:
+        (-[WebScriptObject _initializeScriptDOMNodeImp]):
+        * kwq/KWQKHTMLPart.mm:
+        (KWQKHTMLPart::windowScriptObject):
+        (KWQKHTMLPart::windowScriptNPObject):
+        * kwq/WebCoreBridge.mm:
+        (rootForView):
+        (-[WebCoreBridge init]):
+
 2005-01-17  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by John
index 9d2409fef32a9a3f5951927f15760a7303ccaa67..543c0f4bdb0c16ee843833e20e1d58b95c30e95e 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "kjs_binding.h"
 #include "kjs_dom.h"
+#include "kjs_window.h"
 #include <kjs/internal.h> // for InterpreterImp
 
 #include "dom/dom_exception.h"
@@ -273,6 +274,34 @@ bool ScriptInterpreter::wasRunByUserGesture() const
   return false;
 }
 
+#if APPLE_CHANGES
+bool ScriptInterpreter::isGlobalObject(const Value &v)
+{
+    if (v.type() == ObjectType) {
+       Object o = v.toObject (globalExec());
+       if (o.classInfo() == &Window::info)
+           return true;
+    }
+    return false;
+}
+
+bool ScriptInterpreter::isSafeScript (const Interpreter *_target)
+{
+    const KJS::ScriptInterpreter *target = static_cast<const ScriptInterpreter *>(_target);
+
+    return KJS::Window::isSafeScript (this, target);
+}
+
+Interpreter *ScriptInterpreter::interpreterForGlobalObject (const ValueImp *imp)
+{
+    if (!isGlobalObject(imp))
+       return 0;
+       
+    const KJS::Window *win = static_cast<const KJS::Window *>(imp);
+    return win->interpreter();
+}
+#endif
+
 //////
 
 UString::UString(const QString &d)
index 29785c87502c17470fc72fe6550b98bd3493fda4..2e923c0feaa1f45c3704ea3ebdd5a5b7bf9649f5 100644 (file)
@@ -131,7 +131,13 @@ namespace KJS {
     virtual void mark();
     
     DOM::Event *getCurrentEvent() const { return m_evt; }
-    
+
+#if APPLE_CHANGES
+    virtual bool isGlobalObject(const Value &v);
+    virtual Interpreter *interpreterForGlobalObject (const ValueImp *imp);
+    virtual bool isSafeScript (const Interpreter *target);
+#endif
+
   private:
     KHTMLPart* m_part;
 
index 5583a342b5c3d5fd4aa06d56aee15f73e9d91e6c..eb5220114048c6f9601f8408d69d963e97c50955 100644 (file)
@@ -319,6 +319,11 @@ Window::~Window()
   delete winq;
 }
 
+KJS::Interpreter *Window::interpreter() const
+{
+    return KJSProxy::proxy( m_part )->interpreter();
+}
+
 Window *Window::retrieveWindow(KHTMLPart *p)
 {
   Object obj = Object::dynamicCast( retrieve( p ) );
@@ -1089,6 +1094,63 @@ static bool shouldLoadAsEmptyDocument(const KURL &url)
   return url.protocol().lower() == "about" || url.isEmpty();
 }
 
+bool Window::isSafeScript (const KJS::ScriptInterpreter *origin, const KJS::ScriptInterpreter *target)
+{
+    if (origin == target)
+       return true;
+       
+    KHTMLPart *originPart = origin->part();
+    KHTMLPart *targetPart = target->part();
+
+    // JS may be attempting to access the "window" object, which should be valid,
+    // even if the document hasn't been constructed yet.  If the document doesn't
+    // exist yet allow JS to access the window object.
+    if (!targetPart->xmlDocImpl())
+       return true;
+
+    DOM::DocumentImpl *originDocument = originPart->xmlDocImpl();
+    DOM::DocumentImpl *targetDocument = targetPart->xmlDocImpl();
+
+    if (!targetDocument) {
+       return false;
+    }
+
+    DOM::DOMString targetDomain = targetDocument->domain();
+
+    // Always allow local pages to execute any JS.
+    if (targetDomain.isNull())
+       return true;
+
+    DOM::DOMString originDomain = originDocument->domain();
+
+    // if this document is being initially loaded as empty by its parent
+    // or opener, allow access from any document in the same domain as
+    // the parent or opener.
+    if (shouldLoadAsEmptyDocument(targetPart->url())) {
+       KHTMLPart *ancestorPart = targetPart->opener() ? targetPart->opener() : targetPart->parentPart();
+       while (ancestorPart && shouldLoadAsEmptyDocument(ancestorPart->url())) {
+           ancestorPart = ancestorPart->parentPart();
+       }
+
+       if (ancestorPart)
+           originDomain = ancestorPart->xmlDocImpl()->domain();
+    }
+
+    if ( targetDomain == originDomain )
+       return true;
+
+    if (Interpreter::shouldPrintExceptions()) {
+       printf("Unsafe JavaScript attempt to access frame with URL %s from frame with URL %s. Domains must match.\n", 
+            targetDocument->URL().latin1(), originDocument->URL().latin1());
+       QString message;
+       message.sprintf("Unsafe JavaScript attempt to access frame with URL %s from frame with URL %s. Domains must match.\n", 
+                     targetDocument->URL().latin1(), originDocument->URL().latin1());
+       KWQ(targetPart)->addMessageToConsole(message, 1, QString()); //fixme: provide a real line number and sourceurl
+    }
+
+    return false;
+}
+
 bool Window::isSafeScript(ExecState *exec) const
 {
   if (m_part.isNull()) { // part deleted ? can't grant access
@@ -1770,6 +1832,7 @@ ScheduledAction::ScheduledAction(const QString &_code, bool _singleShot)
   singleShot = _singleShot;
 }
 
+
 void ScheduledAction::execute(Window *window)
 {
   ScriptInterpreter *interpreter = static_cast<ScriptInterpreter *>(KJSProxy::proxy(window->m_part)->interpreter());
index cdc87cbc9560f32f2fb25a927e76c731b2bee1d2..e4fcdd37b9865d18600b4102ab9da7ebfb9a4172 100644 (file)
@@ -98,8 +98,13 @@ namespace KJS {
     bool hasTimeouts();
     QMap<int, ScheduledAction*> *pauseTimeouts(const void *key);
     void resumeTimeouts(QMap<int, ScheduledAction*>*sa, const void *key);
+    
+    KJS::Interpreter *interpreter() const;
+
+    static bool isSafeScript (const KJS::ScriptInterpreter *origin, const KJS::ScriptInterpreter *target);
 #endif
     void scheduleClose();
+        
     bool isSafeScript(ExecState *exec) const;
     Location *location() const;
     Selection *selection() const;
index 4674f009a27d756225d17320d181010bb269d27d..1c7051c07bddeae4cea0ee7736823e0a7543f89e 100644 (file)
@@ -180,7 +180,8 @@ DOMString::DOMString(NSString *str)
     // Get (or create) a cached JS object for the DOM node.
     KJS::ObjectImp *scriptImp = static_cast<KJS::ObjectImp *>(KJS::getDOMNode (exec, DOM::Node (nodeImpl)).imp());
 
-    [self _initializeWithObjectImp:scriptImp root:KWQ(part)->bindingRootObject()];
+    const KJS::Bindings::RootObject *executionContext = KWQ(part)->bindingRootObject();
+    [self _initializeWithObjectImp:scriptImp originExecutionContext:executionContext executionContext:executionContext];
 }
 
 @end
index dfded89e24a9e84d33af611183114466b7701c52..e2d6a38f9c9f3a22c071fe3ec3067e4222d4ffd0 100644 (file)
@@ -1391,7 +1391,7 @@ WebScriptObject *KWQKHTMLPart::windowScriptObject()
 {
     if (!_windowScriptObject) {
         KJS::ObjectImp *win = static_cast<KJS::ObjectImp *>(KJS::Window::retrieveWindow(this));
-        _windowScriptObject = KWQRetainNSRelease([[WebScriptObject alloc] _initWithObjectImp:win root:bindingRootObject()]);
+        _windowScriptObject = KWQRetainNSRelease([[WebScriptObject alloc] _initWithObjectImp:win originExecutionContext:bindingRootObject() executionContext:bindingRootObject()]);
     }
 
     return _windowScriptObject;
@@ -1401,7 +1401,7 @@ NPObject *KWQKHTMLPart::windowScriptNPObject()
 {
     if (!_windowScriptNPObject) {
         KJS::ObjectImp *win = static_cast<KJS::ObjectImp *>(KJS::Window::retrieveWindow(this));
-        _windowScriptNPObject = _NPN_CreateScriptObject (0, win, bindingRootObject());
+        _windowScriptNPObject = _NPN_CreateScriptObject (0, win, bindingRootObject(), bindingRootObject());
     }
 
     return _windowScriptNPObject;
index 8c80daeef3bdec0c662c77f575e4ea20412635df..da78c4b81c62bf6f3a594798a753e1f281b4054d 100644 (file)
@@ -161,11 +161,12 @@ static RootObject *rootForView(void *v)
 {
     NSView *aView = (NSView *)v;
     WebCoreBridge *aBridge = [[WebCoreViewFactory sharedFactory] bridgeForView:aView];
+    RootObject *root = 0;
 
     if (aBridge)
-        return [aBridge executionContextForView:aView];
+        root = [aBridge executionContextForView:aView];
 
-    return 0;
+    return root;
 }
 
 static pthread_t mainThread = 0;
@@ -214,7 +215,7 @@ static bool initializedKJS = FALSE;
         mainThread = pthread_self();
         
         RootObject::setFindRootObjectForNativeHandleFunction (rootForView);
-        
+
         KJS::Bindings::Instance::setDidExecuteFunction(updateRenderingForBindings);
         
         initializedKJS = TRUE;