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 152084 Details for
Bug 294894
Workspace lock not released leading to deadlock
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]
Test 1
bug294628.patch (text/plain), 22.86 KB, created by
James Blackburn
on 2009-11-12 13:24:12 EST
(
hide
)
Description:
Test 1
Filename:
MIME Type:
Creator:
James Blackburn
Created:
2009-11-12 13:24:12 EST
Size:
22.86 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.ui >Index: schema/propertyPages.exsd >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui/schema/propertyPages.exsd,v >retrieving revision 1.29 >diff -u -r1.29 propertyPages.exsd >--- schema/propertyPages.exsd 27 Feb 2008 19:44:38 -0000 1.29 >+++ schema/propertyPages.exsd 10 Nov 2009 15:47:48 -0000 >@@ -2,9 +2,9 @@ > <!-- Schema file written by PDE --> > <schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema"> > <annotation> >- <appinfo> >+ <appInfo> > <meta.schema plugin="org.eclipse.ui" id="propertyPages" name="Property Pages"/> >- </appinfo> >+ </appInfo> > <documentation> > This extension point is used to add additional property page for objects of a given type. Once defined, these property pages will appear in the Properties Dialog for objects of that type. > <p> >@@ -24,6 +24,11 @@ > <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/> > > <element name="extension"> >+ <annotation> >+ <appInfo> >+ <meta.element /> >+ </appInfo> >+ </annotation> > <complexType> > <sequence> > <element ref="page" minOccurs="0" maxOccurs="unbounded"/> >@@ -47,9 +52,9 @@ > <documentation> > an optional name of the extension instance > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute translatable="true"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > </complexType> >@@ -79,9 +84,9 @@ > <documentation> > a translatable name that will be used in the UI for this page > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute translatable="true"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > <attribute name="icon" type="string"> >@@ -89,9 +94,9 @@ > <documentation> > a relative path to an icon that will be used in the UI in addition to the page name > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute kind="resource"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > <attribute name="objectClass" type="string"> >@@ -101,9 +106,9 @@ > > <p>Deprecated in Eclipse 3.3. Use the instanceOf or adapt element of the enabledWhen element instead. If duplicate page definitions were previously used to register the page for multiple objectClass types, these should be combined into one page definition using multiple instanceOf elements combined inside an or element</p> > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute kind="java" deprecated="true"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > <attribute name="class" type="string" use="required"> >@@ -111,9 +116,9 @@ > <documentation> > a fully qualified name of the class that implements <tt>org.eclipse.ui.IWorkbenchPropertyPage</tt>. > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute kind="java" basedOn="org.eclipse.ui.dialogs.PropertyPage:org.eclipse.ui.IWorkbenchPropertyPage"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > <attribute name="nameFilter" type="string"> >@@ -134,9 +139,9 @@ > > <strong>NOTE:</strong> The adaptable attribute will attempt adapt an object to <code>org.eclipse.core.resources.IResource</code> before referencing the types registered in <code>Platform#getAdaptorManager</code>. The enabledWhen element has no special case tests for <code>org.eclipse.core.resources.IResource</code> and uses <code>Platform#getAdaptorManager</code> to look up adaptable types. These can be registered using the <code>org.eclipse.core.runtime.adaptors</code> extension point. > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute deprecated="true"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > <attribute name="category" type="string"> >@@ -144,9 +149,19 @@ > <documentation> > A path indicating the location of the page in the properties tree. The path may either be a parent node ID or a sequence of IDs separated by '/', representing the full path from the root node. > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute kind="identifier" basedOn="org.eclipse.ui.propertyPages/page/@id"/> >- </appinfo> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="multipleSelection" type="boolean" use="default" value="false"> >+ <annotation> >+ <documentation> >+ This propertyPage is valid for multiple selected items. All items in the selection must match the applicability / filter criteria. >+If multipleSelection is true, this propertyPage must extend the abstract class org.eclipse.ui.dialogs.PropertyPage >+Default: false >+@since 3.6 >+ </documentation> > </annotation> > </attribute> > </complexType> >@@ -190,9 +205,9 @@ > <documentation> > The id of the keyword being referred to. > </documentation> >- <appinfo> >+ <appInfo> > <meta.attribute kind="identifier" basedOn="org.eclipse.ui.keywords/keyword/@id"/> >- </appinfo> >+ </appInfo> > </annotation> > </attribute> > </complexType> >@@ -224,9 +239,9 @@ > </element> > > <annotation> >- <appinfo> >+ <appInfo> > <meta.section type="examples"/> >- </appinfo> >+ </appInfo> > <documentation> > The following is an example of the property page definition: > <p> >@@ -251,9 +266,9 @@ > </annotation> > > <annotation> >- <appinfo> >+ <appInfo> > <meta.section type="apiInfo"/> >- </appinfo> >+ </appInfo> > <documentation> > The attribute <samp>class</samp> must specify a fully qualified name > of the class that implements >@@ -262,11 +277,10 @@ > </annotation> > > >- > <annotation> >- <appinfo> >+ <appInfo> > <meta.section type="implementation"/> >- </appinfo> >+ </appInfo> > <documentation> > Some objects provided by the workbench may have > property pages registered. Plug-ins are allowed >@@ -280,9 +294,9 @@ > </annotation> > > <annotation> >- <appinfo> >+ <appInfo> > <meta.section type="copyright"/> >- </appinfo> >+ </appInfo> > <documentation> > Copyright (c) 2002, 2006 IBM Corporation and others.<br> > All rights reserved. This program and the accompanying materials are made >#P org.eclipse.ui.workbench >Index: Eclipse UI/org/eclipse/ui/dialogs/PropertyPage.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/dialogs/PropertyPage.java,v >retrieving revision 1.10 >diff -u -r1.10 PropertyPage.java >--- Eclipse UI/org/eclipse/ui/dialogs/PropertyPage.java 25 May 2009 20:52:15 -0000 1.10 >+++ Eclipse UI/org/eclipse/ui/dialogs/PropertyPage.java 10 Nov 2009 15:47:48 -0000 >@@ -41,10 +41,10 @@ > */ > public abstract class PropertyPage extends PreferencePage implements > IWorkbenchPropertyPage { >- /** >- * The element. >- */ >- private IAdaptable element; >+ /** >+ * The elements. >+ */ >+ private IAdaptable[] elements; > > /** > * Creates a new property page. >@@ -57,16 +57,39 @@ > * @see org.eclipse.ui.IWorkbenchPropertyPage#getElement() > */ > public IAdaptable getElement() { >- return element; >+ if (elements == null || elements.length == 0) >+ return null; >+ return elements[0]; > } > >+ /** >+ * Returns an array of elements which open properties to be displayed by >+ * this page. >+ * >+ * @return IAdaptable[] of elements >+ * @since 3.6 >+ */ >+ public IAdaptable[] getElements() { >+ return elements; >+ } >+ > /** > * Sets the element that owns properties shown on this page. >- * > * @param element > * the element > */ > public void setElement(IAdaptable element) { >- this.element = element; >+ this.elements = new IAdaptable[] { element }; > } >+ >+ /** >+ * Sets the elements that own properties shown on this page. >+ * >+ * @param elements >+ * the element >+ * @since 3.6 >+ */ >+ public void setElements(IAdaptable[] elements) { >+ this.elements = elements; >+ } > } >Index: Eclipse UI/org/eclipse/ui/dialogs/PropertyDialogAction.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/dialogs/PropertyDialogAction.java,v >retrieving revision 1.21 >diff -u -r1.21 PropertyDialogAction.java >--- Eclipse UI/org/eclipse/ui/dialogs/PropertyDialogAction.java 9 May 2008 14:13:12 -0000 1.21 >+++ Eclipse UI/org/eclipse/ui/dialogs/PropertyDialogAction.java 10 Nov 2009 15:47:48 -0000 >@@ -100,7 +100,7 @@ > * @param object > * @return boolean > */ >- private boolean hasPropertyPagesFor(Object object) { >+ private boolean hasPropertyPagesFor(IStructuredSelection object) { > return PropertyPageContributorManager.getManager().getApplicableContributors(object).size() != 0; > } > >@@ -143,7 +143,7 @@ > * otherwise > */ > public boolean isApplicableForSelection(IStructuredSelection selection) { >- return selection.size() == 1 && hasPropertyPagesFor(selection.getFirstElement()); >+ return selection.size() > 0 && hasPropertyPagesFor(selection); > } > > >@@ -168,12 +168,11 @@ > */ > public PreferenceDialog createDialog() { > >- Object element = getStructuredSelection().getFirstElement(); >- if (element == null) { >+ if (getStructuredSelection().isEmpty()) > return null; >- } >+ > return PropertyDialog >- .createDialogOn(shellProvider.getShell(), initialPageId, element); >+ .createDialogOn(shellProvider.getShell(), initialPageId, getStructuredSelection()); > } > > >@@ -181,6 +180,6 @@ > * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection) > */ > public void selectionChanged(IStructuredSelection selection) { >- setEnabled(selection.size() == 1 && selection.getFirstElement() != null); >+ setEnabled(selection.size() != 0 && selection.getFirstElement() != null); > } > } >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/RegistryPageContributor.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/RegistryPageContributor.java,v >retrieving revision 1.35 >diff -u -r1.35 RegistryPageContributor.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/RegistryPageContributor.java 5 Sep 2008 17:55:36 -0000 1.35 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/RegistryPageContributor.java 10 Nov 2009 15:47:49 -0000 >@@ -30,10 +30,12 @@ > import org.eclipse.core.runtime.Status; > import org.eclipse.jface.preference.PreferenceNode; > import org.eclipse.jface.resource.ImageDescriptor; >+import org.eclipse.jface.viewers.IStructuredSelection; > import org.eclipse.ui.IActionFilter; > import org.eclipse.ui.IPluginContribution; > import org.eclipse.ui.IWorkbenchPropertyPage; > import org.eclipse.ui.SelectionEnabler; >+import org.eclipse.ui.dialogs.PropertyPage; > import org.eclipse.ui.internal.IWorkbenchConstants; > import org.eclipse.ui.internal.LegacyResourceSupport; > import org.eclipse.ui.internal.WorkbenchPlugin; >@@ -66,6 +68,12 @@ > > private boolean adaptable = false; > >+ /** >+ * Flag which indicates if this property page supports multiple selection >+ * @since 3.6 >+ */ >+ private final boolean supportsMultiSelect; >+ > private IConfigurationElement pageElement; > > private SoftReference filterProperties; >@@ -88,6 +96,11 @@ > pageElement > .getAttribute(PropertyPagesRegistryReader.ATT_ADAPTABLE)) > .booleanValue(); >+ supportsMultiSelect = Boolean >+ .valueOf( >+ pageElement >+ .getAttribute(PropertyPagesRegistryReader.ATT_MULTIPLE_SELECTION)) >+ .booleanValue(); > initializeEnablement(element); > } > >@@ -122,21 +135,36 @@ > > ppage.setTitle(getPageName()); > >- Object adapted = element; >- if (adaptable) { >- adapted = getAdaptedElement(element); >- if (adapted == null) { >- String message = "Error adapting selection to Property page " + pageId + " is being ignored"; //$NON-NLS-1$ //$NON-NLS-2$ >- throw new CoreException(new Status(IStatus.ERROR, >- WorkbenchPlugin.PI_WORKBENCH, IStatus.ERROR, message, >- null)); >+ Object[] elements = getObjects(element); >+ IAdaptable[] adapt = new IAdaptable[elements.length]; >+ >+ for (int i = 0; i < elements.length; i++) { >+ Object adapted = elements[i]; >+ if (adaptable) { >+ adapted = getAdaptedElement(adapted); >+ if (adapted == null) { >+ String message = "Error adapting selection to Property page " + pageId + " is being ignored"; //$NON-NLS-1$ //$NON-NLS-2$ >+ throw new CoreException(new Status(IStatus.ERROR, >+ WorkbenchPlugin.PI_WORKBENCH, IStatus.ERROR, >+ message, null)); >+ } > } >+ adapt[i] = (IAdaptable) ((adapted instanceof IAdaptable) ? adapted >+ : new AdaptableForwarder(adapted)); > } > >- if (adapted instanceof IAdaptable) >- ppage.setElement((IAdaptable) adapted); >+ if (ppage instanceof PropertyPage) >+ ((PropertyPage) ppage).setElements(adapt); >+ else if (adapt.length > 1) >+ // Throw exception - if propertPage supports multipleSelection >+ // then it should extend PropertyPage >+ throw new CoreException(new Status(IStatus.ERROR, >+ WorkbenchPlugin.PI_WORKBENCH, >+ IStatus.ERROR, >+ "Error: selected element length > 0 but ppage not a PropertyPage", //$NON-NLS-1$ >+ null)); > else >- ppage.setElement(new AdaptableForwarder(adapted)); >+ ppage.setElement(adapt[0]); > > return ppage; > } >@@ -209,38 +237,46 @@ > if (failsEnablement(object)) > return false; > >+ Object[] objs = getObjects(object); >+ > // Test name filter > String nameFilter = pageElement > .getAttribute(PropertyPagesRegistryReader.ATT_NAME_FILTER); >- if (nameFilter != null) { >- String objectName = object.toString(); >- IWorkbenchAdapter adapter = (IWorkbenchAdapter) Util.getAdapter(object, >- IWorkbenchAdapter.class); >- if (adapter != null) { >- String elementName = adapter.getLabel(object); >- if (elementName != null) { >- objectName = elementName; >+ >+ for (int i = 0; i < objs.length; i++) { >+ object = objs[i]; >+ if (nameFilter != null) { >+ String objectName = object.toString(); >+ IWorkbenchAdapter adapter = (IWorkbenchAdapter) Util >+ .getAdapter(object, IWorkbenchAdapter.class); >+ if (adapter != null) { >+ String elementName = adapter.getLabel(object); >+ if (elementName != null) { >+ objectName = elementName; >+ } > } >+ if (!SelectionEnabler.verifyNameMatch(objectName, nameFilter)) >+ return false; > } >- if (!SelectionEnabler.verifyNameMatch(objectName, nameFilter)) >- return false; >- } > >- // Test custom filter >- if (getFilterProperties() == null) >- return true; >- IActionFilter filter = null; >- >- // Do the free IResource adapting >- Object adaptedObject = LegacyResourceSupport.getAdaptedResource(object); >- if (adaptedObject != null) { >- object = adaptedObject; >- } >+ // Test custom filter >+ if (getFilterProperties() == null) >+ return true; >+ IActionFilter filter = null; >+ >+ // Do the free IResource adapting >+ Object adaptedObject = LegacyResourceSupport >+ .getAdaptedResource(object); >+ if (adaptedObject != null) { >+ object = adaptedObject; >+ } > >- filter = (IActionFilter)Util.getAdapter(object, IActionFilter.class); >+ filter = (IActionFilter) Util.getAdapter(object, >+ IActionFilter.class); > >- if (filter != null) >- return testCustom(object, filter); >+ if (filter != null && !testCustom(object, filter)) >+ return false; >+ } > > return true; > } >@@ -252,18 +288,38 @@ > * @return boolean <code>true</code> if it fails the enablement test > */ > private boolean failsEnablement(Object object) { >+ Object[] objs = getObjects(object); >+ if (objs.length > 1 && !supportsMultiSelect) >+ return true; > if (enablementExpression == null) > return false; > try { >- EvaluationContext context = new EvaluationContext(null, object); >- context.setAllowPluginActivation(true); >- return enablementExpression.evaluate( >- context).equals( >- EvaluationResult.FALSE); >+ for (int i = 0; i < objs.length; i++) { >+ EvaluationContext context = new EvaluationContext(null, objs[i]); >+ context.setAllowPluginActivation(true); >+ boolean fails = enablementExpression >+ .evaluate(context).equals(EvaluationResult.FALSE); >+ if (fails) >+ return true; >+ } > } catch (CoreException e) { > WorkbenchPlugin.log(e); >- return false; > } >+ return false; >+ } >+ >+ /** >+ * Returns an object array for the passed in object. If the object is an >+ * IStructuredSelection, then return its array otherwise return a 1 element >+ * Object[] containing the passed in object >+ * >+ * @param obj >+ * @return an object array representing the passed in object >+ */ >+ private Object[] getObjects(Object obj) { >+ if (obj instanceof IStructuredSelection) >+ return ((IStructuredSelection) obj).toArray(); >+ return new Object[] { obj }; > } > > /** >@@ -404,6 +460,14 @@ > } > > /** >+ * @return boolean indicating if this page supports multiple selection >+ * @since 3.6 >+ */ >+ boolean supportsMultipleSelection() { >+ return supportsMultiSelect; >+ } >+ >+ /** > * @return the configuration element > * @since 3.1 > */ >Index: Eclipse UI/org/eclipse/ui/internal/dialogs/PropertyPageContributorManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/PropertyPageContributorManager.java,v >retrieving revision 1.30 >diff -u -r1.30 PropertyPageContributorManager.java >--- Eclipse UI/org/eclipse/ui/internal/dialogs/PropertyPageContributorManager.java 17 Feb 2009 08:53:47 -0000 1.30 >+++ Eclipse UI/org/eclipse/ui/internal/dialogs/PropertyPageContributorManager.java 10 Nov 2009 15:47:49 -0000 >@@ -16,6 +16,7 @@ > import java.util.HashMap; > import java.util.Hashtable; > import java.util.Iterator; >+import java.util.LinkedHashSet; > import java.util.List; > import java.util.Map; > >@@ -24,6 +25,7 @@ > import org.eclipse.core.runtime.Platform; > import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; > import org.eclipse.jface.preference.PreferenceNode; >+import org.eclipse.jface.viewers.IStructuredSelection; > import org.eclipse.ui.internal.ObjectContributorManager; > import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants; > import org.eclipse.ui.internal.registry.PropertyPagesRegistryReader; >@@ -66,13 +68,28 @@ > * contributors and sequentially invoke them to contribute to the property > * page manager. Matching algorithm will also check subclasses and > * implemented interfaces. >+ * >+ * If object is an IStructuredSelection then attempt to match all the >+ * contained objects. >+ * > * @param manager > * @param object > * @return true if contribution took place, false otherwise. > */ > public boolean contribute(PropertyPageManager manager, Object object) { > >- List result = getContributors(object); >+ Collection result = null; >+ if (object instanceof IStructuredSelection) { >+ Object[] objs = ((IStructuredSelection) object).toArray(); >+ for (int i = 0; i < objs.length; i++) { >+ List contribs = getContributors(objs[i]); >+ if (result == null) >+ result = new LinkedHashSet(contribs); >+ else >+ result.retainAll(contribs); >+ } >+ } else >+ result = getContributors(object); > > if (result == null || result.size() == 0) { > return false; >@@ -129,7 +146,7 @@ > * @param nodes > * @return List of CategorizedPageNode > */ >- private List buildNodeList(List nodes) { >+ private List buildNodeList(Collection nodes) { > Hashtable mapping = new Hashtable(); > > Iterator nodesIterator = nodes.iterator(); >@@ -192,6 +209,8 @@ > * @return Collection of PropertyPageContribution > */ > public Collection getApplicableContributors(Object element) { >+ if (element instanceof IStructuredSelection) >+ return getApplicableContributors((IStructuredSelection) element); > Collection contributors = getContributors(element); > Collection result = new ArrayList(); > for (Iterator iter = contributors.iterator(); iter.hasNext();) { >@@ -203,6 +222,37 @@ > return result; > } > >+ /** >+ * Get applicable contributors for multiple selection >+ * >+ * @param selection >+ * @return Collection of applicable property page contributors >+ * @since 3.6 >+ */ >+ public Collection getApplicableContributors(IStructuredSelection selection) { >+ Iterator it = selection.iterator(); >+ Collection result = null; >+ while (it.hasNext()) { >+ Object element = it.next(); >+ Collection collection = getApplicableContributors(element); >+ if (result == null) >+ result = new LinkedHashSet(collection); >+ else >+ result.retainAll(collection); >+ } >+ if (result != null && !result.isEmpty() && selection.size() > 1) { >+ // only add contributors which can handle multi selection >+ it = result.iterator(); >+ while (it.hasNext()) { >+ RegistryPageContributor contrib = (RegistryPageContributor) it >+ .next(); >+ if (!contrib.supportsMultipleSelection()) >+ it.remove(); >+ } >+ } >+ return result; >+ } >+ > /* (non-Javadoc) > * @see org.eclipse.ui.internal.ObjectContributorManager#getExtensionPointFilter() > */ >Index: Eclipse UI/org/eclipse/ui/internal/registry/PropertyPagesRegistryReader.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/PropertyPagesRegistryReader.java,v >retrieving revision 1.32 >diff -u -r1.32 PropertyPagesRegistryReader.java >--- Eclipse UI/org/eclipse/ui/internal/registry/PropertyPagesRegistryReader.java 9 May 2008 14:13:12 -0000 1.32 >+++ Eclipse UI/org/eclipse/ui/internal/registry/PropertyPagesRegistryReader.java 10 Nov 2009 15:47:49 -0000 >@@ -41,6 +41,13 @@ > */ > public static final String ATT_FILTER_VALUE = "value";//$NON-NLS-1$ > >+ /** >+ * Value "<code>multipleSelection</code>". >+ * >+ * @since 3.6 >+ */ >+ public static final String ATT_MULTIPLE_SELECTION = "multipleSelection";//$NON-NLS-1$ >+ > private static final String TAG_PAGE = "page";//$NON-NLS-1$ > > /**
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 294894
:
151953
|
151954
|
152020
|
152022
|
152031
|
152084
|
152085
|
163428
|
163433
|
163463