diff --git a/DEPS b/DEPS index 8e2550a..743d2d5 100644 --- a/DEPS +++ b/DEPS
@@ -44,7 +44,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'f3a8df7a2fa2d17d445da114b882b923091a4373', + 'v8_revision': 'f9533225af1247992cf1d6204cf76bf61c808016', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -64,7 +64,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'd0bbccdd32113baf95ae16565c0314166d989638', + 'pdfium_revision': 'fa05e97fc4d796bd12e21c32634d9614f8edf607', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other.
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index f5f682c..aa20a31a 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -57,6 +57,8 @@ #include "chrome/browser/prerender/prerender_test_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_io_data.h" +#include "chrome/browser/speech/tts_controller.h" +#include "chrome/browser/speech/tts_platform.h" #include "chrome/browser/task_manager/mock_web_contents_task_manager.h" #include "chrome/browser/task_manager/providers/web_contents/web_contents_tags_manager.h" #include "chrome/browser/task_manager/task_manager_browsertest_util.h" @@ -3540,6 +3542,68 @@ "Prerender.none_PerceivedTTFCPRecorded.Hidden", 0, 1); } +// When instantiated, mocks out the global text-to-speech engine with something +// that emulates speaking any phrase for the duration of 0ms. +class TtsPlatformMock : public TtsPlatformImpl { + public: + TtsPlatformMock() : speaking_requested_(false) { + TtsController::GetInstance()->SetPlatformImpl(this); + } + + ~TtsPlatformMock() override { + TtsController::GetInstance()->SetPlatformImpl( + TtsPlatformImpl::GetInstance()); + } + + bool speaking_requested() { return speaking_requested_; } + + // TtsPlatformImpl: + + bool PlatformImplAvailable() override { return true; } + + bool Speak(int utterance_id, + const std::string& utterance, + const std::string& lang, + const VoiceData& voice, + const UtteranceContinuousParameters& params) override { + speaking_requested_ = true; + // Dispatch the end of speaking back to the page. + TtsController::GetInstance()->OnTtsEvent(utterance_id, TTS_EVENT_END, + static_cast<int>(utterance.size()), + std::string()); + return true; + } + + bool StopSpeaking() override { return true; } + + bool IsSpeaking() override { return false; } + + void GetVoices(std::vector<VoiceData>* out_voices) override { + out_voices->push_back(VoiceData()); + VoiceData& voice = out_voices->back(); + voice.native = true; + voice.name = "TtsPlatformMock"; + voice.events.insert(TTS_EVENT_END); + } + + void Pause() override {} + + void Resume() override {} + + private: + bool speaking_requested_; +}; + +// Checks that text-to-speech is not called from prerenders that did not reach +// the visible state. Disabled until the http://crbug.com/520275 is fixed. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, + DISABLED_PrerenderSpeechSynthesis) { + TtsPlatformMock tts_platform_mock; + PrerenderTestURL("/prerender/prerender_speech_synthesis.html", + FINAL_STATUS_JAVASCRIPT_ALERT, 1); + EXPECT_FALSE(tts_platform_mock.speaking_requested()); +} + class PrerenderIncognitoBrowserTest : public PrerenderBrowserTest { public: void SetUpOnMainThread() override {
diff --git a/chrome/test/data/prerender/prerender_speech_synthesis.html b/chrome/test/data/prerender/prerender_speech_synthesis.html new file mode 100644 index 0000000..85446b5 --- /dev/null +++ b/chrome/test/data/prerender/prerender_speech_synthesis.html
@@ -0,0 +1,22 @@ +<html> +<body> + <script> + // Start a very short speaking job that will finish quickly. + var u = new SpeechSynthesisUtterance("Hello, do you like my voice today?"); + + u.onstart = function(event) { + window.console.log("started speaking"); + } + u.onend = function(event) { + window.console.log("finished speaking"); + alert("finished speaking"); // kill this prerender + } + window.console.log("will speak"); + speechSynthesis.speak(u); + + window.onload = function() { + window.console.log("window.onload"); + }; + </script> +</body> +</html>
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 78181c96..730d141 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1053,13 +1053,13 @@ <message name="IDS_IOS_READING_LIST_ENTRY_ACCESSIBILITY_LABEL" desc="Accessibility label for a reading list entry. Summarizes fields in the reading list entry (title and url). Read by Text To Speech."> <ph name="TITLE"><ex>Chromium - The Chromium Projects</ex>$1</ph>, <ph name="URL"><ex>http://www.chromium.org/Home</ex>$2</ph> </message> - <message name="IDS_IOS_READING_LIST_CANCEL_BUTTON" desc="Label of the button to stop editing the reading list entries (delete, mark as read/unread) [Length: 15em]" meaning="Stop editing. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_CANCEL_BUTTON" desc="Label of the button to stop editing the reading list entries (delete, mark as read/unread) [Length: 25em]" meaning="Stop editing. [Length: 25em]"> Cancel </message> - <message name="IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON" desc="Label of the button to delete all the reading list entries read [Length: 15em]" meaning="Delete all the read entries. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON" desc="Label of the button to delete all the reading list entries read [Length: 25em]" meaning="Delete all the read entries. [Length: 25em]"> Delete Read </message> - <message name="IDS_IOS_READING_LIST_DELETE_BUTTON" desc="Label of the button to delete the reading list entries [Length: 15em]" meaning="Delete the selected entries. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_DELETE_BUTTON" desc="Label of the button to delete the reading list entries [Length: 25em]" meaning="Delete the selected entries. [Length: 25em]"> Delete </message> <message name="IDS_IOS_READING_LIST_DONE_BUTTON" desc="Label of the button to dismiss reading list dialog"> @@ -1077,7 +1077,7 @@ <message name="IDS_IOS_READING_LIST_EMPTY_OFFLINE" desc="Message to explain to the user that the pages added to the reading list can we read offline." meaning="[Length:unlimited]"> Your reading list is available offline. </message> - <message name="IDS_IOS_READING_LIST_MARK_ALL_BUTTON" desc="Label of the button to suggest options to mark all reading list entries read or unread [Length: 15em]" meaning="Display options letting the user mark all the entries as read or as unread. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_MARK_ALL_BUTTON" desc="Label of the button to suggest options to mark all reading list entries read or unread [Length: 25em]" meaning="Display options letting the user mark all the entries as read or as unread. [Length: 25em]"> Mark All… </message> <message name="IDS_IOS_READING_LIST_MARK_ALL_READ_ACTION" desc="Label of the action button to mark all reading list entries as read. [Length: 25em]" meaning="Mark all entries as read. [Length: 25em]"> @@ -1086,13 +1086,13 @@ <message name="IDS_IOS_READING_LIST_MARK_ALL_UNREAD_ACTION" desc="Label of the action button to mark all reading list entries as unread. [Length: 25em]" meaning="Mark all entries as unread. [Length: 25em]"> Mark All Unread </message> - <message name="IDS_IOS_READING_LIST_MARK_BUTTON" desc="Label of the button to mark the selected reading list as either read or unread [Length: 15em]" meaning="Display options letting the user mark all the selected entries as read or as unread. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_MARK_BUTTON" desc="Label of the button to mark the selected reading list as either read or unread [Length: 25em]" meaning="Display options letting the user mark all the selected entries as read or as unread. [Length: 25em]"> Mark… </message> - <message name="IDS_IOS_READING_LIST_MARK_READ_BUTTON" desc="Label of the button to mark selected reading list entries as 'Read' [Length: 15em]" meaning="Mark selected entries as read. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_MARK_READ_BUTTON" desc="Label of the button to mark selected reading list entries as 'Read' [Length: 25em]" meaning="Mark selected entries as read. [Length: 25em]"> Mark Read </message> - <message name="IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON" desc="Label of the button to mark selected reading list entries as 'Unread' [Length: 15em]" meaning="Mark selected entries as unread. [Length: 15em]"> + <message name="IDS_IOS_READING_LIST_MARK_UNREAD_BUTTON" desc="Label of the button to mark selected reading list entries as 'Unread' [Length: 25em]" meaning="Mark selected entries as unread. [Length: 25em]"> Mark Unread </message> <message name="IDS_IOS_READING_LIST_READ_HEADER" desc="Heading. Appears above a list of articles the user has already read, in their Reading List. Appears on the same page as an 'Unread' heading, which contains articles the user hasn't read yet. In English, 'Read' can be both verb and adjective so we needed to be more explicit. Does not need to be translated literally. [Length: 40em]" meaning="The entries below this header are read. [Length: 40em]"> @@ -1207,7 +1207,7 @@ Print </message> <message name="IDS_IOS_SHARE_MENU_READING_LIST_ACTION" desc="The text label of the Add To Reading List action in the extension menu that adds the current page to the reading list. [Length: 25em] [iOS only]"> - Add to reading list + Read Later </message> <message name="IDS_IOS_SHARE_MESSAGES_COMPLETE" desc="Message shown when message share has been sent. [Length: Unknown. Keep it short.] [iOS only]"> Message sent.
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_toolbar.h b/ios/chrome/browser/ui/reading_list/reading_list_toolbar.h index 21c9fa2..56ab71f 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_toolbar.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_toolbar.h
@@ -8,6 +8,7 @@ #import <UIKit/UIKit.h> @class ActionSheetCoordinator; +@class ReadingListToolbar; typedef NS_ENUM(NSInteger, ReadingListToolbarState) { NoneSelected, @@ -16,6 +17,11 @@ MixedItemsSelected }; +typedef NS_ENUM(NSInteger, ReadingListToolbarHeight) { + NormalHeight, + ExpandedHeight +}; + @protocol ReadingListToolbarActions<NSObject> // Callback for the toolbar mark button. @@ -29,11 +35,21 @@ @end +@protocol ReadingListToolbarHeightDelegate + +- (void)toolbar:(ReadingListToolbar*)toolbar + onHeightChanged:(ReadingListToolbarHeight)height; + +@end + // View at the bottom of the reading list panel that presents options to edit // the entries. When editing, the interface changes, allowing the user to delete // them and mark them read/unread. @interface ReadingListToolbar : UIView +// Delegate handling the changes of the toolbar height. +@property(nonatomic, assign) id<ReadingListToolbarHeightDelegate> + heightDelegate; // The toolbar state. The text of the buttons change to reflect the state. @property(nonatomic, assign) ReadingListToolbarState state;
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_toolbar.mm b/ios/chrome/browser/ui/reading_list/reading_list_toolbar.mm index 82421b3f..1827e26 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_toolbar.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_toolbar.mm
@@ -7,10 +7,12 @@ #include "base/logging.h" #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" +#include "ios/chrome/browser/ui/rtl_geometry.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" #include "ui/base/l10n/l10n_util_mac.h" +#import "ui/gfx/ios/NSString+CrStringDrawing.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -20,8 +22,12 @@ // Shadow opacity. const CGFloat kShadowOpacity = 0.2f; -// Horizontal margin for the content. +// Horizontal margin for the stack view content. const CGFloat kHorizontalMargin = 8.0f; +// Horizontal spacing between the elements of the stack view. +const CGFloat kHorizontalSpacing = 8.0f; + +typedef NS_ENUM(NSInteger, ButtonPositioning) { Leading, Centered, Trailing }; } // namespace @@ -42,7 +48,9 @@ @property(nonatomic, strong) UIStackView* stackView; // Creates a button with a |title| and a style according to |destructive|. -- (UIButton*)buttonWithText:(NSString*)title destructive:(BOOL)isDestructive; +- (UIButton*)buttonWithText:(NSString*)title + destructive:(BOOL)isDestructive + positioning:(ButtonPositioning)position; // Set the mark button label to |text|. - (void)setMarkButtonText:(NSString*)text; // Updates the button labels to match an empty selection. @@ -66,30 +74,36 @@ @synthesize stackView = _stackView; @synthesize markButton = _markButton; @synthesize state = _state; +@synthesize heightDelegate = _heightDelegate; - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIButton* editButton = [self buttonWithText:l10n_util::GetNSString(IDS_IOS_READING_LIST_EDIT_BUTTON) - destructive:NO]; + destructive:NO + positioning:Trailing]; _deleteButton = [self buttonWithText:l10n_util::GetNSString( IDS_IOS_READING_LIST_DELETE_BUTTON) - destructive:YES]; + destructive:YES + positioning:Leading]; _deleteAllButton = [self buttonWithText:l10n_util::GetNSString( IDS_IOS_READING_LIST_DELETE_ALL_READ_BUTTON) - destructive:YES]; + destructive:YES + positioning:Leading]; _markButton = [self buttonWithText:l10n_util::GetNSString( IDS_IOS_READING_LIST_MARK_ALL_BUTTON) - destructive:NO]; + destructive:NO + positioning:Centered]; _cancelButton = [self buttonWithText:l10n_util::GetNSString( IDS_IOS_READING_LIST_CANCEL_BUTTON) - destructive:NO]; + destructive:NO + positioning:Trailing]; [editButton addTarget:nil action:@selector(enterEditingModePressed) @@ -124,7 +138,8 @@ ]]; _stackView.axis = UILayoutConstraintAxisHorizontal; _stackView.alignment = UIStackViewAlignmentFill; - _stackView.distribution = UIStackViewDistributionEqualCentering; + _stackView.distribution = UIStackViewDistributionFillEqually; + _stackView.spacing = kHorizontalSpacing; [self addSubview:_stackView]; _stackView.translatesAutoresizingMaskIntoConstraints = NO; @@ -148,6 +163,8 @@ self.deleteAllButton.hidden = !editing; self.cancelButton.hidden = !editing; self.markButton.hidden = !editing; + + [self updateHeight]; } - (void)setState:(ReadingListToolbarState)state { @@ -166,6 +183,8 @@ break; } _state = state; + + [self updateHeight]; } - (void)setHasReadItem:(BOOL)hasRead { @@ -212,10 +231,13 @@ IDS_IOS_READING_LIST_MARK_BUTTON)]; } -- (UIButton*)buttonWithText:(NSString*)title destructive:(BOOL)isDestructive { +- (UIButton*)buttonWithText:(NSString*)title + destructive:(BOOL)isDestructive + positioning:(ButtonPositioning)position { UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom]; button.contentEdgeInsets = UIEdgeInsetsMake(0, 8, 0, 8); [button setTitle:title forState:UIControlStateNormal]; + button.titleLabel.numberOfLines = 0; button.backgroundColor = [UIColor whiteColor]; UIColor* textColor = isDestructive ? [[MDCPalette cr_redPalette] tint500] @@ -223,9 +245,44 @@ [button setTitleColor:textColor forState:UIControlStateNormal]; [button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled]; + [button setTitleColor:[textColor colorWithAlphaComponent:0.3] + forState:UIControlStateHighlighted]; [[button titleLabel] setFont:[[MDCTypography fontLoader] regularFontOfSize:14]]; + NSTextAlignment textAlignement; + UIControlContentHorizontalAlignment horizontalAlignement; + + switch (position) { + case Leading: + if (UseRTLLayout()) { + horizontalAlignement = UIControlContentHorizontalAlignmentRight; + textAlignement = NSTextAlignmentRight; + } else { + horizontalAlignement = UIControlContentHorizontalAlignmentLeft; + textAlignement = NSTextAlignmentLeft; + } + break; + + case Centered: + horizontalAlignement = UIControlContentHorizontalAlignmentCenter; + textAlignement = NSTextAlignmentCenter; + break; + + case Trailing: + if (UseRTLLayout()) { + horizontalAlignement = UIControlContentHorizontalAlignmentLeft; + textAlignement = NSTextAlignmentLeft; + } else { + horizontalAlignement = UIControlContentHorizontalAlignmentRight; + textAlignement = NSTextAlignmentRight; + } + break; + } + + button.contentHorizontalAlignment = horizontalAlignement; + button.titleLabel.textAlignment = textAlignement; + return button; } @@ -233,4 +290,23 @@ [self.markButton setTitle:text forState:UIControlStateNormal]; } +- (void)updateHeight { + for (UIButton* button in + @[ _deleteButton, _deleteAllButton, _markButton, _cancelButton ]) { + if (!button.hidden) { + CGFloat rect = [button.titleLabel.text + cr_pixelAlignedSizeWithFont:button.titleLabel.font] + .width; + if (rect > (self.frame.size.width - 2 * kHorizontalMargin - + 2 * kHorizontalSpacing) / + 3 - + 16) { + [self.heightDelegate toolbar:self onHeightChanged:ExpandedHeight]; + return; + } + } + } + [self.heightDelegate toolbar:self onHeightChanged:NormalHeight]; +} + @end
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_view_controller_container.mm b/ios/chrome/browser/ui/reading_list/reading_list_view_controller_container.mm index 930152f..e2155397 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_view_controller_container.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_view_controller_container.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/reading_list/reading_list_view_controller_container.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" +#import "ios/chrome/browser/ui/reading_list/reading_list_toolbar.h" #import "ios/chrome/browser/ui/reading_list/reading_list_view_controller.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -12,14 +13,25 @@ #endif namespace { -// Height of the toolbar. -const int kToolbarHeight = 48; +// Height of the toolbar in normal state. +const int kToolbarNormalHeight = 48; +// Height of the expanded toolbar (buttons on multiple lines). +const int kToolbarExpandedHeight = 58; + +typedef NS_ENUM(NSInteger, LayoutPriority) { + LayoutPriorityLow = 750, + LayoutPriorityHigh = 751 +}; } -@interface ReadingListViewControllerContainer ()<ReadingListToolbarActions> { +@interface ReadingListViewControllerContainer ()< + ReadingListToolbarActions, + ReadingListToolbarHeightDelegate> { // Toolbar with the actions. ReadingListToolbar* _toolbar; ReadingListViewController* _collectionController; + // This constraint control the expanded mode of the toolbar. + NSLayoutConstraint* _expandedToolbarConstraint; } @end @@ -34,6 +46,7 @@ self = [super initWithNibName:nil bundle:nil]; if (self) { _toolbar = [[ReadingListToolbar alloc] initWithFrame:CGRectZero]; + _toolbar.heightDelegate = self; _collectionController = [[ReadingListViewController alloc] initWithModel:model tabModel:tabModel @@ -66,7 +79,7 @@ // toolbar is not present, allowing the collection to take the whole page. NSLayoutConstraint* constraint = [[_collectionController view].bottomAnchor constraintEqualToAnchor:[self view].bottomAnchor]; - constraint.priority = UILayoutPriorityDefaultHigh; + constraint.priority = LayoutPriorityLow; constraint.active = YES; } @@ -80,10 +93,16 @@ @"toolbar" : _toolbar, @"collection" : [_collectionController view] }; - NSDictionary* metrics = @{ @"toolbarHeight" : @(kToolbarHeight) }; - NSArray* constraints = - @[ @"V:[collection][toolbar(==toolbarHeight)]|", @"H:|[toolbar]|" ]; - ApplyVisualConstraintsWithMetrics(constraints, views, metrics); + NSArray* constraints = @[ @"V:[collection][toolbar]|", @"H:|[toolbar]|" ]; + ApplyVisualConstraints(constraints, views); + NSLayoutConstraint* height = + [_toolbar.heightAnchor constraintEqualToConstant:kToolbarNormalHeight]; + height.priority = LayoutPriorityHigh; + height.active = YES; + // When the toolbar is added, the only button is the "edit" button. No need + // to go in expanded mode. + _expandedToolbarConstraint = [_toolbar.heightAnchor + constraintEqualToConstant:kToolbarExpandedHeight]; } else { // If there is no item, remove the toolbar. The constraints will make sure // the collection takes the whole view. @@ -109,4 +128,20 @@ [_collectionController exitEditingModePressed]; } +#pragma mark - ReadingListToolbarHeightDelegate + +- (void)toolbar:(id)toolbar onHeightChanged:(ReadingListToolbarHeight)height { + dispatch_async(dispatch_get_main_queue(), ^{ + switch (height) { + case NormalHeight: + _expandedToolbarConstraint.active = NO; + break; + + case ExpandedHeight: + _expandedToolbarConstraint.active = YES; + break; + } + }); +} + @end
diff --git a/third_party/WebKit/LayoutTests/LeakExpectations b/third_party/WebKit/LayoutTests/LeakExpectations index ff25a85c..24b6c47 100644 --- a/third_party/WebKit/LayoutTests/LeakExpectations +++ b/third_party/WebKit/LayoutTests/LeakExpectations
@@ -37,8 +37,6 @@ crbug.com/410974 virtual/scroll_customization/fast/scroll-behavior/scroll-customization/touch-scroll-customization.html [ Leak ] crbug.com/410974 virtual/scroll_customization/fast/scroll-behavior/scroll-customization/scrollstate-distribute-to-scroll-chain-descendant.html [ Leak ] -crbug.com/670324 fast/speech/scripted/speechrecognition-restart-onend.html [ Leak ] - # ----------------------------------------------------------------- # Untriaged but known real leaks. # -----------------------------------------------------------------
diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.cpp b/third_party/WebKit/Source/platform/heap/ThreadState.cpp index 53497e7..6ae1096 100644 --- a/third_party/WebKit/Source/platform/heap/ThreadState.cpp +++ b/third_party/WebKit/Source/platform/heap/ThreadState.cpp
@@ -331,27 +331,8 @@ void ThreadState::cleanupMainThread() { ASSERT(isMainThread()); -#if defined(LEAK_SANITIZER) - // See comment below, clear out most garbage before releasing static - // persistents should some of the finalizers depend on touching - // these persistents. - collectAllGarbage(); -#endif - releaseStaticPersistentNodes(); -#if defined(LEAK_SANITIZER) - // If LSan is about to perform leak detection, after having released all - // the registered static Persistent<> root references to global caches - // that Blink keeps, follow up with a round of GCs to clear out all - // what they referred to. - // - // This is not needed for caches over non-Oilpan objects, as they're - // not scanned by LSan due to being held in non-global storage - // ("static" references inside functions/methods.) - collectAllGarbage(); -#endif - // Finish sweeping before shutting down V8. Otherwise, some destructor // may access V8 and cause crashes. completeSweep();