Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1571)

Unified Diff: webkit/port/bindings/v8/v8_custom.cpp

Issue 27336: Hook up upstreamed V8 bindings, Chromium side (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/port/bindings/v8/ScriptValue.cpp ('k') | webkit/webkit.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/port/bindings/v8/v8_custom.cpp
===================================================================
--- webkit/port/bindings/v8/v8_custom.cpp (revision 10703)
+++ webkit/port/bindings/v8/v8_custom.cpp (working copy)
@@ -120,371 +120,12 @@
namespace WebCore {
-class V8ScheduledAction : public ScheduledAction {
- public:
- V8ScheduledAction(v8::Handle<v8::Function> func, int argc,
- v8::Handle<v8::Value> argv[]);
- explicit V8ScheduledAction(const WebCore::String& code) : m_argc(0),
- m_argv(0), m_code(code) { }
- virtual ~V8ScheduledAction();
- virtual void execute(ScriptExecutionContext* window);
-
- private:
- v8::Persistent<v8::Function> m_func;
- int m_argc;
- v8::Persistent<v8::Value>* m_argv;
-
- ScriptSourceCode m_code;
-};
-
-V8ScheduledAction::V8ScheduledAction(v8::Handle<v8::Function> func, int argc,
- v8::Handle<v8::Value> argv[])
- : m_code(String(), KURL(), 0) {
- m_func = v8::Persistent<v8::Function>::New(func);
-
-#ifndef NDEBUG
- V8Proxy::RegisterGlobalHandle(SCHEDULED_ACTION, this, m_func);
-#endif
-
- m_argc = argc;
- if (argc > 0) {
- m_argv = new v8::Persistent<v8::Value>[argc];
- for (int i = 0; i < argc; i++) {
- m_argv[i] = v8::Persistent<v8::Value>::New(argv[i]);
-
-#ifndef NDEBUG
- V8Proxy::RegisterGlobalHandle(SCHEDULED_ACTION, this, m_argv[i]);
-#endif
- }
- } else {
- m_argv = NULL;
- }
-}
-
-
-V8ScheduledAction::~V8ScheduledAction() {
- if (!m_func.IsEmpty()) {
-#ifndef NDEBUG
- V8Proxy::UnregisterGlobalHandle(this, m_func);
-#endif
- m_func.Dispose();
-
- for (int i = 0; i < m_argc; i++) {
-#ifndef NDEBUG
- V8Proxy::UnregisterGlobalHandle(this, m_argv[i]);
-#endif
- m_argv[i].Dispose();
- }
- if (m_argc > 0) {
- delete[] m_argv;
- }
- }
-}
-
-
-void V8ScheduledAction::execute(ScriptExecutionContext* script_context) {
- // TODO(ager): Timeouts for running the javascript code are not set.
- V8Proxy* proxy = V8Proxy::retrieve(script_context);
- if (!proxy) return;
-
- v8::HandleScope handle_scope;
- v8::Local<v8::Context> context = proxy->GetContext();
- if (context.IsEmpty()) return; // JS may not be enabled.
-
- v8::Context::Scope scope(context);
-
- proxy->setTimerCallback(true);
-
- if (!m_func.IsEmpty() && m_func->IsFunction()) {
- proxy->CallFunction(v8::Persistent<v8::Function>::Cast(m_func),
- context->Global(), m_argc, m_argv);
- } else {
- proxy->Evaluate(m_code.url(), m_code.startLine() - 1, m_code.source(), 0);
- }
-
- if (script_context->isDocument()) {
- Document* doc = static_cast<Document*>(script_context);
- doc->updateRendering();
- }
-
- proxy->setTimerCallback(false);
-}
-
-
-CALLBACK_FUNC_DECL(DOMParserConstructor) {
- INC_STATS("DOM.DOMParser.Contructor");
- return V8Proxy::ConstructDOMObject<V8ClassIndex::DOMPARSER,
- DOMParser>(args);
-}
-
-CALLBACK_FUNC_DECL(MessageChannelConstructor) {
- INC_STATS("DOM.MessageChannel.Constructor");
- if (!args.IsConstructCall()) {
- V8Proxy::ThrowError(V8Proxy::TYPE_ERROR,
- "DOM object constructor cannot be called as a function.");
- return v8::Undefined();
- }
-
- // Get the document.
- Frame* frame = V8Proxy::retrieveFrame();
- if (!frame)
- return v8::Undefined();
- Document* document = frame->document();
-
- // Note: it's OK to let this RefPtr go out of scope because we also call
- // SetDOMWrapper(), which effectively holds a reference to obj.
- RefPtr<MessageChannel> obj = MessageChannel::create(document);
-
- // Create wrappers for the two associated MessagePorts.
- v8::Handle<v8::Value> port1_wrapper =
- V8Proxy::ToV8Object(V8ClassIndex::MESSAGEPORT, obj->port1());
- v8::Handle<v8::Value> port2_wrapper =
- V8Proxy::ToV8Object(V8ClassIndex::MESSAGEPORT, obj->port2());
-
- v8::Handle<v8::Object> wrapper_object = args.Holder();
-
- // Setup the standard wrapper object internal fields.
- V8Proxy::SetDOMWrapper(
- wrapper_object, V8ClassIndex::MESSAGECHANNEL, obj.get());
-
- obj->ref();
- V8Proxy::SetJSWrapperForDOMObject(
- obj.get(), v8::Persistent<v8::Object>::New(wrapper_object));
-
- // Create references from the MessageChannel wrapper to the two
- // MessagePort wrappers to make sure that the MessagePort wrappers
- // stay alive as long as the MessageChannel wrapper is around.
- wrapper_object->SetInternalField(kMessageChannelPort1Index, port1_wrapper);
- wrapper_object->SetInternalField(kMessageChannelPort2Index, port2_wrapper);
-
- // Return the wrapper object which will be the result of the call to
- // new.
- return wrapper_object;
-}
-
-
-CALLBACK_FUNC_DECL(WebKitCSSMatrixConstructor) {
- INC_STATS("DOM.WebKitCSSMatrix.Constructor");
- String s;
- if (args.Length() >= 1)
- s = ToWebCoreString(args[0]);
-
- // Create the matrix.
- ExceptionCode ec = 0;
- RefPtr<WebKitCSSMatrix> matrix = WebKitCSSMatrix::create(s, ec);
- if (ec != 0) {
- V8Proxy::SetDOMException(ec);
- return v8::Undefined();
- }
-
- // Transform the holder into a wrapper object for the matrix.
- V8Proxy::SetDOMWrapper(args.Holder(),
- V8ClassIndex::ToInt(V8ClassIndex::WEBKITCSSMATRIX),
- matrix.get());
- // Add the wrapper to the DOM object map.
- matrix->ref();
- V8Proxy::SetJSWrapperForDOMObject(
- matrix.get(),
- v8::Persistent<v8::Object>::New(args.Holder()));
- return args.Holder();
-}
-
CALLBACK_FUNC_DECL(WebKitPointConstructor) {
INC_STATS("DOM.WebKitPoint.Constructor");
return V8Proxy::ConstructDOMObject<V8ClassIndex::WEBKITPOINT,
WebKitPoint>(args);
}
-CALLBACK_FUNC_DECL(XMLSerializerConstructor) {
- INC_STATS("DOM.XMLSerializer.Constructor");
- return V8Proxy::ConstructDOMObject<V8ClassIndex::XMLSERIALIZER,
- XMLSerializer>(args);
-}
-
-
-CALLBACK_FUNC_DECL(XPathEvaluatorConstructor) {
- INC_STATS("DOM.XPathEvaluator.Constructor");
- return V8Proxy::ConstructDOMObject<V8ClassIndex::XPATHEVALUATOR,
- XPathEvaluator>(args);
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorConstructor) {
- INC_STATS("DOM.XSLTProcessor.Constructor");
- return V8Proxy::ConstructDOMObject<V8ClassIndex::XSLTPROCESSOR,
- XSLTProcessor>(args);
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorImportStylesheet) {
- INC_STATS("DOM.XSLTProcessor.importStylesheet");
- // Return undefined if argument does not have the correct type.
- if (!V8Node::HasInstance(args[0]))
- return v8::Undefined();
-
- XSLTProcessor* imp = V8Proxy::ToNativeObject<XSLTProcessor>(
- V8ClassIndex::XSLTPROCESSOR, args.Holder());
-
- Node* node = V8Proxy::DOMWrapperToNode<Node>(args[0]);
- imp->importStylesheet(node);
- return v8::Undefined();
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorTransformToFragment) {
- INC_STATS("DOM.XSLTProcessor.transformToFragment");
- // Return undefined if arguments do not have correct types.
- if (!V8Node::HasInstance(args[0]) || !V8Document::HasInstance(args[1]))
- return v8::Undefined();
-
- XSLTProcessor* imp = V8Proxy::ToNativeObject<XSLTProcessor>(
- V8ClassIndex::XSLTPROCESSOR, args.Holder());
-
- Node* source = V8Proxy::DOMWrapperToNode<Node>(args[0]);
- Document* owner =
- V8Proxy::DOMWrapperToNode<Document>(args[1]);
- RefPtr<DocumentFragment> result = imp->transformToFragment(source, owner);
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorTransformToDocument) {
- INC_STATS("DOM.XSLTProcessor.transformToDocument");
- // Return undefined if argument does not have the correct type.
- if (!V8Node::HasInstance(args[0]))
- return v8::Undefined();
-
- XSLTProcessor* imp = V8Proxy::ToNativeObject<XSLTProcessor>(
- V8ClassIndex::XSLTPROCESSOR, args.Holder());
-
- Node* source = V8Proxy::DOMWrapperToNode<Node>(args[0]);
- if (!source)
- return v8::Undefined();
- RefPtr<Document> result = imp->transformToDocument(source);
- // Return undefined if no result was found.
- if (!result)
- return v8::Undefined();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorSetParameter) {
- INC_STATS("DOM.XSLTProcessor.setParameter");
- // Bail out if localName or value is null or undefined.
- if (args[1]->IsNull() || args[1]->IsUndefined() ||
- args[2]->IsNull() || args[2]->IsUndefined()) {
- return v8::Undefined();
- }
-
- XSLTProcessor* imp = V8Proxy::ToNativeObject<XSLTProcessor>(
- V8ClassIndex::XSLTPROCESSOR, args.Holder());
-
- String namespaceURI = ToWebCoreString(args[0]);
- String localName = ToWebCoreString(args[1]);
- String value = ToWebCoreString(args[2]);
- imp->setParameter(namespaceURI, localName, value);
- return v8::Undefined();
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorGetParameter) {
- INC_STATS("DOM.XSLTProcessor.getParameter");
- // Bail out if localName is null or undefined.
- if (args[1]->IsNull() || args[1]->IsUndefined()) {
- return v8::Undefined();
- }
-
- XSLTProcessor* imp = V8Proxy::ToNativeObject<XSLTProcessor>(
- V8ClassIndex::XSLTPROCESSOR, args.Holder());
-
- String namespaceURI = ToWebCoreString(args[0]);
- String localName = ToWebCoreString(args[1]);
- String result = imp->getParameter(namespaceURI, localName);
- // Return undefined if the string is null.
- if (result.isNull()) return v8::Undefined();
- return v8String(result);
-}
-
-
-CALLBACK_FUNC_DECL(XSLTProcessorRemoveParameter) {
- INC_STATS("DOM.XSLTProcessor.removeParameter");
- // Bail out if localName is null or undefined.
- if (args[1]->IsNull() || args[1]->IsUndefined())
- return v8::Undefined();
-
- XSLTProcessor* imp = V8Proxy::ToNativeObject<XSLTProcessor>(
- V8ClassIndex::XSLTPROCESSOR, args.Holder());
-
- String namespaceURI = ToWebCoreString(args[0]);
- String localName = ToWebCoreString(args[1]);
- imp->removeParameter(namespaceURI, localName);
- return v8::Undefined();
-}
-
-
-// ---- Canvas support ----
-static v8::Handle<v8::Value> CanvasStyleToV8Object(CanvasStyle* style) {
- if (style->canvasGradient()) {
- return V8Proxy::ToV8Object(V8ClassIndex::CANVASGRADIENT,
- style->canvasGradient());
- }
- if (style->canvasPattern()) {
- return V8Proxy::ToV8Object(V8ClassIndex::CANVASPATTERN,
- style->canvasPattern());
- }
- return v8String(style->color());
-}
-
-static PassRefPtr<CanvasStyle> V8ObjectToCanvasStyle(v8::Handle<v8::Value> value)
-{
- if (value->IsString())
- return CanvasStyle::create(ToWebCoreString(value));
-
- if (V8CanvasGradient::HasInstance(value)) {
- CanvasGradient* gradient =
- V8Proxy::DOMWrapperToNative<CanvasGradient>(value);
- return CanvasStyle::create(gradient);
- }
-
- if (V8CanvasPattern::HasInstance(value)) {
- CanvasPattern* pattern =
- V8Proxy::DOMWrapperToNative<CanvasPattern>(value);
- return CanvasStyle::create(pattern);
- }
-
- return 0;
-}
-
-
-ACCESSOR_GETTER(CanvasRenderingContext2DStrokeStyle) {
- CanvasRenderingContext2D* impl =
- V8Proxy::DOMWrapperToNative<CanvasRenderingContext2D>(info.Holder());
- CanvasStyle* strokeStyle = impl->strokeStyle();
- return CanvasStyleToV8Object(strokeStyle);
-}
-
-
-ACCESSOR_SETTER(CanvasRenderingContext2DStrokeStyle) {
- CanvasRenderingContext2D* impl =
- V8Proxy::DOMWrapperToNative<CanvasRenderingContext2D>(info.Holder());
- impl->setStrokeStyle(V8ObjectToCanvasStyle(value));
-}
-
-ACCESSOR_GETTER(CanvasRenderingContext2DFillStyle) {
- CanvasRenderingContext2D* impl =
- V8Proxy::DOMWrapperToNative<CanvasRenderingContext2D>(info.Holder());
- CanvasStyle* fillStyle = impl->fillStyle();
- return CanvasStyleToV8Object(fillStyle);
-}
-
-
-ACCESSOR_SETTER(CanvasRenderingContext2DFillStyle) {
- CanvasRenderingContext2D* impl =
- V8Proxy::DOMWrapperToNative<CanvasRenderingContext2D>(info.Holder());
- impl->setFillStyle(V8ObjectToCanvasStyle(value));
-}
-
-
// DOMImplementation is a singleton in WebCore. If we use our normal
// mapping from DOM objects to V8 wrappers, the same wrapper will be
// shared for all frames in the same process. This is a major
@@ -534,215 +175,6 @@
}
-ACCESSOR_GETTER(EventSrcElement) {
- Event* event = V8Proxy::DOMWrapperToNative<Event>(info.Holder());
- EventTarget* target = event->target();
- return V8Proxy::EventTargetToV8Object(target);
-}
-
-
-ACCESSOR_GETTER(EventReturnValue) {
- Event* event = V8Proxy::DOMWrapperToNative<Event>(info.Holder());
- return event->defaultPrevented() ? v8::False() : v8::True();
-}
-
-
-ACCESSOR_SETTER(EventReturnValue) {
- Event* event = V8Proxy::DOMWrapperToNative<Event>(info.Holder());
- bool v = value->BooleanValue();
- event->setDefaultPrevented(!v);
-}
-
-
-ACCESSOR_GETTER(EventDataTransfer) {
- Event* event = V8Proxy::DOMWrapperToNative<Event>(info.Holder());
-
- if (event->isDragEvent()) {
- MouseEvent* impl = static_cast<MouseEvent*>(event);
- Clipboard* clipboard = impl->clipboard();
- return V8Proxy::ToV8Object(V8ClassIndex::CLIPBOARD, clipboard);
- }
-
- return v8::Undefined();
-}
-
-
-ACCESSOR_GETTER(EventClipboardData) {
- Event* event = V8Proxy::DOMWrapperToNative<Event>(info.Holder());
-
- if (event->isClipboardEvent()) {
- ClipboardEvent* impl = static_cast<ClipboardEvent*>(event);
- Clipboard* clipboard = impl->clipboard();
- return V8Proxy::ToV8Object(V8ClassIndex::CLIPBOARD, clipboard);
- }
-
- return v8::Undefined();
-}
-
-
-INDEXED_PROPERTY_GETTER(DOMStringList) {
- INC_STATS("DOM.DOMStringList.IndexedPropertyGetter");
- DOMStringList* imp =
- V8Proxy::DOMWrapperToNative<DOMStringList>(info.Holder());
- return v8String(imp->item(index));
-}
-
-
-CALLBACK_FUNC_DECL(DOMStringListItem) {
- INC_STATS("DOM.DOMStringListItem()");
- if (args.Length() == 0)
- return v8::Null();
- uint32_t index = args[0]->Uint32Value();
-
- DOMStringList* imp =
- V8Proxy::DOMWrapperToNative<DOMStringList>(args.Holder());
- if (index >= imp->length())
- return v8::Null();
-
- return v8String(imp->item(index));
-}
-
-
-NAMED_PROPERTY_DELETER(HTMLDocument) {
- // Only handle document.all. Insert the marker object into the
- // shadow internal field to signal that document.all is no longer
- // shadowed.
- String key = ToWebCoreString(name);
- if (key == "all") {
- ASSERT(info.Holder()->InternalFieldCount() ==
- kHTMLDocumentInternalFieldCount);
- v8::Local<v8::Value> marker =
- info.Holder()->GetInternalField(kHTMLDocumentMarkerIndex);
- info.Holder()->SetInternalField(kHTMLDocumentShadowIndex, marker);
- return v8::True();
- }
- return v8::Handle<v8::Boolean>();
-}
-
-
-NAMED_PROPERTY_SETTER(HTMLDocument)
-{
- INC_STATS("DOM.HTMLDocument.NamedPropertySetter");
- // Only handle document.all. We insert the value into the shadow
- // internal field from which the getter will retrieve it.
- String key = ToWebCoreString(name);
- if (key == "all") {
- ASSERT(info.Holder()->InternalFieldCount() ==
- kHTMLDocumentInternalFieldCount);
- info.Holder()->SetInternalField(kHTMLDocumentShadowIndex, value);
- }
- return v8::Handle<v8::Value>();
-}
-
-
-NAMED_PROPERTY_GETTER(HTMLDocument)
-{
- INC_STATS("DOM.HTMLDocument.NamedPropertyGetter");
- AtomicString key = ToWebCoreString(name);
-
- // Special case for document.all. If the value in the shadow
- // internal field is not the marker object, then document.all has
- // been temporarily shadowed and we return the value.
- if (key == "all") {
- ASSERT(info.Holder()->InternalFieldCount() == kHTMLDocumentInternalFieldCount);
- v8::Local<v8::Value> marker = info.Holder()->GetInternalField(kHTMLDocumentMarkerIndex);
- v8::Local<v8::Value> value = info.Holder()->GetInternalField(kHTMLDocumentShadowIndex);
- if (marker != value)
- return value;
- }
-
- HTMLDocument* imp = V8Proxy::DOMWrapperToNode<HTMLDocument>(info.Holder());
-
- // Fast case for named elements that are not there.
- if (!imp->hasNamedItem(key.impl()) && !imp->hasExtraNamedItem(key.impl()))
- return v8::Handle<v8::Value>();
-
- RefPtr<HTMLCollection> items = imp->documentNamedItems(key);
- if (items->length() == 0)
- return v8::Handle<v8::Value>();
- if (items->length() == 1) {
- Node* node = items->firstItem();
- Frame* frame = 0;
- if (node->hasTagName(HTMLNames::iframeTag) &&
- (frame = static_cast<HTMLIFrameElement*>(node)->contentFrame()))
- return V8Proxy::ToV8Object(V8ClassIndex::DOMWINDOW, frame->domWindow());
- return V8Proxy::NodeToV8Object(node);
- }
- return V8Proxy::ToV8Object(V8ClassIndex::HTMLCOLLECTION, items.get());
-}
-
-
-NAMED_PROPERTY_GETTER(HTMLFrameSetElement)
-{
- INC_STATS("DOM.HTMLFrameSetElement.NamedPropertyGetter");
- HTMLFrameSetElement* imp =
- V8Proxy::DOMWrapperToNode<HTMLFrameSetElement>(info.Holder());
- String key = ToWebCoreString(name);
- Node* frame = imp->children()->namedItem(key);
- if (frame && frame->hasTagName(HTMLNames::frameTag)) {
- Document* doc = static_cast<HTMLFrameElement*>(frame)->contentDocument();
- if (doc) {
- Frame* content_frame = doc->frame();
- if (content_frame)
- return V8Proxy::ToV8Object(V8ClassIndex::DOMWINDOW, content_frame->domWindow());
- }
- return v8::Undefined();
- }
- return v8::Handle<v8::Value>();
-}
-
-
-INDEXED_PROPERTY_GETTER(NamedNodeMap) {
- INC_STATS("DOM.NamedNodeMap.IndexedPropertyGetter");
- NamedNodeMap* imp = V8Proxy::ToNativeObject<NamedNodeMap>(
- V8ClassIndex::NAMEDNODEMAP, info.Holder());
- RefPtr<Node> result = imp->item(index);
- if (!result) return v8::Handle<v8::Value>();
-
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-NAMED_PROPERTY_GETTER(NamedNodeMap) {
- INC_STATS("DOM.NamedNodeMap.NamedPropertyGetter");
- // Search the prototype chain first.
- v8::Handle<v8::Value> value =
- info.Holder()->GetRealNamedPropertyInPrototypeChain(name);
- if (!value.IsEmpty())
- return value;
-
- // Then look for IDL defined properties on the object itself.
- if (info.Holder()->HasRealNamedCallbackProperty(name))
- return v8::Handle<v8::Value>();
-
- // Finally, search the DOM.
- NamedNodeMap* imp = V8Proxy::ToNativeObject<NamedNodeMap>(
- V8ClassIndex::NAMEDNODEMAP, info.Holder());
- String prop_name = ToWebCoreString(name);
- RefPtr<Node> result = imp->getNamedItem(prop_name);
- if (!result) return v8::Handle<v8::Value>();
-
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-
-NAMED_PROPERTY_GETTER(NodeList) {
- INC_STATS("DOM.NodeList.NamedPropertyGetter");
- NodeList* list = V8Proxy::ToNativeObject<NodeList>(
- V8ClassIndex::NODELIST, info.Holder());
- String prop_name = ToWebCoreString(name);
-
- // Length property cannot be overridden.
- if (prop_name == "length")
- return v8::Number::New(list->length());
-
- RefPtr<Node> result = list->itemWithName(prop_name);
- if (result)
- return V8Proxy::NodeToV8Object(result.get());
-
- return v8::Handle<v8::Value>();
-}
-
-
INDEXED_PROPERTY_GETTER(HTMLFormElement) {
INC_STATS("DOM.HTMLFormElement.IndexedPropertyGetter");
HTMLFormElement* form =
@@ -809,177 +241,6 @@
return OptionsCollectionSetter(index, value, select);
}
-// Check for a CSS prefix.
-// Passed prefix is all lowercase.
-// First character of the prefix within the property name may be upper or lowercase.
-// Other characters in the prefix within the property name must be lowercase.
-// The prefix within the property name must be followed by a capital letter.
-static bool hasCSSPropertyNamePrefix(const String& propertyName, const char* prefix)
-{
-#ifndef NDEBUG
- ASSERT(*prefix);
- for (const char* p = prefix; *p; ++p)
- ASSERT(WTF::isASCIILower(*p));
- ASSERT(propertyName.length());
-#endif
-
- if (WTF::toASCIILower(propertyName[0]) != prefix[0])
- return false;
-
- unsigned length = propertyName.length();
- for (unsigned i = 1; i < length; ++i) {
- if (!prefix[i])
- return WTF::isASCIIUpper(propertyName[i]);
- if (propertyName[i] != prefix[i])
- return false;
- }
- return false;
-}
-
-// When getting properties on CSSStyleDeclarations, the name used from
-// Javascript and the actual name of the property are not the same, so
-// we have to do the following translation. The translation turns upper
-// case characters into lower case characters and inserts dashes to
-// separate words.
-//
-// Example: 'backgroundPositionY' -> 'background-position-y'
-//
-// Also, certain prefixes such as 'pos', 'css-' and 'pixel-' are stripped
-// and the pixel_or_pos_prefix out parameter is used to indicate whether or
-// not the property name was prefixed with 'pos-' or 'pixel-'.
-static String cssPropertyName(const String& propertyName, bool* hadPixelOrPosPrefix = 0)
-{
- if (hadPixelOrPosPrefix)
- *hadPixelOrPosPrefix = false;
-
- unsigned length = propertyName.length();
- if (!length)
- return String();
-
- Vector<UChar> name;
- name.reserveCapacity(length);
-
- unsigned i = 0;
-
- if (hasCSSPropertyNamePrefix(propertyName, "css"))
- i += 3;
- else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) {
- i += 5;
- if (hadPixelOrPosPrefix)
- *hadPixelOrPosPrefix = true;
- } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) {
- i += 3;
- if (hadPixelOrPosPrefix)
- *hadPixelOrPosPrefix = true;
- } else if (hasCSSPropertyNamePrefix(propertyName, "webkit")
- || hasCSSPropertyNamePrefix(propertyName, "khtml")
- || hasCSSPropertyNamePrefix(propertyName, "apple"))
- name.append('-');
- else {
- if (WTF::isASCIIUpper(propertyName[0]))
- return String();
- }
-
- name.append(WTF::toASCIILower(propertyName[i++]));
-
- for (; i < length; ++i) {
- UChar c = propertyName[i];
- if (!WTF::isASCIIUpper(c))
- name.append(c);
- else {
- name.append('-');
- name.append(WTF::toASCIILower(c));
- }
- }
-
- return String::adopt(name);
-}
-
-NAMED_PROPERTY_GETTER(CSSStyleDeclaration) {
- INC_STATS("DOM.CSSStyleDeclaration.NamedPropertyGetter");
- // First look for API defined attributes on the style declaration
- // object.
- if (info.Holder()->HasRealNamedCallbackProperty(name))
- return v8::Handle<v8::Value>();
-
- // Search the style declaration.
- CSSStyleDeclaration* imp = V8Proxy::ToNativeObject<CSSStyleDeclaration>(
- V8ClassIndex::CSSSTYLEDECLARATION, info.Holder());
-
- bool pixel_or_pos;
- String p = ToWebCoreString(name);
- String prop = cssPropertyName(p, &pixel_or_pos);
-
- // Do not handle non-property names.
- if (!CSSStyleDeclaration::isPropertyName(prop)) {
- return v8::Handle<v8::Value>();
- }
-
- RefPtr<CSSValue> v = imp->getPropertyCSSValue(prop);
- if (v) {
- if (pixel_or_pos && v->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE) {
- RefPtr<CSSPrimitiveValue> primitive_value =
- static_pointer_cast<CSSPrimitiveValue>(v);
- return v8::Number::New(
- primitive_value->getFloatValue(CSSPrimitiveValue::CSS_PX));
- }
- return v8StringOrNull(v->cssText());
- }
-
- String result = imp->getPropertyValue(prop);
- if (result.isNull())
- result = ""; // convert null to empty string.
-
- // The 'filter' attribute is made undetectable in KJS/WebKit
- // to avoid confusion with IE's filter extension.
- if (prop == "filter") {
- return v8UndetectableString(result);
- }
- return v8String(result);
-}
-
-
-NAMED_PROPERTY_SETTER(CSSStyleDeclaration) {
- INC_STATS("DOM.CSSStyleDeclaration.NamedPropertySetter");
- CSSStyleDeclaration* imp = V8Proxy::ToNativeObject<CSSStyleDeclaration>(
- V8ClassIndex::CSSSTYLEDECLARATION, info.Holder());
- String property_name = ToWebCoreString(name);
- int ec = 0;
-
- bool pixel_or_pos;
- String prop = cssPropertyName(property_name, &pixel_or_pos);
- if (!CSSStyleDeclaration::isPropertyName(prop)) {
- return v8::Handle<v8::Value>(); // do not block the call
- }
-
- String prop_value = valueToStringWithNullCheck(value);
- if (pixel_or_pos) prop_value += "px";
- imp->setProperty(prop, prop_value, ec);
-
- V8Proxy::SetDOMException(ec);
- return value;
-}
-
-
-NAMED_PROPERTY_GETTER(StyleSheetList) {
- INC_STATS("DOM.StyleSheetList.NamedPropertyGetter");
- // Look for local properties first.
- if (info.Holder()->HasRealNamedProperty(name)) {
- return v8::Handle<v8::Value>();
- }
-
- // Search style sheet.
- StyleSheetList* imp = V8Proxy::ToNativeObject<StyleSheetList>(
- V8ClassIndex::STYLESHEETLIST, info.Holder());
- String key = ToWebCoreString(name);
- HTMLStyleElement* item = imp->getNamedItem(key);
- if (item) {
- return V8Proxy::ToV8Object(V8ClassIndex::HTMLSTYLEELEMENT, item);
- }
- return v8::Handle<v8::Value>();
-}
-
-
// CanvasRenderingContext2D ----------------------------------------------------
// Helper macro for converting v8 values into floats (expected by many of the
@@ -1396,133 +657,6 @@
return v8::Undefined();
}
-
-// Clipboard -------------------------------------------------------------------
-
-
-ACCESSOR_GETTER(ClipboardTypes) {
- INC_STATS("DOM.Clipboard.types()");
- Clipboard* imp =
- V8Proxy::ToNativeObject<Clipboard>(V8ClassIndex::CLIPBOARD,
- info.Holder());
-
- HashSet<String> types = imp->types();
- if (types.isEmpty())
- return v8::Null();
-
- v8::Local<v8::Array> result = v8::Array::New(types.size());
- HashSet<String>::const_iterator end = types.end();
- int index = 0;
- for (HashSet<String>::const_iterator it = types.begin();
- it != end;
- ++it, ++index) {
- result->Set(v8::Integer::New(index), v8String(*it));
- }
- return result;
-}
-
-
-CALLBACK_FUNC_DECL(ClipboardClearData) {
- INC_STATS("DOM.Clipboard.clearData()");
- Clipboard* imp = V8Proxy::ToNativeObject<Clipboard>(
- V8ClassIndex::CLIPBOARD, args.Holder());
-
- if (args.Length() == 0) {
- imp->clearAllData();
- return v8::Undefined();
- }
-
- if (args.Length() == 1) {
- String v = ToWebCoreString(args[0]);
- imp->clearData(v);
- return v8::Undefined();
- }
-
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR,
- "clearData: Invalid number of arguments");
- return v8::Undefined();
-}
-
-
-CALLBACK_FUNC_DECL(ClipboardGetData) {
- INC_STATS("DOM.Clipboard.getData()");
- Clipboard* imp = V8Proxy::ToNativeObject<Clipboard>(
- V8ClassIndex::CLIPBOARD, args.Holder());
-
- if (args.Length() != 1) {
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR,
- "getData: Invalid number of arguments");
- return v8::Undefined();
- }
-
- bool success;
- String v = ToWebCoreString(args[0]);
- String result = imp->getData(v, success);
- if (success) return v8String(result);
- return v8::Undefined();
-}
-
-CALLBACK_FUNC_DECL(ClipboardSetData) {
- INC_STATS("DOM.Clipboard.setData()");
- Clipboard* imp = V8Proxy::ToNativeObject<Clipboard>(
- V8ClassIndex::CLIPBOARD, args.Holder());
-
- if (args.Length() != 2) {
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR,
- "setData: Invalid number of arguments");
- return v8::Undefined();
- }
-
- String type = ToWebCoreString(args[0]);
- String data = ToWebCoreString(args[1]);
- bool result = imp->setData(type, data);
- return result ? v8::True() : v8::False();
-}
-
-
-CALLBACK_FUNC_DECL(ClipboardSetDragImage) {
- INC_STATS("DOM.Clipboard.setDragImage()");
- Clipboard* imp = V8Proxy::ToNativeObject<Clipboard>(
- V8ClassIndex::CLIPBOARD, args.Holder());
-
- if (!imp->isForDragging())
- return v8::Undefined();
-
- if (args.Length() != 3) {
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR,
- "setDragImage: Invalid number of arguments");
- return v8::Undefined();
- }
-
- int x = ToInt32(args[1]);
- int y = ToInt32(args[2]);
-
- Node* node = 0;
- if (V8Node::HasInstance(args[0]))
- node = V8Proxy::DOMWrapperToNode<Node>(args[0]);
- if (!node) {
- V8Proxy::ThrowError(V8Proxy::TYPE_ERROR,
- "setDragImageFromElement: Invalid first argument");
- return v8::Undefined();
- }
-
- if (!node->isElementNode()) {
- V8Proxy::ThrowError(V8Proxy::SYNTAX_ERROR,
- "setDragImageFromElement: Invalid first argument");
- return v8::Undefined();
- }
-
- if (static_cast<Element*>(node)->hasLocalName(HTMLNames::imgTag) &&
- !node->inDocument())
- imp->setDragImage(static_cast<HTMLImageElement*>(node)->cachedImage(),
- IntPoint(x, y));
- else
- imp->setDragImageElement(node, IntPoint(x, y));
-
- return v8::Undefined();
-}
-
-
static bool AllowSettingSrcToJavascriptURL(Element* element, String name,
String value) {
// Need to parse value as URL first in order to check its protocol.
@@ -1736,7 +870,7 @@
return v8::Undefined();
id = DOMTimer::install(script_context,
- new V8ScheduledAction(string_function), timeout,
+ new ScheduledAction(string_function), timeout,
single_shot);
} else if (function->IsFunction()) {
int param_count = num_arguments >= 2 ? num_arguments - 2 : 0;
@@ -1749,7 +883,7 @@
}
// params is passed to action, and released in action's destructor
- ScheduledAction* action = new V8ScheduledAction(
+ ScheduledAction* action = new ScheduledAction(
v8::Handle<v8::Function>::Cast(function), param_count, params);
delete[] params;
@@ -1967,213 +1101,6 @@
}
-// Node -------------------------------------------------------------
-
-CALLBACK_FUNC_DECL(NodeAddEventListener) {
- INC_STATS("DOM.Node.addEventListener()");
- Node* node = V8Proxy::DOMWrapperToNode<Node>(args.Holder());
-
- V8Proxy* proxy = V8Proxy::retrieve(node->document()->frame());
- if (!proxy)
- return v8::Undefined();
-
- RefPtr<EventListener> listener =
- proxy->FindOrCreateV8EventListener(args[1], false);
- if (listener) {
- String type = ToWebCoreString(args[0]);
- bool useCapture = args[2]->BooleanValue();
- node->addEventListener(type, listener, useCapture);
- }
- return v8::Undefined();
-}
-
-CALLBACK_FUNC_DECL(NodeRemoveEventListener) {
- INC_STATS("DOM.Node.removeEventListener()");
- Node* node = V8Proxy::DOMWrapperToNode<Node>(args.Holder());
-
- V8Proxy* proxy = V8Proxy::retrieve(node->document()->frame());
- // It is possbile that the owner document of the node is detached
- // from the frame, return immediately in this case.
- // See issue 878909
- if (!proxy)
- return v8::Undefined();
-
- RefPtr<EventListener> listener =
- proxy->FindV8EventListener(args[1], false);
- if (listener) {
- String type = ToWebCoreString(args[0]);
- bool useCapture = args[2]->BooleanValue();
- node->removeEventListener(type, listener.get(), useCapture);
- }
-
- return v8::Undefined();
-}
-
-
-// Navigator ------------------------------------------------------------------
-ACCESSOR_GETTER(NavigatorAppVersion) {
- INC_STATS("DOM.Navigator.appVersion");
- v8::Handle<v8::Object> holder = info.Holder();
- Navigator* imp = V8Proxy::ToNativeObject<Navigator>(V8ClassIndex::NAVIGATOR,
- holder);
- String v = ToString(imp->appVersion());
- return v8StringOrUndefined(v);
-}
-
-
-// TreeWalker ------------------------------------------------------------------
-
-CALLBACK_FUNC_DECL(TreeWalkerParentNode) {
- INC_STATS("DOM.TreeWalker.parentNode()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->parentNode(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(TreeWalkerFirstChild) {
- INC_STATS("DOM.TreeWalker.firstChild()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->firstChild(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(TreeWalkerLastChild) {
- INC_STATS("DOM.TreeWalker.lastChild()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->lastChild(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(TreeWalkerNextNode) {
- INC_STATS("DOM.TreeWalker.nextNode()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->nextNode(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(TreeWalkerPreviousNode) {
- INC_STATS("DOM.TreeWalker.previousNode()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->previousNode(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(TreeWalkerNextSibling) {
- INC_STATS("DOM.TreeWalker.nextSibling()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->nextSibling(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(TreeWalkerPreviousSibling) {
- INC_STATS("DOM.TreeWalker.previousSibling()");
- TreeWalker* treeWalker = V8Proxy::ToNativeObject<TreeWalker>(
- V8ClassIndex::TREEWALKER, args.Holder());
-
- ScriptState state;
- RefPtr<Node> result = treeWalker->previousSibling(&state);
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(NodeIteratorNextNode) {
- INC_STATS("DOM.NodeIterator.nextNode()");
- NodeIterator* nodeIterator = V8Proxy::ToNativeObject<NodeIterator>(
- V8ClassIndex::NODEITERATOR, args.Holder());
-
- ExceptionCode ec = 0;
- ScriptState state;
- RefPtr<Node> result = nodeIterator->nextNode(&state, ec);
- if (ec != 0) {
- V8Proxy::SetDOMException(ec);
- return v8::Null();
- }
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(NodeIteratorPreviousNode) {
- INC_STATS("DOM.NodeIterator.previousNode()");
- NodeIterator* nodeIterator = V8Proxy::ToNativeObject<NodeIterator>(
- V8ClassIndex::NODEITERATOR, args.Holder());
-
- ExceptionCode ec = 0;
- ScriptState state;
- RefPtr<Node> result = nodeIterator->previousNode(&state, ec);
- if (ec != 0) {
- V8Proxy::SetDOMException(ec);
- return v8::Null();
- }
- if (state.hadException()) {
- v8::ThrowException(state.exception());
- return v8::Undefined();
- }
- if (!result) return v8::Null();
- return V8Proxy::NodeToV8Object(result.get());
-}
-
-CALLBACK_FUNC_DECL(NodeFilterAcceptNode) {
- INC_STATS("DOM.NodeFilter.acceptNode()");
- V8Proxy::SetDOMException(NOT_SUPPORTED_ERR);
- return v8::Undefined();
-}
-
CALLBACK_FUNC_DECL(HTMLFormElementSubmit) {
INC_STATS("DOM.HTMLFormElement.submit()");
« no previous file with comments | « webkit/port/bindings/v8/ScriptValue.cpp ('k') | webkit/webkit.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698