11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include <jsapi.h>
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkJS.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkString.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef _WIN32_WCE
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectextern "C" {
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void abort() {
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned int _control87(unsigned int _new, unsigned int mask ) {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    time_t mktime(struct tm *timeptr ) {
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project//  int errno;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    char *strdup(const char *) {
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    char *strerror(int errnum) {
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int isatty(void* fd) {
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int putenv(const char *envstring) {
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    char *getenv(const char *varname) {
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) {
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    struct tm * localtime(const time_t *timer) {
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    size_t strftime(char *strDest, size_t maxsize, const char *format,
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const struct tm *timeptr ) {
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 0;
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic JSBool
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectglobal_enumerate(JSContext *cx, JSObject *obj)
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef LAZY_STANDARD_CLASSES
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return JS_EnumerateStandardClasses(cx, obj);
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return JS_TRUE;
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic JSBool
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectglobal_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp)
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef LAZY_STANDARD_CLASSES
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if ((flags & JSRESOLVE_ASSIGNING) == 0) {
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        JSBool resolved;
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (!JS_ResolveStandardClass(cx, obj, id, &resolved))
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return JS_FALSE;
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (resolved) {
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            *objp = obj;
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return JS_TRUE;
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined(SHELL_HACK) && defined(DEBUG) && defined(XP_UNIX)
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if ((flags & (JSRESOLVE_QUALIFIED | JSRESOLVE_ASSIGNING)) == 0) {
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        /*
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project         * Do this expensive hack only for unoptimized Unix builds, which are
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project         * not used for benchmarking.
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project         */
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        char *path, *comp, *full;
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const char *name;
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        JSBool ok, found;
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        JSFunction *fun;
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (!JSVAL_IS_STRING(id))
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return JS_TRUE;
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path = getenv("PATH");
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (!path)
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return JS_TRUE;
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        path = JS_strdup(cx, path);
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (!path)
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return JS_FALSE;
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        name = JS_GetStringBytes(JSVAL_TO_STRING(id));
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        ok = JS_TRUE;
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (comp = strtok(path, ":"); comp; comp = strtok(NULL, ":")) {
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (*comp != '\0') {
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                full = JS_smprintf("%s/%s", comp, name);
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (!full) {
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    JS_ReportOutOfMemory(cx);
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    ok = JS_FALSE;
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    break;
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                }
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } else {
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                full = (char *)name;
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            found = (access(full, X_OK) == 0);
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (*comp != '\0')
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                free(full);
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (found) {
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                fun = JS_DefineFunction(cx, obj, name, Exec, 0, JSPROP_ENUMERATE);
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                ok = (fun != NULL);
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (ok)
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    *objp = obj;
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                break;
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        JS_free(cx, path);
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return ok;
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return JS_TRUE;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectJSClass global_class = {
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    "global", JSCLASS_NEW_RESOLVE,
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    JS_PropertyStub,  JS_PropertyStub,
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    JS_PropertyStub,  JS_PropertyStub,
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    global_enumerate, (JSResolveOp) global_resolve,
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    JS_ConvertStub,   JS_FinalizeStub
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkJS::SkJS(void* hwnd) : SkOSWindow(hwnd) {
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if ((fRuntime = JS_NewRuntime(0x100000)) == NULL) {
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if ((fContext = JS_NewContext(fRuntime, 0x1000)) == NULL) {
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ;
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if ((fGlobal = JS_NewObject(fContext, &global_class, NULL, NULL)) == NULL) {
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (JS_InitStandardClasses(fContext, fGlobal) == NULL) {
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(0);
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    setConfig(SkBitmap::kARGB32_Config);
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    updateSize();
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    setVisibleP(true);
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    InitializeDisplayables(getBitmap(), fContext, fGlobal, NULL);
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkJS::~SkJS() {
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DisposeDisplayables();
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    JS_DestroyContext(fContext);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    JS_DestroyRuntime(fRuntime);
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    JS_ShutDown();
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBool SkJS::EvaluateScript(const char* script, jsval* rVal) {
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return JS_EvaluateScript(fContext, fGlobal, script, strlen(script),
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "memory" /* no file name */, 0 /* no line number */, rVal);
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBool SkJS::ValueToString(jsval value, SkString* string) {
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     JSString* str = JS_ValueToString(fContext, value);
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     if (str == NULL)
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project         return false;
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     string->set(JS_GetStringBytes(str));
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     return true;
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkJS::Test(void* hwnd) {
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkJS js(hwnd);
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    jsval val;
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkBool success = js.EvaluateScript("22/7", &val);
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(success);
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkString string;
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    success = js.ValueToString(val, &string);
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(success);
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(strcmp(string.c_str(), "3.142857142857143") == 0);
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    success = js.EvaluateScript(
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "var rect = new rectangle();"
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "rect.left = 4;"
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "rect.top = 10;"
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "rect.right = 20;"
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "rect.bottom = 30;"
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "rect.width = rect.height + 20;"
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        "rect.draw();"
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        , &val);
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(success);
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    success = js.ValueToString(val, &string);
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(success);
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endifASSERT(success);
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
230