fix: backport patch for leaking HTML5 video elements (#19347)

This commit is contained in:
Samuel Attard
2019-07-19 15:19:23 -07:00
committed by GitHub
parent 36ea114ac0
commit 0b0f7ed7dc
11 changed files with 186 additions and 37 deletions

View File

@@ -110,3 +110,4 @@ fire_caret_location_change_when_focus_moves_from_ui_to_content.patch
do_not_show_virtual_keyboard_for_all_mouse_inputs.patch
setup_the_observer_before_calling_displayvirtualkeyboard.patch
workaround_apparent_data_corruption_in_blockfile_on_os_x_10_14_by.patch
mediacontrols_disconnect_observers_when_controls_are_hidden.patch

View File

@@ -29,7 +29,7 @@ diff --git a/content/browser/renderer_host/browser_compositor_view_mac.mm b/cont
index 92afcc77910610e53378f55adc003cc1bdf3109a..42bd6fd7c169de36c775471c68b456f1386ff666 100644
--- a/content/browser/renderer_host/browser_compositor_view_mac.mm
+++ b/content/browser/renderer_host/browser_compositor_view_mac.mm
@@ -81,6 +81,12 @@ BrowserCompositorMac::~BrowserCompositorMac() {
@@ -81,6 +81,12 @@
DCHECK_EQ(1u, num_erased);
}

View File

@@ -22,7 +22,7 @@ diff --git a/third_party/crashpad/crashpad/util/net/http_transport_mac.mm b/thir
index 8d5f78cc6efc8b8e349958f51c78921a8c163c4e..a433bb357da5865144ade7d3663b1c9b36199f8e 100644
--- a/third_party/crashpad/crashpad/util/net/http_transport_mac.mm
+++ b/third_party/crashpad/crashpad/util/net/http_transport_mac.mm
@@ -293,7 +293,7 @@ bool HTTPTransportMac::ExecuteSynchronously(std::string* response_body) {
@@ -293,7 +293,7 @@ static void Unschedule(CFReadStreamRef stream,
return false;
}
NSInteger http_status = [http_response statusCode];

View File

@@ -56,7 +56,7 @@ diff --git a/services/service_manager/sandbox/mac/sandbox_mac.mm b/services/serv
index d69fcc0d4c5c2471163280c03a9fd9366e05031d..cdd7b7f6723162d6875c4d11379837708bdde79d 100644
--- a/services/service_manager/sandbox/mac/sandbox_mac.mm
+++ b/services/service_manager/sandbox/mac/sandbox_mac.mm
@@ -81,6 +81,21 @@ static_assert(arraysize(kDefaultSandboxTypeToResourceIDMapping) ==
@@ -81,6 +81,21 @@
size_t(SANDBOX_TYPE_AFTER_LAST_TYPE),
"sandbox type to resource id mapping incorrect");
@@ -78,7 +78,7 @@ index d69fcc0d4c5c2471163280c03a9fd9366e05031d..cdd7b7f6723162d6875c4d1137983770
} // namespace
// Static variable declarations.
@@ -242,6 +257,9 @@ bool SandboxMac::Enable(SandboxType sandbox_type) {
@@ -242,6 +257,9 @@
if (!compiler.InsertBooleanParam(kSandboxMacOS1013, macos_1013))
return false;

View File

@@ -9,7 +9,7 @@ diff --git a/base/mac/foundation_util.mm b/base/mac/foundation_util.mm
index 15fc15ba307e18f438852f00f41b2f5ecf7ff85f..7ca4e0ec5ca87f34e0baa22ba0b704e25fe7ca21 100644
--- a/base/mac/foundation_util.mm
+++ b/base/mac/foundation_util.mm
@@ -26,7 +26,6 @@ CFTypeID SecKeyGetTypeID();
@@ -26,7 +26,6 @@
#if !defined(OS_IOS)
CFTypeID SecACLGetTypeID();
CFTypeID SecTrustedApplicationGetTypeID();
@@ -17,7 +17,7 @@ index 15fc15ba307e18f438852f00f41b2f5ecf7ff85f..7ca4e0ec5ca87f34e0baa22ba0b704e2
#endif
} // extern "C"
@@ -325,8 +324,7 @@ NSFont* CFToNSCast(CTFontRef cf_val) {
@@ -325,8 +324,7 @@ void SetBaseBundleID(const char* new_base_bundle_id) {
const_cast<NSFont*>(reinterpret_cast<const NSFont*>(cf_val));
DCHECK(!cf_val ||
CTFontGetTypeID() == CFGetTypeID(cf_val) ||
@@ -27,7 +27,7 @@ index 15fc15ba307e18f438852f00f41b2f5ecf7ff85f..7ca4e0ec5ca87f34e0baa22ba0b704e2
return ns_val;
}
@@ -394,9 +392,6 @@ CFCast<CTFontRef>(const CFTypeRef& cf_val) {
@@ -394,9 +392,6 @@ CTFontRef NSToCFCast(NSFont* ns_val) {
return (CTFontRef)(cf_val);
}

View File

@@ -18,7 +18,7 @@ index 94afefcee81b87c05bf9b1199d90d3d4b5ea84a6..2ec7f04c71824b47de1ddbf1f0e8625d
extern "C" {
// Kill ring calls. Would be better to use NSKillRing.h, but that's not
@@ -39,38 +40,53 @@ NSString* _NSYankFromKillRing();
@@ -39,38 +40,53 @@
void _NSNewKillRingSequence();
void _NSSetKillRingToYankedState();
}
@@ -92,7 +92,7 @@ index 7a1260db0a139f9f3f8a823af2c220f36162812a..bf9cf7046e2fc9cdfee5b92f2a348185
namespace blink {
@@ -73,10 +75,12 @@ bool ThemePainterMac::PaintTextField(const Node* node,
@@ -73,10 +75,12 @@ void _NSDrawCarbonThemeListBox(NSRect frame,
// behavior change while remaining a fragile solution.
// https://bugs.chromium.org/p/chromium/issues/detail?id=658085#c3
if (!use_ns_text_field_cell) {
@@ -105,7 +105,7 @@ index 7a1260db0a139f9f3f8a823af2c220f36162812a..bf9cf7046e2fc9cdfee5b92f2a348185
return false;
}
@@ -162,10 +166,12 @@ bool ThemePainterMac::PaintTextArea(const Node* node,
@@ -162,10 +166,12 @@ void _NSDrawCarbonThemeListBox(NSRect frame,
const PaintInfo& paint_info,
const IntRect& r) {
LocalCurrentGraphicsContext local_context(paint_info.context, r);

View File

@@ -41,7 +41,7 @@ diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/cont
index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518325ef70a 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -135,6 +135,7 @@ NSDictionary* attributeToMethodNameMap = nil;
@@ -135,6 +135,7 @@
// VoiceOver uses -1 to mean "no limit" for AXResultsLimit.
const int kAXResultsLimitNoLimit = -1;
@@ -49,7 +49,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
extern "C" {
// The following are private accessibility APIs required for cursor navigation
@@ -341,6 +342,7 @@ NSAttributedString* GetAttributedTextForTextMarkerRange(
@@ -341,6 +342,7 @@ void AddMisspelledTextAttributes(
AddMisspelledTextAttributes(text_only_objects, attributed_text);
return [attributed_text attributedSubstringFromRange:range];
}
@@ -57,7 +57,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
// Returns an autoreleased copy of the AXNodeData's attribute.
NSString* NSStringForStringAttribute(
@@ -595,7 +597,9 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -595,7 +597,9 @@ + (void)initialize {
{NSAccessibilityDOMIdentifierAttribute, @"domIdentifier"},
{NSAccessibilityEditableAncestorAttribute, @"editableAncestor"},
{NSAccessibilityEnabledAttribute, @"enabled"},
@@ -67,7 +67,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
{NSAccessibilityExpandedAttribute, @"expanded"},
{NSAccessibilityFocusableAncestorAttribute, @"focusableAncestor"},
{NSAccessibilityFocusedAttribute, @"focused"},
@@ -630,13 +634,17 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -630,13 +634,17 @@ + (void)initialize {
{NSAccessibilityRowsAttribute, @"rows"},
// TODO(aboxhall): expose
// NSAccessibilityServesAsTitleForUIElementsAttribute
@@ -85,7 +85,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
{NSAccessibilitySizeAttribute, @"size"},
{NSAccessibilitySortDirectionAttribute, @"sortDirection"},
{NSAccessibilitySubroleAttribute, @"subrole"},
@@ -1114,6 +1122,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -1114,6 +1122,7 @@ - (NSNumber*)enabled {
ax::mojom::Restriction::kDisabled];
}
@@ -93,7 +93,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
// Returns a text marker that points to the last character in the document that
// can be selected with VoiceOver.
- (id)endTextMarker {
@@ -1124,6 +1133,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -1124,6 +1133,7 @@ - (id)endTextMarker {
BrowserAccessibilityPositionInstance position = root->CreatePositionAt(0);
return CreateTextMarker(position->CreatePositionAtEndOfAnchor());
}
@@ -101,7 +101,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
- (NSNumber*)expanded {
if (![self instanceActive])
@@ -2029,6 +2039,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2029,6 +2039,7 @@ - (NSValue*)selectedTextRange {
return [NSValue valueWithRange:NSMakeRange(selStart, selLength)];
}
@@ -109,7 +109,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
- (id)selectedTextMarkerRange {
if (![self instanceActive])
return nil;
@@ -2061,6 +2072,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2061,6 +2072,7 @@ - (id)selectedTextMarkerRange {
anchorAffinity, *focusObject,
focusOffset, focusAffinity));
}
@@ -117,7 +117,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
- (NSValue*)size {
if (![self instanceActive])
@@ -2093,6 +2105,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2093,6 +2105,7 @@ - (NSString*)sortDirection {
return nil;
}
@@ -125,7 +125,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
// Returns a text marker that points to the first character in the document that
// can be selected with VoiceOver.
- (id)startTextMarker {
@@ -2103,6 +2116,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2103,6 +2116,7 @@ - (id)startTextMarker {
BrowserAccessibilityPositionInstance position = root->CreatePositionAt(0);
return CreateTextMarker(position->CreatePositionAtStartOfAnchor());
}
@@ -133,7 +133,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
// Returns a subrole based upon the role.
- (NSString*) subrole {
@@ -2405,12 +2419,14 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2405,12 +2419,14 @@ - (NSAttributedString*)attributedValueForRange:(NSRange)range {
NSMutableAttributedString* attributedValue =
[[[NSMutableAttributedString alloc] initWithString:value] autorelease];
@@ -148,7 +148,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
return [attributedValue attributedSubstringFromRange:range];
}
@@ -2527,6 +2543,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2527,6 +2543,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute
return nil;
}
@@ -156,7 +156,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
if ([attribute isEqualToString:@"AXUIElementForTextMarker"]) {
BrowserAccessibilityPositionInstance position =
CreatePositionFromTextMarker(parameter);
@@ -2704,6 +2721,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2704,6 +2721,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute
NSString* text = GetTextForTextMarkerRange(parameter);
return [NSNumber numberWithInt:[text length]];
}
@@ -164,7 +164,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
if ([attribute isEqualToString:
NSAccessibilityBoundsForRangeParameterizedAttribute]) {
@@ -2741,6 +2759,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2741,6 +2759,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute
return nil;
}
@@ -172,7 +172,7 @@ index 07e9862b76a920438a779f22d67d3a45ab39abf7..efa52aa9de2f819f28109978c8cef518
if ([attribute isEqualToString:
NSAccessibilityLineTextMarkerRangeForTextMarkerParameterizedAttribute]) {
BrowserAccessibilityPositionInstance position =
@@ -2820,6 +2839,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
@@ -2820,6 +2839,7 @@ AXPlatformRange range(position->CreatePreviousLineStartPosition(
return @(child->GetIndexInParent());
}
@@ -184,7 +184,7 @@ diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm
index 8e32a08226079c6d7515b8e784babacb3226ecd6..93bb7273684fa529bdc6049af2ed379f8b059397 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -437,6 +437,7 @@ NSDictionary* BrowserAccessibilityManagerMac::
@@ -437,6 +437,7 @@
[user_info setObject:native_focus_object
forKey:NSAccessibilityTextChangeElement];
@@ -192,7 +192,7 @@ index 8e32a08226079c6d7515b8e784babacb3226ecd6..93bb7273684fa529bdc6049af2ed379f
id selected_text = [native_focus_object selectedTextMarkerRange];
if (selected_text) {
NSString* const NSAccessibilitySelectedTextMarkerRangeAttribute =
@@ -444,6 +445,7 @@ NSDictionary* BrowserAccessibilityManagerMac::
@@ -444,6 +445,7 @@
[user_info setObject:selected_text
forKey:NSAccessibilitySelectedTextMarkerRangeAttribute];
}
@@ -220,7 +220,7 @@ index 1e2cc38d3868ceccf8e45f5f82f57bcaa478f982..daa934c345e2686fd2174b7721d0f69a
namespace content {
@@ -38,6 +40,7 @@ namespace {
@@ -38,6 +40,7 @@ void _LSSetApplicationLaunchServicesServerConnectionStatus(
// This disconnects from the window server, and then indicates that Chrome
// should continue execution without access to launchservicesd.
void DisconnectWindowServer() {
@@ -248,7 +248,7 @@ index 8b2092ec78f9f6bc1bd4c8af21ada74538f54d29..4f2ee8e2809790df68aedcee09462631
extern "C" {
// Undocumented IOBluetooth Preference API [1]. Used by `blueutil` [2] and
// `Karabiner` [3] to programmatically control the Bluetooth state. Calling the
@@ -47,6 +48,7 @@ extern "C" {
@@ -47,6 +48,7 @@
// [4] https://support.apple.com/kb/PH25091
void IOBluetoothPreferenceSetControllerPowerState(int state);
}
@@ -256,7 +256,7 @@ index 8b2092ec78f9f6bc1bd4c8af21ada74538f54d29..4f2ee8e2809790df68aedcee09462631
namespace {
@@ -120,8 +122,10 @@ BluetoothAdapterMac::BluetoothAdapterMac()
@@ -120,8 +122,10 @@ CBCentralManagerState GetCBManagerState(CBCentralManager* manager) {
controller_state_function_(
base::BindRepeating(&BluetoothAdapterMac::GetHostControllerState,
base::Unretained(this))),
@@ -267,7 +267,7 @@ index 8b2092ec78f9f6bc1bd4c8af21ada74538f54d29..4f2ee8e2809790df68aedcee09462631
should_update_name_(true),
classic_discovery_manager_(
BluetoothDiscoveryManagerMac::CreateClassic(this)),
@@ -314,8 +318,12 @@ bool BluetoothAdapterMac::IsLowEnergyAvailable() {
@@ -314,8 +318,12 @@ CBCentralManagerState GetCBManagerState(CBCentralManager* manager) {
}
bool BluetoothAdapterMac::SetPoweredImpl(bool powered) {

View File

@@ -0,0 +1,148 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Michael Lippautz <mlippautz@chromium.org>
Date: Wed, 26 Jun 2019 20:21:46 +0000
Subject: MediaControls: Disconnect observers when controls are hidden
Disconnect ResizeObserver from media controls when the controls are
hidden. Otherwise, the obervsers are have pending activities (are
observed) which makes them roots for the object graph, ultimately
keeping elements (including e.g. HTMLVideoElement) and nodes alive.
Bug: 969049
Change-Id: I07a4470170f187631db307188f6cbe0052aa7d8c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1677053
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: Tommy Steimel <steimel@chromium.org>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#672629}
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
index e1f55e00cafbfbca376092e8e332ca68f14954b7..15ab3cbe33da36dffb1ee1cda4031a020362eef0 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.cc
@@ -91,7 +91,7 @@ MediaControlSliderElement::MediaControlSliderElement(
new MediaControlSliderElementResizeObserverDelegate(this))) {
setType(InputTypeNames::range);
setAttribute(HTMLNames::stepAttr, "any");
- resize_observer_->observe(this);
+ OnControlsShown();
}
Element& MediaControlSliderElement::GetTrackElement() {
@@ -172,4 +172,12 @@ void MediaControlSliderElement::Trace(blink::Visitor* visitor) {
MediaControlInputElement::Trace(visitor);
}
+void MediaControlSliderElement::OnControlsShown() {
+ resize_observer_->observe(this);
+}
+
+void MediaControlSliderElement::OnControlsHidden() {
+ resize_observer_->disconnect();
+}
+
} // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
index 8f5a631fa87e5f6ce9c94f8f8eefcd4152df1c1f..228886cfb1f1bbb244350e9c52f247bf41d6dbfc 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_slider_element.h
@@ -33,6 +33,9 @@ class MODULES_EXPORT MediaControlSliderElement
// simplicity; deliberately ignores pinch zoom's pageScaleFactor).
int TrackWidth();
+ void OnControlsShown();
+ void OnControlsHidden();
+
protected:
class MediaControlSliderElementResizeObserverDelegate;
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
index 62ef007e5f6d5bbe3cae8ab7760251256ce57efb..4022da87d0ad39e34f05423990a9df598955ed50 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element.cc
@@ -272,10 +272,12 @@ void MediaControlTimelineElement::OnControlsHidden() {
// End scrubbing state.
is_touching_ = false;
+ MediaControlSliderElement::OnControlsHidden();
}
void MediaControlTimelineElement::OnControlsShown() {
controls_hidden_ = false;
+ MediaControlSliderElement::OnControlsShown();
}
bool MediaControlTimelineElement::EndScrubbingEvent(Event& event) {
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
index 5ca3a5f8314bc67d498b3c1d8306f550223781d3..37321c8331d80899afa632327540fd2199fc0907 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -911,6 +911,8 @@ void MediaControlsImpl::MaybeShow() {
loading_panel_->OnControlsShown();
timeline_->OnControlsShown();
+ if (volume_slider_)
+ volume_slider_->OnControlsShown();
UpdateCSSClassFromState();
UpdateActingAsAudioControls();
}
@@ -936,6 +938,8 @@ void MediaControlsImpl::Hide() {
EndScrubbing();
}
timeline_->OnControlsHidden();
+ if (volume_slider_)
+ volume_slider_->OnControlsHidden();
UpdateCSSClassFromState();
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
index 4bd7baed6c95deccfea6ac1f7c8998ad64c64e05..15a786c21b7f84d12e5ac87705b8ff0f54127765 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
@@ -14,10 +14,12 @@
#include "third_party/blink/public/platform/web_mouse_event.h"
#include "third_party/blink/public/platform/web_screen_info.h"
#include "third_party/blink/public/platform/web_size.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
#include "third_party/blink/renderer/core/css/css_property_value_set.h"
#include "third_party/blink/renderer/core/css/document_style_environment_variables.h"
#include "third_party/blink/renderer/core/css/style_engine.h"
#include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/dom/document_parser.h"
#include "third_party/blink/renderer/core/dom/element_traversal.h"
#include "third_party/blink/renderer/core/dom/events/event.h"
#include "third_party/blink/renderer/core/dom/text.h"
@@ -1159,6 +1161,33 @@ TEST_F(MediaControlsImplTest,
EXPECT_EQ(nullptr, weak_persistent_video);
}
+TEST_F(MediaControlsImplTest,
+ RemovingFromDocumentWhenResettingSrcAllowsReclamation) {
+ // Regression test: https://crbug.com/918064
+ //
+ // Test ensures that unified heap garbage collections are able to collect
+ // detached HTMLVideoElements. The tricky part is that ResizeObserver's are
+ // treated as roots as long as they have observations which prevent the video
+ // element from being collected.
+
+ auto page_holder = std::make_unique<DummyPageHolder>();
+ page_holder->GetDocument().write("<video controls>");
+ page_holder->GetDocument().Parser()->Finish();
+
+ HTMLVideoElement& video =
+ ToHTMLVideoElement(*page_holder->GetDocument().QuerySelector("video"));
+ WeakPersistent<HTMLMediaElement> weak_persistent_video = &video;
+ video.remove();
+
+ test::RunPendingTasks();
+
+ // Needs to call into V8's GC here to trigger a unified garbage collection.
+ V8GCController::CollectAllGarbageForTesting(
+ ThreadState::Current()->GetIsolate(),
+ v8::EmbedderHeapTracer::EmbedderStackState::kEmpty);
+ EXPECT_EQ(nullptr, weak_persistent_video);
+}
+
TEST_F(MediaControlsImplTest,
ReInsertingInDocumentRestoresListenersAndCallbacks) {
auto page_holder = DummyPageHolder::Create();

View File

@@ -20,7 +20,7 @@ index 8b84322baa808f66044361d1033ec63805856227..70d244e01b75f98a6ed580475710d740
// These are not documented, so use only after checking -respondsToSelector:.
@interface NSApplication (UndocumentedSpeechMethods)
- (void)speakString:(NSString*)string;
@@ -354,6 +359,9 @@ void ExtractUnderlines(NSAttributedString* string,
@@ -354,6 +359,9 @@ - (BOOL)acceptsMouseEventsWhenInactive {
}
- (BOOL)acceptsFirstMouse:(NSEvent*)theEvent {
@@ -30,7 +30,7 @@ index 8b84322baa808f66044361d1033ec63805856227..70d244e01b75f98a6ed580475710d740
return [self acceptsMouseEventsWhenInactive];
}
@@ -688,6 +696,10 @@ void ExtractUnderlines(NSAttributedString* string,
@@ -688,6 +696,10 @@ - (void)keyEvent:(NSEvent*)theEvent wasKeyEquivalent:(BOOL)equiv {
eventType == NSKeyDown &&
!(modifierFlags & NSCommandKeyMask);
@@ -41,7 +41,7 @@ index 8b84322baa808f66044361d1033ec63805856227..70d244e01b75f98a6ed580475710d740
// We only handle key down events and just simply forward other events.
if (eventType != NSKeyDown) {
localClient_->ForwardKeyboardEvent(event, latency_info);
@@ -1460,9 +1472,11 @@ void ExtractUnderlines(NSAttributedString* string,
@@ -1460,9 +1472,11 @@ - (id)accessibilityFocusedUIElement {
// Since this implementation doesn't have to wait any IPC calls, this doesn't
// make any key-typing jank. --hbono 7/23/09
//
@@ -53,7 +53,7 @@ index 8b84322baa808f66044361d1033ec63805856227..70d244e01b75f98a6ed580475710d740
- (NSArray*)validAttributesForMarkedText {
// This code is just copied from WebKit except renaming variables.
@@ -1471,7 +1485,10 @@ extern NSString* NSTextInputReplacementRangeAttributeName;
@@ -1471,7 +1485,10 @@ - (NSArray*)validAttributesForMarkedText {
initWithObjects:NSUnderlineStyleAttributeName,
NSUnderlineColorAttributeName,
NSMarkedClauseSegmentAttributeName,

View File

@@ -15,7 +15,7 @@ diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_na
index 8841b59f6b70ac4687adfde61a1fba1424e57e48..cc3659319c4076043a0493798db3c7b8a4afd21e 100644
--- a/ui/views/cocoa/bridged_native_widget.mm
+++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -1039,6 +1039,12 @@ bool BridgedNativeWidget::ShouldRunCustomAnimationFor(
@@ -1039,6 +1039,12 @@ NSUInteger CountBridgedWindows(NSArray* child_windows) {
// BridgedNativeWidget, ui::CATransactionObserver
bool BridgedNativeWidget::ShouldWaitInPreCommit() {

View File

@@ -20,7 +20,7 @@ diff --git a/content/browser/web_contents/web_drag_dest_mac.mm b/content/browser
index cec3bd8a97b8b9bcab176a9bd2c296ec12aba838..7a2b4462bd44176e8e8389499f8c3d5fea647fa0 100644
--- a/content/browser/web_contents/web_drag_dest_mac.mm
+++ b/content/browser/web_contents/web_drag_dest_mac.mm
@@ -348,6 +348,7 @@ GetRenderWidgetHostAtPoint:(const NSPoint&)viewPoint
@@ -348,6 +348,7 @@ - (void)setDragStartTrackersForProcess:(int)processID {
}
- (bool)isValidDragTarget:(content::RenderWidgetHostImpl*)targetRWH {