2009-06-02 Albert J. Wong <ajwong@chromium.org>
[WebKit-https.git] / WebCore / bindings / v8 / V8Utilities.h
index 7fe7e45..5769910 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
 #ifndef V8Utilities_h
 #define V8Utilities_h
 
+// FIXME: Remove once chromium dependencies on v8_utility.h are removed.
+#define V8UTILITIES_DEFINED 1
+
 #include <v8.h>
 
 namespace WebCore {
 
-class Frame;
-class KURL;
-class String;
+    class Frame;
+    class KURL;
+    class String;
+
+    // Use an array to hold dependents. It works like a ref-counted scheme. A value can be added more than once to the DOM object.
+    void createHiddenDependency(v8::Local<v8::Object>, v8::Local<v8::Value>, int cacheIndex);
+    void removeHiddenDependency(v8::Local<v8::Object>, v8::Local<v8::Value>, int cacheIndex);
+
+    bool processingUserGesture();
+    bool shouldAllowNavigation(Frame*);
+    KURL completeURL(const String& relativeURL);
+    void navigateIfAllowed(Frame*, const KURL&, bool lockHistory, bool lockBackForwardList);
+
+    class AllowAllocation {
+    public:
+        inline AllowAllocation()
+        {
+            m_previous = m_current;
+            m_current = true;
+        }
+
+        inline ~AllowAllocation()
+        {
+            m_current = m_previous;
+        }
+
+        static bool m_current;
+
+    private:
+        bool m_previous;
+    };
+
+    class SafeAllocation {
+     public:
+      static inline v8::Local<v8::Object> newInstance(v8::Handle<v8::Function>);
+      static inline v8::Local<v8::Object> newInstance(v8::Handle<v8::ObjectTemplate>);
+      static inline v8::Local<v8::Object> newInstance(v8::Handle<v8::Function>, int argc, v8::Handle<v8::Value> argv[]);
+
+      // FIXME: These NewInstance functions are here to ease upstreaming. Remove along with V8UTILITIES_DEFINED once chromium dependencies on v8_utility.h are removed.
+      static inline v8::Local<v8::Object> NewInstance(v8::Handle<v8::Function>);
+      static inline v8::Local<v8::Object> NewInstance(v8::Handle<v8::ObjectTemplate>);
+      static inline v8::Local<v8::Object> NewInstance(v8::Handle<v8::Function>, int argc, v8::Handle<v8::Value> argv[]);
+    };
+
+    v8::Local<v8::Object> SafeAllocation::newInstance(v8::Handle<v8::Function> function)
+    {
+        if (function.IsEmpty())
+            return v8::Local<v8::Object>();
+        AllowAllocation allow;
+        return function->NewInstance();
+    }
+
+    v8::Local<v8::Object> SafeAllocation::newInstance(v8::Handle<v8::ObjectTemplate> objectTemplate)
+    {
+        if (objectTemplate.IsEmpty())
+            return v8::Local<v8::Object>();
+        AllowAllocation allow;
+        return objectTemplate->NewInstance();
+    }
+
+    v8::Local<v8::Object> SafeAllocation::newInstance(v8::Handle<v8::Function> function, int argc, v8::Handle<v8::Value> argv[])
+    {
+        if (function.IsEmpty())
+            return v8::Local<v8::Object>();
+        AllowAllocation allow;
+        return function->NewInstance(argc, argv);
+    }
+
+    // FIXME: These NewInstance functions are here to ease upstreaming. Remove along with V8UTILITIES_DEFINED once chromium dependencies on v8_utility.h are removed.
+    v8::Local<v8::Object> SafeAllocation::NewInstance(v8::Handle<v8::Function> function)
+    {
+        return newInstance(function);
+    }
 
-// Use an array to hold dependents. It works like a ref-counted scheme.
-// A value can be added more than once to the DOM object.
-void createHiddenDependency(v8::Local<v8::Object>, v8::Local<v8::Value>, int cacheIndex);
-void removeHiddenDependency(v8::Local<v8::Object>, v8::Local<v8::Value>, int cacheIndex);
+    v8::Local<v8::Object> SafeAllocation::NewInstance(v8::Handle<v8::ObjectTemplate> objectTemplate)
+    {
+        return newInstance(objectTemplate);
+    }
 
-bool processingUserGesture();
-bool shouldAllowNavigation(Frame* frame);
-KURL completeURL(const String& relativeURL);
-void navigateIfAllowed(Frame* frame, const KURL& url, bool lockHistory, bool lockBackForwardList);
+    v8::Local<v8::Object> SafeAllocation::NewInstance(v8::Handle<v8::Function> function, int argc, v8::Handle<v8::Value> argv[])
+    {
+        return newInstance(function, argc, argv);
+    }
 
 } // namespace WebCore