cordova-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From an-s...@apache.org
Subject [1/3] cordova-windows git commit: CB-12142: Move windows-specific logic from cordova-common
Date Fri, 18 Nov 2016 18:05:57 GMT
Repository: cordova-windows
Updated Branches:
  refs/heads/master 541c451d4 -> dacf70ec3


CB-12142: Move windows-specific logic from cordova-common

This logic is associated with demuxing 'package.appxmanifest' into relevant platform-specific
appx manifests. Also auto-test was moved and edited according changes


Project: http://git-wip-us.apache.org/repos/asf/cordova-windows/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-windows/commit/8753c42d
Tree: http://git-wip-us.apache.org/repos/asf/cordova-windows/tree/8753c42d
Diff: http://git-wip-us.apache.org/repos/asf/cordova-windows/diff/8753c42d

Branch: refs/heads/master
Commit: 8753c42d14bda1fb0af552f339dcd78720506d5f
Parents: 541c451
Author: Nikita Matrosov <matrosov.nikita94@gmail.com>
Authored: Wed Nov 16 14:40:39 2016 +0300
Committer: Nikita Matrosov <matrosov.nikita94@gmail.com>
Committed: Thu Nov 17 13:11:47 2016 +0300

----------------------------------------------------------------------
 spec/unit/ConfigChanges.spec.js                 |  79 +++++++++++-
 .../fixtures/org.test.configtest/plugin.xml     |  61 ++++++++++
 template/cordova/Api.js                         |  12 +-
 template/cordova/lib/PluginInfo.js              | 120 +++++++++++++++++++
 4 files changed, 269 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/8753c42d/spec/unit/ConfigChanges.spec.js
----------------------------------------------------------------------
diff --git a/spec/unit/ConfigChanges.spec.js b/spec/unit/ConfigChanges.spec.js
index 48755c7..916ba83 100644
--- a/spec/unit/ConfigChanges.spec.js
+++ b/spec/unit/ConfigChanges.spec.js
@@ -19,23 +19,30 @@
 
 var BaseMunger = require('cordova-common').ConfigChanges.PlatformMunger;
 var PlatformMunger = require('../../template/cordova/lib/ConfigChanges').PlatformMunger;
-var PluginInfo = require('cordova-common').PluginInfo;
+var PluginInfoProvider = require('cordova-common').PluginInfoProvider;
+var PluginInfo = require('../../template/cordova/lib/PluginInfo.js').PluginInfo;
 var Api = require('../../template/cordova/Api');
 var AppxManifest = require('../../template/cordova/lib/AppxManifest');
 
 var os = require('os');
 var path = require('path');
 var shell = require('shelljs');
+var rewire = require('rewire');
 
+var configChanges = require('../../template/cordova/lib/ConfigChanges');
+var pluginInfo = rewire('../../template/cordova/lib/PluginInfo.js');
 var tempDir = path.join(os.tmpdir(), 'windows');
 var WINDOWS_MANIFEST = 'package.windows.appxmanifest';
 var WINDOWS10_MANIFEST = 'package.windows10.appxmanifest';
 var FIXTURES = path.join(__dirname, 'fixtures');
 var DUMMY_PLUGIN = 'org.test.plugins.capabilityplugin';
+var CONFIG_PLUGIN = 'org.test.configtest';
 
 var dummyPlugin = path.join(FIXTURES, DUMMY_PLUGIN);
+var configplugin = path.join(FIXTURES, CONFIG_PLUGIN);
 var dummyProjName = 'testProj';
 var windowsProject = path.join(FIXTURES, dummyProjName);
+var windows_testapp_jsproj = path.join(FIXTURES, 'testProj/platforms/windows/CordovaApp.Windows.jsproj');
 
 describe('PlatformMunger', function () {
     var munge, munger;
@@ -199,3 +206,73 @@ describe('Capabilities within package.windows.appxmanifest', function()
{
     });
 });
 
+describe('generate_plugin_config_munge for windows project', function() {
+    beforeEach(function() {
+        shell.mkdir('-p', tempDir);
+        shell.cp('-rf', windows_testapp_jsproj, tempDir);
+    });
+
+    afterEach(function() {
+        shell.rm('-rf', tempDir);
+    });
+
+    it('should special case config-file elements for windows', function() {
+        var pluginInfoProvider = new PluginInfoProvider();
+        var munger = new configChanges.PlatformMunger('windows', tempDir, 'unused', null,
pluginInfoProvider);
+        var munge = munger.generate_plugin_config_munge(new PluginInfo(configplugin), {});
+        var windows81AppxManifest = munge.files['package.windows.appxmanifest'];
+        var winphone81AppxManifest = munge.files['package.phone.appxmanifest'];
+        var windows10AppxManifest = munge.files['package.windows10.appxmanifest'];
+
+        // 1 comes from versions="=8.1.0" + 1 from versions="=8.1.0" device-target="windows"
+        expect(windows81AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability
Note="should-exist-for-all-appxmanifest-target-files" />');
+        expect(windows81AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability
Note="should-exist-for-win81-win-and-phone" />');
+        expect(windows81AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability
Note="should-exist-for-win81-win-only" />');
+        expect(windows81AppxManifest.parents['/Parent/Capabilities'][3].xml).toBe('<Capability
Note="should-exist-for-win10-and-win81-win-and-phone" />');
+        expect(windows81AppxManifest.parents['/Parent/Capabilities'].length).toBe(4);
+
+        // 1 comes from versions="=8.1.0" + 1 from versions="=8.1.0" device-target="phone"
+        expect(winphone81AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability
Note="should-exist-for-all-appxmanifest-target-files" />');
+        expect(winphone81AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability
Note="should-exist-for-win81-win-and-phone" />');
+        expect(winphone81AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability
Note="should-exist-for-win81-phone-only" />');
+        expect(winphone81AppxManifest.parents['/Parent/Capabilities'][3].xml).toBe('<Capability
Note="should-exist-for-win10-and-win81-win-and-phone" />');
+        expect(winphone81AppxManifest.parents['/Parent/Capabilities'].length).toBe(4);
+
+        expect(windows10AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability
Note="should-exist-for-all-appxmanifest-target-files" />');
+        expect(windows10AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability
Note="should-exist-for-win10-and-win81-win-and-phone" />');
+        expect(windows10AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability
Note="should-exist-in-win10-only" />');
+        expect(windows10AppxManifest.parents['/Parent/Capabilities'].length).toBe(3);
+    });
+
+    it('should not process change w/o target package.appxmanifest', function() {
+        var processChanges = pluginInfo.__get__('processChanges');
+        var testChanges = [
+            {
+                target: 'package.windows.appxmanifest'
+            },
+            {
+                target: 'package.appxmanifest'
+            }
+        ];
+
+        var changes = processChanges(testChanges);
+        expect(changes.length).toBe(4);
+        expect(changes[0].target).toBe(testChanges[0].target);
+    });
+
+    it('should apply changes to all manifests in case of incorrect "deviceTarget" attribute',
function() {
+        var processChanges = pluginInfo.__get__('processChanges');
+
+        var testChanges = [{
+            deviceTarget: 'wrong_device_target',
+            target: 'package.appxmanifest'
+        }];
+
+        var changes = processChanges(testChanges);
+        expect(changes.length).toBe(3);
+        expect(changes[0].target).toBe('package.windows.appxmanifest');
+        expect(changes[1].target).toBe('package.phone.appxmanifest');
+        expect(changes[2].target).toBe('package.windows10.appxmanifest');
+    });
+});
+

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/8753c42d/spec/unit/fixtures/org.test.configtest/plugin.xml
----------------------------------------------------------------------
diff --git a/spec/unit/fixtures/org.test.configtest/plugin.xml b/spec/unit/fixtures/org.test.configtest/plugin.xml
new file mode 100644
index 0000000..d140297
--- /dev/null
+++ b/spec/unit/fixtures/org.test.configtest/plugin.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright 2013 Anis Kadri
+
+ Licensed 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.
+
+-->
+
+<plugin xmlns="http://cordova.apache.org/ns/plugins/1.0"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    id="org.test.configtest"
+    version="3.0.0">
+
+    <name>Does Code Fil Write Even Work? Hopefully the Tests Will Tell Us</name>
+
+    <!-- android -->
+    <platform name="android">
+        <config-file target="res/xml/config.xml" parent="/widget">
+            <poop/>
+        </config-file>
+        <config-file target="res/xml/config.xml" parent="/widget">
+            <poop/>
+        </config-file>
+    </platform>
+
+    <platform name="windows">
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities">
+            <Capability Note="should-exist-for-all-appxmanifest-target-files" />
+        </config-file>
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities" versions="=8.1.0">
+            <Capability Note="should-exist-for-win81-win-and-phone" />
+        </config-file>
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities" versions="=8.1.0"
device-target="windows">
+            <Capability Note="should-exist-for-win81-win-only" />
+        </config-file>
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities" versions="=8.1.0"
device-target="phone">
+            <Capability Note="should-exist-for-win81-phone-only" />
+        </config-file>
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities" versions="=8.1.0"
device-target="all">
+            <Capability Note="should-exist-for-win81-win-and-phone" />
+        </config-file>
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities" versions="<=10.0.0"
device-target="all">
+            <Capability Note="should-exist-for-win10-and-win81-win-and-phone" />
+        </config-file>
+        <config-file target="package.appxmanifest" parent="/Parent/Capabilities" versions=">=10.0.0">
+            <Capability Note="should-exist-in-win10-only" />
+        </config-file>
+    </platform>
+</plugin>

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/8753c42d/template/cordova/Api.js
----------------------------------------------------------------------
diff --git a/template/cordova/Api.js b/template/cordova/Api.js
index 7637582..125e3c5 100644
--- a/template/cordova/Api.js
+++ b/template/cordova/Api.js
@@ -24,6 +24,7 @@ var PluginManager = require('cordova-common').PluginManager;
 var CordovaLogger = require('cordova-common').CordovaLogger;
 var PlatformMunger = require('./lib/ConfigChanges.js').PlatformMunger;
 var PlatformJson = require('cordova-common').PlatformJson;
+var PluginInfo = require('./lib/PluginInfo').PluginInfo;
 var PluginInfoProvider = require('cordova-common').PluginInfoProvider;
 
 var PLATFORM = 'windows';
@@ -200,6 +201,9 @@ Api.prototype.addPlugin = function (plugin, installOptions) {
 
     var self = this;
 
+    // We need to use custom PluginInfo to trigger windows-specific processing
+    // of changes in .appxmanifest files. See PluginInfo.js for details
+    var pluginInfo = new PluginInfo(plugin.dir);
     var jsProject = JsprojManager.getProject(this.root);
     installOptions = installOptions || {};
     installOptions.variables = installOptions.variables || {};
@@ -212,7 +216,7 @@ Api.prototype.addPlugin = function (plugin, installOptions) {
     var pluginManager = PluginManager.get(this.platform, this.locations, jsProject);
     pluginManager.munger = new PlatformMunger(this.platform, this.locations.root, platformJson,
new PluginInfoProvider());
     return pluginManager
-        .addPlugin(plugin, installOptions)
+        .addPlugin(pluginInfo, installOptions)
         .then(function () {
             // CB-11657 Add BOM to www files here because files added by plugin
             // probably don't have it. Prepare would add BOM but it might not be called
@@ -238,6 +242,10 @@ Api.prototype.addPlugin = function (plugin, installOptions) {
  */
 Api.prototype.removePlugin = function (plugin, uninstallOptions) {
     var self = this;
+
+    // We need to use custom PluginInfo to trigger windows-specific processing
+    // of changes in .appxmanifest files. See PluginInfo.js for details
+    var pluginInfo = new PluginInfo(plugin.dir);
     var jsProject = JsprojManager.getProject(this.root);
     var platformJson = PlatformJson.load(this.root, this.platform);
     var pluginManager = PluginManager.get(this.platform, this.locations, jsProject);
@@ -245,7 +253,7 @@ Api.prototype.removePlugin = function (plugin, uninstallOptions) {
     //  for appxmanifest's capabilities removal (see also https://issues.apache.org/jira/browse/CB-11066)
     pluginManager.munger = new PlatformMunger(this.platform, this.locations.root, platformJson,
new PluginInfoProvider());
     return pluginManager
-        .removePlugin(plugin, uninstallOptions)
+        .removePlugin(pluginInfo, uninstallOptions)
         .then(function () {
             // CB-11657 Add BOM to cordova_plugins, since it is was
             // regenerated after plugin uninstallation and does not have BOM

http://git-wip-us.apache.org/repos/asf/cordova-windows/blob/8753c42d/template/cordova/lib/PluginInfo.js
----------------------------------------------------------------------
diff --git a/template/cordova/lib/PluginInfo.js b/template/cordova/lib/PluginInfo.js
new file mode 100644
index 0000000..a45ee07
--- /dev/null
+++ b/template/cordova/lib/PluginInfo.js
@@ -0,0 +1,120 @@
+var semver = require('semver');
+var CommonPluginInfo = require('cordova-common').PluginInfo;
+
+var MANIFESTS = {
+    'windows': {
+        '8.1.0': 'package.windows.appxmanifest',
+        '10.0.0': 'package.windows10.appxmanifest'
+    },
+    'phone': {
+        '8.1.0': 'package.phone.appxmanifest',
+        '10.0.0': 'package.windows10.appxmanifest'
+    },
+    'all': {
+        '8.1.0': ['package.windows.appxmanifest', 'package.phone.appxmanifest'],
+        '10.0.0': 'package.windows10.appxmanifest'
+    }
+};
+
+var SUBSTS = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows10.appxmanifest'];
+var TARGETS = ['windows', 'phone', 'all'];
+
+function processChanges(changes) {
+    var hasManifestChanges  = changes.some(function(change) {
+        return change.target === 'package.appxmanifest';
+    });
+
+    if (!hasManifestChanges) {
+        return changes;
+    }
+
+    // Demux 'package.appxmanifest' into relevant platform-specific appx manifests.
+    // Only spend the cycles if there are version-specific plugin settings
+    var oldChanges = changes;
+    changes = [];
+
+    oldChanges.forEach(function(change) {
+        // Only support semver/device-target demux for package.appxmanifest
+        // Pass through in case something downstream wants to use it
+        if (change.target !== 'package.appxmanifest') {
+            changes.push(change);
+            return;
+        }
+
+        var manifestsForChange = getManifestsForChange(change);
+        changes = changes.concat(demuxChangeWithSubsts(change, manifestsForChange));
+    });
+
+    return changes;
+}
+
+function demuxChangeWithSubsts(change, manifestFiles) {
+    return manifestFiles.map(function(file) {
+         return createReplacement(file, change);
+    });
+}
+
+function getManifestsForChange(change) {
+    var hasTarget = (typeof change.deviceTarget !== 'undefined');
+    var hasVersion = (typeof change.versions !== 'undefined');
+
+    var targetDeviceSet = hasTarget ? change.deviceTarget : 'all';
+
+    if (TARGETS.indexOf(targetDeviceSet) === -1) {
+        // target-device couldn't be resolved, fix it up here to a valid value
+        targetDeviceSet = 'all';
+    }
+
+    // No semver/device-target for this config-file, pass it through
+    if (!(hasTarget || hasVersion)) {
+        return SUBSTS;
+    }
+
+    var knownWindowsVersionsForTargetDeviceSet = Object.keys(MANIFESTS[targetDeviceSet]);
+    return knownWindowsVersionsForTargetDeviceSet.reduce(function(manifestFiles, winver)
{
+        if (hasVersion && !semver.satisfies(winver, change.versions)) {
+            return manifestFiles;
+        }
+        return manifestFiles.concat(MANIFESTS[targetDeviceSet][winver]);
+    }, []);
+}
+
+// This is a local function that creates the new replacement representing the
+// mutation.  Used to save code further down.
+function createReplacement(manifestFile, originalChange) {
+    var replacement = {
+        target:         manifestFile,
+        parent:         originalChange.parent,
+        after:          originalChange.after,
+        xmls:           originalChange.xmls,
+        versions:       originalChange.versions,
+        deviceTarget:   originalChange.deviceTarget
+    };
+    return replacement;
+}
+
+
+/*
+A class for holidng the information currently stored in plugin.xml
+It's inherited from cordova-common's PluginInfo class
+In addition it overrides getConfigFiles method to use windows-specific logic
+ */
+function PluginInfo(dirname) {
+    //  We're not using `util.inherit' because original PluginInfo defines
+    //  its' methods inside of constructor
+    CommonPluginInfo.apply(this, arguments);
+    var parentGetConfigFiles = this.getConfigFiles;
+    var parentGetEditConfigs = this.getEditConfigs;
+
+    this.getEditConfigs = function(platform) {
+        var editConfigs = parentGetEditConfigs(platform);
+        return processChanges(editConfigs);
+    };
+
+    this.getConfigFiles = function(platform) {
+        var configFiles = parentGetConfigFiles(platform);
+        return processChanges(configFiles);
+    };
+}
+
+exports.PluginInfo = PluginInfo;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org


Mime
View raw message