Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
Bug 1144848 - adding activity handling for addon details.
Browse files Browse the repository at this point in the history
Change-Id: I75a6c98f690610b68cc7db08b459f7e2d93b83f3
  • Loading branch information
yzen committed Apr 1, 2015
1 parent b2c9a27 commit c482211
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 33 deletions.
4 changes: 2 additions & 2 deletions apps/settings/elements/addon_details.html
Expand Up @@ -2,10 +2,10 @@
<template>

<gaia-header action="back" data-href="#addons">
<h1 id="addon-details-header" data-l10n-id="addon-details-header"></h1>
<h1 id="addon-details-header" hidden data-l10n-id="addon-details-header"></h1>
</gaia-header>

<div id="addon-details-body">
<div id="addon-details-body" hidden>
<ul>
<li id="#addon-detail-toggle">
<label class="pack-switch">
Expand Down
30 changes: 27 additions & 3 deletions apps/settings/js/activity_handler.js
Expand Up @@ -28,6 +28,14 @@
*/
_targetPanelId: null,

/**
* Possible target panel options retrieved from the activity request.
* @access private
* @memberOf ActivityHandler
* @type {JSON}
*/
_targetPanelOptions: null,

/**
* The activity object received from the message handler.
*
Expand Down Expand Up @@ -77,13 +85,16 @@
targetPanel.dataset.dialog = true;
}

return targetPanelId;
return {
targetPanelId: targetPanelId,
options: activitySource.data.options
};
}
},

/**
* It calls to corresponding handlers based on the activity name. It should
* also set the target panel id.
* also set the target panel id and, optionally, target panel options.
*
* @access private
* @memberOf ActivityHandler
Expand All @@ -93,7 +104,9 @@
_handleActivity: function ah_handler(activitySource) {
var handle = this._handlers[activitySource.name];
if (handle) {
this._targetPanelId = handle(activitySource);
var {targetPanelId, options} = handle(activitySource);
this._targetPanelId = targetPanelId;
this._targetPanelOptions = options;
}
},

Expand Down Expand Up @@ -130,6 +143,17 @@
return this._targetPanelId;
},

/**
* Returns possible target panel options needed to handle the activity.
*
* @access public
* @memberOf ActivityHandler
* @returns {JSON}
*/
get targetPanelOptions() {
return this._targetPanelOptions;
},

/**
* It waits for the system message of an activity and initializes all
* properties by parsing the information in an activity.
Expand Down
42 changes: 31 additions & 11 deletions apps/settings/js/modules/addon_manager.js
Expand Up @@ -17,17 +17,29 @@ define(function(require) {

// This is the AddonManager API
var AddonManager = {
getAddons: getAddons, // returns promise<app[]>
isAddon: isAddon, // returns true or false for app
isEnabled: isEnabled, // returns true or false for addon
enableAddon: enableAddon, // pass an addon object to enable
disableAddon: disableAddon, // pass an addon to disable
canDelete: canDelete, // returns true or false for addon
deleteAddon: deleteAddon, // pass an app, returns promise
shareAddon: shareAddon, // returns a promise
getAddonTargets: getAddonTargets, // pass an app, returns a promise<app[]>
addEventListener: addListener, // For event type "addonschanged"
removeEventListener: removeListener
// returns promise<app[]>
getAddons: getAddons,
// returns true or false for app
isAddon: isAddon,
// returns true or false for addon
isEnabled: isEnabled,
// pass an addon object to enable
enableAddon: enableAddon,
// pass an addon to disable
disableAddon: disableAddon,
// returns true or false for addon
canDelete: canDelete,
// pass an app, returns promise
deleteAddon: deleteAddon,
// returns a promise
shareAddon: shareAddon,
// pass an app, returns a promise<app[]>
getAddonTargets: getAddonTargets,
// for event type "addonschanged"
addEventListener: addListener,
removeEventListener: removeListener,
// returns an addon with matching manifest URL
findAddonByManifestURL: findAddonByManifestURL
};

function getManifest(app) {
Expand All @@ -45,6 +57,14 @@ define(function(require) {
});
}

function findAddonByManifestURL(manifestURL) {
return AppsCache.apps().then(function(apps) {
return apps.find(function(app) {
return isAddon(app) && app.manifestURL === manifestURL;
});
});
}

function isEnabled(addon) {
return isAddon(addon) && addon.enabled;
}
Expand Down
22 changes: 17 additions & 5 deletions apps/settings/js/panels/addon_details/addon_details.js
Expand Up @@ -10,7 +10,17 @@ define(function(require) {
this.panel = panel;
}

AddonDetails.prototype.render = function render(app) {
AddonDetails.prototype.render = function render(options) {
if (options.addon) {
this.renderAddon(options.addon);
} else if (options.manifestURL) {
// Lookup addon based on its manifestURL before rendering.
AddonManager.findAddonByManifestURL(options.manifestURL).then(
this.renderAddon.bind(this));
}
};

AddonDetails.prototype.renderAddon = function renderAddon(app) {
var l10n = navigator.mozL10n;
this.app = app;
var manifest = new ManifestHelper(app.manifest || app.updateManifest);
Expand All @@ -20,13 +30,15 @@ define(function(require) {
function $(selector) { return panel.querySelector(selector); }

// Scroll back to the top
$('#addon-details-body').scrollTop = 0;
var detailsBody = $('#addon-details-body');
detailsBody.scrollTop = 0;
detailsBody.hidden = false;

// Display the name of the add-on in the panel header
var appnameArgs = { appName: manifest.name };
l10n.setAttributes($('#addon-details-header'),
'addon-details-header',
appnameArgs);
var header = $('#addon-details-header');
l10n.setAttributes(header, 'addon-details-header', appnameArgs);
header.hidden = false;

// Put an icon next to the description
var iconElement = $('#addon-detail-icon');
Expand Down
2 changes: 1 addition & 1 deletion apps/settings/js/panels/addon_details/panel.js
Expand Up @@ -13,7 +13,7 @@ define(function(require) {

onBeforeShow: function(panel, options) {
details = AddonDetails(panel);
details.render(options.addon);
details.render(options);
},

onBeforeHide: function() {
Expand Down
10 changes: 9 additions & 1 deletion apps/settings/js/settings.js
Expand Up @@ -69,7 +69,15 @@ var Settings = {
panelID = panelID.substring(1);
}

this.SettingsService.navigate(panelID);
this.SettingsService.navigate(panelID, this._initialOptions);
},

get _initialOptions() {
// After initial navigation, initial panel options are not necessary.
delete this._initialOptions;
// If initial panel has options, use them once at initial navigation.
return window.LaunchContext.activityHandler &&
window.LaunchContext.activityHandler.targetPanelOptions;
},

init: function settings_init(options) {
Expand Down
35 changes: 25 additions & 10 deletions apps/settings/test/unit/activity_handler_test.js
Expand Up @@ -45,7 +45,7 @@ suite('ActivityHandler', function() {
callback(mockActivity);
});
this.sinon.stub(ActivityHandler, '_handleActivity', function() {
return mockSectionId;
return { targetPanelId: mockSectionId };
});
this.sinon.stub(ActivityHandler, '_registerListener');

Expand All @@ -68,7 +68,7 @@ suite('ActivityHandler', function() {

setup(function() {
this.sinon.stub(ActivityHandler._handlers, 'configure', function() {
return mockSectionId;
return { targetPanelId: mockSectionId };
});
});

Expand All @@ -86,6 +86,7 @@ suite('ActivityHandler', function() {
suite('configure', function() {
var handler;
var mockSectionId = 'mockSection';
var mockOptions = { option: 'test' };
var mockSection;

setup(function() {
Expand All @@ -100,7 +101,7 @@ suite('ActivityHandler', function() {
});

test('without section specified', function() {
var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: null
}
Expand All @@ -109,7 +110,7 @@ suite('ActivityHandler', function() {
});

test('with section other than root specified', function() {
var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: mockSectionId
}
Expand All @@ -119,12 +120,26 @@ suite('ActivityHandler', function() {
assert.ok(mockSection.dataset.dialog, 'the dialog mode should be set');
});

test('with section other than root and options specified', function() {
var {targetPanelId, options} = handler({
data: {
section: mockSectionId,
options: mockOptions
}
});
assert.ok(targetPanelId === mockSectionId,
'should return the specified section id');
assert.ok(options === mockOptions,
'should return the specified options');
assert.ok(mockSection.dataset.dialog, 'the dialog mode should be set');
});

test('with root specified but without filter by', function() {
var rootSection = document.createElement('section');
rootSection.id = 'root';
document.body.appendChild(rootSection);

var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: 'root'
}
Expand All @@ -135,7 +150,7 @@ suite('ActivityHandler', function() {
});

test('with root specified and with filter by', function() {
var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: 'root',
filterBy: 'connectivity'
Expand All @@ -151,7 +166,7 @@ suite('ActivityHandler', function() {
rootSection.id = 'root';
document.body.appendChild(rootSection);

var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: 'invalid'
}
Expand All @@ -166,7 +181,7 @@ suite('ActivityHandler', function() {
invalidSection.id = 'valid';
document.body.appendChild(invalidSection);

var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: 'valid'
}
Expand All @@ -184,7 +199,7 @@ suite('ActivityHandler', function() {
section.id = 'call';
document.body.appendChild(section);

var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: 'call'
}
Expand All @@ -198,7 +213,7 @@ suite('ActivityHandler', function() {
section.id = 'call';
document.body.appendChild(section);

var targetPanelId = handler({
var {targetPanelId} = handler({
data: {
section: 'call'
}
Expand Down

0 comments on commit c482211

Please sign in to comment.