e39786d7b1367148aaa8d5f99ef8e80d7b9b415b
[platform/framework/web/crosswalk.git] / src / xwalk / application / extension / application_widget_api.js
1 // Copyright (c) 2014 Intel Corporation. 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
5 var application = requireNative('application');
6 var common = requireNative('widget_common');
7
8 var empty = "";
9 var zero = 0;
10
11 var widgetStringInfo = {
12   "author"      : empty,
13   "description" : empty,
14   "name"        : empty,
15   "shortName"   : empty,
16   "version"     : empty,
17   "id"          : empty,
18   "authorEmail" : empty,
19   "authorHref"  : empty,
20   "width"       : zero,
21   "height"      : zero
22 };
23
24 function defineReadOnlyProperty(object, key, value) {
25   Object.defineProperty(object, key, {
26     configurable: false,
27     enumerable: true,
28     get: function() {
29       if (key == "width") {
30         value = window.innerWidth;
31       } else if (key == "height") {
32         value = window.innerHeight;
33       } else if (value == empty) {
34         value = extension.internal.sendSyncMessage(
35             { cmd: 'GetWidgetInfo', widgetKey: key });
36       }
37
38       return value;
39     }
40   });
41 }
42
43 for (var key in widgetStringInfo) {
44   defineReadOnlyProperty(exports, key, widgetStringInfo[key]);
45 }
46
47 var WidgetStorage = function() {
48   var _keyList = new Array();
49   var _itemStorage = new Object();
50
51   var _SetItem = function(itemKey, itemValue) {
52     var result = extension.internal.sendSyncMessage({
53         cmd: 'SetPreferencesItem',
54         preferencesItemKey: String(itemKey),
55         preferencesItemValue: String(itemValue) });
56
57     if (result) {
58       if (_itemStorage[String(itemKey)] == undefined)
59         _keyList.push(String(itemKey));
60       _itemStorage[String(itemKey)] = String(itemValue);
61       return itemValue;
62     } else {
63       throw new common.CustomDOMException(
64         common.CustomDOMException.NO_MODIFICATION_ALLOWED_ERR,
65         'The object can not be modified.');
66     }
67   }
68
69   var _GetSetter = function(itemKey) {
70     var _itemKey = itemKey;
71     return function(itemValue) {
72       return _SetItem(_itemKey, itemValue);
73     }
74   }
75
76   var _GetGetter = function(itemKey) {
77     var _itemKey = itemKey;
78     return function() {
79       return _itemStorage[String(_itemKey)];
80     }
81   }
82
83   this.init = function() {
84     var result = extension.internal.sendSyncMessage(
85         { cmd: 'GetAllItems' });
86     for (var itemKey in result) {
87       var itemValue = result[String(itemKey)];
88       _itemStorage[String(itemKey)] = itemValue;
89       this.__defineSetter__(String(itemKey), _GetSetter(itemKey));
90       this.__defineGetter__(String(itemKey), _GetGetter(itemKey));
91       _keyList.push(String(itemKey));
92     }
93   }
94
95   this.__defineGetter__('length', function() {
96     return _keyList.length;
97   });
98
99   this.key = function(index) {
100     return _keyList[index];
101   }
102
103   this.getItem = function(itemKey) {
104     return _itemStorage[String(itemKey)];
105   }
106
107   this.setItem = function(itemKey, itemValue) {
108     return _SetItem(itemKey, itemValue);
109   }
110
111   this.removeItem = function(itemKey) {
112     var result = extension.internal.sendSyncMessage({
113         cmd: 'RemovePreferencesItem',
114         preferencesItemKey: String(itemKey) });
115
116     if (result) {
117       delete this[itemKey];
118       delete _itemStorage[itemKey];
119       _keyList.splice(_keyList.indexOf(String(itemKey)), 1);
120     } else {
121       throw new common.CustomDOMException(
122           common.CustomDOMException.NO_MODIFICATION_ALLOWED_ERR,
123           'The object can not be modified.');
124     }
125   }
126
127   this.clear = function() {
128     var itemKey;
129     var result = extension.internal.sendSyncMessage({
130         cmd: 'ClearAllItems' });
131
132     if (!result)
133       return;
134
135     for (var i = _keyList.length-1; i >= 0; --i) {
136       // if the itemKey is still in DB(e.g. readonly),
137       // we should keep it in JS side.
138       var exists = extension.internal.sendSyncMessage({
139           cmd: 'KeyExists',
140           preferencesItemKey: _keyList[i] });
141
142       if (!exists) {
143         delete this[_keyList[i]];
144         delete _itemStorage[_keyList[i]];
145         _keyList.splice(i, 1);
146       }
147     }
148   }
149
150   this.init();
151 };
152
153 var widgetStorage = new WidgetStorage();
154 exports.preferences = widgetStorage;
155
156 exports.toString = function() {
157   return '[object Widget]';
158 }
159
160 Object.defineProperty(exports, 'preferences', {
161   configurable: false,
162   enumerable: false,
163   get: function() {
164     return widgetStorage;
165   }
166 });