Bug 1941140 Comment 0 Edit History

Note: The actual edited comment in the bug view page will always show the original commenter’s name and original timestamp.

See bug 1939344 comment 3 -- that bug has a testcase with thousands of `<input>` elements, and when we tear down the document, we waste a bunch of time doing allocation.  Can we optimize the `TextControlState::UnbindFromFrame` cleanup code to avoid doing that?

Profile link:
https://share.firefox.dev/3WhSLqi

In that profile, we're spending 426 samples (roughly 426ms) in this backtrace:
```
malloc [memory/build/malloc_decls.h]
mozilla::StringBuffer::Alloc(unsigned long, mozilla::Maybe<unsigned long>) [mfbt/StringBuffer.h]
nsTSubstring<char>::StartBulkWriteImpl(unsigned long, unsigned long, bool, unsigned long, unsigned long, unsigned long) [xpcom/string/nsTSubstring.cpp]
nsTSubstring<char>::Assign(char const*, unsigned long, std::nothrow_t const&) [xpcom/string/nsTSubstring.cpp]
nsTSubstring<char>::Assign(nsTSubstring<char> const&, std::nothrow_t const&) [xpcom/string/nsTSubstring.cpp]
nsTSubstring<char>::Assign(nsTSubstring<char> const&) [xpcom/string/nsTSubstring.cpp]
nsTString<char>::nsTString(nsTSubstring<char> const&) [xpcom/string/nsTString.h]
nsCStringHashKey::nsCStringHashKey(nsTSubstring<char> const*) [xpcom/ds/nsHashKeys.h]
nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> >::nsBaseHashtableET<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&)::{lambda(PLDHashEntryHdr*)#1}::operator()(PLDHashEntryHdr*) const [xpcom/ds/nsTHashtable.h]
PLDHashTable::EntryHandle::Insert<nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&)::{lambda(PLDHashEntryHdr*)#1}>(nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&)::{lambda(PLDHashEntryHdr*)#1}&&) [xpcom/ds/PLDHashTable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsTHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle::Insert<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle::InsertOrUpdate<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}::operator()<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle>(nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle) const [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}::operator()<nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle>(nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle) const [xpcom/ds/nsBaseHashtable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}::operator()<PLDHashTable::EntryHandle>(PLDHashTable::EntryHandle) const [xpcom/ds/nsTHashtable.h]
PLDHashTable::WithEntryHandle<nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(void const*, nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&) [xpcom/ds/PLDHashTable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&) [xpcom/ds/nsTHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&) [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsControllerCommandTable::RegisterCommand(char const*, nsIControllerCommand*) [dom/commandhandler/nsControllerCommandTable.cpp]
mozilla::EditorController::RegisterEditorCommands(nsControllerCommandTable*) [editor/libeditor/EditorController.cpp]
CreateCommandTableWithCommands(nsresult (*)(nsControllerCommandTable*)) [dom/commandhandler/nsControllerCommandTable.cpp]
nsControllerCommandTable::CreateEditorCommandTable() [dom/commandhandler/nsControllerCommandTable.cpp]
CreateControllerWithSingletonCommandTable(already_AddRefed<nsControllerCommandTable> (*)()) [dom/commandhandler/nsBaseCommandController.cpp]
nsBaseCommandController::CreateEditorController() [dom/commandhandler/nsBaseCommandController.cpp]
mozilla::dom::HTMLInputElement::GetControllers(mozilla::ErrorResult&) [dom/html/HTMLInputElement.cpp]
mozilla::dom::HTMLInputElement::GetControllers(nsIControllers**) [dom/html/HTMLInputElement.cpp]
mozilla::TextControlState::UnbindFromFrame(nsTextControlFrame*) [dom/html/TextControlState.cpp]
nsTextControlFrame::Destroy(mozilla::FrameDestroyContext&) [layout/forms/nsTextControlFrame.cpp]
```
See bug 1939344 comment 3 -- that bug has a testcase with thousands of `<input>` elements, and when we tear down the document, we waste a bunch of time doing allocation.  Can we optimize the `TextControlState::UnbindFromFrame` cleanup code to avoid doing that?

Profile link:
https://share.firefox.dev/3WhSLqi

In that profile, we're spending 426 samples (roughly 426ms) doing allocation while we're destroying stuff, in this backtrace:
```
malloc [memory/build/malloc_decls.h]
mozilla::StringBuffer::Alloc(unsigned long, mozilla::Maybe<unsigned long>) [mfbt/StringBuffer.h]
nsTSubstring<char>::StartBulkWriteImpl(unsigned long, unsigned long, bool, unsigned long, unsigned long, unsigned long) [xpcom/string/nsTSubstring.cpp]
nsTSubstring<char>::Assign(char const*, unsigned long, std::nothrow_t const&) [xpcom/string/nsTSubstring.cpp]
nsTSubstring<char>::Assign(nsTSubstring<char> const&, std::nothrow_t const&) [xpcom/string/nsTSubstring.cpp]
nsTSubstring<char>::Assign(nsTSubstring<char> const&) [xpcom/string/nsTSubstring.cpp]
nsTString<char>::nsTString(nsTSubstring<char> const&) [xpcom/string/nsTString.h]
nsCStringHashKey::nsCStringHashKey(nsTSubstring<char> const*) [xpcom/ds/nsHashKeys.h]
nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> >::nsBaseHashtableET<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&)::{lambda(PLDHashEntryHdr*)#1}::operator()(PLDHashEntryHdr*) const [xpcom/ds/nsTHashtable.h]
PLDHashTable::EntryHandle::Insert<nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&)::{lambda(PLDHashEntryHdr*)#1}>(nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&)::{lambda(PLDHashEntryHdr*)#1}&&) [xpcom/ds/PLDHashTable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle::InsertInternal<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsTHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle::Insert<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle::InsertOrUpdate<nsIControllerCommand*&>(nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}::operator()<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle>(nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::EntryHandle) const [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}::operator()<nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle>(nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::EntryHandle) const [xpcom/ds/nsBaseHashtable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}::operator()<PLDHashTable::EntryHandle>(PLDHashTable::EntryHandle) const [xpcom/ds/nsTHashtable.h]
PLDHashTable::WithEntryHandle<nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(void const*, nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&) [xpcom/ds/PLDHashTable.h]
nsTHashtable<nsBaseHashtableET<nsCStringHashKey, nsCOMPtr<nsIControllerCommand> > >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&)::{lambda(auto:1)#1}&&) [xpcom/ds/nsTHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::WithEntryHandle<nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}>(nsTSubstring<char> const&, nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&)::{lambda(auto:1)#1}&&) [xpcom/ds/nsBaseHashtable.h]
nsBaseHashtable<nsCStringHashKey, nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*, nsDefaultConverter<nsCOMPtr<nsIControllerCommand>, nsIControllerCommand*> >::InsertOrUpdate<nsIControllerCommand*&>(nsTSubstring<char> const&, nsIControllerCommand*&) [xpcom/ds/nsBaseHashtable.h]
nsControllerCommandTable::RegisterCommand(char const*, nsIControllerCommand*) [dom/commandhandler/nsControllerCommandTable.cpp]
mozilla::EditorController::RegisterEditorCommands(nsControllerCommandTable*) [editor/libeditor/EditorController.cpp]
CreateCommandTableWithCommands(nsresult (*)(nsControllerCommandTable*)) [dom/commandhandler/nsControllerCommandTable.cpp]
nsControllerCommandTable::CreateEditorCommandTable() [dom/commandhandler/nsControllerCommandTable.cpp]
CreateControllerWithSingletonCommandTable(already_AddRefed<nsControllerCommandTable> (*)()) [dom/commandhandler/nsBaseCommandController.cpp]
nsBaseCommandController::CreateEditorController() [dom/commandhandler/nsBaseCommandController.cpp]
mozilla::dom::HTMLInputElement::GetControllers(mozilla::ErrorResult&) [dom/html/HTMLInputElement.cpp]
mozilla::dom::HTMLInputElement::GetControllers(nsIControllers**) [dom/html/HTMLInputElement.cpp]
mozilla::TextControlState::UnbindFromFrame(nsTextControlFrame*) [dom/html/TextControlState.cpp]
nsTextControlFrame::Destroy(mozilla::FrameDestroyContext&) [layout/forms/nsTextControlFrame.cpp]
```

Back to Bug 1941140 Comment 0