summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--javascript/dukky.c20
-rw-r--r--javascript/dukky.h2
-rw-r--r--javascript/duktape/Window.bnd9
-rw-r--r--test/js/index.html1
-rw-r--r--test/js/verify-instanceofness.html40
5 files changed, 69 insertions, 3 deletions
diff --git a/javascript/dukky.c b/javascript/dukky.c
index 8f69d23c8..6c8c531fe 100644
--- a/javascript/dukky.c
+++ b/javascript/dukky.c
@@ -247,7 +247,27 @@ dukky_push_node(duk_context *ctx, struct dom_node *node)
return dukky_push_node_stacked(ctx);
}
+static duk_ret_t
+dukky_bad_constructor(duk_context *ctx)
+{
+ duk_error(ctx, DUK_ERR_ERROR, "Bad constructor");
+ return 0;
+}
+void
+dukky_inject_not_ctr(duk_context *ctx, int idx, const char *name)
+{
+ /* ... p[idx] ... proto */
+ duk_push_c_function(ctx, dukky_bad_constructor, 0);
+ /* ... p[idx] ... proto cons */
+ duk_insert(ctx, -2);
+ /* ... p[idx] ... cons proto */
+ duk_put_prop_string(ctx, -2, "prototype");
+ /* ... p[idx] ... cons[proto] */
+ duk_put_prop_string(ctx, idx, name);
+ /* ... p ... */
+ return;
+}
/**************************************** js.h ******************************/
struct jscontext {
diff --git a/javascript/dukky.h b/javascript/dukky.h
index b1ab2edf0..abe21ba35 100644
--- a/javascript/dukky.h
+++ b/javascript/dukky.h
@@ -27,6 +27,6 @@
duk_ret_t dukky_create_object(duk_context *ctx, const char *name, int args);
duk_bool_t dukky_push_node_stacked(duk_context *ctx);
duk_bool_t dukky_push_node(duk_context *ctx, struct dom_node *node);
-
+void dukky_inject_not_ctr(duk_context *ctx, int idx, const char *name);
#endif
diff --git a/javascript/duktape/Window.bnd b/javascript/duktape/Window.bnd
index 95b55b2e2..fee5d2105 100644
--- a/javascript/duktape/Window.bnd
+++ b/javascript/duktape/Window.bnd
@@ -31,9 +31,14 @@ init Window("struct browser_window *" win, "struct html_content *" htmlc)
prototype Window()
%{
+#define EXPOSE(v) \
+ duk_get_global_string(ctx, #v); \
+ duk_put_prop_string(ctx, 0, #v)
/* steal undefined */
- duk_get_global_string(ctx, "undefined");
- duk_put_prop_string(ctx, 0, "undefined");
+ EXPOSE(undefined);
+ EXPOSE(eval);
+ EXPOSE(Object);
+#undef EXPOSE
%}
getter Window::document()
diff --git a/test/js/index.html b/test/js/index.html
index 56482ec98..e3cecd682 100644
--- a/test/js/index.html
+++ b/test/js/index.html
@@ -69,6 +69,7 @@
<ul>
<li><a href="assorted-log-doc-write.html">console.log and document.write</a></li>
<li><a href="wikipedia-lcm.html">Example from wikipedia</a></li>
+<li><a href="verify-instanceofness.html">Check instanceof behaviour</a></li>
</ul>
</body>
diff --git a/test/js/verify-instanceofness.html b/test/js/verify-instanceofness.html
new file mode 100644
index 000000000..631dc99c4
--- /dev/null
+++ b/test/js/verify-instanceofness.html
@@ -0,0 +1,40 @@
+<html>
+ <head><title>Verify instanceof checking</title></head>
+ <body>
+ <h1>Check instanceof behaviour</h1>
+ <table cellpadding=2 border=1>
+ <tr><th>A</th><th>instanceof</th><th>B</th><th>?</th><th>Correct?</th></tr>
+ <script>
+var checks = [
+ [ "window", "Window", true ],
+ [ "document", "HTMLDocument", true ],
+ [ "document.head", "Node", true ],
+ [ "document.getElementsByTagName(\"body\")", "HTMLCollection", true ],
+ [ "document.body", "Window", false ],
+ [ "EventListener", "Object", undefined ],
+];
+
+for (var _check in checks) {
+ var check = checks[_check];
+ document.write("<tr>");
+ document.write("<td>" + check[0] + "</td><td>instanceof</td><td>" + check[1] + "</td>");
+ try {
+ var A = eval(check[0]);
+ var B = eval(check[1]);
+ var C = check[2];
+ var V = A instanceof B;
+ var OK = V == C;
+ document.write("<td>" + V + "</td><td>" + (OK ? "YES" : "<b style=\"color: red\">NO</b>") + "</td>");
+ } catch (e) {
+ if (check[2] == undefined) {
+ document.write("<td>" + e + "</td><td>YES</td>");
+ } else {
+ document.write("<td colspan=2><b style=\"color: red\">" + e + "</b></td>");
+ }
+ }
+ document.write("</tr>");
+}
+ </script>
+ </table>
+ </body>
+</html>