You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "Eddy Frank (JIRA)" <ji...@apache.org> on 2017/10/20 10:53:02 UTC

[jira] [Updated] (CB-13474) Plugin with "" tag removes XML elements

     [ https://issues.apache.org/jira/browse/CB-13474?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eddy Frank updated CB-13474:
----------------------------
    Description: 
I have two plugins which modify the `AndroidManifest.xml` file.
The first plugin just adds an `<activity>` element.
The second plugin also adds some `<activity>` elements AND modifies the `<application>` element by adding the XML attribute `android:largeHeap="true"` via "<edit-config>" tag.
The first plugin works well. But the second plugin removes the `<activity>` element of the first plugin.

I have created two dummy plugin repos to reproduce this issue:
- https://github.com/eddyfrank/cordova-plugin-1
- https://github.com/eddyfrank/cordova-plugin-2

Repro steps:

{code}
cordova create PluginTestApp
cd PluginTestApp/
cordova platform add android
cordova plugin add https://github.com/eddyfrank/cordova-plugin-1
{code}

Content of the `platforms/android/AndroidManifest.xml` after adding `cordova-plugin-1`:
Looks good so far - the activity element `<activity android:name="com.example.plugin1.ActivityX" />` was added correctly.

{code:xml}
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.example.plugintestapp" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.plugin1.ActivityX" />
    </application>
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
</manifest>
{code}

OK, let's add the second plugin:

{code}
cordova plugin add https://github.com/eddyfrank/cordova-plugin-2
{code}

Got following error:

{code}
Installing "cordova-plugin-2" for android
Failed to install 'cordova-plugin-2': Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-2. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-2 can be added. You may use --force to add the plugin and overwrite the conflicting attributes.
    at PlatformMunger.add_plugin_changes (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js:148:19)
    at /Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js:123:29
    at _fulfilled (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:854:54)
    at self.promiseDispatch.done (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:883:30)
    at Promise.promise.promiseDispatch (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:816:13)
    at /Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:877:14
    at runSingle (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:137:13)
    at flush (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:125:13)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-2. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-2 can be added. You may use --force to add the plugin and overwrite the conflicting attributes.
{code}

=> Issue 1:
- Why does this error occur? There is no plugin in the project which has already modified attributes in the `<application>` element.
- The error message does not name the plugin: `The conflicting plugin, undefined, already modified the same attributes.`

Anyway, lets try to add `cordova-plugin-2` with `--force`:

{code}
cordova plugin rm cordova-plugin-2
cordova plugin add https://github.com/eddyfrank/cordova-plugin-2 --force
{code}

{code}
Installing "cordova-plugin-2" for android
--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.
Adding cordova-plugin-2 to package.json
Saved plugin info for "cordova-plugin-2" to config.xml
{code}

Content of the `platforms/android/AndroidManifest.xml` after force adding the `cordova-plugin-2`:

{code:xml}
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.example.plugintestapp" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:largeHeap="true" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.plugin2.ActivityY" />
        <activity android:name="com.example.plugin2.ActivityZ" />
    </application>
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
</manifest>
{code}

=> Issue 2 (the actual issue):
The attribute `android:largeHeap="true"` was added correctly but the activity element `<activity android:name="com.example.plugin1.ActivityX" />` of the first plugin `cordova-plugin-1` was removed!
Without the "<edit-config>" tag in the `cordova-plugin-2` everything works fine. So it seems the merging functionality of the "<edit-config>" tag is buggy.


Tested with:
- cordova v7.1.0
- android platform v6.3.0



  was:
I have two plugins which modify the `AndroidManifest.xml` file.
The first plugin just adds an `<activity>` element.
The second plugin also adds some `<activity>` elements AND modifies the `<application>` element by adding the XML attribute `android:largeHeap="true"` via "<edit-config>" tag.
The first plugin works well. But the second plugin removes the `<activity>` element of the first plugin.

I have created two dummy plugin repos to reproduce this issue:
- https://github.com/eddyfrank/cordova-plugin-1
- https://github.com/eddyfrank/cordova-plugin-2

Repro steps:

```
cordova create PluginTestApp
cd PluginTestApp/
cordova platform add android
cordova plugin add https://github.com/eddyfrank/cordova-plugin-1
```

Content of the `platforms/android/AndroidManifest.xml` after adding `cordova-plugin-1`:
Looks good so far - the activity element `<activity android:name="com.example.plugin1.ActivityX" />` was added correctly.

```xml
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.example.plugintestapp" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.plugin1.ActivityX" />
    </application>
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
</manifest>
```

OK, let's add the second plugin:

```
cordova plugin add https://github.com/eddyfrank/cordova-plugin-2
```

Got following error:

```
Installing "cordova-plugin-2" for android
Failed to install 'cordova-plugin-2': Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-2. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-2 can be added. You may use --force to add the plugin and overwrite the conflicting attributes.
    at PlatformMunger.add_plugin_changes (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js:148:19)
    at /Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js:123:29
    at _fulfilled (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:854:54)
    at self.promiseDispatch.done (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:883:30)
    at Promise.promise.promiseDispatch (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:816:13)
    at /Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:877:14
    at runSingle (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:137:13)
    at flush (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:125:13)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-2. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-2 can be added. You may use --force to add the plugin and overwrite the conflicting attributes.
```

=> Issue 1:
- Why does this error occur? There is no plugin in the project which has already modified attributes in the `<application>` element.
- The error message does not name the plugin: `The conflicting plugin, undefined, already modified the same attributes.`

Anyway, lets try to add `cordova-plugin-2` with `--force`:

```
cordova plugin rm cordova-plugin-2
cordova plugin add https://github.com/eddyfrank/cordova-plugin-2 --force
```

```
Installing "cordova-plugin-2" for android
--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.
Adding cordova-plugin-2 to package.json
Saved plugin info for "cordova-plugin-2" to config.xml
```

Content of the `platforms/android/AndroidManifest.xml` after force adding the `cordova-plugin-2`:

```xml
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.example.plugintestapp" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <uses-permission android:name="android.permission.INTERNET" />
    <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:largeHeap="true" android:supportsRtl="true">
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.plugin2.ActivityY" />
        <activity android:name="com.example.plugin2.ActivityZ" />
    </application>
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
</manifest>
```

=> Issue 2 (the actual issue):
The attribute `android:largeHeap="true"` was added correctly but the activity element `<activity android:name="com.example.plugin1.ActivityX" />` of the first plugin `cordova-plugin-1` was removed!
Without the "<edit-config>" tag in the `cordova-plugin-2` everything works fine. So it seems the merging functionality of the "<edit-config>" tag is buggy.


Tested with:
- cordova v7.1.0
- android platform v6.3.0




> Plugin with "<edit-config>" tag removes XML elements
> ----------------------------------------------------
>
>                 Key: CB-13474
>                 URL: https://issues.apache.org/jira/browse/CB-13474
>             Project: Apache Cordova
>          Issue Type: Bug
>         Environment: - cordova v7.1.0
> - android platform v6.3.0
>            Reporter: Eddy Frank
>
> I have two plugins which modify the `AndroidManifest.xml` file.
> The first plugin just adds an `<activity>` element.
> The second plugin also adds some `<activity>` elements AND modifies the `<application>` element by adding the XML attribute `android:largeHeap="true"` via "<edit-config>" tag.
> The first plugin works well. But the second plugin removes the `<activity>` element of the first plugin.
> I have created two dummy plugin repos to reproduce this issue:
> - https://github.com/eddyfrank/cordova-plugin-1
> - https://github.com/eddyfrank/cordova-plugin-2
> Repro steps:
> {code}
> cordova create PluginTestApp
> cd PluginTestApp/
> cordova platform add android
> cordova plugin add https://github.com/eddyfrank/cordova-plugin-1
> {code}
> Content of the `platforms/android/AndroidManifest.xml` after adding `cordova-plugin-1`:
> Looks good so far - the activity element `<activity android:name="com.example.plugin1.ActivityX" />` was added correctly.
> {code:xml}
> <?xml version='1.0' encoding='utf-8'?>
> <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.example.plugintestapp" xmlns:android="http://schemas.android.com/apk/res/android">
>     <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
>     <uses-permission android:name="android.permission.INTERNET" />
>     <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:supportsRtl="true">
>         <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
>             <intent-filter android:label="@string/launcher_name">
>                 <action android:name="android.intent.action.MAIN" />
>                 <category android:name="android.intent.category.LAUNCHER" />
>             </intent-filter>
>         </activity>
>         <activity android:name="com.example.plugin1.ActivityX" />
>     </application>
>     <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
> </manifest>
> {code}
> OK, let's add the second plugin:
> {code}
> cordova plugin add https://github.com/eddyfrank/cordova-plugin-2
> {code}
> Got following error:
> {code}
> Installing "cordova-plugin-2" for android
> Failed to install 'cordova-plugin-2': Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-2. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-2 can be added. You may use --force to add the plugin and overwrite the conflicting attributes.
>     at PlatformMunger.add_plugin_changes (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js:148:19)
>     at /Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/cordova-common/src/PluginManager.js:123:29
>     at _fulfilled (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:854:54)
>     at self.promiseDispatch.done (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:883:30)
>     at Promise.promise.promiseDispatch (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:816:13)
>     at /Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:877:14
>     at runSingle (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:137:13)
>     at flush (/Users/eddy/work/projects/test-projects/cordova/PluginTestApp/platforms/android/cordova/node_modules/q/q.js:125:13)
>     at _combinedTickCallback (internal/process/next_tick.js:67:7)
>     at process._tickCallback (internal/process/next_tick.js:98:9)
> Error: There was a conflict trying to modify attributes with <edit-config> in plugin cordova-plugin-2. The conflicting plugin, undefined, already modified the same attributes. The conflict must be resolved before cordova-plugin-2 can be added. You may use --force to add the plugin and overwrite the conflicting attributes.
> {code}
> => Issue 1:
> - Why does this error occur? There is no plugin in the project which has already modified attributes in the `<application>` element.
> - The error message does not name the plugin: `The conflicting plugin, undefined, already modified the same attributes.`
> Anyway, lets try to add `cordova-plugin-2` with `--force`:
> {code}
> cordova plugin rm cordova-plugin-2
> cordova plugin add https://github.com/eddyfrank/cordova-plugin-2 --force
> {code}
> {code}
> Installing "cordova-plugin-2" for android
> --force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.
> Adding cordova-plugin-2 to package.json
> Saved plugin info for "cordova-plugin-2" to config.xml
> {code}
> Content of the `platforms/android/AndroidManifest.xml` after force adding the `cordova-plugin-2`:
> {code:xml}
> <?xml version='1.0' encoding='utf-8'?>
> <manifest android:hardwareAccelerated="true" android:versionCode="10000" android:versionName="1.0.0" package="com.example.plugintestapp" xmlns:android="http://schemas.android.com/apk/res/android">
>     <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
>     <uses-permission android:name="android.permission.INTERNET" />
>     <application android:hardwareAccelerated="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:largeHeap="true" android:supportsRtl="true">
>         <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
>             <intent-filter android:label="@string/launcher_name">
>                 <action android:name="android.intent.action.MAIN" />
>                 <category android:name="android.intent.category.LAUNCHER" />
>             </intent-filter>
>         </activity>
>         <activity android:name="com.example.plugin2.ActivityY" />
>         <activity android:name="com.example.plugin2.ActivityZ" />
>     </application>
>     <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
> </manifest>
> {code}
> => Issue 2 (the actual issue):
> The attribute `android:largeHeap="true"` was added correctly but the activity element `<activity android:name="com.example.plugin1.ActivityX" />` of the first plugin `cordova-plugin-1` was removed!
> Without the "<edit-config>" tag in the `cordova-plugin-2` everything works fine. So it seems the merging functionality of the "<edit-config>" tag is buggy.
> Tested with:
> - cordova v7.1.0
> - android platform v6.3.0



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

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