You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by pu...@apache.org on 2015/03/27 20:17:57 UTC

[2/2] cordova-lib git commit: CB-8703: Add support for semver and device-specific targeting of config-file to Windows.

CB-8703: Add support for semver and device-specific targeting of
config-file to Windows.

This change enables the use of "versions" and "device-target" attributes
on the config-file element when the config-file element targets
package.appxmanifest.  This allows for plugins to be more robust in the
face of future versions of Windows which may require introduction of
additional app manifests.


Project: http://git-wip-us.apache.org/repos/asf/cordova-lib/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-lib/commit/0c65a24a
Tree: http://git-wip-us.apache.org/repos/asf/cordova-lib/tree/0c65a24a
Diff: http://git-wip-us.apache.org/repos/asf/cordova-lib/diff/0c65a24a

Branch: refs/heads/master
Commit: 0c65a24aa458bf3473c41078664855cde685cb74
Parents: 5bacee8
Author: Rob Paveza <Ro...@microsoft.com>
Authored: Wed Mar 18 10:32:27 2015 -0700
Committer: Jesse MacFadyen <pu...@gmail.com>
Committed: Fri Mar 27 12:10:06 2015 -0700

----------------------------------------------------------------------
 .../spec-plugman/platforms/windows.spec.js      |  24 ++---
 .../plugins/org.test.configtest/plugin.xml      |  24 +++++
 .../org.test.plugins.dummyplugin/plugin.xml     |  11 +-
 .../org.test.plugins.faultyplugin/plugin.xml    |   2 +-
 .../spec-plugman/util/config-changes.spec.js    |  27 +++++
 cordova-lib/src/PluginInfo.js                   |   7 +-
 cordova-lib/src/plugman/platforms/windows.js    |   4 +-
 cordova-lib/src/plugman/util/config-changes.js  | 108 +++++++++++++++++--
 cordova-lib/src/util/windows/jsprojManager.js   |   2 +-
 9 files changed, 176 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/spec-plugman/platforms/windows.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-plugman/platforms/windows.spec.js b/cordova-lib/spec-plugman/platforms/windows.spec.js
index ac6a56c..ddaa9ce 100644
--- a/cordova-lib/spec-plugman/platforms/windows.spec.js
+++ b/cordova-lib/spec-plugman/platforms/windows.spec.js
@@ -330,19 +330,19 @@ beforeEach(function () {
                         .then(function () {
                             var path = 'ItemGroup/SDKReference';
                             var incText = 'TestSDK1, Version=1.0';
-                            var targetConditions = {versions: undefined, target: undefined, arch: 'x86'};
+                            var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x86'};
                             validateUninstalledProjects('lib-file', libfiles[0], path, incText, targetConditions, ['all']);
 
                             incText = 'TestSDK2, Version=1.0';
-                            targetConditions = {versions: '>=8.1', target: undefined, arch: undefined};
+                            targetConditions = {versions: '>=8.1', deviceTarget: undefined, arch: undefined};
                             validateUninstalledProjects('lib-file', libfiles[1], path, incText, targetConditions, ['windows', 'phone']);
 
                             incText = 'TestSDK3, Version=1.0';
-                            targetConditions = {versions: undefined, target: 'phone', arch: undefined};
+                            targetConditions = {versions: undefined, deviceTarget: 'phone', arch: undefined};
                             validateUninstalledProjects('lib-file', libfiles[2], path, incText, targetConditions, ['phone']);
 
                             incText = 'TestSDK4, Version=1.0';
-                            targetConditions = {versions: '8.0', target: 'windows', arch: 'x86'};
+                            targetConditions = {versions: '8.0', deviceTarget: 'windows', arch: 'x86'};
                             validateUninstalledProjects('lib-file', libfiles[3], path, incText, targetConditions, ['windows8']);
 
                             done();
@@ -360,19 +360,19 @@ beforeEach(function () {
                         .then(function () {
                             var path = 'ItemGroup/Reference';
                             var incText = 'dummy1';
-                            var targetConditions = {versions: undefined, target: undefined, arch: 'x64'};
+                            var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x64'};
                             validateUninstalledProjects('framework', frameworks[0], path, incText, targetConditions, ['all']);
 
                             incText = 'dummy2';
-                            targetConditions = {versions: '>=8.0', target: undefined, arch: undefined};
+                            targetConditions = {versions: '>=8.0', deviceTarget: undefined, arch: undefined};
                             validateUninstalledProjects('framework', frameworks[1], path, incText, targetConditions, ['all']);
 
                             incText = 'dummy3';
-                            targetConditions = {versions: undefined, target: 'windows', arch: undefined};
+                            targetConditions = {versions: undefined, deviceTarget: 'windows', arch: undefined};
                             validateUninstalledProjects('framework', frameworks[2], path, incText, targetConditions, ['windows', 'windows8']);
 
                             incText = 'dummy4';
-                            targetConditions = {versions: '8.1', target: 'phone', arch: 'ARM'};
+                            targetConditions = {versions: '8.1', deviceTarget: 'phone', arch: 'ARM'};
                             validateUninstalledProjects('framework', frameworks[3], path, incText, targetConditions, ['phone']);
 
                             done();
@@ -390,19 +390,19 @@ beforeEach(function () {
                         .then(function () {
                             var xmlPath = 'ItemGroup/ProjectReference';
                             var incText = windowsJoin(cordovaProjectPluginsDir , dummy_id, 'src', 'windows', 'dummy1.vcxproj');
-                            var targetConditions = {versions: undefined, target: undefined, arch: 'x64'};
+                            var targetConditions = {versions: undefined, deviceTarget: undefined, arch: 'x64'};
                             validateUninstalledProjects('framework', frameworks[4], xmlPath, incText, targetConditions, ['all']);
 
                             incText = windowsJoin(cordovaProjectPluginsDir , dummy_id, 'src', 'windows', 'dummy2.vcxproj');
-                            targetConditions = {versions: '<8.1', target: undefined, arch: undefined};
+                            targetConditions = {versions: '<8.1', deviceTarget: undefined, arch: undefined};
                             validateUninstalledProjects('framework', frameworks[5], xmlPath, incText, targetConditions, ['windows8']);
 
                             incText = windowsJoin(cordovaProjectPluginsDir , dummy_id, 'src', 'windows', 'dummy3.vcxproj');
-                            targetConditions = {versions: undefined, target: 'win', arch: undefined};
+                            targetConditions = {versions: undefined, deviceTarget: 'win', arch: undefined};
                             validateUninstalledProjects('framework', frameworks[6], xmlPath, incText, targetConditions, ['windows', 'windows8']);
 
                             incText = windowsJoin(cordovaProjectPluginsDir , dummy_id, 'src', 'windows', 'dummy4.vcxproj');
-                            targetConditions = {versions: '8.1', target: 'all', arch: 'x86'};
+                            targetConditions = {versions: '8.1', deviceTarget: 'all', arch: 'x86'};
                             validateUninstalledProjects('framework', frameworks[7], xmlPath, incText, targetConditions, ['windows', 'phone']);
 
                             done();

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/spec-plugman/plugins/org.test.configtest/plugin.xml
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-plugman/plugins/org.test.configtest/plugin.xml b/cordova-lib/spec-plugman/plugins/org.test.configtest/plugin.xml
index fb6772b..fa1ff51 100644
--- a/cordova-lib/spec-plugman/plugins/org.test.configtest/plugin.xml
+++ b/cordova-lib/spec-plugman/plugins/org.test.configtest/plugin.xml
@@ -34,4 +34,28 @@
             <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.0.0">
+            <Capability Note="should-exist-for-win8-only" />
+        </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-win8-and-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-win8-and-win81-both" />
+        </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-lib/blob/0c65a24a/cordova-lib/spec-plugman/plugins/org.test.plugins.dummyplugin/plugin.xml
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-plugman/plugins/org.test.plugins.dummyplugin/plugin.xml b/cordova-lib/spec-plugman/plugins/org.test.plugins.dummyplugin/plugin.xml
index 03a9c12..02bb445 100644
--- a/cordova-lib/spec-plugman/plugins/org.test.plugins.dummyplugin/plugin.xml
+++ b/cordova-lib/spec-plugman/plugins/org.test.plugins.dummyplugin/plugin.xml
@@ -185,18 +185,19 @@
 
         <lib-file src="TestSDK1, Version=1.0" arch="x86"/>
         <lib-file src="TestSDK2, Version=1.0" versions=">=8.1"/>
-        <lib-file src="TestSDK3, Version=1.0" target="phone"/>
-        <lib-file src="TestSDK4, Version=1.0" target="windows" versions="8.0" arch="x86"/>
+        <lib-file src="TestSDK3, Version=1.0" device-target="phone"/>
+        <lib-file src="TestSDK4, Version=1.0" device-target="windows" versions="8.0" arch="x86"/>
 
         <framework src="src/windows/dummy1.dll" arch="x64"/>
         <framework src="src/windows/dummy2.dll" versions=">=8.0"/>
-        <framework src="src/windows/dummy3.dll" target="windows"/>
-        <framework src="src/windows/dummy4.dll" target="phone" versions="8.1" arch="ARM"/>
+        <framework src="src/windows/dummy3.dll" device-target="windows"/>
+        <framework src="src/windows/dummy4.dll" device-target="phone" versions="8.1" arch="ARM"/>
 
         <framework src="src/windows/dummy1.vcxproj" type="projectReference" arch="x64"/>
         <framework src="src/windows/dummy2.vcxproj" type="projectReference" versions="<8.1"/>
+        <!-- "target" attribute is an alias for "device-target" (but is deprecated) - test for it here -->
         <framework src="src/windows/dummy3.vcxproj" type="projectReference" target="win"/>
-        <framework src="src/windows/dummy4.vcxproj" type="projectReference" target="all" versions="8.1" arch="x86"/>
+        <framework src="src/windows/dummy4.vcxproj" type="projectReference" device-target="all" versions="8.1" arch="x86"/>
 
         <js-module src="www/dummyplugin.js" name="Dummy">
             <clobbers target="dummy" />

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/spec-plugman/plugins/org.test.plugins.faultyplugin/plugin.xml
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-plugman/plugins/org.test.plugins.faultyplugin/plugin.xml b/cordova-lib/spec-plugman/plugins/org.test.plugins.faultyplugin/plugin.xml
index 8ff99c4..abe2f2e 100644
--- a/cordova-lib/spec-plugman/plugins/org.test.plugins.faultyplugin/plugin.xml
+++ b/cordova-lib/spec-plugman/plugins/org.test.plugins.faultyplugin/plugin.xml
@@ -143,7 +143,7 @@
 
         <lib-file src="TestSDK1, Version=1.0" arch="x85"/>
         <lib-file src="TestSDK2, Version=1.0" versions="8.0a"/>
-        <lib-file src="TestSDK3, Version=1.0" target="daphne"/>
+        <lib-file src="TestSDK3, Version=1.0" device-target="daphne"/>
 
         <!-- does not exist -->
         <source-file src="src/windows/NotHere.js" />

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/spec-plugman/util/config-changes.spec.js
----------------------------------------------------------------------
diff --git a/cordova-lib/spec-plugman/util/config-changes.spec.js b/cordova-lib/spec-plugman/util/config-changes.spec.js
index b5d3358..b509d8d 100644
--- a/cordova-lib/spec-plugman/util/config-changes.spec.js
+++ b/cordova-lib/spec-plugman/util/config-changes.spec.js
@@ -216,6 +216,33 @@ describe('config-changes module', function() {
                 expect(munge.files['framework'].parents['Custom.framework']).not.toBeDefined();
             });
         });
+        describe('for windows project', function() {
+            it('should special case config-file elements for windows', function() {
+                var munger = new configChanges.PlatformMunger('windows', temp, 'unused', null, pluginInfoProvider);
+                // Unit testing causes a failure when the package_name function is called from generate_plugin_config_munge
+                // the results aren't really important during the unit test
+                munger.platform_handler.package_name = function() { return 'org.apache.testapppackage'; };
+
+                var munge = munger.generate_plugin_config_munge(configplugin, {});
+                var packageAppxManifest = munge.files['package.appxmanifest'];
+                var windows80AppxManifest = munge.files['package.windows80.appxmanifest'];
+                var windows81AppxManifest = munge.files['package.windows.appxmanifest'];
+                var winphone81AppxManifest = munge.files['package.phone.appxmanifest'];
+                var windows10AppxManifest = munge.files['package.windows10.appxmanifest'];
+
+                expect(packageAppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-all-appxmanifest-target-files" />');
+                expect(windows80AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-win8-only" />');
+                expect(windows80AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-win-only" />');
+                expect(windows80AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-both" />');
+                expect(windows81AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-win81-win-and-phone" />');
+                expect(windows81AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-win-only" />');
+                expect(windows81AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-both" />');
+                expect(winphone81AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-for-win81-win-and-phone" />');
+                expect(winphone81AppxManifest.parents['/Parent/Capabilities'][1].xml).toBe('<Capability Note="should-exist-for-win81-phone-only" />');
+                expect(winphone81AppxManifest.parents['/Parent/Capabilities'][2].xml).toBe('<Capability Note="should-exist-for-win8-and-win81-both" />');
+                expect(windows10AppxManifest.parents['/Parent/Capabilities'][0].xml).toBe('<Capability Note="should-exist-in-win10-only" />');
+            });
+        });
     });
 
     describe('processing of plugins (via process method)', function() {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/src/PluginInfo.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/PluginInfo.js b/cordova-lib/src/PluginInfo.js
index b037b92..fe94682 100644
--- a/cordova-lib/src/PluginInfo.js
+++ b/cordova-lib/src/PluginInfo.js
@@ -129,6 +129,9 @@ function PluginInfo(dirname) {
             , parent : tag.attrib['parent']
             , after : tag.attrib['after']
             , xmls : tag.getchildren()
+            // To support demuxing via versions
+            , versions : tag.attrib['versions']
+            , deviceTarget: tag.attrib['device-target']
             };
         return configFile;
     }
@@ -211,7 +214,7 @@ function PluginInfo(dirname) {
                 arch: tag.attrib.arch,
                 Include: tag.attrib.Include,
                 versions: tag.attrib.versions,
-                target: tag.attrib.target
+                deviceTarget: tag.attrib['device-target'] || tag.attrib.target
             };
         });
         return libFiles;
@@ -287,7 +290,7 @@ function PluginInfo(dirname) {
                 src: el.attrib.src,
                 weak: isStrTrue(el.attrib.weak),
                 versions: el.attrib.versions,
-                target: el.attrib.target,
+                deviceTarget: el.attrib['device-target'] || el.attrib.target,
                 arch: el.attrib.arch
             };
             return ret;

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/src/plugman/platforms/windows.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/plugman/platforms/windows.js b/cordova-lib/src/plugman/platforms/windows.js
index 7f76e92..22d86ea 100644
--- a/cordova-lib/src/plugman/platforms/windows.js
+++ b/cordova-lib/src/plugman/platforms/windows.js
@@ -150,5 +150,5 @@ module.exports = {
 };
 
 function getTargetConditions(obj) {
-    return {versions: obj.versions, target: obj.target, arch: obj.arch};
-}
+    return { versions: obj.versions, deviceTarget: obj.deviceTarget, arch: obj.arch };
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/src/plugman/util/config-changes.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/plugman/util/config-changes.js b/cordova-lib/src/plugman/util/config-changes.js
index 7d7d69c..63c3ec3 100644
--- a/cordova-lib/src/plugman/util/config-changes.js
+++ b/cordova-lib/src/plugman/util/config-changes.js
@@ -156,11 +156,13 @@ function remove_plugin_changes(plugin_name, plugin_id, is_top_level) {
         if (self.platform == 'windows' && file == 'package.appxmanifest' &&
             !fs.existsSync(path.join(self.project_dir, 'package.appxmanifest'))) {
             // New windows template separate manifest files for Windows8, Windows8.1 and WP8.1
-            var substs = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows80.appxmanifest'];
-            for (var subst in substs) {
-                events.emit('verbose', 'Applying munge to ' + substs[subst]);
-                self.apply_file_munge(substs[subst], munge.files[file], true);
-            }
+            var substs = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows80.appxmanifest', 'package.windows10.appxmanifest'];
+            /* jshint loopfunc:true */
+            substs.forEach(function(subst) {
+                events.emit('verbose', 'Applying munge to ' + subst);
+                self.apply_file_munge(subst, munge.files[file], true);
+            });
+            /* jshint loopfunc:false */
         }
         self.apply_file_munge(file, munge.files[file], /* remove = */ true);
     }
@@ -209,11 +211,13 @@ function add_plugin_changes(plugin_id, plugin_vars, is_top_level, should_increme
         // CB-6976 Windows Universal Apps. Compatibility fix for existing plugins.
         if (self.platform == 'windows' && file == 'package.appxmanifest' &&
             !fs.existsSync(path.join(self.project_dir, 'package.appxmanifest'))) {
-            var substs = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows80.appxmanifest'];
-            for (var subst in substs) {
-                events.emit('verbose', 'Applying munge to ' + substs[subst]);
-                self.apply_file_munge(substs[subst], munge.files[file]);
-            }
+            var substs = ['package.phone.appxmanifest', 'package.windows.appxmanifest', 'package.windows80.appxmanifest', 'package.windows10.appxmanifest'];
+            /* jshint loopfunc:true */
+            substs.forEach(function(subst) {
+                events.emit('verbose', 'Applying munge to ' + subst);
+                self.apply_file_munge(subst, munge.files[file]);
+            });
+            /* jshint loopfunc:false */
         }
         self.apply_file_munge(file, munge.files[file]);
     }
@@ -279,6 +283,90 @@ function generate_plugin_config_munge(plugin_dir, vars) {
             }
         });
     }
+    
+    // Demux 'package.appxmanifest' into relevant platform-specific appx manifests.
+    // Only spend the cycles if there are version-specific plugin settings
+    if (self.platform === 'windows' && changes.some(function(change) { return ((typeof change.versions !== 'undefined') || (typeof change.deviceTarget !== 'undefined')); })) 
+    {
+        var manifests = {
+            'windows': {
+                '8.0.0': 'package.windows80.appxmanifest',
+                '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.0.0': 'package.windows80.appxmanifest',
+                '8.1.0': ['package.windows.appxmanifest', 'package.phone.appxmanifest'],
+                '10.0.0': 'package.windows10.appxmanifest'
+            }
+        };
+
+        var oldChanges = changes;
+        changes = [];
+
+        oldChanges.forEach(function(change, changeIndex) {
+            // 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 hasVersion = (typeof change.versions !== 'undefined');
+            var hasTargets = (typeof change.deviceTarget !== 'undefined');
+
+            // No semver/device-target for this config-file, pass it through
+            if (!(hasVersion || hasTargets)) {
+                changes.push(change);
+                return;
+            }
+
+            var targetDeviceSet = hasTargets ? change.deviceTarget : 'all';
+            if (['windows', 'phone', 'all'].indexOf(targetDeviceSet) === -1) {
+                // target-device couldn't be resolved, fix it up here to a valid value
+                targetDeviceSet = 'all';
+            }
+            var knownWindowsVersionsForTargetDeviceSet = Object.keys(manifests[targetDeviceSet]);
+
+            // at this point, 'change' targets package.appxmanifest and has a version attribute
+            knownWindowsVersionsForTargetDeviceSet.forEach(function(winver) {
+                // This is a local function that creates the new replacement representing the 
+                // mutation.  Used to save code further down.
+                var createReplacement = function(manifestFile, originalChange) {
+                    var replacement = {
+                        target:         manifestFile,
+                        parent:         originalChange.parent,
+                        after:          originalChange.after,
+                        xmls:           originalChange.xmls,
+                        versions:       originalChange.versions,
+                        deviceTarget:   originalChange.deviceTarget
+                    };
+                    return replacement;
+                };
+
+                // version doesn't satisfy, so skip
+                if (hasVersion && !semver.satisfies(winver, change.versions)) {
+                    return;
+                }
+
+                var versionSpecificManifests = manifests[targetDeviceSet][winver];
+                if (versionSpecificManifests.constructor === Array) {
+                    // e.g. all['8.1.0'] === ['pkg.windows.appxmanifest', 'pkg.phone.appxmanifest']
+                    versionSpecificManifests.forEach(function(manifestFile) {
+                        changes.push(createReplacement(manifestFile, change));
+                    });
+                }
+                else {
+                    // versionSpecificManifests is actually a single string
+                    changes.push(createReplacement(versionSpecificManifests, change));
+                }
+            });
+        });
+    }
 
     changes.forEach(function(change) {
         change.xmls.forEach(function(xml) {

http://git-wip-us.apache.org/repos/asf/cordova-lib/blob/0c65a24a/cordova-lib/src/util/windows/jsprojManager.js
----------------------------------------------------------------------
diff --git a/cordova-lib/src/util/windows/jsprojManager.js b/cordova-lib/src/util/windows/jsprojManager.js
index 1b2671e..64459ff 100644
--- a/cordova-lib/src/util/windows/jsprojManager.js
+++ b/cordova-lib/src/util/windows/jsprojManager.js
@@ -360,7 +360,7 @@ function createReferenceElement(path, incText, targetConditions, children) {
 }
 
 function getTarget(targetConditions) {
-    var target = targetConditions.target;
+    var target = targetConditions.deviceTarget;
     if (target) {
         target = target.toLowerCase().trim();
         if (target === "all") {


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