Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 244414 Details for
Bug 269201
[jar exporter] ant file produced by Export runnable jar contains absolute paths instead of relative to workspace
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Ferenc's patch updated with minor tweaks
Bug269201.eclipse.jdt.ui.patch (text/plain), 19.96 KB, created by
Martin Mathew
on 2014-06-22 22:40:44 EDT
(
hide
)
Description:
Ferenc's patch updated with minor tweaks
Filename:
MIME Type:
Creator:
Martin Mathew
Created:
2014-06-22 22:40:44 EDT
Size:
19.96 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jdt.ui >diff --git ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarAntExporter.java ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarAntExporter.java >index c61a35f..09e7db7 100644 >--- ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarAntExporter.java >+++ ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarAntExporter.java >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007, 2011 IBM Corporation and others. >+ * Copyright (c) 2007, 2014 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -11,12 +11,20 @@ > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 220257 [jar application] ANT build file does not create Class-Path Entry in Manifest > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 219530 [jar application] add Jar-in-Jar ClassLoader option > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262766 [jar exporter] ANT file for Jar-in-Jar option contains relative path to jar-rsrc-loader.zip >+ * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 269201 [jar exporter] ant file produced by Export runnable jar contains absolut paths instead of relative to workspace > *******************************************************************************/ > package org.eclipse.jdt.internal.ui.jarpackagerfat; > >+import java.io.File; > import java.io.FileNotFoundException; > import java.io.IOException; > import java.util.ArrayList; >+import java.util.HashMap; >+import java.util.Map; >+ >+import org.w3c.dom.Document; >+import org.w3c.dom.Element; >+import org.w3c.dom.Node; > > import org.eclipse.core.runtime.CoreException; > import org.eclipse.core.runtime.IPath; >@@ -24,6 +32,8 @@ > import org.eclipse.core.runtime.MultiStatus; > import org.eclipse.core.runtime.Path; > import org.eclipse.core.runtime.Status; >+ >+import org.eclipse.core.resources.ResourcesPlugin; > > import org.eclipse.debug.core.ILaunchConfiguration; > >@@ -47,6 +57,14 @@ > */ > public abstract class FatJarAntExporter { > >+ private static final String ANT_PROPERTYNAME_DIR_BUILDFILE= "dir.buildfile"; //$NON-NLS-1$ >+ private static final String ANT_PROPERTYNAME_DIR_WORKSPACE= "dir.workspace"; //$NON-NLS-1$ >+ private static final String ANT_PROPERTYNAME_DIR_JARFILE= "dir.jarfile"; //$NON-NLS-1$ >+ >+ private static final String ANT_PROPERTY_DIR_BUILDFILE= "${"+ANT_PROPERTYNAME_DIR_BUILDFILE+"}"; //$NON-NLS-1$ //$NON-NLS-2$ >+ private static final String ANT_PROPERTY_DIR_WORKSPACE= "${"+ANT_PROPERTYNAME_DIR_WORKSPACE+"}"; //$NON-NLS-1$ //$NON-NLS-2$ >+ private static final String ANT_PROPERTY_DIR_JARFILE= "${"+ANT_PROPERTYNAME_DIR_JARFILE+"}"; //$NON-NLS-1$ //$NON-NLS-2$ >+ > protected static class SourceInfo { > > public final boolean isJar; >@@ -60,10 +78,49 @@ > } > } > >+ /** >+ * Helper class for path-substitutions. >+ * This class manages a set of path substitutions. >+ * On apply the longest substitution is chosen. >+ */ >+ private static class PathSubstituter { >+ private Map<String, String> pathSubstitutions= new HashMap<String, String>(); >+ >+ public PathSubstituter addSubstitution(String basePath, String baseReplacement) { >+ pathSubstitutions.put(basePath, baseReplacement); >+ return this; >+ } >+ >+ public String substitute(String path) { >+ int len= 0; >+ String result= path; >+ for (String basePath : pathSubstitutions.keySet()) { >+ if (basePath.length() < len) { >+ continue; >+ } >+ if (path.equals(basePath)) { >+ result= pathSubstitutions.get(basePath); >+ break; >+ } >+ if (path.startsWith(basePath + File.separator)) { >+ len= basePath.length(); >+ result= pathSubstitutions.get(basePath) + path.substring(len); >+ } >+ } >+ return result; >+ } >+ } >+ > private ILaunchConfiguration fLaunchConfiguration; > private IPath fAbsJarfile; > private IPath fAntScriptLocation; >- >+ >+ private String fBuildfileDir; >+ private String fWorkspaceDir; >+ private String fJarfileDir; >+ >+ private PathSubstituter pathSubstituter; >+ > /** > * Create an instance of the ANT exporter. An ANT exporter can generate an ANT script > * at the given ant script location for the given launch configuration >@@ -75,6 +132,28 @@ > fLaunchConfiguration= launchConfiguration; > fAbsJarfile= jarLocation; > fAntScriptLocation= antScriptLocation; >+ pathSubstituter= new PathSubstituter(); >+ try { >+ fBuildfileDir= antScriptLocation.toFile().getParentFile().getCanonicalPath(); >+ pathSubstituter.addSubstitution(fBuildfileDir, ANT_PROPERTY_DIR_BUILDFILE); >+ } catch (Exception e) { >+ JavaPlugin.log(e); >+ fBuildfileDir= "?"; //$NON-NLS-1$ >+ } >+ try { >+ fJarfileDir= jarLocation.toFile().getParentFile().getCanonicalPath(); >+ pathSubstituter.addSubstitution(fJarfileDir, ANT_PROPERTY_DIR_JARFILE); >+ } catch (Exception e) { >+ JavaPlugin.log(e); >+ fJarfileDir= "?"; //$NON-NLS-1$ >+ } >+ try { >+ fWorkspaceDir= ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile().getCanonicalPath(); >+ pathSubstituter.addSubstitution(fWorkspaceDir, ANT_PROPERTY_DIR_WORKSPACE); >+ } catch (Exception e) { >+ JavaPlugin.log(e); >+ fWorkspaceDir= "?"; //$NON-NLS-1$ >+ } > } > > /** >@@ -98,15 +177,13 @@ > new Status(IStatus.ERROR, JavaUI.ID_PLUGIN, > Messages.format(FatJarPackagerMessages.FatJarPackageWizard_antScript_error_readingOutputFile, new Object[] { > BasicElementLabels.getPathLabel(fAntScriptLocation, true), e.getLocalizedMessage() }) >- ) >- ); >+ )); > } catch (IOException e) { > throw new CoreException( > new Status(IStatus.ERROR, JavaUI.ID_PLUGIN, > Messages.format(FatJarPackagerMessages.FatJarPackageWizard_antScript_error_writingOutputFile, new Object[] { > BasicElementLabels.getPathLabel(fAntScriptLocation, true), e.getLocalizedMessage() }) >- ) >- ); >+ )); > } > } > >@@ -164,6 +241,105 @@ > return result; > } > >+ >+ /** >+ * Adds dir properties to ANT-Buildfile: >+ * <ul> >+ * <li><property name="dir.buildfile" value="." /></li> >+ * <li><property name="dir.workspace" value="${dir.buildfile}/../.." /></li> >+ * <li><property name="dir.jarfile" value="C:/TEMP" /></li> >+ * </ul> >+ * >+ * @param document the DOM document of the ant build script >+ * @param project the project tag >+ */ >+ protected void addBaseDirProperties(Document document, Element project) { >+ >+ Node comment= document.createComment("define folder properties"); //$NON-NLS-1$ >+ project.appendChild(comment); >+ >+ Element property= document.createElement("property"); //$NON-NLS-1$ >+ property.setAttribute("name", ANT_PROPERTYNAME_DIR_BUILDFILE); //$NON-NLS-1$ >+ property.setAttribute("value", "."); //$NON-NLS-1$ //$NON-NLS-2$ >+ project.appendChild(property); >+ >+ property= document.createElement("property"); //$NON-NLS-1$ >+ property.setAttribute("name", ANT_PROPERTYNAME_DIR_WORKSPACE); //$NON-NLS-1$ >+ property.setAttribute("value", getWorkspaceRelativeDir()); //$NON-NLS-1$ >+ project.appendChild(property); >+ >+ property= document.createElement("property"); //$NON-NLS-1$ >+ property.setAttribute("name", ANT_PROPERTYNAME_DIR_JARFILE); //$NON-NLS-1$ >+ property.setAttribute("value", getJarfileRelativeDir()); //$NON-NLS-1$ >+ project.appendChild(property); >+ } >+ >+ >+ /** >+ * Converts the given filename relative to any of the ant-property-dirs: >+ * <ul> >+ * <li>buidfile-dir (where the ant script is)</li> >+ * <li>workspace-dir (eclipse workspace dir)</li> >+ * <li>jarfile-dir (where the jar is written to)</li> >+ * </ul> >+ * >+ * @param absFilename filename whose base dir is substituted >+ * @return either the original filename or a relative path from one of the base-dirs >+ */ >+ protected String substituteBaseDirs(String absFilename) { >+ String canonicleFilename; >+ try { >+ canonicleFilename= new File(absFilename).getCanonicalPath(); >+ } catch (IOException e) { >+ e.printStackTrace(); >+ return absFilename; >+ } >+ String result= pathSubstituter.substitute(canonicleFilename); >+ result= result.replace(File.separatorChar, '/'); >+ return result; >+ } >+ >+ /** >+ * Returns the workspace-dir path relative to buildfile-dir. >+ * >+ * @return the relative path for the workspace-dir >+ */ >+ protected String getWorkspaceRelativeDir() { >+ String result; >+ if (fBuildfileDir.startsWith(fWorkspaceDir + File.separator)) { >+ int lastSlash= fWorkspaceDir.length(); >+ result= "${dir.buildfile}" + File.separator + ".."; //$NON-NLS-1$ //$NON-NLS-2$ >+ lastSlash= fBuildfileDir.indexOf(File.separator, lastSlash + 1); >+ while (lastSlash != -1) { >+ result+= File.separator + ".."; //$NON-NLS-1$ >+ lastSlash= fBuildfileDir.indexOf(File.separator, lastSlash + 1); >+ } >+ } >+ else { >+ result= new PathSubstituter() >+ .addSubstitution(fBuildfileDir, ANT_PROPERTY_DIR_BUILDFILE) >+ .substitute(fWorkspaceDir); >+ } >+ result= result.replace(File.separatorChar, '/'); >+ return result; >+ } >+ >+ >+ /** >+ * Returns jarfile-dir path relative to buildfile-dir or workspace-dir. >+ * >+ * @return the relative path for the jarfile-dir >+ */ >+ protected String getJarfileRelativeDir() { >+ String result= new PathSubstituter() >+ .addSubstitution(fBuildfileDir, ANT_PROPERTY_DIR_BUILDFILE) >+ .addSubstitution(fWorkspaceDir, ANT_PROPERTY_DIR_WORKSPACE) >+ .substitute(fJarfileDir); >+ result= result.replace(File.separatorChar, '/'); >+ return result; >+ } >+ >+ > /** > * Create an ANT script at the given location. > * >diff --git ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarRsrcUrlAntExporter.java ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarRsrcUrlAntExporter.java >index 5779cc8..4b72abf 100644 >--- ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarRsrcUrlAntExporter.java >+++ ui/org/eclipse/jdt/internal/ui/jarpackagerfat/FatJarRsrcUrlAntExporter.java >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2008, 2011 IBM Corporation and others. >+ * Copyright (c) 2008, 2014 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -11,6 +11,7 @@ > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262766 [jar exporter] ANT file for Jar-in-Jar option contains relative path to jar-rsrc-loader.zip > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262763 [jar exporter] remove Built-By attribute in ANT files from Fat JAR Exporter > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262748 [jar exporter] extract constants for string literals in JarRsrcLoader et al. >+ * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 269201 [jar exporter] ant file produced by Export runnable jar contains absolut paths instead of relative to workspace > *******************************************************************************/ > package org.eclipse.jdt.internal.ui.jarpackagerfat; > >@@ -94,18 +95,20 @@ > Element project= document.createElement("project"); //$NON-NLS-1$ > project.setAttribute("name", "Create Runnable Jar for Project " + projectName + " with Jar-in-Jar Loader"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ > project.setAttribute("default", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$ >- comment= document.createComment("this file was created by Eclipse Runnable JAR Export Wizard"); //$NON-NLS-1$ >+ comment= document.createComment("this file was created by Eclipse Runnable JAR file Export Wizard"); //$NON-NLS-1$ > project.appendChild(comment); >- comment= document.createComment("ANT 1.7 is required "); //$NON-NLS-1$ >+ comment= document.createComment("ANT 1.7 is required"); //$NON-NLS-1$ > project.appendChild(comment); > document.appendChild(project); >+ >+ addBaseDirProperties(document, project); > > Element target= document.createElement("target"); //$NON-NLS-1$ > target.setAttribute("name", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$ > project.appendChild(target); > > Element jar= document.createElement("jar"); //$NON-NLS-1$ >- jar.setAttribute("destfile", absJarname); //$NON-NLS-1$s >+ jar.setAttribute("destfile", substituteBaseDirs(absJarname)); //$NON-NLS-1$s > target.appendChild(jar); > > Element manifest= document.createElement("manifest"); //$NON-NLS-1$ >@@ -149,12 +152,12 @@ > if (sourceInfo.isJar) { > File jarFile= new File(sourceInfo.absPath); > Element fileset= document.createElement("zipfileset"); //$NON-NLS-1$ >- fileset.setAttribute("dir", jarFile.getParent()); //$NON-NLS-1$ >+ fileset.setAttribute("dir", substituteBaseDirs(jarFile.getParent())); //$NON-NLS-1$ > fileset.setAttribute("includes", jarFile.getName()); //$NON-NLS-1$ > jar.appendChild(fileset); > } else { > Element fileset= document.createElement("fileset"); //$NON-NLS-1$ >- fileset.setAttribute("dir", sourceInfo.absPath); //$NON-NLS-1$ >+ fileset.setAttribute("dir", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$ > jar.appendChild(fileset); > } > } >diff --git ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackFatJarAntExporter.java ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackFatJarAntExporter.java >index 5dba1ca..f952f36 100644 >--- ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackFatJarAntExporter.java >+++ ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackFatJarAntExporter.java >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2009, 2011 IBM Corporation and others. >+ * Copyright (c) 2009, 2014 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -10,6 +10,7 @@ > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 83258 [jar exporter] Deploy java application as executable jar > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262766 [jar exporter] ANT file for Jar-in-Jar option contains relative path to jar-rsrc-loader.zip > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262763 [jar exporter] remove Built-By attribute in ANT files from Fat JAR Exporter >+ * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 269201 [jar exporter] ant file produced by Export runnable jar contains absolut paths instead of relative to workspace > *******************************************************************************/ > package org.eclipse.jdt.internal.ui.jarpackagerfat; > >@@ -67,18 +68,20 @@ > Element project= document.createElement("project"); //$NON-NLS-1$ > project.setAttribute("name", "Create Runnable Jar for Project " + projectName); //$NON-NLS-1$ //$NON-NLS-2$ > project.setAttribute("default", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$ >+ document.appendChild(project); > comment= document.createComment("this file was created by Eclipse Runnable JAR Export Wizard"); //$NON-NLS-1$ > project.appendChild(comment); > comment= document.createComment("ANT 1.7 is required "); //$NON-NLS-1$ > project.appendChild(comment); >- document.appendChild(project); >+ >+ addBaseDirProperties(document, project); > > Element target= document.createElement("target"); //$NON-NLS-1$ > target.setAttribute("name", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$ > project.appendChild(target); > > Element jar= document.createElement("jar"); //$NON-NLS-1$ >- jar.setAttribute("destfile", absJarname); //$NON-NLS-1$s >+ jar.setAttribute("destfile", substituteBaseDirs(absJarname)); //$NON-NLS-1$s > jar.setAttribute("filesetmanifest", "mergewithoutmain"); //$NON-NLS-1$ //$NON-NLS-2$ > target.appendChild(jar); > >@@ -99,12 +102,12 @@ > SourceInfo sourceInfo= sourceInfos[i]; > if (sourceInfo.isJar) { > Element zipfileset= document.createElement("zipfileset"); //$NON-NLS-1$ >- zipfileset.setAttribute("src", sourceInfo.absPath); //$NON-NLS-1$ >+ zipfileset.setAttribute("src", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$ > zipfileset.setAttribute("excludes", "META-INF/*.SF"); //$NON-NLS-1$ //$NON-NLS-2$ > jar.appendChild(zipfileset); > } else { > Element fileset= document.createElement("fileset"); //$NON-NLS-1$ >- fileset.setAttribute("dir", sourceInfo.absPath); //$NON-NLS-1$ >+ fileset.setAttribute("dir", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$ > jar.appendChild(fileset); > } > } >diff --git ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackJarAntExporter.java ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackJarAntExporter.java >index d4bd80f..53d0588 100644 >--- ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackJarAntExporter.java >+++ ui/org/eclipse/jdt/internal/ui/jarpackagerfat/UnpackJarAntExporter.java >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2008, 2011 IBM Corporation and others. >+ * Copyright (c) 2008, 2014 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -10,6 +10,7 @@ > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 219530 [jar application] add Jar-in-Jar ClassLoader option > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262766 [jar exporter] ANT file for Jar-in-Jar option contains relative path to jar-rsrc-loader.zip > * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 262763 [jar exporter] remove Built-By attribute in ANT files from Fat JAR Exporter >+ * Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 269201 [jar exporter] ant file produced by Export runnable jar contains absolut paths instead of relative to workspace > *******************************************************************************/ > package org.eclipse.jdt.internal.ui.jarpackagerfat; > >@@ -78,13 +79,14 @@ > comment= document.createComment("ANT 1.7 is required "); //$NON-NLS-1$ > project.appendChild(comment); > document.appendChild(project); >+ addBaseDirProperties(document, project); > > Element target= document.createElement("target"); //$NON-NLS-1$ > target.setAttribute("name", "create_run_jar"); //$NON-NLS-1$ //$NON-NLS-2$ > project.appendChild(target); > > Element jar= document.createElement("jar"); //$NON-NLS-1$ >- jar.setAttribute("destfile", absJarname); //$NON-NLS-1$s >+ jar.setAttribute("destfile", substituteBaseDirs(absJarname)); //$NON-NLS-1$s > target.appendChild(jar); > > Element manifest= document.createElement("manifest"); //$NON-NLS-1$ >@@ -114,18 +116,18 @@ > SourceInfo sourceInfo= sourceInfos[i]; > if (!sourceInfo.isJar) { > Element fileset= document.createElement("fileset"); //$NON-NLS-1$ >- fileset.setAttribute("dir", sourceInfo.absPath); //$NON-NLS-1$ >+ fileset.setAttribute("dir", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$ > jar.appendChild(fileset); > } > } > > > Element delete= document.createElement("delete"); //$NON-NLS-1$ >- delete.setAttribute("dir", absSubfolder); //$NON-NLS-1$s >+ delete.setAttribute("dir", substituteBaseDirs(absSubfolder)); //$NON-NLS-1$s > target.appendChild(delete); > > Element mkdir= document.createElement("mkdir"); //$NON-NLS-1$ >- mkdir.setAttribute("dir", absSubfolder); //$NON-NLS-1$s >+ mkdir.setAttribute("dir", substituteBaseDirs(absSubfolder)); //$NON-NLS-1$s > target.appendChild(mkdir); > > // add libraries >@@ -133,8 +135,8 @@ > SourceInfo sourceInfo= sourceInfos[i]; > if (sourceInfo.isJar) { > Element copy= document.createElement("copy"); //$NON-NLS-1$ >- copy.setAttribute("file", sourceInfo.absPath); //$NON-NLS-1$ >- copy.setAttribute("todir", absSubfolder); //$NON-NLS-1$ >+ copy.setAttribute("file", substituteBaseDirs(sourceInfo.absPath)); //$NON-NLS-1$ >+ copy.setAttribute("todir", substituteBaseDirs(absSubfolder)); //$NON-NLS-1$ > target.appendChild(copy); > } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 269201
:
129325
|
129326
|
132288
|
132476
|
222585
|
223065
| 244414