| /* |
| * Copyright 2008 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| |
| #include <map> |
| #include <set> |
| #import "Debug.h" |
| #import "HostChannel.h" |
| #import "JavaScriptCore/JavaScriptCore.h" |
| #import "pthread.h" |
| #import "TrackingData.h" |
| |
| class CrashHandler { |
| public: |
| virtual void crash(const char* functionName, const char* message) = 0; |
| virtual bool hasCrashed() = 0; |
| }; |
| typedef CrashHandler* CrashHandlerRef; |
| |
| /* |
| * This comprises the guts of the JavaScriptCore-specific code and is |
| * responsible for message dispatch and value conversion. This class should |
| * be portable to any runtime that uses JavaScriptCore. |
| */ |
| class WebScriptSessionHandler : public SessionHandler, public SessionData { |
| public: |
| WebScriptSessionHandler(HostChannel* channel, JSGlobalContextRef contextRef, |
| CrashHandler* crashHandler); |
| |
| /* |
| * Invoking the destructor will perform a clean shutdown of the OOPHM session. |
| */ |
| ~WebScriptSessionHandler(); |
| |
| /* |
| * This is a panic method for shutting down the OOPHM debugging session due |
| * to unrecoverable errors. |
| */ |
| void initiateAutodestructSequence(const char* functionName, const char* message); |
| |
| /* |
| * Invoke a Java method. |
| */ |
| JSValueRef javaFunctionCallbackImpl(int dispatchId, |
| JSObjectRef thisObject, |
| size_t argumentCount, |
| const JSValueRef arguments[], |
| JSValueRef* exception); |
| |
| /* |
| * Finalize a Javo object proxy. |
| */ |
| void javaObjectFinalizeImpl(int objId); |
| |
| /* |
| * Determine if a Java class has a named property. |
| */ |
| bool javaObjectHasPropertyImpl(TrackingDataRef tracker, JSObjectRef object, |
| JSStringRef propertyName); |
| |
| /* |
| * Obtain the value of named property of an object. |
| */ |
| JSValueRef javaObjectGetPropertyImpl(TrackingDataRef tracker, JSObjectRef object, |
| JSStringRef propertyName, JSValueRef* exception); |
| |
| /* |
| * Set the value of a named property on a Java object. |
| */ |
| bool javaObjectSetPropertyImpl(TrackingDataRef tracker, JSObjectRef object, |
| JSStringRef propertyName, JSValueRef value, |
| JSValueRef* exception); |
| |
| /* |
| * Create a JavaScript Error object with the given message. |
| */ |
| JSValueRef makeException(const char* message); |
| |
| protected: |
| virtual void disconnectDetectedImpl(); |
| virtual void fatalError(HostChannel& channel, const std::string& message); |
| virtual void freeValue(HostChannel& channel, int idCount, const int* ids); |
| virtual void loadJsni(HostChannel& channel, const std::string& js); |
| virtual bool invoke(HostChannel& channel, const Value& thisObj, const std::string& methodName, |
| int numArgs, const Value* const args, Value* returnValue); |
| virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId method, int numArgs, |
| const Value* const args, Value* returnValue); |
| virtual void sendFreeValues(HostChannel& channel); |
| |
| private: |
| CrashHandlerRef const crashHandler; |
| int jsObjectId; |
| std::map<int, JSObjectRef> javaObjectsById; |
| std::set<int> javaObjectsToFree; |
| pthread_mutex_t javaObjectsLock; |
| std::map<int, JSObjectRef> jsObjectsById; |
| std::map<JSObjectRef, int> jsIdsByObject; |
| JSClassRef javaObjectWrapperClass; |
| |
| /* A reference to __gwt_makeResult, which we use constantly */ |
| JSObjectRef makeResultFunction; |
| |
| /* The String() function */ |
| JSObjectRef stringConstructor; |
| |
| /* |
| * Free server-side references. |
| */ |
| void freeJavaObjects(); |
| |
| /* |
| * Create a exception Value that contains the given message. |
| */ |
| void makeExceptionValue(Value& value, const char* message); |
| |
| /* |
| * Create a Java object proxy to be passed into the JavaScript execution |
| * environment. |
| */ |
| JSObjectRef makeJavaWrapper(int objId); |
| |
| /* |
| * Convert a value from the JavaScript into something that can be sent back |
| * to the OOPHM host. |
| * |
| * Returns true if an exception was encountered. |
| */ |
| bool makeValue(Value& ret, JSValueRef value); |
| |
| /* |
| * Convert a string-like object to something that can be sent back to the OOPHM |
| * host. |
| * |
| * Returns true if an exception was encountered. |
| */ |
| bool makeValueFromString(Value& ret, JSValueRef value); |
| |
| /* |
| * Convert a value from the OOPHM host into something that can be passed into |
| * the JavaScript execution environment. |
| */ |
| JSValueRef makeValueRef(const Value& value); |
| }; |
| typedef WebScriptSessionHandler* WebScriptSessionHandlerRef; |
| |