mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 968378 - Hide private members in Home.jsm using closures. r=mcomella
This commit is contained in:
parent
38006cdf43
commit
75d3d55226
@ -45,32 +45,21 @@ function BannerMessage(options) {
|
||||
this.onclick = options.onclick;
|
||||
}
|
||||
|
||||
let HomeBanner = Object.freeze({
|
||||
let HomeBanner = (function () {
|
||||
// Holds the messages that will rotate through the banner.
|
||||
_messages: {},
|
||||
let _messages = {};
|
||||
|
||||
// A queue used to keep track of which message to show next.
|
||||
_queue: [],
|
||||
let _queue = [];
|
||||
|
||||
observe: function(subject, topic, data) {
|
||||
switch(topic) {
|
||||
case "HomeBanner:Get":
|
||||
this._handleGet();
|
||||
break;
|
||||
|
||||
case "HomeBanner:Click":
|
||||
this._handleClick(data);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
_handleGet: function() {
|
||||
let _handleGet = function() {
|
||||
// Get the message from the front of the queue, then add it back
|
||||
// to the end of the queue to show it again later.
|
||||
let id = this._queue.shift();
|
||||
this._queue.push(id);
|
||||
let id = _queue.shift();
|
||||
_queue.push(id);
|
||||
|
||||
let message = this._messages[id];
|
||||
let message = _messages[id];
|
||||
sendMessageToJava({
|
||||
type: "HomeBanner:Data",
|
||||
id: message.id,
|
||||
@ -80,12 +69,25 @@ let HomeBanner = Object.freeze({
|
||||
|
||||
if (message.onshown)
|
||||
message.onshown();
|
||||
},
|
||||
};
|
||||
|
||||
_handleClick: function(id) {
|
||||
let message = this._messages[id];
|
||||
let _handleClick = function(id) {
|
||||
let message = _messages[id];
|
||||
if (message.onclick)
|
||||
message.onclick();
|
||||
};
|
||||
|
||||
return Object.freeze({
|
||||
observe: function(subject, topic, data) {
|
||||
switch(topic) {
|
||||
case "HomeBanner:Get":
|
||||
_handleGet();
|
||||
break;
|
||||
|
||||
case "HomeBanner:Click":
|
||||
_handleClick(data);
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
@ -95,20 +97,20 @@ let HomeBanner = Object.freeze({
|
||||
*/
|
||||
add: function(options) {
|
||||
let message = new BannerMessage(options);
|
||||
this._messages[message.id] = message;
|
||||
_messages[message.id] = message;
|
||||
|
||||
// Add the new message to the end of the queue.
|
||||
this._queue.push(message.id);
|
||||
_queue.push(message.id);
|
||||
|
||||
// If this is the first message we're adding, add
|
||||
// observers to listen for requests from the Java UI.
|
||||
if (Object.keys(this._messages).length == 1) {
|
||||
if (Object.keys(_messages).length == 1) {
|
||||
Services.obs.addObserver(this, "HomeBanner:Get", false);
|
||||
Services.obs.addObserver(this, "HomeBanner:Click", false);
|
||||
|
||||
// Send a message to Java, in case there's an active HomeBanner
|
||||
// waiting for a response.
|
||||
this._handleGet();
|
||||
_handleGet();
|
||||
}
|
||||
|
||||
return message.id;
|
||||
@ -120,19 +122,20 @@ let HomeBanner = Object.freeze({
|
||||
* @param id The id of the message to remove.
|
||||
*/
|
||||
remove: function(id) {
|
||||
delete this._messages[id];
|
||||
delete _messages[id];
|
||||
|
||||
// Remove the message from the queue.
|
||||
let index = this._queue.indexOf(id);
|
||||
this._queue.splice(index, 1);
|
||||
let index = _queue.indexOf(id);
|
||||
_queue.splice(index, 1);
|
||||
|
||||
// If there are no more messages, remove the observers.
|
||||
if (Object.keys(this._messages).length == 0) {
|
||||
if (Object.keys(_messages).length == 0) {
|
||||
Services.obs.removeObserver(this, "HomeBanner:Get");
|
||||
Services.obs.removeObserver(this, "HomeBanner:Click");
|
||||
}
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
function Panel(options) {
|
||||
if ("id" in options)
|
||||
@ -148,7 +151,51 @@ function Panel(options) {
|
||||
this.views = options.views;
|
||||
}
|
||||
|
||||
let HomePanels = Object.freeze({
|
||||
let HomePanels = (function () {
|
||||
// Holds the currrent set of registered panels.
|
||||
let _panels = {};
|
||||
|
||||
let _panelToJSON = function(panel) {
|
||||
return {
|
||||
id: panel.id,
|
||||
title: panel.title,
|
||||
layout: panel.layout,
|
||||
views: panel.views
|
||||
};
|
||||
};
|
||||
|
||||
let _handleGet = function(data) {
|
||||
let requestId = data.requestId;
|
||||
let ids = data.ids || null;
|
||||
|
||||
let panels = [];
|
||||
for (let id in _panels) {
|
||||
let panel = _panels[id];
|
||||
|
||||
// Null ids means we want to fetch all available panels
|
||||
if (ids == null || ids.indexOf(panel.id) >= 0) {
|
||||
panels.push(_panelToJSON(panel));
|
||||
}
|
||||
}
|
||||
|
||||
sendMessageToJava({
|
||||
type: "HomePanels:Data",
|
||||
panels: panels,
|
||||
requestId: requestId
|
||||
});
|
||||
};
|
||||
|
||||
// Helper function used to see if a value is in an object.
|
||||
let _valueExists = function(obj, value) {
|
||||
for (let key in obj) {
|
||||
if (obj[key] == value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
return Object.freeze({
|
||||
// Valid layouts for a panel.
|
||||
Layout: Object.freeze({
|
||||
FRAME: "frame"
|
||||
@ -172,39 +219,6 @@ let HomePanels = Object.freeze({
|
||||
INTENT: "intent"
|
||||
}),
|
||||
|
||||
// Holds the currrent set of registered panels.
|
||||
_panels: {},
|
||||
|
||||
_panelToJSON : function(panel) {
|
||||
return {
|
||||
id: panel.id,
|
||||
title: panel.title,
|
||||
layout: panel.layout,
|
||||
views: panel.views
|
||||
};
|
||||
},
|
||||
|
||||
_handleGet: function(data) {
|
||||
let requestId = data.requestId;
|
||||
let ids = data.ids || null;
|
||||
|
||||
let panels = [];
|
||||
for (let id in this._panels) {
|
||||
let panel = this._panels[id];
|
||||
|
||||
// Null ids means we want to fetch all available panels
|
||||
if (ids == null || ids.indexOf(panel.id) >= 0) {
|
||||
panels.push(this._panelToJSON(panel));
|
||||
}
|
||||
}
|
||||
|
||||
sendMessageToJava({
|
||||
type: "HomePanels:Data",
|
||||
panels: panels,
|
||||
requestId: requestId
|
||||
});
|
||||
},
|
||||
|
||||
add: function(options) {
|
||||
let panel = new Panel(options);
|
||||
if (!panel.id || !panel.title) {
|
||||
@ -215,23 +229,23 @@ let HomePanels = Object.freeze({
|
||||
|
||||
// Bail if the panel already exists, except when we're refreshing
|
||||
// an existing panel instance.
|
||||
if (panel.id in this._panels && action != this.Action.REFRESH) {
|
||||
if (panel.id in _panels && action != this.Action.REFRESH) {
|
||||
throw "Home.panels: Panel already exists: id = " + panel.id;
|
||||
}
|
||||
|
||||
if (!this._valueExists(this.Layout, panel.layout)) {
|
||||
if (!_valueExists(this.Layout, panel.layout)) {
|
||||
throw "Home.panels: Invalid layout for panel: panel.id = " + panel.id + ", panel.layout =" + panel.layout;
|
||||
}
|
||||
|
||||
for (let view of panel.views) {
|
||||
if (!this._valueExists(this.View, view.type)) {
|
||||
if (!_valueExists(this.View, view.type)) {
|
||||
throw "Home.panels: Invalid view type: panel.id = " + panel.id + ", view.type = " + view.type;
|
||||
}
|
||||
|
||||
if (!view.itemHandler) {
|
||||
// Use BROWSER item handler by default
|
||||
view.itemHandler = this.ItemHandler.BROWSER;
|
||||
} else if (!this._valueExists(this.ItemHandler, view.itemHandler)) {
|
||||
} else if (!_valueExists(this.ItemHandler, view.itemHandler)) {
|
||||
throw "Home.panels: Invalid item handler: panel.id = " + panel.id + ", view.itemHandler = " + view.itemHandler;
|
||||
}
|
||||
|
||||
@ -240,7 +254,7 @@ let HomePanels = Object.freeze({
|
||||
}
|
||||
}
|
||||
|
||||
this._panels[panel.id] = panel;
|
||||
_panels[panel.id] = panel;
|
||||
|
||||
if (action) {
|
||||
let messageType;
|
||||
@ -260,35 +274,26 @@ let HomePanels = Object.freeze({
|
||||
|
||||
sendMessageToJava({
|
||||
type: messageType,
|
||||
panel: this._panelToJSON(panel)
|
||||
panel: _panelToJSON(panel)
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
remove: function(id) {
|
||||
if (!(id in this._panels)) {
|
||||
if (!(id in _panels)) {
|
||||
throw "Home.panels: Panel doesn't exist: id = " + id;
|
||||
}
|
||||
|
||||
let panel = this._panels[id];
|
||||
delete this._panels[id];
|
||||
let panel = _panels[id];
|
||||
delete _panels[id];
|
||||
|
||||
sendMessageToJava({
|
||||
type: "HomePanels:Remove",
|
||||
panel: this._panelToJSON(panel)
|
||||
panel: _panelToJSON(panel)
|
||||
});
|
||||
},
|
||||
|
||||
// Helper function used to see if a value is in an object.
|
||||
_valueExists: function(obj, value) {
|
||||
for (let key in obj) {
|
||||
if (obj[key] == value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
// Public API
|
||||
this.Home = Object.freeze({
|
||||
|
Loading…
Reference in New Issue
Block a user