New issue
Advanced search Search tips

Issue 902386 link

Starred by 1 user

Issue metadata

Status: Available
Owner: ----
Components:
EstimatedDays: ----
NextAction: ----
OS: Mac
Pri: 3
Type: Bug



Sign in to add a comment

Chrome hangs for minutes on large dataurl

Project Member Reported by alph@chromium.org, Nov 6

Issue description

To reproduce om macOS:

1. Make a large dataurl >10MB and put it into the clipboard, e.g.

  echo "data:image/jpeg;base64,$(base64 somelargeimage.jpeg)" | pbcopy

2. Paste the contents of your clipboard to the omnibox
3. Chrome hangs for minutes.
 
Here's a part of the call stack sampled in macOS Activity Monitor:

       1345 OmniboxEditModel::OnAfterPossibleChange(OmniboxView::StateChanges const&, bool)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a57c92  [omnibox_edit_model.cc:1234]
         1345 OmniboxEditModel::UpdateInput(bool, bool)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a55547  [omnibox_edit_model.cc:0]
           1345 OmniboxEditModel::StartAutocomplete(bool, bool)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a55868  [string:1406]
             1345 AutocompleteController::Start(AutocompleteInput const&)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a2728b  [autocomplete_controller.cc:362]
               1187 AutocompleteController::UpdateResult(bool, bool)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a276ee  [autocomplete_controller.cc:522]
               ! 859 AutocompleteResult::CopyOldMatches(AutocompleteInput const&, AutocompleteResult*, TemplateURLService*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a303c0  [__tree:1092]
               ! : 859 AutocompleteResult::SortAndCull(AutocompleteInput const&, TemplateURLService*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a3081e  [iterator:1372]
               ! :   858 <name omitted>  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a2d897  [autocomplete_match.cc:646]
               ! :   | 379 AutocompleteMatch::GURLToStrippedGURL(GURL const&, AutocompleteInput const&, TemplateURLService const*, std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> > const&)  (in Google Chrome Framework)  load address 0x10def4000 + 0x4a2d4a4  [autocomplete_match.cc:62]
               ! :   | + 379 url_formatter::FormatUrl(GURL const&, unsigned int, unsigned int, url::Parsed*, unsigned long*, unsigned long*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x3b82e5e  [url_formatter.cc:436]
               ! :   | +   379 url_formatter::FormatUrlWithAdjustments(GURL const&, unsigned int, unsigned int, url::Parsed*, unsigned long*, std::__1::vector<base::OffsetAdjuster::Adjustment, std::__1::allocator<base::OffsetAdjuster::Adjustment> >*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x3b83b70  [url_formatter.cc:608]
               ! :   | +     362 url_formatter::(anonymous namespace)::AppendFormattedComponent(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, url::Component const&, url_formatter::(anonymous namespace)::AppendComponentTransform const&, std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >*, url::Component*, std::__1::vector<base::OffsetAdjuster::Adjustment, std::__1::allocator<base::OffsetAdjuster::Adjustment> >*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x3b840e8  [string:1406]
               ! :   | +     ! 362 url_formatter::(anonymous namespace)::NonHostComponentTransform::Execute(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<base::OffsetAdjuster::Adjustment, std::__1::allocator<base::OffsetAdjuster::Adjustment> >*) const  (in Google Chrome Framework)  load address 0x10def4000 + 0x3b854bd  [url_formatter.cc:119]
               ! :   | +     !   212 net::UnescapeAndDecodeUTF8URLComponentWithAdjustments(base::BasicStringPiece<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, unsigned int, std::__1::vector<base::OffsetAdjuster::Adjustment, std::__1::allocator<base::OffsetAdjuster::Adjustment> >*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x27b9b48  [escape.cc:468]
               ! :   | +     !   : 91 bool base::ConvertUnicode<char, std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> > >(char const*, unsigned long, std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >*, std::__1::vector<base::OffsetAdjuster::Adjustment, std::__1::allocator<base::OffsetAdjuster::Adjustment> >*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x247160f  [utf_offset_string_conversions.cc:193]
               ! :   | +     !   : | 57 base::WriteUnicodeCharacter(unsigned int, std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >*)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24720f4  [utf_string_conversion_utils.cc:96]
               ! :   | +     !   : | + 9 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656ca  [string:1468]
               ! :   | +     !   : | + 8 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656ea  [string:1465]
               ! :   | +     !   : | + 6 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656da  [string:2441]
               ! :   | +     !   : | + 6 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x246573d  [string:2453]
               ! :   | +     !   : | + 4 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656de  [string:1485]
               ! :   | +     !   : | + 3 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656b6  [string:2421]
               ! :   | +     !   : | + 3 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656ed  [string:0]
               ! :   | +     !   : | + 3 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x2465744  [string:2453]
               ! :   | +     !   : | + 2 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656bd  [string:2421]
               ! :   | +     !   : | + 2 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656c3  [string:2425]
               ! :   | +     !   : | + 2 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x2465741  [string:2453]
               ! :   | +     !   : | + 1 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656b0  [string:2421]
               ! :   | +     !   : | + 1 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656b1  [string:2421]
               ! :   | +     !   : | + 1 std::__1::basic_string<unsigned short, base::string16_internals::string16_char_traits, std::__1::allocator<unsigned short> >::push_back(unsigned short)  (in Google Chrome Framework)  load address 0x10def4000 + 0x24656b4  [string:2421]

Attaching the symbolized profile.
omnibox-hang.txt
380 KB View Download
Owner: jdonnelly@chromium.org
Status: Assigned (was: Untriaged)
Mac triage: to jdonnelly@ for omnibox triage.
Owner: ----
Status: Untriaged (was: Assigned)
Marking as untriaged so it get picks up during omnibox triage.
Labels: Hotlist-Polish
Status: Available (was: Untriaged)
What kind of machine do you have?  When I try this on my macbook pro, Chrome pauses for a while, but not minutes.

The key here is that the paste is being cut off at some length (4k? 10k? 32k?).  Before we added that, it was easy to reproduce.

I can't even figure out whether this is mainly a Mac issue or not.  My Linux machine has a similar length pause.  The machines have very different specs though, so it's hard for me to compare.

For some reason in the past (in the cocoa days), we had stricter limitations on paste on Mac than in other platforms; I think we lost that when we converted Mac to Views.  I'm not sure if losing that logic was okay.  Was Mac's performance is bad because it was using Cocoa, or bad because it of something else about Mac (and hence it's naturally worse than Linux anyway).

In any case, this (hopefully) isn't that common these days, so switching to P-3 and marking as available.  Any answers to the above questions might make it an easy fix; otherwise, I'm okay with letting this sit.


For history: here's the change that added the cocoa-specific paste threshold.
https://chromium.googlesource.com/chromium/src.git/+/18016982fceb8


Sign in to add a comment