Index: webkit/port/bindings/v8/v8_custom.cpp |
=================================================================== |
--- webkit/port/bindings/v8/v8_custom.cpp (revision 16548) |
+++ webkit/port/bindings/v8/v8_custom.cpp (working copy) |
@@ -56,7 +56,6 @@ |
#include "DOMParser.h" |
#include "DOMStringList.h" |
#include "DOMTimer.h" |
-#include "DOMWindow.h" |
#include "Document.h" |
#include "DocumentFragment.h" |
#include "Event.h" |
@@ -142,297 +141,7 @@ |
return wrapper; |
} |
-// TODO(mbelshe): This should move into V8DOMWindowCustom.cpp |
-// Can't move it right now because it depends on V8ScheduledAction, |
-// which is private to this file (v8_custom.cpp). |
-v8::Handle<v8::Value> V8Custom::WindowSetTimeoutImpl(const v8::Arguments& args, |
- bool single_shot) { |
- int num_arguments = args.Length(); |
- |
- if (num_arguments < 1) return v8::Undefined(); |
- |
- DOMWindow* imp = V8Proxy::ToNativeObject<DOMWindow>( |
- V8ClassIndex::DOMWINDOW, args.Holder()); |
- |
- if (!imp->frame()) |
- return v8::Undefined(); |
- |
- if (!V8Proxy::CanAccessFrame(imp->frame(), true)) |
- return v8::Undefined(); |
- |
- ScriptExecutionContext* script_context = |
- static_cast<ScriptExecutionContext*>(imp->frame()->document()); |
- |
- v8::Handle<v8::Value> function = args[0]; |
- |
- int32_t timeout = 0; |
- if (num_arguments >= 2) timeout = args[1]->Int32Value(); |
- |
- int id; |
- if (function->IsString()) { |
- // Don't allow setting timeouts to run empty functions! |
- // (Bug 1009597) |
- WebCore::String string_function = ToWebCoreString(function); |
- if (string_function.length() == 0) |
- return v8::Undefined(); |
- |
- id = DOMTimer::install(script_context, |
- new ScheduledAction(string_function), timeout, |
- single_shot); |
- } else if (function->IsFunction()) { |
- int param_count = num_arguments >= 2 ? num_arguments - 2 : 0; |
- v8::Local<v8::Value>* params = 0; |
- if (param_count > 0) { |
- params = new v8::Local<v8::Value>[param_count]; |
- for (int i = 0; i < param_count; i++) |
- // parameters must be globalized |
- params[i] = args[i+2]; |
- } |
- |
- // params is passed to action, and released in action's destructor |
- ScheduledAction* action = new ScheduledAction( |
- v8::Handle<v8::Function>::Cast(function), param_count, params); |
- |
- delete[] params; |
- |
- id = DOMTimer::install(script_context, action, timeout, single_shot); |
- } else { |
- // TODO(fqian): what's the right return value if failed. |
- return v8::Undefined(); |
- } |
- return v8::Integer::New(id); |
-} |
- |
- |
-// DOMWindow ------------------------------------------------------------------- |
- |
-static bool IsAscii(const String& str) { |
- for (size_t i = 0; i < str.length(); i++) { |
- if (str[i] > 0xFF) |
- return false; |
- } |
- return true; |
-} |
- |
-static v8::Handle<v8::Value> Base64Convert(const String& str, bool encode) { |
- if (!IsAscii(str)) { |
- V8Proxy::SetDOMException(INVALID_CHARACTER_ERR); |
- return v8::Handle<v8::Value>(); |
- } |
- |
- Vector<char> in(str.length()); |
- for (size_t i = 0; i < str.length(); i++) { |
- in[i] = static_cast<char>(str[i]); |
- } |
- Vector<char> out; |
- |
- if (encode) { |
- base64Encode(in, out); |
- } else { |
- if (!base64Decode(in, out)) { |
- V8Proxy::ThrowError(V8Proxy::GENERAL_ERROR, "Cannot decode base64"); |
- return v8::Undefined(); |
- } |
- } |
- |
- return v8String(String(out.data(), out.size())); |
-} |
- |
-CALLBACK_FUNC_DECL(DOMWindowAtob) { |
- INC_STATS("DOM.DOMWindow.atob()"); |
- DOMWindow* imp = V8Proxy::ToNativeObject<DOMWindow>( |
- V8ClassIndex::DOMWINDOW, args.Holder()); |
- |
- if (!V8Proxy::CanAccessFrame(imp->frame(), true)) |
- return v8::Undefined(); |
- |
- if (args.Length() < 1) { |
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR, "Not enough arguments"); |
- return v8::Undefined(); |
- } |
- |
- if (args[0]->IsNull()) return v8String(""); |
- |
- String str = ToWebCoreString(args[0]); |
- return Base64Convert(str, false); |
-} |
- |
-CALLBACK_FUNC_DECL(DOMWindowBtoa) { |
- INC_STATS("DOM.DOMWindow.btoa()"); |
- DOMWindow* imp = V8Proxy::ToNativeObject<DOMWindow>( |
- V8ClassIndex::DOMWINDOW, args.Holder()); |
- |
- if (!V8Proxy::CanAccessFrame(imp->frame(), true)) |
- return v8::Undefined(); |
- |
- if (args.Length() < 1) { |
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR, "Not enough arguments"); |
- return v8::Undefined(); |
- } |
- |
- if (args[0]->IsNull()) return v8String(""); |
- |
- String str = ToWebCoreString(args[0]); |
- return Base64Convert(str, true); |
-} |
- |
-// TODO(fqian): returning string is cheating, and we should |
-// fix this by calling toString function on the receiver. |
-// However, V8 implements toString in JavaScript, which requires |
-// switching context of receiver. I consider it is dangerous. |
-CALLBACK_FUNC_DECL(DOMWindowToString) |
-{ |
- INC_STATS("DOM.DOMWindow.toString()"); |
- return args.This()->ObjectProtoToString(); |
-} |
- |
-CALLBACK_FUNC_DECL(DOMWindowNOP) |
-{ |
- INC_STATS("DOM.DOMWindow.nop()"); |
- return v8::Undefined(); |
-} |
- |
- |
-static String EventNameFromAttributeName(const String& name) { |
- ASSERT(name.startsWith("on")); |
- String event_type = name.substring(2); |
- |
- if (event_type.startsWith("w")) { |
- switch(event_type[event_type.length() - 1]) { |
- case 't': |
- event_type = "webkitAnimationStart"; |
- break; |
- case 'n': |
- event_type = "webkitAnimationIteration"; |
- break; |
- case 'd': |
- ASSERT(event_type.length() > 7); |
- if (event_type[7] == 'a') |
- event_type = "webkitAnimationEnd"; |
- else |
- event_type = "webkitTransitionEnd"; |
- break; |
- } |
- } |
- |
- return event_type; |
-} |
- |
- |
-ACCESSOR_SETTER(DOMWindowEventHandler) { |
- v8::Handle<v8::Object> holder = V8Proxy::LookupDOMWrapper( |
- V8ClassIndex::DOMWINDOW, info.This()); |
- if (holder.IsEmpty()) |
- return; |
- |
- DOMWindow* imp = V8Proxy::ToNativeObject<DOMWindow>( |
- V8ClassIndex::DOMWINDOW, holder); |
- if (!imp->frame()) |
- return; |
- |
- Document* doc = imp->frame()->document(); |
- if (!doc) |
- return; |
- |
- String key = ToWebCoreString(name); |
- String event_type = EventNameFromAttributeName(key); |
- |
- if (value->IsNull()) { |
- // Clear the event listener |
- imp->clearAttributeEventListener(event_type); |
- } else { |
- V8Proxy* proxy = V8Proxy::retrieve(imp->frame()); |
- if (!proxy) |
- return; |
- |
- RefPtr<EventListener> listener = |
- proxy->FindOrCreateV8EventListener(value, true); |
- if (listener) { |
- imp->setAttributeEventListener(event_type, listener); |
- } |
- } |
-} |
- |
- |
-ACCESSOR_GETTER(DOMWindowEventHandler) { |
- v8::Handle<v8::Object> holder = V8Proxy::LookupDOMWrapper( |
- V8ClassIndex::DOMWINDOW, info.This()); |
- if (holder.IsEmpty()) |
- return v8::Undefined(); |
- |
- DOMWindow* imp = V8Proxy::ToNativeObject<DOMWindow>( |
- V8ClassIndex::DOMWINDOW, holder); |
- if (!imp->frame()) |
- return v8::Undefined(); |
- |
- Document* doc = imp->frame()->document(); |
- if (!doc) |
- return v8::Undefined(); |
- |
- String key = ToWebCoreString(name); |
- String event_type = EventNameFromAttributeName(key); |
- |
- EventListener* listener = imp->getAttributeEventListener(event_type); |
- return V8Proxy::EventListenerToV8Object(listener); |
-} |
- |
// --------------- Security Checks ------------------------- |
-NAMED_ACCESS_CHECK(DOMWindow) { |
- ASSERT(V8ClassIndex::FromInt(data->Int32Value()) == V8ClassIndex::DOMWINDOW); |
- v8::Handle<v8::Value> window = |
- V8Proxy::LookupDOMWrapper(V8ClassIndex::DOMWINDOW, host); |
- if (window.IsEmpty()) |
- return false; // the frame is gone. |
- |
- DOMWindow* target_win = |
- V8Proxy::ToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, window); |
- |
- ASSERT(target_win); |
- |
- Frame* target = target_win->frame(); |
- if (!target) |
- return false; |
- |
- if (key->IsString()) { |
- String name = ToWebCoreString(key); |
- |
- // Allow access of GET and HAS if index is a subframe. |
- if ((type == v8::ACCESS_GET || type == v8::ACCESS_HAS) && |
- target->tree()->child(name)) { |
- return true; |
- } |
- } |
- |
- return V8Proxy::CanAccessFrame(target, false); |
-} |
- |
- |
-INDEXED_ACCESS_CHECK(DOMWindow) { |
- ASSERT(V8ClassIndex::FromInt(data->Int32Value()) == V8ClassIndex::DOMWINDOW); |
- v8::Handle<v8::Value> window = |
- V8Proxy::LookupDOMWrapper(V8ClassIndex::DOMWINDOW, host); |
- if (window.IsEmpty()) |
- return false; |
- |
- DOMWindow* target_win = |
- V8Proxy::ToNativeObject<DOMWindow>(V8ClassIndex::DOMWINDOW, window); |
- |
- ASSERT(target_win); |
- |
- Frame* target = target_win->frame(); |
- if (!target) |
- return false; |
- |
- // Allow access of GET and HAS if index is a subframe. |
- if ((type == v8::ACCESS_GET || type == v8::ACCESS_HAS) && |
- target->tree()->child(index)) { |
- return true; |
- } |
- |
- return V8Proxy::CanAccessFrame(target, false); |
-} |
- |
- |
INDEXED_ACCESS_CHECK(History) { |
ASSERT(V8ClassIndex::FromInt(data->Int32Value()) == V8ClassIndex::HISTORY); |
// Only allow same origin access |