
#---------------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#---------------------------------------------------------------------------------

module.exports = class WeinreExtraTargetEventsImpl

    constructor: ->

    #---------------------------------------------------------------------------
    databaseOpened: (databaseRecord) ->
        WeinreExtraTargetEventsImpl.addDatabaseRecords [ databaseRecord ]

    #---------------------------------------------------------------------------
    @addDatabaseRecords: (databaseRecords) ->
        return unless WebInspector.panels
        return unless WebInspector.panels.resources
        return unless WebInspector.panels.resources._databases

        existingDbs = WebInspector.panels.resources._databases
        existingDbNames = {}

        for existingDb in existingDbs
            existingDbNames[existingDb.name] = existingDb

        for databaseRecord in databaseRecords
            continue if existingDbNames[databaseRecord.name]
            database = new WebInspector.Database(databaseRecord.id, databaseRecord.domain, databaseRecord.name, databaseRecord.version)
            WebInspector.panels.resources.addDatabase database

#-------------------------------------------------------------------------------
require("../common/MethodNamer").setNamesForClass(module.exports)
