15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @implements {WebInspector.EventTarget}
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Object = function() {
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Object.prototype = {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} eventType
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.Event)} listener
37a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Object=} thisObject
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addEventListener: function(eventType, listener, thisObject)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
41591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!listener)
42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            console.assert(false);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._listeners)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._listeners = {};
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._listeners[eventType])
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._listeners[eventType] = [];
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._listeners[eventType].push({ thisObject: thisObject, listener: listener });
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} eventType
53a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.Event)} listener
54a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Object=} thisObject
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeEventListener: function(eventType, listener, thisObject)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        console.assert(listener);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._listeners || !this._listeners[eventType])
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var listeners = this._listeners[eventType];
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < listeners.length; ++i) {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                listeners.splice(i, 1);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else if (!listener && thisObject && listeners[i].thisObject === thisObject)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                listeners.splice(i, 1);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!listeners.length)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete this._listeners[eventType];
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeAllListeners: function()
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._listeners;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} eventType
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hasEventListeners: function(eventType)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._listeners || !this._listeners[eventType])
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} eventType
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {*=} eventData
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchEventToListeners: function(eventType, eventData)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._listeners || !this._listeners[eventType])
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var event = new WebInspector.Event(this, eventType, eventData);
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var listeners = this._listeners[eventType].slice(0);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < listeners.length; ++i) {
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            listeners[i].listener.call(listeners[i].thisObject, event);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (event._stoppedPropagation)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return event.defaultPrevented;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
114a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.EventTarget} target
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} type
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {*=} data
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Event = function(target, type, data)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.target = target;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.type = type;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.data = data;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.defaultPrevented = false;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._stoppedPropagation = false;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.Event.prototype = {
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stopPropagation: function()
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._stoppedPropagation = true;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    preventDefault: function()
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.defaultPrevented = true;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean=} preventDefault
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    consume: function(preventDefault)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.stopPropagation();
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (preventDefault)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.preventDefault();
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @interface
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.EventTarget = function()
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.EventTarget.prototype = {
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} eventType
159a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.Event)} listener
160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Object=} thisObject
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    addEventListener: function(eventType, listener, thisObject) { },
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} eventType
166a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.Event)} listener
167a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Object=} thisObject
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeEventListener: function(eventType, listener, thisObject) { },
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    removeAllListeners: function() { },
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} eventType
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    hasEventListeners: function(eventType) { },
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} eventType
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {*=} eventData
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dispatchEventToListeners: function(eventType, eventData) { },
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.notifications = new WebInspector.Object();
188