Import Cobalt 2.10999 2016-09-15
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousIndexedGetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousIndexedGetterInterface.cc
index 50d42d0..5eedc39 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousIndexedGetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::AnonymousIndexedGetterInterface;
 using cobalt::bindings::testing::JSCAnonymousIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedGetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedGetterInterface.cc
index 9aea555..6609882 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedGetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/jsc_property_enumerator.h"
@@ -55,7 +55,7 @@
 using cobalt::bindings::testing::AnonymousNamedGetterInterface;
 using cobalt::bindings::testing::JSCAnonymousNamedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,18 +75,18 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSCPropertyEnumerator;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedIndexedGetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedIndexedGetterInterface.cc
index 9bc585c..c480879 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCAnonymousNamedIndexedGetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/jsc_property_enumerator.h"
@@ -55,7 +55,7 @@
 using cobalt::bindings::testing::AnonymousNamedIndexedGetterInterface;
 using cobalt::bindings::testing::JSCAnonymousNamedIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,18 +75,18 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSCPropertyEnumerator;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCArbitraryInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCArbitraryInterface.cc
index f76b17c..eca2811 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCArbitraryInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCArbitraryInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCBaseInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCBaseInterface.cc
index 44ab166..a213d74 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCBaseInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCBaseInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::BaseInterface;
 using cobalt::bindings::testing::JSCBaseInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCBooleanTypeTestInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCBooleanTypeTestInterface.cc
index f43fee7..2475f5c 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCBooleanTypeTestInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCBooleanTypeTestInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::BooleanTypeTestInterface;
 using cobalt::bindings::testing::JSCBooleanTypeTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCCallbackFunctionInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCCallbackFunctionInterface.cc
index 166d3b5..76a3234 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCCallbackFunctionInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCCallbackFunctionInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCCallbackInterfaceInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCCallbackInterfaceInterface.cc
index 389cc42..9341213 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCCallbackInterfaceInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCCallbackInterfaceInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCSingleOperationInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::JSCSingleOperationInterface;
 using cobalt::bindings::testing::SingleOperationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCConditionalInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCConditionalInterface.cc
index d33347b..0089ce1 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCConditionalInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCConditionalInterface.cc
@@ -27,7 +27,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -56,7 +56,7 @@
 using cobalt::bindings::testing::ConditionalInterface;
 using cobalt::bindings::testing::JSCConditionalInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -76,17 +76,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCConstantsInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCConstantsInterface.cc
index 9349ec7..5d3edd7 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCConstantsInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCConstantsInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::ConstantsInterface;
 using cobalt::bindings::testing::JSCConstantsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCConstructorInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCConstructorInterface.cc
index 469ad81..6b3a7b5 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCConstructorInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::ConstructorInterface;
 using cobalt::bindings::testing::JSCConstructorInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCConstructorWithArgumentsInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCConstructorWithArgumentsInterface.cc
index 5bd8415..7b6daf2 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCConstructorWithArgumentsInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCConstructorWithArgumentsInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::ConstructorWithArgumentsInterface;
 using cobalt::bindings::testing::JSCConstructorWithArgumentsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCDOMStringTestInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCDOMStringTestInterface.cc
index 6db2e1d..548363d 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCDOMStringTestInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCDOMStringTestInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::DOMStringTestInterface;
 using cobalt::bindings::testing::JSCDOMStringTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCDerivedGetterSetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCDerivedGetterSetterInterface.cc
index dea3e49..232db13 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCDerivedGetterSetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCDerivedGetterSetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/jsc_property_enumerator.h"
@@ -55,7 +55,7 @@
 using cobalt::bindings::testing::DerivedGetterSetterInterface;
 using cobalt::bindings::testing::JSCDerivedGetterSetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,18 +75,18 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSCPropertyEnumerator;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCDerivedInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCDerivedInterface.cc
index 5a523e7..593115f 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCDerivedInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCDerivedInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::DerivedInterface;
 using cobalt::bindings::testing::JSCDerivedInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCDisabledInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCDisabledInterface.cc
index 509c844..5777066 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCDisabledInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCDisabledInterface.cc
@@ -27,7 +27,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -56,7 +56,7 @@
 using cobalt::bindings::testing::DisabledInterface;
 using cobalt::bindings::testing::JSCDisabledInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -76,17 +76,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCEnumerationInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCEnumerationInterface.cc
index ef85297..71cdd9c 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCEnumerationInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCEnumerationInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::EnumerationInterface;
 using cobalt::bindings::testing::JSCEnumerationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCExceptionObjectInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCExceptionObjectInterface.cc
index c3da33c..181d9cd 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCExceptionObjectInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCExceptionObjectInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -55,7 +55,7 @@
 using cobalt::bindings::testing::ExceptionObjectInterface;
 using cobalt::bindings::testing::JSCExceptionObjectInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,17 +75,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCExceptionsInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCExceptionsInterface.cc
index 52ff3d2..85d38bf 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCExceptionsInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCExceptionsInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::ExceptionsInterface;
 using cobalt::bindings::testing::JSCExceptionsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCExtendedIDLAttributesInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCExtendedIDLAttributesInterface.cc
index 9a96bbb..76d5efe 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCExtendedIDLAttributesInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCExtendedIDLAttributesInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::ExtendedIDLAttributesInterface;
 using cobalt::bindings::testing::JSCExtendedIDLAttributesInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCGarbageCollectionTestInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCGarbageCollectionTestInterface.cc
index 1be5fcd..baad3b5 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCGarbageCollectionTestInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCGarbageCollectionTestInterface.cc
@@ -25,9 +25,11 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
+#include "JSCGarbageCollectionTestInterface.h"
+#include "cobalt/bindings/testing/garbage_collection_test_interface.h"
 
 #include "cobalt/script/javascriptcore/constructor_base.h"
 #include "cobalt/script/javascriptcore/conversion_helpers.h"
@@ -35,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -53,8 +55,10 @@
 namespace {
 using cobalt::bindings::testing::GarbageCollectionTestInterface;
 using cobalt::bindings::testing::JSCGarbageCollectionTestInterface;
+using cobalt::bindings::testing::GarbageCollectionTestInterface;
+using cobalt::bindings::testing::JSCGarbageCollectionTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
@@ -95,6 +99,22 @@
 namespace testing {
 
 namespace {
+JSC::JSValue getJSprevious(
+    JSC::ExecState* exec_state,
+    JSC::JSValue slot_base,
+    JSC::PropertyName property_name);
+void setJSprevious(
+    JSC::ExecState* exec,
+    JSC::JSObject* this_object,
+    JSC::JSValue value);
+JSC::JSValue getJSnext(
+    JSC::ExecState* exec_state,
+    JSC::JSValue slot_base,
+    JSC::PropertyName property_name);
+void setJSnext(
+    JSC::ExecState* exec,
+    JSC::JSObject* this_object,
+    JSC::JSValue value);
 JSC::EncodedJSValue constructorJSGarbageCollectionTestInterface(JSC::ExecState*);
 
 // These are declared unconditionally, but only defined if needed by the
@@ -119,6 +139,13 @@
 #else
 const bool s_use_debug_missing_property_handler = false;
 #endif
+scoped_refptr<Wrappable> GetOpaqueRootFromWrappable(
+    const scoped_refptr<Wrappable>& wrappable) {
+  GarbageCollectionTestInterface* impl =
+      base::polymorphic_downcast<GarbageCollectionTestInterface*>(wrappable.get());
+  Wrappable* opaque_root = impl->GetHead();
+  return make_scoped_refptr<Wrappable>(opaque_root);
+}
 }  // namespace
 
 // Class that defines a JS Object representing this interface's Interface Object
@@ -396,13 +423,25 @@
 // End of JSCGarbageCollectionTestInterface::Prototype class
 
 const JSC::HashTableValue JSCGarbageCollectionTestInterface::property_table_values[] = {
+    { "previous",
+        JSC::DontDelete ,
+        reinterpret_cast<intptr_t>(getJSprevious),
+        reinterpret_cast<intptr_t>(setJSprevious),
+        JSC::NoIntrinsic
+    },
+    { "next",
+        JSC::DontDelete ,
+        reinterpret_cast<intptr_t>(getJSnext),
+        reinterpret_cast<intptr_t>(setJSnext),
+        JSC::NoIntrinsic
+    },
     { 0, 0, 0, 0, static_cast<JSC::Intrinsic>(0) }
 };  // JSCGarbageCollectionTestInterface::property_table_values
 
 // static
 const JSC::HashTable JSCGarbageCollectionTestInterface::property_table_prototype = {
-    2,  // compactSize
-    1,  // compactSizeMask
+    9,  // compactSize
+    7,  // compactSizeMask
     property_table_values,
     NULL  // table allocated at runtime
 };  // JSCGarbageCollectionTestInterface::property_table_prototype
@@ -491,6 +530,7 @@
     ScriptObjectRegistry* script_object_registry,
     const scoped_refptr<GarbageCollectionTestInterface>& impl)
     : BaseClass(global_data, structure, script_object_registry, impl) {
+  set_get_opaque_root_function(base::Bind(&GetOpaqueRootFromWrappable));
 }
 
 void JSCGarbageCollectionTestInterface::finishCreation(JSC::JSGlobalData& global_data) {
@@ -606,6 +646,98 @@
 
 namespace {
 
+JSC::JSValue getJSprevious(
+    JSC::ExecState* exec_state,
+    JSC::JSValue slot_base,
+    JSC::PropertyName property_name) {
+  TRACE_EVENT0("JSCGarbageCollectionTestInterface", "get previous");
+  JSCGlobalObject* global_object =
+      JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
+  GarbageCollectionTestInterface* impl =
+      GetWrappableOrSetException<GarbageCollectionTestInterface>(exec_state, slot_base);
+  if (!impl) {
+    return exec_state->exception();
+  }
+
+  JSC::JSValue result = ToJSValue(
+      global_object,
+      impl->previous());
+  return result;
+}
+
+void setJSprevious(
+    JSC::ExecState* exec_state,
+    JSC::JSObject* this_object,
+    JSC::JSValue value) {
+  TRACE_EVENT0("JSCGarbageCollectionTestInterface", "set previous");
+  JSCGlobalObject* global_object =
+      JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
+  JSCExceptionState exception_state(global_object);
+  GarbageCollectionTestInterface* impl =
+      GetWrappableOrSetException<GarbageCollectionTestInterface>(exec_state, this_object);
+  if (!impl) {
+    return;
+  }
+  TypeTraits<scoped_refptr<GarbageCollectionTestInterface> >::ConversionType cobalt_value;
+  FromJSValue(exec_state, value,
+      (kConversionFlagNullable), &exception_state,
+      &cobalt_value);
+  if (exception_state.is_exception_set()) {
+    JSC::throwError(exec_state, exception_state.exception_object());
+    return;
+  }
+  // Check if argument conversion raised an exception.
+  if (!exec_state->hadException()) {
+    impl->set_previous(cobalt_value);
+  }
+}
+
+JSC::JSValue getJSnext(
+    JSC::ExecState* exec_state,
+    JSC::JSValue slot_base,
+    JSC::PropertyName property_name) {
+  TRACE_EVENT0("JSCGarbageCollectionTestInterface", "get next");
+  JSCGlobalObject* global_object =
+      JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
+  GarbageCollectionTestInterface* impl =
+      GetWrappableOrSetException<GarbageCollectionTestInterface>(exec_state, slot_base);
+  if (!impl) {
+    return exec_state->exception();
+  }
+
+  JSC::JSValue result = ToJSValue(
+      global_object,
+      impl->next());
+  return result;
+}
+
+void setJSnext(
+    JSC::ExecState* exec_state,
+    JSC::JSObject* this_object,
+    JSC::JSValue value) {
+  TRACE_EVENT0("JSCGarbageCollectionTestInterface", "set next");
+  JSCGlobalObject* global_object =
+      JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
+  JSCExceptionState exception_state(global_object);
+  GarbageCollectionTestInterface* impl =
+      GetWrappableOrSetException<GarbageCollectionTestInterface>(exec_state, this_object);
+  if (!impl) {
+    return;
+  }
+  TypeTraits<scoped_refptr<GarbageCollectionTestInterface> >::ConversionType cobalt_value;
+  FromJSValue(exec_state, value,
+      (kConversionFlagNullable), &exception_state,
+      &cobalt_value);
+  if (exception_state.is_exception_set()) {
+    JSC::throwError(exec_state, exception_state.exception_object());
+    return;
+  }
+  // Check if argument conversion raised an exception.
+  if (!exec_state->hadException()) {
+    impl->set_next(cobalt_value);
+  }
+}
+
 JSC::EncodedJSValue constructorJSGarbageCollectionTestInterface(JSC::ExecState* exec_state) {
   JSCGlobalObject* global_object =
       JSC::jsCast<JSCGlobalObject*>(exec_state->lexicalGlobalObject());
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCGetOpaqueRootInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCGetOpaqueRootInterface.cc
index f03be81..fc23cda 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCGetOpaqueRootInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCGetOpaqueRootInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::GetOpaqueRootInterface;
 using cobalt::bindings::testing::JSCGetOpaqueRootInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCGlobalInterfaceParent.cc b/src/cobalt/bindings/generated/jsc/testing/JSCGlobalInterfaceParent.cc
index e5fe2e0..2f652df 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCGlobalInterfaceParent.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCGlobalInterfaceParent.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::GlobalInterfaceParent;
 using cobalt::bindings::testing::JSCGlobalInterfaceParent;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCIndexedGetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCIndexedGetterInterface.cc
index 550c106..5e4331f 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCIndexedGetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::IndexedGetterInterface;
 using cobalt::bindings::testing::JSCIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCInterfaceWithUnsupportedProperties.cc b/src/cobalt/bindings/generated/jsc/testing/JSCInterfaceWithUnsupportedProperties.cc
index 120fe3e..9630469 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCInterfaceWithUnsupportedProperties.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCInterfaceWithUnsupportedProperties.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::InterfaceWithUnsupportedProperties;
 using cobalt::bindings::testing::JSCInterfaceWithUnsupportedProperties;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNamedConstructorInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNamedConstructorInterface.cc
index 2bc9bbe..cc0dd24 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNamedConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNamedConstructorInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::NamedConstructorInterface;
 using cobalt::bindings::testing::JSCNamedConstructorInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNamedGetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNamedGetterInterface.cc
index 63bcfde..798d0bb 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNamedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNamedGetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/jsc_property_enumerator.h"
@@ -55,7 +55,7 @@
 using cobalt::bindings::testing::NamedGetterInterface;
 using cobalt::bindings::testing::JSCNamedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,18 +75,18 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSCPropertyEnumerator;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNamedIndexedGetterInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNamedIndexedGetterInterface.cc
index 35ff21d..2a51847 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNamedIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNamedIndexedGetterInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/jsc_property_enumerator.h"
@@ -55,7 +55,7 @@
 using cobalt::bindings::testing::NamedIndexedGetterInterface;
 using cobalt::bindings::testing::JSCNamedIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,18 +75,18 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSCPropertyEnumerator;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNestedPutForwardsInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNestedPutForwardsInterface.cc
index 8e87456..513cf41 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNestedPutForwardsInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNestedPutForwardsInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCPutForwardsInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::JSCPutForwardsInterface;
 using cobalt::bindings::testing::PutForwardsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNoConstructorInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNoConstructorInterface.cc
index c903142..00e0958 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNoConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNoConstructorInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::NoConstructorInterface;
 using cobalt::bindings::testing::JSCNoConstructorInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNoInterfaceObjectInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNoInterfaceObjectInterface.cc
index 9d10bc1..4b881d4 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNoInterfaceObjectInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNoInterfaceObjectInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::NoInterfaceObjectInterface;
 using cobalt::bindings::testing::JSCNoInterfaceObjectInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNullableTypesTestInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNullableTypesTestInterface.cc
index c6ef2d6..d761485 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNullableTypesTestInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNullableTypesTestInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCNumericTypesTestInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCNumericTypesTestInterface.cc
index e76d0d6..37c3b08 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCNumericTypesTestInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCNumericTypesTestInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::NumericTypesTestInterface;
 using cobalt::bindings::testing::JSCNumericTypesTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCObjectTypeBindingsInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCObjectTypeBindingsInterface.cc
index f51cb79..805a983 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCObjectTypeBindingsInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCObjectTypeBindingsInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -41,8 +41,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -66,7 +66,7 @@
 using cobalt::bindings::testing::JSCBaseInterface;
 using cobalt::bindings::testing::JSCDerivedInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -86,17 +86,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCOperationsTestInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCOperationsTestInterface.cc
index 2f95415..6f93029 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCOperationsTestInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCOperationsTestInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCPutForwardsInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCPutForwardsInterface.cc
index dd16e18..dd276b7 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCPutForwardsInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCPutForwardsInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCStaticPropertiesInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCStaticPropertiesInterface.cc
index 4270480..96a29ac 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCStaticPropertiesInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCStaticPropertiesInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -37,8 +37,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -58,7 +58,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -78,17 +78,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAnonymousOperationInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAnonymousOperationInterface.cc
index 9dd818d..c69637a 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAnonymousOperationInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAnonymousOperationInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::StringifierAnonymousOperationInterface;
 using cobalt::bindings::testing::JSCStringifierAnonymousOperationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAttributeInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAttributeInterface.cc
index 1d17a76..a12e243 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAttributeInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCStringifierAttributeInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::StringifierAttributeInterface;
 using cobalt::bindings::testing::JSCStringifierAttributeInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCStringifierOperationInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCStringifierOperationInterface.cc
index a0d5bfe..d6d7367 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCStringifierOperationInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCStringifierOperationInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::StringifierOperationInterface;
 using cobalt::bindings::testing::JSCStringifierOperationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCTargetInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCTargetInterface.cc
index d6f2838..60d81da 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCTargetInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCTargetInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,8 +35,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -54,7 +54,7 @@
 using cobalt::bindings::testing::TargetInterface;
 using cobalt::bindings::testing::JSCTargetInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -74,17 +74,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCUnionTypesInterface.cc b/src/cobalt/bindings/generated/jsc/testing/JSCUnionTypesInterface.cc
index 2b7afe1..cf5c3d4 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCUnionTypesInterface.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCUnionTypesInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCArbitraryInterface.h"
@@ -39,8 +39,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -62,7 +62,7 @@
 using cobalt::bindings::testing::JSCArbitraryInterface;
 using cobalt::bindings::testing::JSCBaseInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -82,17 +82,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
diff --git a/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc b/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc
index 45c9bf3..967933d 100644
--- a/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc
+++ b/src/cobalt/bindings/generated/jsc/testing/JSCWindow.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "JSCAnonymousIndexedGetterInterface.h"
@@ -125,8 +125,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/type_traits.h"
@@ -242,7 +242,7 @@
 using cobalt::bindings::testing::UnionTypesInterface;
 using cobalt::bindings::testing::Window;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -262,17 +262,17 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
@@ -1192,17 +1192,17 @@
 namespace script {
 
 template<>
-void GlobalObjectProxy::CreateGlobalObject<Window>(
+void GlobalEnvironment::CreateGlobalObject<Window>(
     const scoped_refptr<Window>& global_interface,
     EnvironmentSettings* environment_settings) {
-  JSCGlobalObjectProxy* jsc_global_object_proxy =
-      base::polymorphic_downcast<JSCGlobalObjectProxy*>(this);
-  JSCEngine* jsc_engine = jsc_global_object_proxy->engine();
+  JSCGlobalEnvironment* jsc_global_environment =
+      base::polymorphic_downcast<JSCGlobalEnvironment*>(this);
+  JSCEngine* jsc_engine = jsc_global_environment->engine();
 
   JSCGlobalObject* global_object = JSCWindow::Create(
       global_interface, environment_settings,
       jsc_engine->global_data(), jsc_engine->script_object_registry());
-  jsc_global_object_proxy->SetGlobalObject(global_object);
+  jsc_global_environment->SetGlobalObject(global_object);
 }
 
 // MSVS compiler does not need this explicit instantiation, and generates a
@@ -1212,7 +1212,7 @@
 // This is needed to prevent link errors when trying to resolve the template
 // instantiation.
 template
-void GlobalObjectProxy::CreateGlobalObject<Window>(
+void GlobalEnvironment::CreateGlobalObject<Window>(
     const scoped_refptr<Window>& global_interface,
     EnvironmentSettings* environment_settings);
 #endif
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc
index 8e92cae..be7915c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousIndexedGetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::AnonymousIndexedGetterInterface;
 using cobalt::bindings::testing::MozjsAnonymousIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -391,17 +391,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -411,10 +411,10 @@
 // static
 JSObject* MozjsAnonymousIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -433,10 +433,10 @@
 //static
 const JSClass* MozjsAnonymousIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc
index 5b5af82..5431665 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedGetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::AnonymousNamedGetterInterface;
 using cobalt::bindings::testing::MozjsAnonymousNamedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -363,17 +363,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -383,10 +383,10 @@
 // static
 JSObject* MozjsAnonymousNamedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -405,10 +405,10 @@
 //static
 const JSClass* MozjsAnonymousNamedGetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc
index 04c9194..388c186 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsAnonymousNamedIndexedGetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::AnonymousNamedIndexedGetterInterface;
 using cobalt::bindings::testing::MozjsAnonymousNamedIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -482,17 +482,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -502,10 +502,10 @@
 // static
 JSObject* MozjsAnonymousNamedIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -524,10 +524,10 @@
 //static
 const JSClass* MozjsAnonymousNamedIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc
index 1bc5cc0..71b31f2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsArbitraryInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -369,17 +369,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -389,10 +389,10 @@
 // static
 JSObject* MozjsArbitraryInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -411,10 +411,10 @@
 //static
 const JSClass* MozjsArbitraryInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc
index 7f786d8..bf4b5a3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsBaseInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::BaseInterface;
 using cobalt::bindings::testing::MozjsBaseInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -347,17 +347,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -367,10 +367,10 @@
 // static
 JSObject* MozjsBaseInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -389,10 +389,10 @@
 //static
 const JSClass* MozjsBaseInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc
index 190790f..1796c62 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsBooleanTypeTestInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::BooleanTypeTestInterface;
 using cobalt::bindings::testing::MozjsBooleanTypeTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -416,17 +416,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -436,10 +436,10 @@
 // static
 JSObject* MozjsBooleanTypeTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -458,10 +458,10 @@
 //static
 const JSClass* MozjsBooleanTypeTestInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc
index 60f4a71..0b7e907 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackFunctionInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -641,17 +641,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -661,10 +661,10 @@
 // static
 JSObject* MozjsCallbackFunctionInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -683,10 +683,10 @@
 //static
 const JSClass* MozjsCallbackFunctionInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc
index a827b91..d4321ff 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsCallbackInterfaceInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsSingleOperationInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::MozjsSingleOperationInterface;
 using cobalt::bindings::testing::SingleOperationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -414,17 +414,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -434,10 +434,10 @@
 // static
 JSObject* MozjsCallbackInterfaceInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -456,10 +456,10 @@
 //static
 const JSClass* MozjsCallbackInterfaceInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc
index 5b3a117..e8e5a7d 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConditionalInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -51,7 +51,7 @@
 using cobalt::bindings::testing::ConditionalInterface;
 using cobalt::bindings::testing::MozjsConditionalInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -69,7 +69,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -460,17 +460,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -480,10 +480,10 @@
 // static
 JSObject* MozjsConditionalInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -502,10 +502,10 @@
 //static
 const JSClass* MozjsConditionalInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc
index a874765..ee42e57 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstantsInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::ConstantsInterface;
 using cobalt::bindings::testing::MozjsConstantsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -325,17 +325,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -345,10 +345,10 @@
 // static
 JSObject* MozjsConstantsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -367,10 +367,10 @@
 //static
 const JSClass* MozjsConstantsInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc
index 4a0d825..af482d8 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::ConstructorInterface;
 using cobalt::bindings::testing::MozjsConstructorInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -284,17 +284,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -304,10 +304,10 @@
 // static
 JSObject* MozjsConstructorInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -326,10 +326,10 @@
 //static
 const JSClass* MozjsConstructorInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc
index c10d31d..09ccf2a 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsConstructorWithArgumentsInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::ConstructorWithArgumentsInterface;
 using cobalt::bindings::testing::MozjsConstructorWithArgumentsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -368,17 +368,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -388,10 +388,10 @@
 // static
 JSObject* MozjsConstructorWithArgumentsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -410,10 +410,10 @@
 //static
 const JSClass* MozjsConstructorWithArgumentsInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc
index 9492765..7fb410b 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDOMStringTestInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::DOMStringTestInterface;
 using cobalt::bindings::testing::MozjsDOMStringTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -528,17 +528,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -548,10 +548,10 @@
 // static
 JSObject* MozjsDOMStringTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -570,10 +570,10 @@
 //static
 const JSClass* MozjsDOMStringTestInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc
index 0831779..9d7f281 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedGetterSetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::DerivedGetterSetterInterface;
 using cobalt::bindings::testing::MozjsDerivedGetterSetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -691,17 +691,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -711,10 +711,10 @@
 // static
 JSObject* MozjsDerivedGetterSetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -733,10 +733,10 @@
 //static
 const JSClass* MozjsDerivedGetterSetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc
index 51928b3..8d64be2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDerivedInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::DerivedInterface;
 using cobalt::bindings::testing::MozjsDerivedInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -347,17 +347,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -367,10 +367,10 @@
 // static
 JSObject* MozjsDerivedInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -389,10 +389,10 @@
 //static
 const JSClass* MozjsDerivedInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc
index 0e86696..3f3d4a7 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsDisabledInterface.cc
@@ -25,7 +25,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -51,7 +51,7 @@
 using cobalt::bindings::testing::DisabledInterface;
 using cobalt::bindings::testing::MozjsDisabledInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -69,7 +69,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -359,17 +359,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -379,10 +379,10 @@
 // static
 JSObject* MozjsDisabledInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -401,10 +401,10 @@
 //static
 const JSClass* MozjsDisabledInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc
index 6810f89..c54bde2 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsEnumerationInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::EnumerationInterface;
 using cobalt::bindings::testing::MozjsEnumerationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -343,17 +343,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -363,10 +363,10 @@
 // static
 JSObject* MozjsEnumerationInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -385,10 +385,10 @@
 //static
 const JSClass* MozjsEnumerationInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc
index 4a0476a..64e3ca6 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionObjectInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -50,7 +50,7 @@
 using cobalt::bindings::testing::ExceptionObjectInterface;
 using cobalt::bindings::testing::MozjsExceptionObjectInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -68,7 +68,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -332,17 +332,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -352,10 +352,10 @@
 // static
 JSObject* MozjsExceptionObjectInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -374,10 +374,10 @@
 //static
 const JSClass* MozjsExceptionObjectInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc
index cc462b9..5f1a396 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExceptionsInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::ExceptionsInterface;
 using cobalt::bindings::testing::MozjsExceptionsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -369,17 +369,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -389,10 +389,10 @@
 // static
 JSObject* MozjsExceptionsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -411,10 +411,10 @@
 //static
 const JSClass* MozjsExceptionsInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc
index ea9bef6..07cceda 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsExtendedIDLAttributesInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::ExtendedIDLAttributesInterface;
 using cobalt::bindings::testing::MozjsExtendedIDLAttributesInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -208,10 +208,10 @@
       WrapperPrivate::GetFromObject(context, object);
   ExtendedIDLAttributesInterface* impl =
       wrapper_private->wrappable<ExtendedIDLAttributesInterface>().get();
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
 
-  impl->CallWithSettings(global_object_proxy->GetEnvironmentSettings());
+  impl->CallWithSettings(global_environment->GetEnvironmentSettings());
   result_value.set(JS::UndefinedHandleValue);
   return !exception_state.is_exception_set();
 }
@@ -309,17 +309,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -329,10 +329,10 @@
 // static
 JSObject* MozjsExtendedIDLAttributesInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -351,10 +351,10 @@
 //static
 const JSClass* MozjsExtendedIDLAttributesInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGarbageCollectionTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsGarbageCollectionTestInterface.cc
index 98eff0f..16e4b25 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGarbageCollectionTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGarbageCollectionTestInterface.cc
@@ -23,9 +23,11 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
+#include "MozjsGarbageCollectionTestInterface.h"
+#include "cobalt/bindings/testing/garbage_collection_test_interface.h"
 
 #include "base/lazy_instance.h"
 #include "cobalt/script/mozjs/callback_function_conversion.h"
@@ -33,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -48,8 +50,10 @@
 namespace {
 using cobalt::bindings::testing::GarbageCollectionTestInterface;
 using cobalt::bindings::testing::MozjsGarbageCollectionTestInterface;
+using cobalt::bindings::testing::GarbageCollectionTestInterface;
+using cobalt::bindings::testing::MozjsGarbageCollectionTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -84,6 +88,13 @@
 
 namespace {
 
+Wrappable* GetOpaqueRootFromWrappable(
+    const scoped_refptr<Wrappable>& wrappable) {
+  GarbageCollectionTestInterface* impl =
+      base::polymorphic_downcast<GarbageCollectionTestInterface*>(wrappable.get());
+  return impl->GetHead();
+}
+
 class MozjsGarbageCollectionTestInterfaceHandler : public ProxyHandler {
  public:
   MozjsGarbageCollectionTestInterfaceHandler()
@@ -188,8 +199,108 @@
   return interface_data;
 }
 
+JSBool get_previous(
+    JSContext* context, JS::HandleObject object, JS::HandleId id,
+    JS::MutableHandleValue vp) {
+  MozjsExceptionState exception_state(context);
+  JS::RootedValue result_value(context);
+
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromObject(context, object);
+  GarbageCollectionTestInterface* impl =
+      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
+
+  if (!exception_state.is_exception_set()) {
+    ToJSValue(context,
+              impl->previous(),
+              &result_value);
+  }
+  if (!exception_state.is_exception_set()) {
+    vp.set(result_value);
+  }
+  return !exception_state.is_exception_set();
+}
+
+JSBool set_previous(
+    JSContext* context, JS::HandleObject object, JS::HandleId id,
+    JSBool strict, JS::MutableHandleValue vp) {
+  MozjsExceptionState exception_state(context);
+  JS::RootedValue result_value(context);
+
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromObject(context, object);
+  GarbageCollectionTestInterface* impl =
+      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
+  TypeTraits<scoped_refptr<GarbageCollectionTestInterface> >::ConversionType value;
+  FromJSValue(context, vp, (kConversionFlagNullable), &exception_state,
+              &value);
+  if (exception_state.is_exception_set()) {
+    return false;
+  }
+
+  impl->set_previous(value);
+  result_value.set(JS::UndefinedHandleValue);
+  return !exception_state.is_exception_set();
+}
+
+JSBool get_next(
+    JSContext* context, JS::HandleObject object, JS::HandleId id,
+    JS::MutableHandleValue vp) {
+  MozjsExceptionState exception_state(context);
+  JS::RootedValue result_value(context);
+
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromObject(context, object);
+  GarbageCollectionTestInterface* impl =
+      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
+
+  if (!exception_state.is_exception_set()) {
+    ToJSValue(context,
+              impl->next(),
+              &result_value);
+  }
+  if (!exception_state.is_exception_set()) {
+    vp.set(result_value);
+  }
+  return !exception_state.is_exception_set();
+}
+
+JSBool set_next(
+    JSContext* context, JS::HandleObject object, JS::HandleId id,
+    JSBool strict, JS::MutableHandleValue vp) {
+  MozjsExceptionState exception_state(context);
+  JS::RootedValue result_value(context);
+
+  WrapperPrivate* wrapper_private =
+      WrapperPrivate::GetFromObject(context, object);
+  GarbageCollectionTestInterface* impl =
+      wrapper_private->wrappable<GarbageCollectionTestInterface>().get();
+  TypeTraits<scoped_refptr<GarbageCollectionTestInterface> >::ConversionType value;
+  FromJSValue(context, vp, (kConversionFlagNullable), &exception_state,
+              &value);
+  if (exception_state.is_exception_set()) {
+    return false;
+  }
+
+  impl->set_next(value);
+  result_value.set(JS::UndefinedHandleValue);
+  return !exception_state.is_exception_set();
+}
+
 
 const JSPropertySpec prototype_properties[] = {
+  {  // Read/Write property
+      "previous", 0,
+      JSPROP_SHARED | JSPROP_ENUMERATE,
+      JSOP_WRAPPER(&get_previous),
+      JSOP_WRAPPER(&set_previous),
+  },
+  {  // Read/Write property
+      "next", 0,
+      JSPROP_SHARED | JSPROP_ENUMERATE,
+      JSOP_WRAPPER(&get_next),
+      JSOP_WRAPPER(&set_next),
+  },
   JS_PS_END
 };
 
@@ -284,17 +395,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -304,10 +415,10 @@
 // static
 JSObject* MozjsGarbageCollectionTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -319,17 +430,19 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
+  WrapperPrivate::GetOpaqueRootFunction get_root =
+      base::Bind(&GetOpaqueRootFromWrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable, get_root);
   return proxy;
 }
 
 //static
 const JSClass* MozjsGarbageCollectionTestInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc
index 1ac39e0..fbb57b3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGetOpaqueRootInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::GetOpaqueRootInterface;
 using cobalt::bindings::testing::MozjsGetOpaqueRootInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -84,6 +84,13 @@
 
 namespace {
 
+Wrappable* GetOpaqueRootFromWrappable(
+    const scoped_refptr<Wrappable>& wrappable) {
+  GetOpaqueRootInterface* impl =
+      base::polymorphic_downcast<GetOpaqueRootInterface*>(wrappable.get());
+  return impl->get_opaque_root_function_name();
+}
+
 class MozjsGetOpaqueRootInterfaceHandler : public ProxyHandler {
  public:
   MozjsGetOpaqueRootInterfaceHandler()
@@ -284,17 +291,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -304,10 +311,10 @@
 // static
 JSObject* MozjsGetOpaqueRootInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -319,17 +326,19 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
+  WrapperPrivate::GetOpaqueRootFunction get_root =
+      base::Bind(&GetOpaqueRootFromWrappable);
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable, get_root);
   return proxy;
 }
 
 //static
 const JSClass* MozjsGetOpaqueRootInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc
index 462c526..d742500 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsGlobalInterfaceParent.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::GlobalInterfaceParent;
 using cobalt::bindings::testing::MozjsGlobalInterfaceParent;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -307,17 +307,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -327,10 +327,10 @@
 // static
 JSObject* MozjsGlobalInterfaceParent::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -349,10 +349,10 @@
 //static
 const JSClass* MozjsGlobalInterfaceParent::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc
index b998abc..752334e 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsIndexedGetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::IndexedGetterInterface;
 using cobalt::bindings::testing::MozjsIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -583,17 +583,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -603,10 +603,10 @@
 // static
 JSObject* MozjsIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -625,10 +625,10 @@
 //static
 const JSClass* MozjsIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc
index 3253e9d..a578e9c 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsInterfaceWithUnsupportedProperties.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::InterfaceWithUnsupportedProperties;
 using cobalt::bindings::testing::MozjsInterfaceWithUnsupportedProperties;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -300,17 +300,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -320,10 +320,10 @@
 // static
 JSObject* MozjsInterfaceWithUnsupportedProperties::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -342,10 +342,10 @@
 //static
 const JSClass* MozjsInterfaceWithUnsupportedProperties::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc
index 82151fb..0bc85ff 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedConstructorInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::NamedConstructorInterface;
 using cobalt::bindings::testing::MozjsNamedConstructorInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -284,17 +284,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -304,10 +304,10 @@
 // static
 JSObject* MozjsNamedConstructorInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -326,10 +326,10 @@
 //static
 const JSClass* MozjsNamedConstructorInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc
index 90f7900..918f252 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedGetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::NamedGetterInterface;
 using cobalt::bindings::testing::MozjsNamedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -555,17 +555,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -575,10 +575,10 @@
 // static
 JSObject* MozjsNamedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -597,10 +597,10 @@
 //static
 const JSClass* MozjsNamedGetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc
index da310df..2965f0f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNamedIndexedGetterInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::NamedIndexedGetterInterface;
 using cobalt::bindings::testing::MozjsNamedIndexedGetterInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -815,17 +815,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -835,10 +835,10 @@
 // static
 JSObject* MozjsNamedIndexedGetterInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -857,10 +857,10 @@
 //static
 const JSClass* MozjsNamedIndexedGetterInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc
index 07cf2d8..69fab04 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNestedPutForwardsInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsPutForwardsInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::MozjsPutForwardsInterface;
 using cobalt::bindings::testing::PutForwardsInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -348,17 +348,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -368,10 +368,10 @@
 // static
 JSObject* MozjsNestedPutForwardsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -390,10 +390,10 @@
 //static
 const JSClass* MozjsNestedPutForwardsInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc
index 5780f10..acd16cd 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoConstructorInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::NoConstructorInterface;
 using cobalt::bindings::testing::MozjsNoConstructorInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -272,17 +272,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -292,10 +292,10 @@
 // static
 JSObject* MozjsNoConstructorInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -314,10 +314,10 @@
 //static
 const JSClass* MozjsNoConstructorInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc
index fc4d206..48f2709 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNoInterfaceObjectInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::NoInterfaceObjectInterface;
 using cobalt::bindings::testing::MozjsNoInterfaceObjectInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -232,17 +232,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -252,10 +252,10 @@
 // static
 JSObject* MozjsNoInterfaceObjectInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -274,10 +274,10 @@
 //static
 const JSClass* MozjsNoInterfaceObjectInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc
index bd4bfc0..c0010f4 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNullableTypesTestInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -852,17 +852,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -872,10 +872,10 @@
 // static
 JSObject* MozjsNullableTypesTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -894,10 +894,10 @@
 //static
 const JSClass* MozjsNullableTypesTestInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc
index d686d2b..4bf1c6e 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsNumericTypesTestInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::NumericTypesTestInterface;
 using cobalt::bindings::testing::MozjsNumericTypesTestInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -1712,17 +1712,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -1732,10 +1732,10 @@
 // static
 JSObject* MozjsNumericTypesTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -1754,10 +1754,10 @@
 //static
 const JSClass* MozjsNumericTypesTestInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc
index 286a091..1b20995 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsObjectTypeBindingsInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -39,7 +39,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -61,7 +61,7 @@
 using cobalt::bindings::testing::MozjsBaseInterface;
 using cobalt::bindings::testing::MozjsDerivedInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -79,7 +79,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -462,17 +462,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -482,10 +482,10 @@
 // static
 JSObject* MozjsObjectTypeBindingsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -504,10 +504,10 @@
 //static
 const JSClass* MozjsObjectTypeBindingsInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc
index aac9e9a..b30eecb 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsOperationsTestInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -735,9 +735,9 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       JS::RootedValue arg(context, args[0]);
-      MozjsGlobalObjectProxy* global_object_proxy =
-          static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-      WrapperFactory* wrapper_factory = global_object_proxy->wrapper_factory();
+      MozjsGlobalEnvironment* global_environment =
+          static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
       if (arg.isNumber()) {
         return fcn_overloadedFunction2(
                   context, argc, vp);
@@ -756,9 +756,9 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       JS::RootedValue arg(context, args[2]);
-      MozjsGlobalObjectProxy* global_object_proxy =
-          static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-      WrapperFactory* wrapper_factory = global_object_proxy->wrapper_factory();
+      MozjsGlobalEnvironment* global_environment =
+          static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
       if (arg.isObject() ? wrapper_factory->DoesObjectImplementInterface(
               JSVAL_TO_OBJECT(arg), base::GetTypeId<ArbitraryInterface>()) :
               false) {
@@ -880,9 +880,9 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       JS::RootedValue arg(context, args[0]);
-      MozjsGlobalObjectProxy* global_object_proxy =
-          static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-      WrapperFactory* wrapper_factory = global_object_proxy->wrapper_factory();
+      MozjsGlobalEnvironment* global_environment =
+          static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
       if (arg.isNullOrUndefined()) {
         return fcn_overloadedNullable2(
                   context, argc, vp);
@@ -1530,17 +1530,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -1550,10 +1550,10 @@
 // static
 JSObject* MozjsOperationsTestInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -1572,10 +1572,10 @@
 //static
 const JSClass* MozjsOperationsTestInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc
index 12b04af..870e3a3 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsPutForwardsInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -389,17 +389,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -409,10 +409,10 @@
 // static
 JSObject* MozjsPutForwardsInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -431,10 +431,10 @@
 //static
 const JSClass* MozjsPutForwardsInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc
index e913609..02ad356 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStaticPropertiesInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -35,7 +35,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -53,7 +53,7 @@
 using cobalt::bindings::testing::ArbitraryInterface;
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -71,7 +71,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -422,9 +422,9 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       JS::RootedValue arg(context, args[0]);
-      MozjsGlobalObjectProxy* global_object_proxy =
-          static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-      WrapperFactory* wrapper_factory = global_object_proxy->wrapper_factory();
+      MozjsGlobalEnvironment* global_environment =
+          static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
       if (arg.isNumber()) {
         return staticfcn_staticFunction2(
                   context, argc, vp);
@@ -443,9 +443,9 @@
       // Overload resolution algorithm details found here:
       //     http://heycam.github.io/webidl/#dfn-overload-resolution-algorithm
       JS::RootedValue arg(context, args[2]);
-      MozjsGlobalObjectProxy* global_object_proxy =
-          static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-      WrapperFactory* wrapper_factory = global_object_proxy->wrapper_factory();
+      MozjsGlobalEnvironment* global_environment =
+          static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
       if (arg.isObject() ? wrapper_factory->DoesObjectImplementInterface(
               JSVAL_TO_OBJECT(arg), base::GetTypeId<ArbitraryInterface>()) :
               false) {
@@ -566,17 +566,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -586,10 +586,10 @@
 // static
 JSObject* MozjsStaticPropertiesInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -608,10 +608,10 @@
 //static
 const JSClass* MozjsStaticPropertiesInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc
index 0646f33..73b9c2f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAnonymousOperationInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::StringifierAnonymousOperationInterface;
 using cobalt::bindings::testing::MozjsStringifierAnonymousOperationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -310,17 +310,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -330,10 +330,10 @@
 // static
 JSObject* MozjsStringifierAnonymousOperationInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -352,10 +352,10 @@
 //static
 const JSClass* MozjsStringifierAnonymousOperationInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc
index 552e45b..b1b8349 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierAttributeInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::StringifierAttributeInterface;
 using cobalt::bindings::testing::MozjsStringifierAttributeInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -360,17 +360,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -380,10 +380,10 @@
 // static
 JSObject* MozjsStringifierAttributeInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -402,10 +402,10 @@
 //static
 const JSClass* MozjsStringifierAttributeInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc
index db390ad..6b6dd67 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsStringifierOperationInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::StringifierOperationInterface;
 using cobalt::bindings::testing::MozjsStringifierOperationInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -351,17 +351,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -371,10 +371,10 @@
 // static
 JSObject* MozjsStringifierOperationInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -393,10 +393,10 @@
 //static
 const JSClass* MozjsStringifierOperationInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc
index 3f3110e..644db8f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsTargetInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -33,7 +33,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -49,7 +49,7 @@
 using cobalt::bindings::testing::TargetInterface;
 using cobalt::bindings::testing::MozjsTargetInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -67,7 +67,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -342,17 +342,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -362,10 +362,10 @@
 // static
 JSObject* MozjsTargetInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -384,10 +384,10 @@
 //static
 const JSClass* MozjsTargetInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc
index df03fdc..5c9b31f 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsUnionTypesInterface.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsArbitraryInterface.h"
@@ -37,7 +37,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -57,7 +57,7 @@
 using cobalt::bindings::testing::MozjsArbitraryInterface;
 using cobalt::bindings::testing::MozjsBaseInterface;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -75,7 +75,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -480,17 +480,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -500,10 +500,10 @@
 // static
 JSObject* MozjsUnionTypesInterface::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -522,10 +522,10 @@
 //static
 const JSClass* MozjsUnionTypesInterface::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
diff --git a/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc b/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc
index 59ff86f..0a5ddd1 100644
--- a/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc
+++ b/src/cobalt/bindings/generated/mozjs/testing/MozjsWindow.cc
@@ -23,7 +23,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "MozjsAnonymousIndexedGetterInterface.h"
@@ -123,7 +123,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -237,7 +237,7 @@
 using cobalt::bindings::testing::UnionTypesInterface;
 using cobalt::bindings::testing::Window;
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -255,7 +255,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -467,12 +467,12 @@
       WrapperPrivate::GetFromObject(context, object);
   Window* impl =
       wrapper_private->wrappable<Window>().get();
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
 
   if (!exception_state.is_exception_set()) {
     ToJSValue(context,
-              impl->GetStackTrace(global_object_proxy->GetStackTrace()),
+              impl->GetStackTrace(global_environment->GetStackTrace()),
               &result_value);
   }
   if (!exception_state.is_exception_set()) {
@@ -621,17 +621,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -668,18 +668,18 @@
 
   // Set the global object proxy pointer, so we can access the standard classes
   // such as the base Object prototype when looking up our prototype.
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  global_object_proxy->SetGlobalObjectProxyAndWrapper(proxy, wrappable);
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+  global_environment->SetGlobalObjectProxyAndWrapper(proxy, wrappable);
   return proxy;
 }
 //static
 const JSClass* MozjsWindow::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
@@ -727,20 +727,20 @@
 namespace script {
 
 template<>
-void GlobalObjectProxy::CreateGlobalObject<Window>(
+void GlobalEnvironment::CreateGlobalObject<Window>(
     const scoped_refptr<Window>& global_interface,
     EnvironmentSettings* environment_settings) {
-  MozjsGlobalObjectProxy* mozjs_global_object_proxy =
-      base::polymorphic_downcast<MozjsGlobalObjectProxy*>(this);
-  JSContext* context = mozjs_global_object_proxy->context();
+  MozjsGlobalEnvironment* mozjs_global_environment =
+      base::polymorphic_downcast<MozjsGlobalEnvironment*>(this);
+  JSContext* context = mozjs_global_environment->context();
 
   JSAutoRequest auto_request(context);
   MozjsWindow::CreateProxy(
       context, global_interface);
-  mozjs_global_object_proxy->SetEnvironmentSettings(environment_settings);
+  mozjs_global_environment->SetEnvironmentSettings(environment_settings);
 
   WrapperFactory* wrapper_factory =
-      mozjs_global_object_proxy->wrapper_factory();
+      mozjs_global_environment->wrapper_factory();
   wrapper_factory->RegisterWrappableType(
       AnonymousIndexedGetterInterface::AnonymousIndexedGetterInterfaceWrappableType(),
       base::Bind(MozjsAnonymousIndexedGetterInterface::CreateProxy),
@@ -931,7 +931,7 @@
 // This is needed to prevent link errors when trying to resolve the template
 // instantiation.
 template
-void GlobalObjectProxy::CreateGlobalObject<Window>(
+void GlobalEnvironment::CreateGlobalObject<Window>(
     const scoped_refptr<Window>& global_interface,
     EnvironmentSettings* environment_settings);
 #endif
diff --git a/src/cobalt/bindings/javascriptcore/templates/interface.cc.template b/src/cobalt/bindings/javascriptcore/templates/interface.cc.template
index d8d37f1..4958230 100644
--- a/src/cobalt/bindings/javascriptcore/templates/interface.cc.template
+++ b/src/cobalt/bindings/javascriptcore/templates/interface.cc.template
@@ -24,8 +24,8 @@
 #include "cobalt/script/javascriptcore/jsc_callback_function.h"
 #include "cobalt/script/javascriptcore/jsc_callback_interface_holder.h"
 #include "cobalt/script/javascriptcore/jsc_exception_state.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 {% if named_property_getter %}
@@ -61,20 +61,20 @@
 using cobalt::script::javascriptcore::JSCCallbackInterfaceHolder;
 using cobalt::script::javascriptcore::JSCEngine;
 using cobalt::script::javascriptcore::JSCExceptionState;
+using cobalt::script::javascriptcore::JSCGlobalEnvironment;
+using cobalt::script::javascriptcore::JSCGlobalObject;
 using cobalt::script::javascriptcore::JSCObjectHandle;
 using cobalt::script::javascriptcore::JSCObjectHandleHolder;
-using cobalt::script::javascriptcore::JSCGlobalObject;
-using cobalt::script::javascriptcore::JSCGlobalObjectProxy;
 {% if named_property_getter %}
 using cobalt::script::javascriptcore::JSCPropertyEnumerator;
 {% endif %}
 using cobalt::script::javascriptcore::JSObjectToWrappable;
+using cobalt::script::javascriptcore::PrototypeBase;
 using cobalt::script::javascriptcore::ScriptObjectRegistry;
+using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::ToJSValue;
 using cobalt::script::javascriptcore::ToWTFString;
 using cobalt::script::javascriptcore::TypeTraits;
-using cobalt::script::javascriptcore::PrototypeBase;
-using cobalt::script::javascriptcore::ThreadLocalHashTable;
 using cobalt::script::javascriptcore::WrapperBase;
 using cobalt::script::javascriptcore::util::HasPropertyOnPrototype;
 using cobalt::script::javascriptcore::util::GetStackTrace;
@@ -1076,14 +1076,14 @@
 {% endblock implementation %}
 
 {% block create_global_object_impl %}
-  JSCGlobalObjectProxy* jsc_global_object_proxy =
-      base::polymorphic_downcast<JSCGlobalObjectProxy*>(this);
-  JSCEngine* jsc_engine = jsc_global_object_proxy->engine();
+  JSCGlobalEnvironment* jsc_global_environment =
+      base::polymorphic_downcast<JSCGlobalEnvironment*>(this);
+  JSCEngine* jsc_engine = jsc_global_environment->engine();
 
   JSCGlobalObject* global_object = {{binding_class}}::Create(
       global_interface, environment_settings,
       jsc_engine->global_data(), jsc_engine->script_object_registry());
-  jsc_global_object_proxy->SetGlobalObject(global_object);
+  jsc_global_environment->SetGlobalObject(global_object);
 {% endblock create_global_object_impl %}
 
 {% block enumeration_definitions %}
diff --git a/src/cobalt/bindings/mozjs/templates/interface.cc.template b/src/cobalt/bindings/mozjs/templates/interface.cc.template
index 4d4cf06..19eddeb 100644
--- a/src/cobalt/bindings/mozjs/templates/interface.cc.template
+++ b/src/cobalt/bindings/mozjs/templates/interface.cc.template
@@ -31,7 +31,7 @@
 #include "cobalt/script/mozjs/conversion_helpers.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
 #include "cobalt/script/mozjs/mozjs_callback_function.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_property_enumerator.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
@@ -60,7 +60,7 @@
 using cobalt::script::mozjs::InterfaceData;
 using cobalt::script::mozjs::MozjsCallbackFunction;
 using cobalt::script::mozjs::MozjsExceptionState;
-using cobalt::script::mozjs::MozjsGlobalObjectProxy;
+using cobalt::script::mozjs::MozjsGlobalEnvironment;
 using cobalt::script::mozjs::MozjsUserObjectHolder;
 using cobalt::script::mozjs::MozjsPropertyEnumerator;
 using cobalt::script::mozjs::ProxyHandler;
@@ -98,6 +98,15 @@
 {% block implementation %}
 namespace {
 
+{% if get_opaque_root %}
+Wrappable* GetOpaqueRootFromWrappable(
+    const scoped_refptr<Wrappable>& wrappable) {
+  {{impl_class}}* impl =
+      base::polymorphic_downcast<{{impl_class}}*>(wrappable.get());
+  return impl->{{get_opaque_root}}();
+}
+
+{% endif %}
 {% if named_property_getter %}
 bool IsSupportedNamedProperty(JSContext* context, JS::HandleObject object,
                               const std::string& property_name) {
@@ -752,17 +761,17 @@
 }
 
 InterfaceData* GetInterfaceData(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   // Use the address of the properties definition for this interface as a
   // unique key for looking up the InterfaceData for this interface.
   intptr_t key = reinterpret_cast<intptr_t>(&own_properties);
-  InterfaceData* interface_data = global_object_proxy->GetInterfaceData(key);
+  InterfaceData* interface_data = global_environment->GetInterfaceData(key);
   if (!interface_data) {
     interface_data = CreateCachedInterfaceData();
     DCHECK(interface_data);
-    global_object_proxy->CacheInterfaceData(key, interface_data);
-    DCHECK_EQ(interface_data, global_object_proxy->GetInterfaceData(key));
+    global_environment->CacheInterfaceData(key, interface_data);
+    DCHECK_EQ(interface_data, global_environment->GetInterfaceData(key));
   }
   return interface_data;
 }
@@ -800,19 +809,19 @@
 
   // Set the global object proxy pointer, so we can access the standard classes
   // such as the base Object prototype when looking up our prototype.
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-  global_object_proxy->SetGlobalObjectProxyAndWrapper(proxy, wrappable);
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+  global_environment->SetGlobalObjectProxyAndWrapper(proxy, wrappable);
   return proxy;
 }
 {% else %}
 // static
 JSObject* {{binding_class}}::CreateProxy(
     JSContext* context, const scoped_refptr<Wrappable>& wrappable) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   InterfaceData* interface_data = GetInterfaceData(context);
@@ -824,7 +833,12 @@
   JS::RootedObject proxy(context,
       ProxyHandler::NewProxy(context, new_object, prototype, NULL,
                              proxy_handler.Pointer()));
-  WrapperPrivate::AddPrivateData(context, proxy, wrappable);
+{% if get_opaque_root %}
+  WrapperPrivate::GetOpaqueRootFunction get_root =
+      base::Bind(&GetOpaqueRootFromWrappable);
+{% endif %}
+  WrapperPrivate::AddPrivateData(context, proxy, wrappable{{
+      ", get_root" if get_opaque_root }});
   return proxy;
 }
 
@@ -832,10 +846,10 @@
 //static
 const JSClass* {{binding_class}}::PrototypeClass(
       JSContext* context) {
-  DCHECK(MozjsGlobalObjectProxy::GetFromContext(context));
+  DCHECK(MozjsGlobalEnvironment::GetFromContext(context));
   JS::RootedObject global_object(
       context,
-      MozjsGlobalObjectProxy::GetFromContext(context)->global_object());
+      MozjsGlobalEnvironment::GetFromContext(context)->global_object());
   DCHECK(global_object);
 
   JS::RootedObject prototype(context, GetPrototype(context, global_object));
@@ -896,17 +910,17 @@
 
 {% endblock implementation %}
 {% block create_global_object_impl %}
-  MozjsGlobalObjectProxy* mozjs_global_object_proxy =
-      base::polymorphic_downcast<MozjsGlobalObjectProxy*>(this);
-  JSContext* context = mozjs_global_object_proxy->context();
+  MozjsGlobalEnvironment* mozjs_global_environment =
+      base::polymorphic_downcast<MozjsGlobalEnvironment*>(this);
+  JSContext* context = mozjs_global_environment->context();
 
   JSAutoRequest auto_request(context);
   {{binding_class}}::CreateProxy(
       context, global_interface);
-  mozjs_global_object_proxy->SetEnvironmentSettings(environment_settings);
+  mozjs_global_environment->SetEnvironmentSettings(environment_settings);
 
   WrapperFactory* wrapper_factory =
-      mozjs_global_object_proxy->wrapper_factory();
+      mozjs_global_environment->wrapper_factory();
 {% for interface in all_interfaces %}
 {% if interface.conditional %}
 #if defined({{interface.conditional}})
diff --git a/src/cobalt/bindings/mozjs/templates/macros.cc.template b/src/cobalt/bindings/mozjs/templates/macros.cc.template
index 2eac967..f9153c7 100644
--- a/src/cobalt/bindings/mozjs/templates/macros.cc.template
+++ b/src/cobalt/bindings/mozjs/templates/macros.cc.template
@@ -256,10 +256,10 @@
  #}
 {% macro add_extra_arguments(arguments_list, raises_exception, call_with) %}
 {% if call_with %}
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
 {% do arguments_list.insert(0,
-                            'global_object_proxy->Get%s()'|format(call_with)) %}
+                            'global_environment->Get%s()'|format(call_with)) %}
 {% endif %}
 {% do arguments_list.append('&exception_state') if raises_exception %}
 {%- endmacro %}
@@ -369,9 +369,9 @@
 {# In the case there is only one resolution condition, we don't need the arg. #}
 {% if resolution_tests|length > 1 %}
       JS::RootedValue arg(context, args[{{distinguishing_argument_index}}]);
-      MozjsGlobalObjectProxy* global_object_proxy =
-          static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
-      WrapperFactory* wrapper_factory = global_object_proxy->wrapper_factory();
+      MozjsGlobalEnvironment* global_environment =
+          static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
+      WrapperFactory* wrapper_factory = global_environment->wrapper_factory();
 {% endif %}
 {% for test, overload in resolution_tests %}
       if ({{test("arg")}}) {
diff --git a/src/cobalt/bindings/templates/interface-base.cc.template b/src/cobalt/bindings/templates/interface-base.cc.template
index 5da3faa..cd0b3ba 100644
--- a/src/cobalt/bindings/templates/interface-base.cc.template
+++ b/src/cobalt/bindings/templates/interface-base.cc.template
@@ -43,7 +43,7 @@
 
 #include "base/debug/trace_event.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 {% for include in implementation_includes %}
@@ -65,7 +65,7 @@
 {% endif %}
 {% endfor %}
 using cobalt::script::CallbackInterfaceTraits;
-using cobalt::script::GlobalObjectProxy;
+using cobalt::script::GlobalEnvironment;
 using cobalt::script::OpaqueHandle;
 using cobalt::script::OpaqueHandleHolder;
 using cobalt::script::ScriptObject;
@@ -95,7 +95,7 @@
 namespace script {
 
 template<>
-void GlobalObjectProxy::CreateGlobalObject<{{impl_class}}>(
+void GlobalEnvironment::CreateGlobalObject<{{impl_class}}>(
     const scoped_refptr<{{impl_class}}>& global_interface,
     EnvironmentSettings* environment_settings) {
 {% block create_global_object_impl %}
@@ -109,7 +109,7 @@
 // This is needed to prevent link errors when trying to resolve the template
 // instantiation.
 template
-void GlobalObjectProxy::CreateGlobalObject<{{impl_class}}>(
+void GlobalEnvironment::CreateGlobalObject<{{impl_class}}>(
     const scoped_refptr<{{impl_class}}>& global_interface,
     EnvironmentSettings* environment_settings);
 #endif
diff --git a/src/cobalt/bindings/testing/GarbageCollectionTestInterface.idl b/src/cobalt/bindings/testing/GarbageCollectionTestInterface.idl
index e60c747..5e357d2 100644
--- a/src/cobalt/bindings/testing/GarbageCollectionTestInterface.idl
+++ b/src/cobalt/bindings/testing/GarbageCollectionTestInterface.idl
@@ -13,6 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-[Constructor]
+[
+  Constructor,
+  // The head of the list is the "opaque root" of all nodes in the list.
+  GetOpaqueRoot=GetHead,
+]
 interface GarbageCollectionTestInterface {
+  // This interface represents a simple linked-list implementation used for
+  // tests around reachability of objects from opaque roots.
+  attribute GarbageCollectionTestInterface? previous;
+  attribute GarbageCollectionTestInterface? next;
 };
diff --git a/src/cobalt/bindings/testing/bindings_sandbox_main.cc b/src/cobalt/bindings/testing/bindings_sandbox_main.cc
index 35ba1f1..c8fe7ad 100644
--- a/src/cobalt/bindings/testing/bindings_sandbox_main.cc
+++ b/src/cobalt/bindings/testing/bindings_sandbox_main.cc
@@ -19,11 +19,6 @@
 
 #include "cobalt/base/wrap_main.h"
 #include "cobalt/bindings/testing/window.h"
-#include "cobalt/script/environment_settings.h"
-#include "cobalt/script/global_object_proxy.h"
-#include "cobalt/script/javascript_engine.h"
-#include "cobalt/script/source_code.h"
-
 #include "cobalt/script/standalone_javascript_runner.h"
 
 using cobalt::bindings::testing::Window;
diff --git a/src/cobalt/bindings/testing/bindings_test_base.h b/src/cobalt/bindings/testing/bindings_test_base.h
index 3d01305..25e9ea2 100644
--- a/src/cobalt/bindings/testing/bindings_test_base.h
+++ b/src/cobalt/bindings/testing/bindings_test_base.h
@@ -22,7 +22,7 @@
 #include "base/memory/ref_counted.h"
 #include "cobalt/bindings/testing/window.h"
 #include "cobalt/script/environment_settings.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/source_code.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -48,19 +48,19 @@
   BindingsTestBase()
       : environment_settings_(new script::EnvironmentSettings),
         engine_(script::JavaScriptEngine::CreateEngine()),
-        global_object_proxy_(engine_->CreateGlobalObjectProxy()),
+        global_environment_(engine_->CreateGlobalEnvironment()),
         window_(new Window()) {
-    global_object_proxy_->CreateGlobalObject(window_,
-                                             environment_settings_.get());
+    global_environment_->CreateGlobalObject(window_,
+                                            environment_settings_.get());
   }
 
   explicit BindingsTestBase(const scoped_refptr<Window> window)
       : environment_settings_(new script::EnvironmentSettings),
         engine_(script::JavaScriptEngine::CreateEngine()),
-        global_object_proxy_(engine_->CreateGlobalObjectProxy()),
+        global_environment_(engine_->CreateGlobalEnvironment()),
         window_(window) {
-    global_object_proxy_->CreateGlobalObject(window_,
-                                             environment_settings_.get());
+    global_environment_->CreateGlobalObject(window_,
+                                            environment_settings_.get());
   }
 
   bool EvaluateScript(const std::string& script,
@@ -68,7 +68,7 @@
     scoped_refptr<script::SourceCode> source =
         script::SourceCode::CreateSourceCode(
             script, base::SourceLocation("[object BindingsTestBase]", 1, 1));
-    return global_object_proxy_->EvaluateScript(source, out_result);
+    return global_environment_->EvaluateScript(source, out_result);
   }
 
   void CollectGarbage() { engine_->CollectGarbage(); }
@@ -76,7 +76,7 @@
  protected:
   const scoped_ptr<script::EnvironmentSettings> environment_settings_;
   const scoped_ptr<script::JavaScriptEngine> engine_;
-  const scoped_refptr<script::GlobalObjectProxy> global_object_proxy_;
+  const scoped_refptr<script::GlobalEnvironment> global_environment_;
   const scoped_refptr<Window> window_;
 };
 
@@ -88,8 +88,8 @@
   InterfaceBindingsTest()
       // Use StrictMock so TESTING will fail if unexpected method is called.
       : test_mock_(new ::testing::StrictMock<MockT>()) {
-    global_object_proxy_->Bind("test",
-                               make_scoped_refptr<BaseClass>((test_mock_)));
+    global_environment_->Bind("test",
+                              make_scoped_refptr<BaseClass>((test_mock_)));
   }
 
   MockT& test_mock() { return *test_mock_.get(); }
diff --git a/src/cobalt/bindings/testing/garbage_collection_test.cc b/src/cobalt/bindings/testing/garbage_collection_test.cc
index b73dce0..2c992a9 100644
--- a/src/cobalt/bindings/testing/garbage_collection_test.cc
+++ b/src/cobalt/bindings/testing/garbage_collection_test.cc
@@ -53,7 +53,7 @@
 
   // Keep this instance alive using PreventGarbageCollection
   ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 1);
-  global_object_proxy_->PreventGarbageCollection(
+  global_environment_->PreventGarbageCollection(
       make_scoped_refptr<script::Wrappable>(
           GarbageCollectionTestInterface::instances()[0]));
   // Remove the only reference to this object from JavaScript.
@@ -64,7 +64,7 @@
   ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 1);
 
   // Allow this object to be garbage collected once more.
-  global_object_proxy_->AllowGarbageCollection(
+  global_environment_->AllowGarbageCollection(
       make_scoped_refptr<script::Wrappable>(
           GarbageCollectionTestInterface::instances()[0]));
 
@@ -75,6 +75,54 @@
 #endif
 }
 
+TEST_F(GarbageCollectionTest, ReachableObjectsKeptAlive) {
+  // Build a linked-list structure.
+  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
+  EXPECT_TRUE(EvaluateScript(
+      "var head = new GarbageCollectionTestInterface();"
+      "head.next = new GarbageCollectionTestInterface();"
+      "head.next.next = new GarbageCollectionTestInterface();"
+      "head.next.next.next = new GarbageCollectionTestInterface();"));
+  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 4);
+
+  // A reference to anything in the list should keep the rest of the structure
+  // alive.
+  EXPECT_TRUE(
+      EvaluateScript("var tail = head.next.next.next;"
+                     "var head = undefined;"));
+  CollectGarbage();
+  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 4);
+
+  // The old tail is not reachable, so the nodes should get garbage collected.
+  EXPECT_TRUE(
+      EvaluateScript("var tail = tail.previous.previous;"
+                     "tail.next = null;"));
+  CollectGarbage();
+#if !defined(ENGINE_USES_CONSERVATIVE_ROOTING)
+  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 2);
+#endif
+}
+
+TEST_F(GarbageCollectionTest, JSObjectRetainsCustomProperty) {
+  // Build a linked-list structure.
+  EXPECT_EQ(GarbageCollectionTestInterface::instances().size(), 0);
+  EXPECT_TRUE(EvaluateScript(
+      "var head = new GarbageCollectionTestInterface();"
+      "head.next = new GarbageCollectionTestInterface();"
+      "head.next.next = new GarbageCollectionTestInterface();"
+      "head.next.next.next = new GarbageCollectionTestInterface();"));
+  ASSERT_EQ(GarbageCollectionTestInterface::instances().size(), 4);
+
+  // Add a custom property to an object that is not directly reachable from JS.
+  EXPECT_TRUE(EvaluateScript("head.next.bicycle = 7;"));
+
+  // Collect garbage and ensure that the custom property persisted.
+  CollectGarbage();
+  std::string result;
+  EXPECT_TRUE(EvaluateScript("head.next.bicycle;", &result));
+  EXPECT_STREQ("7", result.c_str());
+}
+
 }  // namespace testing
 }  // namespace bindings
 }  // namespace cobalt
diff --git a/src/cobalt/bindings/testing/garbage_collection_test_interface.cc b/src/cobalt/bindings/testing/garbage_collection_test_interface.cc
index 5b25309..6f515eb 100644
--- a/src/cobalt/bindings/testing/garbage_collection_test_interface.cc
+++ b/src/cobalt/bindings/testing/garbage_collection_test_interface.cc
@@ -27,7 +27,8 @@
     instances;
 }  // namespace
 
-GarbageCollectionTestInterface::GarbageCollectionTestInterface() {
+GarbageCollectionTestInterface::GarbageCollectionTestInterface()
+    : previous_(NULL) {
   instances().push_back(this);
 }
 
@@ -41,6 +42,60 @@
   }
 }
 
+void GarbageCollectionTestInterface::set_previous(
+    const scoped_refptr<GarbageCollectionTestInterface>& previous) {
+  // Make the current previous_ the tail of its own list.
+  if (previous_) {
+    previous_->MakeTail();
+  }
+  Join(previous.get(), this);
+}
+
+void GarbageCollectionTestInterface::set_next(
+    const scoped_refptr<GarbageCollectionTestInterface>& next) {
+  // Make the current next_ the head of its own list.
+  if (next_) {
+    next_->MakeHead();
+  }
+  Join(this, next.get());
+}
+
+// The value of |GetOpaqueRoot| in the .idl. This ensures that nodes in the
+// same list have the same "root".
+script::Wrappable* GarbageCollectionTestInterface::GetHead() {
+  if (previous_) {
+    return previous_->GetHead();
+  }
+  return this;
+}
+
+void GarbageCollectionTestInterface::MakeHead() {
+  if (previous_) {
+    DCHECK(previous_->next_ == this);
+    previous_->next_ = NULL;
+  }
+  previous_ = NULL;
+}
+
+void GarbageCollectionTestInterface::MakeTail() {
+  if (next_) {
+    DCHECK(next_->previous_ == this);
+    next_->previous_ = NULL;
+  }
+  next_ = NULL;
+}
+
+void GarbageCollectionTestInterface::Join(
+    GarbageCollectionTestInterface* first,
+    GarbageCollectionTestInterface* second) {
+  if (first) {
+    first->next_ = second;
+  }
+  if (second) {
+    second->previous_ = first;
+  }
+}
+
 GarbageCollectionTestInterface::GarbageCollectionTestInterfaceVector&
 GarbageCollectionTestInterface::instances() {
   return ::cobalt::bindings::testing::instances.Get();
diff --git a/src/cobalt/bindings/testing/garbage_collection_test_interface.h b/src/cobalt/bindings/testing/garbage_collection_test_interface.h
index e4c0456..e0e0571 100644
--- a/src/cobalt/bindings/testing/garbage_collection_test_interface.h
+++ b/src/cobalt/bindings/testing/garbage_collection_test_interface.h
@@ -25,16 +25,47 @@
 namespace bindings {
 namespace testing {
 
+// GarbageCollectionTestInterface maintains strong references from head -> tail,
+// and raw pointers from tail -> head to prevent reference cycles, similar to
+// how references between Nodes are handled in Cobalt.
 class GarbageCollectionTestInterface : public script::Wrappable {
  public:
+  typedef std::vector<GarbageCollectionTestInterface*>
+      GarbageCollectionTestInterfaceVector;
+
   GarbageCollectionTestInterface();
   ~GarbageCollectionTestInterface();
 
-  typedef std::vector<GarbageCollectionTestInterface*>
-      GarbageCollectionTestInterfaceVector;
+  // The current |previous| node will become the tail of its list.
+  void set_previous(
+      const scoped_refptr<GarbageCollectionTestInterface>& previous);
+  scoped_refptr<GarbageCollectionTestInterface> previous() {
+    return make_scoped_refptr(previous_);
+  }
+
+  // The current |next| node will become the head of a new list.
+  void set_next(const scoped_refptr<GarbageCollectionTestInterface>& next);
+  scoped_refptr<GarbageCollectionTestInterface> next() { return next_; }
+
+  // The value of |GetOpaqueRoot| in the .idl. This ensures that nodes in the
+  // same list have the same "root".
+  script::Wrappable* GetHead();
+
   static GarbageCollectionTestInterfaceVector& instances();
 
   DEFINE_WRAPPABLE_TYPE(GarbageCollectionTestInterface);
+
+ private:
+  void MakeHead();
+  void MakeTail();
+
+  static void Join(GarbageCollectionTestInterface* first,
+                   GarbageCollectionTestInterface* second);
+
+  // Raw pointers going upstream, strong pointers going downstream to prevent
+  // reference cycles.
+  GarbageCollectionTestInterface* previous_;
+  scoped_refptr<GarbageCollectionTestInterface> next_;
 };
 
 }  // namespace testing
diff --git a/src/cobalt/bindings/testing/getter_setter_test.cc b/src/cobalt/bindings/testing/getter_setter_test.cc
index 24654d5..94fa4b6 100644
--- a/src/cobalt/bindings/testing/getter_setter_test.cc
+++ b/src/cobalt/bindings/testing/getter_setter_test.cc
@@ -44,7 +44,7 @@
  public:
   GetterSetterBindingsTestBase()
       : test_mock_(new ::testing::NiceMock<MockT>()) {
-    global_object_proxy_->Bind("test", make_scoped_refptr<MockT>((test_mock_)));
+    global_environment_->Bind("test", make_scoped_refptr<MockT>((test_mock_)));
   }
 
   MockT& test_mock() { return *test_mock_.get(); }
diff --git a/src/cobalt/bindings/testing/window.h b/src/cobalt/bindings/testing/window.h
index 0bc8115..b680d9d 100644
--- a/src/cobalt/bindings/testing/window.h
+++ b/src/cobalt/bindings/testing/window.h
@@ -22,7 +22,7 @@
 
 #include "cobalt/bindings/testing/global_interface_parent.h"
 #include "cobalt/script/environment_settings.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 
 namespace cobalt {
 namespace bindings {
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc
index ff3ddef..0006b33 100644
--- a/src/cobalt/browser/application.cc
+++ b/src/cobalt/browser/application.cc
@@ -359,6 +359,14 @@
     DLOG(INFO) << "Use null audio";
     options.media_module_options.use_null_audio_streamer = true;
   }
+  if (command_line->HasSwitch(switches::kVideoContainerSizeOverride)) {
+    std::string size_override = command_line->GetSwitchValueASCII(
+        browser::switches::kVideoContainerSizeOverride);
+    DLOG(INFO) << "Set video container size override from command line to "
+               << size_override;
+    deprecated::PlatformDelegate::Get()->SetVideoContainerSizeOverride(
+        size_override);
+  }
   if (command_line->HasSwitch(switches::kVideoDecoderStub)) {
     DLOG(INFO) << "Use ShellRawVideoDecoderStub";
     options.media_module_options.use_video_decoder_stub = true;
diff --git a/src/cobalt/browser/switches.cc b/src/cobalt/browser/switches.cc
index 7ebcce6..b6a41c1 100644
--- a/src/cobalt/browser/switches.cc
+++ b/src/cobalt/browser/switches.cc
@@ -88,6 +88,10 @@
 // "timed_trace.json" in the log output directory.
 const char kTimedTrace[] = "timed_trace";
 
+// Set the video container size override.
+extern const char kVideoContainerSizeOverride[] =
+    "video_container_size_override";
+
 // Decode video data using ShellRawVideoDecoderStub.
 extern const char kVideoDecoderStub[] = "video_decoder_stub";
 
diff --git a/src/cobalt/browser/switches.h b/src/cobalt/browser/switches.h
index 025841b..3531931 100644
--- a/src/cobalt/browser/switches.h
+++ b/src/cobalt/browser/switches.h
@@ -40,6 +40,7 @@
 extern const char kShutdownAfter[];
 extern const char kStubImageDecoder[];
 extern const char kTimedTrace[];
+extern const char kVideoContainerSizeOverride[];
 extern const char kVideoDecoderStub[];
 extern const char kWebDriverPort[];
 #endif  // ENABLE_DEBUG_COMMAND_LINE_SWITCHES
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc
index 0ad6dc9..372db0d 100644
--- a/src/cobalt/browser/web_module.cc
+++ b/src/cobalt/browser/web_module.cc
@@ -124,9 +124,9 @@
 
   void OnCspPolicyChanged();
 
-  scoped_refptr<script::GlobalObjectProxy> global_object_proxy() {
+  scoped_refptr<script::GlobalEnvironment> global_environment() {
     DCHECK(thread_checker_.CalledOnValidThread());
-    return global_object_proxy_;
+    return global_environment_;
   }
 
   void OnError(const std::string& error) {
@@ -170,7 +170,7 @@
 
   // JavaScript Global Object for the browser. There should be one per window,
   // but since there is only one window, we can have one per browser.
-  scoped_refptr<script::GlobalObjectProxy> global_object_proxy_;
+  scoped_refptr<script::GlobalEnvironment> global_environment_;
 
   // Used by |Console| to obtain a JavaScript stack trace.
   scoped_ptr<script::ExecutionState> execution_state_;
@@ -281,15 +281,15 @@
   javascript_engine_ = script::JavaScriptEngine::CreateEngine();
   DCHECK(javascript_engine_);
 
-  global_object_proxy_ = javascript_engine_->CreateGlobalObjectProxy();
-  DCHECK(global_object_proxy_);
+  global_environment_ = javascript_engine_->CreateGlobalEnvironment();
+  DCHECK(global_environment_);
 
   execution_state_ =
-      script::ExecutionState::CreateExecutionState(global_object_proxy_);
+      script::ExecutionState::CreateExecutionState(global_environment_);
   DCHECK(execution_state_);
 
   script_runner_ =
-      script::ScriptRunner::CreateScriptRunner(global_object_proxy_);
+      script::ScriptRunner::CreateScriptRunner(global_environment_);
   DCHECK(script_runner_);
 
   media_source_registry_.reset(new dom::MediaSource::Registry);
@@ -318,11 +318,10 @@
   environment_settings_.reset(new dom::DOMSettings(
       kDOMMaxElementDepth, fetcher_factory_.get(), data.network_module, window_,
       media_source_registry_.get(), javascript_engine_.get(),
-      global_object_proxy_.get(), data.options.dom_settings_options));
+      global_environment_.get(), data.options.dom_settings_options));
   DCHECK(environment_settings_);
 
-  global_object_proxy_->CreateGlobalObject(window_,
-                                           environment_settings_.get());
+  global_environment_->CreateGlobalObject(window_, environment_settings_.get());
 
   render_tree_produced_callback_ = data.render_tree_produced_callback;
   DCHECK(!render_tree_produced_callback_.is_null());
@@ -348,11 +347,11 @@
   if (data.options.csp_enforcement_mode == dom::kCspEnforcementDisable) {
     // If CSP is disabled, enable eval(). Otherwise, it will be enabled by
     // a CSP directive.
-    global_object_proxy_->EnableEval();
+    global_environment_->EnableEval();
   }
 #endif
 
-  global_object_proxy_->SetReportEvalCallback(
+  global_environment_->SetReportEvalCallback(
       base::Bind(&dom::CspDelegate::ReportEval,
                  base::Unretained(window_->document()->csp_delegate())));
 
@@ -371,7 +370,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(is_running_);
   is_running_ = false;
-  global_object_proxy_->SetReportEvalCallback(base::Closure());
+  global_environment_->SetReportEvalCallback(base::Closure());
   window_->DispatchEvent(new dom::Event(base::Tokens::unload()));
   document_load_observer_.reset();
 
@@ -387,7 +386,7 @@
   media_source_registry_.reset();
   script_runner_.reset();
   execution_state_.reset();
-  global_object_proxy_ = NULL;
+  global_environment_ = NULL;
   javascript_engine_.reset();
   web_module_stat_tracker_.reset();
   local_storage_database_.reset();
@@ -470,9 +469,9 @@
   bool allow_eval =
       window_->document()->csp_delegate()->AllowEval(&eval_disabled_message);
   if (allow_eval) {
-    global_object_proxy_->EnableEval();
+    global_environment_->EnableEval();
   } else {
-    global_object_proxy_->DisableEval(eval_disabled_message);
+    global_environment_->DisableEval(eval_disabled_message);
   }
 }
 
@@ -485,11 +484,11 @@
   DCHECK(window_);
   DCHECK(window_weak_);
   DCHECK(window_->document());
-  DCHECK(global_object_proxy_);
+  DCHECK(global_environment_);
 
   window_driver_out->reset(new webdriver::WindowDriver(
       window_id, window_weak_,
-      base::Bind(&WebModule::Impl::global_object_proxy, base::Unretained(this)),
+      base::Bind(&WebModule::Impl::global_environment, base::Unretained(this)),
       base::MessageLoopProxy::current()));
 }
 #endif  // defined(ENABLE_WEBDRIVER)
@@ -499,7 +498,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(is_running_);
   DCHECK(window_);
-  DCHECK(global_object_proxy_);
+  DCHECK(global_environment_);
   DCHECK(resource_provider_);
 
   if (debug_server_module_) {
@@ -507,7 +506,7 @@
   }
 
   debug_server_module_.reset(new debug::DebugServerModule(
-      window_->console(), global_object_proxy_, debug_overlay_.get(),
+      window_->console(), global_environment_, debug_overlay_.get(),
       resource_provider_, window_));
 }
 #endif  // defined(ENABLE_DEBUG_CONSOLE)
@@ -515,12 +514,12 @@
 void WebModule::Impl::InjectCustomWindowAttributes(
     const Options::InjectedWindowAttributes& attributes) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(global_object_proxy_);
+  DCHECK(global_environment_);
 
   for (Options::InjectedWindowAttributes::const_iterator iter =
            attributes.begin();
        iter != attributes.end(); ++iter) {
-    global_object_proxy_->Bind(iter->first, iter->second.Run());
+    global_environment_->Bind(iter->first, iter->second.Run());
   }
 }
 
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h
index 07fc9b4..854579a 100644
--- a/src/cobalt/browser/web_module.h
+++ b/src/cobalt/browser/web_module.h
@@ -47,7 +47,7 @@
 #include "cobalt/media/media_module.h"
 #include "cobalt/network/network_module.h"
 #include "cobalt/render_tree/resource_provider.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/script_runner.h"
 #include "cobalt/webdriver/session_driver.h"
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 7eac871..f179e93 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-10943
\ No newline at end of file
+10999
\ No newline at end of file
diff --git a/src/cobalt/debug/debug_script_runner.cc b/src/cobalt/debug/debug_script_runner.cc
index 325ab72..ea330dd 100644
--- a/src/cobalt/debug/debug_script_runner.cc
+++ b/src/cobalt/debug/debug_script_runner.cc
@@ -33,15 +33,15 @@
 }  // namespace
 
 DebugScriptRunner::DebugScriptRunner(
-    script::GlobalObjectProxy* global_object_proxy,
+    script::GlobalEnvironment* global_environment,
     const dom::CspDelegate* csp_delegate,
     const OnEventCallback& on_event_callback)
-    : global_object_proxy_(global_object_proxy),
+    : global_environment_(global_environment),
       csp_delegate_(csp_delegate),
       on_event_callback_(on_event_callback) {
   // Bind this object to the global object so it can persist state and be
   // accessed from any of the debug components.
-  global_object_proxy_->Bind(kObjectIdentifier, make_scoped_refptr(this));
+  global_environment_->Bind(kObjectIdentifier, make_scoped_refptr(this));
 }
 
 base::optional<std::string> DebugScriptRunner::CreateRemoteObject(
@@ -78,13 +78,13 @@
 
 bool DebugScriptRunner::EvaluateScript(const std::string& js_code,
                                        std::string* result) {
-  DCHECK(global_object_proxy_);
+  DCHECK(global_environment_);
   DCHECK(result);
   scoped_refptr<script::SourceCode> source_code =
       script::SourceCode::CreateSourceCode(js_code, GetInlineSourceLocation());
 
   ForceEnableEval();
-  bool succeeded = global_object_proxy_->EvaluateScript(source_code, result);
+  bool succeeded = global_environment_->EvaluateScript(source_code, result);
   SetEvalAllowedFromCsp();
   return succeeded;
 }
@@ -113,20 +113,20 @@
 }
 
 void DebugScriptRunner::ForceEnableEval() {
-  global_object_proxy_->EnableEval();
-  global_object_proxy_->SetReportEvalCallback(base::Closure());
+  global_environment_->EnableEval();
+  global_environment_->SetReportEvalCallback(base::Closure());
 }
 
 void DebugScriptRunner::SetEvalAllowedFromCsp() {
   std::string eval_disabled_message;
   bool allow_eval = csp_delegate_->AllowEval(&eval_disabled_message);
   if (allow_eval) {
-    global_object_proxy_->EnableEval();
+    global_environment_->EnableEval();
   } else {
-    global_object_proxy_->DisableEval(eval_disabled_message);
+    global_environment_->DisableEval(eval_disabled_message);
   }
 
-  global_object_proxy_->SetReportEvalCallback(base::Bind(
+  global_environment_->SetReportEvalCallback(base::Bind(
       &dom::CspDelegate::ReportEval, base::Unretained(csp_delegate_)));
 }
 
diff --git a/src/cobalt/debug/debug_script_runner.h b/src/cobalt/debug/debug_script_runner.h
index c82600f..a076098 100644
--- a/src/cobalt/debug/debug_script_runner.h
+++ b/src/cobalt/debug/debug_script_runner.h
@@ -23,7 +23,7 @@
 #include "base/optional.h"
 #include "cobalt/dom/csp_delegate.h"
 #include "cobalt/script/callback_function.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 #include "cobalt/script/wrappable.h"
@@ -55,7 +55,7 @@
   typedef script::ScriptObject<CreateRemoteObjectCallback>
       CreateRemoteObjectCallbackHolder;
 
-  DebugScriptRunner(script::GlobalObjectProxy* global_object_proxy,
+  DebugScriptRunner(script::GlobalEnvironment* global_environment,
                     const dom::CspDelegate* csp_delegate,
                     const OnEventCallback& on_event_callback);
 
@@ -97,7 +97,7 @@
   void SetEvalAllowedFromCsp();
 
   // No ownership.
-  script::GlobalObjectProxy* global_object_proxy_;
+  script::GlobalEnvironment* global_environment_;
 
   // Non-owned reference to let this object query whether CSP allows eval.
   const dom::CspDelegate* csp_delegate_;
diff --git a/src/cobalt/debug/debug_server.cc b/src/cobalt/debug/debug_server.cc
index 3b95234..9057f77 100644
--- a/src/cobalt/debug/debug_server.cc
+++ b/src/cobalt/debug/debug_server.cc
@@ -37,10 +37,10 @@
 
 void DebugServer::RemoveClient(DebugClient* client) { clients_.erase(client); }
 
-DebugServer::DebugServer(script::GlobalObjectProxy* global_object_proxy,
+DebugServer::DebugServer(script::GlobalEnvironment* global_environment,
                          const dom::CspDelegate* csp_delegate)
     : ALLOW_THIS_IN_INITIALIZER_LIST(script_runner_(new DebugScriptRunner(
-          global_object_proxy, csp_delegate,
+          global_environment, csp_delegate,
           base::Bind(&DebugServer::OnEventInternal, base::Unretained(this))))),
       message_loop_(MessageLoop::current()),
       is_paused_(false),
diff --git a/src/cobalt/debug/debug_server.h b/src/cobalt/debug/debug_server.h
index c10a9f1..d9fd8f9 100644
--- a/src/cobalt/debug/debug_server.h
+++ b/src/cobalt/debug/debug_server.h
@@ -34,7 +34,7 @@
 #include "cobalt/debug/debug_script_runner.h"
 #include "cobalt/debug/json_object.h"
 #include "cobalt/dom/csp_delegate.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/opaque_handle.h"
 #include "cobalt/script/script_object.h"
 
@@ -97,7 +97,7 @@
   // A command execution function stored in the command registry.
   typedef base::Callback<JSONObject(const JSONObject& params)> Command;
 
-  DebugServer(script::GlobalObjectProxy* global_object_proxy,
+  DebugServer(script::GlobalEnvironment* global_environment,
               const dom::CspDelegate* csp_delegate);
 
   // Adds a client to this object. This object does not own the client, but
diff --git a/src/cobalt/debug/debug_server_module.cc b/src/cobalt/debug/debug_server_module.cc
index 4a69361..d656d93 100644
--- a/src/cobalt/debug/debug_server_module.cc
+++ b/src/cobalt/debug/debug_server_module.cc
@@ -22,20 +22,20 @@
 namespace debug {
 
 DebugServerModule::DebugServerModule(
-    dom::Console* console, script::GlobalObjectProxy* global_object_proxy,
+    dom::Console* console, script::GlobalEnvironment* global_environment,
     RenderOverlay* render_overlay,
     render_tree::ResourceProvider* resource_provider, dom::Window* window) {
-  ConstructionData data(console, global_object_proxy, MessageLoop::current(),
+  ConstructionData data(console, global_environment, MessageLoop::current(),
                         render_overlay, resource_provider, window);
   Build(data);
 }
 
 DebugServerModule::DebugServerModule(
-    dom::Console* console, script::GlobalObjectProxy* global_object_proxy,
+    dom::Console* console, script::GlobalEnvironment* global_environment,
     RenderOverlay* render_overlay,
     render_tree::ResourceProvider* resource_provider, dom::Window* window,
     MessageLoop* message_loop) {
-  ConstructionData data(console, global_object_proxy, message_loop,
+  ConstructionData data(console, global_environment, message_loop,
                         render_overlay, resource_provider, window);
   Build(data);
 }
@@ -63,14 +63,14 @@
                                       base::WaitableEvent* created) {
   DCHECK(MessageLoop::current() == data.message_loop);
   DCHECK(data.console);
-  DCHECK(data.global_object_proxy);
+  DCHECK(data.global_environment);
   DCHECK(data.render_overlay);
   DCHECK(data.resource_provider);
   DCHECK(data.window);
 
   // Create the debug server itself.
   debug_server_.reset(new debug::DebugServer(
-      data.global_object_proxy, data.window->document()->csp_delegate()));
+      data.global_environment, data.window->document()->csp_delegate()));
 
   // Create render layers for the components that need them and chain them
   // together. Ownership will be passed to the component that uses each layer.
@@ -84,7 +84,7 @@
   // Create the script debugger. This is owned by this object, and is
   // accessible to all the debugger components.
   script_debugger_ =
-      script::ScriptDebugger::CreateDebugger(data.global_object_proxy, this);
+      script::ScriptDebugger::CreateDebugger(data.global_environment, this);
 
   // Create the connector object that provides functionality for each
   // component to interact with the debug server, script debugger, etc.
diff --git a/src/cobalt/debug/debug_server_module.h b/src/cobalt/debug/debug_server_module.h
index d3bbd3c..3cfa355 100644
--- a/src/cobalt/debug/debug_server_module.h
+++ b/src/cobalt/debug/debug_server_module.h
@@ -32,7 +32,7 @@
 #include "cobalt/dom/console.h"
 #include "cobalt/dom/window.h"
 #include "cobalt/render_tree/resource_provider.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/script_debugger.h"
 
 namespace cobalt {
@@ -47,14 +47,14 @@
  public:
   // Construct the debug server on the current message loop.
   DebugServerModule(dom::Console* console,
-                    script::GlobalObjectProxy* global_object_proxy,
+                    script::GlobalEnvironment* global_environment,
                     RenderOverlay* render_overlay,
                     render_tree::ResourceProvider* resource_provider,
                     dom::Window* window);
 
   // Construct the debug server on the specified message loop.
   DebugServerModule(dom::Console* console,
-                    script::GlobalObjectProxy* global_object_proxy,
+                    script::GlobalEnvironment* global_environment,
                     RenderOverlay* render_overlay,
                     render_tree::ResourceProvider* resource_provider,
                     dom::Window* window, MessageLoop* message_loop);
@@ -68,19 +68,19 @@
   // persisted.
   struct ConstructionData {
     ConstructionData(dom::Console* console,
-                     script::GlobalObjectProxy* global_object_proxy,
+                     script::GlobalEnvironment* global_environment,
                      MessageLoop* message_loop, RenderOverlay* render_overlay,
                      render_tree::ResourceProvider* resource_provider,
                      dom::Window* window)
         : console(console),
-          global_object_proxy(global_object_proxy),
+          global_environment(global_environment),
           message_loop(message_loop),
           render_overlay(render_overlay),
           resource_provider(resource_provider),
           window(window) {}
 
     dom::Console* console;
-    script::GlobalObjectProxy* global_object_proxy;
+    script::GlobalEnvironment* global_environment;
     MessageLoop* message_loop;
     RenderOverlay* render_overlay;
     render_tree::ResourceProvider* resource_provider;
diff --git a/src/cobalt/deprecated/platform_delegate.cc b/src/cobalt/deprecated/platform_delegate.cc
index 6e7baaf..41befce 100644
--- a/src/cobalt/deprecated/platform_delegate.cc
+++ b/src/cobalt/deprecated/platform_delegate.cc
@@ -108,6 +108,14 @@
   return false;
 }
 
+void PlatformDelegate::SetVideoContainerSizeOverride(
+    const std::string& video_container_size_override) {
+  DLOG(INFO) << "Change VideoContainerSizeOverride from \""
+             << video_container_size_override_ << "\" to \""
+             << video_container_size_override << "\"";
+  video_container_size_override_ = video_container_size_override;
+}
+
 PlatformDelegate::~PlatformDelegate() {}
 
 }   // namespace deprecated
diff --git a/src/cobalt/deprecated/platform_delegate.h b/src/cobalt/deprecated/platform_delegate.h
index 8e64aa7..42d4ba1 100644
--- a/src/cobalt/deprecated/platform_delegate.h
+++ b/src/cobalt/deprecated/platform_delegate.h
@@ -61,6 +61,15 @@
                                const void* address, size_t size) const;
   virtual bool DeregisterUserLog(int user_log_index) const;
 
+  // Returns a string in the form of "1920x1080" to inform the player to use the
+  // returned resolution instead of the window size as the maximum resolution of
+  // video being played.
+  std::string GetVideoContainerSizeOverride() const {
+    return video_container_size_override_;
+  }
+  void SetVideoContainerSizeOverride(
+      const std::string& video_container_size_override);
+
   const std::string& dir_source_root() const { return dir_source_root_; }
   const std::string& game_content_path() const { return game_content_path_; }
   const std::string& screenshot_output_path() const {
@@ -81,6 +90,7 @@
   std::string screenshot_output_path_;
   std::string logging_output_path_;
   std::string temp_path_;
+  std::string video_container_size_override_;
 
  private:
   // Each platform implements the Create() function to return its own
diff --git a/src/cobalt/dom/DOMImplementation.idl b/src/cobalt/dom/DOMImplementation.idl
index c1d72a3..4dce7eb 100644
--- a/src/cobalt/dom/DOMImplementation.idl
+++ b/src/cobalt/dom/DOMImplementation.idl
@@ -16,6 +16,7 @@
 
 // https://www.w3.org/TR/dom/#domimplementation
 
+[ConstructorCallWith=EnvironmentSettings]
 interface DOMImplementation {
   [NewObject] XMLDocument createDocument(DOMString? namespaceName, [TreatNullAs=EmptyString] DOMString qualifiedName, optional DocumentType? doctype = null);
 };
diff --git a/src/cobalt/dom/csp_violation_reporter.cc b/src/cobalt/dom/csp_violation_reporter.cc
index 1a9599f..619fc8c 100644
--- a/src/cobalt/dom/csp_violation_reporter.cc
+++ b/src/cobalt/dom/csp_violation_reporter.cc
@@ -23,7 +23,7 @@
 #include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/security_policy_violation_event.h"
 #include "cobalt/network/net_poster.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "googleurl/src/gurl.h"
 
 namespace cobalt {
@@ -94,10 +94,10 @@
   event_data->effective_directive = violation_info.effective_directive;
   event_data->original_policy = violation_info.header;
 
-  script::GlobalObjectProxy* global_object_proxy =
-      document->html_element_context()->script_runner()->GetGlobalObjectProxy();
+  script::GlobalEnvironment* global_environment =
+      document->html_element_context()->script_runner()->GetGlobalEnvironment();
   const std::vector<script::StackFrame>& stack_trace =
-      global_object_proxy->GetStackTrace(1);
+      global_environment->GetStackTrace(1);
   if (stack_trace.size() > 0) {
     event_data->line_number = stack_trace[0].line_number;
     event_data->column_number = stack_trace[0].column_number;
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc
index 8e3c80d..928ba1f 100644
--- a/src/cobalt/dom/document.cc
+++ b/src/cobalt/dom/document.cc
@@ -42,7 +42,6 @@
 #include "cobalt/dom/html_body_element.h"
 #include "cobalt/dom/html_collection.h"
 #include "cobalt/dom/html_element.h"
-#include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/html_element_factory.h"
 #include "cobalt/dom/html_head_element.h"
 #include "cobalt/dom/html_html_element.h"
@@ -63,29 +62,25 @@
     : ALLOW_THIS_IN_INITIALIZER_LIST(Node(this)),
       html_element_context_(html_element_context),
       window_(options.window),
-      implementation_(new DOMImplementation()),
+      implementation_(new DOMImplementation(html_element_context)),
       ALLOW_THIS_IN_INITIALIZER_LIST(
           style_sheets_(new cssom::StyleSheetList(this))),
-      ALLOW_THIS_IN_INITIALIZER_LIST(font_cache_(new FontCache(
-          html_element_context_ ? html_element_context_->resource_provider()
-                                : NULL,
-          html_element_context_ ? html_element_context_->remote_typeface_cache()
-                                : NULL,
-          base::Bind(&Document::OnTypefaceLoadEvent, base::Unretained(this)),
-          html_element_context_ ? html_element_context_->language()
-                                : "en-US"))),
       loading_counter_(0),
       should_dispatch_load_event_(true),
       is_selector_tree_dirty_(true),
       is_computed_style_dirty_(true),
       are_font_faces_dirty_(true),
       are_keyframes_dirty_(true),
+#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+      partial_layout_is_enabled_(true),
+#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
       navigation_start_clock_(options.navigation_start_clock),
       ALLOW_THIS_IN_INITIALIZER_LIST(
           default_timeline_(new DocumentTimeline(this, 0))),
       user_agent_style_sheet_(options.user_agent_style_sheet),
       initial_computed_style_declaration_(
           new cssom::CSSComputedStyleDeclaration()) {
+  DCHECK(html_element_context_);
   DCHECK(options.url.is_empty() || options.url.is_valid());
 
   if (options.viewport_size) {
@@ -109,29 +104,30 @@
       base::Bind(&CspDelegate::CanLoad, base::Unretained(csp_delegate_.get()),
                  CspDelegate::kLocation));
 
-  if (IsActiveDocument()) {
-    if (html_element_context_ &&
-        html_element_context_->remote_typeface_cache()) {
+  font_cache_.reset(new FontCache(
+      html_element_context_->resource_provider(),
+      html_element_context_->remote_typeface_cache(),
+      base::Bind(&Document::OnTypefaceLoadEvent, base::Unretained(this)),
+      html_element_context_->language()));
+
+  if (HasBrowsingContext()) {
+    if (html_element_context_->remote_typeface_cache()) {
       html_element_context_->remote_typeface_cache()->set_security_callback(
           base::Bind(&CspDelegate::CanLoad,
                      base::Unretained(csp_delegate_.get()),
                      CspDelegate::kFont));
     }
 
-    if (html_element_context_ && html_element_context_->image_cache()) {
+    if (html_element_context_->image_cache()) {
       html_element_context_->image_cache()->set_security_callback(base::Bind(
           &CspDelegate::CanLoad, base::Unretained(csp_delegate_.get()),
           CspDelegate::kImage));
     }
-
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-    partial_layout_is_enabled_ = true;
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
-    // Sample the timeline upon initialization.
-    SampleTimelineTime();
   }
 
+  // Sample the timeline upon initialization.
+  SampleTimelineTime();
+
   // Call OnInsertedIntoDocument() immediately to ensure that the Document
   // object itself is considered to be "in the document".
   OnInsertedIntoDocument();
@@ -179,7 +175,6 @@
   } else {
     std::string lower_local_name = local_name;
     StringToLowerASCII(&lower_local_name);
-    DCHECK(html_element_context_);
     DCHECK(html_element_context_->html_element_factory());
     return html_element_context_->html_element_factory()->CreateHTMLElement(
         this, base::Token(lower_local_name));
@@ -531,8 +526,6 @@
 void Document::UpdateComputedStyles() {
   TRACE_EVENT0("cobalt::dom", "Document::UpdateComputedStyles()");
 
-  DCHECK(IsActiveDocument());
-
   UpdateSelectorTree();
   UpdateKeyframes();
   UpdateFontFaces();
@@ -650,7 +643,7 @@
 void Document::DispatchOnLoadEvent() {
   TRACE_EVENT0("cobalt::dom", "Document::DispatchOnLoadEvent()");
 
-  if (IsActiveDocument()) {
+  if (HasBrowsingContext()) {
     // Update the current timeline sample time and then update computed styles
     // before dispatching the onload event.  This guarantees that computed
     // styles have been calculated before JavaScript executes onload event
diff --git a/src/cobalt/dom/document.h b/src/cobalt/dom/document.h
index 4d45315..aee887f 100644
--- a/src/cobalt/dom/document.h
+++ b/src/cobalt/dom/document.h
@@ -36,6 +36,7 @@
 #include "cobalt/dom/csp_delegate_type.h"
 #include "cobalt/dom/document_timeline.h"
 #include "cobalt/dom/event.h"
+#include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/location.h"
 #include "cobalt/dom/node.h"
 #include "cobalt/math/size.h"
@@ -79,14 +80,13 @@
 // (the DOM tree, including elements such as <head> and <body>) and provides
 // functionality which is global to the document.
 //   https://www.w3.org/TR/dom/#document
-//
-// In the spec, "A document is assumed to be an XML document unless it is
-// flagged as being an HTML document". In Cobalt it is always considered as HTML
-// document.
 class Document : public Node, public cssom::MutationObserver {
  public:
   struct Options {
-    Options() : cookie_jar(NULL), csp_enforcement_mode(kCspEnforcementEnable) {}
+    Options()
+        : window(NULL),
+          cookie_jar(NULL),
+          csp_enforcement_mode(kCspEnforcementEnable) {}
     explicit Options(const GURL& url_value)
         : url(url_value),
           window(NULL),
@@ -338,30 +338,21 @@
   // Animations, using all the style sheets in the document.
   void UpdateKeyframes();
 
-  // Returns whether the document is the active document shown in the window.
-  // TODO: Currently implemented by looking up whether viewport size is set,
-  // ideally it should depend on whether browser context exists.
-  bool IsActiveDocument() { return !!viewport_size_; }
+  // Returns whether the document has browsing context. Having the browsing
+  // context means the document is shown on the screen.
+  //   https://www.w3.org/TR/html5/browsers.html#browsing-context
+  bool HasBrowsingContext() { return !!window_; }
 
   // Reference to HTML element context.
   HTMLElementContext* const html_element_context_;
-  // Reference to the Window object. We cannot hold a strong reference,
-  // otherwise we create a reference loop.
+  // Reference to the associated window object.
   Window* window_;
   // Associated DOM implementation object.
   scoped_refptr<DOMImplementation> implementation_;
-  // Associated location object.
-  scoped_refptr<Location> location_;
-
-  // Content Security Policy enforcement for this document.
-  scoped_ptr<CspDelegate> csp_delegate_;
-
   // List of CSS style sheets.
   scoped_refptr<cssom::StyleSheetList> style_sheets_;
   // List of scripts that will execute in order as soon as possible.
   std::deque<HTMLScriptElement*> scripts_to_be_executed_;
-  // The font cache for this document.
-  scoped_ptr<FontCache> font_cache_;
   // A mapping from keyframes declaration names to their parsed structure.
   cssom::CSSKeyframesRule::NameMap keyframes_map_;
   // The number of ongoing loadings.
@@ -374,6 +365,19 @@
   bool is_computed_style_dirty_;
   bool are_font_faces_dirty_;
   bool are_keyframes_dirty_;
+#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+  bool partial_layout_is_enabled_;
+#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
+
+  // Viewport size.
+  base::optional<math::Size> viewport_size_;
+  // Content Security Policy enforcement for this document.
+  scoped_ptr<CspDelegate> csp_delegate_;
+  network_bridge::CookieJar* cookie_jar_;
+  // Associated location object.
+  scoped_refptr<Location> location_;
+  // The font cache for this document.
+  scoped_ptr<FontCache> font_cache_;
 
   // Weak reference to the active element.
   base::WeakPtr<Element> active_element_;
@@ -381,24 +385,15 @@
   ObserverList<DocumentObserver> observers_;
   // Selector Tree.
   cssom::SelectorTree selector_tree_;
-  network_bridge::CookieJar* cookie_jar_;
-
   // The document's latest sample from the global clock, used for updating
   // animations.
   const scoped_refptr<base::Clock> navigation_start_clock_;
   scoped_refptr<DocumentTimeline> default_timeline_;
 
-#if defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-  bool partial_layout_is_enabled_;
-#endif  // defined(ENABLE_PARTIAL_LAYOUT_CONTROL)
-
   base::Closure synchronous_layout_callback_;
 
   scoped_refptr<cssom::CSSStyleSheet> user_agent_style_sheet_;
 
-  // Viewport size.
-  base::optional<math::Size> viewport_size_;
-
   // Computed style of the initial containing block, width and height come from
   // the viewport size.
   scoped_refptr<cssom::CSSComputedStyleDeclaration>
diff --git a/src/cobalt/dom/dom_implementation.cc b/src/cobalt/dom/dom_implementation.cc
index b79da21..de9cd44 100644
--- a/src/cobalt/dom/dom_implementation.cc
+++ b/src/cobalt/dom/dom_implementation.cc
@@ -16,9 +16,18 @@
 
 #include "cobalt/dom/dom_implementation.h"
 
+#include "cobalt/dom/dom_settings.h"
+#include "cobalt/dom/window.h"
+
 namespace cobalt {
 namespace dom {
 
+DOMImplementation::DOMImplementation(script::EnvironmentSettings* settings) {
+  html_element_context_ = base::polymorphic_downcast<DOMSettings*>(settings)
+                              ->window()
+                              ->html_element_context();
+}
+
 scoped_refptr<XMLDocument> DOMImplementation::CreateDocument(
     base::optional<std::string> namespace_name,
     const std::string& qualified_name) {
@@ -31,7 +40,7 @@
   UNREFERENCED_PARAMETER(namespace_name);
   UNREFERENCED_PARAMETER(qualified_name);
   DCHECK(!doctype);
-  return new XMLDocument();
+  return new XMLDocument(html_element_context_);
 }
 
 }  // namespace dom
diff --git a/src/cobalt/dom/dom_implementation.h b/src/cobalt/dom/dom_implementation.h
index 20a2f3b..654af71 100644
--- a/src/cobalt/dom/dom_implementation.h
+++ b/src/cobalt/dom/dom_implementation.h
@@ -23,18 +23,24 @@
 #include "base/optional.h"
 #include "cobalt/dom/document_type.h"
 #include "cobalt/dom/xml_document.h"
+#include "cobalt/script/environment_settings.h"
 #include "cobalt/script/wrappable.h"
 
 namespace cobalt {
 namespace dom {
 
+class DOMSettings;
+class HTMLElementContext;
+
 // The DOMImplementation interface represent an object providing methods which
 // are not dependent on any particular document. Such an object is returned by
 // the Document.implementation property.
 //   https://www.w3.org/TR/2015/WD-dom-20150618/#interface-domimplementation
 class DOMImplementation : public script::Wrappable {
  public:
-  DOMImplementation() {}
+  explicit DOMImplementation(script::EnvironmentSettings* settings);
+  explicit DOMImplementation(HTMLElementContext* html_element_context)
+      : html_element_context_(html_element_context) {}
   ~DOMImplementation() OVERRIDE {}
 
   // Web API: DOMImplementation
@@ -48,6 +54,8 @@
   DEFINE_WRAPPABLE_TYPE(DOMImplementation);
 
  private:
+  HTMLElementContext* html_element_context_;
+
   DISALLOW_COPY_AND_ASSIGN(DOMImplementation);
 };
 
diff --git a/src/cobalt/dom/dom_implementation_test.cc b/src/cobalt/dom/dom_implementation_test.cc
index f03bc7e..6226a89 100644
--- a/src/cobalt/dom/dom_implementation_test.cc
+++ b/src/cobalt/dom/dom_implementation_test.cc
@@ -18,6 +18,7 @@
 
 #include "base/memory/ref_counted.h"
 #include "cobalt/dom/document.h"
+#include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/xml_document.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -25,7 +26,10 @@
 namespace dom {
 
 TEST(DOMImplementationTest, CreateDocumentShouldCreateXMLDocument) {
-  scoped_refptr<DOMImplementation> dom_implementation = new DOMImplementation();
+  HTMLElementContext html_element_context(NULL, NULL, NULL, NULL, NULL, NULL,
+                                          NULL, NULL, NULL, NULL, NULL, "");
+  scoped_refptr<DOMImplementation> dom_implementation =
+      new DOMImplementation(&html_element_context);
   scoped_refptr<Document> document =
       dom_implementation->CreateDocument(base::optional<std::string>(""), "");
   EXPECT_TRUE(document->IsXMLDocument());
diff --git a/src/cobalt/dom/dom_parser.cc b/src/cobalt/dom/dom_parser.cc
index c70d4e2..e7c8cd4 100644
--- a/src/cobalt/dom/dom_parser.cc
+++ b/src/cobalt/dom/dom_parser.cc
@@ -46,7 +46,7 @@
     case kApplicationXhtmlXml:
     case kImageSvgXml:
       return html_element_context_->dom_parser()->ParseXMLDocument(
-          str, GetInlineSourceLocation());
+          str, html_element_context_, GetInlineSourceLocation());
     case kMaxSupportedType:
     default:
       LOG(WARNING) << "DOMParse.ParseFromString received invalid type value.";
diff --git a/src/cobalt/dom/dom_settings.cc b/src/cobalt/dom/dom_settings.cc
index 894d524..6588e93 100644
--- a/src/cobalt/dom/dom_settings.cc
+++ b/src/cobalt/dom/dom_settings.cc
@@ -27,7 +27,7 @@
                          const scoped_refptr<Window>& window,
                          MediaSource::Registry* media_source_registry,
                          script::JavaScriptEngine* engine,
-                         script::GlobalObjectProxy* global_object_proxy,
+                         script::GlobalEnvironment* global_environment,
                          const Options& options)
     : max_dom_element_depth_(max_dom_element_depth),
       fetcher_factory_(fetcher_factory),
@@ -37,7 +37,7 @@
       array_buffer_cache_(options.array_buffer_cache),
       media_source_registry_(media_source_registry),
       javascript_engine_(engine),
-      global_object_proxy_(global_object_proxy) {
+      global_environment_(global_environment) {
   if (array_buffer_allocator_) {
     DCHECK(options.array_buffer_cache);
   } else {
diff --git a/src/cobalt/dom/dom_settings.h b/src/cobalt/dom/dom_settings.h
index ea6f74b..8366e67 100644
--- a/src/cobalt/dom/dom_settings.h
+++ b/src/cobalt/dom/dom_settings.h
@@ -33,7 +33,7 @@
 class NetworkModule;
 }
 namespace script {
-class GlobalObjectProxy;
+class GlobalEnvironment;
 class JavaScriptEngine;
 }
 namespace dom {
@@ -63,7 +63,7 @@
               const scoped_refptr<Window>& window,
               MediaSource::Registry* media_source_registry,
               script::JavaScriptEngine* engine,
-              script::GlobalObjectProxy* global_object_proxy,
+              script::GlobalEnvironment* global_environment_proxy,
               const Options& options = Options());
   ~DOMSettings() OVERRIDE;
 
@@ -89,8 +89,8 @@
   script::JavaScriptEngine* javascript_engine() const {
     return javascript_engine_;
   }
-  script::GlobalObjectProxy* global_object() const {
-    return global_object_proxy_;
+  script::GlobalEnvironment* global_environment() const {
+    return global_environment_;
   }
   MediaSource::Registry* media_source_registry() const {
     return media_source_registry_;
@@ -108,7 +108,7 @@
   ArrayBuffer::Cache* array_buffer_cache_;
   MediaSource::Registry* media_source_registry_;
   script::JavaScriptEngine* javascript_engine_;
-  script::GlobalObjectProxy* global_object_proxy_;
+  script::GlobalEnvironment* global_environment_;
 
   DISALLOW_COPY_AND_ASSIGN(DOMSettings);
 };
diff --git a/src/cobalt/dom/html_image_element.cc b/src/cobalt/dom/html_image_element.cc
index ac05e75..007192d 100644
--- a/src/cobalt/dom/html_image_element.cc
+++ b/src/cobalt/dom/html_image_element.cc
@@ -25,7 +25,7 @@
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/dom_settings.h"
 #include "cobalt/dom/html_element_context.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "googleurl/src/gurl.h"
 
 namespace cobalt {
@@ -190,12 +190,11 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_GE(prevent_garbage_collection_count_, 0);
   if (prevent_garbage_collection_count_++ == 0) {
-    DCHECK(html_element_context());
     DCHECK(html_element_context()->script_runner());
-    DCHECK(html_element_context()->script_runner()->GetGlobalObjectProxy());
+    DCHECK(html_element_context()->script_runner()->GetGlobalEnvironment());
     html_element_context()
         ->script_runner()
-        ->GetGlobalObjectProxy()
+        ->GetGlobalEnvironment()
         ->PreventGarbageCollection(make_scoped_refptr(this));
   }
 }
@@ -204,9 +203,11 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_GT(prevent_garbage_collection_count_, 0);
   if (--prevent_garbage_collection_count_ == 0) {
+    DCHECK(html_element_context()->script_runner());
+    DCHECK(html_element_context()->script_runner()->GetGlobalEnvironment());
     html_element_context()
         ->script_runner()
-        ->GetGlobalObjectProxy()
+        ->GetGlobalEnvironment()
         ->AllowGarbageCollection(make_scoped_refptr(this));
   }
 }
diff --git a/src/cobalt/dom/html_script_element.cc b/src/cobalt/dom/html_script_element.cc
index 16acbde..0b6d3a9 100644
--- a/src/cobalt/dom/html_script_element.cc
+++ b/src/cobalt/dom/html_script_element.cc
@@ -29,7 +29,7 @@
 #include "cobalt/loader/fetcher_factory.h"
 #include "cobalt/loader/sync_loader.h"
 #include "cobalt/loader/text_decoder.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/script_runner.h"
 #include "googleurl/src/gurl.h"
 
@@ -525,12 +525,11 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_GE(prevent_garbage_collection_count_, 0);
   if (prevent_garbage_collection_count_++ == 0) {
-    DCHECK(html_element_context());
     DCHECK(html_element_context()->script_runner());
-    DCHECK(html_element_context()->script_runner()->GetGlobalObjectProxy());
+    DCHECK(html_element_context()->script_runner()->GetGlobalEnvironment());
     html_element_context()
         ->script_runner()
-        ->GetGlobalObjectProxy()
+        ->GetGlobalEnvironment()
         ->PreventGarbageCollection(make_scoped_refptr(this));
   }
 }
@@ -539,9 +538,11 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_GT(prevent_garbage_collection_count_, 0);
   if (--prevent_garbage_collection_count_ == 0) {
+    DCHECK(html_element_context()->script_runner());
+    DCHECK(html_element_context()->script_runner()->GetGlobalEnvironment());
     html_element_context()
         ->script_runner()
-        ->GetGlobalObjectProxy()
+        ->GetGlobalEnvironment()
         ->AllowGarbageCollection(make_scoped_refptr(this));
   }
 }
diff --git a/src/cobalt/dom/node_test.cc b/src/cobalt/dom/node_test.cc
index 3b674a2..57153ae 100644
--- a/src/cobalt/dom/node_test.cc
+++ b/src/cobalt/dom/node_test.cc
@@ -22,6 +22,7 @@
 #include "cobalt/dom/element.h"
 #include "cobalt/dom/global_stats.h"
 #include "cobalt/dom/html_collection.h"
+#include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/node_list.h"
 #include "cobalt/dom/testing/gtest_workarounds.h"
 #include "cobalt/dom/text.h"
@@ -71,12 +72,16 @@
   NodeTest();
   ~NodeTest() OVERRIDE;
 
+  HTMLElementContext html_element_context_;
   scoped_refptr<Document> document_;
 };
 
-NodeTest::NodeTest() {
+NodeTest::NodeTest()
+    : html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                            NULL, NULL, NULL, "") {
   EXPECT_TRUE(GlobalStats::GetInstance()->CheckNoLeaks());
-  document_ = new Document(NULL);
+
+  document_ = new Document(&html_element_context_);
 }
 
 NodeTest::~NodeTest() {
@@ -225,7 +230,7 @@
   scoped_refptr<Node> root = new Element(document_);
   EXPECT_EQ(document_, root->node_document());
 
-  scoped_refptr<Document> new_document = new Document(NULL);
+  scoped_refptr<Document> new_document = new Document(&html_element_context_);
   new_document->AppendChild(root);
   EXPECT_EQ(new_document, root->node_document());
 }
@@ -361,7 +366,7 @@
   document_->AppendChild(element);
   EXPECT_EQ(document_, element->node_document());
 
-  scoped_refptr<Document> new_document = new Document(NULL);
+  scoped_refptr<Document> new_document = new Document(&html_element_context_);
   element->AdoptIntoDocument(new_document);
   EXPECT_EQ(new_document, element->node_document());
   EXPECT_EQ(NULL, element->parent_node());
diff --git a/src/cobalt/dom/parser.h b/src/cobalt/dom/parser.h
index a418ae8..554643e 100644
--- a/src/cobalt/dom/parser.h
+++ b/src/cobalt/dom/parser.h
@@ -52,7 +52,8 @@
 
   // Parses an XML document and returns the created XMLDocument.
   virtual scoped_refptr<XMLDocument> ParseXMLDocument(
-      const std::string& input, const base::SourceLocation& input_location) = 0;
+      const std::string& input, HTMLElementContext* html_element_context,
+      const base::SourceLocation& input_location) = 0;
 
   // Parses an HTML input and inserts new nodes in document under parent_node
   // before reference_node.
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc
index e901752..295c8f9 100644
--- a/src/cobalt/dom/window.cc
+++ b/src/cobalt/dom/window.cc
@@ -199,7 +199,6 @@
 }
 
 scoped_refptr<MediaQueryList> Window::MatchMedia(const std::string& query) {
-  DCHECK(html_element_context_);
   DCHECK(html_element_context_->css_parser());
   scoped_refptr<cssom::MediaList> media_list =
       html_element_context_->css_parser()->ParseMediaList(
diff --git a/src/cobalt/dom/xml_document.h b/src/cobalt/dom/xml_document.h
index 819c0eb..afb6346 100644
--- a/src/cobalt/dom/xml_document.h
+++ b/src/cobalt/dom/xml_document.h
@@ -24,12 +24,14 @@
 
 class XMLDocument : public Document {
  public:
-  explicit XMLDocument(const Options& options = Options())
-      : Document(NULL, options) {}
+  XMLDocument(HTMLElementContext* html_element_context,
+              const Options& options = Options())
+      : Document(html_element_context, options) {}
 
   // Custom, not in any spec: Node.
   scoped_refptr<Node> Duplicate() const OVERRIDE {
-    return new XMLDocument(Document::Options(url_as_gurl()));
+    return new XMLDocument(html_element_context(),
+                           Document::Options(url_as_gurl()));
   }
 
   // Custom, not in any spec: Document.
diff --git a/src/cobalt/dom/xml_document_test.cc b/src/cobalt/dom/xml_document_test.cc
index 888f226..34d8e11 100644
--- a/src/cobalt/dom/xml_document_test.cc
+++ b/src/cobalt/dom/xml_document_test.cc
@@ -18,13 +18,16 @@
 
 #include "base/memory/ref_counted.h"
 #include "cobalt/dom/document.h"
+#include "cobalt/dom/html_element_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace cobalt {
 namespace dom {
 
 TEST(XMLDocumentTest, IsXMLDocument) {
-  scoped_refptr<Document> document = new XMLDocument();
+  HTMLElementContext html_element_context(NULL, NULL, NULL, NULL, NULL, NULL,
+                                          NULL, NULL, NULL, NULL, NULL, "");
+  scoped_refptr<Document> document = new XMLDocument(&html_element_context);
   EXPECT_TRUE(document->IsXMLDocument());
 }
 
diff --git a/src/cobalt/dom_parser/parser.cc b/src/cobalt/dom_parser/parser.cc
index 1c8c1ee..507c187 100644
--- a/src/cobalt/dom_parser/parser.cc
+++ b/src/cobalt/dom_parser/parser.cc
@@ -28,6 +28,7 @@
 scoped_refptr<dom::Document> Parser::ParseDocument(
     const std::string& input, dom::HTMLElementContext* html_element_context,
     const base::SourceLocation& input_location) {
+  DCHECK(html_element_context);
   scoped_refptr<dom::Document> document =
       new dom::Document(html_element_context, dom::Document::Options());
   HTMLDecoder html_decoder(document, document, NULL, dom_max_element_depth_,
@@ -38,8 +39,11 @@
 }
 
 scoped_refptr<dom::XMLDocument> Parser::ParseXMLDocument(
-    const std::string& input, const base::SourceLocation& input_location) {
-  scoped_refptr<dom::XMLDocument> xml_document = new dom::XMLDocument();
+    const std::string& input, dom::HTMLElementContext* html_element_context,
+    const base::SourceLocation& input_location) {
+  DCHECK(html_element_context);
+  scoped_refptr<dom::XMLDocument> xml_document =
+      new dom::XMLDocument(html_element_context);
   XMLDecoder xml_decoder(
       xml_document, xml_document, NULL, dom_max_element_depth_, input_location,
       base::Closure(),
diff --git a/src/cobalt/dom_parser/parser.h b/src/cobalt/dom_parser/parser.h
index cefbf7f..e9de526 100644
--- a/src/cobalt/dom_parser/parser.h
+++ b/src/cobalt/dom_parser/parser.h
@@ -49,7 +49,7 @@
       const base::SourceLocation& input_location) OVERRIDE;
 
   scoped_refptr<dom::XMLDocument> ParseXMLDocument(
-      const std::string& input,
+      const std::string& input, dom::HTMLElementContext* html_element_context,
       const base::SourceLocation& input_location) OVERRIDE;
 
   void ParseDocumentFragment(
diff --git a/src/cobalt/dom_parser/xml_decoder_test.cc b/src/cobalt/dom_parser/xml_decoder_test.cc
index ecc6b41..a7540c0 100644
--- a/src/cobalt/dom_parser/xml_decoder_test.cc
+++ b/src/cobalt/dom_parser/xml_decoder_test.cc
@@ -20,6 +20,7 @@
 #include "cobalt/dom/attr.h"
 #include "cobalt/dom/cdata_section.h"
 #include "cobalt/dom/element.h"
+#include "cobalt/dom/html_element_context.h"
 #include "cobalt/dom/named_node_map.h"
 #include "cobalt/dom/text.h"
 #include "cobalt/dom/xml_document.h"
@@ -41,6 +42,7 @@
   XMLDecoderTest();
   ~XMLDecoderTest() OVERRIDE {}
 
+  dom::HTMLElementContext html_element_context_;
   scoped_refptr<dom::XMLDocument> document_;
   base::SourceLocation source_location_;
   MockErrorCallback mock_error_callback_;
@@ -48,7 +50,9 @@
 };
 
 XMLDecoderTest::XMLDecoderTest()
-    : document_(new dom::XMLDocument(dom::Document::Options())),
+    : html_element_context_(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                            NULL, NULL, NULL, ""),
+      document_(new dom::XMLDocument(&html_element_context_)),
       source_location_(base::SourceLocation("[object XMLDecoderTest]", 1, 1)) {}
 
 TEST_F(XMLDecoderTest, ShouldNotAddImpliedTags) {
diff --git a/src/cobalt/h5vcc/H5vccSystem.idl b/src/cobalt/h5vcc/H5vccSystem.idl
index 15b6235..25bbe3b 100644
--- a/src/cobalt/h5vcc/H5vccSystem.idl
+++ b/src/cobalt/h5vcc/H5vccSystem.idl
@@ -21,4 +21,5 @@
   readonly attribute DOMString region;
   readonly attribute DOMString version;
   boolean triggerHelp();
+  DOMString getVideoContainerSizeOverride();
 };
diff --git a/src/cobalt/h5vcc/h5vcc_system.cc b/src/cobalt/h5vcc/h5vcc_system.cc
index 6775ae5..3bf8cf3 100644
--- a/src/cobalt/h5vcc/h5vcc_system.cc
+++ b/src/cobalt/h5vcc/h5vcc_system.cc
@@ -52,5 +52,12 @@
 // return false to indicate the client should launch their own dialog.
 bool H5vccSystem::TriggerHelp() const { return false; }
 
+// Returns a string in the form of "1920x1080" to inform the player to use the
+// returned resolution instead of the window size as the maximum resolution of
+// video being played.
+std::string H5vccSystem::GetVideoContainerSizeOverride() const {
+  return deprecated::PlatformDelegate::Get()->GetVideoContainerSizeOverride();
+}
+
 }  // namespace h5vcc
 }  // namespace cobalt
diff --git a/src/cobalt/h5vcc/h5vcc_system.h b/src/cobalt/h5vcc/h5vcc_system.h
index 3a1f4ac..be0db79 100644
--- a/src/cobalt/h5vcc/h5vcc_system.h
+++ b/src/cobalt/h5vcc/h5vcc_system.h
@@ -35,6 +35,7 @@
   std::string version() const;
 
   bool TriggerHelp() const;
+  std::string GetVideoContainerSizeOverride() const;
 
   DEFINE_WRAPPABLE_TYPE(H5vccSystem);
 
diff --git a/src/cobalt/layout/block_formatting_context.cc b/src/cobalt/layout/block_formatting_context.cc
index 92fc3c2..1203c34 100644
--- a/src/cobalt/layout/block_formatting_context.cc
+++ b/src/cobalt/layout/block_formatting_context.cc
@@ -100,7 +100,8 @@
     // positive adjoining margins.
     // When there is only one negative and one positive margin, that translates
     // to: The margins are summed.
-    DCHECK(collapsing_margin_ >= LayoutUnit() || margin_top >= LayoutUnit());
+    DCHECK(collapsing_margin_.GreaterEqualOrNaN(LayoutUnit()) ||
+           margin_top.GreaterEqualOrNaN(LayoutUnit()));
     collapsed_margin = collapsing_margin_ + margin_top;
   }
 
diff --git a/src/cobalt/layout/inline_container_box.cc b/src/cobalt/layout/inline_container_box.cc
index 2215a46..751a3b4 100644
--- a/src/cobalt/layout/inline_container_box.cc
+++ b/src/cobalt/layout/inline_container_box.cc
@@ -455,7 +455,7 @@
     WrapOpportunityPolicy wrap_opportunity_policy,
     bool is_line_existence_justified, LayoutUnit available_width,
     bool should_collapse_trailing_white_space) {
-  DCHECK_GT(GetMarginBoxWidth(), available_width);
+  DCHECK(GetMarginBoxWidth().GreaterThanOrNaN(available_width));
 
   // Calculate the available width where the content begins. If the content
   // does not begin within the available width, then the wrap can only occur
diff --git a/src/cobalt/layout/layout_unit.h b/src/cobalt/layout/layout_unit.h
index ba53e11..2083a23 100644
--- a/src/cobalt/layout/layout_unit.h
+++ b/src/cobalt/layout/layout_unit.h
@@ -24,6 +24,7 @@
 #include <utility>
 
 #include "base/basictypes.h"
+#include "base/logging.h"
 #include "cobalt/base/math.h"
 
 namespace cobalt {
@@ -35,24 +36,47 @@
   // The ratio of the LayoutUnit fixed point value to integers.
   static const int kFixedPointRatio = 64;
 
-  LayoutUnit() : value_(0) {}
+  LayoutUnit() : value_(0) {
+#ifdef _DEBUG
+    is_nan_ = false;
+#endif
+  }
   ~LayoutUnit() {}
 
   // Constructors.
-  explicit LayoutUnit(int value) : value_(value * kFixedPointRatio) {}
+  explicit LayoutUnit(int value) : value_(value * kFixedPointRatio) {
+#ifdef _DEBUG
+    int64_t value64 = value * kFixedPointRatio;
+    is_nan_ = value_ != value64;
+#endif
+  }
   explicit LayoutUnit(float value)
       : value_(static_cast<int32_t>(
-            floorf(value * static_cast<float>(kFixedPointRatio)))) {}
+            floorf(value * static_cast<float>(kFixedPointRatio)))) {
+#ifdef _DEBUG
+    int64_t value64 = static_cast<int64_t>(
+        floorf(value * static_cast<float>(kFixedPointRatio)));
+    is_nan_ = value_ != value64;
+#endif
+  }
 
   float toFloat() const {
     return static_cast<float>(value_) / kFixedPointRatio;
   }
 
-  void swap(LayoutUnit& value) { std::swap(value_, value.value_); }
+  void swap(LayoutUnit& value) {
+    std::swap(value_, value.value_);
+#ifdef _DEBUG
+    std::swap(is_nan_, value.is_nan_);
+#endif
+  }
 
   // Copy assignment operator.
   LayoutUnit& operator=(LayoutUnit value) {
     value_ = value.value_;
+#ifdef _DEBUG
+    is_nan_ = is_nan_ || value.is_nan_;
+#endif
     return *this;
   }
 
@@ -63,6 +87,57 @@
   bool operator==(LayoutUnit other) const { return value_ == other.value_; }
   bool operator!=(LayoutUnit other) const { return value_ != other.value_; }
 
+#ifdef _DEBUG
+  bool LessThanOrNaN(LayoutUnit other) const {
+    return is_nan_ || other.is_nan_ || *this < other;
+  }
+  bool LessEqualOrNaN(LayoutUnit other) const {
+    return is_nan_ || other.is_nan_ || *this <= other;
+  }
+  bool GreaterThanOrNaN(LayoutUnit other) const {
+    return is_nan_ || other.is_nan_ || *this > other;
+  }
+  bool GreaterEqualOrNaN(LayoutUnit other) const {
+    return is_nan_ || other.is_nan_ || *this >= other;
+  }
+  bool EqualOrNaN(LayoutUnit other) const {
+    return is_nan_ || other.is_nan_ || *this == other;
+  }
+  bool NotEqualOrNaN(LayoutUnit other) const {
+    return is_nan_ || other.is_nan_ || *this != other;
+  }
+  bool IsNaN() const { return is_nan_; }
+#else
+  bool LessThanOrNaN(LayoutUnit other) const {
+    NOTREACHED();
+    return *this < other;
+  }
+  bool LessEqualOrNaN(LayoutUnit other) const {
+    NOTREACHED();
+    return *this <= other;
+  }
+  bool GreaterThanOrNaN(LayoutUnit other) const {
+    NOTREACHED();
+    return *this > other;
+  }
+  bool GreaterEqualOrNaN(LayoutUnit other) const {
+    NOTREACHED();
+    return *this >= other;
+  }
+  bool EqualOrNaN(LayoutUnit other) const {
+    NOTREACHED();
+    return *this == other;
+  }
+  bool NotEqualOrNaN(LayoutUnit other) const {
+    NOTREACHED();
+    return *this != other;
+  }
+  bool IsNaN() const {
+    NOTREACHED();
+    return false;
+  }
+#endif
+
   LayoutUnit operator+() const { return LayoutUnit(*this); }
   LayoutUnit operator-() const {
     LayoutUnit res;
@@ -71,7 +146,14 @@
   }
 
   LayoutUnit& operator+=(LayoutUnit other) {
+#ifdef _DEBUG
+    int64_t value64 = value_;
+#endif
     value_ += other.value_;
+#ifdef _DEBUG
+    is_nan_ = is_nan_ || other.is_nan_ ||
+              (value_ != (value64 + static_cast<int64_t>(other.value_)));
+#endif
     return *this;
   }
   LayoutUnit operator+(LayoutUnit other) const {
@@ -79,7 +161,14 @@
     return res += other;
   }
   LayoutUnit& operator-=(LayoutUnit other) {
+#ifdef _DEBUG
+    int64_t value64 = value_;
+#endif
     value_ -= other.value_;
+#ifdef _DEBUG
+    is_nan_ = is_nan_ || other.is_nan_ ||
+              (value_ != (value64 - static_cast<int64_t>(other.value_)));
+#endif
     return *this;
   }
   LayoutUnit operator-(LayoutUnit other) const {
@@ -100,13 +189,26 @@
 
  private:
   int32_t value_;
+#ifdef _DEBUG
+  // When value_ overflows or underflows during construction or during an
+  // operation, it's value is undefined. This flags is used to track when that
+  // happens. The value propagates to the result of operations where any
+  // operand has this flag set, to indicate that there is undefined behavior.
+  bool is_nan_;
+#endif
 };
 
 // Integer scaling math operators.
 
 // NOLINTNEXTLINE(runtime/references)
 inline LayoutUnit& operator*=(LayoutUnit& a, int b) {
+#ifdef _DEBUG
+  int64_t value64 = a.value_;
+#endif
   a.value_ *= b;
+#ifdef _DEBUG
+  a.is_nan_ = a.is_nan_ || (a.value_ != (value64 * b));
+#endif
   return a;
 }
 
@@ -116,7 +218,13 @@
 
 // NOLINTNEXTLINE(runtime/references)
 inline LayoutUnit& operator/=(LayoutUnit& a, int b) {
+#ifdef _DEBUG
+  int64_t value64 = a.value_;
+#endif
   a.value_ /= b;
+#ifdef _DEBUG
+  a.is_nan_ = a.is_nan_ || (a.value_ != (value64 / b));
+#endif
   return a;
 }
 
@@ -126,7 +234,15 @@
 
 // NOLINTNEXTLINE(runtime/references)
 inline LayoutUnit& operator*=(LayoutUnit& a, float b) {
+#ifdef _DEBUG
+  int64_t value64 = a.value_;
+#endif
   a.value_ = static_cast<int32_t>(floorf(static_cast<float>(a.value_) * b));
+#ifdef _DEBUG
+  a.is_nan_ = a.is_nan_ ||
+              (a.value_ !=
+               static_cast<int64_t>(floorf(static_cast<float>(value64) * b)));
+#endif
   return a;
 }
 
@@ -143,6 +259,11 @@
 inline LayoutUnit operator/(LayoutUnit a, float b) { return a /= b; }
 
 inline std::ostream& operator<<(std::ostream& out, const LayoutUnit& x) {
+#ifdef _DEBUG
+  if (x.IsNaN()) {
+    return out << "NaN(" << x.toFloat() << ")";
+  }
+#endif
   return out << x.toFloat();
 }
 
diff --git a/src/cobalt/layout/line_box.cc b/src/cobalt/layout/line_box.cc
index 7a72a16..92940d1 100644
--- a/src/cobalt/layout/line_box.cc
+++ b/src/cobalt/layout/line_box.cc
@@ -260,7 +260,7 @@
   last_non_collapsed_child_box->UpdateSize(layout_params_);
   LayoutUnit collapsed_white_space_width =
       child_box_pre_collapse_width - last_non_collapsed_child_box->width();
-  DCHECK_GT(collapsed_white_space_width, LayoutUnit());
+  DCHECK(collapsed_white_space_width.GreaterThanOrNaN(LayoutUnit()));
 
   shrink_to_fit_width_ -= collapsed_white_space_width;
 }
@@ -274,7 +274,7 @@
   last_non_collapsed_child_box->UpdateSize(layout_params_);
   LayoutUnit restored_white_space_width =
       last_non_collapsed_child_box->width() - child_box_pre_restore_width;
-  DCHECK_GT(restored_white_space_width, LayoutUnit());
+  DCHECK(restored_white_space_width.GreaterThanOrNaN(LayoutUnit()));
 
   shrink_to_fit_width_ += restored_white_space_width;
 }
diff --git a/src/cobalt/layout/text_box.cc b/src/cobalt/layout/text_box.cc
index c0cb5fb..9dad35b 100644
--- a/src/cobalt/layout/text_box.cc
+++ b/src/cobalt/layout/text_box.cc
@@ -88,18 +88,18 @@
 
 void TextBox::UpdateContentSizeAndMargins(const LayoutParams& layout_params) {
   // Anonymous boxes do not have margins.
-  DCHECK_EQ(LayoutUnit(),
-            GetUsedMarginLeftIfNotAuto(computed_style(),
-                                       layout_params.containing_block_size));
-  DCHECK_EQ(LayoutUnit(),
-            GetUsedMarginTopIfNotAuto(computed_style(),
-                                      layout_params.containing_block_size));
-  DCHECK_EQ(LayoutUnit(),
-            GetUsedMarginRightIfNotAuto(computed_style(),
-                                        layout_params.containing_block_size));
-  DCHECK_EQ(LayoutUnit(),
-            GetUsedMarginBottomIfNotAuto(computed_style(),
-                                         layout_params.containing_block_size));
+  DCHECK(GetUsedMarginLeftIfNotAuto(computed_style(),
+                                    layout_params.containing_block_size)
+             ->EqualOrNaN(LayoutUnit()));
+  DCHECK(GetUsedMarginTopIfNotAuto(computed_style(),
+                                   layout_params.containing_block_size)
+             ->EqualOrNaN(LayoutUnit()));
+  DCHECK(GetUsedMarginRightIfNotAuto(computed_style(),
+                                     layout_params.containing_block_size)
+             ->EqualOrNaN(LayoutUnit()));
+  DCHECK(GetUsedMarginBottomIfNotAuto(computed_style(),
+                                      layout_params.containing_block_size)
+             ->EqualOrNaN(LayoutUnit()));
 
   // The non-collapsible content size only needs to be calculated if
   // |non_collapsible_text_width_| is unset. This indicates that either the
@@ -371,8 +371,8 @@
     return;
   }
 
-  DCHECK_EQ(LayoutUnit(), border_left_width() + padding_left());
-  DCHECK_EQ(LayoutUnit(), border_top_width() + padding_top());
+  DCHECK((border_left_width() + padding_left()).EqualOrNaN(LayoutUnit()));
+  DCHECK((border_top_width() + padding_top()).EqualOrNaN(LayoutUnit()));
 
   // Only add the text node to the render tree if it actually has visible
   // content that isn't simply collapsible whitespace and a font isn't loading.
diff --git a/src/cobalt/network/cookie_jar_impl.cc b/src/cobalt/network/cookie_jar_impl.cc
index 8669b8d..5ad5205 100644
--- a/src/cobalt/network/cookie_jar_impl.cc
+++ b/src/cobalt/network/cookie_jar_impl.cc
@@ -18,6 +18,7 @@
 
 #include "base/bind.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/threading/thread.h"
 
 namespace cobalt {
 namespace network {
@@ -26,20 +27,29 @@
 
 class CookiesGetter {
  public:
-  CookiesGetter() : event_(true, false) {}
+  CookiesGetter(const GURL& origin, net::CookieStore* cookie_store)
+      : getter_thread_("CookiesGetter"), event_(true, false) {
+    getter_thread_.Start();
+    getter_thread_.message_loop()->PostTask(
+        FROM_HERE, base::Bind(&net::CookieStore::GetCookiesWithOptionsAsync,
+                              cookie_store, origin, net::CookieOptions(),
+                              base::Bind(&CookiesGetter::CompletionCallback,
+                                         base::Unretained(this))));
+  }
 
   const std::string& WaitForCookies() {
     event_.Wait();
     return cookies_;
   }
 
-  void GetCookiesAsync(const std::string& cookies) {
+ private:
+  void CompletionCallback(const std::string& cookies) {
     cookies_ = cookies;
     event_.Signal();
   }
 
- private:
   std::string cookies_;
+  base::Thread getter_thread_;
   base::WaitableEvent event_;
 };
 
@@ -51,11 +61,7 @@
 }
 
 std::string CookieJarImpl::GetCookies(const GURL& origin) {
-  CookiesGetter cookies_getter;
-  cookie_store_->GetCookiesWithOptionsAsync(
-      origin, net::CookieOptions(),
-      base::Bind(&CookiesGetter::GetCookiesAsync,
-                 base::Unretained(&cookies_getter)));
+  CookiesGetter cookies_getter(origin, cookie_store_);
   return cookies_getter.WaitForCookies();
 }
 
diff --git a/src/cobalt/script/execution_state.cc b/src/cobalt/script/execution_state.cc
index 34992a8..0d53cf3 100644
--- a/src/cobalt/script/execution_state.cc
+++ b/src/cobalt/script/execution_state.cc
@@ -16,7 +16,7 @@
 
 #include "cobalt/script/execution_state.h"
 
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 
 namespace cobalt {
 namespace script {
@@ -26,25 +26,24 @@
 class ExecutionStateImpl : public ExecutionState {
  public:
   explicit ExecutionStateImpl(
-      const scoped_refptr<GlobalObjectProxy>& global_object_proxy)
-      : global_object_proxy_(global_object_proxy) {}
+      const scoped_refptr<GlobalEnvironment>& global_environment)
+      : global_environment_(global_environment) {}
 
   std::string GetStackTrace() const OVERRIDE;
 
  private:
-  scoped_refptr<GlobalObjectProxy> global_object_proxy_;
+  scoped_refptr<GlobalEnvironment> global_environment_;
 };
 
 std::string ExecutionStateImpl::GetStackTrace() const {
-  return StackTraceToString(global_object_proxy_->GetStackTrace());
+  return StackTraceToString(global_environment_->GetStackTrace());
 }
 
 }  // namespace
 
 scoped_ptr<ExecutionState> ExecutionState::CreateExecutionState(
-    const scoped_refptr<GlobalObjectProxy>& global_object_proxy) {
-  return scoped_ptr<ExecutionState>(
-      new ExecutionStateImpl(global_object_proxy));
+    const scoped_refptr<GlobalEnvironment>& global_environment) {
+  return scoped_ptr<ExecutionState>(new ExecutionStateImpl(global_environment));
 }
 
 }  // namespace script
diff --git a/src/cobalt/script/execution_state.h b/src/cobalt/script/execution_state.h
index 063a5bd..2f394c3 100644
--- a/src/cobalt/script/execution_state.h
+++ b/src/cobalt/script/execution_state.h
@@ -24,13 +24,13 @@
 namespace cobalt {
 namespace script {
 
-class GlobalObjectProxy;
+class GlobalEnvironment;
 
 // Provides access to the state of JavaScript execution.
 class ExecutionState {
  public:
   static scoped_ptr<ExecutionState> CreateExecutionState(
-      const scoped_refptr<GlobalObjectProxy>& global_object_proxy);
+      const scoped_refptr<GlobalEnvironment>& global_environment);
 
   virtual std::string GetStackTrace() const = 0;
   virtual ~ExecutionState() {}
diff --git a/src/cobalt/script/fake_global_object_proxy.h b/src/cobalt/script/fake_global_environment.h
similarity index 87%
rename from src/cobalt/script/fake_global_object_proxy.h
rename to src/cobalt/script/fake_global_environment.h
index bc110d8..532d709 100644
--- a/src/cobalt/script/fake_global_object_proxy.h
+++ b/src/cobalt/script/fake_global_environment.h
@@ -14,18 +14,18 @@
  * limitations under the License.
  */
 
-#ifndef COBALT_SCRIPT_FAKE_GLOBAL_OBJECT_PROXY_H_
-#define COBALT_SCRIPT_FAKE_GLOBAL_OBJECT_PROXY_H_
+#ifndef COBALT_SCRIPT_FAKE_GLOBAL_ENVIRONMENT_H_
+#define COBALT_SCRIPT_FAKE_GLOBAL_ENVIRONMENT_H_
 
 #include <string>
 #include <vector>
 
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 
 namespace cobalt {
 namespace script {
 
-class FakeGlobalObjectProxy : public GlobalObjectProxy {
+class FakeGlobalEnvironment : public GlobalEnvironment {
  public:
   void CreateGlobalObject() OVERRIDE {};
   bool EvaluateScript(const scoped_refptr<SourceCode>& /*script_utf8*/,
@@ -57,4 +57,4 @@
 }  // namespace script
 }  // namespace cobalt
 
-#endif  // COBALT_SCRIPT_FAKE_GLOBAL_OBJECT_PROXY_H_
+#endif  // COBALT_SCRIPT_FAKE_GLOBAL_ENVIRONMENT_H_
diff --git a/src/cobalt/script/fake_script_runner.h b/src/cobalt/script/fake_script_runner.h
index baafdf1..2a9af2b 100644
--- a/src/cobalt/script/fake_script_runner.h
+++ b/src/cobalt/script/fake_script_runner.h
@@ -20,7 +20,7 @@
 #include <string>
 
 #include "cobalt/base/source_location.h"
-#include "cobalt/script/fake_global_object_proxy.h"
+#include "cobalt/script/fake_global_environment.h"
 #include "cobalt/script/script_runner.h"
 
 namespace cobalt {
@@ -28,18 +28,18 @@
 
 class FakeScriptRunner : public ScriptRunner {
  public:
-  FakeScriptRunner() : fake_global_object_proxy_(new FakeGlobalObjectProxy()) {}
+  FakeScriptRunner() : fake_global_environment_(new FakeGlobalEnvironment()) {}
   std::string Execute(
       const std::string& /*script_utf8*/,
       const base::SourceLocation& /*script_location*/) OVERRIDE {
     return "";
   }
-  GlobalObjectProxy* GetGlobalObjectProxy() const OVERRIDE {
-    return fake_global_object_proxy_.get();
+  GlobalEnvironment* GetGlobalEnvironment() const OVERRIDE {
+    return fake_global_environment_.get();
   }
 
  private:
-  scoped_refptr<FakeGlobalObjectProxy> fake_global_object_proxy_;
+  scoped_refptr<FakeGlobalEnvironment> fake_global_environment_;
 };
 
 }  // namespace script
diff --git a/src/cobalt/script/global_object_proxy.h b/src/cobalt/script/global_environment.h
similarity index 89%
rename from src/cobalt/script/global_object_proxy.h
rename to src/cobalt/script/global_environment.h
index 45f30a7..01fc636 100644
--- a/src/cobalt/script/global_object_proxy.h
+++ b/src/cobalt/script/global_environment.h
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef COBALT_SCRIPT_GLOBAL_OBJECT_PROXY_H_
-#define COBALT_SCRIPT_GLOBAL_OBJECT_PROXY_H_
+#ifndef COBALT_SCRIPT_GLOBAL_ENVIRONMENT_H_
+#define COBALT_SCRIPT_GLOBAL_ENVIRONMENT_H_
 
 #include <string>
 #include <vector>
@@ -33,9 +33,8 @@
 class JavaScriptEngine;
 class SourceCode;
 
-// Manages a handle to a JavaScript engine's global object. The lifetime of
-// the global object is not necessarily tied to the lifetime of the proxy.
-class GlobalObjectProxy : public base::RefCounted<GlobalObjectProxy> {
+// Manages a handle to a JavaScript engine's global object.
+class GlobalEnvironment : public base::RefCounted<GlobalEnvironment> {
  public:
   // Create a new global object with bindings as defined for the definition of
   // the GlobalInterface type. The IDL for this interface must have the
@@ -104,11 +103,11 @@
                     const scoped_refptr<Wrappable>& impl) = 0;
 
  protected:
-  virtual ~GlobalObjectProxy() {}
-  friend class base::RefCounted<GlobalObjectProxy>;
+  virtual ~GlobalEnvironment() {}
+  friend class base::RefCounted<GlobalEnvironment>;
 };
 
 }  // namespace script
 }  // namespace cobalt
 
-#endif  // COBALT_SCRIPT_GLOBAL_OBJECT_PROXY_H_
+#endif  // COBALT_SCRIPT_GLOBAL_ENVIRONMENT_H_
diff --git a/src/cobalt/script/javascript_engine.h b/src/cobalt/script/javascript_engine.h
index 4cc5a30..7c5a607 100644
--- a/src/cobalt/script/javascript_engine.h
+++ b/src/cobalt/script/javascript_engine.h
@@ -22,7 +22,7 @@
 namespace cobalt {
 namespace script {
 
-class GlobalObjectProxy;
+class GlobalEnvironment;
 
 class JavaScriptEngine {
  public:
@@ -32,7 +32,7 @@
   static scoped_ptr<JavaScriptEngine> CreateEngine();
 
   // Create a new JavaScript global object proxy.
-  virtual scoped_refptr<GlobalObjectProxy> CreateGlobalObjectProxy() = 0;
+  virtual scoped_refptr<GlobalEnvironment> CreateGlobalEnvironment() = 0;
 
   // Kick off the engine's garbage collection synchronously.
   virtual void CollectGarbage() = 0;
diff --git a/src/cobalt/script/javascriptcore/javascriptcore.gyp b/src/cobalt/script/javascriptcore/javascriptcore.gyp
index 9cee381..73b048f 100644
--- a/src/cobalt/script/javascriptcore/javascriptcore.gyp
+++ b/src/cobalt/script/javascriptcore/javascriptcore.gyp
@@ -32,10 +32,10 @@
         'jsc_exception_state.cc',
         'jsc_exception_state.h',
         'jsc_gc_markup_visitor.h',
+        'jsc_global_environment.cc',
+        'jsc_global_environment.h',
         'jsc_global_object.cc',
         'jsc_global_object.h',
-        'jsc_global_object_proxy.cc',
-        'jsc_global_object_proxy.h',
         'jsc_object_handle.h',
         'jsc_object_owner.h',
         'jsc_scope.cc',
@@ -84,6 +84,9 @@
       'sources': [
         'numeric_conversion_test.cc',
       ],
+      'defines': [
+        '__DISABLE_WTF_LOGGING__',
+      ],
       'include_dirs': [
         '<(DEPTH)/third_party/WebKit/Source/JavaScriptCore',
         '<(DEPTH)/third_party/WebKit/Source/WTF',
diff --git a/src/cobalt/script/javascriptcore/jsc.cc b/src/cobalt/script/javascriptcore/jsc.cc
index 9d474cf..8fae204 100644
--- a/src/cobalt/script/javascriptcore/jsc.cc
+++ b/src/cobalt/script/javascriptcore/jsc.cc
@@ -21,7 +21,7 @@
 #include "base/string_util.h"
 #include "cobalt/base/wrap_main.h"
 #include "cobalt/script/javascriptcore/jsc_engine.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/standalone_javascript_runner.h"
 #include "third_party/WebKit/Source/JavaScriptCore/config.h"
 // Error.h needs to be included before JSCTypedArrayStubs.h
@@ -97,11 +97,11 @@
 
 int JSCMain(int argc, char** argv) {
   cobalt::script::StandaloneJavascriptRunner standalone_runner;
-  standalone_runner.global_object_proxy()->EnableEval();
+  standalone_runner.global_environment()->EnableEval();
 
   JSCGlobalObject* global_object =
-      static_cast<JSCGlobalObjectProxy*>(
-          standalone_runner.global_object_proxy().get())
+      static_cast<JSCGlobalEnvironment*>(
+          standalone_runner.global_environment().get())
           ->global_object();
   SetupBindings(global_object);
 
diff --git a/src/cobalt/script/javascriptcore/jsc_debugger.cc b/src/cobalt/script/javascriptcore/jsc_debugger.cc
index 9856564..78c3a63 100644
--- a/src/cobalt/script/javascriptcore/jsc_debugger.cc
+++ b/src/cobalt/script/javascriptcore/jsc_debugger.cc
@@ -23,8 +23,8 @@
 #include "base/string_number_conversions.h"
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/script/javascriptcore/jsc_call_frame.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/javascriptcore/jsc_object_handle_holder.h"
 #include "cobalt/script/javascriptcore/jsc_source_provider.h"
 
@@ -45,9 +45,9 @@
 
 // Static factory method declared in public interface.
 scoped_ptr<ScriptDebugger> ScriptDebugger::CreateDebugger(
-    GlobalObjectProxy* global_object_proxy, Delegate* delegate) {
+    GlobalEnvironment* global_environment, Delegate* delegate) {
   return scoped_ptr<ScriptDebugger>(
-      new javascriptcore::JSCDebugger(global_object_proxy, delegate));
+      new javascriptcore::JSCDebugger(global_environment, delegate));
 }
 
 namespace javascriptcore {
@@ -105,9 +105,9 @@
 }
 }  // namespace
 
-JSCDebugger::JSCDebugger(GlobalObjectProxy* global_object_proxy,
+JSCDebugger::JSCDebugger(GlobalEnvironment* global_environment,
                          Delegate* delegate)
-    : global_object_proxy_(global_object_proxy),
+    : global_environment_(global_environment),
       delegate_(delegate),
       pause_on_exceptions_(kNone),
       pause_on_next_statement_(false),
@@ -184,7 +184,7 @@
 }
 
 JSCGlobalObject* JSCDebugger::GetGlobalObject() const {
-  return base::polymorphic_downcast<JSCGlobalObjectProxy*>(global_object_proxy_)
+  return base::polymorphic_downcast<JSCGlobalEnvironment*>(global_environment_)
       ->global_object();
 }
 
diff --git a/src/cobalt/script/javascriptcore/jsc_debugger.h b/src/cobalt/script/javascriptcore/jsc_debugger.h
index f66a036..7c0b03b 100644
--- a/src/cobalt/script/javascriptcore/jsc_debugger.h
+++ b/src/cobalt/script/javascriptcore/jsc_debugger.h
@@ -21,7 +21,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/threading/thread_checker.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/script_debugger.h"
 #include "cobalt/script/source_provider.h"
 
@@ -54,7 +54,7 @@
 // global object to which this debugger connects.
 class JSCDebugger : protected JSC::Debugger, public ScriptDebugger {
  public:
-  JSCDebugger(GlobalObjectProxy* global_object_proxy, Delegate* delegate);
+  JSCDebugger(GlobalEnvironment* global_environment, Delegate* delegate);
   ~JSCDebugger() OVERRIDE;
 
   // Implementation of ScriptDebugger.
@@ -156,7 +156,7 @@
   bool IsBreakpointAtCurrentLocation() const;
 
   base::ThreadChecker thread_checker_;
-  GlobalObjectProxy* global_object_proxy_;
+  GlobalEnvironment* global_environment_;
 
   // Lifetime managed by the caller of this object's constructor.
   Delegate* delegate_;
diff --git a/src/cobalt/script/javascriptcore/jsc_engine.cc b/src/cobalt/script/javascriptcore/jsc_engine.cc
index 506a2f4..2555ddf 100644
--- a/src/cobalt/script/javascriptcore/jsc_engine.cc
+++ b/src/cobalt/script/javascriptcore/jsc_engine.cc
@@ -22,8 +22,8 @@
 #include "base/time.h"
 #include "cobalt/base/c_val.h"
 #include "cobalt/base/poller.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "third_party/WebKit/Source/JavaScriptCore/runtime/InitializeThreading.h"
 #include "third_party/WebKit/Source/WTF/wtf/OSAllocator.h"
 
@@ -97,9 +97,9 @@
   script_object_registry_.ClearEntries();
 }
 
-scoped_refptr<GlobalObjectProxy> JSCEngine::CreateGlobalObjectProxy() {
+scoped_refptr<GlobalEnvironment> JSCEngine::CreateGlobalEnvironment() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  return new JSCGlobalObjectProxy(this);
+  return new JSCGlobalEnvironment(this);
 }
 
 void JSCEngine::CollectGarbage() {
diff --git a/src/cobalt/script/javascriptcore/jsc_engine.h b/src/cobalt/script/javascriptcore/jsc_engine.h
index a995847..5ef1068 100644
--- a/src/cobalt/script/javascriptcore/jsc_engine.h
+++ b/src/cobalt/script/javascriptcore/jsc_engine.h
@@ -30,7 +30,7 @@
  public:
   JSCEngine();
   ~JSCEngine() OVERRIDE;
-  scoped_refptr<GlobalObjectProxy> CreateGlobalObjectProxy() OVERRIDE;
+  scoped_refptr<GlobalEnvironment> CreateGlobalEnvironment() OVERRIDE;
   void CollectGarbage() OVERRIDE;
   void ReportExtraMemoryCost(size_t bytes) OVERRIDE;
   JSC::JSGlobalData* global_data() { return global_data_.get(); }
diff --git a/src/cobalt/script/javascriptcore/jsc_global_object_proxy.cc b/src/cobalt/script/javascriptcore/jsc_global_environment.cc
similarity index 87%
rename from src/cobalt/script/javascriptcore/jsc_global_object_proxy.cc
rename to src/cobalt/script/javascriptcore/jsc_global_environment.cc
index 9db07c2..d388b64 100644
--- a/src/cobalt/script/javascriptcore/jsc_global_object_proxy.cc
+++ b/src/cobalt/script/javascriptcore/jsc_global_environment.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 
 #include <algorithm>
 #include <string>
@@ -37,7 +37,7 @@
 namespace script {
 namespace javascriptcore {
 
-void JSCGlobalObjectProxy::PreventGarbageCollection(
+void JSCGlobalEnvironment::PreventGarbageCollection(
     const scoped_refptr<Wrappable>& wrappable) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(global_object_);
@@ -49,13 +49,13 @@
   global_object_->object_cache()->CacheJSObject(wrapper);
 }
 
-JSCGlobalObjectProxy::~JSCGlobalObjectProxy() {
+JSCGlobalEnvironment::~JSCGlobalEnvironment() {
   if (global_object_.get()) {
     global_object_->setReportEvalCallback(NULL);
   }
 }
 
-void JSCGlobalObjectProxy::CreateGlobalObject() {
+void JSCGlobalEnvironment::CreateGlobalObject() {
   DCHECK(thread_checker_.CalledOnValidThread());
   JSC::JSLockHolder lock(engine_->global_data());
 
@@ -64,7 +64,7 @@
   SetGlobalObject(global_object);
 }
 
-void JSCGlobalObjectProxy::AllowGarbageCollection(
+void JSCGlobalEnvironment::AllowGarbageCollection(
     const scoped_refptr<Wrappable>& wrappable) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(global_object_);
@@ -76,23 +76,23 @@
   global_object_->object_cache()->UncacheJSObject(wrapper);
 }
 
-void JSCGlobalObjectProxy::DisableEval(const std::string& message) {
+void JSCGlobalEnvironment::DisableEval(const std::string& message) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(global_object_);
   global_object_->setEvalEnabled(false, message.c_str());
 }
 
-void JSCGlobalObjectProxy::EnableEval() {
+void JSCGlobalEnvironment::EnableEval() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(global_object_);
   global_object_->setEvalEnabled(true);
 }
 
-void JSCGlobalObjectProxy::Bind(const std::string& identifier,
+void JSCGlobalEnvironment::Bind(const std::string& identifier,
                                 const scoped_refptr<Wrappable>& impl) {
   DCHECK(thread_checker_.CalledOnValidThread());
   javascriptcore::JSCGlobalObject* jsc_global_object =
-      base::polymorphic_downcast<javascriptcore::JSCGlobalObjectProxy*>(this)
+      base::polymorphic_downcast<javascriptcore::JSCGlobalEnvironment*>(this)
           ->global_object();
 
   JSC::JSLockHolder lock(&jsc_global_object->globalData());
@@ -112,7 +112,7 @@
                                wrapper);
 }
 
-bool JSCGlobalObjectProxy::EvaluateScript(
+bool JSCGlobalEnvironment::EvaluateScript(
     const scoped_refptr<SourceCode>& source_code, std::string* out_result) {
   DCHECK(thread_checker_.CalledOnValidThread());
   JSC::JSLockHolder lock(global_object_->globalData());
@@ -133,7 +133,7 @@
   return success;
 }
 
-bool JSCGlobalObjectProxy::EvaluateScript(
+bool JSCGlobalEnvironment::EvaluateScript(
     const scoped_refptr<SourceCode>& source_code,
     const scoped_refptr<Wrappable>& owning_object,
     base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle) {
@@ -155,18 +155,18 @@
   return true;
 }
 
-std::vector<StackFrame> JSCGlobalObjectProxy::GetStackTrace(int max_frames) {
+std::vector<StackFrame> JSCGlobalEnvironment::GetStackTrace(int max_frames) {
   DCHECK(thread_checker_.CalledOnValidThread());
   return util::GetStackTrace(global_object_->globalExec(), max_frames);
 }
 
-void JSCGlobalObjectProxy::reportEval() {
+void JSCGlobalEnvironment::reportEval() {
   if (!report_eval_cb_.is_null()) {
     report_eval_cb_.Run();
   }
 }
 
-void JSCGlobalObjectProxy::SetGlobalObject(JSCGlobalObject* jsc_global_object) {
+void JSCGlobalEnvironment::SetGlobalObject(JSCGlobalObject* jsc_global_object) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_EQ(reinterpret_cast<uintptr_t>(global_object_.get()), NULL);
   global_object_ =
@@ -176,10 +176,10 @@
   DisableEval("eval() is disabled by default.");
 }
 
-bool JSCGlobalObjectProxy::EvaluateScriptInternal(
+bool JSCGlobalEnvironment::EvaluateScriptInternal(
     const scoped_refptr<SourceCode>& source_code, JSC::JSValue* out_result) {
   TRACE_EVENT0("cobalt::script::javascriptcore",
-               "JSCGlobalObjectProxy::EvaluateScriptInternal");
+               "JSCGlobalEnvironment::EvaluateScriptInternal");
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(global_object_);
 
diff --git a/src/cobalt/script/javascriptcore/jsc_global_object_proxy.h b/src/cobalt/script/javascriptcore/jsc_global_environment.h
similarity index 86%
rename from src/cobalt/script/javascriptcore/jsc_global_object_proxy.h
rename to src/cobalt/script/javascriptcore/jsc_global_environment.h
index 0ec1d03..785c938 100644
--- a/src/cobalt/script/javascriptcore/jsc_global_object_proxy.h
+++ b/src/cobalt/script/javascriptcore/jsc_global_environment.h
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef COBALT_SCRIPT_JAVASCRIPTCORE_JSC_GLOBAL_OBJECT_PROXY_H_
-#define COBALT_SCRIPT_JAVASCRIPTCORE_JSC_GLOBAL_OBJECT_PROXY_H_
+#ifndef COBALT_SCRIPT_JAVASCRIPTCORE_JSC_GLOBAL_ENVIRONMENT_H_
+#define COBALT_SCRIPT_JAVASCRIPTCORE_JSC_GLOBAL_ENVIRONMENT_H_
 
 #include <string>
 #include <vector>
@@ -22,7 +22,7 @@
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_engine.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
 
@@ -32,14 +32,14 @@
 
 class ScriptObjectRegistry;
 
-// GlobalObjectProxy is a ref-counted object that is managed by the browser, and
+// GlobalEnvironment is a ref-counted object that is managed by the browser, and
 // JavaScriptCore's JSGlobalObject is a garbage-collected object.
 // It should only be accessed from the thread that created it.
-class JSCGlobalObjectProxy : public GlobalObjectProxy,
+class JSCGlobalEnvironment : public GlobalEnvironment,
                              public JSC::ReportEvalCallback {
  public:
-  explicit JSCGlobalObjectProxy(JSCEngine* engine) : engine_(engine) {}
-  ~JSCGlobalObjectProxy() OVERRIDE;
+  explicit JSCGlobalEnvironment(JSCEngine* engine) : engine_(engine) {}
+  ~JSCGlobalEnvironment() OVERRIDE;
 
   void CreateGlobalObject() OVERRIDE;
 
@@ -96,11 +96,11 @@
   JSC::Strong<JSCGlobalObject> global_object_;
   JSCEngine* engine_;
   base::Closure report_eval_cb_;
-  friend class GlobalObjectProxy;
+  friend class GlobalEnvironment;
 };
 
 }  // namespace javascriptcore
 }  // namespace script
 }  // namespace cobalt
 
-#endif  // COBALT_SCRIPT_JAVASCRIPTCORE_JSC_GLOBAL_OBJECT_PROXY_H_
+#endif  // COBALT_SCRIPT_JAVASCRIPTCORE_JSC_GLOBAL_ENVIRONMENT_H_
diff --git a/src/cobalt/script/javascriptcore/numeric_conversion_test.cc b/src/cobalt/script/javascriptcore/numeric_conversion_test.cc
index 04c9481..3209d88 100644
--- a/src/cobalt/script/javascriptcore/numeric_conversion_test.cc
+++ b/src/cobalt/script/javascriptcore/numeric_conversion_test.cc
@@ -16,17 +16,14 @@
 
 #include <limits>
 
-#include "config.h"
-#undef LOG
-
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/global_object_proxy.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/javascriptcore/conversion_helpers.h"
+#include "cobalt/script/javascriptcore/jsc_global_environment.h"
 #include "cobalt/script/javascriptcore/jsc_global_object.h"
-#include "cobalt/script/javascriptcore/jsc_global_object_proxy.h"
 #include "cobalt/script/testing/mock_exception_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/WebKit/Source/JavaScriptCore/config.h"
 #include "third_party/WebKit/Source/JavaScriptCore/runtime/JSFunction.h"
 #include "third_party/WebKit/Source/JavaScriptCore/runtime/JSString.h"
 #include "third_party/WebKit/Source/JavaScriptCore/runtime/JSValue.h"
@@ -50,12 +47,13 @@
  public:
   NumericConversionTest()
       : engine_(JavaScriptEngine::CreateEngine()),
-        global_object_proxy_(engine_->CreateGlobalObjectProxy()),
+        global_environment_(engine_->CreateGlobalEnvironment()),
         jsc_global_object_(NULL),
         exec_state_(NULL) {
-    global_object_proxy_->CreateGlobalObject();
-    jsc_global_object_ = base::polymorphic_downcast<JSCGlobalObjectProxy*>(
-                             global_object_proxy_.get())->global_object();
+    global_environment_->CreateGlobalObject();
+    jsc_global_object_ = base::polymorphic_downcast<JSCGlobalEnvironment*>(
+                             global_environment_.get())
+                             ->global_object();
     exec_state_ = jsc_global_object_->globalExec();
   }
 
@@ -70,7 +68,7 @@
   }
 
   const scoped_ptr<JavaScriptEngine> engine_;
-  const scoped_refptr<GlobalObjectProxy> global_object_proxy_;
+  const scoped_refptr<GlobalEnvironment> global_environment_;
   JSCGlobalObject* jsc_global_object_;
   JSC::ExecState* exec_state_;
   testing::MockExceptionState exception_state_;
diff --git a/src/cobalt/script/mozjs/callback_function_conversion.h b/src/cobalt/script/mozjs/callback_function_conversion.h
index 85fd73a..68bd37e 100644
--- a/src/cobalt/script/mozjs/callback_function_conversion.h
+++ b/src/cobalt/script/mozjs/callback_function_conversion.h
@@ -81,10 +81,10 @@
     return;
   }
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   *out_callback_function = MozjsCallbackHolderClass(
-      object, context, global_object_proxy->wrapper_factory());
+      object, context, global_environment->wrapper_factory());
 }
 
 }  // namespace mozjs
diff --git a/src/cobalt/script/mozjs/conversion_helpers.cc b/src/cobalt/script/mozjs/conversion_helpers.cc
index 5eb537d..caffcdc 100644
--- a/src/cobalt/script/mozjs/conversion_helpers.cc
+++ b/src/cobalt/script/mozjs/conversion_helpers.cc
@@ -99,10 +99,10 @@
   }
 
   DCHECK(js_object);
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   *out_holder = MozjsObjectHandleHolder(js_object, context,
-                                        global_object_proxy->wrapper_factory());
+                                        global_environment->wrapper_factory());
 }
 
 }  // namespace mozjs
diff --git a/src/cobalt/script/mozjs/conversion_helpers.h b/src/cobalt/script/mozjs/conversion_helpers.h
index ef3c581..3d54ec6 100644
--- a/src/cobalt/script/mozjs/conversion_helpers.h
+++ b/src/cobalt/script/mozjs/conversion_helpers.h
@@ -27,7 +27,7 @@
 #include "cobalt/base/token.h"
 #include "cobalt/script/mozjs/mozjs_callback_interface_holder.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
 #include "cobalt/script/mozjs/type_traits.h"
@@ -363,11 +363,11 @@
     return;
   }
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   JS::RootedObject object(
       context,
-      global_object_proxy->wrapper_factory()->GetWrapperProxy(in_object));
+      global_environment->wrapper_factory()->GetWrapperProxy(in_object));
   DCHECK(object);
 
   out_value.set(OBJECT_TO_JSVAL(object));
@@ -394,10 +394,10 @@
   DCHECK(js_object);
   if (js::IsProxy(js_object)) {
     JS::RootedObject wrapper(context, js::GetProxyTargetObject(js_object));
-    MozjsGlobalObjectProxy* global_object_proxy =
-        static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+    MozjsGlobalEnvironment* global_environment =
+        static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
     const WrapperFactory* wrapper_factory =
-        global_object_proxy->wrapper_factory();
+        global_environment->wrapper_factory();
     if (wrapper_factory->IsWrapper(wrapper)) {
       bool object_implements_interface =
           wrapper_factory->DoesObjectImplementInterface(js_object,
@@ -471,13 +471,13 @@
     return;
   }
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
 
   JS::RootedObject implementing_object(context, JSVAL_TO_OBJECT(value));
   DCHECK(implementing_object);
   *out_callback_interface = MozjsCallbackInterfaceHolder<T>(
-      implementing_object, context, global_object_proxy->wrapper_factory());
+      implementing_object, context, global_environment->wrapper_factory());
 }
 
 }  // namespace mozjs
diff --git a/src/cobalt/script/mozjs/mozjs.cc b/src/cobalt/script/mozjs/mozjs.cc
index 6625ed2..3d78b16 100644
--- a/src/cobalt/script/mozjs/mozjs.cc
+++ b/src/cobalt/script/mozjs/mozjs.cc
@@ -20,7 +20,7 @@
 #include "base/file_path.h"
 #include "base/string_util.h"
 #include "cobalt/base/wrap_main.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/source_code.h"
 #include "cobalt/script/standalone_javascript_runner.h"
 #include "third_party/mozjs/js/src/jsapi.h"
@@ -62,12 +62,12 @@
 
 int MozjsMain(int argc, char** argv) {
   cobalt::script::StandaloneJavascriptRunner standalone_runner;
-  MozjsGlobalObjectProxy* global_object_environment =
-      static_cast<MozjsGlobalObjectProxy*>(
-          standalone_runner.global_object_proxy().get());
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(
+          standalone_runner.global_environment().get());
 
-  SetupBindings(global_object_environment->context(),
-                global_object_environment->global_object());
+  SetupBindings(global_environment->context(),
+                global_environment->global_object());
 
   if (argc > 1) {
     // Command line arguments will be flag-value pairs of the form
@@ -89,8 +89,7 @@
 
         // Execute the script and get the results of execution.
         std::string result;
-        bool success =
-            global_object_environment->EvaluateScript(source, &result);
+        bool success = global_environment->EvaluateScript(source, &result);
         // Echo the results to stdout.
         if (!success) {
           std::cout << "Exception: ";
diff --git a/src/cobalt/script/mozjs/mozjs.gyp b/src/cobalt/script/mozjs/mozjs.gyp
index 76f11c1..b29d99b 100644
--- a/src/cobalt/script/mozjs/mozjs.gyp
+++ b/src/cobalt/script/mozjs/mozjs.gyp
@@ -23,9 +23,10 @@
         'mozjs_debugger.cc',
         'mozjs_engine.cc',
         'mozjs_exception_state.cc',
-        'mozjs_global_object_proxy.cc',
+        'mozjs_global_environment.cc',
         'mozjs_property_enumerator.cc',
         'mozjs_source_code.cc',
+        'opaque_root_tracker.cc',
         'proxy_handler.cc',
         'referenced_object_map.cc',
         'util/exception_helpers.cc',
diff --git a/src/cobalt/script/mozjs/mozjs_debugger.cc b/src/cobalt/script/mozjs/mozjs_debugger.cc
index e4ae668..8876311 100644
--- a/src/cobalt/script/mozjs/mozjs_debugger.cc
+++ b/src/cobalt/script/mozjs/mozjs_debugger.cc
@@ -23,14 +23,14 @@
 
 // Static factory method declared in public interface.
 scoped_ptr<ScriptDebugger> ScriptDebugger::CreateDebugger(
-    GlobalObjectProxy* global_object_proxy, Delegate* delegate) {
+    GlobalEnvironment* global_environment, Delegate* delegate) {
   return scoped_ptr<ScriptDebugger>(
-      new mozjs::MozjsDebugger(global_object_proxy, delegate));
+      new mozjs::MozjsDebugger(global_environment, delegate));
 }
 
 namespace mozjs {
 
-MozjsDebugger::MozjsDebugger(GlobalObjectProxy* global_object_proxy,
+MozjsDebugger::MozjsDebugger(GlobalEnvironment* global_environment,
                              Delegate* delegate) {
   NOTIMPLEMENTED();
 }
diff --git a/src/cobalt/script/mozjs/mozjs_debugger.h b/src/cobalt/script/mozjs/mozjs_debugger.h
index 63fd7f2..0b5e11d 100644
--- a/src/cobalt/script/mozjs/mozjs_debugger.h
+++ b/src/cobalt/script/mozjs/mozjs_debugger.h
@@ -26,7 +26,7 @@
 
 class MozjsDebugger : public ScriptDebugger {
  public:
-  MozjsDebugger(GlobalObjectProxy* global_object_proxy, Delegate* delegate);
+  MozjsDebugger(GlobalEnvironment* global_environment, Delegate* delegate);
   ~MozjsDebugger() OVERRIDE;
 
   // Implementation of ScriptDebugger.
diff --git a/src/cobalt/script/mozjs/mozjs_engine.cc b/src/cobalt/script/mozjs/mozjs_engine.cc
index 23444fa..b4d16ec 100644
--- a/src/cobalt/script/mozjs/mozjs_engine.cc
+++ b/src/cobalt/script/mozjs/mozjs_engine.cc
@@ -19,7 +19,7 @@
 #include <algorithm>
 
 #include "base/logging.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "third_party/mozjs/js/src/jsapi.h"
 
 namespace cobalt {
@@ -51,6 +51,9 @@
   // JSRuntime.
   JS_SetContextCallback(runtime_, &MozjsEngine::ContextCallback);
 
+  // Callback to be called at different points during garbage collection.
+  JS_SetGCCallback(runtime_, &MozjsEngine::GCCallback);
+
   // Callback to be called during garbage collection during the sweep phase.
   JS_SetFinalizeCallback(runtime_, &MozjsEngine::FinalizeCallback);
 }
@@ -60,9 +63,9 @@
   JS_DestroyRuntime(runtime_);
 }
 
-scoped_refptr<GlobalObjectProxy> MozjsEngine::CreateGlobalObjectProxy() {
+scoped_refptr<GlobalEnvironment> MozjsEngine::CreateGlobalEnvironment() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  return new MozjsGlobalObjectProxy(runtime_);
+  return new MozjsGlobalEnvironment(runtime_);
 }
 
 void MozjsEngine::CollectGarbage() {
@@ -89,6 +92,20 @@
   return true;
 }
 
+void MozjsEngine::GCCallback(JSRuntime* runtime, JSGCStatus status) {
+  MozjsEngine* engine =
+      static_cast<MozjsEngine*>(JS_GetRuntimePrivate(runtime));
+  for (int i = 0; i < engine->contexts_.size(); ++i) {
+    MozjsGlobalEnvironment* global_environment =
+        MozjsGlobalEnvironment::GetFromContext(engine->contexts_[i]);
+    if (status == JSGC_BEGIN) {
+      global_environment->BeginGarbageCollection();
+    } else if (status == JSGC_END) {
+      global_environment->EndGarbageCollection();
+    }
+  }
+}
+
 void MozjsEngine::FinalizeCallback(JSFreeOp* free_op, JSFinalizeStatus status,
                                    JSBool is_compartment) {
   MozjsEngine* engine =
@@ -96,8 +113,8 @@
   DCHECK(engine->thread_checker_.CalledOnValidThread());
   if (status == JSFINALIZE_GROUP_START) {
     for (int i = 0; i < engine->contexts_.size(); ++i) {
-      MozjsGlobalObjectProxy* global_environment =
-          MozjsGlobalObjectProxy::GetFromContext(engine->contexts_[i]);
+      MozjsGlobalEnvironment* global_environment =
+          MozjsGlobalEnvironment::GetFromContext(engine->contexts_[i]);
       global_environment->DoSweep();
     }
   }
diff --git a/src/cobalt/script/mozjs/mozjs_engine.h b/src/cobalt/script/mozjs/mozjs_engine.h
index 12a24fd..a678a15 100644
--- a/src/cobalt/script/mozjs/mozjs_engine.h
+++ b/src/cobalt/script/mozjs/mozjs_engine.h
@@ -31,12 +31,13 @@
   MozjsEngine();
   ~MozjsEngine() OVERRIDE;
 
-  scoped_refptr<GlobalObjectProxy> CreateGlobalObjectProxy() OVERRIDE;
+  scoped_refptr<GlobalEnvironment> CreateGlobalEnvironment() OVERRIDE;
   void CollectGarbage() OVERRIDE;
   void ReportExtraMemoryCost(size_t bytes) OVERRIDE;
 
  private:
   static JSBool ContextCallback(JSContext* context, unsigned context_op);
+  static void GCCallback(JSRuntime* runtime, JSGCStatus status);
   static void FinalizeCallback(JSFreeOp* free_op, JSFinalizeStatus status,
                                JSBool is_compartment);
 
diff --git a/src/cobalt/script/mozjs/mozjs_exception_state.cc b/src/cobalt/script/mozjs/mozjs_exception_state.cc
index 111b56e..9b2a5ec 100644
--- a/src/cobalt/script/mozjs/mozjs_exception_state.cc
+++ b/src/cobalt/script/mozjs/mozjs_exception_state.cc
@@ -59,12 +59,12 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!is_exception_set_);
 
-  MozjsGlobalObjectProxy* global_object_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context_));
+  MozjsGlobalEnvironment* global_environment =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context_));
 
   JS::RootedObject exception_object(
       context_,
-      global_object_proxy->wrapper_factory()->GetWrapperProxy(exception));
+      global_environment->wrapper_factory()->GetWrapperProxy(exception));
   JS::RootedValue exception_value(context_, OBJECT_TO_JSVAL(exception_object));
   JS_SetPendingException(context_, exception_value);
 
diff --git a/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc b/src/cobalt/script/mozjs/mozjs_global_environment.cc
similarity index 84%
rename from src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
rename to src/cobalt/script/mozjs/mozjs_global_environment.cc
index 273f328..84a8d91 100644
--- a/src/cobalt/script/mozjs/mozjs_global_object_proxy.cc
+++ b/src/cobalt/script/mozjs/mozjs_global_environment.cc
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 
 #include <algorithm>
 #include <utility>
@@ -120,7 +120,7 @@
 static base::LazyInstance<MozjsStubHandler> proxy_handler;
 }  // namespace
 
-MozjsGlobalObjectProxy::MozjsGlobalObjectProxy(JSRuntime* runtime)
+MozjsGlobalEnvironment::MozjsGlobalEnvironment(JSRuntime* runtime)
     : context_(NULL),
       cached_interface_data_deleter_(&cached_interface_data_),
       context_destructor_(&context_),
@@ -149,20 +149,22 @@
 #endif
   JS_SetOptions(context_, options);
 
-  JS_SetErrorReporter(context_, &MozjsGlobalObjectProxy::ReportErrorHandler);
+  JS_SetErrorReporter(context_, &MozjsGlobalEnvironment::ReportErrorHandler);
 
   wrapper_factory_.reset(new WrapperFactory(context_));
   referenced_objects_.reset(new ReferencedObjectMap(context_));
+  opaque_root_tracker_.reset(new OpaqueRootTracker(
+      context_, referenced_objects_.get(), wrapper_factory_.get()));
 
   JS_AddExtraGCRootsTracer(runtime, TraceFunction, this);
 }
 
-MozjsGlobalObjectProxy::~MozjsGlobalObjectProxy() {
+MozjsGlobalEnvironment::~MozjsGlobalEnvironment() {
   DCHECK(thread_checker_.CalledOnValidThread());
   JS_RemoveExtraGCRootsTracer(JS_GetRuntime(context_), TraceFunction, this);
 }
 
-void MozjsGlobalObjectProxy::CreateGlobalObject() {
+void MozjsGlobalEnvironment::CreateGlobalObject() {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(!global_object_proxy_);
 
@@ -188,7 +190,7 @@
   global_object_proxy_ = proxy;
 }
 
-bool MozjsGlobalObjectProxy::EvaluateScript(
+bool MozjsGlobalEnvironment::EvaluateScript(
     const scoped_refptr<SourceCode>& source_code,
     std::string* out_result_utf8) {
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -233,12 +235,12 @@
   return success;
 }
 
-std::vector<StackFrame> MozjsGlobalObjectProxy::GetStackTrace(int max_frames) {
+std::vector<StackFrame> MozjsGlobalEnvironment::GetStackTrace(int max_frames) {
   DCHECK(thread_checker_.CalledOnValidThread());
   return util::GetStackTrace(context_, max_frames);
 }
 
-void MozjsGlobalObjectProxy::PreventGarbageCollection(
+void MozjsGlobalEnvironment::PreventGarbageCollection(
     const scoped_refptr<Wrappable>& wrappable) {
   DCHECK(thread_checker_.CalledOnValidThread());
   JSAutoRequest auto_request(context_);
@@ -250,7 +252,7 @@
       wrappable.get(), JS::Heap<JSObject*>(proxy)));
 }
 
-void MozjsGlobalObjectProxy::AllowGarbageCollection(
+void MozjsGlobalEnvironment::AllowGarbageCollection(
     const scoped_refptr<Wrappable>& wrappable) {
   DCHECK(thread_checker_.CalledOnValidThread());
   CachedWrapperMultiMap::iterator it =
@@ -261,25 +263,25 @@
   }
 }
 
-void MozjsGlobalObjectProxy::DisableEval(const std::string& message) {
+void MozjsGlobalEnvironment::DisableEval(const std::string& message) {
   DCHECK(thread_checker_.CalledOnValidThread());
   eval_disabled_message_.emplace(message);
   eval_enabled_ = false;
 }
 
-void MozjsGlobalObjectProxy::EnableEval() {
+void MozjsGlobalEnvironment::EnableEval() {
   DCHECK(thread_checker_.CalledOnValidThread());
   eval_disabled_message_ = base::nullopt;
   eval_enabled_ = true;
 }
 
-void MozjsGlobalObjectProxy::SetReportEvalCallback(
+void MozjsGlobalEnvironment::SetReportEvalCallback(
     const base::Closure& report_eval) {
   DCHECK(thread_checker_.CalledOnValidThread());
   report_eval_ = report_eval;
 }
 
-void MozjsGlobalObjectProxy::Bind(const std::string& identifier,
+void MozjsGlobalEnvironment::Bind(const std::string& identifier,
                                   const scoped_refptr<Wrappable>& impl) {
   JSAutoRequest auto_request(context_);
   JSAutoCompartment auto_compartment(context_, global_object_proxy_);
@@ -294,7 +296,7 @@
   DCHECK(success);
 }
 
-InterfaceData* MozjsGlobalObjectProxy::GetInterfaceData(intptr_t key) {
+InterfaceData* MozjsGlobalEnvironment::GetInterfaceData(intptr_t key) {
   CachedInterfaceData::iterator it = cached_interface_data_.find(key);
   if (it != cached_interface_data_.end()) {
     return it->second;
@@ -302,21 +304,37 @@
   return NULL;
 }
 
-void MozjsGlobalObjectProxy::DoSweep() {
+void MozjsGlobalEnvironment::DoSweep() {
   weak_object_manager_.SweepUnmarkedObjects();
   // Remove NULL references after sweeping weak references.
   referenced_objects_->RemoveNullReferences();
 }
 
-MozjsGlobalObjectProxy* MozjsGlobalObjectProxy::GetFromContext(
+void MozjsGlobalEnvironment::BeginGarbageCollection() {
+  DCHECK(!opaque_root_state_);
+  JSAutoRequest auto_request(context_);
+  JSAutoCompartment auto_comparment(context_, global_object_proxy_);
+  // Get the current state of opaque root relationships. Keep this object
+  // alive for the duration of the GC phase to ensure that reachability between
+  // roots and reachable objects is maintained.
+  opaque_root_state_ = opaque_root_tracker_->GetCurrentOpaqueRootState();
+}
+
+void MozjsGlobalEnvironment::EndGarbageCollection() {
+  DCHECK(opaque_root_state_);
+  // Reset opaque root reachability relationships.
+  opaque_root_state_.reset(NULL);
+}
+
+MozjsGlobalEnvironment* MozjsGlobalEnvironment::GetFromContext(
     JSContext* context) {
-  MozjsGlobalObjectProxy* global_proxy =
-      static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+  MozjsGlobalEnvironment* global_proxy =
+      static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
   DCHECK(global_proxy);
   return global_proxy;
 }
 
-void MozjsGlobalObjectProxy::SetGlobalObjectProxyAndWrapper(
+void MozjsGlobalEnvironment::SetGlobalObjectProxyAndWrapper(
     JS::HandleObject global_object_proxy,
     const scoped_refptr<Wrappable>& wrappable) {
   DCHECK(!global_object_proxy_);
@@ -338,17 +356,17 @@
   SetCachedWrapper(wrappable.get(), object_handle.Pass());
 }
 
-void MozjsGlobalObjectProxy::CacheInterfaceData(intptr_t key,
+void MozjsGlobalEnvironment::CacheInterfaceData(intptr_t key,
                                                 InterfaceData* interface_data) {
   std::pair<CachedInterfaceData::iterator, bool> pib =
       cached_interface_data_.insert(std::make_pair(key, interface_data));
   DCHECK(pib.second);
 }
 
-void MozjsGlobalObjectProxy::ReportErrorHandler(JSContext* context,
+void MozjsGlobalEnvironment::ReportErrorHandler(JSContext* context,
                                                 const char* message,
                                                 JSErrorReport* report) {
-  MozjsGlobalObjectProxy* global_object_proxy = GetFromContext(context);
+  MozjsGlobalEnvironment* global_object_proxy = GetFromContext(context);
   std::string error_message;
   if (report->errorNumber == JSMSG_CSP_BLOCKED_EVAL) {
     error_message =
@@ -364,13 +382,13 @@
   }
 }
 
-void MozjsGlobalObjectProxy::TraceFunction(JSTracer* trace, void* data) {
-  MozjsGlobalObjectProxy* global_object_environment =
-      reinterpret_cast<MozjsGlobalObjectProxy*>(data);
+void MozjsGlobalEnvironment::TraceFunction(JSTracer* trace, void* data) {
+  MozjsGlobalEnvironment* global_object_environment =
+      reinterpret_cast<MozjsGlobalEnvironment*>(data);
   if (global_object_environment->global_object_proxy_) {
     JS_CallHeapObjectTracer(trace,
                             &global_object_environment->global_object_proxy_,
-                            "MozjsGlobalObjectProxy");
+                            "MozjsGlobalEnvironment");
   }
   for (CachedInterfaceData::iterator it =
            global_object_environment->cached_interface_data_.begin();
@@ -380,22 +398,22 @@
     // created yet or not before attempting to trace them.
     if (data->prototype) {
       JS_CallHeapObjectTracer(trace, &data->prototype,
-                              "MozjsGlobalObjectProxy");
+                              "MozjsGlobalEnvironment");
     }
     if (data->interface_object) {
       JS_CallHeapObjectTracer(trace, &data->interface_object,
-                              "MozjsGlobalObjectProxy");
+                              "MozjsGlobalEnvironment");
     }
   }
   for (CachedWrapperMultiMap::iterator it =
            global_object_environment->kept_alive_objects_.begin();
        it != global_object_environment->kept_alive_objects_.end(); ++it) {
-    JS_CallHeapObjectTracer(trace, &it->second, "MozjsGlobalObjectProxy");
+    JS_CallHeapObjectTracer(trace, &it->second, "MozjsGlobalEnvironment");
   }
 }
 
-JSBool MozjsGlobalObjectProxy::CheckEval(JSContext* context) {
-  MozjsGlobalObjectProxy* global_object_proxy = GetFromContext(context);
+JSBool MozjsGlobalEnvironment::CheckEval(JSContext* context) {
+  MozjsGlobalEnvironment* global_object_proxy = GetFromContext(context);
   DCHECK(global_object_proxy);
   if (!global_object_proxy->report_eval_.is_null()) {
     global_object_proxy->report_eval_.Run();
diff --git a/src/cobalt/script/mozjs/mozjs_global_object_proxy.h b/src/cobalt/script/mozjs/mozjs_global_environment.h
similarity index 86%
rename from src/cobalt/script/mozjs/mozjs_global_object_proxy.h
rename to src/cobalt/script/mozjs/mozjs_global_environment.h
index de36ae6..eb0d2eb 100644
--- a/src/cobalt/script/mozjs/mozjs_global_object_proxy.h
+++ b/src/cobalt/script/mozjs/mozjs_global_environment.h
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef COBALT_SCRIPT_MOZJS_MOZJS_GLOBAL_OBJECT_PROXY_H_
-#define COBALT_SCRIPT_MOZJS_MOZJS_GLOBAL_OBJECT_PROXY_H_
+#ifndef COBALT_SCRIPT_MOZJS_MOZJS_GLOBAL_ENVIRONMENT_H_
+#define COBALT_SCRIPT_MOZJS_MOZJS_GLOBAL_ENVIRONMENT_H_
 
 #include <string>
 #include <vector>
@@ -24,8 +24,9 @@
 #include "base/optional.h"
 #include "base/stl_util.h"
 #include "base/threading/thread_checker.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/mozjs/interface_data.h"
+#include "cobalt/script/mozjs/opaque_root_tracker.h"
 #include "cobalt/script/mozjs/util/exception_helpers.h"
 #include "cobalt/script/mozjs/weak_heap_object_manager.h"
 #include "cobalt/script/mozjs/wrapper_factory.h"
@@ -41,11 +42,11 @@
 
 // Manages a handle to a JavaScript engine's global object. The lifetime of
 // the global object is not necessarily tied to the lifetime of the proxy.
-class MozjsGlobalObjectProxy : public GlobalObjectProxy,
+class MozjsGlobalEnvironment : public GlobalEnvironment,
                                public Wrappable::CachedWrapperAccessor {
  public:
-  explicit MozjsGlobalObjectProxy(JSRuntime* runtime);
-  ~MozjsGlobalObjectProxy() OVERRIDE;
+  explicit MozjsGlobalEnvironment(JSRuntime* runtime);
+  ~MozjsGlobalEnvironment() OVERRIDE;
 
   void CreateGlobalObject() OVERRIDE;
 
@@ -92,6 +93,10 @@
 
   WeakHeapObjectManager* weak_object_manager() { return &weak_object_manager_; }
 
+  OpaqueRootTracker* opaque_root_tracker() {
+    return opaque_root_tracker_.get();
+  }
+
   // Used for CallWith=EnvironmentSettings
   void SetEnvironmentSettings(EnvironmentSettings* environment_settings) {
     DCHECK(!environment_settings_);
@@ -108,7 +113,7 @@
       const scoped_refptr<Wrappable>& wrappable);
 
   // Any tracked InterfaceData will have it's GC handles visited and marked as
-  // roots. The MozjsGlobalObjectProxy takes ownership of the InterfaceData
+  // roots. The MozjsGlobalEnvironment takes ownership of the InterfaceData
   // instances and will destroy them.
   void CacheInterfaceData(intptr_t key, InterfaceData* interface_data);
   InterfaceData* GetInterfaceData(intptr_t key);
@@ -118,7 +123,10 @@
   // sweep away references to GC objects that will be deleted.
   void DoSweep();
 
-  static MozjsGlobalObjectProxy* GetFromContext(JSContext* context);
+  void BeginGarbageCollection();
+  void EndGarbageCollection();
+
+  static MozjsGlobalEnvironment* GetFromContext(JSContext* context);
 
  protected:
   static void ReportErrorHandler(JSContext* context, const char* message,
@@ -132,7 +140,7 @@
   static JSBool CheckEval(JSContext* context);
 
   // Helper struct to ensure the context is destroyed in the correct order
-  // relative to the MozjsGlobalObjectProxy's other members.
+  // relative to the MozjsGlobalEnvironment's other members.
   struct ContextDestructor {
     explicit ContextDestructor(JSContext** context) : context(context) {}
     ~ContextDestructor() { JS_DestroyContext(*context); }
@@ -148,10 +156,12 @@
   WeakHeapObjectManager weak_object_manager_;
   CachedWrapperMultiMap kept_alive_objects_;
   scoped_ptr<ReferencedObjectMap> referenced_objects_;
+  scoped_ptr<OpaqueRootTracker> opaque_root_tracker_;
   CachedInterfaceData cached_interface_data_;
   STLValueDeleter<CachedInterfaceData> cached_interface_data_deleter_;
   ContextDestructor context_destructor_;
   scoped_ptr<WrapperFactory> wrapper_factory_;
+  scoped_ptr<OpaqueRootTracker::OpaqueRootState> opaque_root_state_;
   JS::Heap<JSObject*> global_object_proxy_;
   EnvironmentSettings* environment_settings_;
 
@@ -170,4 +180,4 @@
 }  // namespace script
 }  // namespace cobalt
 
-#endif  // COBALT_SCRIPT_MOZJS_MOZJS_GLOBAL_OBJECT_PROXY_H_
+#endif  // COBALT_SCRIPT_MOZJS_MOZJS_GLOBAL_ENVIRONMENT_H_
diff --git a/src/cobalt/script/mozjs/mozjs_user_object_holder.h b/src/cobalt/script/mozjs/mozjs_user_object_holder.h
index e51a8bb..2ee384f 100644
--- a/src/cobalt/script/mozjs/mozjs_user_object_holder.h
+++ b/src/cobalt/script/mozjs/mozjs_user_object_holder.h
@@ -19,7 +19,7 @@
 #include "base/hash_tables.h"
 #include "base/memory/weak_ptr.h"
 #include "cobalt/base/polymorphic_downcast.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/referenced_object_map.h"
 #include "cobalt/script/mozjs/wrapper_factory.h"
 #include "cobalt/script/mozjs/wrapper_private.h"
@@ -55,8 +55,8 @@
     DLOG_IF(WARNING, !owned_object)
         << "Owned object has been garbage collected.";
     if (owned_object) {
-      MozjsGlobalObjectProxy* global_environment =
-          MozjsGlobalObjectProxy::GetFromContext(context_);
+      MozjsGlobalEnvironment* global_environment =
+          MozjsGlobalEnvironment::GetFromContext(context_);
       intptr_t key = ReferencedObjectMap::GetKeyForWrappable(owner);
       global_environment->referenced_objects()->AddReferencedObject(
           key, owned_object);
@@ -67,8 +67,8 @@
     // |owner| may be in the process of being destructed, so don't use it.
     JS::RootedObject owned_object(context_, js_object());
     if (owned_object) {
-      MozjsGlobalObjectProxy* global_environment =
-          MozjsGlobalObjectProxy::GetFromContext(context_);
+      MozjsGlobalEnvironment* global_environment =
+          MozjsGlobalEnvironment::GetFromContext(context_);
       intptr_t key = ReferencedObjectMap::GetKeyForWrappable(owner);
       global_environment->referenced_objects()->RemoveReferencedObject(
           key, owned_object);
diff --git a/src/cobalt/script/mozjs/opaque_root_tracker.cc b/src/cobalt/script/mozjs/opaque_root_tracker.cc
new file mode 100644
index 0000000..22bfc40
--- /dev/null
+++ b/src/cobalt/script/mozjs/opaque_root_tracker.cc
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * 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 "cobalt/script/mozjs/opaque_root_tracker.h"
+
+#include <utility>
+#include <vector>
+
+#include "cobalt/script/mozjs/weak_heap_object.h"
+
+namespace cobalt {
+namespace script {
+namespace mozjs {
+namespace {
+// Implementation of OpaqueRootTracker::OpaqueRootState.
+// On creation, this class will register reachability between objects and their
+// roots in |ReferencedObjectMap|. On destruction, the reachability
+// relationship will be removed.
+class OpaqueRootStateImpl : public OpaqueRootTracker::OpaqueRootState {
+ public:
+  OpaqueRootStateImpl(JSContext* context,
+                      ReferencedObjectMap* referenced_object_map)
+      : context_(context), referenced_object_map_(referenced_object_map) {}
+
+  void TrackReachability(WrapperPrivate* from, WrapperPrivate* to) {
+    intptr_t from_key = ReferencedObjectMap::GetKeyForWrappable(
+        from->wrappable<Wrappable>().get());
+    JS::RootedObject to_object(context_, to->js_object_proxy());
+    referenced_objects_.push_back(
+        std::make_pair(from_key, WeakHeapObject(context_, to_object)));
+    referenced_object_map_->AddReferencedObject(from_key, to_object);
+  }
+
+  ~OpaqueRootStateImpl() {
+    for (ReferencedObjectPairVector::iterator it = referenced_objects_.begin();
+         it != referenced_objects_.end(); ++it) {
+      if (it->second.Get()) {
+        JS::RootedObject reachable_object(context_, it->second.Get());
+        referenced_object_map_->RemoveReferencedObject(it->first,
+                                                       reachable_object);
+      }
+    }
+  }
+
+ private:
+  typedef std::vector<std::pair<intptr_t, WeakHeapObject> >
+      ReferencedObjectPairVector;
+
+  JSContext* context_;
+  ReferencedObjectMap* referenced_object_map_;
+  ReferencedObjectPairVector referenced_objects_;
+};
+}  // namespace
+
+OpaqueRootTracker::OpaqueRootTracker(JSContext* context,
+                                     ReferencedObjectMap* referenced_object_map,
+                                     WrapperFactory* wrapper_factory)
+    : context_(context),
+      referenced_object_map_(referenced_object_map),
+      wrapper_factory_(wrapper_factory) {}
+
+void OpaqueRootTracker::AddObjectWithOpaqueRoot(
+    WrapperPrivate* wrapper_private) {
+  all_objects_.insert(wrapper_private);
+}
+
+void OpaqueRootTracker::RemoveObjectWithOpaqueRoot(
+    WrapperPrivate* wrapper_private) {
+  all_objects_.erase(wrapper_private);
+}
+
+scoped_ptr<OpaqueRootTracker::OpaqueRootState>
+OpaqueRootTracker::GetCurrentOpaqueRootState() {
+  scoped_ptr<OpaqueRootStateImpl> state(
+      new OpaqueRootStateImpl(context_, referenced_object_map_));
+  // Get the current opaque root for all objects that are being tracked.
+  for (WrapperPrivateSet::iterator it = all_objects_.begin();
+       it != all_objects_.end(); ++it) {
+    WrapperPrivate* reachable_object_wrapper_private = *it;
+    Wrappable* opaque_root = reachable_object_wrapper_private->GetOpaqueRoot();
+    if (opaque_root) {
+      WrapperPrivate* opaque_root_private = WrapperPrivate::GetFromWrappable(
+          opaque_root, context_, wrapper_factory_);
+      // Always mark the root as reachable from the non-root object.
+      state->TrackReachability(reachable_object_wrapper_private,
+                               opaque_root_private);
+
+      // Only mark the non-root object as reachable if we need to keep the
+      // wrapper alive for some reason. In general it's okay for a wrapper to
+      // get GC'd because the Cobalt object will still be kept alive, and a new
+      // JS object can be created if needed again.
+      if (reachable_object_wrapper_private
+              ->ShouldKeepWrapperAliveIfReachable()) {
+        state->TrackReachability(opaque_root_private,
+                                 reachable_object_wrapper_private);
+      }
+    }
+  }
+  return state.PassAs<OpaqueRootState>();
+}
+
+}  // namespace mozjs
+}  // namespace script
+}  // namespace cobalt
diff --git a/src/cobalt/script/mozjs/opaque_root_tracker.h b/src/cobalt/script/mozjs/opaque_root_tracker.h
new file mode 100644
index 0000000..bd9ef2a
--- /dev/null
+++ b/src/cobalt/script/mozjs/opaque_root_tracker.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * 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.
+ */
+#ifndef COBALT_SCRIPT_MOZJS_OPAQUE_ROOT_TRACKER_H_
+#define COBALT_SCRIPT_MOZJS_OPAQUE_ROOT_TRACKER_H_
+
+#include "base/hash_tables.h"
+#include "cobalt/script/mozjs/referenced_object_map.h"
+#include "cobalt/script/mozjs/wrapper_factory.h"
+#include "cobalt/script/mozjs/wrapper_private.h"
+
+namespace cobalt {
+namespace script {
+namespace mozjs {
+
+// This class manages lifetime of structures containing objects that are
+// reachable from through the interface implementation, but not through
+// JavaScript, by ensuring that the root of the structure is not garbage
+// collected if any of the members of the structure are reachable.
+//
+// The implementation of the structure in Cobalt is typically reference counted.
+// The |root| of that structure is a single node that transitively holds a
+// reference to every other node in the structure. It may be the case that the
+// only reference to that root node is from a JS object's WrapperPrivate. The
+// OpaqueRootTracker class ensures that if some node in the structure is
+// reachable from JavaScript, the JS object holding the reference to the root
+// of the structure is marked as reachable as well, which preserves the final
+// reference to the root of the structure, keeping the entire structure alive.
+//
+// For example, any DOM Node can be reached from any other DOM Node object in
+// the same tree. If an arbitary internal Node is reachable from JavaScript,
+// this class will ensure that the root of the tree will also be kept alive,
+// preserving the entire tree until no nodes in the tree are reachable from
+// JavaScript.
+//
+// An object's opaque root can change throughout the object's lifetime, so the
+// root needs to be recalculated every garbage collection phase.
+class OpaqueRootTracker {
+ public:
+  // Callers do not need to operate on this class. They just need to manage its
+  // lifetime appropriately as described below.
+  class OpaqueRootState {
+   protected:
+    OpaqueRootState() {}
+    virtual ~OpaqueRootState() {}
+    friend class scoped_ptr<OpaqueRootState>;
+  };
+
+  OpaqueRootTracker(JSContext* context,
+                    ReferencedObjectMap* referenced_object_map,
+                    WrapperFactory* wrapper_factory);
+
+  // All objects that implement this functionality must be registered to this
+  // class.
+  void AddObjectWithOpaqueRoot(WrapperPrivate* wrapper_private);
+  void RemoveObjectWithOpaqueRoot(WrapperPrivate* wrapper_private);
+
+  // Get the current state of opaque roots. This should be called when garbage
+  // collection begins before marking has begun. Once garbage collection is
+  // complete, this should be released.
+  scoped_ptr<OpaqueRootState> GetCurrentOpaqueRootState();
+
+ private:
+  typedef base::hash_set<WrapperPrivate*> WrapperPrivateSet;
+
+  JSContext* context_;
+  ReferencedObjectMap* referenced_object_map_;
+  WrapperFactory* wrapper_factory_;
+  // list of objects that are potentially reachable from an opaque root
+  WrapperPrivateSet all_objects_;
+};
+}  // namespace mozjs
+}  // namespace script
+}  // namespace cobalt
+#endif  // COBALT_SCRIPT_MOZJS_OPAQUE_ROOT_TRACKER_H_
diff --git a/src/cobalt/script/mozjs/proxy_handler.cc b/src/cobalt/script/mozjs/proxy_handler.cc
index 17849cd..498edb2 100644
--- a/src/cobalt/script/mozjs/proxy_handler.cc
+++ b/src/cobalt/script/mozjs/proxy_handler.cc
@@ -27,7 +27,8 @@
                            const NamedPropertyHooks& named_hooks)
     : js::DirectProxyHandler(NULL),
       indexed_property_hooks_(indexed_hooks),
-      named_property_hooks_(named_hooks) {
+      named_property_hooks_(named_hooks),
+      has_custom_property_(false) {
   // If an interface supports named/indexed properties, they must have a hook to
   // check if the name/index is supported and to enumerate the properties.
   if (supports_named_properties()) {
@@ -180,6 +181,13 @@
   return js::DirectProxyHandler::enumerate(context, proxy, properties);
 }
 
+bool ProxyHandler::defineProperty(JSContext* context, JS::HandleObject proxy,
+                                  JS::HandleId id,
+                                  JSPropertyDescriptor* descriptor) {
+  has_custom_property_ = true;
+  return js::DirectProxyHandler::defineProperty(context, proxy, id, descriptor);
+}
+
 bool ProxyHandler::IsSupportedIndex(JSContext* context, JS::HandleObject object,
                                     uint32_t index) {
   DCHECK(indexed_property_hooks_.is_supported);
diff --git a/src/cobalt/script/mozjs/proxy_handler.h b/src/cobalt/script/mozjs/proxy_handler.h
index e6a7c54..ffbadca 100644
--- a/src/cobalt/script/mozjs/proxy_handler.h
+++ b/src/cobalt/script/mozjs/proxy_handler.h
@@ -93,6 +93,9 @@
                bool* succeeded) OVERRIDE;
   bool enumerate(JSContext* context, JS::HandleObject proxy,
                  JS::AutoIdVector& properties) OVERRIDE;  // NOLINT[runtime/references]
+  bool defineProperty(JSContext* context, JS::HandleObject proxy,
+                      JS::HandleId id,
+                      JSPropertyDescriptor* descriptor) OVERRIDE;
 
   // The derived traps in js::DirectProxyHandler are not implemented in terms of
   // the fundamental traps, where the traps in js::BaseProxyHandler are.
@@ -131,6 +134,8 @@
     return js::BaseProxyHandler::iterate(context, proxy, flags, vp);
   }
 
+  bool has_custom_property() const { return has_custom_property_; }
+
  private:
   bool supports_named_properties() {
     return named_property_hooks_.getter != NULL;
@@ -155,6 +160,8 @@
 
   IndexedPropertyHooks indexed_property_hooks_;
   NamedPropertyHooks named_property_hooks_;
+  // Set to true if this object may have a custom property set on it.
+  bool has_custom_property_;
 };
 
 }  // namespace mozjs
diff --git a/src/cobalt/script/mozjs/union_type_conversion_forward.h b/src/cobalt/script/mozjs/union_type_conversion_forward.h
index c001f65..993f572 100644
--- a/src/cobalt/script/mozjs/union_type_conversion_forward.h
+++ b/src/cobalt/script/mozjs/union_type_conversion_forward.h
@@ -22,7 +22,6 @@
 #define COBALT_SCRIPT_MOZJS_UNION_TYPE_CONVERSION_FORWARD_H_
 
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
 #include "cobalt/script/mozjs/type_traits.h"
diff --git a/src/cobalt/script/mozjs/union_type_conversion_forward.h.pump b/src/cobalt/script/mozjs/union_type_conversion_forward.h.pump
index 876b511..bfdf0b9 100644
--- a/src/cobalt/script/mozjs/union_type_conversion_forward.h.pump
+++ b/src/cobalt/script/mozjs/union_type_conversion_forward.h.pump
@@ -27,7 +27,6 @@
 #define COBALT_SCRIPT_MOZJS_UNION_TYPE_CONVERSION_FORWARD_H_
 
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
 #include "cobalt/script/mozjs/type_traits.h"
diff --git a/src/cobalt/script/mozjs/union_type_conversion_impl.h b/src/cobalt/script/mozjs/union_type_conversion_impl.h
index a8f7e6f..4e6bb23 100644
--- a/src/cobalt/script/mozjs/union_type_conversion_impl.h
+++ b/src/cobalt/script/mozjs/union_type_conversion_impl.h
@@ -23,7 +23,7 @@
 
 #include "cobalt/base/type_id.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
 #include "cobalt/script/mozjs/type_traits.h"
@@ -88,10 +88,10 @@
     JS::RootedObject rooted_object(context);
     bool success = JS_ValueToObject(context, value, rooted_object.address());
     DCHECK(success);
-    MozjsGlobalObjectProxy* global_object_proxy =
-        static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+    MozjsGlobalEnvironment* global_environment =
+        static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
     const WrapperFactory* wrapper_factory =
-        global_object_proxy->wrapper_factory();
+        global_environment->wrapper_factory();
     if (UnionTypeTraitsT1::is_interface_type &&
         wrapper_factory->DoesObjectImplementInterface(
             rooted_object, UnionTypeTraitsT1::GetTypeID())) {
@@ -250,10 +250,10 @@
     JS::RootedObject rooted_object(context);
     bool success = JS_ValueToObject(context, value, rooted_object.address());
     DCHECK(success);
-    MozjsGlobalObjectProxy* global_object_proxy =
-        static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+    MozjsGlobalEnvironment* global_environment =
+        static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
     const WrapperFactory* wrapper_factory =
-        global_object_proxy->wrapper_factory();
+        global_environment->wrapper_factory();
     if (UnionTypeTraitsT1::is_interface_type &&
         wrapper_factory->DoesObjectImplementInterface(
             rooted_object, UnionTypeTraitsT1::GetTypeID())) {
@@ -453,10 +453,10 @@
     JS::RootedObject rooted_object(context);
     bool success = JS_ValueToObject(context, value, rooted_object.address());
     DCHECK(success);
-    MozjsGlobalObjectProxy* global_object_proxy =
-        static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+    MozjsGlobalEnvironment* global_environment =
+        static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
     const WrapperFactory* wrapper_factory =
-        global_object_proxy->wrapper_factory();
+        global_environment->wrapper_factory();
     if (UnionTypeTraitsT1::is_interface_type &&
         wrapper_factory->DoesObjectImplementInterface(
             rooted_object, UnionTypeTraitsT1::GetTypeID())) {
diff --git a/src/cobalt/script/mozjs/union_type_conversion_impl.h.pump b/src/cobalt/script/mozjs/union_type_conversion_impl.h.pump
index d4103ca..4376776 100644
--- a/src/cobalt/script/mozjs/union_type_conversion_impl.h.pump
+++ b/src/cobalt/script/mozjs/union_type_conversion_impl.h.pump
@@ -28,7 +28,7 @@
 
 #include "cobalt/base/type_id.h"
 #include "cobalt/script/mozjs/mozjs_exception_state.h"
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 #include "cobalt/script/mozjs/mozjs_object_handle.h"
 #include "cobalt/script/mozjs/mozjs_user_object_holder.h"
 #include "cobalt/script/mozjs/type_traits.h"
@@ -107,10 +107,10 @@
     JS::RootedObject rooted_object(context);
     bool success = JS_ValueToObject(context, value, rooted_object.address());
     DCHECK(success);
-    MozjsGlobalObjectProxy* global_object_proxy =
-        static_cast<MozjsGlobalObjectProxy*>(JS_GetContextPrivate(context));
+    MozjsGlobalEnvironment* global_environment =
+        static_cast<MozjsGlobalEnvironment*>(JS_GetContextPrivate(context));
     const WrapperFactory* wrapper_factory =
-        global_object_proxy->wrapper_factory();
+        global_environment->wrapper_factory();
 
 $for TYPE [[
     if (UnionTypeTraitsT$(TYPE)::is_interface_type &&
diff --git a/src/cobalt/script/mozjs/weak_heap_object.cc b/src/cobalt/script/mozjs/weak_heap_object.cc
index 6b719bb..1fb5c8d 100644
--- a/src/cobalt/script/mozjs/weak_heap_object.cc
+++ b/src/cobalt/script/mozjs/weak_heap_object.cc
@@ -16,15 +16,15 @@
 
 #include "cobalt/script/mozjs/weak_heap_object.h"
 
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
 
 namespace cobalt {
 namespace script {
 namespace mozjs {
 
 WeakHeapObject::WeakHeapObject(JSContext* context, JS::HandleObject handle) {
-  MozjsGlobalObjectProxy* global_environment =
-      MozjsGlobalObjectProxy::GetFromContext(context);
+  MozjsGlobalEnvironment* global_environment =
+      MozjsGlobalEnvironment::GetFromContext(context);
   Initialize(global_environment->weak_object_manager(), handle);
 }
 
diff --git a/src/cobalt/script/mozjs/wrapper_private.cc b/src/cobalt/script/mozjs/wrapper_private.cc
index 9328993..ad2113a 100644
--- a/src/cobalt/script/mozjs/wrapper_private.cc
+++ b/src/cobalt/script/mozjs/wrapper_private.cc
@@ -16,7 +16,8 @@
 
 #include "cobalt/script/mozjs/wrapper_private.h"
 
-#include "cobalt/script/mozjs/mozjs_global_object_proxy.h"
+#include "cobalt/script/mozjs/mozjs_global_environment.h"
+#include "cobalt/script/mozjs/proxy_handler.h"
 #include "cobalt/script/mozjs/referenced_object_map.h"
 #include "third_party/mozjs/js/src/jsapi.h"
 #include "third_party/mozjs/js/src/jsproxy.h"
@@ -25,13 +26,29 @@
 namespace script {
 namespace mozjs {
 
+Wrappable* WrapperPrivate::GetOpaqueRoot() const {
+  if (!get_opaque_root_function_.is_null()) {
+    return get_opaque_root_function_.Run(wrappable_);
+  }
+  return NULL;
+}
+
+bool WrapperPrivate::ShouldKeepWrapperAliveIfReachable() {
+  ProxyHandler* proxy_handler = base::polymorphic_downcast<ProxyHandler*>(
+      js::GetProxyHandler(wrapper_proxy_));
+  DCHECK(proxy_handler);
+  return proxy_handler->has_custom_property() ||
+         wrappable_->ShouldKeepWrapperAlive();
+}
+
 // static
-void WrapperPrivate::AddPrivateData(JSContext* context,
-                                    JS::HandleObject wrapper_proxy,
-                                    const scoped_refptr<Wrappable>& wrappable) {
+void WrapperPrivate::AddPrivateData(
+    JSContext* context, JS::HandleObject wrapper_proxy,
+    const scoped_refptr<Wrappable>& wrappable,
+    const GetOpaqueRootFunction& get_opaque_root_function) {
   DCHECK(js::IsProxy(wrapper_proxy));
-  WrapperPrivate* private_data =
-      new WrapperPrivate(context, wrappable, wrapper_proxy);
+  WrapperPrivate* private_data = new WrapperPrivate(
+      context, wrappable, wrapper_proxy, get_opaque_root_function);
   JS::RootedObject target_object(context,
                                  js::GetProxyTargetObject(wrapper_proxy));
   JS_SetPrivate(target_object, private_data);
@@ -106,8 +123,8 @@
     JS_CallHeapObjectTracer(trace, &wrapper_private->wrapper_proxy_,
                             "WrapperPrivate::Trace");
 
-    MozjsGlobalObjectProxy* global_environment =
-        MozjsGlobalObjectProxy::GetFromContext(wrapper_private->context_);
+    MozjsGlobalEnvironment* global_environment =
+        MozjsGlobalEnvironment::GetFromContext(wrapper_private->context_);
     intptr_t key = ReferencedObjectMap::GetKeyForWrappable(
         wrapper_private->wrappable_.get());
     global_environment->referenced_objects()->TraceReferencedObjects(trace,
@@ -115,14 +132,30 @@
   }
 }
 
-WrapperPrivate::WrapperPrivate(JSContext* context,
-                               const scoped_refptr<Wrappable>& wrappable,
-                               JS::HandleObject wrapper_proxy)
-    : context_(context), wrappable_(wrappable), wrapper_proxy_(wrapper_proxy) {
+WrapperPrivate::WrapperPrivate(
+    JSContext* context, const scoped_refptr<Wrappable>& wrappable,
+    JS::HandleObject wrapper_proxy,
+    const GetOpaqueRootFunction& get_opaque_root_function)
+    : context_(context),
+      wrappable_(wrappable),
+      wrapper_proxy_(wrapper_proxy),
+      get_opaque_root_function_(get_opaque_root_function) {
   DCHECK(js::IsProxy(wrapper_proxy));
+  if (!get_opaque_root_function_.is_null()) {
+    MozjsGlobalEnvironment* global_environment =
+        MozjsGlobalEnvironment::GetFromContext(context_);
+    global_environment->opaque_root_tracker()->AddObjectWithOpaqueRoot(this);
+  }
 }
 
-WrapperPrivate::~WrapperPrivate() { wrapper_proxy_ = NULL; }
+WrapperPrivate::~WrapperPrivate() {
+  if (!get_opaque_root_function_.is_null()) {
+    MozjsGlobalEnvironment* global_environment =
+        MozjsGlobalEnvironment::GetFromContext(context_);
+    global_environment->opaque_root_tracker()->RemoveObjectWithOpaqueRoot(this);
+  }
+  wrapper_proxy_ = NULL;
+}
 
 }  // namespace mozjs
 }  // namespace script
diff --git a/src/cobalt/script/mozjs/wrapper_private.h b/src/cobalt/script/mozjs/wrapper_private.h
index aecb44d..5bce933 100644
--- a/src/cobalt/script/mozjs/wrapper_private.h
+++ b/src/cobalt/script/mozjs/wrapper_private.h
@@ -34,6 +34,9 @@
 // must be destroyed when its JSObject is garbage collected.
 class WrapperPrivate : public base::SupportsWeakPtr<WrapperPrivate> {
  public:
+  typedef base::Callback<Wrappable*(const scoped_refptr<Wrappable>&)>
+      GetOpaqueRootFunction;
+
   template <typename T>
   scoped_refptr<T> wrappable() const {
     return base::polymorphic_downcast<T*>(wrappable_.get());
@@ -41,14 +44,22 @@
 
   JSObject* js_object_proxy() const { return wrapper_proxy_; }
 
-  // Add/Remove a reference to the object. The object will be visited during
-  // garbage collection.
-  void AddReferencedObject(JS::HandleObject referee);
-  void RemoveReferencedObject(JS::HandleObject referee);
+  Wrappable* GetOpaqueRoot() const;
+
+  // Return true if the GC should avoid collecting this wrapper. Note that if
+  // the wrapper is unreachable, it may still be collected.
+  bool ShouldKeepWrapperAliveIfReachable();
 
   // Create a new WrapperPrivate instance and associate it with the wrapper.
+  static void AddPrivateData(
+      JSContext* context, JS::HandleObject wrapper_proxy,
+      const scoped_refptr<Wrappable>& wrappable,
+      const GetOpaqueRootFunction& get_opaque_root_function);
+
   static void AddPrivateData(JSContext* context, JS::HandleObject wrapper_proxy,
-                             const scoped_refptr<Wrappable>& wrappable);
+                             const scoped_refptr<Wrappable>& wrappable) {
+    AddPrivateData(context, wrapper_proxy, wrappable, GetOpaqueRootFunction());
+  }
 
   // Get the WrapperPrivate associated with the given Wrappable. A new JSObject
   // and WrapperPrivate object may be created.
@@ -76,12 +87,14 @@
 
  private:
   WrapperPrivate(JSContext* context, const scoped_refptr<Wrappable>& wrappable,
-                 JS::HandleObject wrapper_proxy);
+                 JS::HandleObject wrapper_proxy,
+                 const GetOpaqueRootFunction& get_opaque_root_function);
   ~WrapperPrivate();
 
   JSContext* context_;
   scoped_refptr<Wrappable> wrappable_;
   JS::Heap<JSObject*> wrapper_proxy_;
+  GetOpaqueRootFunction get_opaque_root_function_;
 };
 
 }  // namespace mozjs
diff --git a/src/cobalt/script/script_debugger.h b/src/cobalt/script/script_debugger.h
index f2e58b3..8d43d1e 100644
--- a/src/cobalt/script/script_debugger.h
+++ b/src/cobalt/script/script_debugger.h
@@ -25,7 +25,7 @@
 namespace cobalt {
 namespace script {
 
-class GlobalObjectProxy;
+class GlobalEnvironment;
 
 // Engine-independent pure virtual interface to a JavaScript debugger.
 // Used as an opaque interface to the specific debugger implementation,
@@ -78,7 +78,7 @@
   // Factory method to create an engine-specific instance. Implementation to be
   // provided by derived class.
   static scoped_ptr<ScriptDebugger> CreateDebugger(
-      GlobalObjectProxy* global_object_proxy, Delegate* delegate);
+      GlobalEnvironment* global_environment, Delegate* delegate);
 
   // Attach/detach the script debugger.
   virtual void Attach() = 0;
diff --git a/src/cobalt/script/script_runner.cc b/src/cobalt/script/script_runner.cc
index cb9193b..d680966 100644
--- a/src/cobalt/script/script_runner.cc
+++ b/src/cobalt/script/script_runner.cc
@@ -17,7 +17,7 @@
 #include "cobalt/script/script_runner.h"
 
 #include "base/logging.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/source_code.h"
 
 namespace cobalt {
@@ -28,17 +28,17 @@
 class ScriptRunnerImpl : public ScriptRunner {
  public:
   explicit ScriptRunnerImpl(
-      const scoped_refptr<GlobalObjectProxy> global_object_proxy)
-      : global_object_proxy_(global_object_proxy) {}
+      const scoped_refptr<GlobalEnvironment> global_environment)
+      : global_environment_(global_environment) {}
 
   std::string Execute(const std::string& script_utf8,
                       const base::SourceLocation& script_location) OVERRIDE;
-  GlobalObjectProxy* GetGlobalObjectProxy() const OVERRIDE {
-    return global_object_proxy_;
+  GlobalEnvironment* GetGlobalEnvironment() const OVERRIDE {
+    return global_environment_;
   }
 
  private:
-  scoped_refptr<GlobalObjectProxy> global_object_proxy_;
+  scoped_refptr<GlobalEnvironment> global_environment_;
 };
 
 std::string ScriptRunnerImpl::Execute(
@@ -51,7 +51,7 @@
     return "";
   }
   std::string result;
-  if (!global_object_proxy_->EvaluateScript(source_code, &result)) {
+  if (!global_environment_->EvaluateScript(source_code, &result)) {
     DLOG(WARNING) << "Failed to execute JavaScript: " << result;
     return "";
   }
@@ -61,8 +61,8 @@
 }  // namespace
 
 scoped_ptr<ScriptRunner> ScriptRunner::CreateScriptRunner(
-    const scoped_refptr<GlobalObjectProxy>& global_object_proxy) {
-  return scoped_ptr<ScriptRunner>(new ScriptRunnerImpl(global_object_proxy));
+    const scoped_refptr<GlobalEnvironment>& global_environment) {
+  return scoped_ptr<ScriptRunner>(new ScriptRunnerImpl(global_environment));
 }
 
 }  // namespace script
diff --git a/src/cobalt/script/script_runner.h b/src/cobalt/script/script_runner.h
index 978c27f..42052ac 100644
--- a/src/cobalt/script/script_runner.h
+++ b/src/cobalt/script/script_runner.h
@@ -25,18 +25,18 @@
 namespace cobalt {
 namespace script {
 
-class GlobalObjectProxy;
+class GlobalEnvironment;
 
 // Maintains a handle to a JavaScript global object, and provides an interface
 // to execute JavaScript code.
 class ScriptRunner {
  public:
   static scoped_ptr<ScriptRunner> CreateScriptRunner(
-      const scoped_refptr<GlobalObjectProxy>& global_object_proxy);
+      const scoped_refptr<GlobalEnvironment>& global_environment);
 
   virtual std::string Execute(const std::string& script_utf8,
                               const base::SourceLocation& script_location) = 0;
-  virtual GlobalObjectProxy* GetGlobalObjectProxy() const { return NULL; }
+  virtual GlobalEnvironment* GetGlobalEnvironment() const { return NULL; }
   virtual ~ScriptRunner() {}
 };
 
diff --git a/src/cobalt/script/standalone_javascript_runner.cc b/src/cobalt/script/standalone_javascript_runner.cc
index 4f5af91..d67c87b 100644
--- a/src/cobalt/script/standalone_javascript_runner.cc
+++ b/src/cobalt/script/standalone_javascript_runner.cc
@@ -27,7 +27,7 @@
 
 StandaloneJavascriptRunner::StandaloneJavascriptRunner() {
   CommonInitialization();
-  global_object_proxy_->CreateGlobalObject();
+  global_environment_->CreateGlobalObject();
 }
 
 void StandaloneJavascriptRunner::RunInteractive() {
@@ -56,7 +56,7 @@
 
 void StandaloneJavascriptRunner::CommonInitialization() {
   engine_ = JavaScriptEngine::CreateEngine();
-  global_object_proxy_ = engine_->CreateGlobalObjectProxy();
+  global_environment_ = engine_->CreateGlobalEnvironment();
   environment_settings_.reset(new EnvironmentSettings());
 }
 
@@ -69,7 +69,7 @@
 
   // Execute the script and get the results of execution.
   std::string result;
-  bool success = global_object_proxy_->EvaluateScript(source, &result);
+  bool success = global_environment_->EvaluateScript(source, &result);
   // Echo the results to stdout.
   if (!success) {
     std::cout << "Exception: ";
diff --git a/src/cobalt/script/standalone_javascript_runner.h b/src/cobalt/script/standalone_javascript_runner.h
index 2f364a9..ec35833 100644
--- a/src/cobalt/script/standalone_javascript_runner.h
+++ b/src/cobalt/script/standalone_javascript_runner.h
@@ -20,7 +20,7 @@
 
 #include "base/file_path.h"
 #include "cobalt/script/environment_settings.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascript_engine.h"
 #include "cobalt/script/wrappable.h"
 
@@ -37,8 +37,8 @@
   explicit StandaloneJavascriptRunner(
       const scoped_refptr<GlobalInterface>& global_object) {
     CommonInitialization();
-    global_object_proxy_->CreateGlobalObject(global_object,
-                                             environment_settings_.get());
+    global_environment_->CreateGlobalObject(global_object,
+                                            environment_settings_.get());
   }
 
   // Executes input from stdin and echoes the result to stdout. Loops until EOF
@@ -48,8 +48,8 @@
   // Read the file from disk and execute the script. Echos the result to stdout.
   void ExecuteFile(const FilePath& file);
 
-  const scoped_refptr<GlobalObjectProxy>& global_object_proxy() const {
-    return global_object_proxy_;
+  const scoped_refptr<GlobalEnvironment>& global_environment() const {
+    return global_environment_;
   }
 
  private:
@@ -59,7 +59,7 @@
 
   scoped_ptr<JavaScriptEngine> engine_;
   scoped_ptr<EnvironmentSettings> environment_settings_;
-  scoped_refptr<GlobalObjectProxy> global_object_proxy_;
+  scoped_refptr<GlobalEnvironment> global_environment_;
 };
 }  // namespace script
 }  // namespace cobalt
diff --git a/src/cobalt/system_window/starboard/system_window.cc b/src/cobalt/system_window/starboard/system_window.cc
index 7cd1178..331e028 100644
--- a/src/cobalt/system_window/starboard/system_window.cc
+++ b/src/cobalt/system_window/starboard/system_window.cc
@@ -16,7 +16,9 @@
 
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/stringprintf.h"
 #include "cobalt/base/event_dispatcher.h"
+#include "cobalt/deprecated/platform_delegate.h"
 #include "cobalt/system_window/keyboard_event.h"
 #include "cobalt/system_window/starboard/system_window.h"
 #include "starboard/system.h"
@@ -25,6 +27,7 @@
 namespace system_window {
 
 namespace {
+
 SystemWindowStarboard* g_the_window = NULL;
 
 // Unbound callback handler for SbWindowShowDialog.
@@ -32,6 +35,25 @@
   DCHECK(g_the_window);
   g_the_window->HandleDialogClose(response);
 }
+
+void UpdateVideoContainerSizeOverride(SbWindow window) {
+  SbWindowSize window_size;
+  if (!SbWindowGetSize(window, &window_size)) {
+    DLOG(WARNING) << "SbWindowGetSize() failed.";
+    return;
+  }
+  if (window_size.video_pixel_ratio == 1.0f) {
+    return;
+  }
+
+  deprecated::PlatformDelegate::Get()->SetVideoContainerSizeOverride(
+      base::StringPrintf(
+          "%dx%d",
+          static_cast<int>(window_size.width * window_size.video_pixel_ratio),
+          static_cast<int>(window_size.height *
+                           window_size.video_pixel_ratio)));
+}
+
 }  // namespace
 
 SystemWindowStarboard::SystemWindowStarboard(
@@ -42,6 +64,7 @@
   window_ = SbWindowCreate(NULL);
   DCHECK(SbWindowIsValid(window_));
   DCHECK(!g_the_window) << "TODO: Support multiple SystemWindows.";
+  UpdateVideoContainerSizeOverride(window_);
   g_the_window = this;
 }
 
@@ -57,12 +80,15 @@
   window_ = SbWindowCreate(&options);
   DCHECK(SbWindowIsValid(window_));
   DCHECK(!g_the_window) << "TODO: Support multiple SystemWindows.";
+  UpdateVideoContainerSizeOverride(window_);
   g_the_window = this;
 }
 
 SystemWindowStarboard::~SystemWindowStarboard() {
   DCHECK_EQ(this, g_the_window);
+
   if (g_the_window == this) {
+    deprecated::PlatformDelegate::Get()->SetVideoContainerSizeOverride("");
     g_the_window = NULL;
   }
   SbWindowDestroy(window_);
@@ -70,7 +96,10 @@
 
 math::Size SystemWindowStarboard::GetWindowSize() const {
   SbWindowSize window_size;
-  SbWindowGetSize(window_, &window_size);
+  if (!SbWindowGetSize(window_, &window_size)) {
+    DLOG(WARNING) << "SbWindowGetSize() failed.";
+    return math::Size(0, 0);
+  }
   return math::Size(window_size.width, window_size.height);
 }
 
diff --git a/src/cobalt/webdriver/window_driver.cc b/src/cobalt/webdriver/window_driver.cc
index b896311..3e77e54 100644
--- a/src/cobalt/webdriver/window_driver.cc
+++ b/src/cobalt/webdriver/window_driver.cc
@@ -26,7 +26,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "cobalt/dom/document.h"
 #include "cobalt/dom/location.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/source_code.h"
 #include "cobalt/webdriver/keyboard.h"
 #include "cobalt/webdriver/search.h"
@@ -74,7 +74,7 @@
 
 scoped_refptr<ScriptExecutor> CreateScriptExecutor(
     ElementMapping* element_mapping,
-    const scoped_refptr<script::GlobalObjectProxy>& global_object_proxy) {
+    const scoped_refptr<script::GlobalEnvironment>& global_environment) {
   // This could be NULL if there was an error loading the harness source from
   // disk.
   scoped_refptr<script::SourceCode> source =
@@ -86,11 +86,11 @@
   // Create a new ScriptExecutor and bind it to the global object.
   scoped_refptr<ScriptExecutor> script_executor =
       new ScriptExecutor(element_mapping);
-  global_object_proxy->Bind("webdriverExecutor", script_executor);
+  global_environment->Bind("webdriverExecutor", script_executor);
 
   // Evaluate the harness initialization script.
   std::string result;
-  if (!global_object_proxy->EvaluateScript(source, &result)) {
+  if (!global_environment->EvaluateScript(source, &result)) {
     return NULL;
   }
 
@@ -101,7 +101,7 @@
 
 void CreateFunction(
     const std::string& function_body,
-    const scoped_refptr<script::GlobalObjectProxy>& global_object_proxy,
+    const scoped_refptr<script::GlobalEnvironment>& global_environment,
     scoped_refptr<ScriptExecutor> script_executor,
     base::optional<script::OpaqueHandleHolder::Reference>* out_opaque_handle) {
   std::string function =
@@ -110,7 +110,7 @@
       script::SourceCode::CreateSourceCode(
           function.c_str(), base::SourceLocation("[webdriver]", 1, 1));
 
-  if (!global_object_proxy->EvaluateScript(
+  if (!global_environment->EvaluateScript(
           function_source, make_scoped_refptr(script_executor.get()),
           out_opaque_handle)) {
     DLOG(ERROR) << "Failed to create Function object";
@@ -157,11 +157,11 @@
 WindowDriver::WindowDriver(
     const protocol::WindowId& window_id,
     const base::WeakPtr<dom::Window>& window,
-    const GetGlobalObjectProxyFunction& get_global_object_proxy_function,
+    const GetGlobalEnvironmentFunction& get_global_environment_function,
     const scoped_refptr<base::MessageLoopProxy>& message_loop)
     : window_id_(window_id),
       window_(window),
-      get_global_object_proxy_(get_global_object_proxy_function),
+      get_global_environment_(get_global_environment_function),
       window_message_loop_(message_loop),
       element_driver_map_deleter_(&element_drivers_),
       next_element_id_(0) {
@@ -380,9 +380,9 @@
     return CommandResult(protocol::Response::kNoSuchWindow);
   }
 
-  scoped_refptr<script::GlobalObjectProxy> global_object_proxy =
-      get_global_object_proxy_.Run();
-  DCHECK(global_object_proxy);
+  scoped_refptr<script::GlobalEnvironment> global_environment =
+      get_global_environment_.Run();
+  DCHECK(global_environment);
 
   // Lazily initialize this the first time we need to run a script. It must be
   // initialized on window_message_loop_. It can persist across multiple calls
@@ -390,7 +390,7 @@
   // global object, thus with the WindowDriver.
   if (!script_executor_) {
     scoped_refptr<ScriptExecutor> script_executor =
-        CreateScriptExecutor(this, global_object_proxy);
+        CreateScriptExecutor(this, global_environment);
     if (!script_executor) {
       DLOG(INFO) << "Failed to create ScriptExecutor.";
       return CommandResult(protocol::Response::kUnknownError);
@@ -402,7 +402,7 @@
   DLOG(INFO) << "Arguments: " << script.argument_array();
 
   base::optional<script::OpaqueHandleHolder::Reference> function_object;
-  CreateFunction(script.function_body(), global_object_proxy,
+  CreateFunction(script.function_body(), global_environment,
                  make_scoped_refptr(script_executor_.get()), &function_object);
   if (!function_object) {
     return CommandResult(protocol::Response::kJavaScriptError);
diff --git a/src/cobalt/webdriver/window_driver.h b/src/cobalt/webdriver/window_driver.h
index 08ac58e..ae03a9f 100644
--- a/src/cobalt/webdriver/window_driver.h
+++ b/src/cobalt/webdriver/window_driver.h
@@ -54,11 +54,11 @@
 // will map to a method on this class.
 class WindowDriver : private ElementMapping {
  public:
-  typedef base::Callback<scoped_refptr<script::GlobalObjectProxy>()>
-      GetGlobalObjectProxyFunction;
+  typedef base::Callback<scoped_refptr<script::GlobalEnvironment>()>
+      GetGlobalEnvironmentFunction;
   WindowDriver(const protocol::WindowId& window_id,
                const base::WeakPtr<dom::Window>& window,
-               const GetGlobalObjectProxyFunction& get_global_object_proxy,
+               const GetGlobalEnvironmentFunction& get_global_environment,
                const scoped_refptr<base::MessageLoopProxy>& message_loop);
   ~WindowDriver();
   const protocol::WindowId& window_id() { return window_id_; }
@@ -137,7 +137,7 @@
   base::WeakPtr<dom::Window> window_;
 
   // This must only be accessed from |window_message_loop_|.
-  GetGlobalObjectProxyFunction get_global_object_proxy_;
+  GetGlobalEnvironmentFunction get_global_environment_;
 
   // Helper object for commands that execute script. This must only be accessed
   // from the |window_message_loop_|.
diff --git a/src/cobalt/xhr/xml_http_request.cc b/src/cobalt/xhr/xml_http_request.cc
index 04b02e1..d1877a9 100644
--- a/src/cobalt/xhr/xml_http_request.cc
+++ b/src/cobalt/xhr/xml_http_request.cc
@@ -32,7 +32,7 @@
 #include "cobalt/dom/xml_document.h"
 #include "cobalt/dom_parser/xml_decoder.h"
 #include "cobalt/loader/fetcher_factory.h"
-#include "cobalt/script/global_object_proxy.h"
+#include "cobalt/script/global_environment.h"
 #include "cobalt/script/javascript_engine.h"
 #include "net/http/http_util.h"
 
@@ -697,11 +697,11 @@
     XMLHttpRequest::RequestErrorType request_error_type) {
   // https://www.w3.org/TR/XMLHttpRequest/#timeout-error
   DCHECK(thread_checker_.CalledOnValidThread());
-  DLOG_IF(INFO, verbose()) << __FUNCTION__ << " ("
-                           << RequestErrorTypeName(request_error_type) << ") "
-                           << *this << std::endl
-                           << script::StackTraceToString(
-                                  settings_->global_object()->GetStackTrace());
+  DLOG_IF(INFO, verbose())
+      << __FUNCTION__ << " (" << RequestErrorTypeName(request_error_type)
+      << ") " << *this << std::endl
+      << script::StackTraceToString(
+             settings_->global_environment()->GetStackTrace());
   // Step 1
   TerminateRequest();
   // Steps 2-4
@@ -798,7 +798,7 @@
 }
 
 void XMLHttpRequest::PreventGarbageCollection() {
-  settings_->global_object()->PreventGarbageCollection(
+  settings_->global_environment()->PreventGarbageCollection(
       make_scoped_refptr(this));
   DCHECK(!did_add_ref_);
   did_add_ref_ = true;
@@ -823,7 +823,8 @@
   did_add_ref_ = false;
   settings_->javascript_engine()->ReportExtraMemoryCost(
       response_body_.capacity());
-  settings_->global_object()->AllowGarbageCollection(make_scoped_refptr(this));
+  settings_->global_environment()->AllowGarbageCollection(
+      make_scoped_refptr(this));
 }
 
 void XMLHttpRequest::StartRequest(const std::string& request_body) {
@@ -909,7 +910,8 @@
   // parsing the response entity body following the rules set forth in the XML
   // specifications. If that fails (unsupported character encoding, namespace
   // well-formedness error, etc.), return null.
-  scoped_refptr<dom::XMLDocument> xml_document = new dom::XMLDocument();
+  scoped_refptr<dom::XMLDocument> xml_document =
+      new dom::XMLDocument(settings_->window()->html_element_context());
   dom_parser::XMLDecoder xml_decoder(
       xml_document, xml_document, NULL, settings_->max_dom_element_depth(),
       base::SourceLocation("[object XMLHttpRequest]", 1, 1), base::Closure(),
diff --git a/src/media/base/sbplayer_pipeline.cc b/src/media/base/sbplayer_pipeline.cc
index 2424340..4130b45 100644
--- a/src/media/base/sbplayer_pipeline.cc
+++ b/src/media/base/sbplayer_pipeline.cc
@@ -58,15 +58,6 @@
          Time::kMicrosecondsPerSecond;
 }
 
-void UpdateDecoderConfig(scoped_refptr<DemuxerStream> stream) {
-  if (stream->type() == DemuxerStream::AUDIO) {
-    stream->audio_decoder_config();
-  } else {
-    DCHECK_EQ(stream->type(), DemuxerStream::VIDEO);
-    stream->video_decoder_config();
-  }
-}
-
 bool IsEncrypted(const scoped_refptr<DemuxerStream>& stream) {
   if (stream->type() == DemuxerStream::AUDIO) {
     return stream->audio_decoder_config().is_encrypted();
@@ -228,6 +219,8 @@
                                  void* context,
                                  const void* sample_buffer);
 
+  void UpdateDecoderConfig(const scoped_refptr<DemuxerStream>& stream);
+
   // Message loop used to execute pipeline tasks.
   scoped_refptr<base::MessageLoopProxy> message_loop_;
 
@@ -616,6 +609,7 @@
   if (has_video_) {
     const VideoDecoderConfig& video_config =
         demuxer_->GetStream(DemuxerStream::VIDEO)->video_decoder_config();
+    natural_size_ = video_config.natural_size();
     is_encrypted |= video_config.is_encrypted();
   }
   if (is_encrypted) {
@@ -872,6 +866,19 @@
                             sample_buffer));
 }
 
+void SbPlayerPipeline::UpdateDecoderConfig(
+    const scoped_refptr<DemuxerStream>& stream) {
+  DCHECK(message_loop_->BelongsToCurrentThread());
+  if (stream->type() == DemuxerStream::AUDIO) {
+    stream->audio_decoder_config();
+  } else {
+    DCHECK_EQ(stream->type(), DemuxerStream::VIDEO);
+    const VideoDecoderConfig& decoder_config = stream->video_decoder_config();
+    base::AutoLock auto_lock(lock_);
+    natural_size_ = decoder_config.natural_size();
+  }
+}
+
 }  // namespace
 
 #endif  // SB_HAS(PLAYER)
diff --git a/src/starboard/nplb/window_get_size_test.cc b/src/starboard/nplb/window_get_size_test.cc
index a42ebc2..8a52d78 100644
--- a/src/starboard/nplb/window_get_size_test.cc
+++ b/src/starboard/nplb/window_get_size_test.cc
@@ -24,19 +24,28 @@
   ASSERT_TRUE(SbWindowIsValid(window));
 
   SbWindowSize size;
-  size.width = 0;
-  size.height = 0;
+  size.width = -1;
+  size.height = -2;
+  size.video_pixel_ratio = -1.0f;
 
   ASSERT_TRUE(SbWindowGetSize(window, &size));
   EXPECT_LT(0, size.width);
   EXPECT_LT(0, size.height);
+  EXPECT_LE(0.0f, size.video_pixel_ratio);
+  EXPECT_GT(10.0f, size.video_pixel_ratio);
 
   ASSERT_TRUE(SbWindowDestroy(window));
 }
 
 TEST(SbWindowGetSizeTest, RainyDayInvalid) {
   SbWindowSize size;
+  size.width = -1;
+  size.height = -2;
+  size.video_pixel_ratio = -1.0f;
   ASSERT_FALSE(SbWindowGetSize(kSbWindowInvalid, &size));
+  EXPECT_EQ(-1, size.width);
+  EXPECT_EQ(-2, size.height);
+  EXPECT_EQ(-1.0f, size.video_pixel_ratio);
 }
 
 }  // namespace
diff --git a/src/starboard/raspi/shared/window_get_size.cc b/src/starboard/raspi/shared/window_get_size.cc
index e64865f..905d83f 100644
--- a/src/starboard/raspi/shared/window_get_size.cc
+++ b/src/starboard/raspi/shared/window_get_size.cc
@@ -14,16 +14,17 @@
 
 #include "starboard/window.h"
 
-#include "starboard/raspi/shared/window_internal.h"
 #include "starboard/log.h"
+#include "starboard/raspi/shared/window_internal.h"
 
 bool SbWindowGetSize(SbWindow window, SbWindowSize* size) {
   if (!SbWindowIsValid(window)) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid context.";
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid window.";
     return false;
   }
 
   size->width = window->window.width;
   size->height = window->window.height;
+  size->video_pixel_ratio = 1.0f;
   return true;
 }
diff --git a/src/starboard/shared/alsa/alsa_audio_sink_type.cc b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
index 8f2ce61..1556242 100644
--- a/src/starboard/shared/alsa/alsa_audio_sink_type.cc
+++ b/src/starboard/shared/alsa/alsa_audio_sink_type.cc
@@ -165,13 +165,14 @@
   SB_DCHECK(frame_buffer_);
   SB_DCHECK(SbAudioSinkIsAudioSampleTypeSupported(sample_type_));
 
+  SbMemorySet(silence_frames_, 0,
+              channels * kFramesPerRequest * GetSampleSize(sample_type));
+
   ScopedLock lock(mutex_);
   audio_out_thread_ =
       SbThreadCreate(0, kSbThreadPriorityRealTime, kSbThreadNoAffinity, true,
                      "alsa_audio_out", &AlsaAudioSink::ThreadEntryPoint, this);
   SB_DCHECK(SbThreadIsValid(audio_out_thread_));
-  SbMemorySet(silence_frames_, 0,
-              channels * kFramesPerRequest * GetSampleSize(sample_type));
   creation_signal_.Wait();
 }
 
diff --git a/src/starboard/shared/directfb/window_get_size.cc b/src/starboard/shared/directfb/window_get_size.cc
index 2fd923a..b68f288 100644
--- a/src/starboard/shared/directfb/window_get_size.cc
+++ b/src/starboard/shared/directfb/window_get_size.cc
@@ -19,11 +19,12 @@
 
 bool SbWindowGetSize(SbWindow window, SbWindowSize* size) {
   if (!SbWindowIsValid(window)) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid context.";
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid window.";
     return false;
   }
 
   size->width = window->width;
   size->height = window->height;
+  size->video_pixel_ratio = 1.0f;
   return true;
 }
diff --git a/src/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc b/src/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc
index 381d2a1..09b2402 100644
--- a/src/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc
+++ b/src/starboard/shared/starboard/audio_sink/stub_audio_sink_type.cc
@@ -69,7 +69,7 @@
       destroying_(false) {
   audio_out_thread_ =
       SbThreadCreate(0, kSbThreadPriorityRealTime, kSbThreadNoAffinity, true,
-                     "alsa_audio_out", &StubAudioSink::ThreadEntryPoint, this);
+                     "stub_audio_out", &StubAudioSink::ThreadEntryPoint, this);
   SB_DCHECK(SbThreadIsValid(audio_out_thread_));
 }
 
diff --git a/src/starboard/shared/starboard/player/audio_renderer_internal.cc b/src/starboard/shared/starboard/player/audio_renderer_internal.cc
index 4648f66..c761c09 100644
--- a/src/starboard/shared/starboard/player/audio_renderer_internal.cc
+++ b/src/starboard/shared/starboard/player/audio_renderer_internal.cc
@@ -68,17 +68,19 @@
     return;
   }
 
-  ScopedLock lock(mutex_);
-  if (seeking_) {
-    if (input_pts < seeking_to_pts_) {
-      return;
+  {
+    ScopedLock lock(mutex_);
+    if (seeking_) {
+      if (input_pts < seeking_to_pts_) {
+        return;
+      }
     }
-  }
 
-  AppendFrames(&decoded_audio[0], decoded_audio.size() / channels_);
+    AppendFrames(&decoded_audio[0], decoded_audio.size() / channels_);
 
-  if (seeking_ && frame_buffer_.size() > kPrerollFrames * channels_) {
-    seeking_ = false;
+    if (seeking_ && frame_buffer_.size() > kPrerollFrames * channels_) {
+      seeking_ = false;
+    }
   }
 
   // Create the audio sink if it is the first incoming AU after seeking.
diff --git a/src/starboard/shared/x11/window_get_size.cc b/src/starboard/shared/x11/window_get_size.cc
index a5af1ec..c63fdc1 100644
--- a/src/starboard/shared/x11/window_get_size.cc
+++ b/src/starboard/shared/x11/window_get_size.cc
@@ -14,16 +14,17 @@
 
 #include "starboard/window.h"
 
-#include "starboard/shared/x11/window_internal.h"
 #include "starboard/log.h"
+#include "starboard/shared/x11/window_internal.h"
 
 bool SbWindowGetSize(SbWindow window, SbWindowSize* size) {
   if (!SbWindowIsValid(window)) {
-    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid context.";
+    SB_DLOG(ERROR) << __FUNCTION__ << ": Invalid window.";
     return false;
   }
 
   size->width = window->width;
   size->height = window->height;
+  size->video_pixel_ratio = 1.0f;
   return true;
 }
diff --git a/src/starboard/window.h b/src/starboard/window.h
index c21af9e..c3e25dd 100644
--- a/src/starboard/window.h
+++ b/src/starboard/window.h
@@ -30,15 +30,39 @@
 // A handle to a window.
 typedef SbWindowPrivate* SbWindow;
 
-// A dimensional measurement of an SbWindow.
+// The size of a window in graphics rendering coordinates. The width and height
+// of a window should correspond to the size of the graphics surface used for
+// drawing that would be created to back that window.
 typedef struct SbWindowSize {
+  // The width of the window in graphics pixels.
   int width;
+
+  // The height of the window in graphics pixels.
   int height;
+
+  // The ratio of video pixels to graphics pixels. This ratio must be applied
+  // equally to width and height, meaning the aspect ratio is maintained.
+  //
+  // A value of 1.0f means the video resolution is the same as the graphics
+  // resolution. This is the most common case.
+  //
+  // Values greater than 1.0f mean that the video resolution is higher (denser,
+  // larger) than the graphics resolution. This is a common case as devices
+  // often have less video decoding capabilities than graphics rendering
+  // capabilities (or memory, etc...).
+  //
+  // Values less than 1.0f mean that the maximum video resolution is smaller
+  // than the graphics resolution.
+  //
+  // A value of 0.0f means the ratio could not be determined, it should be
+  // assumed to be the same as the graphics resolution (i.e. 1.0f).
+  float video_pixel_ratio;
 } SbWindowSize;
 
 // Options that can be requested at window creation time.
 typedef struct SbWindowOptions {
-  // The requested size or resolution of the new window.
+  // The requested size of the new window. The value of |video_pixel_ratio| will
+  // not be used or looked at.
   SbWindowSize size;
 
   // Whether the new window should be windowed or not. If not, the requested
@@ -83,7 +107,8 @@
 // Destroys |window|, reclaiming associated resources.
 SB_EXPORT bool SbWindowDestroy(SbWindow window);
 
-// Sets |size| to the dimensions of the window.  Returns true on success.
+// Sets |size| to the dimensions of |window|. Returns true on success. If false
+// is returned, |size| will not be modified.
 SB_EXPORT bool SbWindowGetSize(SbWindow window, SbWindowSize* size);
 
 // Gets the platform-specific handle for |window|, which can be passed as an