Rename AtomicString to AtomString
[WebKit-https.git] / Source / WebCore / dom / ErrorEvent.cpp
index ecef772..ab077d6 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
 #include "config.h"
 #include "ErrorEvent.h"
 
+#include "DOMWrapperWorld.h"
 #include "EventNames.h"
+#include <JavaScriptCore/HeapInlines.h>
+#include <JavaScriptCore/StrongInlines.h>
 
 namespace WebCore {
+using namespace JSC;
 
-ErrorEventInit::ErrorEventInit()
-    : message()
-    , filename()
-    , lineno(0)
-{
-}
-
-ErrorEvent::ErrorEvent()
-{
-}
-
-ErrorEvent::ErrorEvent(const AtomicString& type, const ErrorEventInit& initializer)
-    : Event(type, initializer)
+ErrorEvent::ErrorEvent(const AtomString& type, const Init& initializer, IsTrusted isTrusted)
+    : Event(type, initializer, isTrusted)
     , m_message(initializer.message)
     , m_fileName(initializer.filename)
     , m_lineNumber(initializer.lineno)
+    , m_columnNumber(initializer.colno)
+    , m_error(initializer.error)
 {
 }
 
-ErrorEvent::ErrorEvent(const String& message, const String& fileName, unsigned lineNumber)
-    : Event(eventNames().errorEvent, false, true)
+ErrorEvent::ErrorEvent(const String& message, const String& fileName, unsigned lineNumber, unsigned columnNumber, JSC::Strong<JSC::Unknown> error)
+    : Event(eventNames().errorEvent, CanBubble::No, IsCancelable::Yes)
     , m_message(message)
     , m_fileName(fileName)
     , m_lineNumber(lineNumber)
+    , m_columnNumber(columnNumber)
+    , m_error(error.get())
 {
 }
 
-ErrorEvent::~ErrorEvent()
+ErrorEvent::~ErrorEvent() = default;
+
+EventInterface ErrorEvent::eventInterface() const
 {
+    return ErrorEventInterfaceType;
 }
 
-void ErrorEvent::initErrorEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& message, const String& fileName, unsigned lineNumber)
-{
-    if (dispatched())
-        return;
+JSValue ErrorEvent::error(ExecState& state, JSGlobalObject& globalObject)
+{    
+    JSValue error = m_error;
+    if (!error)
+        return jsNull();
 
-    initEvent(type, canBubble, cancelable);
+    if (!isWorldCompatible(state, error)) {
+        // We need to make sure ErrorEvents do not leak their error property across isolated DOM worlds.
+        // Ideally, we would check that the worlds have different privileges but that's not possible yet.
+        auto serializedError = trySerializeError(state);
+        if (!serializedError)
+            return jsNull();
+        return serializedError->deserialize(state, &globalObject);
+    }
 
-    m_message = message;
-    m_fileName = fileName;
-    m_lineNumber = lineNumber;
+    return error;
 }
 
-bool ErrorEvent::isErrorEvent() const
+RefPtr<SerializedScriptValue> ErrorEvent::trySerializeError(ExecState& exec)
 {
-    return true;
+    if (!m_serializedError && !m_triedToSerialize) {
+        m_serializedError = SerializedScriptValue::create(exec, m_error, SerializationErrorMode::NonThrowing);
+        m_triedToSerialize = true;
+    }
+    return m_serializedError;
 }
 
-const AtomicString& ErrorEvent::interfaceName() const
+bool ErrorEvent::isErrorEvent() const
 {
-    return eventNames().interfaceForErrorEvent;
+    return true;
 }
 
 } // namespace WebCore