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 53564 Details for
Bug 44295
[WorkbenchParts] Workbench-Shutdown/Startup: Saving/Restoring Cursor Positions in Texteditor-Windows
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]
Add persistable API for editors
persistableState-v01.txt (text/plain), 20.35 KB, created by
Paul Webster
on 2006-11-09 13:53:10 EST
(
hide
)
Description:
Add persistable API for editors
Filename:
MIME Type:
Creator:
Paul Webster
Created:
2006-11-09 13:53:10 EST
Size:
20.35 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.ui.workbench >Index: Eclipse UI/org/eclipse/ui/internal/IWorkbenchConstants.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/IWorkbenchConstants.java,v >retrieving revision 1.74 >diff -u -r1.74 IWorkbenchConstants.java >--- Eclipse UI/org/eclipse/ui/internal/IWorkbenchConstants.java 25 Oct 2006 20:27:00 -0000 1.74 >+++ Eclipse UI/org/eclipse/ui/internal/IWorkbenchConstants.java 9 Nov 2006 18:56:30 -0000 >@@ -90,6 +90,8 @@ > > public static final String TAG_FACTORY_ID = "factoryID"; //$NON-NLS-1$ > >+ public static final String TAG_EDITOR_STATE = "editorState"; //$NON-NLS-1$ >+ > public static final String TAG_TITLE = "title"; //$NON-NLS-1$ > > public static final String TAG_X = "x"; //$NON-NLS-1$ >Index: Eclipse UI/org/eclipse/ui/internal/EditorReference.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorReference.java,v >retrieving revision 1.15 >diff -u -r1.15 EditorReference.java >--- Eclipse UI/org/eclipse/ui/internal/EditorReference.java 18 May 2006 17:34:26 -0000 1.15 >+++ Eclipse UI/org/eclipse/ui/internal/EditorReference.java 9 Nov 2006 18:56:30 -0000 >@@ -23,6 +23,7 @@ > import org.eclipse.swt.widgets.Composite; > import org.eclipse.ui.IEditorInput; > import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IEditorPersistable; > import org.eclipse.ui.IEditorReference; > import org.eclipse.ui.IEditorRegistry; > import org.eclipse.ui.IElementFactory; >@@ -55,6 +56,8 @@ > > private IMemento editorMemento; > >+ private IMemento editorState; >+ > /** > * Flag that lets us detect malfunctioning editors that don't fire PROP_INPUT events. > * It is never needed for a correctly-functioning >@@ -100,6 +103,7 @@ > this.manager = manager; > initListenersAndHandlers(); > this.editorMemento = memento; >+ editorState = editorMemento.getChild(IWorkbenchConstants.TAG_EDITOR_STATE); > String id = memento.getString(IWorkbenchConstants.TAG_ID); > String title = memento.getString(IWorkbenchConstants.TAG_TITLE); > String tooltip = Util.safeString(memento >@@ -217,6 +221,7 @@ > protected void releaseReferences() { > super.releaseReferences(); > editorMemento = null; >+ editorState = null; > name = null; > factoryId = null; > restoredInput = null; >@@ -255,6 +260,7 @@ > > super.doDisposePart(); > editorMemento = null; >+ editorState = null; > restoredInput = new NullEditorInput(); > } > >@@ -582,6 +588,11 @@ > // been modified until this point) > site = manager.createSite(this, part, desc, editorInput); > >+ // if there is saved state that's appropriate, pass it on >+ if (part instanceof IEditorPersistable && editorState != null) { >+ ((IEditorPersistable) part).restoreState(editorState); >+ } >+ > // Remember the site and the action bars (now that we've created them, we'll need to dispose > // them if an exception occurs) > actionBars = (EditorActionBars) site.getActionBars(); >Index: Eclipse UI/org/eclipse/ui/internal/EditorManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/EditorManager.java,v >retrieving revision 1.113 >diff -u -r1.113 EditorManager.java >--- Eclipse UI/org/eclipse/ui/internal/EditorManager.java 8 Nov 2006 15:13:29 -0000 1.113 >+++ Eclipse UI/org/eclipse/ui/internal/EditorManager.java 9 Nov 2006 18:56:30 -0000 >@@ -63,6 +63,7 @@ > import org.eclipse.ui.IEditorLauncher; > import org.eclipse.ui.IEditorMatchingStrategy; > import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IEditorPersistable; > import org.eclipse.ui.IEditorReference; > import org.eclipse.ui.IEditorRegistry; > import org.eclipse.ui.IEditorSite; >@@ -1598,6 +1599,13 @@ > inputMem.putString(IWorkbenchConstants.TAG_FACTORY_ID, > persistable.getFactoryId()); > persistable.saveState(inputMem); >+ >+ // any editors that want to persist state >+ if (editor instanceof IEditorPersistable) { >+ IMemento editorState = editorMem >+ .createChild(IWorkbenchConstants.TAG_EDITOR_STATE); >+ ((IEditorPersistable) editor).saveState(editorState); >+ } > } > > public void handleException(Throwable e) { >Index: Eclipse UI/org/eclipse/ui/IEditorPersistable.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/IEditorPersistable.java >diff -N Eclipse UI/org/eclipse/ui/IEditorPersistable.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI/org/eclipse/ui/IEditorPersistable.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,46 @@ >+/******************************************************************************* >+ * Copyright (c) 2006 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 >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ ******************************************************************************/ >+package org.eclipse.ui; >+ >+/** >+ * An editor can implement this interface and participate in the workbench >+ * session save/restore cycle using <code>IMemento</code>, similar to how >+ * <code>IViewPart</code> currently works. >+ * <p> >+ * Refer to IWorkbenchPart for the part lifecycle. >+ * </p> >+ * <p> >+ * If a memento is available, restoreState(*) will be inserted into the editor >+ * startup. >+ * <ol> >+ * <li><code>editor.init(site, input)</code></li> >+ * <li><code>editor.restoreState(memento)</code></li> >+ * <li><code>editor.createPartControl(parent)</code></li> >+ * <li>...</li> >+ * </ol> >+ * </p> >+ * <p> >+ * On workbench shutdown, the editor state will be persisted when the editor >+ * references are saved. >+ * </p> >+ * >+ * @since 3.3 >+ */ >+public interface IEditorPersistable extends IPersistable { >+ /** >+ * Called with a memento for this editor. The editor can parse the data or >+ * save the memento. This method may not be called. >+ * >+ * @param memento >+ * the saved state for this editor. May be <code>null</code>. >+ */ >+ public void restoreState(IMemento memento); >+} >#P org.eclipse.ui.tests >Index: plugin.xml >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.tests/plugin.xml,v >retrieving revision 1.196 >diff -u -r1.196 plugin.xml >--- plugin.xml 9 Nov 2006 17:12:15 -0000 1.196 >+++ plugin.xml 9 Nov 2006 18:56:32 -0000 >@@ -443,6 +443,13 @@ > id="org.eclipse.ui.tests.api.MockEditorPart2"> > </editor> > <editor >+ name="Mock Editor Save" >+ extensions="mocksave" >+ icon="icons\mockeditorpart1.gif" >+ class="org.eclipse.ui.tests.api.MockEditorWithState" >+ id="org.eclipse.ui.tests.api.MockEditorStatePart"> >+ </editor> >+ <editor > name="IEditorActionBarContributorTest" > extensions="mock3" > icon="icons\mockeditorpart2.gif" >Index: Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java,v >retrieving revision 1.16 >diff -u -r1.16 IEditorPartTest.java >--- Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java 8 May 2006 20:51:28 -0000 1.16 >+++ Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java 9 Nov 2006 18:56:32 -0000 >@@ -19,54 +19,65 @@ > import org.eclipse.ui.tests.harness.util.FileUtil; > > /** >- * This is a test for IEditorPart. Since IEditorPart is an >- * interface this test verifies the IEditorPart lifecycle rather >- * than the implementation. >+ * This is a test for IEditorPart. Since IEditorPart is an interface this test >+ * verifies the IEditorPart lifecycle rather than the implementation. > */ > public class IEditorPartTest extends IWorkbenchPartTest { > >- /** >- * Constructor for IEditorPartTest >- */ >- public IEditorPartTest(String testName) { >- super(testName); >- } >- >- /** >- * @see IWorkbenchPartTest#openPart(IWorkbenchPage) >- */ >- protected MockPart openPart(IWorkbenchPage page) throws Throwable { >- IProject proj = FileUtil.createProject("IEditorPartTest"); >- IFile file = FileUtil.createFile("IEditorPartTest.txt", proj); >- return (MockWorkbenchPart) page.openEditor(new FileEditorInput(file), >- MockEditorPart.ID1); >- } >- >- /** >- * @see IWorkbenchPartTest#closePart(IWorkbenchPage, MockWorkbenchPart) >- */ >- protected void closePart(IWorkbenchPage page, MockPart part) >- throws Throwable { >- page.closeEditor((IEditorPart) part, true); >- } >- >- /** >- * Tests that the editor is closed without saving if isSaveOnCloseNeeded() >- * returns false. >- * @see ISaveablePart#isSaveOnCloseNeeded() >- */ >- public void testOpenAndCloseSaveNotNeeded() throws Throwable { >- // Open a part. >- MockEditorPart part = (MockEditorPart) openPart(fPage); >- part.setDirty(true); >- part.setSaveNeeded(false); >- closePart(fPage, part); >- >- CallHistory history = part.getCallHistory(); >- assertTrue(history.verifyOrder(new String[] { "setInitializationData", "init", >- "createPartControl", "setFocus", "isSaveOnCloseNeeded", "widgetDisposed", "dispose" })); >- assertFalse(history.contains("doSave")); >- } >- >-} >+ /** >+ * Constructor for IEditorPartTest >+ */ >+ public IEditorPartTest(String testName) { >+ super(testName); >+ } >+ >+ /** >+ * @see IWorkbenchPartTest#openPart(IWorkbenchPage) >+ */ >+ protected MockPart openPart(IWorkbenchPage page) throws Throwable { >+ IProject proj = FileUtil.createProject("IEditorPartTest"); >+ IFile file = FileUtil.createFile("IEditorPartTest.txt", proj); >+ return (MockWorkbenchPart) page.openEditor(new FileEditorInput(file), >+ MockEditorPart.ID1); >+ } >+ >+ /** >+ * @see IWorkbenchPartTest#closePart(IWorkbenchPage, MockWorkbenchPart) >+ */ >+ protected void closePart(IWorkbenchPage page, MockPart part) >+ throws Throwable { >+ page.closeEditor((IEditorPart) part, true); >+ } > >+ /** >+ * Tests that the editor is closed without saving if isSaveOnCloseNeeded() >+ * returns false. >+ * >+ * @see ISaveablePart#isSaveOnCloseNeeded() >+ */ >+ public void testOpenAndCloseSaveNotNeeded() throws Throwable { >+ // Open a part. >+ MockEditorPart part = (MockEditorPart) openPart(fPage); >+ part.setDirty(true); >+ part.setSaveNeeded(false); >+ closePart(fPage, part); >+ >+ CallHistory history = part.getCallHistory(); >+ assertTrue(history.verifyOrder(new String[] { "setInitializationData", >+ "init", "createPartControl", "setFocus", "isSaveOnCloseNeeded", >+ "widgetDisposed", "dispose" })); >+ assertFalse(history.contains("doSave")); >+ } >+ >+ public void testOpenAndCloseWithNoMemento() throws Throwable { >+ IProject proj = FileUtil.createProject("IEditorPartTest"); >+ IFile file = FileUtil.createFile("IEditorPartTest.txt", proj); >+ MockEditorWithState editor = (MockEditorWithState) fPage.openEditor( >+ new FileEditorInput(file), MockEditorWithState.ID); >+ closePart(fPage, editor); >+ >+ CallHistory history = editor.getCallHistory(); >+ assertFalse(history.contains("saveState")); >+ assertFalse(history.contains("restoreState")); >+ } >+} >Index: Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java,v >retrieving revision 1.10 >diff -u -r1.10 SessionTests.java >--- Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java 8 May 2006 20:51:38 -0000 1.10 >+++ Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java 9 Nov 2006 18:56:32 -0000 >@@ -41,6 +41,8 @@ > private void addEditorTests() { > addTest(new WorkbenchSessionTest("editorSessionTests", > Bug95357Test.class)); >+ addTest(new WorkbenchSessionTest("editorSessionTests", >+ EditorWithStateTest.class)); > } > > /** >Index: Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java >=================================================================== >RCS file: Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java >diff -N Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,179 @@ >+/******************************************************************************* >+ * Copyright (c) 2000, 2006 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 >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ui.tests.api; >+ >+import org.eclipse.core.runtime.IProgressMonitor; >+import org.eclipse.swt.SWT; >+import org.eclipse.swt.events.SelectionAdapter; >+import org.eclipse.swt.events.SelectionEvent; >+import org.eclipse.swt.widgets.Button; >+import org.eclipse.swt.widgets.Composite; >+import org.eclipse.ui.IActionBars; >+import org.eclipse.ui.IEditorInput; >+import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IEditorPersistable; >+import org.eclipse.ui.IEditorSite; >+import org.eclipse.ui.IMemento; >+import org.eclipse.ui.PartInitException; >+ >+public class MockEditorWithState extends MockWorkbenchPart implements >+ IEditorPart, IEditorPersistable { >+ >+ public static final String ID = "org.eclipse.ui.tests.api.MockEditorStatePart"; >+ >+ public static final String NAME = "Mock Editor State 1"; >+ >+ private IEditorInput input; >+ >+ private boolean dirty = false; >+ >+ private boolean saveNeeded = true; >+ >+ private boolean saveAsAllowed = false; >+ >+ public MockEditorWithState() { >+ super(); >+ } >+ >+ public void createPartControl(Composite parent) { >+ super.createPartControl(parent); >+ >+ final Button dirtyToggle = new Button(parent, SWT.CHECK); >+ dirtyToggle.setText("Dirty"); >+ dirtyToggle.addSelectionListener(new SelectionAdapter() { >+ public void widgetSelected(SelectionEvent e) { >+ setDirty(dirtyToggle.getSelection()); >+ } >+ }); >+ dirtyToggle.setSelection(isDirty()); >+ >+ final Button saveNeededToggle = new Button(parent, SWT.CHECK); >+ saveNeededToggle.setText("Save on close"); >+ saveNeededToggle.addSelectionListener(new SelectionAdapter() { >+ public void widgetSelected(SelectionEvent e) { >+ setSaveNeeded(saveNeededToggle.getSelection()); >+ } >+ }); >+ saveNeededToggle.setSelection(saveNeeded); >+ >+ final Button saveAsToggle = new Button(parent, SWT.CHECK); >+ saveAsToggle.setText("Save as allowed"); >+ saveAsToggle.addSelectionListener(new SelectionAdapter() { >+ public void widgetSelected(SelectionEvent e) { >+ setSaveAsAllowed(saveAsToggle.getSelection()); >+ } >+ }); >+ saveAsToggle.setSelection(saveAsAllowed); >+ } >+ >+ /** >+ * @see IEditorPart#doSave(IProgressMonitor) >+ */ >+ public void doSave(IProgressMonitor monitor) { >+ setDirty(false); >+ callTrace.add("doSave"); >+ } >+ >+ /** >+ * @see IEditorPart#doSaveAs() >+ */ >+ public void doSaveAs() { >+ } >+ >+ /** >+ * @see IEditorPart#getEditorInput() >+ */ >+ public IEditorInput getEditorInput() { >+ return input; >+ } >+ >+ /** >+ * @see IEditorPart#getEditorSite() >+ */ >+ public IEditorSite getEditorSite() { >+ return (IEditorSite) getSite(); >+ } >+ >+ /** >+ * @see IEditorPart#init(IEditorSite, IEditorInput) >+ */ >+ public void init(IEditorSite site, IEditorInput input) >+ throws PartInitException { >+ this.input = input; >+ setSite(site); >+ callTrace.add("init"); >+ setSiteInitialized(); >+ } >+ >+ /** >+ * @see IEditorPart#isDirty() >+ */ >+ public boolean isDirty() { >+ callTrace.add("isDirty"); >+ return dirty; >+ } >+ >+ public void setDirty(boolean value) { >+ dirty = value; >+ firePropertyChange(PROP_DIRTY); >+ } >+ >+ /** >+ * @see IEditorPart#isSaveAsAllowed() >+ */ >+ public boolean isSaveAsAllowed() { >+ callTrace.add("isSaveAsAllowed"); >+ return saveAsAllowed; >+ } >+ >+ /** >+ * @see IEditorPart#isSaveOnCloseNeeded() >+ */ >+ public boolean isSaveOnCloseNeeded() { >+ callTrace.add("isSaveOnCloseNeeded"); >+ return saveNeeded; >+ } >+ >+ public void setSaveAsAllowed(boolean isSaveAsAllowed) { >+ this.saveAsAllowed = isSaveAsAllowed; >+ } >+ >+ public void setSaveNeeded(boolean value) { >+ saveNeeded = value; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.ui.tests.api.MockWorkbenchPart#getActionBars() >+ */ >+ protected IActionBars getActionBars() { >+ return getEditorSite().getActionBars(); >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.ui.IEditorPersistable#restoreState(org.eclipse.ui.IMemento) >+ */ >+ public void restoreState(IMemento memento) { >+ callTrace.add("restoreState"); >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.ui.IPersistable#saveState(org.eclipse.ui.IMemento) >+ */ >+ public void saveState(IMemento memento) { >+ callTrace.add("saveState"); >+ } >+} >Index: Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java >=================================================================== >RCS file: Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java >diff -N Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,67 @@ >+/******************************************************************************* >+ * Copyright (c) 2004, 2006 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 >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ui.tests.session; >+ >+import junit.framework.TestCase; >+ >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IProject; >+import org.eclipse.core.resources.ResourcesPlugin; >+import org.eclipse.ui.IWorkbench; >+import org.eclipse.ui.IWorkbenchPage; >+import org.eclipse.ui.PlatformUI; >+import org.eclipse.ui.part.FileEditorInput; >+import org.eclipse.ui.tests.api.MockEditorWithState; >+import org.eclipse.ui.tests.harness.util.FileUtil; >+ >+/** >+ * A test to verify the persistence of handler state between sessions. >+ * >+ * @since 3.2 >+ */ >+public class EditorWithStateTest extends TestCase { >+ >+ /** >+ * Constructs a new instance of <code>EditorWithStateTest</code>. >+ * >+ * @param testName >+ * The name of the test; may be <code>null</code>. >+ */ >+ public EditorWithStateTest(final String testName) { >+ super(testName); >+ } >+ >+ public void testInitialEditorOpen() throws Exception { >+ final IWorkbench workbench = PlatformUI.getWorkbench(); >+ final IWorkbenchPage page = workbench.getActiveWorkbenchWindow() >+ .getActivePage(); >+ IProject proj = FileUtil.createProject("EditorSessionTest"); >+ IFile file = FileUtil.createFile("state.txt", proj); >+ MockEditorWithState editor = (MockEditorWithState) page.openEditor( >+ new FileEditorInput(file), MockEditorWithState.ID); >+ assertFalse(editor.getCallHistory().contains("saveState")); >+ assertFalse(editor.getCallHistory().contains("restoreState")); >+ } >+ >+ public void testSecondEditorOpen() throws Exception { >+ final IWorkbench workbench = PlatformUI.getWorkbench(); >+ final IWorkbenchPage page = workbench.getActiveWorkbenchWindow() >+ .getActivePage(); >+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject( >+ "EditorSessionTest"); >+ IFile file = project.getFile("state.txt"); >+ MockEditorWithState editor = (MockEditorWithState) page >+ .findEditor(new FileEditorInput(file)); >+ assertNotNull(editor); >+ assertFalse(editor.getCallHistory().contains("saveState")); >+ assertTrue(editor.getCallHistory().contains("restoreState")); >+ } >+}
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 44295
: 53564 |
53629
|
55588
|
62948