WebKit Bugzilla
Attachment 359882 Details for
Bug 193706
: Introduce UndoStep::label() and adopt it in WebKitLegacy and WebKit
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Review feedback & fix GTK build
bug-193706-20190123074832.patch (text/plain), 19.15 KB, created by
Wenson Hsieh
on 2019-01-23 07:48:35 PST
(
hide
)
Description:
Review feedback & fix GTK build
Filename:
MIME Type:
Creator:
Wenson Hsieh
Created:
2019-01-23 07:48:35 PST
Size:
19.15 KB
patch
obsolete
>Subversion Revision: 240329 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 57e0d649a59035050fcfdc710a7c3b8fd1aa6784..4cee1006ef4b19f434a91b9537dee0c85f3364a7 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,35 @@ >+2019-01-23 Wenson Hsieh <wenson_hsieh@apple.com> >+ >+ Introduce UndoStep::label() and adopt it in WebKitLegacy and WebKit >+ https://bugs.webkit.org/show_bug.cgi?id=193706 >+ <rdar://problem/44807048> >+ >+ Reviewed by Ryosuke Niwa. >+ >+ Refactors some existing logic when registering undoable actions, such that we propagate the undoable action's >+ label string instead of the EditAction to the client layer. This will help make handling of CustomUndoStep's >+ undo/redo label simpler, as the client layer won't need to worry about managing an EditAction and undo/redo >+ label simultaneously. There should be no change in behavior. >+ >+ * editing/CompositeEditCommand.cpp: >+ (WebCore::EditCommandComposition::label const): >+ * editing/CompositeEditCommand.h: >+ * editing/CustomUndoStep.cpp: >+ (WebCore::CustomUndoStep::label const): >+ * editing/CustomUndoStep.h: >+ * editing/EditAction.cpp: >+ (WebCore::undoRedoLabel): >+ (WebCore::nameForUndoRedo): Deleted. >+ * editing/EditAction.h: >+ >+ Rename nameForUndoRedo to undoRedoLabel, and remove the WEBCORE_EXPORT since it's no longer needed in WebKit or >+ WebKitLegacy. >+ >+ * editing/UndoStep.h: >+ >+ Add UndoStep::label(). While EditCommandComposition implements this by mapping its EditAction to a >+ localized string, CustomUndoStep implements this by returning the undoable action label provided by script. >+ > 2019-01-22 Wenson Hsieh <wenson_hsieh@apple.com> > > Introduce CustomUndoStep.h and CustomUndoStep.cpp >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 63044153f92110e072a217ecdbf1c1620bb7205e..c35fd15f006af1be9491a6ddfbcf3d0fe44ef59a 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,45 @@ >+2019-01-23 Wenson Hsieh <wenson_hsieh@apple.com> >+ >+ Introduce UndoStep::label() and adopt it in WebKitLegacy and WebKit >+ https://bugs.webkit.org/show_bug.cgi?id=193706 >+ <rdar://problem/44807048> >+ >+ Reviewed by Ryosuke Niwa. >+ >+ * UIProcess/Cocoa/WebViewImpl.mm: >+ (WebKit::WebViewImpl::registerEditCommand): >+ * UIProcess/WebEditCommandProxy.cpp: >+ (WebKit::WebEditCommandProxy::WebEditCommandProxy): >+ * UIProcess/WebEditCommandProxy.h: >+ >+ Drive-by tweak: make WebEditCommandProxy's backpointer to its WebPageProxy a WeakPtr instead of a raw pointer. >+ Additionally, call clear() instead of setting m_page to 0 upon invalidation. Also, turn the WebPageProxy* >+ argument into a WebPageProxy&, since the WebPageProxy must exist when it creates a new WebEditCommandProxy. >+ >+ (WebKit::WebEditCommandProxy::create): >+ (WebKit::WebEditCommandProxy::label const): >+ (WebKit::WebEditCommandProxy::invalidate): >+ (WebKit::WebEditCommandProxy::editAction const): Deleted. >+ >+ Adjust UI-side logic to just handle the undo/redo label, rather than map the edit action to a localized string. >+ >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::WebPageProxy::registerEditCommandForUndo): >+ (WebKit::WebPageProxy::resetState): >+ >+ Tweak this to use std::exchange instead of copying all the WebEditCommandProxy RefPtrs into a separate Vector >+ and then iterating over the Vector. >+ >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebPageProxy.messages.in: >+ >+ Adjust this so that we only send the undo/redo label over IPC, rather than the edit action type. >+ >+ * UIProcess/ios/PageClientImplIOS.mm: >+ (WebKit::PageClientImpl::registerEditCommand): >+ * WebProcess/WebCoreSupport/WebEditorClient.cpp: >+ (WebKit::WebEditorClient::registerUndoStep): >+ > 2019-01-22 Chris Dumez <cdumez@apple.com> > > Regression(r240178) Some API tests are crashing >diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog >index c07f40f2bab5d891fff387682a54aa719957d225..00717e074497024a1f376ef2c8c577c41884aa5d 100644 >--- a/Source/WebKitLegacy/mac/ChangeLog >+++ b/Source/WebKitLegacy/mac/ChangeLog >@@ -1,3 +1,21 @@ >+2019-01-23 Wenson Hsieh <wenson_hsieh@apple.com> >+ >+ Introduce UndoStep::label() and adopt it in WebKitLegacy and WebKit >+ https://bugs.webkit.org/show_bug.cgi?id=193706 >+ <rdar://problem/44807048> >+ >+ Reviewed by Ryosuke Niwa. >+ >+ Use UndoStep::label(). >+ >+ * WebCoreSupport/WebEditorClient.h: >+ * WebCoreSupport/WebEditorClient.mm: >+ (-[WebUndoStep initWithUndoStep:]): >+ (+[WebUndoStep stepWithUndoStep:]): >+ (WebEditorClient::registerUndoOrRedoStep): >+ (WebEditorClient::registerUndoStep): >+ (WebEditorClient::registerRedoStep): >+ > 2019-01-22 Alex Christensen <achristensen@webkit.org> > > Move NetworkStorageSession ownership to NetworkProcess >diff --git a/Source/WebCore/editing/CompositeEditCommand.cpp b/Source/WebCore/editing/CompositeEditCommand.cpp >index 242bd985cf620e4326f572cfb94594564dd5f9c5..91d8af180a4e311ac361b33baeb91c2400b11413 100644 >--- a/Source/WebCore/editing/CompositeEditCommand.cpp >+++ b/Source/WebCore/editing/CompositeEditCommand.cpp >@@ -302,6 +302,11 @@ void EditCommandComposition::getNodesInCommand(HashSet<Node*>& nodes) > } > #endif > >+String EditCommandComposition::label() const >+{ >+ return undoRedoLabel(m_editAction); >+} >+ > CompositeEditCommand::CompositeEditCommand(Document& document, EditAction editingAction) > : EditCommand(document, editingAction) > { >diff --git a/Source/WebCore/editing/CompositeEditCommand.h b/Source/WebCore/editing/CompositeEditCommand.h >index 2da520fdc4649292dc7bfca20b7d11b118c5da1c..ff1e61c6ee4597f0ad5eba29b9bd48ac60c94fbb 100644 >--- a/Source/WebCore/editing/CompositeEditCommand.h >+++ b/Source/WebCore/editing/CompositeEditCommand.h >@@ -88,6 +88,8 @@ public: > private: > EditCommandComposition(Document&, const VisibleSelection& startingSelection, const VisibleSelection& endingSelection, EditAction); > >+ String label() const final; >+ > RefPtr<Document> m_document; > VisibleSelection m_startingSelection; > VisibleSelection m_endingSelection; >diff --git a/Source/WebCore/editing/CustomUndoStep.cpp b/Source/WebCore/editing/CustomUndoStep.cpp >index 917f2aab75a68f19c24dd8cc625a69ecf3b3fb6b..06807522642228727686cbcddde7e272fd00d20a 100644 >--- a/Source/WebCore/editing/CustomUndoStep.cpp >+++ b/Source/WebCore/editing/CustomUndoStep.cpp >@@ -65,4 +65,13 @@ bool CustomUndoStep::isValid() const > return m_undoItem && m_undoItem->isValid(); > } > >+String CustomUndoStep::label() const >+{ >+ if (!isValid()) { >+ ASSERT_NOT_REACHED(); >+ return emptyString(); >+ } >+ return m_undoItem->label(); >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/editing/CustomUndoStep.h b/Source/WebCore/editing/CustomUndoStep.h >index fbce4543623125acc5f8d79660c9ed71c67f8294..d9ead13a4a727cbfbbb80b731fb44cd010bf4cde 100644 >--- a/Source/WebCore/editing/CustomUndoStep.h >+++ b/Source/WebCore/editing/CustomUndoStep.h >@@ -47,6 +47,7 @@ private: > void unapply() final; > void reapply() final; > EditAction editingAction() const final { return EditAction::Unspecified; } >+ String label() const final; > > bool isValid() const; > >diff --git a/Source/WebCore/editing/EditAction.cpp b/Source/WebCore/editing/EditAction.cpp >index 4125e35078f25a6edcf8e1d6899475474e962e3a..31d216f1d041fef3ce3d4f4f61b1d823206de7da 100644 >--- a/Source/WebCore/editing/EditAction.cpp >+++ b/Source/WebCore/editing/EditAction.cpp >@@ -30,7 +30,7 @@ > > namespace WebCore { > >-String nameForUndoRedo(EditAction editAction) >+String undoRedoLabel(EditAction editAction) > { > switch (editAction) { > case EditAction::Unspecified: >diff --git a/Source/WebCore/editing/EditAction.h b/Source/WebCore/editing/EditAction.h >index b6c45daf846a649e02e2945c12c8bcfead60b76d..17e8be976c5c9cd383bf1f500fcd5691f36e81b9 100644 >--- a/Source/WebCore/editing/EditAction.h >+++ b/Source/WebCore/editing/EditAction.h >@@ -95,6 +95,6 @@ enum class EditAction : uint8_t { > InsertEditableImage > }; > >-WEBCORE_EXPORT WTF::String nameForUndoRedo(EditAction); >+WTF::String undoRedoLabel(EditAction); > > } // namespace WebCore >diff --git a/Source/WebCore/editing/UndoStep.h b/Source/WebCore/editing/UndoStep.h >index 00c1700107b2cc79cc132679d898d705ba787e78..05009cb575501b5ec2d5e82645f81eb8366a8442 100644 >--- a/Source/WebCore/editing/UndoStep.h >+++ b/Source/WebCore/editing/UndoStep.h >@@ -32,6 +32,7 @@ > > #include "EditAction.h" > #include <wtf/RefCounted.h> >+#include <wtf/text/WTFString.h> > > namespace WebCore { > >@@ -42,6 +43,7 @@ public: > virtual void unapply() = 0; > virtual void reapply() = 0; > virtual EditAction editingAction() const = 0; >+ virtual String label() const = 0; > }; > > } // namespace WebCore >diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >index 064e0dfd90ff6bb9ddc3ab442ec8cda69aa2d96d..d8fcc8c7b9707c41f6e71a59eef1b4988c0df0e5 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >+++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm >@@ -2692,7 +2692,7 @@ void WebViewImpl::executeEditCommandForSelector(SEL selector, const String& argu > > void WebViewImpl::registerEditCommand(Ref<WebEditCommandProxy>&& command, UndoOrRedo undoOrRedo) > { >- auto actionName = WebCore::nameForUndoRedo(command->editAction()); >+ auto actionName = command->label(); > auto commandObjC = adoptNS([[WKEditCommand alloc] initWithWebEditCommandProxy:WTFMove(command)]); > > NSUndoManager *undoManager = [m_view undoManager]; >diff --git a/Source/WebKit/UIProcess/WebEditCommandProxy.cpp b/Source/WebKit/UIProcess/WebEditCommandProxy.cpp >index 9f83e3c19d86c9f2353a7e957610a1ea5d8584b2..0e64bd70886cba9c94bc999d2ab5b66ebdf849ab 100644 >--- a/Source/WebKit/UIProcess/WebEditCommandProxy.cpp >+++ b/Source/WebKit/UIProcess/WebEditCommandProxy.cpp >@@ -36,10 +36,10 @@ > namespace WebKit { > using namespace WebCore; > >-WebEditCommandProxy::WebEditCommandProxy(WebUndoStepID commandID, WebCore::EditAction editAction, WebPageProxy* page) >+WebEditCommandProxy::WebEditCommandProxy(WebUndoStepID commandID, const String& label, WebPageProxy& page) > : m_commandID(commandID) >- , m_editAction(editAction) >- , m_page(page) >+ , m_label(label) >+ , m_page(makeWeakPtr(page)) > { > m_page->addEditCommand(*this); > } >diff --git a/Source/WebKit/UIProcess/WebEditCommandProxy.h b/Source/WebKit/UIProcess/WebEditCommandProxy.h >index 716cb58f403dd823196f8642f75f4df3d71aa8ca..d1a14a9aec366e37378f68c0c57ee78b19af53b9 100644 >--- a/Source/WebKit/UIProcess/WebEditCommandProxy.h >+++ b/Source/WebKit/UIProcess/WebEditCommandProxy.h >@@ -31,6 +31,8 @@ > #include <wtf/Forward.h> > #include <wtf/RefCounted.h> > #include <wtf/RefPtr.h> >+#include <wtf/WeakPtr.h> >+#include <wtf/text/WTFString.h> > > namespace WebKit { > >@@ -38,26 +40,26 @@ class WebPageProxy; > > class WebEditCommandProxy : public API::ObjectImpl<API::Object::Type::EditCommandProxy> { > public: >- static Ref<WebEditCommandProxy> create(WebUndoStepID commandID, WebCore::EditAction editAction, WebPageProxy* page) >+ static Ref<WebEditCommandProxy> create(WebUndoStepID commandID, const String& label, WebPageProxy& page) > { >- return adoptRef(*new WebEditCommandProxy(commandID, editAction, page)); >+ return adoptRef(*new WebEditCommandProxy(commandID, label, page)); > } > ~WebEditCommandProxy(); > > WebUndoStepID commandID() const { return m_commandID; } >- WebCore::EditAction editAction() const { return m_editAction; } >+ String label() const { return m_label; } > >- void invalidate() { m_page = 0; } >+ void invalidate() { m_page.clear(); } > > void unapply(); > void reapply(); > > private: >- WebEditCommandProxy(WebUndoStepID commandID, WebCore::EditAction, WebPageProxy*); >+ WebEditCommandProxy(WebUndoStepID commandID, const String& label, WebPageProxy&); > > WebUndoStepID m_commandID; >- WebCore::EditAction m_editAction; >- WebPageProxy* m_page; >+ String m_label; >+ WeakPtr<WebPageProxy> m_page; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index e74f38dc59b400d4026e2cad3c659e0525b43c9a..e4449f866cde3c17281566c94ef5c2a8e3491886 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -5439,9 +5439,9 @@ void WebPageProxy::compositionWasCanceled() > > // Undo management > >-void WebPageProxy::registerEditCommandForUndo(WebUndoStepID commandID, uint32_t editAction) >+void WebPageProxy::registerEditCommandForUndo(WebUndoStepID commandID, const String& label) > { >- registerEditCommand(WebEditCommandProxy::create(commandID, static_cast<EditAction>(editAction), this), UndoOrRedo::Undo); >+ registerEditCommand(WebEditCommandProxy::create(commandID, label, *this), UndoOrRedo::Undo); > } > > void WebPageProxy::registerInsertionUndoGrouping() >@@ -6652,10 +6652,7 @@ void WebPageProxy::resetState(ResetStateReason resetStateReason) > m_callbacks.invalidate(error); > m_loadDependentStringCallbackIDs.clear(); > >- auto editCommandVector = copyToVector(m_editCommandSet); >- m_editCommandSet.clear(); >- >- for (auto& editCommand : editCommandVector) >+ for (auto& editCommand : std::exchange(m_editCommandSet, { })) > editCommand->invalidate(); > > m_activePopupMenu = nullptr; >diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h >index ac5600f62acc6a36ed30e02a9fd724301be0bf4c..ad7d7dc9282e357f30ef24e289a113da63201d92 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.h >+++ b/Source/WebKit/UIProcess/WebPageProxy.h >@@ -1644,7 +1644,7 @@ private: > void backForwardClear(); > > // Undo management >- void registerEditCommandForUndo(WebUndoStepID commandID, uint32_t editAction); >+ void registerEditCommandForUndo(WebUndoStepID commandID, const String& label); > void registerInsertionUndoGrouping(); > void clearAllEditCommands(); > void canUndoRedo(UndoOrRedo, bool& result); >diff --git a/Source/WebKit/UIProcess/WebPageProxy.messages.in b/Source/WebKit/UIProcess/WebPageProxy.messages.in >index 389a32bda14cd01db4c4b99cc24c694d1c1a5d9f..6c35cb411236a138a5c6071707f3c40165050b5e 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.messages.in >+++ b/Source/WebKit/UIProcess/WebPageProxy.messages.in >@@ -233,7 +233,7 @@ messages -> WebPageProxy { > WillGoToBackForwardListItem(struct WebCore::BackForwardItemIdentifier itemID, bool inPageCache) > > # Undo/Redo messages >- RegisterEditCommandForUndo(uint64_t commandID, uint32_t editAction) >+ RegisterEditCommandForUndo(uint64_t commandID, String label) > ClearAllEditCommands() > RegisterInsertionUndoGrouping() > CanUndoRedo(enum:bool WebKit::UndoOrRedo undoOrRedo) -> (bool result) LegacySync >diff --git a/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm b/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm >index 71ea6b8ffe7bbad929d680a4e853f01d0c8c3de1..f2304ac7293f0d825d5583429ade1c05fa3703e1 100644 >--- a/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm >+++ b/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm >@@ -267,7 +267,7 @@ void PageClientImpl::didChangeViewportProperties(const ViewportAttributes&) > > void PageClientImpl::registerEditCommand(Ref<WebEditCommandProxy>&& command, UndoOrRedo undoOrRedo) > { >- auto actionName = WebCore::nameForUndoRedo(command->editAction()); >+ auto actionName = command->label(); > auto commandObjC = adoptNS([[WKEditCommand alloc] initWithWebEditCommandProxy:WTFMove(command)]); > > NSUndoManager *undoManager = [m_contentView undoManager]; >diff --git a/Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp b/Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp >index 0094e356d514b877db1f30b6a68ed2d73c9f1357..8f2181bebf181c3dcd787fb4b9fbd620c9d00d7f 100644 >--- a/Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp >+++ b/Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp >@@ -311,10 +311,9 @@ void WebEditorClient::registerUndoStep(UndoStep& step) > > auto webStep = WebUndoStep::create(step); > auto stepID = webStep->stepID(); >- auto editAction = static_cast<uint32_t>(webStep->step().editingAction()); > > m_page->addWebUndoStep(stepID, WTFMove(webStep)); >- m_page->send(Messages::WebPageProxy::RegisterEditCommandForUndo(stepID, editAction), m_page->pageID(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); >+ m_page->send(Messages::WebPageProxy::RegisterEditCommandForUndo(stepID, step.label()), m_page->pageID(), IPC::SendOption::DispatchMessageEvenWhenWaitingForSyncReply); > } > > void WebEditorClient::registerRedoStep(UndoStep&) >diff --git a/Source/WebKitLegacy/mac/WebCoreSupport/WebEditorClient.mm b/Source/WebKitLegacy/mac/WebCoreSupport/WebEditorClient.mm >index ccc33f940fbc9e631fdd98d2ea16b97e156bd0b3..c35233ed12197972a5a4c4617516a4c865af6ea1 100644 >--- a/Source/WebKitLegacy/mac/WebCoreSupport/WebEditorClient.mm >+++ b/Source/WebKitLegacy/mac/WebCoreSupport/WebEditorClient.mm >@@ -125,7 +125,7 @@ @interface WebUndoStep : NSObject > RefPtr<UndoStep> m_step; > } > >-+ (WebUndoStep *)stepWithUndoStep:(UndoStep&)step; >++ (WebUndoStep *)stepWithUndoStep:(Ref<UndoStep>&&)step; > - (UndoStep&)step; > > @end >@@ -141,12 +141,12 @@ + (void)initialize > #endif > } > >-- (id)initWithUndoStep:(UndoStep&)step >+- (id)initWithUndoStep:(Ref<UndoStep>&&)step > { > self = [super init]; > if (!self) > return nil; >- m_step = &step; >+ m_step = WTFMove(step); > return self; > } > >@@ -158,9 +158,9 @@ - (void)dealloc > [super dealloc]; > } > >-+ (WebUndoStep *)stepWithUndoStep:(UndoStep&)step >++ (WebUndoStep *)stepWithUndoStep:(Ref<UndoStep>&&)step > { >- return [[[WebUndoStep alloc] initWithUndoStep:step] autorelease]; >+ return [[[WebUndoStep alloc] initWithUndoStep:WTFMove(step)] autorelease]; > } > > - (UndoStep&)step >@@ -601,9 +601,8 @@ void WebEditorClient::registerUndoOrRedoStep(UndoStep& step, bool isRedo) > return; > #endif > >- NSString *actionName = WebCore::nameForUndoRedo(step.editingAction()); >- WebUndoStep *webEntry = [WebUndoStep stepWithUndoStep:step]; >- [undoManager registerUndoWithTarget:m_undoTarget.get() selector:(isRedo ? @selector(redoEditing:) : @selector(undoEditing:)) object:webEntry]; >+ NSString *actionName = step.label(); >+ [undoManager registerUndoWithTarget:m_undoTarget.get() selector:(isRedo ? @selector(redoEditing:) : @selector(undoEditing:)) object:[WebUndoStep stepWithUndoStep:step]]; > if (actionName) > [undoManager setActionName:actionName]; > m_haveUndoRedoOperations = YES; >@@ -629,14 +628,14 @@ void WebEditorClient::updateEditorStateAfterLayoutIfEditabilityChanged() > [m_webView updateTouchBar]; > } > >-void WebEditorClient::registerUndoStep(UndoStep& cmd) >+void WebEditorClient::registerUndoStep(UndoStep& command) > { >- registerUndoOrRedoStep(cmd, false); >+ registerUndoOrRedoStep(command, false); > } > >-void WebEditorClient::registerRedoStep(UndoStep& cmd) >+void WebEditorClient::registerRedoStep(UndoStep& command) > { >- registerUndoOrRedoStep(cmd, true); >+ registerUndoOrRedoStep(command, true); > } > > void WebEditorClient::clearUndoRedoOperations()
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
|
Formatted Diff
|
Diff
Attachments on
bug 193706
:
359856
|
359857
| 359882