blob: 5e05385c8d861af76ffae27f8abf0439defb603b [file] [log] [blame]
/*
* 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;