Diff
Modified: trunk/LayoutTests/ChangeLog (126585 => 126586)
--- trunk/LayoutTests/ChangeLog 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/LayoutTests/ChangeLog 2012-08-24 15:10:17 UTC (rev 126586)
@@ -1,3 +1,13 @@
+2012-08-24 Tommy Widenflycht <[email protected]>
+
+ MediaStream API: Add readyState functionality to RTCPeerConnection
+ https://bugs.webkit.org/show_bug.cgi?id=94813
+
+ Reviewed by Adam Barth.
+
+ * fast/mediastream/RTCPeerConnection-state-expected.txt: Added.
+ * fast/mediastream/RTCPeerConnection-state.html: Added.
+
2012-08-24 Vsevolod Vlasov <[email protected]>
Web Inspector: Get rid of frontendReused logic on front-end.
Added: trunk/LayoutTests/fast/mediastream/RTCPeerConnection-state-expected.txt (0 => 126586)
--- trunk/LayoutTests/fast/mediastream/RTCPeerConnection-state-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/RTCPeerConnection-state-expected.txt 2012-08-24 15:10:17 UTC (rev 126586)
@@ -0,0 +1,13 @@
+Tests the RTCPeerConnection states.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS pc = new webkitRTCPeerConnection({iceServers:[]}, null); did not throw exception.
+PASS pc.readyState is "new"
+PASS stateChanged was called
+PASS pc.readyState is "closed"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/mediastream/RTCPeerConnection-state.html (0 => 126586)
--- trunk/LayoutTests/fast/mediastream/RTCPeerConnection-state.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/RTCPeerConnection-state.html 2012-08-24 15:10:17 UTC (rev 126586)
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description("Tests the RTCPeerConnection states.");
+
+var pc = null;
+
+function stateChanged()
+{
+ testPassed("stateChanged was called");
+ shouldBe('pc.readyState','"closed"');
+ finishJSTest();
+}
+
+shouldNotThrow('pc = new webkitRTCPeerConnection({iceServers:[]}, null);');
+shouldBe('pc.readyState', '"new"');
+pc._onstatechange_ = stateChanged;
+pc.close();
+
+window.jsTestIsAsync = true;
+window.successfullyParsed = true;
+</script>
+<script src=""
+</body>
+</html>
Modified: trunk/Source/Platform/ChangeLog (126585 => 126586)
--- trunk/Source/Platform/ChangeLog 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/Platform/ChangeLog 2012-08-24 15:10:17 UTC (rev 126586)
@@ -1,3 +1,15 @@
+2012-08-24 Tommy Widenflycht <[email protected]>
+
+ MediaStream API: Add readyState functionality to RTCPeerConnection
+ https://bugs.webkit.org/show_bug.cgi?id=94813
+
+ Reviewed by Adam Barth.
+
+ * chromium/public/WebRTCPeerConnectionHandler.h:
+ (WebRTCPeerConnectionHandler):
+ * chromium/public/WebRTCPeerConnectionHandlerClient.h:
+ (WebRTCPeerConnectionHandlerClient):
+
2012-08-23 James Robinson <[email protected]>
[chromium] Convert WebAnimationCurve subtypes into pure virtual
Modified: trunk/Source/Platform/chromium/public/WebRTCPeerConnectionHandler.h (126585 => 126586)
--- trunk/Source/Platform/chromium/public/WebRTCPeerConnectionHandler.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/Platform/chromium/public/WebRTCPeerConnectionHandler.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -39,6 +39,7 @@
virtual ~WebRTCPeerConnectionHandler() { }
virtual bool initialize() = 0;
+ virtual void stop() = 0;
};
} // namespace WebKit
Modified: trunk/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h (126585 => 126586)
--- trunk/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -35,7 +35,17 @@
class WebRTCPeerConnectionHandlerClient {
public:
+ enum ReadyState {
+ ReadyStateNew = 1,
+ ReadyStateOpening = 2,
+ ReadyStateActive = 3,
+ ReadyStateClosing = 4,
+ ReadyStateClosed = 5
+ };
+
virtual ~WebRTCPeerConnectionHandlerClient() { }
+
+ virtual void didChangeReadyState(ReadyState) = 0;
};
} // namespace WebKit
Modified: trunk/Source/WebCore/ChangeLog (126585 => 126586)
--- trunk/Source/WebCore/ChangeLog 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/ChangeLog 2012-08-24 15:10:17 UTC (rev 126586)
@@ -1,3 +1,41 @@
+2012-08-24 Tommy Widenflycht <[email protected]>
+
+ MediaStream API: Add readyState functionality to RTCPeerConnection
+ https://bugs.webkit.org/show_bug.cgi?id=94813
+
+ Reviewed by Adam Barth.
+
+ This patch adds readyState functionality to RTCPeerConnection together with related callbacks and methods.
+
+ Test: fast/mediastream/RTCPeerConnection-state.html
+
+ * Modules/mediastream/RTCPeerConnection.cpp:
+ (WebCore::RTCPeerConnection::RTCPeerConnection):
+ (WebCore::RTCPeerConnection::readyState):
+ (WebCore):
+ (WebCore::RTCPeerConnection::close):
+ (WebCore::RTCPeerConnection::didChangeReadyState):
+ (WebCore::RTCPeerConnection::stop):
+ (WebCore::RTCPeerConnection::changeReadyState):
+ * Modules/mediastream/RTCPeerConnection.h:
+ (RTCPeerConnection):
+ * Modules/mediastream/RTCPeerConnection.idl:
+ * platform/mediastream/RTCPeerConnectionHandler.cpp:
+ (RTCPeerConnectionHandlerDummy):
+ (WebCore::RTCPeerConnectionHandlerDummy::stop):
+ (WebCore):
+ * platform/mediastream/RTCPeerConnectionHandler.h:
+ (RTCPeerConnectionHandler):
+ * platform/mediastream/RTCPeerConnectionHandlerClient.h:
+ (RTCPeerConnectionHandlerClient):
+ * platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp:
+ (WebCore::RTCPeerConnectionHandlerChromium::RTCPeerConnectionHandlerChromium):
+ (WebCore::RTCPeerConnectionHandlerChromium::stop):
+ (WebCore):
+ (WebCore::RTCPeerConnectionHandlerChromium::didChangeReadyState):
+ * platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h:
+ (RTCPeerConnectionHandlerChromium):
+
2012-08-24 Andrey Adaikin <[email protected]>
Web Inspector: [WebGL] A follow up to simplify code with nested closures
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (126585 => 126586)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2012-08-24 15:10:17 UTC (rev 126586)
@@ -35,8 +35,8 @@
#include "RTCPeerConnection.h"
#include "ArrayValue.h"
+#include "Event.h"
#include "ExceptionCode.h"
-#include "KURL.h"
#include "RTCConfiguration.h"
#include "ScriptExecutionContext.h"
@@ -106,6 +106,7 @@
RTCPeerConnection::RTCPeerConnection(ScriptExecutionContext* context, PassRefPtr<RTCConfiguration>, ExceptionCode& ec)
: ActiveDOMObject(context, this)
+ , m_readyState(ReadyStateNew)
{
m_peerHandler = RTCPeerConnectionHandler::create(this);
if (!m_peerHandler || !m_peerHandler->initialize())
@@ -116,6 +117,42 @@
{
}
+String RTCPeerConnection::readyState() const
+{
+ switch (m_readyState) {
+ case ReadyStateNew:
+ return "new";
+ case ReadyStateOpening:
+ return "opening";
+ case ReadyStateActive:
+ return "active";
+ case ReadyStateClosing:
+ return "closing";
+ case ReadyStateClosed:
+ return "closed";
+ }
+
+ ASSERT_NOT_REACHED();
+ return "";
+}
+
+void RTCPeerConnection::close(ExceptionCode& ec)
+{
+ if (m_readyState == ReadyStateClosing || m_readyState == ReadyStateClosed) {
+ ec = INVALID_STATE_ERR;
+ return;
+ }
+
+ changeReadyState(ReadyStateClosed);
+ stop();
+}
+
+void RTCPeerConnection::didChangeReadyState(ReadyState newState)
+{
+ ASSERT(scriptExecutionContext()->isContextThread());
+ changeReadyState(newState);
+}
+
const AtomicString& RTCPeerConnection::interfaceName() const
{
return eventNames().interfaceForRTCPeerConnection;
@@ -128,7 +165,12 @@
void RTCPeerConnection::stop()
{
- // FIXME: Make sure that this object stops posting events and releases resources at this stage.
+ m_readyState = ReadyStateClosed;
+
+ if (m_peerHandler) {
+ m_peerHandler->stop();
+ m_peerHandler.clear();
+ }
}
EventTargetData* RTCPeerConnection::eventTargetData()
@@ -141,6 +183,30 @@
return &m_eventTargetData;
}
+void RTCPeerConnection::changeReadyState(ReadyState readyState)
+{
+ if (readyState == m_readyState || m_readyState == ReadyStateClosed)
+ return;
+
+ m_readyState = readyState;
+
+ switch (m_readyState) {
+ case ReadyStateOpening:
+ break;
+ case ReadyStateActive:
+ dispatchEvent(Event::create(eventNames().openEvent, false, false));
+ break;
+ case ReadyStateClosing:
+ case ReadyStateClosed:
+ break;
+ case ReadyStateNew:
+ ASSERT_NOT_REACHED();
+ break;
+ }
+
+ dispatchEvent(Event::create(eventNames().statechangeEvent, false, false));
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (126585 => 126586)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -49,6 +49,16 @@
static PassRefPtr<RTCPeerConnection> create(ScriptExecutionContext*, const Dictionary& rtcConfiguration, const Dictionary& mediaConstraints, ExceptionCode&);
~RTCPeerConnection();
+ String readyState() const;
+
+ void close(ExceptionCode&);
+
+ DEFINE_ATTRIBUTE_EVENT_LISTENER(open);
+ DEFINE_ATTRIBUTE_EVENT_LISTENER(statechange);
+
+ // RTCPeerConnectionHandlerClient
+ virtual void didChangeReadyState(ReadyState) OVERRIDE;
+
// EventTarget
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE;
@@ -71,6 +81,10 @@
virtual void derefEventTarget() { deref(); }
EventTargetData m_eventTargetData;
+ void changeReadyState(ReadyState);
+
+ ReadyState m_readyState;
+
OwnPtr<RTCPeerConnectionHandler> m_peerHandler;
};
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl (126585 => 126586)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl 2012-08-24 15:10:17 UTC (rev 126586)
@@ -38,6 +38,14 @@
CallWith=ScriptExecutionContext,
EventTarget
] RTCPeerConnection {
+ readonly attribute DOMString readyState;
+
+ void close()
+ raises(DOMException);
+
+ attribute EventListener onopen;
+ attribute EventListener onstatechange;
+
// EventTarget interface
void addEventListener(in DOMString type,
in EventListener listener,
Modified: trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.cpp (126585 => 126586)
--- trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.cpp 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.cpp 2012-08-24 15:10:17 UTC (rev 126586)
@@ -47,6 +47,7 @@
virtual ~RTCPeerConnectionHandlerDummy();
virtual bool initialize() OVERRIDE;
+ virtual void stop() OVERRIDE;
private:
RTCPeerConnectionHandlerClient* m_client;
@@ -72,6 +73,10 @@
return false;
}
+void RTCPeerConnectionHandlerDummy::stop()
+{
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.h (126585 => 126586)
--- trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -46,6 +46,7 @@
virtual ~RTCPeerConnectionHandler() { }
virtual bool initialize() = 0;
+ virtual void stop() = 0;
protected:
RTCPeerConnectionHandler() { }
Modified: trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h (126585 => 126586)
--- trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -37,8 +37,17 @@
class RTCPeerConnectionHandlerClient {
public:
+ enum ReadyState {
+ ReadyStateNew = 1,
+ ReadyStateOpening = 2,
+ ReadyStateActive = 3,
+ ReadyStateClosing = 4,
+ ReadyStateClosed = 5
+ };
+
virtual ~RTCPeerConnectionHandlerClient() { }
+ virtual void didChangeReadyState(ReadyState) = 0;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp (126585 => 126586)
--- trunk/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp 2012-08-24 15:10:17 UTC (rev 126586)
@@ -45,8 +45,10 @@
return adoptPtr(new RTCPeerConnectionHandlerChromium(client));
}
-RTCPeerConnectionHandlerChromium::RTCPeerConnectionHandlerChromium(RTCPeerConnectionHandlerClient*)
+RTCPeerConnectionHandlerChromium::RTCPeerConnectionHandlerChromium(RTCPeerConnectionHandlerClient* client)
+ : m_client(client)
{
+ ASSERT(m_client);
}
RTCPeerConnectionHandlerChromium::~RTCPeerConnectionHandlerChromium()
@@ -59,6 +61,19 @@
return m_webHandler ? m_webHandler->initialize() : false;
}
+void RTCPeerConnectionHandlerChromium::stop()
+{
+ if (!m_webHandler)
+ return;
+
+ m_webHandler->stop();
+}
+
+void RTCPeerConnectionHandlerChromium::didChangeReadyState(WebKit::WebRTCPeerConnectionHandlerClient::ReadyState state)
+{
+ m_client->didChangeReadyState(static_cast<RTCPeerConnectionHandlerClient::ReadyState>(state));
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h (126585 => 126586)
--- trunk/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -47,9 +47,14 @@
virtual ~RTCPeerConnectionHandlerChromium();
virtual bool initialize() OVERRIDE;
+ virtual void stop() OVERRIDE;
+ // WebKit::WebRTCPeerConnectionHandlerClient implementation.
+ virtual void didChangeReadyState(WebKit::WebRTCPeerConnectionHandlerClient::ReadyState) OVERRIDE;
+
private:
OwnPtr<WebKit::WebRTCPeerConnectionHandler> m_webHandler;
+ RTCPeerConnectionHandlerClient* m_client;
};
} // namespace WebCore
Modified: trunk/Source/WebKit/chromium/ChangeLog (126585 => 126586)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-08-24 15:10:17 UTC (rev 126586)
@@ -1,3 +1,12 @@
+2012-08-24 Tommy Widenflycht <[email protected]>
+
+ MediaStream API: Add readyState functionality to RTCPeerConnection
+ https://bugs.webkit.org/show_bug.cgi?id=94813
+
+ Reviewed by Adam Barth.
+
+ * src/AssertMatchingEnums.cpp:
+
2012-08-24 Dan Carney <[email protected]>
[V8] Refactor away IsolatedWorld
Modified: trunk/Source/WebKit/chromium/src/AssertMatchingEnums.cpp (126585 => 126586)
--- trunk/Source/WebKit/chromium/src/AssertMatchingEnums.cpp 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Source/WebKit/chromium/src/AssertMatchingEnums.cpp 2012-08-24 15:10:17 UTC (rev 126586)
@@ -64,6 +64,7 @@
#include "PageVisibilityState.h"
#include "PeerConnection00.h"
#include "PlatformCursor.h"
+#include "RTCPeerConnectionHandlerClient.h"
#include "ReferrerPolicy.h"
#include "ResourceResponse.h"
#include "Settings.h"
@@ -115,6 +116,8 @@
#include <public/WebClipboard.h>
#include <public/WebFileSystem.h>
#include <public/WebFilterOperation.h>
+#include <public/WebRTCPeerConnectionHandler.h>
+#include <public/WebRTCPeerConnectionHandlerClient.h>
#include <public/WebReferrerPolicy.h>
#include <public/WebScrollbar.h>
#include <public/WebURLResponse.h>
@@ -592,6 +595,12 @@
COMPILE_ASSERT_MATCHING_ENUM(WebPeerConnection00HandlerClient::ICEStateCompleted, PeerConnection00::ICE_COMPLETED);
COMPILE_ASSERT_MATCHING_ENUM(WebPeerConnection00HandlerClient::ICEStateFailed, PeerConnection00::ICE_FAILED);
COMPILE_ASSERT_MATCHING_ENUM(WebPeerConnection00HandlerClient::ICEStateClosed, PeerConnection00::ICE_CLOSED);
+
+COMPILE_ASSERT_MATCHING_ENUM(WebRTCPeerConnectionHandlerClient::ReadyStateNew, RTCPeerConnectionHandlerClient::ReadyStateNew);
+COMPILE_ASSERT_MATCHING_ENUM(WebRTCPeerConnectionHandlerClient::ReadyStateOpening, RTCPeerConnectionHandlerClient::ReadyStateOpening);
+COMPILE_ASSERT_MATCHING_ENUM(WebRTCPeerConnectionHandlerClient::ReadyStateActive, RTCPeerConnectionHandlerClient::ReadyStateActive);
+COMPILE_ASSERT_MATCHING_ENUM(WebRTCPeerConnectionHandlerClient::ReadyStateClosing, RTCPeerConnectionHandlerClient::ReadyStateClosing);
+COMPILE_ASSERT_MATCHING_ENUM(WebRTCPeerConnectionHandlerClient::ReadyStateClosed, RTCPeerConnectionHandlerClient::ReadyStateClosed);
#endif
#if ENABLE(SCRIPTED_SPEECH)
Modified: trunk/Tools/ChangeLog (126585 => 126586)
--- trunk/Tools/ChangeLog 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Tools/ChangeLog 2012-08-24 15:10:17 UTC (rev 126586)
@@ -1,3 +1,16 @@
+2012-08-24 Tommy Widenflycht <[email protected]>
+
+ MediaStream API: Add readyState functionality to RTCPeerConnection
+ https://bugs.webkit.org/show_bug.cgi?id=94813
+
+ Reviewed by Adam Barth.
+
+ * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp:
+ (MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler):
+ (MockWebRTCPeerConnectionHandler::stop):
+ * DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h:
+ (MockWebRTCPeerConnectionHandler):
+
2012-08-24 Michael BrĂ¼ning <[email protected]>
Unreviewed. Adding myself to committers list.
Modified: trunk/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp (126585 => 126586)
--- trunk/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.cpp 2012-08-24 15:10:17 UTC (rev 126586)
@@ -37,7 +37,7 @@
using namespace WebKit;
-MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client)
+MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient*)
{
}
@@ -46,4 +46,8 @@
return true;
}
+void MockWebRTCPeerConnectionHandler::stop()
+{
+}
+
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h (126585 => 126586)
--- trunk/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h 2012-08-24 14:39:02 UTC (rev 126585)
+++ trunk/Tools/DumpRenderTree/chromium/MockWebRTCPeerConnectionHandler.h 2012-08-24 15:10:17 UTC (rev 126586)
@@ -43,6 +43,7 @@
explicit MockWebRTCPeerConnectionHandler(WebKit::WebRTCPeerConnectionHandlerClient*);
virtual bool initialize() OVERRIDE;
+ virtual void stop() OVERRIDE;
private:
MockWebRTCPeerConnectionHandler() { }