180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <jsapi.h> 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkJS.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef _WIN32_WCE 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruextern "C" { 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void abort() { 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru unsigned int _control87(unsigned int _new, unsigned int mask ) { 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru time_t mktime(struct tm *timeptr ) { 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// int errno; 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru char *strdup(const char *) { 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru char *strerror(int errnum) { 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int isatty(void* fd) { 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int putenv(const char *envstring) { 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru char *getenv(const char *varname) { 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct tm * localtime(const time_t *timer) { 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru size_t strftime(char *strDest, size_t maxsize, const char *format, 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const struct tm *timeptr ) { 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0; 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic JSBool 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruglobal_enumerate(JSContext *cx, JSObject *obj) 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef LAZY_STANDARD_CLASSES 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_EnumerateStandardClasses(cx, obj); 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_TRUE; 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic JSBool 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruglobal_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp) 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{ 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef LAZY_STANDARD_CLASSES 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if ((flags & JSRESOLVE_ASSIGNING) == 0) { 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JSBool resolved; 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!JS_ResolveStandardClass(cx, obj, id, &resolved)) 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_FALSE; 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (resolved) { 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *objp = obj; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_TRUE; 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SHELL_HACK) && defined(DEBUG) && defined(XP_UNIX) 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if ((flags & (JSRESOLVE_QUALIFIED | JSRESOLVE_ASSIGNING)) == 0) { 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Do this expensive hack only for unoptimized Unix builds, which are 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * not used for benchmarking. 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru char *path, *comp, *full; 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char *name; 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JSBool ok, found; 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JSFunction *fun; 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!JSVAL_IS_STRING(id)) 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_TRUE; 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path = getenv("PATH"); 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!path) 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_TRUE; 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path = JS_strdup(cx, path); 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!path) 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_FALSE; 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru name = JS_GetStringBytes(JSVAL_TO_STRING(id)); 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ok = JS_TRUE; 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (comp = strtok(path, ":"); comp; comp = strtok(NULL, ":")) { 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (*comp != '\0') { 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru full = JS_smprintf("%s/%s", comp, name); 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!full) { 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_ReportOutOfMemory(cx); 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ok = JS_FALSE; 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru full = (char *)name; 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru found = (access(full, X_OK) == 0); 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (*comp != '\0') 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru free(full); 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (found) { 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fun = JS_DefineFunction(cx, obj, name, Exec, 0, JSPROP_ENUMERATE); 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ok = (fun != NULL); 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (ok) 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *objp = obj; 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_free(cx, path); 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return ok; 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_TRUE; 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruJSClass global_class = { 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "global", JSCLASS_NEW_RESOLVE, 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_PropertyStub, JS_PropertyStub, 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_PropertyStub, JS_PropertyStub, 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru global_enumerate, (JSResolveOp) global_resolve, 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_ConvertStub, JS_FinalizeStub 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkJS::SkJS(void* hwnd) : SkOSWindow(hwnd) { 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if ((fRuntime = JS_NewRuntime(0x100000)) == NULL) { 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if ((fContext = JS_NewContext(fRuntime, 0x1000)) == NULL) { 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ; 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if ((fGlobal = JS_NewObject(fContext, &global_class, NULL, NULL)) == NULL) { 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (JS_InitStandardClasses(fContext, fGlobal) == NULL) { 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(0); 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return; 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru setConfig(SkBitmap::kARGB32_Config); 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru updateSize(); 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru setVisibleP(true); 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru InitializeDisplayables(getBitmap(), fContext, fGlobal, NULL); 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkJS::~SkJS() { 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru DisposeDisplayables(); 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_DestroyContext(fContext); 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_DestroyRuntime(fRuntime); 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JS_ShutDown(); 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkBool SkJS::EvaluateScript(const char* script, jsval* rVal) { 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return JS_EvaluateScript(fContext, fGlobal, script, strlen(script), 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "memory" /* no file name */, 0 /* no line number */, rVal); 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkBool SkJS::ValueToString(jsval value, SkString* string) { 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru JSString* str = JS_ValueToString(fContext, value); 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (str == NULL) 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru string->set(JS_GetStringBytes(str)); 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return true; 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkJS::Test(void* hwnd) { 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkJS js(hwnd); 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru jsval val; 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkBool success = js.EvaluateScript("22/7", &val); 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(success); 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString string; 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru success = js.ValueToString(val, &string); 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(success); 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(strcmp(string.c_str(), "3.142857142857143") == 0); 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru success = js.EvaluateScript( 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "var rect = new rectangle();" 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "rect.left = 4;" 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "rect.top = 10;" 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "rect.right = 20;" 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "rect.bottom = 30;" 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "rect.width = rect.height + 20;" 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru "rect.draw();" 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru , &val); 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(success); 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru success = js.ValueToString(val, &string); 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(success); 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endifASSERT(success); 229