diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h index 5e3f0ffa8766bc..49c877948f91d5 100644 --- a/third_party/blink/renderer/core/dom/element_rare_data.h +++ b/third_party/blink/renderer/core/dom/element_rare_data.h @@ -87,8 +87,6 @@ class ElementRareData final : public NodeRareData { void SetShadowRoot(ShadowRoot& shadow_root) { DCHECK(!shadow_root_); shadow_root_ = &shadow_root; - recordreplay::Assert("[RUN-1436-2226] ElementRareData::SetShadowRoot %d", - shadow_root.RecordReplayId()); } NamedNodeMap* AttributeMap() const { return attribute_map_.Get(); } diff --git a/third_party/blink/renderer/core/dom/id_target_observer.cc b/third_party/blink/renderer/core/dom/id_target_observer.cc index 2bd14af61c62ce..040aaa216b6528 100644 --- a/third_party/blink/renderer/core/dom/id_target_observer.cc +++ b/third_party/blink/renderer/core/dom/id_target_observer.cc @@ -32,6 +32,7 @@ namespace blink { IdTargetObserver::IdTargetObserver(IdTargetObserverRegistry& observer_registry, const AtomicString& id) : registry_(&observer_registry), id_(id) { + recordreplay::Assert("[RUN-1436-2286] IdTargetObserver %s", id.Utf8().c_str()); Registry().AddObserver(id_, this); } @@ -45,4 +46,10 @@ void IdTargetObserver::Unregister() { Registry().RemoveObserver(id_, this); } +unsigned IdTargetObserver::GetHash() const { + // WTF::StringHash comments: "The GetHash() functions on StringHash do + // not support null strings". + return id_.IsNull() ? 0 : WTF::StringHash::GetHash(id_); +} + } // namespace blink diff --git a/third_party/blink/renderer/core/dom/id_target_observer.h b/third_party/blink/renderer/core/dom/id_target_observer.h index 048c08a2f8f997..6711fdc387b0f0 100644 --- a/third_party/blink/renderer/core/dom/id_target_observer.h +++ b/third_party/blink/renderer/core/dom/id_target_observer.h @@ -41,6 +41,10 @@ class IdTargetObserver : public GarbageCollected { virtual void IdTargetChanged() = 0; virtual void Unregister(); + // Avoid pointer-based hash by computing hash based on id_ instead. + // TODO: [RUN-1741] Remove this. + unsigned GetHash() const; + protected: IdTargetObserver(IdTargetObserverRegistry&, const AtomicString& id); diff --git a/third_party/blink/renderer/core/dom/id_target_observer_registry.cc b/third_party/blink/renderer/core/dom/id_target_observer_registry.cc index 356b8969e0e764..604f53c9ee9e34 100644 --- a/third_party/blink/renderer/core/dom/id_target_observer_registry.cc +++ b/third_party/blink/renderer/core/dom/id_target_observer_registry.cc @@ -72,6 +72,9 @@ void IdTargetObserverRegistry::NotifyObserversInternal(const AtomicString& id) { HeapVector> copy(*notifying_observers_in_set_); for (const auto& observer : copy) { + recordreplay::Assert( + "[RUN-1436-2286] IdTargetObserverRegistry::NotifyObserversInternal %d %u", + notifying_observers_in_set_->Contains(observer), observer->GetHash()); if (notifying_observers_in_set_->Contains(observer)) observer->IdTargetChanged(); } diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc index 114b440ac5486c..c9ae3d2d112ba9 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc @@ -519,6 +519,12 @@ void LayoutSVGInlineText::ComputeNewScaledFontForStyle( font_description.SetWordSpacing(font_description.WordSpacing() * scaling_factor / zoom); + recordreplay::Assert( + "[RUN-1436-2286] LayoutSVGInlineText::ComputeNewScaledFontForStyle %d", + document.GetStyleEngine().GetFontSelector() + ? document.GetStyleEngine().GetFontSelector()->RecordReplayId() + : -1); + scaled_font = Font(font_description, document.GetStyleEngine().GetFontSelector()); } diff --git a/third_party/blink/renderer/core/svg/svg_element.cc b/third_party/blink/renderer/core/svg/svg_element.cc index 4ba9b911580270..eec9ab7dfadf9c 100644 --- a/third_party/blink/renderer/core/svg/svg_element.cc +++ b/third_party/blink/renderer/core/svg/svg_element.cc @@ -597,6 +597,9 @@ void SVGElement::AddInstance(SVGElement* instance) { DCHECK(!instances.Contains(instance)); instances.insert(instance); + if (recordreplay::IsRecordingOrReplaying("avoid-weak-pointers", + "SVGElement")) + EnsureSVGRareData()->ReplayStrongElementInstances().insert(instance); } void SVGElement::RemoveInstance(SVGElement* instance) { @@ -611,6 +614,9 @@ void SVGElement::RemoveInstance(SVGElement* instance) { SvgRareData()->ElementInstances(); instances.erase(instance); + + if (recordreplay::IsRecordingOrReplaying("avoid-weak-pointers", "SVGElement")) + EnsureSVGRareData()->ReplayStrongElementInstances().erase(instance); } static HeapHashSet>& EmptyInstances() { @@ -1120,6 +1126,9 @@ void SVGElement::InvalidateInstances() { } SvgRareData()->ElementInstances().clear(); + + if (recordreplay::IsRecordingOrReplaying("avoid-weak-pointers", "SVGElement")) + EnsureSVGRareData()->ReplayStrongElementInstances().clear(); } void SVGElement::SetNeedsStyleRecalcForInstances( diff --git a/third_party/blink/renderer/core/svg/svg_element_rare_data.cc b/third_party/blink/renderer/core/svg/svg_element_rare_data.cc index e4d5a5f70b598e..9e1a6ae8f5b88c 100644 --- a/third_party/blink/renderer/core/svg/svg_element_rare_data.cc +++ b/third_party/blink/renderer/core/svg/svg_element_rare_data.cc @@ -70,6 +70,7 @@ void SVGElementRareData::Trace(Visitor* visitor) const { visitor->Trace(corresponding_element_); visitor->Trace(resource_client_); visitor->Trace(smil_animations_); + visitor->Trace(replay_strong_element_instances_); } AffineTransform* SVGElementRareData::AnimateMotionTransform() { diff --git a/third_party/blink/renderer/core/svg/svg_element_rare_data.h b/third_party/blink/renderer/core/svg/svg_element_rare_data.h index 3cd09b71b89ddb..3cddca41514cb2 100644 --- a/third_party/blink/renderer/core/svg/svg_element_rare_data.h +++ b/third_party/blink/renderer/core/svg/svg_element_rare_data.h @@ -58,6 +58,10 @@ class SVGElementRareData final : public GarbageCollected { return element_instances_; } + HeapHashSet>& ReplayStrongElementInstances() { + return replay_strong_element_instances_; + } + bool InstanceUpdatesBlocked() const { return instances_updates_blocked_; } void SetInstanceUpdatesBlocked(bool value) { instances_updates_blocked_ = value; @@ -107,6 +111,7 @@ class SVGElementRareData final : public GarbageCollected { SVGElementSet outgoing_references_; SVGElementSet incoming_references_; HeapHashSet> element_instances_; + HeapHashSet> replay_strong_element_instances_; Member corresponding_element_; Member resource_client_; Member smil_animations_; diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc index a4c9c6fc3ac8c8..66715517409b47 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.cc +++ b/third_party/blink/renderer/core/svg/svg_use_element.cc @@ -584,6 +584,9 @@ bool SVGUseElement::ShadowTreeRebuildPending() const { } void SVGUseElement::InvalidateShadowTree() { + recordreplay::Assert( + "[RUN-1436-2286] SVGUseElement::InvalidateTargetReference A %d %d", + RecordReplayId(), ShadowTreeRebuildPending()); if (ShadowTreeRebuildPending()) return; ScheduleShadowTreeRecreation(); diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable.h b/third_party/blink/renderer/platform/bindings/script_wrappable.h index 9f774053ab120b..82eb83627817f3 100644 --- a/third_party/blink/renderer/platform/bindings/script_wrappable.h +++ b/third_party/blink/renderer/platform/bindings/script_wrappable.h @@ -211,6 +211,10 @@ class PLATFORM_EXPORT ScriptWrappable int RecordReplayId() const { return record_replay_id_; } + // Avoid pointer-based hashes for ScriptWrappable. + // TODO: [RUN-1741] Remove this. + unsigned GetHash() const { return (unsigned)record_replay_id_; } + protected: ScriptWrappable() { record_replay_id_ = recordreplay::NewIdAnyThread("ScriptWrappable"); diff --git a/third_party/blink/renderer/platform/fonts/font.cc b/third_party/blink/renderer/platform/fonts/font.cc index 7b5c0ef5121e16..454ea455a09631 100644 --- a/third_party/blink/renderer/platform/fonts/font.cc +++ b/third_party/blink/renderer/platform/fonts/font.cc @@ -52,6 +52,8 @@ namespace blink { namespace { FontFallbackMap& GetFontFallbackMap(FontSelector* font_selector) { + recordreplay::Assert("[RUN-1436-2286] GetFontFallbackMap %d", + font_selector ? font_selector->RecordReplayId() : -1); if (font_selector) return font_selector->GetFontFallbackMap(); return FontCache::Get().GetFontFallbackMap(); diff --git a/third_party/blink/renderer/platform/fonts/font_fallback_map.cc b/third_party/blink/renderer/platform/fonts/font_fallback_map.cc index 5c113705b51a1a..73abbacb8b7421 100644 --- a/third_party/blink/renderer/platform/fonts/font_fallback_map.cc +++ b/third_party/blink/renderer/platform/fonts/font_fallback_map.cc @@ -41,8 +41,6 @@ void FontFallbackMap::Remove(const FontDescription& font_description) { DCHECK_NE(iter, fallback_list_for_description_.end()); DCHECK(iter->value->IsValid()); DCHECK(iter->value->HasOneRef()); - recordreplay::Assert("[RUN-1436-2260] FontFallbackMap::Remove %s", - font_description.ToString().Utf8().c_str()); fallback_list_for_description_.erase(iter); } @@ -50,7 +48,6 @@ void FontFallbackMap::InvalidateAll() { lock_.AssertAcquired(); for (auto& entry : fallback_list_for_description_) entry.value->MarkInvalid(); - recordreplay::Assert("[RUN-1436-2260] FontFallbackMap::InvalidateAll"); fallback_list_for_description_.clear(); } diff --git a/third_party/blink/renderer/platform/fonts/font_selector.cc b/third_party/blink/renderer/platform/fonts/font_selector.cc index 5719fd1100c7c3..181dcccc6642bc 100644 --- a/third_party/blink/renderer/platform/fonts/font_selector.cc +++ b/third_party/blink/renderer/platform/fonts/font_selector.cc @@ -104,6 +104,8 @@ void FontSelector::Trace(Visitor* visitor) const { } FontFallbackMap& FontSelector::GetFontFallbackMap() { + recordreplay::Assert("[RUN-1436-2286] FontSelector::GetFontFallbackMap %d %d", + record_replay_id_, !!font_fallback_map_); if (!font_fallback_map_) { font_fallback_map_ = MakeGarbageCollected(this); RegisterForInvalidationCallbacks(font_fallback_map_); diff --git a/third_party/blink/renderer/platform/fonts/font_selector.h b/third_party/blink/renderer/platform/fonts/font_selector.h index ff22b4e60e107a..2e7ab7e903e112 100644 --- a/third_party/blink/renderer/platform/fonts/font_selector.h +++ b/third_party/blink/renderer/platform/fonts/font_selector.h @@ -143,7 +143,13 @@ class PLATFORM_EXPORT FontSelector : public FontCacheClient { void Trace(Visitor* visitor) const override; + int RecordReplayId() const { return record_replay_id_; } + protected: + FontSelector() { + record_replay_id_ = recordreplay::NewIdAnyThread("FontSelector"); + } + static AtomicString FamilyNameFromSettings( const GenericFontFamilySettings&, const FontDescription&, @@ -154,6 +160,7 @@ class PLATFORM_EXPORT FontSelector : public FontCacheClient { private: Member font_fallback_map_; + int record_replay_id_ = 0; }; } // namespace blink