1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5var EventBindings = require('event_bindings');
6
7var CreateEvent = function(name) {
8  var eventOpts = {supportsListeners: true, supportsFilters: true};
9  return new EventBindings.Event(name, undefined, eventOpts);
10};
11
12var EXTENSION_OPTIONS_EVENTS = {
13  'close': {
14    evt: CreateEvent('extensionOptionsInternal.onClose'),
15    fields: []
16  },
17  'load': {
18    evt: CreateEvent('extensionOptionsInternal.onLoad'),
19    fields: []
20  },
21  'sizechanged': {
22    evt: CreateEvent('extensionOptionsInternal.onSizeChanged'),
23    customHandler: function(handler, event, extensionOptionsEvent) {
24      handler.handleSizeChangedEvent(event, extensionOptionsEvent);
25    },
26    fields:['newWidth', 'newHeight', 'oldWidth', 'oldHeight']
27  }
28}
29
30/**
31 * @constructor
32 */
33function ExtensionOptionsEvents(extensionOptionsInternal, viewInstanceId) {
34  this.extensionOptionsInternal = extensionOptionsInternal;
35  this.viewInstanceId = viewInstanceId;
36  this.setup();
37}
38
39// Sets up events.
40ExtensionOptionsEvents.prototype.setup = function() {
41  for (var eventName in EXTENSION_OPTIONS_EVENTS) {
42    this.setupEvent(eventName, EXTENSION_OPTIONS_EVENTS[eventName]);
43  }
44};
45
46ExtensionOptionsEvents.prototype.setupEvent = function(name, info) {
47  var self = this;
48  info.evt.addListener(function(e) {
49    var details = {bubbles:true};
50    if (info.cancelable)
51      details.cancelable = true;
52    var extensionOptionsEvent = new Event(name, details);
53    $Array.forEach(info.fields, function(field) {
54      if (e.hasOwnProperty(field)) {
55        extensionOptionsEvent[field] = e[field];
56      }
57    });
58    if (info.customHandler) {
59      info.customHandler(self, e, extensionOptionsEvent);
60      return;
61    }
62    self.extensionOptionsInternal.dispatchEvent(extensionOptionsEvent);
63  }, {instanceId: self.viewInstanceId});
64
65  this.extensionOptionsInternal.setupEventProperty(name);
66};
67
68ExtensionOptionsEvents.prototype.handleSizeChangedEvent = function(
69    event, extensionOptionsEvent) {
70  this.extensionOptionsInternal.onSizeChanged(extensionOptionsEvent.newWidth,
71                                              extensionOptionsEvent.newHeight,
72                                              extensionOptionsEvent.oldWidth,
73                                              extensionOptionsEvent.oldHeight);
74  this.extensionOptionsInternal.dispatchEvent(extensionOptionsEvent);
75}
76
77exports.ExtensionOptionsEvents = ExtensionOptionsEvents;
78exports.CreateEvent = CreateEvent;
79