diff --git a/DEPS b/DEPS index 798b826..6db4ea8 100644 --- a/DEPS +++ b/DEPS
@@ -74,7 +74,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '1946aaf15ca0cbed7842f6df8c347284061ef2f9', + 'skia_revision': 'cad08c855e2373df3f0c53e943bad29dbd371d9c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -1009,7 +1009,7 @@ 'action': ['vpython', 'src/build/get_syzygy_binaries.py', '--output-dir=src/third_party/syzygy/binaries', - '--revision=190dbfe74c6f5b5913820fa66d9176877924d7c5', + '--revision=8164b24ebde9c5649c9a09e88a7fc0b0fcbd1bc5', '--overwrite', '--copy-dia-binaries', ],
diff --git a/ash/public/cpp/ash_switches.h b/ash/public/cpp/ash_switches.h index bce524da..760e9627 100644 --- a/ash/public/cpp/ash_switches.h +++ b/ash/public/cpp/ash_switches.h
@@ -60,11 +60,6 @@ ASH_PUBLIC_EXPORT extern const char kShowTaps[]; ASH_PUBLIC_EXPORT extern const char kShowViewsLogin[]; ASH_PUBLIC_EXPORT extern const char kShowWebUiLock[]; -ASH_PUBLIC_EXPORT extern const char kSpuriousPowerButtonWindow[]; -ASH_PUBLIC_EXPORT extern const char kSpuriousPowerButtonAccelCount[]; -ASH_PUBLIC_EXPORT extern const char kSpuriousPowerButtonScreenAccel[]; -ASH_PUBLIC_EXPORT extern const char kSpuriousPowerButtonKeyboardAccel[]; -ASH_PUBLIC_EXPORT extern const char kSpuriousPowerButtonLidAngleChange[]; ASH_PUBLIC_EXPORT extern const char kTouchscreenUsableWhileScreenOff[]; ASH_PUBLIC_EXPORT extern const char kUseIMEService[];
diff --git a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc index cc80d60..a93b75c 100644 --- a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc +++ b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
@@ -968,19 +968,16 @@ TestTimeouts::tiny_timeout(); } - // Waits up to some amount of time until |worker_pool_|'s worker capacity - // reaches |expected_worker_capacity|. - void ExpectWorkerCapacityAfterDelay(size_t expected_worker_capacity) { - constexpr int kMaxAttempts = 4; - for (int i = 0; - i < kMaxAttempts && worker_pool_->GetWorkerCapacityForTesting() != - expected_worker_capacity; - ++i) { + // Waits indefinitely, until |worker_pool_|'s worker capacity increases to + // |expected_worker_capacity|. + void ExpectWorkerCapacityIncreasesTo(size_t expected_worker_capacity) { + size_t capacity = worker_pool_->GetWorkerCapacityForTesting(); + while (capacity != expected_worker_capacity) { PlatformThread::Sleep(GetWorkerCapacityChangeSleepTime()); + size_t new_capacity = worker_pool_->GetWorkerCapacityForTesting(); + ASSERT_GE(new_capacity, capacity); + capacity = new_capacity; } - - EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(), - expected_worker_capacity); } // Unblocks tasks posted by SaturateWithBlockingTasks(). @@ -1004,7 +1001,7 @@ SaturateWithBlockingTasks(GetParam()); if (GetParam().behaves_as == BlockingType::MAY_BLOCK) - ExpectWorkerCapacityAfterDelay(2 * kNumWorkersInWorkerPool); + ExpectWorkerCapacityIncreasesTo(2 * kNumWorkersInWorkerPool); // A range of possible number of workers is accepted because of // crbug.com/757897. EXPECT_GE(worker_pool_->NumberOfWorkersForTesting(), @@ -1100,7 +1097,7 @@ // tasks we just posted. thread_can_block.Signal(); if (GetParam().behaves_as == BlockingType::MAY_BLOCK) - ExpectWorkerCapacityAfterDelay(2 * kNumWorkersInWorkerPool); + ExpectWorkerCapacityIncreasesTo(2 * kNumWorkersInWorkerPool); // Should not block forever. extra_thread_running.Wait(); @@ -1119,7 +1116,7 @@ SaturateWithBlockingTasks(GetParam()); if (GetParam().behaves_as == BlockingType::MAY_BLOCK) - ExpectWorkerCapacityAfterDelay(2 * kNumWorkersInWorkerPool); + ExpectWorkerCapacityIncreasesTo(2 * kNumWorkersInWorkerPool); EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(), 2 * kNumWorkersInWorkerPool); // A range of possible number of workers is accepted because of @@ -1303,7 +1300,7 @@ Unretained(&did_instantiate_will_block), Unretained(&can_return))); // After a short delay, worker capacity should be incremented. - ExpectWorkerCapacityAfterDelay(kNumWorkersInWorkerPool + 1); + ExpectWorkerCapacityIncreasesTo(kNumWorkersInWorkerPool + 1); // Wait until the task instantiates a WILL_BLOCK ScopedBlockingCall. can_instantiate_will_block.Signal();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeHomeSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeHomeSurveyController.java index 4b3619e..a2cd43e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeHomeSurveyController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeHomeSurveyController.java
@@ -358,9 +358,14 @@ /** Logs in {@link SharedPreferences} that the info bar was displayed. */ private void recordInfoBarDisplayed() { + // This can be called multiple times e.g. by mLoggingHandler & onSurveyInfoBarClosed(). + // Return early to allow only one call to this method (http://crbug.com/791076). + if (mSurveyInfoBarTab == null) return; + if (mSurveyInfoBarTab.getInfoBarContainer() != null) { mSurveyInfoBarTab.getInfoBarContainer().removeAnimationListener(this); } + mLoggingHandler.removeCallbacksAndMessages(null); SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 112beaed..4ae3b24 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2363,7 +2363,7 @@ // to indicate that we don't want SSLErrorHandler to take the committed // interstitials code path. SSLErrorHandler::HandleSSLError( - web_contents, cert_error, ssl_info, request_url, strict_enforcement, + web_contents, cert_error, ssl_info, request_url, expired_previous_decision, std::make_unique<CertificateReportingServiceCertReporter>(web_contents), callback, SSLErrorHandler::BlockingPageReadyCallback());
diff --git a/chrome/browser/referrer_policy_browsertest.cc b/chrome/browser/referrer_policy_browsertest.cc index 395e78b..584c7853 100644 --- a/chrome/browser/referrer_policy_browsertest.cc +++ b/chrome/browser/referrer_policy_browsertest.cc
@@ -8,7 +8,6 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/chrome_notification_types.h" -#include "chrome/browser/net/url_request_mock_util.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h" #include "chrome/browser/ui/browser.h" @@ -27,19 +26,17 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" -#include "net/test/url_request/url_request_mock_http_job.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" class ReferrerPolicyTest : public InProcessBrowserTest { public: - ReferrerPolicyTest() {} - ~ReferrerPolicyTest() override {} - - void SetUpOnMainThread() override { - content::BrowserThread::PostTask( - content::BrowserThread::IO, FROM_HERE, - base::BindOnce(&chrome_browser_net::SetUrlRequestMocksEnabled, true)); + ReferrerPolicyTest() : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) { + https_server_.AddDefaultHandlers( + base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); + EXPECT_TRUE(embedded_test_server()->Start()); + EXPECT_TRUE(https_server_.Start()); } + ~ReferrerPolicyTest() override {} protected: enum ExpectedReferrer { @@ -117,21 +114,6 @@ SERVER_REDIRECT_FROM_HTTP_TO_HTTPS }; - std::string RedirectTypeToString(RedirectType redirect) { - switch (redirect) { - case NO_REDIRECT: - return "none"; - case SERVER_REDIRECT_FROM_HTTPS_TO_HTTP: - return "https2http"; - case SERVER_REDIRECT_FROM_HTTP_TO_HTTP: - return "http2http"; - case SERVER_REDIRECT_FROM_HTTP_TO_HTTPS: - return "http2https"; - } - NOTREACHED(); - return ""; - } - // Navigates from a page with a given |referrer_policy| and checks that the // reported referrer matches the expectation. // Parameters: @@ -155,17 +137,45 @@ blink::WebMouseEvent::Button button, ExpectedReferrer expected_referrer, blink::WebReferrerPolicy expected_referrer_policy) { + GURL redirect_url; + switch (redirect) { + case NO_REDIRECT: + redirect_url = embedded_test_server()->GetURL( + "/referrer_policy/referrer-policy-log.html"); + break; + case SERVER_REDIRECT_FROM_HTTPS_TO_HTTP: + redirect_url = https_server_.GetURL( + std::string("/server-redirect?") + + embedded_test_server() + ->GetURL("/referrer_policy/referrer-policy-log.html") + .spec()); + break; + case SERVER_REDIRECT_FROM_HTTP_TO_HTTP: + redirect_url = embedded_test_server()->GetURL( + std::string("/server-redirect?") + + embedded_test_server() + ->GetURL("/referrer_policy/referrer-policy-log.html") + .spec()); + break; + case SERVER_REDIRECT_FROM_HTTP_TO_HTTPS: + redirect_url = embedded_test_server()->GetURL( + std::string("/server-redirect?") + + https_server_.GetURL("/referrer_policy/referrer-policy-log.html") + .spec()); + break; + } + std::string relative_url = - std::string("referrer_policy/referrer-policy-start.html?") + + std::string("/referrer_policy/referrer-policy-start.html?") + "policy=" + ReferrerPolicyToString(referrer_policy) + - "&redirect=" + RedirectTypeToString(redirect) + "&link=" + + "&redirect=" + redirect_url.spec() + "&link=" + (button == blink::WebMouseEvent::Button::kNoButton ? "false" : "true") + "&target=" + (link_type == LINK_WITH_TARGET_BLANK ? "_blank" : ""); - const GURL start_url = - (start_protocol == START_ON_HTTPS) - ? net::URLRequestMockHTTPJob::GetMockHttpsUrl(relative_url) - : net::URLRequestMockHTTPJob::GetMockUrl(relative_url); + auto* start_test_server = start_protocol == START_ON_HTTPS + ? &https_server_ + : embedded_test_server(); + const GURL start_url = start_test_server->GetURL(relative_url); ui_test_utils::WindowedTabAddedNotificationObserver tab_added_observer( content::NotificationService::AllSources()); @@ -225,6 +235,8 @@ disposition, button, expected_referrer, referrer_policy); } + + net::EmbeddedTestServer https_server_; }; class ReferrerPolicyWithReduceReferrerGranularityFlagTest @@ -467,8 +479,7 @@ blink::WebMouseEvent::Button::kLeft, EXPECT_ORIGIN_AS_REFERRER); // Navigate to C. - ui_test_utils::NavigateToURL( - browser(), net::URLRequestMockHTTPJob::GetMockUrl(std::string())); + ui_test_utils::NavigateToURL(browser(), embedded_test_server()->GetURL("/")); base::string16 expected_title = GetExpectedTitle(start_url, EXPECT_ORIGIN_AS_REFERRER); @@ -544,8 +555,16 @@ // Load a page that loads an iframe. ui_test_utils::NavigateToURL( - browser(), net::URLRequestMockHTTPJob::GetMockHttpsUrl(std::string( - "referrer_policy/referrer-policy-iframe.html"))); + browser(), + https_server_.GetURL("/referrer_policy/referrer-policy-iframe.html")); + EXPECT_TRUE(content::ExecuteScript( + tab, + std::string("var frame = document.createElement('iframe');frame.src ='") + + embedded_test_server() + ->GetURL("/referrer_policy/referrer-policy-log.html") + .spec() + + "';frame.onload = function() { document.title = 'loaded'; };" + + "document.body.appendChild(frame)")); EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle()); // Verify that the referrer policy was honored and the main page's origin was @@ -557,10 +576,7 @@ frame, "window.domAutomationController.send(document.title)", &title)); - EXPECT_EQ( - "Referrer is " + - net::URLRequestMockHTTPJob::GetMockHttpsUrl(std::string()).spec(), - title); + EXPECT_EQ("Referrer is " + https_server_.GetURL("/").spec(), title); // Reload the iframe. expected_title = base::ASCIIToUTF16("reset"); @@ -578,10 +594,11 @@ frame, "window.domAutomationController.send(document.title)", &title)); - EXPECT_EQ("Referrer is " + - net::URLRequestMockHTTPJob::GetMockUrl( - "referrer_policy/referrer-policy-log.html").spec(), - title); + EXPECT_EQ( + "Referrer is " + embedded_test_server() + ->GetURL("/referrer_policy/referrer-policy-log.html") + .spec(), + title); } // Origin When Cross-Origin
diff --git a/chrome/browser/ssl/ssl_error_handler.cc b/chrome/browser/ssl/ssl_error_handler.cc index fce9bcd6..99139ef 100644 --- a/chrome/browser/ssl/ssl_error_handler.cc +++ b/chrome/browser/ssl/ssl_error_handler.cc
@@ -580,7 +580,6 @@ int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, - bool should_ssl_errors_be_fatal, bool expired_previous_decision, std::unique_ptr<SSLCertReporter> ssl_cert_reporter, const base::Callback<void(content::CertificateRequestResultType)>& @@ -600,7 +599,7 @@ bool is_superfish = base::FeatureList::IsEnabled(kSuperfishInterstitial) && is_superfish_cert; int options_mask = CalculateOptionsMask( - cert_error, hard_override_disabled, should_ssl_errors_be_fatal, + cert_error, hard_override_disabled, ssl_info.is_fatal_cert_error, is_superfish, expired_previous_decision); SSLErrorHandler* error_handler = new SSLErrorHandler(
diff --git a/chrome/browser/ssl/ssl_error_handler.h b/chrome/browser/ssl/ssl_error_handler.h index a7a110cb..1c2fe324 100644 --- a/chrome/browser/ssl/ssl_error_handler.h +++ b/chrome/browser/ssl/ssl_error_handler.h
@@ -133,7 +133,6 @@ int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, - bool should_ssl_errors_be_fatal, bool expired_previous_decision, std::unique_ptr<SSLCertReporter> ssl_cert_reporter, const base::Callback<void(content::CertificateRequestResultType)>&
diff --git a/chrome/browser/ssl/ssl_error_navigation_throttle.cc b/chrome/browser/ssl/ssl_error_navigation_throttle.cc index d99e671..4202e53 100644 --- a/chrome/browser/ssl/ssl_error_navigation_throttle.cc +++ b/chrome/browser/ssl/ssl_error_navigation_throttle.cc
@@ -49,8 +49,7 @@ base::BindOnce( std::move(handle_ssl_error_callback_), handle->GetWebContents(), net::MapCertStatusToNetError(cert_status), handle->GetSSLInfo(), - handle->GetURL(), handle->ShouldSSLErrorsBeFatal(), false, - std::move(ssl_cert_reporter_), + handle->GetURL(), false, std::move(ssl_cert_reporter_), base::Callback<void(content::CertificateRequestResultType)>(), base::BindOnce(&SSLErrorNavigationThrottle::ShowInterstitial, weak_ptr_factory_.GetWeakPtr())));
diff --git a/chrome/browser/ssl/ssl_error_navigation_throttle.h b/chrome/browser/ssl/ssl_error_navigation_throttle.h index 44de848..9c29fd3 100644 --- a/chrome/browser/ssl/ssl_error_navigation_throttle.h +++ b/chrome/browser/ssl/ssl_error_navigation_throttle.h
@@ -34,7 +34,6 @@ int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, - bool should_ssl_errors_be_fatal, bool expired_previous_decision, std::unique_ptr<SSLCertReporter> ssl_cert_reporter, const base::Callback<void(content::CertificateRequestResultType)>&
diff --git a/chrome/browser/ssl/ssl_error_navigation_throttle_unittest.cc b/chrome/browser/ssl/ssl_error_navigation_throttle_unittest.cc index 3e3a280..2f241f9 100644 --- a/chrome/browser/ssl/ssl_error_navigation_throttle_unittest.cc +++ b/chrome/browser/ssl/ssl_error_navigation_throttle_unittest.cc
@@ -30,7 +30,6 @@ int cert_error, const net::SSLInfo& ssl_info, const GURL& request_url, - bool should_ssl_errors_be_fatal, bool expired_previous_decision, std::unique_ptr<SSLCertReporter> ssl_cert_reporter, const base::Callback<void(content::CertificateRequestResultType)>&
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h index 78c8b993a..fa892e0 100644 --- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h +++ b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h
@@ -158,6 +158,9 @@ // added in fullscreen in 10.10+. base::scoped_nsobject<CustomWindowControlsView> customWindowControls_; base::scoped_nsobject<CrTrackingArea> customWindowControlsTrackingArea_; + + // The set stores the WebContens that were hiding their throbbers. + std::set<content::WebContents*> wasHidingThrobberSet_; } @property(nonatomic) CGFloat leadingIndentForControls;
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm index d86c8862..7e528bf 100644 --- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm +++ b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
@@ -18,6 +18,7 @@ #include "base/macros.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" +#include "base/stl_util.h" #include "base/strings/sys_string_conversions.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" @@ -1324,6 +1325,13 @@ [delegate_ onTabInsertedWithContents:contents inForeground:inForeground]; } +// Called when a notification is received from the model to close the tab with +// the WebContents. +- (void)tabClosingWithContents:(content::WebContents*)contents + atIndex:(NSInteger)index { + wasHidingThrobberSet_.erase(contents); +} + // Called before |contents| is deactivated. - (void)tabDeactivatedWithContents:(content::WebContents*)contents { contents->StoreFocus(); @@ -1647,8 +1655,11 @@ [tabController setIconImage:[self iconImageForContents:contents atIndex:modelIndex]]; } - } else if (newState == kTabDone || oldState != newState || + wasHidingThrobberSet_.insert(contents); + } else if (base::ContainsKey(wasHidingThrobberSet_, contents) || + newState == kTabDone || oldState != newState || oldHasIcon != newHasIcon) { + wasHidingThrobberSet_.erase(contents); if (newHasIcon) { if (newState == kTabDone) { [tabController setIconImage:[self iconImageForContents:contents
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc index 184e9b9..71446ce0 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.cc +++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -329,6 +329,20 @@ } else { preferred_size.set_width(std::min(preferred_width, kMaxContentsWidth)); } + + // These bubbles should all be the "small" dialog width, but only when in + // Harmony mode. + ChromeLayoutProvider* provider = ChromeLayoutProvider::Get(); + if (provider->IsHarmonyMode()) { + // Subtract out this dialog's margins. The margins are imposed by + // DialogClientView around this view, so this view's width plus the width of + // these margins must equal the desired width, which is + // GetSnappedDialogWidth(0). + preferred_size.set_width(provider->GetSnappedDialogWidth(0) - + margins().width()); + preferred_size.set_height(GetHeightForWidth(preferred_size.width())); + } + return preferred_size; } @@ -437,6 +451,7 @@ views::RadioButton* radio = new views::RadioButton(*i, 0); radio->SetEnabled(bubble_content.radio_group_enabled); radio->set_listener(this); + radio->SetMultiLine(true); radio_group_.push_back(radio); layout->StartRow(0, kIndentedSingleColumnSetId); layout->AddView(radio);
diff --git a/chrome/test/data/referrer_policy/redirect-to-http-log b/chrome/test/data/referrer_policy/redirect-to-http-log deleted file mode 100644 index e69de29..0000000 --- a/chrome/test/data/referrer_policy/redirect-to-http-log +++ /dev/null
diff --git a/chrome/test/data/referrer_policy/redirect-to-http-log.mock-http-headers b/chrome/test/data/referrer_policy/redirect-to-http-log.mock-http-headers deleted file mode 100644 index 20b4372..0000000 --- a/chrome/test/data/referrer_policy/redirect-to-http-log.mock-http-headers +++ /dev/null
@@ -1,3 +0,0 @@ -HTTP/1.1 301 Moved permanently -Location: http://mock.http/referrer_policy/referrer-policy-log.html -
diff --git a/chrome/test/data/referrer_policy/redirect-to-https-log b/chrome/test/data/referrer_policy/redirect-to-https-log deleted file mode 100644 index e69de29..0000000 --- a/chrome/test/data/referrer_policy/redirect-to-https-log +++ /dev/null
diff --git a/chrome/test/data/referrer_policy/redirect-to-https-log.mock-http-headers b/chrome/test/data/referrer_policy/redirect-to-https-log.mock-http-headers deleted file mode 100644 index 22f078c..0000000 --- a/chrome/test/data/referrer_policy/redirect-to-https-log.mock-http-headers +++ /dev/null
@@ -1,3 +0,0 @@ -HTTP/1.1 301 Moved permanently -Location: https://mock.http/referrer_policy/referrer-policy-log.html -
diff --git a/chrome/test/data/referrer_policy/referrer-policy-iframe.html b/chrome/test/data/referrer_policy/referrer-policy-iframe.html index 1afba24..8261b980 100644 --- a/chrome/test/data/referrer_policy/referrer-policy-iframe.html +++ b/chrome/test/data/referrer_policy/referrer-policy-iframe.html
@@ -4,11 +4,5 @@ <meta name="referrer" content="origin" /> </head> <body> -<script> -var frame = document.createElement("iframe"); -frame.src = "http://mock.http/referrer_policy/referrer-policy-log.html"; -frame.onload = function() { document.title = "loaded"; }; -document.body.appendChild(frame); -</script> </body> </html>
diff --git a/chrome/test/data/referrer_policy/referrer-policy-start.html b/chrome/test/data/referrer_policy/referrer-policy-start.html index c7374034..a6139aa 100644 --- a/chrome/test/data/referrer_policy/referrer-policy-start.html +++ b/chrome/test/data/referrer_policy/referrer-policy-start.html
@@ -22,20 +22,9 @@ document.head.appendChild(meta); } - var destination; + var destination = matches[kRedirect]; var redirectMatches; - if (matches[kRedirect] == "none") { - destination = "http://mock.http/referrer_policy/referrer-policy-log.html"; - } else if (redirectMatches = /^(https?)2(https?)$/.exec(matches[kRedirect])) { - destination = - redirectMatches[1] + - "://mock.http/referrer_policy/redirect-to-" + - redirectMatches[2] + "-log"; - } else { - destination = matches[kRedirect]; - } - if (matches[kLink] == "true") { var link = document.createElement("a"); link.innerText = "link";
diff --git a/components/search_provider_logos/google_logo_api.cc b/components/search_provider_logos/google_logo_api.cc index 70b9b75..d85ad36 100644 --- a/components/search_provider_logos/google_logo_api.cc +++ b/components/search_provider_logos/google_logo_api.cc
@@ -181,6 +181,7 @@ } const bool is_animated = (logo->metadata.type == LogoType::ANIMATED); + const bool is_interactive = (logo->metadata.type == LogoType::INTERACTIVE); // Check if the main image is animated. if (is_animated) { @@ -235,6 +236,15 @@ ddljson->GetString("fingerprint", &logo->metadata.fingerprint); + if (is_interactive) { + std::string behavior; + if (ddljson->GetString("launch_interactive_behavior", &behavior) && + (behavior == "NEW_WINDOW")) { + logo->metadata.type = LogoType::SIMPLE; + logo->metadata.on_click_url = logo->metadata.full_page_url; + } + } + base::TimeDelta time_to_live; // The JSON doesn't guarantee the number to fit into an int. double ttl_ms = 0; // Expires immediately if the parameter is missing.
diff --git a/components/search_provider_logos/google_logo_api_unittest.cc b/components/search_provider_logos/google_logo_api_unittest.cc index 5906b35..8bffa8a 100644 --- a/components/search_provider_logos/google_logo_api_unittest.cc +++ b/components/search_provider_logos/google_logo_api_unittest.cc
@@ -226,6 +226,32 @@ EXPECT_EQ(LogoType::INTERACTIVE, logo->metadata.type); } +TEST(GoogleNewLogoApiTest, ParsesInteractiveDoodleWithNewWindowAsSimple) { + const GURL base_url("https://base.doo/"); + // Note: The base64 encoding of "abc" is "YWJj". + const std::string json = R"json()]}' + { + "ddljson": { + "doodle_type": "INTERACTIVE", + "target_url": "/search?q=interactive", + "fullpage_interactive_url": "/play", + "launch_interactive_behavior": "NEW_WINDOW", + "data_uri": "data:image/png;base64,YWJj" + } + })json"; + + bool failed = false; + std::unique_ptr<EncodedLogo> logo = ParseDoodleLogoResponse( + base_url, std::make_unique<std::string>(json), base::Time(), &failed); + + ASSERT_FALSE(failed); + ASSERT_TRUE(logo); + EXPECT_EQ(LogoType::SIMPLE, logo->metadata.type); + EXPECT_EQ(GURL("https://base.doo/play"), logo->metadata.on_click_url); + EXPECT_EQ(GURL("https://base.doo/play"), logo->metadata.full_page_url); + EXPECT_EQ("abc", logo->encoded_image->data()); +} + TEST(GoogleNewLogoApiTest, ParsesCapturedApiResult) { const GURL base_url("https://base.doo/");
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc index b6000b9..b8faea8 100644 --- a/content/browser/frame_host/navigation_handle_impl.cc +++ b/content/browser/frame_host/navigation_handle_impl.cc
@@ -109,7 +109,6 @@ should_update_history_(false), subframe_entry_committed_(false), connection_info_(net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN), - should_ssl_errors_be_fatal_(false), original_url_(url), state_(INITIAL), is_transferring_(false), @@ -347,10 +346,6 @@ return ssl_info_; } -bool NavigationHandleImpl::ShouldSSLErrorsBeFatal() { - return should_ssl_errors_be_fatal_; -} - bool NavigationHandleImpl::HasCommitted() { return state_ == DID_COMMIT || state_ == DID_COMMIT_ERROR_PAGE; } @@ -457,8 +452,7 @@ base::Optional<net::SSLInfo> ssl_info, bool should_ssl_errors_be_fatal) { NavigationThrottle::ThrottleCheckResult result = NavigationThrottle::DEFER; - WillFailRequest(ssl_info, should_ssl_errors_be_fatal, - base::Bind(&UpdateThrottleCheckResult, &result)); + WillFailRequest(ssl_info, base::Bind(&UpdateThrottleCheckResult, &result)); // Reset the callback to ensure it will not be called later. complete_callback_.Reset(); @@ -714,13 +708,12 @@ void NavigationHandleImpl::WillFailRequest( base::Optional<net::SSLInfo> ssl_info, - bool should_ssl_errors_be_fatal, const ThrottleChecksFinishedCallback& callback) { TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this, "WillFailRequest"); if (ssl_info.has_value()) ssl_info_ = ssl_info.value(); - should_ssl_errors_be_fatal_ = should_ssl_errors_be_fatal; + complete_callback_ = callback; state_ = WILL_FAIL_REQUEST;
diff --git a/content/browser/frame_host/navigation_handle_impl.h b/content/browser/frame_host/navigation_handle_impl.h index fe65b9e9..7d2d9c5 100644 --- a/content/browser/frame_host/navigation_handle_impl.h +++ b/content/browser/frame_host/navigation_handle_impl.h
@@ -144,7 +144,6 @@ const net::HttpResponseHeaders* GetResponseHeaders() override; net::HttpResponseInfo::ConnectionInfo GetConnectionInfo() override; const net::SSLInfo& GetSSLInfo() override; - bool ShouldSSLErrorsBeFatal() override; void RegisterThrottleForTesting( std::unique_ptr<NavigationThrottle> navigation_throttle) override; NavigationThrottle::ThrottleCheckResult CallWillStartRequestForTesting( @@ -313,7 +312,6 @@ // cancel the navigation (with a custom error code and/or custom error page // HTML) or let the failure proceed as normal. void WillFailRequest(base::Optional<net::SSLInfo> ssl_info, - bool should_ssl_errors_be_fatal, const ThrottleChecksFinishedCallback& callback); // Called when the URLRequest has delivered response headers and metadata. @@ -495,7 +493,6 @@ scoped_refptr<net::HttpResponseHeaders> response_headers_; net::HttpResponseInfo::ConnectionInfo connection_info_; net::SSLInfo ssl_info_; - bool should_ssl_errors_be_fatal_; // The original url of the navigation. This may differ from |url_| if the // navigation encounters redirects.
diff --git a/content/browser/frame_host/navigation_handle_impl_unittest.cc b/content/browser/frame_host/navigation_handle_impl_unittest.cc index 5f7e8cb..76869f1 100644 --- a/content/browser/frame_host/navigation_handle_impl_unittest.cc +++ b/content/browser/frame_host/navigation_handle_impl_unittest.cc
@@ -151,7 +151,7 @@ // It's safe to use base::Unretained since the NavigationHandle is owned by // the NavigationHandleImplTest. test_handle_->WillFailRequest( - ssl_info, false, + ssl_info, base::Bind(&NavigationHandleImplTest::UpdateThrottleCheckResult, base::Unretained(this))); }
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index b3bfdd5..234e2041 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -460,7 +460,7 @@ // Don't create a NavigationHandle here to simulate what happened with the // old navigation code path (i.e. doesn't fire onPageFinished notification // for aborted loads). - OnRequestFailed(false, net::ERR_ABORTED, base::nullopt, false); + OnRequestFailed(false, net::ERR_ABORTED, base::nullopt); return; } #endif @@ -475,7 +475,7 @@ // it by OnRequestFailed(). CreateNavigationHandle(); OnRequestFailedInternal(false, net::ERR_BLOCKED_BY_CLIENT, base::nullopt, - false, false); + false); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -489,8 +489,7 @@ // Create a navigation handle so that the correct error code can be set on // it by OnRequestFailed(). CreateNavigationHandle(); - OnRequestFailedInternal(false, net::ERR_ABORTED, base::nullopt, false, - false); + OnRequestFailedInternal(false, net::ERR_ABORTED, base::nullopt, false); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -689,7 +688,7 @@ // otherwise block. if (CheckContentSecurityPolicyFrameSrc(true /* is redirect */) == CONTENT_SECURITY_POLICY_CHECK_FAILED) { - OnRequestFailed(false, net::ERR_BLOCKED_BY_CLIENT, base::nullopt, false); + OnRequestFailed(false, net::ERR_BLOCKED_BY_CLIENT, base::nullopt); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -700,7 +699,7 @@ CredentialedSubresourceCheckResult::BLOCK_REQUEST || CheckLegacyProtocolInSubresource() == LegacyProtocolInSubresourceCheckResult::BLOCK_REQUEST) { - OnRequestFailed(false, net::ERR_ABORTED, base::nullopt, false); + OnRequestFailed(false, net::ERR_ABORTED, base::nullopt); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -866,18 +865,15 @@ void NavigationRequest::OnRequestFailed( bool has_stale_copy_in_cache, int net_error, - const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal) { + const base::Optional<net::SSLInfo>& ssl_info) { NavigationRequest::OnRequestFailedInternal(has_stale_copy_in_cache, net_error, - ssl_info, - should_ssl_errors_be_fatal, false); + ssl_info, false); } void NavigationRequest::OnRequestFailedInternal( bool has_stale_copy_in_cache, int net_error, const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal, bool skip_throttles) { DCHECK(state_ == STARTED || state_ == RESPONSE_STARTED); // TODO(https://crbug.com/757633): Check that ssl_info.has_value() if @@ -947,9 +943,8 @@ } else { // Check if the navigation should be allowed to proceed. navigation_handle_->WillFailRequest( - ssl_info, should_ssl_errors_be_fatal, - base::Bind(&NavigationRequest::OnFailureChecksComplete, - base::Unretained(this), render_frame_host)); + ssl_info, base::Bind(&NavigationRequest::OnFailureChecksComplete, + base::Unretained(this), render_frame_host)); } } @@ -991,7 +986,7 @@ BrowserThread::UI, FROM_HERE, base::BindOnce(&NavigationRequest::OnRequestFailedInternal, weak_factory_.GetWeakPtr(), false, - result.net_error_code(), base::nullopt, false, true)); + result.net_error_code(), base::nullopt, true)); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -1088,7 +1083,7 @@ // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE if needed. DCHECK_EQ(net::ERR_ABORTED, result.net_error_code()); OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, - false, true); + true); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -1099,7 +1094,7 @@ result.action() == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) { DCHECK_EQ(net::ERR_BLOCKED_BY_CLIENT, result.net_error_code()); OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, - false, true); + true); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. return; @@ -1146,7 +1141,7 @@ download_manager->GetNavigationInterceptionCB( response_, std::move(handle_), ssl_info_.cert_status, frame_tree_node_->frame_tree_node_id())); - OnRequestFailed(false, net::ERR_ABORTED, base::nullopt, false); + OnRequestFailed(false, net::ERR_ABORTED, base::nullopt); return; } loader_->ProceedWithResponse(); @@ -1163,7 +1158,7 @@ net_error = net::ERR_ABORTED; // TODO(clamy): distinguish between CANCEL and CANCEL_AND_IGNORE. DCHECK_EQ(net::ERR_ABORTED, net_error); - OnRequestFailedInternal(false, net_error, base::nullopt, false, true); + OnRequestFailedInternal(false, net_error, base::nullopt, true); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. @@ -1173,7 +1168,7 @@ if (result.action() == NavigationThrottle::BLOCK_RESPONSE) { DCHECK_EQ(net::ERR_BLOCKED_BY_RESPONSE, result.net_error_code()); OnRequestFailedInternal(false, result.net_error_code(), base::nullopt, - false, true); + true); // DO NOT ADD CODE after this. The previous call to OnRequestFailed has // destroyed the NavigationRequest. return;
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h index 56b59d0..7b1cccab 100644 --- a/content/browser/frame_host/navigation_request.h +++ b/content/browser/frame_host/navigation_request.h
@@ -234,8 +234,7 @@ subresource_loader_params) override; void OnRequestFailed(bool has_stale_copy_in_cache, int net_error, - const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal) override; + const base::Optional<net::SSLInfo>& ssl_info) override; void OnRequestStarted(base::TimeTicks timestamp) override; // A version of OnRequestFailed() that allows skipping throttles, to be used @@ -243,7 +242,6 @@ void OnRequestFailedInternal(bool has_stale_copy_in_cache, int net_error, const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal, bool skip_throttles); // Called when the NavigationThrottles have been checked by the
diff --git a/content/browser/loader/navigation_url_loader_delegate.h b/content/browser/loader/navigation_url_loader_delegate.h index 8432bffe..cf6cc7e 100644 --- a/content/browser/loader/navigation_url_loader_delegate.h +++ b/content/browser/loader/navigation_url_loader_delegate.h
@@ -58,15 +58,14 @@ // Called if the request fails before receving a response. |net_error| is a // network error code for the failure. |has_stale_copy_in_cache| is true if // there is a stale copy of the unreachable page in cache. |ssl_info| is the - // SSL info for the request. |should_ssl_errors_be_fatal| indicates - // whether SSL errors for the request should be fatal. If |net_error| is a - // certificate error and the navigation request was for the main frame, the - // caller must pass a value for |ssl_info|. If |net_error| is not a - // certificate error, |ssl_info| and |should_ssl_errors_be_fatal| are ignored. - virtual void OnRequestFailed(bool has_stale_copy_in_cache, - int net_error, - const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal) = 0; + // SSL info for the request. If |net_error| is a certificate error and the + // navigation request was for the main frame, the caller must pass a value + // for |ssl_info|. If |net_error| is not a certificate error, |ssl_info| is + // ignored. + virtual void OnRequestFailed( + bool has_stale_copy_in_cache, + int net_error, + const base::Optional<net::SSLInfo>& ssl_info) = 0; // Called after the network request has begun on the IO thread at time // |timestamp|. This is just a thread hop but is used to compare timing
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 47f0a27..3eb0d63 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -120,8 +120,7 @@ bool should_ssl_errors_be_fatal) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - delegate_->OnRequestFailed(in_cache, net_error, ssl_info, - should_ssl_errors_be_fatal); + delegate_->OnRequestFailed(in_cache, net_error, ssl_info); } void NavigationURLLoaderImpl::NotifyRequestStarted(base::TimeTicks timestamp) {
diff --git a/content/browser/loader/navigation_url_loader_network_service.cc b/content/browser/loader/navigation_url_loader_network_service.cc index 48a7b97..5c6e9b6 100644 --- a/content/browser/loader/navigation_url_loader_network_service.cc +++ b/content/browser/loader/navigation_url_loader_network_service.cc
@@ -726,11 +726,8 @@ "&NavigationURLLoaderNetworkService", this, "success", false); - // TODO(https://crbug.com/757633): Pass real values in the case of cert - // errors. - bool should_ssl_errors_be_fatal = true; delegate_->OnRequestFailed(status.exists_in_cache, status.error_code, - status.ssl_info, should_ssl_errors_be_fatal); + status.ssl_info); } bool NavigationURLLoaderNetworkService::IsDownload() const {
diff --git a/content/browser/loader/navigation_url_loader_unittest.cc b/content/browser/loader/navigation_url_loader_unittest.cc index 2d7b22f..3a134214 100644 --- a/content/browser/loader/navigation_url_loader_unittest.cc +++ b/content/browser/loader/navigation_url_loader_unittest.cc
@@ -234,7 +234,6 @@ // Tests that request failures are propagated correctly for a (non-fatal) cert // error: // - |ssl_info| has the expected values. -// - |should_ssl_errors_be_fatal| is false. TEST_F(NavigationURLLoaderTest, RequestFailedCertError) { net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); @@ -252,13 +251,12 @@ EXPECT_TRUE(https_server.GetCertificate()->Equals(ssl_info.cert.get())); EXPECT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, net::MapCertStatusToNetError(ssl_info.cert_status)); - EXPECT_FALSE(delegate.should_ssl_errors_be_fatal()); + EXPECT_FALSE(ssl_info.is_fatal_cert_error); EXPECT_EQ(1, delegate.on_request_handled_counter()); } // Tests that request failures are propagated correctly for a fatal cert error: // - |ssl_info| has the expected values. -// - |should_ssl_errors_be_fatal| is true. TEST_F(NavigationURLLoaderTest, RequestFailedCertErrorFatal) { net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS); https_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME); @@ -285,7 +283,7 @@ EXPECT_TRUE(https_server.GetCertificate()->Equals(ssl_info.cert.get())); EXPECT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, net::MapCertStatusToNetError(ssl_info.cert_status)); - EXPECT_TRUE(delegate.should_ssl_errors_be_fatal()); + EXPECT_TRUE(ssl_info.is_fatal_cert_error); EXPECT_EQ(1, delegate.on_request_handled_counter()); }
diff --git a/content/browser/renderer_host/media/audio_sync_reader.cc b/content/browser/renderer_host/media/audio_sync_reader.cc index 5cbf3766..91d1f3e3f 100644 --- a/content/browser/renderer_host/media/audio_sync_reader.cc +++ b/content/browser/renderer_host/media/audio_sync_reader.cc
@@ -14,6 +14,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/shared_memory.h" #include "base/metrics/histogram_macros.h" +#include "base/numerics/safe_conversions.h" #include "base/strings/stringprintf.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" @@ -54,6 +55,10 @@ switches::kMuteAudio)), had_socket_error_(false), socket_(std::move(socket)), + // Validated for reasonable size in Create. + output_bus_buffer_size_( + AudioBus::CalculateMemorySize(params.channels(), + params.frames_per_buffer())), renderer_callback_count_(0), renderer_missed_callback_count_(0), trailing_renderer_missed_callback_count_(0), @@ -209,8 +214,17 @@ // For bitstream formats, we need the real data size and PCM frame count. AudioOutputBuffer* buffer = reinterpret_cast<AudioOutputBuffer*>(shared_memory_->memory()); - output_bus_->SetBitstreamDataSize(buffer->params.bitstream_data_size); - output_bus_->SetBitstreamFrames(buffer->params.bitstream_frames); + uint32_t data_size = buffer->params.bitstream_data_size; + uint32_t bitstream_frames = buffer->params.bitstream_frames; + // |bitstream_frames| is cast to int below, so it must fit. + if (data_size > output_bus_buffer_size_ || + !base::IsValueInRangeForNumericType<int>(bitstream_frames)) { + // Received data doesn't fit in the buffer, shouldn't happen. + dest->Zero(); + return; + } + output_bus_->SetBitstreamDataSize(data_size); + output_bus_->SetBitstreamFrames(bitstream_frames); } output_bus_->CopyTo(dest); }
diff --git a/content/browser/renderer_host/media/audio_sync_reader.h b/content/browser/renderer_host/media/audio_sync_reader.h index cdf55d7..16715be 100644 --- a/content/browser/renderer_host/media/audio_sync_reader.h +++ b/content/browser/renderer_host/media/audio_sync_reader.h
@@ -79,6 +79,8 @@ // Socket for transmitting audio data. std::unique_ptr<base::CancelableSyncSocket> socket_; + const uint32_t output_bus_buffer_size_; + // Shared memory wrapper used for transferring audio data to Read() callers. std::unique_ptr<media::AudioBus> output_bus_;
diff --git a/content/browser/renderer_host/media/audio_sync_reader_unittest.cc b/content/browser/renderer_host/media/audio_sync_reader_unittest.cc new file mode 100644 index 0000000..f9605d1 --- /dev/null +++ b/content/browser/renderer_host/media/audio_sync_reader_unittest.cc
@@ -0,0 +1,108 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/renderer_host/media/audio_sync_reader.h" + +#include <limits> +#include <memory> +#include <type_traits> +#include <utility> + +#include "base/memory/shared_memory.h" +#include "base/sync_socket.h" +#include "base/time/time.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "media/base/audio_bus.h" +#include "media/base/audio_parameters.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::TestWithParam; + +namespace content { + +static_assert( + std::is_unsigned<decltype( + media::AudioOutputBufferParameters::bitstream_data_size)>::value, + "If |bitstream_data_size| is ever made signed, add tests for negative " + "buffer sizes."); +enum OverflowTestCase { + kZero, + kNoOverflow, + kOverflowByOne, + kOverflowByOneThousand, + kOverflowByMax +}; + +static const OverflowTestCase overflow_test_case_values[]{ + kZero, kNoOverflow, kOverflowByOne, kOverflowByOneThousand, kOverflowByMax}; + +class AudioSyncReaderBitstreamTest : public TestWithParam<OverflowTestCase> { + public: + AudioSyncReaderBitstreamTest() {} + ~AudioSyncReaderBitstreamTest() override {} + + private: + TestBrowserThreadBundle threads; +}; + +TEST_P(AudioSyncReaderBitstreamTest, BitstreamBufferOverflow_DoesNotWriteOOB) { + const int kSampleRate = 44100; + const int kBitsPerSample = 32; + const int kFramesPerBuffer = 1; + media::AudioParameters params(media::AudioParameters::AUDIO_BITSTREAM_AC3, + media::CHANNEL_LAYOUT_STEREO, kSampleRate, + kBitsPerSample, kFramesPerBuffer); + + auto socket = std::make_unique<base::CancelableSyncSocket>(); + std::unique_ptr<media::AudioBus> output_bus = media::AudioBus::Create(params); + std::unique_ptr<AudioSyncReader> reader = + AudioSyncReader::Create(params, socket.get()); + const base::SharedMemory* shmem = reader->shared_memory(); + media::AudioOutputBuffer* buffer = + reinterpret_cast<media::AudioOutputBuffer*>(shmem->memory()); + reader->RequestMoreData(base::TimeDelta(), base::TimeTicks(), 0); + + uint32_t signal; + EXPECT_EQ(socket->Receive(&signal, sizeof(signal)), sizeof(signal)); + + // So far, this is an ordinary stream. + // Now |reader| expects data to be writted to the shared memory. The renderer + // says how much data was written. + switch (GetParam()) { + case kZero: + buffer->params.bitstream_data_size = 0; + break; + case kNoOverflow: + buffer->params.bitstream_data_size = + shmem->mapped_size() - sizeof(media::AudioOutputBufferParameters); + break; + case kOverflowByOne: + buffer->params.bitstream_data_size = + shmem->mapped_size() - sizeof(media::AudioOutputBufferParameters) + 1; + break; + case kOverflowByOneThousand: + buffer->params.bitstream_data_size = + shmem->mapped_size() - sizeof(media::AudioOutputBufferParameters) + + 1000; + break; + case kOverflowByMax: + buffer->params.bitstream_data_size = std::numeric_limits<decltype( + buffer->params.bitstream_data_size)>::max(); + break; + } + + ++signal; + EXPECT_EQ(socket->Send(&signal, sizeof(signal)), sizeof(signal)); + + // The purpose of the test is to ensure this call doesn't result in undefined + // behavior, which should be verified by sanitizers. + reader->Read(output_bus.get()); +} + +INSTANTIATE_TEST_CASE_P(AudioSyncReaderTest, + AudioSyncReaderBitstreamTest, + ::testing::ValuesIn(overflow_test_case_values)); + +} // namespace content
diff --git a/content/public/browser/navigation_handle.h b/content/public/browser/navigation_handle.h index 31fece5..300adbb7 100644 --- a/content/public/browser/navigation_handle.h +++ b/content/public/browser/navigation_handle.h
@@ -243,9 +243,6 @@ // scheme, returns an empty object. virtual const net::SSLInfo& GetSSLInfo() = 0; - // Whether the failure for a certificate error should be fatal. - virtual bool ShouldSSLErrorsBeFatal() = 0; - // Returns the ID of the URLRequest associated with this navigation. Can only // be called from NavigationThrottle::WillProcessResponse and // WebContentsObserver::ReadyToCommitNavigation.
diff --git a/content/renderer/media/rtc_peer_connection_handler.cc b/content/renderer/media/rtc_peer_connection_handler.cc index 5221587..c6da4bb 100644 --- a/content/renderer/media/rtc_peer_connection_handler.cc +++ b/content/renderer/media/rtc_peer_connection_handler.cc
@@ -1923,14 +1923,11 @@ bool RTCPeerConnectionHandler::RemoveTrack(blink::WebRTCRtpSender* web_sender) { DCHECK(thread_checker_.CalledOnValidThread()); - RTCRtpSender* sender = static_cast<RTCRtpSender*>(web_sender); - if (!native_peer_connection_->RemoveTrack(sender->webrtc_sender())) + auto it = rtp_senders_.find(web_sender->Id()); + DCHECK(it != rtp_senders_.end()); + if (!it->second->RemoveFromPeerConnection(native_peer_connection_.get())) return false; - sender->OnRemoved(); - // Make sure |rtp_senders_| is up-to-date. When |AddStream| and |RemoveStream| - // is implemented using |AddTrack| and |RemoveTrack|, add and remove - // |rtp_senders_| there. https://crbug.com/738929 - GetSenders(); + rtp_senders_.erase(it); return true; }
diff --git a/content/renderer/media/webrtc/rtc_rtp_sender.cc b/content/renderer/media/webrtc/rtc_rtp_sender.cc index 7743325..824e0ab8 100644 --- a/content/renderer/media/webrtc/rtc_rtp_sender.cc +++ b/content/renderer/media/webrtc/rtc_rtp_sender.cc
@@ -40,10 +40,15 @@ return stream_ref_copies; } - void OnRemoved() { - // TODO(hbos): We should do |webrtc_sender_->SetTrack(null)| but that is - // not allowed on a stopped sender. https://crbug.com/webrtc/7945 + bool RemoveFromPeerConnection(webrtc::PeerConnectionInterface* pc) { + if (!pc->RemoveTrack(webrtc_sender_)) + return false; + // TODO(hbos): Removing the track should null the sender's track, or we + // should do |webrtc_sender_->SetTrack(null)| but that is not allowed on a + // stopped sender. In the meantime, there is a discrepancy between layers. + // https://crbug.com/webrtc/7945 track_ref_.reset(); + return true; } private: @@ -106,10 +111,6 @@ return track_ref ? track_ref->web_track() : blink::WebMediaStreamTrack(); } -void RTCRtpSender::OnRemoved() { - internal_->OnRemoved(); -} - webrtc::RtpSenderInterface* RTCRtpSender::webrtc_sender() const { return internal_->webrtc_sender(); } @@ -119,4 +120,9 @@ return track_ref ? track_ref->webrtc_track() : nullptr; } +bool RTCRtpSender::RemoveFromPeerConnection( + webrtc::PeerConnectionInterface* pc) { + return internal_->RemoveFromPeerConnection(pc); +} + } // namespace content
diff --git a/content/renderer/media/webrtc/rtc_rtp_sender.h b/content/renderer/media/webrtc/rtc_rtp_sender.h index 73e48e9..fc794a5d 100644 --- a/content/renderer/media/webrtc/rtc_rtp_sender.h +++ b/content/renderer/media/webrtc/rtc_rtp_sender.h
@@ -13,6 +13,7 @@ #include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.h" #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" #include "third_party/WebKit/public/platform/WebRTCRtpSender.h" +#include "third_party/webrtc/api/peerconnectioninterface.h" #include "third_party/webrtc/api/rtpsenderinterface.h" #include "third_party/webrtc/rtc_base/scoped_ref_ptr.h" @@ -46,15 +47,9 @@ uintptr_t Id() const override; blink::WebMediaStreamTrack Track() const override; - // Nulls the |Track|. Must be called when the webrtc layer sender is removed - // from the peer connection and the webrtc sender's track nulled so that this - // is made visible to upper layers. - // TODO(hbos): Make the "ReplaceTrack" and "RemoveTrack" interaction with - // webrtc layer part of this class as to not make the operation a two-step - // process. https://crbug.com/790007 - void OnRemoved(); webrtc::RtpSenderInterface* webrtc_sender() const; const webrtc::MediaStreamTrackInterface* webrtc_track() const; + bool RemoveFromPeerConnection(webrtc::PeerConnectionInterface* pc); private: class RTCRtpSenderInternal;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index d8ffa367..c07b4b1 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1366,6 +1366,7 @@ "../browser/renderer_host/media/audio_output_authorization_handler_unittest.cc", "../browser/renderer_host/media/audio_output_delegate_impl_unittest.cc", "../browser/renderer_host/media/audio_renderer_host_unittest.cc", + "../browser/renderer_host/media/audio_sync_reader_unittest.cc", "../browser/renderer_host/media/fake_video_capture_device_launcher.cc", "../browser/renderer_host/media/fake_video_capture_device_launcher.h", "../browser/renderer_host/media/fake_video_capture_provider.cc",
diff --git a/content/test/test_navigation_url_loader.cc b/content/test/test_navigation_url_loader.cc index 121c88e..e3c48ea 100644 --- a/content/test/test_navigation_url_loader.cc +++ b/content/test/test_navigation_url_loader.cc
@@ -54,7 +54,7 @@ } void TestNavigationURLLoader::SimulateError(int error_code) { - delegate_->OnRequestFailed(false, error_code, base::nullopt, false); + delegate_->OnRequestFailed(false, error_code, base::nullopt); } void TestNavigationURLLoader::CallOnRequestRedirected(
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc index ef5b9b1..cbe46b9 100644 --- a/content/test/test_navigation_url_loader_delegate.cc +++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -79,12 +79,10 @@ void TestNavigationURLLoaderDelegate::OnRequestFailed( bool in_cache, int net_error, - const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal) { + const base::Optional<net::SSLInfo>& ssl_info) { net_error_ = net_error; if (ssl_info.has_value()) ssl_info_ = ssl_info.value(); - should_ssl_errors_be_fatal_ = should_ssl_errors_be_fatal; if (request_failed_) request_failed_->Quit(); }
diff --git a/content/test/test_navigation_url_loader_delegate.h b/content/test/test_navigation_url_loader_delegate.h index 674c576..ae2c26d 100644 --- a/content/test/test_navigation_url_loader_delegate.h +++ b/content/test/test_navigation_url_loader_delegate.h
@@ -40,9 +40,6 @@ StreamHandle* body() const { return body_.get(); } int net_error() const { return net_error_; } const net::SSLInfo& ssl_info() const { return ssl_info_; } - bool should_ssl_errors_be_fatal() const { - return should_ssl_errors_be_fatal_; - } int on_request_handled_counter() const { return on_request_handled_counter_; } bool is_download() const { return is_download_; } @@ -73,8 +70,7 @@ subresource_loader_params) override; void OnRequestFailed(bool in_cache, int net_error, - const base::Optional<net::SSLInfo>& ssl_info, - bool should_ssl_errors_be_fatal) override; + const base::Optional<net::SSLInfo>& ssl_info) override; void OnRequestStarted(base::TimeTicks timestamp) override; private: @@ -85,7 +81,6 @@ mojo::ScopedDataPipeConsumerHandle handle_; int net_error_; net::SSLInfo ssl_info_; - bool should_ssl_errors_be_fatal_; int on_request_handled_counter_; bool is_download_;
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm index 44fcd944..e9adf26b 100644 --- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm +++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
@@ -134,6 +134,13 @@ self.contractButton.hidden = NO; self.contractButton.alpha = 1; }]; + [animator addCompletion:^(UIViewAnimatingPosition finalPosition) { + CGFloat borderWidth = (finalPosition == UIViewAnimatingPositionEnd) + ? 0 + : kLocationBarBorderWidth; + self.locationBarContainer.layer.borderWidth = borderWidth; + }]; + self.expanded = YES; } @@ -143,6 +150,7 @@ [NSLayoutConstraint deactivateConstraints:self.expandedToolbarConstraints]; [NSLayoutConstraint activateConstraints:self.regularToolbarConstraints]; [animator addAnimations:^{ + self.locationBarContainer.layer.borderWidth = kLocationBarBorderWidth; [self.view layoutIfNeeded]; self.contractButton.hidden = YES; self.contractButton.alpha = 0;
diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc index 99b3473..4fb4eb30 100644 --- a/media/audio/audio_output_controller.cc +++ b/media/audio/audio_output_controller.cc
@@ -350,6 +350,10 @@ } if (will_monitor_audio_levels()) { + // Note: this code path should never be hit when using bitstream streams. + // Scan doesn't expect compressed audio, so it may go out of bounds trying + // to read |frames| frames of PCM data. + CHECK(!params_.IsBitstreamFormat()); power_monitor_.Scan(*dest, frames); const auto now = base::TimeTicks::Now();
diff --git a/media/audio/cras/audio_manager_cras.cc b/media/audio/cras/audio_manager_cras.cc index 42b26de7..c3afdb0 100644 --- a/media/audio/cras/audio_manager_cras.cc +++ b/media/audio/cras/audio_manager_cras.cc
@@ -225,6 +225,11 @@ : base::Uint64ToString(output_device_it->id); } +std::string AudioManagerCras::GetDefaultInputDeviceID() { + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); + return base::Uint64ToString(GetPrimaryActiveInputNode()); +} + std::string AudioManagerCras::GetDefaultOutputDeviceID() { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); return base::Uint64ToString(GetPrimaryActiveOutputNode());
diff --git a/media/audio/cras/audio_manager_cras.h b/media/audio/cras/audio_manager_cras.h index 532d1f20..c3215ed 100644 --- a/media/audio/cras/audio_manager_cras.h +++ b/media/audio/cras/audio_manager_cras.h
@@ -34,6 +34,7 @@ const std::string& device_id) override; std::string GetAssociatedOutputDeviceID( const std::string& input_device_id) override; + std::string GetDefaultInputDeviceID() override; std::string GetDefaultOutputDeviceID() override; std::string GetGroupIDOutput(const std::string& output_device_id) override; std::string GetGroupIDInput(const std::string& input_device_id) override;
diff --git a/media/cdm/cdm_module.cc b/media/cdm/cdm_module.cc index 2bf89f1..b0d65ba4 100644 --- a/media/cdm/cdm_module.cc +++ b/media/cdm/cdm_module.cc
@@ -119,7 +119,7 @@ #else bool CdmModule::Initialize(const base::FilePath& cdm_path) { #endif // BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) - DVLOG(2) << __func__ << ": cdm_path = " << cdm_path.value(); + DVLOG(1) << __func__ << ": cdm_path = " << cdm_path.value(); DCHECK(!was_initialize_called_); was_initialize_called_ = true; @@ -167,9 +167,10 @@ } // In case of crashes, provide CDM version to facilitate investigation. - crash_reporter::InitializeCrashKeys(); - static crash_reporter::CrashKeyString<32> cdm_version_key("cdm-version"); std::string cdm_version = get_cdm_version_func_(); + DVLOG(2) << __func__ << ": cdm_version = " << cdm_version; + + static crash_reporter::CrashKeyString<32> cdm_version_key("cdm-version"); cdm_version_key.Set(cdm_version); #if defined(OS_WIN)
diff --git a/mojo/public/cpp/system/file_data_pipe_producer.cc b/mojo/public/cpp/system/file_data_pipe_producer.cc index 6b19a173..d74ed93b 100644 --- a/mojo/public/cpp/system/file_data_pipe_producer.cc +++ b/mojo/public/cpp/system/file_data_pipe_producer.cc
@@ -32,8 +32,6 @@ switch (error) { case base::File::FILE_OK: return MOJO_RESULT_OK; - case base::File::FILE_ERROR_EXISTS: - return MOJO_RESULT_ALREADY_EXISTS; case base::File::FILE_ERROR_NOT_FOUND: return MOJO_RESULT_NOT_FOUND; case base::File::FILE_ERROR_SECURITY: @@ -132,7 +130,7 @@ if (result != MOJO_RESULT_OK) { // Either the consumer pipe has been closed or something terrible // happened. In any case, we'll never be able to write more data. - Finish(MOJO_RESULT_ABORTED); + Finish(result); return; } @@ -149,7 +147,7 @@ if (result == MOJO_RESULT_SHOULD_WAIT) return; if (result != MOJO_RESULT_OK) { - Finish(MOJO_RESULT_ABORTED); + Finish(result); return; }
diff --git a/mojo/public/cpp/system/file_data_pipe_producer.h b/mojo/public/cpp/system/file_data_pipe_producer.h index f4d325a6..a8e4393 100644 --- a/mojo/public/cpp/system/file_data_pipe_producer.h +++ b/mojo/public/cpp/system/file_data_pipe_producer.h
@@ -39,8 +39,14 @@ // // If the write is successful |result| will be |MOJO_RESULT_OK|. Otherwise // (e.g. if the producer detects the consumer is closed and the pipe has no - // remaining capacity, or if file reads fail for any reason) |result| will be - // |MOJO_RESULT_ABORTED|. + // remaining capacity, or if file open/reads fail for any reason) |result| + // will be one of the following: + // + // |MOJO_RESULT_ABORTED| + // |MOJO_RESULT_NOT_FOUND| + // |MOJO_RESULT_PERMISSION_DENIED| + // |MOJO_RESULT_RESOURCE_EXHAUSTED| + // |MOJO_RESULT_UNKNOWN| // // Note that if the FileDataPipeProducer is destroyed before |callback| can be // invoked, |callback| is *never* invoked, and the write will be permanently
diff --git a/net/quic/chromium/crypto/proof_verifier_chromium.cc b/net/quic/chromium/crypto/proof_verifier_chromium.cc index 5217270..fa695a1 100644 --- a/net/quic/chromium/crypto/proof_verifier_chromium.cc +++ b/net/quic/chromium/crypto/proof_verifier_chromium.cc
@@ -32,7 +32,7 @@ namespace net { ProofVerifyDetailsChromium::ProofVerifyDetailsChromium() - : pkp_bypassed(false) {} + : pkp_bypassed(false), is_fatal_cert_error(false) {} ProofVerifyDetailsChromium::~ProofVerifyDetailsChromium() {} @@ -490,6 +490,10 @@ result = ct_result; } + verify_details_->is_fatal_cert_error = + IsCertStatusError(cert_status) && !IsCertStatusMinorError(cert_status) && + transport_security_state_->ShouldSSLErrorsBeFatal(hostname_); + if (result != OK) { std::string error_string = ErrorToString(result); error_details_ = StringPrintf("Failed to verify certificate chain: %s",
diff --git a/net/quic/chromium/crypto/proof_verifier_chromium.h b/net/quic/chromium/crypto/proof_verifier_chromium.h index f5b0db50..53ddce4e 100644 --- a/net/quic/chromium/crypto/proof_verifier_chromium.h +++ b/net/quic/chromium/crypto/proof_verifier_chromium.h
@@ -48,6 +48,10 @@ // True if PKP was bypassed due to a local trust anchor. bool pkp_bypassed; + + // True if there was a certificate error which should be treated as fatal, + // and false otherwise. + bool is_fatal_cert_error; }; // ProofVerifyContextChromium is the implementation-specific information that a
diff --git a/net/quic/chromium/crypto/proof_verifier_chromium_test.cc b/net/quic/chromium/crypto/proof_verifier_chromium_test.cc index 51956f3..6155dd35 100644 --- a/net/quic/chromium/crypto/proof_verifier_chromium_test.cc +++ b/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
@@ -445,6 +445,67 @@ return hashes; } +TEST_F(ProofVerifierChromiumTest, IsFatalErrorNotSetForNonFatalError) { + scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); + ASSERT_TRUE(test_cert); + + CertVerifyResult dummy_result; + dummy_result.cert_status = MapNetErrorToCertStatus(ERR_CERT_DATE_INVALID); + dummy_result.verified_cert = test_cert; + + MockCertVerifier dummy_verifier; + dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, + ERR_CERT_DATE_INVALID); + + ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, + &transport_security_state_, + ct_verifier_.get()); + + std::unique_ptr<DummyProofVerifierCallback> callback( + new DummyProofVerifierCallback); + QuicAsyncStatus status = proof_verifier.VerifyProof( + kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash, + certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(), + &error_details_, &details_, std::move(callback)); + ASSERT_EQ(QUIC_FAILURE, status); + + ProofVerifyDetailsChromium* verify_details = + static_cast<ProofVerifyDetailsChromium*>(details_.get()); + EXPECT_FALSE(verify_details->is_fatal_cert_error); +} + +TEST_F(ProofVerifierChromiumTest, IsFatalErrorSetForFatalError) { + scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate(); + ASSERT_TRUE(test_cert); + + CertVerifyResult dummy_result; + dummy_result.cert_status = MapNetErrorToCertStatus(ERR_CERT_DATE_INVALID); + dummy_result.verified_cert = test_cert; + + MockCertVerifier dummy_verifier; + dummy_verifier.AddResultForCert(test_cert.get(), dummy_result, + ERR_CERT_DATE_INVALID); + + const base::Time expiry = + base::Time::Now() + base::TimeDelta::FromSeconds(1000); + transport_security_state_.AddHSTS(kTestHostname, expiry, true); + + ProofVerifierChromium proof_verifier(&dummy_verifier, &ct_policy_enforcer_, + &transport_security_state_, + ct_verifier_.get()); + + std::unique_ptr<DummyProofVerifierCallback> callback( + new DummyProofVerifierCallback); + QuicAsyncStatus status = proof_verifier.VerifyProof( + kTestHostname, kTestPort, kTestConfig, QUIC_VERSION_35, kTestChloHash, + certs_, kTestEmptySCT, GetTestSignature(), verify_context_.get(), + &error_details_, &details_, std::move(callback)); + ASSERT_EQ(QUIC_FAILURE, status); + ProofVerifyDetailsChromium* verify_details = + static_cast<ProofVerifyDetailsChromium*>(details_.get()); + EXPECT_TRUE(verify_details->is_fatal_cert_error); +} + // Test that PKP is enforced for certificates that chain up to known roots. TEST_F(ProofVerifierChromiumTest, PKPEnforced) { scoped_refptr<X509Certificate> test_cert = GetTestServerCertificate();
diff --git a/net/quic/chromium/quic_chromium_client_session.cc b/net/quic/chromium/quic_chromium_client_session.cc index 5e5935d..1d288dde 100644 --- a/net/quic/chromium/quic_chromium_client_session.cc +++ b/net/quic/chromium/quic_chromium_client_session.cc
@@ -692,6 +692,7 @@ transport_security_state_(transport_security_state), server_info_(std::move(server_info)), pkp_bypassed_(false), + is_fatal_cert_error_(false), num_total_streams_(0), task_runner_(task_runner), net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::QUIC_SESSION)), @@ -1089,6 +1090,7 @@ ssl_info->security_bits = security_bits; ssl_info->handshake_type = SSLInfo::HANDSHAKE_FULL; ssl_info->pinning_failure_log = pinning_failure_log_; + ssl_info->is_fatal_cert_error = is_fatal_cert_error_; ssl_info->UpdateCertificateTransparencyInfo(*ct_verify_result_); @@ -1909,6 +1911,7 @@ ct_verify_result_ = std::move(ct_verify_result_copy); logger_->OnCertificateVerified(*cert_verify_result_); pkp_bypassed_ = verify_details_chromium->pkp_bypassed; + is_fatal_cert_error_ = verify_details_chromium->is_fatal_cert_error; } void QuicChromiumClientSession::StartReading() {
diff --git a/net/quic/chromium/quic_chromium_client_session.h b/net/quic/chromium/quic_chromium_client_session.h index 588b968..ec43184 100644 --- a/net/quic/chromium/quic_chromium_client_session.h +++ b/net/quic/chromium/quic_chromium_client_session.h
@@ -688,6 +688,7 @@ std::unique_ptr<ct::CTVerifyResult> ct_verify_result_; std::string pinning_failure_log_; bool pkp_bypassed_; + bool is_fatal_cert_error_; HandleSet handles_; StreamRequestQueue stream_requests_; std::vector<CompletionCallback> waiting_for_confirmation_callbacks_;
diff --git a/net/quic/chromium/quic_chromium_client_session_test.cc b/net/quic/chromium/quic_chromium_client_session_test.cc index 293479d..1833e3a1 100644 --- a/net/quic/chromium/quic_chromium_client_session_test.cc +++ b/net/quic/chromium/quic_chromium_client_session_test.cc
@@ -208,6 +208,53 @@ QuicChromiumClientSessionTest, ::testing::ValuesIn(AllSupportedTransportVersions())); +TEST_P(QuicChromiumClientSessionTest, IsFatalErrorNotSetForNonFatalError) { + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; + std::unique_ptr<QuicEncryptedPacket> settings_packet( + client_maker_.MakeInitialSettingsPacket(1, nullptr)); + MockWrite writes[] = { + MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; + socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, + arraysize(writes))); + Initialize(); + + SSLInfo ssl_info; + ProofVerifyDetailsChromium details; + details.cert_verify_result.verified_cert = + ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); + details.cert_verify_result.cert_status = + MapNetErrorToCertStatus(ERR_CERT_DATE_INVALID); + details.is_fatal_cert_error = false; + CompleteCryptoHandshake(); + session_->OnProofVerifyDetailsAvailable(details); + + ASSERT_TRUE(session_->GetSSLInfo(&ssl_info)); + EXPECT_FALSE(ssl_info.is_fatal_cert_error); +} + +TEST_P(QuicChromiumClientSessionTest, IsFatalErrorSetForFatalError) { + MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; + std::unique_ptr<QuicEncryptedPacket> settings_packet( + client_maker_.MakeInitialSettingsPacket(1, nullptr)); + MockWrite writes[] = { + MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; + socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, + arraysize(writes))); + Initialize(); + + SSLInfo ssl_info; + ProofVerifyDetailsChromium details; + details.cert_verify_result.verified_cert = + ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"); + details.cert_verify_result.cert_status = + MapNetErrorToCertStatus(ERR_CERT_DATE_INVALID); + details.is_fatal_cert_error = true; + CompleteCryptoHandshake(); + session_->OnProofVerifyDetailsAvailable(details); + ASSERT_TRUE(session_->GetSSLInfo(&ssl_info)); + EXPECT_TRUE(ssl_info.is_fatal_cert_error); +} + TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; std::unique_ptr<QuicEncryptedPacket> settings_packet(
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index c03be38..c13ccac 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -413,6 +413,7 @@ transport_security_state_(context.transport_security_state), policy_enforcer_(context.ct_policy_enforcer), pkp_bypassed_(false), + is_fatal_cert_error_(false), connect_error_details_(SSLErrorDetails::kOther), net_log_(transport_->socket()->NetLog()), weak_factory_(this) { @@ -674,7 +675,7 @@ ssl_info->token_binding_key_param = tb_negotiated_param_; ssl_info->pinning_failure_log = pinning_failure_log_; ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result; - + ssl_info->is_fatal_cert_error = is_fatal_cert_error_; AddCTInfoToSSLInfo(ssl_info); const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get()); @@ -1234,6 +1235,10 @@ result = ct_result; } + is_fatal_cert_error_ = + IsCertStatusError(cert_status) && !IsCertStatusMinorError(cert_status) && + transport_security_state_->ShouldSSLErrorsBeFatal(host_and_port_.host()); + if (result == OK) { DCHECK(!certificate_verified_); certificate_verified_ = true;
diff --git a/net/socket/ssl_client_socket_impl.h b/net/socket/ssl_client_socket_impl.h index fb55303..52f40b1 100644 --- a/net/socket/ssl_client_socket_impl.h +++ b/net/socket/ssl_client_socket_impl.h
@@ -353,6 +353,10 @@ // True if PKP is bypassed due to a local trust anchor. bool pkp_bypassed_; + // True if there was a certificate error which should be treated as fatal, + // and false otherwise. + bool is_fatal_cert_error_; + SSLErrorDetails connect_error_details_; NetLogWithSource net_log_;
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc index 6891d8e6..466bc71 100644 --- a/net/socket/ssl_client_socket_unittest.cc +++ b/net/socket/ssl_client_socket_unittest.cc
@@ -2757,6 +2757,40 @@ // buffer. Call SSL_pending. } +// Tests that |is_fatal_cert_error| does not get set for a certificate error, +// on a non-HSTS host. +TEST_F(SSLClientSocketTest, IsFatalErrorNotSetOnNonFatalError) { + cert_verifier_->set_default_result(ERR_CERT_DATE_INVALID); + SpawnedTestServer::SSLOptions ssl_options( + SpawnedTestServer::SSLOptions::CERT_CHAIN_WRONG_ROOT); + ASSERT_TRUE(StartTestServer(ssl_options)); + SSLConfig ssl_config; + int rv; + ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); + SSLInfo ssl_info; + ASSERT_TRUE(sock_->GetSSLInfo(&ssl_info)); + EXPECT_FALSE(ssl_info.is_fatal_cert_error); +} + +// Tests that |is_fatal_cert_error| gets set for a certificate error on an +// HSTS host. +TEST_F(SSLClientSocketTest, IsFatalErrorSetOnFatalError) { + cert_verifier_->set_default_result(ERR_CERT_DATE_INVALID); + SpawnedTestServer::SSLOptions ssl_options( + SpawnedTestServer::SSLOptions::CERT_CHAIN_WRONG_ROOT); + ASSERT_TRUE(StartTestServer(ssl_options)); + SSLConfig ssl_config; + int rv; + const base::Time expiry = + base::Time::Now() + base::TimeDelta::FromSeconds(1000); + context_.transport_security_state->AddHSTS( + spawned_test_server()->host_port_pair().host(), expiry, true); + ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); + SSLInfo ssl_info; + ASSERT_TRUE(sock_->GetSSLInfo(&ssl_info)); + EXPECT_TRUE(ssl_info.is_fatal_cert_error); +} + // Tests that IsConnectedAndIdle treats a socket as idle even if a Write hasn't // been flushed completely out of SSLClientSocket's internal buffers. This is a // regression test for https://crbug.com/466147.
diff --git a/net/ssl/ssl_info.cc b/net/ssl/ssl_info.cc index 28fcc14..f80610f2 100644 --- a/net/ssl/ssl_info.cc +++ b/net/ssl/ssl_info.cc
@@ -48,6 +48,7 @@ ct::CTPolicyCompliance::CT_POLICY_COMPLIANCE_DETAILS_NOT_AVAILABLE; ct_policy_compliance_required = false; ocsp_result = OCSPVerifyResult(); + is_fatal_cert_error = false; } void SSLInfo::SetCertError(int error) {
diff --git a/net/ssl/ssl_info.h b/net/ssl/ssl_info.h index fd39bbc..2d903cf2 100644 --- a/net/ssl/ssl_info.h +++ b/net/ssl/ssl_info.h
@@ -139,6 +139,10 @@ // OCSP stapling details. OCSPVerifyResult ocsp_result; + + // True if there was a certificate error which should be treated as fatal, + // and false otherwise. + bool is_fatal_cert_error; }; } // namespace net
diff --git a/services/resource_coordinator/memory_instrumentation/graph.h b/services/resource_coordinator/memory_instrumentation/graph.h index 2523afefe..25abb63 100644 --- a/services/resource_coordinator/memory_instrumentation/graph.h +++ b/services/resource_coordinator/memory_instrumentation/graph.h
@@ -128,6 +128,14 @@ void add_not_owning_sub_size(uint64_t addition) { not_owning_sub_size_ += addition; } + double owned_coefficient() const { return owned_coefficient_; } + void set_owned_coefficient(double owned_coefficient) { + owned_coefficient_ = owned_coefficient; + } + double owning_coefficient() const { return owning_coefficient_; } + void set_owning_coefficient(double owning_coefficient) { + owning_coefficient_ = owning_coefficient; + } GlobalDumpGraph::Edge* owns_edge() const { return owns_edge_; } std::map<std::string, Node*>* children() { return &children_; } std::vector<GlobalDumpGraph::Edge*>* owned_by_edges() { @@ -146,6 +154,8 @@ bool weak_ = false; uint64_t not_owning_sub_size_ = 0; uint64_t not_owned_sub_size_ = 0; + double owned_coefficient_ = 1; + double owning_coefficient_ = 1; GlobalDumpGraph::Edge* owns_edge_; std::vector<GlobalDumpGraph::Edge*> owned_by_edges_;
diff --git a/services/resource_coordinator/memory_instrumentation/graph_processor.cc b/services/resource_coordinator/memory_instrumentation/graph_processor.cc index f3f9e065..520c59f 100644 --- a/services/resource_coordinator/memory_instrumentation/graph_processor.cc +++ b/services/resource_coordinator/memory_instrumentation/graph_processor.cc
@@ -149,6 +149,15 @@ CalculateDumpSubSizes(node); } } + + // Tenth pass: Calculate owned and owning coefficients of owned and owner + // nodes. + { + auto it = global_graph->VisitInDepthFirstPostOrder(); + while (Node* node = it.next()) { + CalculateDumpOwnershipCoefficient(node); + } + } } // static @@ -626,4 +635,75 @@ } } +// static +void GraphProcessor::CalculateDumpOwnershipCoefficient(Node* node) { + // Completely skip dumps with undefined size. + base::Optional<uint64_t> size_opt = GetSizeEntryOfNode(node); + if (!size_opt) + return; + + // We only need to consider owned dumps. + if (node->owned_by_edges()->empty()) + return; + + // Sort the owners in decreasing order of ownership priority and + // increasing order of not-owning sub-size (in case of equal priority). + std::vector<Edge*> owners = *node->owned_by_edges(); + std::sort(owners.begin(), owners.end(), [](Edge* a, Edge* b) { + if (a->priority() == b->priority()) { + return a->source()->not_owning_sub_size() < + b->source()->not_owning_sub_size(); + } + return b->priority() < a->priority(); + }); + + // Loop over the list of owners and distribute the owned dump's not-owned + // sub-size among them according to their ownership priority and + // not-owning sub-size. + uint64_t already_attributed_sub_size = 0; + for (auto current_it = owners.begin(); current_it != owners.end();) { + // Find the position of the first owner with lower priority. + int current_priority = (*current_it)->priority(); + auto next_it = + std::find_if(current_it, owners.end(), [current_priority](Edge* edge) { + return edge->priority() < current_priority; + }); + + // Compute the number of nodes which have the same priority as current. + size_t difference = std::distance(current_it, next_it); + + // Visit the owners with the same priority in increasing order of + // not-owned sub-size, split the owned memory among them appropriately, + // and calculate their owning coefficients. + double attributed_not_owning_sub_size = 0; + for (; current_it != next_it; current_it++) { + uint64_t not_owning_sub_size = + (*current_it)->source()->not_owning_sub_size(); + if (not_owning_sub_size > already_attributed_sub_size) { + attributed_not_owning_sub_size += + (not_owning_sub_size - already_attributed_sub_size) / difference; + already_attributed_sub_size = not_owning_sub_size; + } + + if (not_owning_sub_size != 0) { + double coeff = attributed_not_owning_sub_size / not_owning_sub_size; + (*current_it)->source()->set_owning_coefficient(coeff); + } + difference--; + } + + // At the end of this loop, we should move to a node with a lower priority. + DCHECK(current_it == next_it); + } + + // Attribute the remainder of the owned dump's not-owned sub-size to + // the dump itself and calculate its owned coefficient. + uint64_t not_owned_sub_size = node->not_owned_sub_size(); + if (not_owned_sub_size != 0) { + double remainder_sub_size = + not_owned_sub_size - already_attributed_sub_size; + node->set_owned_coefficient(remainder_sub_size / not_owned_sub_size); + } +} + } // namespace memory_instrumentation \ No newline at end of file
diff --git a/services/resource_coordinator/memory_instrumentation/graph_processor.h b/services/resource_coordinator/memory_instrumentation/graph_processor.h index f9a35653..6a94abfa 100644 --- a/services/resource_coordinator/memory_instrumentation/graph_processor.h +++ b/services/resource_coordinator/memory_instrumentation/graph_processor.h
@@ -105,6 +105,59 @@ * calculated [depth-first post-order traversal]. */ static void CalculateDumpSubSizes(GlobalDumpGraph::Node* node); + + /** + * Calculate owned and owning coefficients of a memory allocator dump and + * its owners. + * + * The owning coefficient refers to the proportion of a dump's not-owning + * sub-size which is attributed to the dump (only relevant to owning MADs). + * Conversely, the owned coefficient is the proportion of a dump's + * not-owned sub-size, which is attributed to it (only relevant to owned + * MADs). + * + * The not-owned size of the owned dump is split among its owners in the + * order of the ownership importance as demonstrated by the following + * example: + * + * memory allocator dumps + * OWNED OWNER1 OWNER2 OWNER3 OWNER4 + * not-owned sub-size [given] 10 - - - - + * not-owning sub-size [given] - 6 7 5 8 + * importance [given] - 2 2 1 0 + * attributed not-owned sub-size 2 - - - - + * attributed not-owning sub-size - 3 4 0 1 + * owned coefficient 2/10 - - - - + * owning coefficient - 3/6 4/7 0/5 1/8 + * + * Explanation: Firstly, 6 bytes are split equally among OWNER1 and OWNER2 + * (highest importance). OWNER2 owns one more byte, so its attributed + * not-owning sub-size is 6/2 + 1 = 4 bytes. OWNER3 is attributed no size + * because it is smaller than the owners with higher priority. However, + * OWNER4 is larger, so it's attributed the difference 8 - 7 = 1 byte. + * Finally, 2 bytes remain unattributed and are hence kept in the OWNED + * dump as attributed not-owned sub-size. The coefficients are then + * directly calculated as fractions of the sub-sizes and corresponding + * attributed sub-sizes. + * + * Note that we always assume that all ownerships of a dump overlap (e.g. + * OWNER3 is subsumed by both OWNER1 and OWNER2). Hence, the table could + * be alternatively represented as follows: + * + * owned memory range + * 0 1 2 3 4 5 6 7 8 9 10 + * Priority 2 | OWNER1 + OWNER2 (split) | OWNER2 | + * Priority 1 | (already attributed) | + * Priority 0 | - - - (already attributed) - - - | OWNER4 | + * Remainder | - - - - - (already attributed) - - - - - - | OWNED | + * + * This method assumes that (1) the size of the dump [see calculateSizes()] + * and (2) the not-owned size of the dump and not-owning sub-sizes of its + * owners [see the first step of calculateEffectiveSizes()] have already + * been calculated. Note that the method doesn't make any assumptions about + * the order in which dumps are visited. + */ + static void CalculateDumpOwnershipCoefficient(GlobalDumpGraph::Node* node); }; } // namespace memory_instrumentation
diff --git a/services/resource_coordinator/memory_instrumentation/graph_processor_unittest.cc b/services/resource_coordinator/memory_instrumentation/graph_processor_unittest.cc index 6d7038d..01429d46 100644 --- a/services/resource_coordinator/memory_instrumentation/graph_processor_unittest.cc +++ b/services/resource_coordinator/memory_instrumentation/graph_processor_unittest.cc
@@ -45,21 +45,21 @@ void AssignTracingOverhead(base::StringPiece allocator, GlobalDumpGraph* global_graph, - GlobalDumpGraph::Process* process) { + Process* process) { GraphProcessor::AssignTracingOverhead(allocator, global_graph, process); } GlobalDumpGraph::Node::Entry AggregateNumericWithNameForNode( - GlobalDumpGraph::Node* node, + Node* node, base::StringPiece name) { return GraphProcessor::AggregateNumericWithNameForNode(node, name); } - void AggregateNumericsRecursively(GlobalDumpGraph::Node* node) { + void AggregateNumericsRecursively(Node* node) { GraphProcessor::AggregateNumericsRecursively(node); } - void PropagateNumericsAndDiagnosticsRecursively(GlobalDumpGraph::Node* node) { + void PropagateNumericsAndDiagnosticsRecursively(Node* node) { GraphProcessor::PropagateNumericsAndDiagnosticsRecursively(node); } @@ -68,7 +68,7 @@ return GraphProcessor::AggregateSizeForDescendantNode(root, descendant); } - void CalculateSizeForNode(GlobalDumpGraph::Node* node) { + void CalculateSizeForNode(Node* node) { GraphProcessor::CalculateSizeForNode(node); } @@ -76,6 +76,10 @@ GraphProcessor::CalculateDumpSubSizes(node); } + void CalculateDumpOwnershipCoefficient(Node* node) { + GraphProcessor::CalculateDumpOwnershipCoefficient(node); + } + protected: GlobalDumpGraph graph; }; @@ -605,4 +609,39 @@ ASSERT_EQ(process_2->root()->not_owning_sub_size(), 5ul); } +TEST_F(GraphProcessorTest, CalculateDumpOwnershipCoefficient) { + Process* process = graph.CreateGraphForProcess(1); + + Node* owned = process->CreateNode(kEmptyGuid, "owned", false); + Node* owner_1 = process->CreateNode(kEmptyGuid, "owner1", false); + Node* owner_2 = process->CreateNode(kEmptyGuid, "owner2", false); + Node* owner_3 = process->CreateNode(kEmptyGuid, "owner3", false); + Node* owner_4 = process->CreateNode(kEmptyGuid, "owner4", false); + + graph.AddNodeOwnershipEdge(owner_1, owned, 2); + graph.AddNodeOwnershipEdge(owner_2, owned, 2); + graph.AddNodeOwnershipEdge(owner_3, owned, 1); + graph.AddNodeOwnershipEdge(owner_4, owned, 0); + + // Ensure the owned node has a size otherwise calculations will not happen. + owned->AddEntry("size", Node::Entry::kBytes, 10); + + // Setup the owned/owning sub sizes. + owned->add_not_owned_sub_size(10); + owner_1->add_not_owning_sub_size(6); + owner_2->add_not_owning_sub_size(7); + owner_3->add_not_owning_sub_size(5); + owner_4->add_not_owning_sub_size(8); + + // Perform the computation. + CalculateDumpOwnershipCoefficient(owned); + + // Ensure that the coefficients are correct. + ASSERT_DOUBLE_EQ(owned->owned_coefficient(), 2.0 / 10.0); + ASSERT_DOUBLE_EQ(owner_1->owning_coefficient(), 3.0 / 6.0); + ASSERT_DOUBLE_EQ(owner_2->owning_coefficient(), 4.0 / 7.0); + ASSERT_DOUBLE_EQ(owner_3->owning_coefficient(), 0.0 / 5.0); + ASSERT_DOUBLE_EQ(owner_4->owning_coefficient(), 1.0 / 8.0); +} + } // namespace memory_instrumentation \ No newline at end of file
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index c2dfb214..a6059e0 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -101,7 +101,7 @@ }, { "args": [ - "smoothness.key_silk_cases", + "system_health.common_desktop", "-v", "--upload-results", "--output-format=histograms", @@ -111,7 +111,7 @@ "--also-run-disabled-tests" ], "isolate_name": "telemetry_perf_tests", - "name": "smoothness.key_silk_cases", + "name": "system_health.common_desktop", "override_compile_targets": [ "telemetry_perf_tests" ], @@ -125,7 +125,7 @@ }, { "args": [ - "smoothness.key_silk_cases", + "system_health.common_desktop", "-v", "--upload-results", "--output-format=histograms", @@ -135,7 +135,55 @@ "--also-run-disabled-tests" ], "isolate_name": "telemetry_perf_tests", - "name": "smoothness.key_silk_cases.reference", + "name": "system_health.common_desktop.reference", + "override_compile_targets": [ + "telemetry_perf_tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "expiration": 36000, + "hard_timeout": 10800, + "ignore_task_failure": false, + "io_timeout": 3600 + } + }, + { + "args": [ + "system_health.memory_desktop", + "-v", + "--upload-results", + "--output-format=histograms", + "--output-format=json-test-results", + "--browser=release", + "--xvfb", + "--also-run-disabled-tests" + ], + "isolate_name": "telemetry_perf_tests", + "name": "system_health.memory_desktop", + "override_compile_targets": [ + "telemetry_perf_tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "expiration": 36000, + "hard_timeout": 10800, + "ignore_task_failure": false, + "io_timeout": 3600 + } + }, + { + "args": [ + "system_health.memory_desktop", + "-v", + "--upload-results", + "--output-format=histograms", + "--output-format=json-test-results", + "--browser=reference", + "--xvfb", + "--also-run-disabled-tests" + ], + "isolate_name": "telemetry_perf_tests", + "name": "system_health.memory_desktop.reference", "override_compile_targets": [ "telemetry_perf_tests" ],
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter index d589370..2006403a 100644 --- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter +++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -368,42 +368,6 @@ -PolicyTest.ForceGoogleSafeSearch -ProfileBrowserTest.SendHPKPReport -ProfileBrowserTest.SendHPKPReportServerHangs --ReferrerPolicyTest.ContextMenuOrigin --ReferrerPolicyTest.ContextMenuRedirect --ReferrerPolicyTest.History --ReferrerPolicyTest.HttpsContextMenuOrigin --ReferrerPolicyTest.HttpsContextMenuRedirect --ReferrerPolicyTest.HttpLeftClickHTTPRedirectToHTTPSSameOrigin --ReferrerPolicyTest.HttpLeftClickHTTPRedirectToHTTPSameOrigin --ReferrerPolicyTest.HttpLeftClickHTTPRedirectToHTTPStrictOrigin --ReferrerPolicyTest.HttpLeftClickHTTPSRedirectToHTTPOriginWhenCrossOrigin --ReferrerPolicyTest.HttpLeftClickHTTPSRedirectToHTTPStrictOrigin --ReferrerPolicyTest.HttpLeftClickRedirectDefaultNoFlag --ReferrerPolicyTest.HttpLeftClickRedirectToHTTPOriginWhenCrossOrigin --ReferrerPolicyTest.HttpLeftClickRedirectToHTTPSOriginWhenCrossOrigin --ReferrerPolicyTest.HttpsDefault --ReferrerPolicyTest.HttpsLeftClickOrigin --ReferrerPolicyTest.HttpsLeftClickRedirect --ReferrerPolicyTest.HttpsMiddleClickOrigin --ReferrerPolicyTest.HttpsMiddleClickRedirect --ReferrerPolicyTest.HttpsMiddleClickTargetBlankOrigin --ReferrerPolicyTest.HttpsMiddleClickTargetBlankRedirect --ReferrerPolicyTest.HttpsRedirect --ReferrerPolicyTest.HttpsTargetBlankOrigin --ReferrerPolicyTest.HttpsTargetBlankRedirect --ReferrerPolicyTest.IFrame --ReferrerPolicyTest.LeftClickOrigin --ReferrerPolicyTest.LeftClickRedirect --ReferrerPolicyTest.MiddleClickOrigin --ReferrerPolicyTest.MiddleClickRedirect --ReferrerPolicyTest.MiddleClickTargetBlankOrigin --ReferrerPolicyTest.MiddleClickTargetBlankRedirect --ReferrerPolicyTest.Origin --ReferrerPolicyTest.Redirect --ReferrerPolicyTest.RequestTabletSite --ReferrerPolicyTest.TargetBlankOrigin --ReferrerPolicyTest.TargetBlankRedirect --ReferrerPolicyWithReduceReferrerGranularityFlagTest.HttpLeftClickRedirectDefaultFlag -RestartTest.CookiesClearedOnExit -RestartTest.LocalStorageClearedOnExit -RestartTest.Post
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index e4804b2..bfdc6a1 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2410,8 +2410,6 @@ crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-004.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-inset-000.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-outset-000.xht [ Failure ] -crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-style-inset-001.xht [ Failure ] -crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-style-outset-001.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-span-all-003.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-span-all-child-001.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-span-all-child-002.xht [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-groove-001-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-groove-001-ref.xht deleted file mode 100644 index a32a71e..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-groove-001-ref.xht +++ /dev/null
@@ -1,44 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>CSS Reftest Reference</title> - <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> - <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 --> - <meta name="flags" content="ahem" /> - <style type="text/css"><![CDATA[ - body {margin: 8px;} - - p - { - line-height: 1.25em; - margin: 1em 0em; - } - - strong {line-height: 1;} - - div - { - border-collapse: collapse; - border-left: orange groove 100px; - color: transparent; - display: table; - font: 6.25em/1 Ahem; - } - - div + div - { - position: relative; - top: 10px; - } - ]]></style> - </head> - <body> - - <p>Test passes if the 2 orange squares are <strong>identical</strong>.</p> - - <div>T</div> - - <div>T</div> - - </body> -</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-groove-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-groove-001.xht deleted file mode 100644 index 43a4a21..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-groove-001.xht +++ /dev/null
@@ -1,71 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <title>CSS Multi-column Layout Test: 'column-rule-style' groove</title> - <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> - <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crs" title="4.3. 'column-rule-style'" /> - <link rel="match" href="multicol-rule-style-groove-001-ref.xht" /> - <meta name="flags" content="ahem" /> - <style type="text/css"><![CDATA[ - body {margin: 8px;} - - p - { - line-height: 1.25em; - margin: 1em 0em; - } - - strong {line-height: 1;} - - div {color: transparent;} - - div#reference - { - border-collapse: collapse; - border-left: orange groove 100px; - font: 6.25em/1 Ahem; - display: table; - } - - div#test - { - font: 1.25em/1 Ahem; /* equivalent to 20px/1 Ahem */ - position: relative; - right: 40px; - top: 0.5em; - width: 9em; - - column-count: 2; - column-gap: 5em; - column-rule: orange groove 5em; - } - ]]></style> - </head> - - <body> - - <p>Test passes if the 2 orange squares are <strong>identical</strong>.</p> - - <div id="reference">T</div> - - <div id="test">Le ft Co lu mn Ri gh Co lu mn</div> - - <!-- - - Expected results - column-gap - column-rule - v=====v - ************* - |Le| |Ri| - |ft| |gh| - |Co| |Co| - |lu| |lu| - |mn| |mn| - ************* - - --> - - </body> -</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-inset-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-inset-001.xht deleted file mode 100644 index d50bec93..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-inset-001.xht +++ /dev/null
@@ -1,71 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <title>CSS Multi-column Layout Test: 'column-rule-style' inset</title> - <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> - <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crs" title="4.3. 'column-rule-style'" /> - <link rel="match" href="multicol-rule-style-ridge-001-ref.xht" /> - <meta name="flags" content="ahem" /> - <style type="text/css"><![CDATA[ - body {margin: 8px;} - - p - { - line-height: 1.25em; - margin: 1em 0em; - } - - strong {line-height: 1;} - - div {color: transparent;} - - div#reference - { - border-collapse: collapse; - border-left: orange inset 100px; - font: 6.25em/1 Ahem; - display: table; - } - - div#test - { - font: 1.25em/1 Ahem; /* equivalent to 20px/1 Ahem */ - position: relative; - right: 40px; - top: 0.5em; - width: 9em; - - column-count: 2; - column-gap: 5em; - column-rule: orange inset 5em; - } - ]]></style> - </head> - - <body> - - <p>Test passes if the 2 orange squares are <strong>identical</strong>.</p> - - <div id="reference">T</div> - - <div id="test">Le ft Co lu mn Ri gh Co lu mn</div> - - <!-- - - Expected results - column-gap - column-rule - v=====v - ************* - |Le| |Ri| - |ft| |gh| - |Co| |Co| - |lu| |lu| - |mn| |mn| - ************* - - --> - - </body> -</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-outset-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-outset-001.xht deleted file mode 100644 index ea8c332..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-outset-001.xht +++ /dev/null
@@ -1,71 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <title>CSS Multi-column Layout Test: 'column-rule-style' outset</title> - <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> - <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crs" title="4.3. 'column-rule-style'" /> - <link rel="match" href="multicol-rule-style-groove-001-ref.xht" /> - <meta name="flags" content="ahem" /> - <style type="text/css"><![CDATA[ - body {margin: 8px;} - - p - { - line-height: 1.25em; - margin: 1em 0em; - } - - strong {line-height: 1;} - - div {color: transparent;} - - div#reference - { - border-collapse: collapse; - border-left: orange outset 100px; - font: 6.25em/1 Ahem; - display: table; - } - - div#test - { - font: 1.25em/1 Ahem; /* equivalent to 20px/1 Ahem */ - position: relative; - right: 40px; - top: 0.5em; - width: 9em; - - column-count: 2; - column-gap: 5em; - column-rule: orange outset 5em; - } - ]]></style> - </head> - - <body> - - <p>Test passes if the 2 orange squares are <strong>identical</strong>.</p> - - <div id="reference">T</div> - - <div id="test">Le ft Co lu mn Ri gh Co lu mn</div> - - <!-- - - Expected results - column-gap - column-rule - v=====v - ************* - |Le| |Ri| - |ft| |gh| - |Co| |Co| - |lu| |lu| - |mn| |mn| - ************* - - --> - - </body> -</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-ridge-001-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-ridge-001-ref.xht deleted file mode 100644 index 4da6ec8..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-ridge-001-ref.xht +++ /dev/null
@@ -1,44 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>CSS Reftest Reference</title> - <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> - <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 --> - <meta name="flags" content="ahem" /> - <style type="text/css"><![CDATA[ - body {margin: 8px;} - - p - { - line-height: 1.25em; - margin: 1em 0em; - } - - strong {line-height: 1;} - - div - { - border-collapse: collapse; - border-left: orange ridge 100px; - color: transparent; - display: table; - font: 6.25em/1 Ahem; - } - - div + div - { - position: relative; - top: 10px; - } - ]]></style> - </head> - <body> - - <p>Test passes if the 2 orange squares are <strong>identical</strong>.</p> - - <div>T</div> - - <div>T</div> - - </body> -</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-ridge-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-ridge-001.xht deleted file mode 100644 index 1cc97df..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-rule-style-ridge-001.xht +++ /dev/null
@@ -1,71 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <title>CSS Multi-column Layout Test: 'column-rule-style' ridge</title> - <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" /> - <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-15 --> - <link rel="help" href="http://www.w3.org/TR/css3-multicol/#crs" title="4.3. 'column-rule-style'" /> - <link rel="match" href="multicol-rule-style-ridge-001-ref.xht" /> - <meta name="flags" content="ahem" /> - <style type="text/css"><![CDATA[ - body {margin: 8px;} - - p - { - line-height: 1.25em; - margin: 1em 0em; - } - - strong {line-height: 1;} - - div {color: transparent;} - - div#reference - { - border-collapse: collapse; - border-left: orange ridge 100px; - font: 6.25em/1 Ahem; - display: table; - } - - div#test - { - font: 1.25em/1 Ahem; /* equivalent to 20px/1 Ahem */ - position: relative; - right: 40px; - top: 0.5em; - width: 9em; - - column-count: 2; - column-gap: 5em; - column-rule: orange ridge 5em; - } - ]]></style> - </head> - - <body> - - <p>Test passes if the 2 orange squares are <strong>identical</strong>.</p> - - <div id="reference">T</div> - - <div id="test">Le ft Co lu mn Ri gh Co lu mn</div> - - <!-- - - Expected results - column-gap - column-rule - v=====v - ************* - |Le| |Ri| - |ft| |gh| - |Co| |Co| - |lu| |lu| - |mn| |mn| - ************* - - --> - - </body> -</html> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/resources/send-dragged-file-form-helper.js b/third_party/WebKit/LayoutTests/http/tests/fileapi/resources/send-file-form-helper.js similarity index 81% rename from third_party/WebKit/LayoutTests/http/tests/local/fileapi/resources/send-dragged-file-form-helper.js rename to third_party/WebKit/LayoutTests/http/tests/fileapi/resources/send-file-form-helper.js index 2caf7480..fd0a10d2 100644 --- a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/resources/send-dragged-file-form-helper.js +++ b/third_party/WebKit/LayoutTests/http/tests/fileapi/resources/send-file-form-helper.js
@@ -59,7 +59,7 @@ // on the web it is distinct when decoding but unified when encoding // - ¤ is inside Latin-1 and helps diagnose problems due to // filesystem encoding or locale; again it is a "simple" -// substitution case and also ensures +// substitution case // - ≈ is inside IBM437 and helps diagnose problems due to filesystem // encoding or locale // - ¥‾ are inside a single-byte range of ISO-2022-JP and help @@ -93,9 +93,6 @@ const kTestFallbackXUserDefined = kTestChars.replace(/[^\0-\x7F]/gu, x => `&#${x.codePointAt(0)};`); -// Web server hosting helper CGI -const kWebServer = 'http://127.0.0.1:8000'; - // formPostFileUploadTest - verifies multipart upload structure and // numeric character reference replacement for filenames, field names, // and field values. @@ -106,12 +103,6 @@ // UTF-8-compatible byte sequences appear in the formEncoding-encoded // uploaded data. // -// Uses eventSender.beginDragWithFiles and related methods to upload -// using drag-n-drop because that is currently the only file upload -// mechanism available to Blink layout tests, likely leading to the -// observed renderer crashes on POSIX-like systems using non-UTF-8 -// locales. -// // Fields in the parameter object: // // - fileNameSource: purely explanatory and gives a clue about which @@ -119,7 +110,7 @@ // the fileBaseName, or Unicode if no smaller-than-Unicode source // contains all the characters. Used in the test name. // - fileBaseName: the not-necessarily-just-7-bit-ASCII file basename -// for the test file. Used in the test name. +// used for the constructed test file. Used in the test name. // - formEncoding: the acceptCharset of the form used to submit the // test file. Used in the test name. // - expectedEncodedBaseName: the expected formEncoding-encoded @@ -127,12 +118,6 @@ // numeric character references and non-7-bit-ASCII bytes seen // through UTF-8 goggles; subsequences not interpretable as UTF-8 // have each byte represented here by \uFFFD REPLACEMENT CHARACTER. -// -// NOTE: This does not correctly account for varying representation of -// combining characters across platforms and filesystems due to -// Unicode normalization or similar platform-specific normalization -// rules. For that reason none of the tests exercise such characters -// or character sequences. const formPostFileUploadTest = ({ fileNameSource, fileBaseName, @@ -144,35 +129,30 @@ if (document.readyState !== 'complete') { await new Promise(resolve => addEventListener('load', resolve)); } - assert_own_property( - window, - 'eventSender', - 'This test relies on eventSender.beginDragWithFiles'); const formTargetFrame = Object.assign(document.createElement('iframe'), { name: 'formtargetframe', }); - document.body.prepend(formTargetFrame); + document.body.append(formTargetFrame); testCase.add_cleanup(() => { document.body.removeChild(formTargetFrame); }); const form = Object.assign(document.createElement('form'), { acceptCharset: formEncoding, - action: `${kWebServer}/xmlhttprequest/resources/post-echo.cgi`, + action: '/xmlhttprequest/resources/post-echo.cgi', method: 'POST', enctype: 'multipart/form-data', target: formTargetFrame.name, }); - // This element must be at the top of the viewport so it can be dragged to. - document.body.prepend(form); + document.body.append(form); testCase.add_cleanup(() => { document.body.removeChild(form); }); // Used to verify that the browser agrees with the test about // which form charset is used. - form.appendChild(Object.assign(document.createElement('input'), { + form.append(Object.assign(document.createElement('input'), { type: 'hidden', name: '_charset_', })); @@ -180,7 +160,7 @@ // Used to verify that the browser agrees with the test about // field value replacement and encoding independently of file system // idiosyncracies. - form.appendChild(Object.assign(document.createElement('input'), { + form.append(Object.assign(document.createElement('input'), { type: 'hidden', name: 'filename', value: fileBaseName, @@ -188,7 +168,7 @@ // Same, but with name and value reversed to ensure field names // get the same treatment. - form.appendChild(Object.assign(document.createElement('input'), { + form.append(Object.assign(document.createElement('input'), { type: 'hidden', name: fileBaseName, value: 'filename', @@ -198,35 +178,27 @@ type: 'file', name: 'file', }); - form.appendChild(fileInput); + form.append(fileInput); - const fileToDrop = `resources/${fileBaseName}`; // Removes c:\fakepath\ or other pseudofolder and returns just the // final component of filePath; allows both / and \ as segment // delimiters. const baseNameOfFilePath = filePath => filePath.split(/[\/\\]/).pop(); - fileInput.onchange = event => { - assert_equals( - fileInput.files[0].name, - fileBaseName, - `Dropped file should be ${fileBaseName}`); + await new Promise(resolve => { + const dataTransfer = new DataTransfer; + dataTransfer.items.add( + new File([kTestChars], fileBaseName, {type: 'text/plain'})); + fileInput.files = dataTransfer.files; // For historical reasons .value will be prefixed with - // c:\fakepath\, but the basename should match the dropped file - // name exposed through the newer .files[0].name API. This check + // c:\fakepath\, but the basename should match the file name + // exposed through the newer .files[0].name API. This check // verifies that assumption. assert_equals( fileInput.files[0].name, baseNameOfFilePath(fileInput.value), `The basename of the field's value should match its files[0].name`); form.submit(); - }; - await new Promise(resolve => { formTargetFrame.onload = resolve; - eventSender.beginDragWithFiles([fileToDrop]); - const centerX = fileInput.offsetLeft + fileInput.offsetWidth / 2; - const centerY = fileInput.offsetTop + fileInput.offsetHeight / 2; - eventSender.mouseMoveTo(centerX, centerY); - eventSender.mouseUp(); }); const formDataText = formTargetFrame.contentDocument.body.textContent; @@ -237,14 +209,14 @@ assert_greater_than( formDataLines.length, 2, - `${fileToDrop}: multipart form data must have at least 3 lines: ${ + `${fileBaseName}: multipart form data must have at least 3 lines: ${ JSON.stringify(formDataText) }`); const boundary = formDataLines[0]; assert_equals( formDataLines[formDataLines.length - 1], boundary + '--', - `${fileToDrop}: multipart form data must end with ${boundary}--: ${ + `${fileBaseName}: multipart form data must end with ${boundary}--: ${ JSON.stringify(formDataText) }`); const expectedText = [
diff --git a/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-iso-2022-jp.html b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-iso-2022-jp.html new file mode 100644 index 0000000..8efa80a --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-iso-2022-jp.html
@@ -0,0 +1,60 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Upload files in ISO-2022-JP form</title> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> +<link rel="author" title="Benjamin C. Wiley Sittler" + href="mailto:bsittler@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/send-file-form-helper.js"></script> +<script> +'use strict'; + +formPostFileUploadTest({ + fileNameSource: 'ASCII', + fileBaseName: 'file-for-upload-in-form.txt', + formEncoding: 'ISO-2022-JP', + expectedEncodedBaseName: 'file-for-upload-in-form.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'x-user-defined', + fileBaseName: 'file-for-upload-in-form-\uF7F0\uF793\uF783\uF7A0.txt', + formEncoding: 'ISO-2022-JP', + expectedEncodedBaseName: ( + 'file-for-upload-in-form-.txt'), +}); + +formPostFileUploadTest({ + fileNameSource: 'windows-1252', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'ISO-2022-JP', + expectedEncodedBaseName: ( + 'file-for-upload-in-form-☺😂.txt'), +}); + +formPostFileUploadTest({ + fileNameSource: 'JIS X 0201 and JIS X 0208', + fileBaseName: 'file-for-upload-in-form-★星★.txt', + formEncoding: 'ISO-2022-JP', + expectedEncodedBaseName: 'file-for-upload-in-form-\x1B$B!z@1!z\x1B(B.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'ISO-2022-JP', + expectedEncodedBaseName: 'file-for-upload-in-form-☺😂.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: `file-for-upload-in-form-${kTestChars}.txt`, + formEncoding: 'ISO-2022-JP', + expectedEncodedBaseName: `file-for-upload-in-form-${ + kTestFallbackIso2022jp + }.txt`, +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-utf-8.html b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-utf-8.html new file mode 100644 index 0000000..2c4ed7f2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-utf-8.html
@@ -0,0 +1,57 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Upload files in UTF-8 form</title> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> +<link rel="author" title="Benjamin C. Wiley Sittler" + href="mailto:bsittler@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/send-file-form-helper.js"></script> +<script> +'use strict'; + +formPostFileUploadTest({ + fileNameSource: 'ASCII', + fileBaseName: 'file-for-upload-in-form.txt', + formEncoding: 'UTF-8', + expectedEncodedBaseName: 'file-for-upload-in-form.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'x-user-defined', + fileBaseName: 'file-for-upload-in-form-\uF7F0\uF793\uF783\uF7A0.txt', + formEncoding: 'UTF-8', + expectedEncodedBaseName: ( + 'file-for-upload-in-form-\uF7F0\uF793\uF783\uF7A0.txt'), +}); + +formPostFileUploadTest({ + fileNameSource: 'windows-1252', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'UTF-8', + expectedEncodedBaseName: 'file-for-upload-in-form-☺😂.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'JIS X 0201 and JIS X 0208', + fileBaseName: 'file-for-upload-in-form-★星★.txt', + formEncoding: 'UTF-8', + expectedEncodedBaseName: 'file-for-upload-in-form-★星★.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'UTF-8', + expectedEncodedBaseName: 'file-for-upload-in-form-☺😂.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: `file-for-upload-in-form-${kTestChars}.txt`, + formEncoding: 'UTF-8', + expectedEncodedBaseName: `file-for-upload-in-form-${kTestChars}.txt`, +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-windows-1252.html b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-windows-1252.html new file mode 100644 index 0000000..eddc19d --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-windows-1252.html
@@ -0,0 +1,59 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Upload files in Windows-1252 form</title> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> +<link rel="author" title="Benjamin C. Wiley Sittler" + href="mailto:bsittler@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/send-file-form-helper.js"></script> +<script> +'use strict'; + +formPostFileUploadTest({ + fileNameSource: 'ASCII', + fileBaseName: 'file-for-upload-in-form.txt', + formEncoding: 'windows-1252', + expectedEncodedBaseName: 'file-for-upload-in-form.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'x-user-defined', + fileBaseName: 'file-for-upload-in-form-\uF7F0\uF793\uF783\uF7A0.txt', + formEncoding: 'windows-1252', + expectedEncodedBaseName: ( + 'file-for-upload-in-form-.txt'), +}); + +formPostFileUploadTest({ + fileNameSource: 'windows-1252', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'windows-1252', + expectedEncodedBaseName: 'file-for-upload-in-form-☺😂.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'JIS X 0201 and JIS X 0208', + fileBaseName: 'file-for-upload-in-form-★星★.txt', + formEncoding: 'windows-1252', + expectedEncodedBaseName: 'file-for-upload-in-form-★星★.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'windows-1252', + expectedEncodedBaseName: 'file-for-upload-in-form-☺😂.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: `file-for-upload-in-form-${kTestChars}.txt`, + formEncoding: 'windows-1252', + expectedEncodedBaseName: `file-for-upload-in-form-${ + kTestFallbackWindows1252 + }.txt`, +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-x-user-defined.html b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-x-user-defined.html new file mode 100644 index 0000000..93851e2e --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form-x-user-defined.html
@@ -0,0 +1,59 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Upload files in x-user-defined form</title> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> +<link rel="author" title="Benjamin C. Wiley Sittler" + href="mailto:bsittler@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/send-file-form-helper.js"></script> +<script> +'use strict'; + +formPostFileUploadTest({ + fileNameSource: 'ASCII', + fileBaseName: 'file-for-upload-in-form.txt', + formEncoding: 'x-user-defined', + expectedEncodedBaseName: 'file-for-upload-in-form.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'x-user-defined', + fileBaseName: 'file-for-upload-in-form-\uF7F0\uF793\uF783\uF7A0.txt', + formEncoding: 'x-user-defined', + expectedEncodedBaseName: 'file-for-upload-in-form-𓃠.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'windows-1252', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'x-user-defined', + expectedEncodedBaseName: ('file-for-upload-in-form-' + + '☺😂.txt'), +}); + +formPostFileUploadTest({ + fileNameSource: 'JIS X 0201 and JIS X 0208', + fileBaseName: 'file-for-upload-in-form-★星★.txt', + formEncoding: 'x-user-defined', + expectedEncodedBaseName: 'file-for-upload-in-form-★星★.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: 'file-for-upload-in-form-☺😂.txt', + formEncoding: 'x-user-defined', + expectedEncodedBaseName: 'file-for-upload-in-form-☺😂.txt', +}); + +formPostFileUploadTest({ + fileNameSource: 'Unicode', + fileBaseName: `file-for-upload-in-form-${kTestChars}.txt`, + formEncoding: 'x-user-defined', + expectedEncodedBaseName: `file-for-upload-in-form-${ + kTestFallbackXUserDefined + }.txt`, +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form.html b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form.html new file mode 100644 index 0000000..d0f12b3c --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/fileapi/send-file-form.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Upload ASCII-named file in UTF-8 form</title> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> +<link rel="author" title="Benjamin C. Wiley Sittler" + href="mailto:bsittler@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/send-file-form-helper.js"></script> +<script> +'use strict'; + +formPostFileUploadTest({ + fileNameSource: 'ASCII', + fileBaseName: 'file-for-upload-in-form.txt', + formEncoding: 'UTF-8', + expectedEncodedBaseName: 'file-for-upload-in-form.txt', +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/resources/select-dragged-file-input-helper.js b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/resources/select-dragged-file-input-helper.js new file mode 100644 index 0000000..6289b0b --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/resources/select-dragged-file-input-helper.js
@@ -0,0 +1,143 @@ +'use strict'; + +// Rationale for this particular test character sequence, which is +// used in filenames and also in file contents: +// +// - ABC~ ensures the string starts with something we can read to +// ensure it is from the correct source. +// - ‾¥ are inside JIS and help diagnose problems due to filesystem +// encoding or locale +// - ≈ is inside IBM437 and helps diagnose problems due to filesystem +// encoding or locale +// - ¤ is inside Latin-1 and helps diagnose problems due to +// filesystem encoding or locale +// - ï½¥ is inside JIS and single-byte in some variants and helps +// diagnose problems due to filesystem encoding or locale +// - ・ is inside JIS and double-byte and helps diagnose problems +// due to filesystem encoding or locale +// - • is inside Windows-1252 and helps diagnose problems due to +// filesystem encoding or locale and also ensures these aren't +// accidentally turned into e.g. control codes +// - ∙ is inside IBM437 and helps diagnose problems due to filesystem +// encoding or locale +// - · is inside Latin-1 and helps diagnose problems due to +// filesystem encoding or locale +// - ☼ is inside IBM437 shadowing C0 and helps diagnose problems due to +// filesystem encoding or locale and also ensures these aren't +// accidentally turned into e.g. control codes +// - ★ is inside JIS on a non-Kanji page and makes correct output easier to spot +// - 星 is inside JIS on a Kanji page and makes correct output easier to spot +// - 🌟 is outside the BMP +// - 星 repeated here ensures the correct codec state is used after a non-BMP +// character +// - ★ repeated here also makes correct output easier to spot +// - ☼ is inside IBM437 shadowing C0 and helps diagnose problems due to +// filesystem encoding or locale and also ensures these aren't +// accidentally turned into e.g. control codes +// - · is inside Latin-1 and helps diagnose problems due to +// filesystem encoding or locale +// - ∙ is inside IBM437 and helps diagnose problems due to filesystem +// encoding or locale +// - • is inside Windows-1252 and again helps diagnose problems +// due to filesystem encoding or locale +// - ・ is inside a double-byte range of JIS and helps diagnose +// problems due to filesystem encoding or locale +// - ï½¥ is inside a single-byte range of JIS in some variants and helps +// diagnose problems due to filesystem encoding or locale +// - ¤ is inside Latin-1 and helps diagnose problems due to +// filesystem encoding or locale +// - ≈ is inside IBM437 and helps diagnose problems due to filesystem +// encoding or locale +// - ¥‾ are inside a single-byte range of JIS and help +// diagnose problems due to filesystem encoding or locale +// - ~XYZ ensures earlier errors don't lead to misencoding of +// simple ASCII +// +// Overall the near-symmetry makes common I18N mistakes like +// off-by-1-after-non-BMP easier to spot. All the characters +// are also allowed in Windows Unicode filenames. +const kTestChars = 'ABC~‾¥≈¤ï½¥ãƒ»•∙·â˜¼â˜…星🌟星★☼·âˆ™•・・¤≈¥‾~XYZ'; + +// fileInputTest - verifies <input type=file> single file selection. +// +// Uses eventSender.beginDragWithFiles and related methods to select +// using drag-n-drop because that is currently the only file selection +// mechanism available to Blink layout tests, likely leading to the +// observed renderer crashes on POSIX-like systems using non-UTF-8 +// locales. +// +// Fields in the parameter object: +// +// - fileNameSource: purely explanatory and gives a clue about which +// character encoding is the source for the non-7-bit-ASCII parts of +// the fileBaseName, or Unicode if no smaller-than-Unicode source +// contains all the characters. Used in the test name. +// - fileBaseName: the not-necessarily-just-7-bit-ASCII file basename +// for the test file. Used in the test name. +// +// NOTE: This does not correctly account for varying representation of +// combining characters across platforms and filesystems due to +// Unicode normalization or similar platform-specific normalization +// rules. For that reason none of the tests exercise such characters +// or character sequences. +const fileInputTest = ({ + fileNameSource, + fileBaseName, +}) => { + promise_test(async testCase => { + + if (document.readyState !== 'complete') { + await new Promise(resolve => addEventListener('load', resolve)); + } + assert_own_property( + window, + 'eventSender', + 'This test relies on eventSender.beginDragWithFiles'); + + const fileInput = Object.assign(document.createElement('input'), { + type: 'file', + }); + + // This element must be at the top of the viewport so it can be dragged to. + document.body.prepend(fileInput); + testCase.add_cleanup(() => { + document.body.removeChild(fileInput); + }); + + eventSender.beginDragWithFiles([`resources/${fileBaseName}`]); + const centerX = fileInput.offsetLeft + fileInput.offsetWidth / 2; + const centerY = fileInput.offsetTop + fileInput.offsetHeight / 2; + eventSender.mouseMoveTo(centerX, centerY); + eventSender.mouseUp(); + // eventSender is synchronous so we do not wait for onchange + assert_equals( + fileInput.files[0].name, + fileBaseName, + `Dropped file should be ${fileBaseName}`); + // Removes c:\fakepath\ or other pseudofolder and returns just the + // final component of filePath; allows both / and \ as segment + // delimiters. + const baseNameOfFilePath = filePath => filePath.split(/[\/\\]/).pop(); + // For historical reasons .value will be prefixed with + // c:\fakepath\, but the basename should match the dropped file + // name exposed through the newer .files[0].name API. This check + // verifies that assumption. + assert_equals( + fileInput.files[0].name, + baseNameOfFilePath(fileInput.value), + `The basename of the field's value should match its files[0].name`); + // Only by fetching the file can we be sure the file actually + // exists and the host filesystem is actually used. Before this + // point the dragged-in filename from eventSender is not actually + // checked against the host filesystem. + const fileObjectUrl = URL.createObjectURL(fileInput.files[0]); + testCase.add_cleanup(() => { + URL.revokeObjectURL(fileObjectUrl); + }); + const fileContents = await (await fetch(fileObjectUrl)).text(); + assert_equals( + fileContents, + kTestChars, + `The file should contain ${kTestChars}`); + }, `Select ${fileBaseName} (${fileNameSource}) in a file input`); +};
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-utf-8.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/select-dragged-file-input-utf-8.html similarity index 60% rename from third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-utf-8.html rename to third_party/WebKit/LayoutTests/http/tests/local/fileapi/select-dragged-file-input-utf-8.html index 41ed0055..516aace 100644 --- a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-utf-8.html +++ b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/select-dragged-file-input-utf-8.html
@@ -1,13 +1,13 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>Upload files in UTF-8 form</title> +<title>Select UTF-8-named files in a file input</title> <link rel="help" - href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> + href="https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file)"> <link rel="author" title="Benjamin C. Wiley Sittler" href="mailto:bsittler@chromium.org"> <script src="../../../../resources/testharness.js"></script> <script src="../../../../resources/testharnessreport.js"></script> -<script src="resources/send-dragged-file-form-helper.js"></script> +<script src="resources/select-dragged-file-input-helper.js"></script> <!-- NOTE: Blink renderer crashes are expected on non-Windows hosts using @@ -27,47 +27,34 @@ <script> 'use strict'; -formPostFileUploadTest({ +fileInputTest({ fileNameSource: 'ASCII', fileBaseName: 'file-for-drag-to-send3.txt', - formEncoding: 'UTF-8', - expectedEncodedBaseName: 'file-for-drag-to-send3.txt', }); -formPostFileUploadTest({ +fileInputTest({ fileNameSource: 'x-user-defined', fileBaseName: 'file-for-drag-to-send3-\uF7F0\uF793\uF783\uF7A0.txt', - formEncoding: 'UTF-8', - expectedEncodedBaseName: ( - 'file-for-drag-to-send3-\uF7F0\uF793\uF783\uF7A0.txt'), }); -formPostFileUploadTest({ +fileInputTest({ fileNameSource: 'windows-1252', fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'UTF-8', - expectedEncodedBaseName: 'file-for-drag-to-send3-☺😂.txt', }); -formPostFileUploadTest({ +fileInputTest({ fileNameSource: 'JIS X 0201 and JIS X 0208', fileBaseName: 'file-for-drag-to-send3-★星★.txt', - formEncoding: 'UTF-8', - expectedEncodedBaseName: 'file-for-drag-to-send3-★星★.txt', }); -formPostFileUploadTest({ +fileInputTest({ fileNameSource: 'Unicode', fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'UTF-8', - expectedEncodedBaseName: 'file-for-drag-to-send3-☺😂.txt', }); -formPostFileUploadTest({ +fileInputTest({ fileNameSource: 'Unicode', fileBaseName: `file-for-drag-to-send3-${kTestChars}.txt`, - formEncoding: 'UTF-8', - expectedEncodedBaseName: `file-for-drag-to-send3-${kTestChars}.txt`, }); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/select-dragged-file-input.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/select-dragged-file-input.html new file mode 100644 index 0000000..d2f2682 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/select-dragged-file-input.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Select ASCII-named file in a file input</title> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file)"> +<link rel="author" title="Benjamin C. Wiley Sittler" + href="mailto:bsittler@chromium.org"> +<script src="../../../../resources/testharness.js"></script> +<script src="../../../../resources/testharnessreport.js"></script> +<script src="resources/select-dragged-file-input-helper.js"></script> +<script> +'use strict'; + +fileInputTest({ + fileNameSource: 'ASCII', + fileBaseName: 'file-for-drag-to-send3.txt', +}); + +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-iso-2022-jp.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-iso-2022-jp.html deleted file mode 100644 index 16875156..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-iso-2022-jp.html +++ /dev/null
@@ -1,76 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Upload files in ISO-2022-JP form</title> -<link rel="help" - href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> -<link rel="author" title="Benjamin C. Wiley Sittler" - href="mailto:bsittler@chromium.org"> -<script src="../../../../resources/testharness.js"></script> -<script src="../../../../resources/testharnessreport.js"></script> -<script src="resources/send-dragged-file-form-helper.js"></script> -<!-- - - NOTE: Blink renderer crashes are expected on non-Windows hosts using - filenames containing characters from outside ASCII. Use a UTF-8 - locale to prevent this, e.g. with: - - bash$ export LC_ALL=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 - - Any other locale should work too provided it uses UTF-8 character - encoding. - - Test failures are expected on Windows when using any system "ANSI" - codepage other than windows-1252. To fix this, upgrade your system's - Win32.pm Perl module to the latest version. - - --> -<script> -'use strict'; - -formPostFileUploadTest({ - fileNameSource: 'ASCII', - fileBaseName: 'file-for-drag-to-send3.txt', - formEncoding: 'ISO-2022-JP', - expectedEncodedBaseName: 'file-for-drag-to-send3.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'x-user-defined', - fileBaseName: 'file-for-drag-to-send3-\uF7F0\uF793\uF783\uF7A0.txt', - formEncoding: 'ISO-2022-JP', - expectedEncodedBaseName: ( - 'file-for-drag-to-send3-.txt'), -}); - -formPostFileUploadTest({ - fileNameSource: 'windows-1252', - fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'ISO-2022-JP', - expectedEncodedBaseName: ( - 'file-for-drag-to-send3-☺😂.txt'), -}); - -formPostFileUploadTest({ - fileNameSource: 'JIS X 0201 and JIS X 0208', - fileBaseName: 'file-for-drag-to-send3-★星★.txt', - formEncoding: 'ISO-2022-JP', - expectedEncodedBaseName: 'file-for-drag-to-send3-\x1B$B!z@1!z\x1B(B.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'Unicode', - fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'ISO-2022-JP', - expectedEncodedBaseName: 'file-for-drag-to-send3-☺😂.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'Unicode', - fileBaseName: `file-for-drag-to-send3-${kTestChars}.txt`, - formEncoding: 'ISO-2022-JP', - expectedEncodedBaseName: `file-for-drag-to-send3-${ - kTestFallbackIso2022jp - }.txt`, -}); - -</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-windows-1252.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-windows-1252.html deleted file mode 100644 index 3b73040..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-windows-1252.html +++ /dev/null
@@ -1,75 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Upload files in Windows-1252 form</title> -<link rel="help" - href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> -<link rel="author" title="Benjamin C. Wiley Sittler" - href="mailto:bsittler@chromium.org"> -<script src="../../../../resources/testharness.js"></script> -<script src="../../../../resources/testharnessreport.js"></script> -<script src="resources/send-dragged-file-form-helper.js"></script> -<!-- - - NOTE: Blink renderer crashes are expected on non-Windows hosts using - filenames containing characters from outside ASCII. Use a UTF-8 - locale to prevent this, e.g. with: - - bash$ export LC_ALL=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 - - Any other locale should work too provided it uses UTF-8 character - encoding. - - Test failures are expected on Windows when using any system "ANSI" - codepage other than windows-1252. To fix this, upgrade your system's - Win32.pm Perl module to the latest version. - - --> -<script> -'use strict'; - -formPostFileUploadTest({ - fileNameSource: 'ASCII', - fileBaseName: 'file-for-drag-to-send3.txt', - formEncoding: 'windows-1252', - expectedEncodedBaseName: 'file-for-drag-to-send3.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'x-user-defined', - fileBaseName: 'file-for-drag-to-send3-\uF7F0\uF793\uF783\uF7A0.txt', - formEncoding: 'windows-1252', - expectedEncodedBaseName: ( - 'file-for-drag-to-send3-.txt'), -}); - -formPostFileUploadTest({ - fileNameSource: 'windows-1252', - fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'windows-1252', - expectedEncodedBaseName: 'file-for-drag-to-send3-☺😂.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'JIS X 0201 and JIS X 0208', - fileBaseName: 'file-for-drag-to-send3-★星★.txt', - formEncoding: 'windows-1252', - expectedEncodedBaseName: 'file-for-drag-to-send3-★星★.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'Unicode', - fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'windows-1252', - expectedEncodedBaseName: 'file-for-drag-to-send3-☺😂.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'Unicode', - fileBaseName: `file-for-drag-to-send3-${kTestChars}.txt`, - formEncoding: 'windows-1252', - expectedEncodedBaseName: `file-for-drag-to-send3-${ - kTestFallbackWindows1252 - }.txt`, -}); - -</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-x-user-defined.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-x-user-defined.html deleted file mode 100644 index 0f7d3c52..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form-x-user-defined.html +++ /dev/null
@@ -1,75 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Upload files in x-user-defined form</title> -<link rel="help" - href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> -<link rel="author" title="Benjamin C. Wiley Sittler" - href="mailto:bsittler@chromium.org"> -<script src="../../../../resources/testharness.js"></script> -<script src="../../../../resources/testharnessreport.js"></script> -<script src="resources/send-dragged-file-form-helper.js"></script> -<!-- - - NOTE: Blink renderer crashes are expected on non-Windows hosts using - filenames containing characters from outside ASCII. Use a UTF-8 - locale to prevent this, e.g. with: - - bash$ export LC_ALL=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 LANG=en_US.UTF-8 - - Any other locale should work too provided it uses UTF-8 character - encoding. - - Test failures are expected on Windows when using any system "ANSI" - codepage other than windows-1252. To fix this, upgrade your system's - Win32.pm Perl module to the latest version. - - --> -<script> -'use strict'; - -formPostFileUploadTest({ - fileNameSource: 'ASCII', - fileBaseName: 'file-for-drag-to-send3.txt', - formEncoding: 'x-user-defined', - expectedEncodedBaseName: 'file-for-drag-to-send3.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'x-user-defined', - fileBaseName: 'file-for-drag-to-send3-\uF7F0\uF793\uF783\uF7A0.txt', - formEncoding: 'x-user-defined', - expectedEncodedBaseName: 'file-for-drag-to-send3-𓃠.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'windows-1252', - fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'x-user-defined', - expectedEncodedBaseName: ('file-for-drag-to-send3-' + - '☺😂.txt'), -}); - -formPostFileUploadTest({ - fileNameSource: 'JIS X 0201 and JIS X 0208', - fileBaseName: 'file-for-drag-to-send3-★星★.txt', - formEncoding: 'x-user-defined', - expectedEncodedBaseName: 'file-for-drag-to-send3-★星★.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'Unicode', - fileBaseName: 'file-for-drag-to-send3-☺😂.txt', - formEncoding: 'x-user-defined', - expectedEncodedBaseName: 'file-for-drag-to-send3-☺😂.txt', -}); - -formPostFileUploadTest({ - fileNameSource: 'Unicode', - fileBaseName: `file-for-drag-to-send3-${kTestChars}.txt`, - formEncoding: 'x-user-defined', - expectedEncodedBaseName: `file-for-drag-to-send3-${ - kTestFallbackXUserDefined - }.txt`, -}); - -</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form.html b/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form.html deleted file mode 100644 index d517c73..0000000 --- a/third_party/WebKit/LayoutTests/http/tests/local/fileapi/send-dragged-file-form.html +++ /dev/null
@@ -1,21 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Upload ASCII-named file in UTF-8 form</title> -<link rel="help" - href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#multipart-form-data"> -<link rel="author" title="Benjamin C. Wiley Sittler" - href="mailto:bsittler@chromium.org"> -<script src="../../../../resources/testharness.js"></script> -<script src="../../../../resources/testharnessreport.js"></script> -<script src="resources/send-dragged-file-form-helper.js"></script> -<script> -'use strict'; - -formPostFileUploadTest({ - fileNameSource: 'ASCII', - fileBaseName: 'file-for-drag-to-send3.txt', - formEncoding: 'UTF-8', - expectedEncodedBaseName: 'file-for-drag-to-send3.txt', -}); - -</script>
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index 63f4172..6a22e093f 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -163,7 +163,7 @@ Runtime.experiments.setDefaultExperiments([ 'continueToLocationMarkers', 'autoAttachToCrossProcessSubframes', 'objectPreviews', 'persistence2', 'networkGroupingRequests', 'timelineColorByProduct', 'accessibilityInspection', 'logManagement', - 'performanceMonitor', 'stepIntoAsync' + 'performanceMonitor', 'stepIntoAsync', 'colorContrastRatio' ]); }
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp index 6247f8e0..07de959 100644 --- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp +++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
@@ -1309,6 +1309,7 @@ exception_state.ThrowDOMException( kInvalidAccessError, "The sender was not created by this peer connection."); + return; } if (!peer_handler_->RemoveTrack(sender->web_sender())) {
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py index 27223bb..b2b7ed765 100644 --- a/tools/binary_size/libsupersize/archive.py +++ b/tools/binary_size/libsupersize/archive.py
@@ -589,33 +589,9 @@ return metadata -def CreateSectionSizesAndSymbols( - map_path, elf_path, tool_prefix, output_directory, - track_string_literals=True): - """Creates sections sizes and symbols for a SizeInfo. - - Args: - map_path: Path to the linker .map(.gz) file to parse. - elf_path: Path to the corresponding unstripped ELF file. Used to find symbol - aliases and inlined functions. Can be None. - tool_prefix: Prefix for c++filt & nm (required). - output_directory: Build output directory. If None, source_paths and symbol - alias information will not be recorded. - track_string_literals: Whether to break down "** merge string" sections into - smaller symbols (requires output_directory). - """ - source_mapper = None - if output_directory: - # Start by finding the elf_object_paths, so that nm can run on them while - # the linker .map is being parsed. - logging.info('Parsing ninja files.') - source_mapper, elf_object_paths = ninja_parser.Parse( - output_directory, elf_path) - logging.debug('Parsed %d .ninja files.', source_mapper.parsed_file_count) - assert not elf_path or elf_object_paths, ( - 'Failed to find link command in ninja files for ' + - os.path.relpath(elf_path, output_directory)) - +def _ParseElfInfo(map_path, elf_path, tool_prefix, output_directory, + track_string_literals, elf_object_paths): + """Adds Elf section sizes and symbols.""" if elf_path: # Run nm on the elf file to retrieve the list of symbol names per-address. # This list is required because the .map file contains only a single name @@ -709,16 +685,13 @@ # is fast enough since len(merge_string_syms) < 10. raw_symbols[idx:idx + 1] = literal_syms - _ExtractSourcePathsAndNormalizeObjectPaths(raw_symbols, source_mapper) - logging.info('Converting excessive aliases into shared-path symbols') - _CompactLargeAliasesIntoSharedSymbols(raw_symbols) logging.debug('Connecting nm aliases') _ConnectNmAliases(raw_symbols) return section_sizes, raw_symbols def _ComputePakFileSymbols( - file_name, file_size, contents, res_info, symbols_by_name): + file_name, file_size, contents, res_info, symbols_by_id): total = 12 + 6 # Header size plus extra offset id_map = {id(v): k for k, v in sorted(contents.resources.items(), reverse=True)} @@ -729,22 +702,20 @@ section_name = models.SECTION_PAK_TRANSLATIONS else: section_name = models.SECTION_PAK_NONTRANSLATED - object_path = path_util.ToSrcRootRelative(file_name) for resource_id in sorted(contents.resources): if resource_id in alias_map: # 4 extra bytes of metadata (2 16-bit ints) size = 4 - name = res_info[alias_map[resource_id]][0] + resource_id = alias_map[resource_id] else: # 6 extra bytes of metadata (1 32-bit int, 1 16-bit int) size = len(contents.resources[resource_id]) + 6 name, source_path = res_info[resource_id] - if name not in symbols_by_name: + if resource_id not in symbols_by_id: full_name = '{}: {}'.format(source_path, name) - symbols_by_name[name] = models.Symbol( - section_name, 0, address=resource_id, full_name=full_name, - source_path=source_path, object_path=object_path) - symbols_by_name[name].size += size + symbols_by_id[resource_id] = models.Symbol( + section_name, 0, address=resource_id, full_name=full_name) + symbols_by_id[resource_id].size += size total += size assert file_size == total, ( '{} bytes in pak file not accounted for'.format(file_size - total)) @@ -759,22 +730,36 @@ return res_info -def _AddPakSymbols(section_sizes, raw_symbols, symbols_by_name): - pak_symbols = sorted(symbols_by_name.values(), +def _ParsePakSymbols(object_paths, output_directory, symbols_by_id): + for path in object_paths: + whitelist_path = os.path.join(output_directory, path + '.whitelist') + if (not os.path.exists(whitelist_path) + or os.path.getsize(whitelist_path) == 0): + continue + with open(whitelist_path, 'r') as f: + for line in f: + resource_id = int(line.rstrip()) + # There may be object files in static libraries that are removed by the + # linker when there are no external references to its symbols. These + # files may be included in object_paths which our apk does not use, + # resulting in resource_ids that don't end up being in the final apk. + if resource_id not in symbols_by_id: + continue + symbols_by_id[resource_id].object_path = path + + raw_symbols = sorted(symbols_by_id.values(), key=lambda s: (s.section_name, s.address)) - for symbol in pak_symbols: + section_sizes = {} + for symbol in raw_symbols: prev = section_sizes.setdefault(symbol.section_name, 0) section_sizes[symbol.section_name] = prev + symbol.size - raw_symbols.extend(pak_symbols) + return section_sizes, raw_symbols -def AddApkInfo(section_sizes, raw_symbols, apk_path, output_directory, - metadata, apk_elf_result): - """Uses apk and output directory add pak and size info.""" +def _ParseApkSectionSizes(section_sizes, metadata, apk_elf_result): if metadata: logging.debug('Extracting section sizes from .so within .apk') - unstripped_section_sizes = section_sizes - apk_build_id, section_sizes = apk_elf_result.get() + apk_build_id, apk_section_sizes = apk_elf_result.get() assert apk_build_id == metadata[models.METADATA_ELF_BUILD_ID], ( 'BuildID from apk_elf_result did not match') @@ -791,44 +776,101 @@ if packed_section_name not in section_sizes: logging.warning('Packed section not present: %s', packed_section_name) else: - section_sizes['%s (unpacked)' % packed_section_name] = ( - unstripped_section_sizes.get(packed_section_name)) - _AddPakSymbolsFromApk(section_sizes, raw_symbols, apk_path, output_directory) + apk_section_sizes['%s (unpacked)' % packed_section_name] = ( + section_sizes.get(packed_section_name)) + return apk_section_sizes -def _AddPakSymbolsFromApk( - section_sizes, raw_symbols, apk_path, output_directory): +def _FindPakSymbolsFromApk(apk_path, output_directory): with zipfile.ZipFile(apk_path) as z: - pak_zip_infos = [f for f in z.infolist() if f.filename.endswith('.pak')] + pak_zip_infos = (f for f in z.infolist() if f.filename.endswith('.pak')) apk_info_name = os.path.basename(apk_path) + '.pak.info' pak_info_path = os.path.join(output_directory, 'size-info', apk_info_name) res_info = _ParsePakInfoFile(pak_info_path) - symbols_by_name = {} + symbols_by_id = {} for pak_zip_info in pak_zip_infos: contents = data_pack.ReadDataPackFromString(z.read(pak_zip_info)) _ComputePakFileSymbols( pak_zip_info.filename, pak_zip_info.file_size, contents, res_info, - symbols_by_name) - _AddPakSymbols(section_sizes, raw_symbols, symbols_by_name) + symbols_by_id) + return symbols_by_id -def AddPakSymbolsFromFiles( - section_sizes, raw_symbols, pak_files, pak_info_path): +def _FindPakSymbolsFromFiles(pak_files, pak_info_path): """Uses files from args to find and add pak symbols.""" res_info = _ParsePakInfoFile(pak_info_path) - symbols_by_name = {} + symbols_by_id = {} for pak_file_path in pak_files: with open(pak_file_path, 'r') as f: contents = data_pack.ReadDataPackFromString(f.read()) _ComputePakFileSymbols( pak_file_path, os.path.getsize(pak_file_path), contents, res_info, - symbols_by_name) - _AddPakSymbols(section_sizes, raw_symbols, symbols_by_name) + symbols_by_id) + return symbols_by_id + + +def CreateSectionSizesAndSymbols( + map_path=None, tool_prefix=None, output_directory=None, elf_path=None, + apk_path=None, track_string_literals=True, metadata=None, + apk_elf_result=None, pak_files=None, pak_info_file=None): + """Creates sections sizes and symbols for a SizeInfo. + + Args: + map_path: Path to the linker .map(.gz) file to parse. + elf_path: Path to the corresponding unstripped ELF file. Used to find symbol + aliases and inlined functions. Can be None. + tool_prefix: Prefix for c++filt & nm (required). + output_directory: Build output directory. If None, source_paths and symbol + alias information will not be recorded. + track_string_literals: Whether to break down "** merge string" sections into + smaller symbols (requires output_directory). + """ + source_mapper = None + elf_object_paths = None + if output_directory: + # Start by finding the elf_object_paths, so that nm can run on them while + # the linker .map is being parsed. + logging.info('Parsing ninja files.') + source_mapper, elf_object_paths = ninja_parser.Parse( + output_directory, elf_path) + logging.debug('Parsed %d .ninja files.', source_mapper.parsed_file_count) + assert not elf_path or elf_object_paths, ( + 'Failed to find link command in ninja files for ' + + os.path.relpath(elf_path, output_directory)) + + section_sizes, raw_symbols = _ParseElfInfo( + map_path, elf_path, tool_prefix, output_directory, track_string_literals, + elf_object_paths) + + pak_symbols_by_id = None + if apk_path: + section_sizes = _ParseApkSectionSizes(section_sizes, metadata, + apk_elf_result) + pak_symbols_by_id = _FindPakSymbolsFromApk(apk_path, output_directory) + elif pak_files and pak_info_file: + pak_symbols_by_id = _FindPakSymbolsFromFiles(pak_files, pak_info_file) + + if pak_symbols_by_id: + object_paths = (p for p in source_mapper.IterAllPaths() if p.endswith('.o')) + pak_section_sizes, pak_raw_symbols = _ParsePakSymbols( + object_paths, output_directory, pak_symbols_by_id) + section_sizes.update(pak_section_sizes) + raw_symbols.extend(pak_raw_symbols) + + _ExtractSourcePathsAndNormalizeObjectPaths(raw_symbols, source_mapper) + logging.info('Converting excessive aliases into shared-path symbols') + _CompactLargeAliasesIntoSharedSymbols(raw_symbols) + return section_sizes, raw_symbols def CreateSizeInfo( section_sizes, raw_symbols, metadata=None, normalize_names=True): """Performs operations on all symbols and creates a SizeInfo object.""" + logging.debug('Sorting %d symbols', len(raw_symbols)) + raw_symbols.sort(key=lambda s: ( + s.IsPak(), s.IsBss(), s.section_name, s.address)) + logging.info('Processed %d symbols', len(raw_symbols)) + # Padding not really required, but it is useful to check for large padding and # log a warning. logging.info('Calculating padding') @@ -840,9 +882,6 @@ if normalize_names: _NormalizeNames(raw_symbols) - raw_symbols.sort(key=lambda s: ( - s.IsPak(), s.IsBss(), s.section_name, s.address)) - logging.info('Processed %d symbols', len(raw_symbols)) return models.SizeInfo(section_sizes, raw_symbols, metadata=metadata) @@ -957,8 +996,6 @@ elf_path = args.elf_file map_path = args.map_file apk_path = args.apk_file - pak_files = args.pak_file - pak_info_file = args.pak_info_file any_input = apk_path or elf_path or map_path if not any_input: parser.error('Most pass at least one of --apk-file, --elf-file, --map-file') @@ -1004,20 +1041,19 @@ metadata = CreateMetadata(map_path, elf_path, apk_path, tool_prefix, output_directory) + + apk_elf_result = None if apk_path and elf_path: # Extraction takes around 1 second, so do it in parallel. apk_elf_result = concurrent.ForkAndCall( _ElfInfoFromApk, (apk_path, apk_so_path, tool_prefix)) section_sizes, raw_symbols = CreateSectionSizesAndSymbols( - map_path, elf_path, tool_prefix, output_directory, - track_string_literals=args.track_string_literals) - if apk_path: - AddApkInfo(section_sizes, raw_symbols, apk_path, output_directory, - metadata, apk_elf_result) - elif pak_files and pak_info_file: - AddPakSymbolsFromFiles( - section_sizes, raw_symbols, pak_files, pak_info_file) + map_path=map_path, tool_prefix=tool_prefix, elf_path=elf_path, + apk_path=apk_path, output_directory=output_directory, + track_string_literals=args.track_string_literals, + metadata=metadata, apk_elf_result=apk_elf_result, + pak_files=args.pak_file, pak_info_file=args.pak_info_file) size_info = CreateSizeInfo( section_sizes, raw_symbols, metadata=metadata, normalize_names=False)
diff --git a/tools/binary_size/libsupersize/integration_test.py b/tools/binary_size/libsupersize/integration_test.py index 00b5323..edac84a 100755 --- a/tools/binary_size/libsupersize/integration_test.py +++ b/tools/binary_size/libsupersize/integration_test.py
@@ -107,11 +107,15 @@ if cache_key not in IntegrationTest.cached_size_info: elf_path = _TEST_ELF_PATH if use_elf else None output_directory = _TEST_OUTPUT_DIR if use_output_directory else None - section_sizes, raw_symbols = archive.CreateSectionSizesAndSymbols( - _TEST_MAP_PATH, elf_path, _TEST_TOOL_PREFIX, output_directory) if use_pak: - archive.AddPakSymbolsFromFiles( - section_sizes, raw_symbols, [_TEST_PAK_PATH], _TEST_PAK_INFO_PATH) + section_sizes, raw_symbols = archive.CreateSectionSizesAndSymbols( + map_path=_TEST_MAP_PATH, tool_prefix=_TEST_TOOL_PREFIX, + elf_path=elf_path, output_directory=output_directory, + pak_files=[_TEST_PAK_PATH], pak_info_file=_TEST_PAK_INFO_PATH) + else: + section_sizes, raw_symbols = archive.CreateSectionSizesAndSymbols( + map_path=_TEST_MAP_PATH, tool_prefix=_TEST_TOOL_PREFIX, + elf_path=elf_path, output_directory=output_directory) metadata = None if use_elf: with _AddMocksToPath():
diff --git a/tools/binary_size/libsupersize/ninja_parser.py b/tools/binary_size/libsupersize/ninja_parser.py index b8a2784..6b776539 100644 --- a/tools/binary_size/libsupersize/ninja_parser.py +++ b/tools/binary_size/libsupersize/ninja_parser.py
@@ -55,6 +55,9 @@ def unmatched_paths_count(self): return len(self._unmatched_paths) + def IterAllPaths(self): + return self._dep_map.iterkeys() + def _ParseNinjaPathList(path_list): ret = path_list.replace('\\ ', '\b')
diff --git a/tools/binary_size/libsupersize/testdata/Archive_Pak.golden b/tools/binary_size/libsupersize/testdata/Archive_Pak.golden index ca67b21..64a0fbf 100644 --- a/tools/binary_size/libsupersize/testdata/Archive_Pak.golden +++ b/tools/binary_size/libsupersize/testdata/Archive_Pak.golden
@@ -87,208 +87,208 @@ .bss@2dffda0(size_without_padding=28,padding=0,full_name=g_chrome_content_browser_client,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .bss@2dffe80(size_without_padding=4,padding=196,full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1) .bss@2dffe84(size_without_padding=4,padding=0,full_name=g_AnimationFrameTimeHistogram_clazz,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={anon,gen},num_aliases=1) -.pak.translations@3ac6(size_without_padding=40,padding=0,full_name=../../components/app_modal_strings.grdp: IDS_BEFOREUNLOAD_MESSAGEBOX_MESSAGE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/app_modal_strings.grdp,flags={},num_aliases=1) -.pak.translations@3d7c(size_without_padding=24,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_TYPE_ERROR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/policy_strings.grdp,flags={},num_aliases=1) -.pak.translations@3d82(size_without_padding=25,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_LIST_ENTRY_ERROR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/policy_strings.grdp,flags={},num_aliases=1) -.pak.translations@3d83(size_without_padding=41,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_SCHEMA_VALIDATION_ERROR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/policy_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dd2(size_without_padding=51,padding=0,full_name=../../components/safe_browsing_strings.grdp: IDS_SB_UNDER_CONSTRUCTION,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/safe_browsing_strings.grdp,flags={},num_aliases=1) -.pak.translations@3df8(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_TITLE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3df9(size_without_padding=17,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dfa(size_without_padding=18,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dfb(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dfc(size_without_padding=44,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_HEADING,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dfd(size_without_padding=226,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PRIMARY_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dfe(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3dff(size_without_padding=231,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e00(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PROCEED_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e01(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e02(size_without_padding=116,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e03(size_without_padding=156,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_SCOUT_REPORTING_AGREE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e08(size_without_padding=26,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_HEADING,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e09(size_without_padding=253,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PRIMARY_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e0a(size_without_padding=155,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_EXPLANATION_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e0b(size_without_padding=187,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e0c(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_HEADING,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e0d(size_without_padding=160,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e0e(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_HEADING,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@3e0f(size_without_padding=147,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../components/security_interstitials_strings.grdp,flags={},num_aliases=1) -.pak.translations@4e85(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_CLEAR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e86(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_TODAY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e87(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SUBMIT_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e89(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_RESET_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e8a(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_BUTTON_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e8b(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_MULTIPLE_FILES_BUTTON_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e8c(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_NO_FILE_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e8d(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_MULTIPLE_UPLOAD,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e8e(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_OTHER_COLOR_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e92(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_DAY_OF_MONTH_FIELD,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e93(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_MONTH_FIELD,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e94(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_YEAR_FIELD,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e95(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SELECT_MENU_LIST_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e96(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_MONTH_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e97(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_WEEK_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e98(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_WEEK_NUMBER_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e99(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_MONTH_SELECTOR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e9a(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_NEXT_MONTH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e9b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_PREVIOUS_MONTH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e9c(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_WEEK_DESCRIPTION,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e9d(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ARTICLE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e9e(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BANNER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4e9f(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COMPLEMENTARY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CHECK_BOX,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea1(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CONTENT_INFO,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DEFINITION,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea4(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DESCRIPTION_TERM,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea5(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DISCLOSURE_TRIANGLE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FEED,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ea9(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FOOTER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eac(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOGGLE_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ead(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eae(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LINK,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eaf(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MAIN_CONTENT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb0(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARK,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MATH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NAVIGATIONAL_LINK,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb3(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_REGION,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb4(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH_BOX,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb5(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_STATUS,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb6(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SWITCH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb8(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eb9(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT_DIALOG,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eba(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_APPLICATION,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ebb(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BLOCKQUOTE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ebc(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ebd(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON_DROP_DOWN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ebe(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CELL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ebf(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLOR_WELL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec0(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLUMN_HEADER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec2(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec3(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE_TIME,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec4(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIALOG,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec5(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIRECTORY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec6(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DOCUMENT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec7(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_EMBEDDED_OBJECT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec8(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_GRAPHIC,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ec9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING_WITH_LEVEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eca(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_INPUT_TIME,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ecb(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LIST_BOX,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ecc(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LOG,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ecd(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARQUEE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ece(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ecf(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BAR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed0(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_ITEM,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_METER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed3(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NOTE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed4(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_POP_UP_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed5(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_PROGRESS_INDICATOR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed6(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed7(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO_GROUP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed8(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ROW_HEADER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ed9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SCROLL_BAR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eda(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4edb(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SLIDER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4edc(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPIN_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4edd(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPLITTER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ede(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4edf(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TABLE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_LIST,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_PANEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee2(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIME,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee3(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIMER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee4(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLBAR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee5(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLTIP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee7(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_GRID,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee8(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_ITEM,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ee9(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_AM_PM_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eea(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_DAY_OF_MONTH_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eeb(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_HOUR_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eec(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DEFAULT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eed(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_ELEMENT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eee(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_ELEMENT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eef(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef0(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef3(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef4(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef5(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef6(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_EXIT_FULL_SCREEN_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef7(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef8(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4ef9(size_without_padding=31,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_OFF_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4efa(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_ON_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4efb(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DOWNLOAD_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4efc(size_without_padding=30,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4eff(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f00(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f01(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f02(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f03(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_SLIDER_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f04(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_SLIDER_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f05(size_without_padding=29,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f06(size_without_padding=42,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f07(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f09(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f0a(size_without_padding=37,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f0d(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON_HELP,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f0e(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MILLISECOND_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f0f(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MINUTE_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f10(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MONTH_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f11(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_SECOND_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f13(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_YEAR_FIELD_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f14(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_INPUT_WEEK_TEMPLATE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f15(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_MULTIPLE_FILE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f16(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f17(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f18(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_DOMAIN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f19(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_LOCAL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f1a(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOMAIN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f1b(size_without_padding=47,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOTS,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f1c(size_without_padding=65,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_LOCAL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f1d(size_without_padding=75,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_NO_AT_SIGN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f1e(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_MULTIPLE_EMAIL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f1f(size_without_padding=48,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f20(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW_DATETIME,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f21(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f22(size_without_padding=34,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW_DATETIME,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f23(size_without_padding=81,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_DATETIME,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f24(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_NUMBER,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f25(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f26(size_without_padding=51,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_CHECKBOX,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f27(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_FILE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f28(size_without_padding=41,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_RADIO,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f29(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_SELECT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f2a(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f2b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_URL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f2c(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_PATTERN_MISMATCH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f2d(size_without_padding=77,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f2e(size_without_padding=64,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH_CLOSE_TO_LIMIT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f2f(size_without_padding=96,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_LONG,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f30(size_without_padding=95,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f31(size_without_padding=97,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT_PLURAL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f32(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f33(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS_SUBMENU_TITLE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f34(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CAST,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f35(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_ENTER_FULLSCREEN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f36(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_EXIT_FULLSCREEN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f37(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_STOP_CAST,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f38(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_MUTE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f39(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_UNMUTE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f3a(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PLAY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f3b(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PAUSE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f3c(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_DOWNLOAD,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f3d(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_DISABLE_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f3e(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f3f(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TO_UNKNOWN_DEVICE_TEXT,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f40(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_NO_LABEL,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f41(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_OFF,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@4f42(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_PLUGIN_INITIALIZATION_ERROR,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../content/app/strings/content_strings.grd,flags={},num_aliases=1) -.pak.translations@5bd6(size_without_padding=27,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_NOT_AVAILABLE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../android_webview/ui/aw_strings.grd,flags={},num_aliases=1) -.pak.translations@5bd7(size_without_padding=69,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_CAN_NOT_BE_LOADED,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../android_webview/ui/aw_strings.grd,flags={},num_aliases=1) -.pak.translations@5bd8(size_without_padding=121,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../android_webview/ui/aw_strings.grd,flags={},num_aliases=1) -.pak.translations@5bd9(size_without_padding=161,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN_SUGGESTIONS,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../android_webview/ui/aw_strings.grd,flags={},num_aliases=1) -.pak.translations@5bda(size_without_padding=80,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_PARENTAL_PERMISSION_NEEDED,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../android_webview/ui/aw_strings.grd,flags={},num_aliases=1) -.pak.translations@6917(size_without_padding=23,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_FAMILY,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../ui/strings/app_locale_settings.grd,flags={},num_aliases=1) -.pak.translations@6918(size_without_padding=9,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_SIZE,object_path=tools/binary_size/libsupersize/testdata/mock_output_directory/en-US.pak,source_path=../../ui/strings/app_locale_settings.grd,flags={},num_aliases=1) +.pak.translations@3ac6(size_without_padding=40,padding=0,full_name=../../components/app_modal_strings.grdp: IDS_BEFOREUNLOAD_MESSAGEBOX_MESSAGE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3d7c(size_without_padding=24,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_TYPE_ERROR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3d82(size_without_padding=25,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_LIST_ENTRY_ERROR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3d83(size_without_padding=41,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_SCHEMA_VALIDATION_ERROR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dd2(size_without_padding=51,padding=0,full_name=../../components/safe_browsing_strings.grdp: IDS_SB_UNDER_CONSTRUCTION,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3df8(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_TITLE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3df9(size_without_padding=17,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dfa(size_without_padding=18,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dfb(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dfc(size_without_padding=44,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_HEADING,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dfd(size_without_padding=226,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PRIMARY_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dfe(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3dff(size_without_padding=231,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e00(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PROCEED_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e01(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e02(size_without_padding=116,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e03(size_without_padding=156,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_SCOUT_REPORTING_AGREE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e08(size_without_padding=26,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_HEADING,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e09(size_without_padding=253,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PRIMARY_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e0a(size_without_padding=155,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e0b(size_without_padding=187,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e0c(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_HEADING,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e0d(size_without_padding=160,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e0e(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_HEADING,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@3e0f(size_without_padding=147,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e85(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_CLEAR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e86(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_TODAY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e87(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SUBMIT_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e89(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_RESET_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e8a(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_BUTTON_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e8b(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_MULTIPLE_FILES_BUTTON_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e8c(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_NO_FILE_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e8d(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_MULTIPLE_UPLOAD,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e8e(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_OTHER_COLOR_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e92(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_DAY_OF_MONTH_FIELD,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e93(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_MONTH_FIELD,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e94(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_YEAR_FIELD,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e95(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SELECT_MENU_LIST_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e96(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_MONTH_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e97(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_WEEK_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e98(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_WEEK_NUMBER_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e99(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_MONTH_SELECTOR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e9a(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_NEXT_MONTH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e9b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_PREVIOUS_MONTH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e9c(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_WEEK_DESCRIPTION,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e9d(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ARTICLE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e9e(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BANNER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4e9f(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COMPLEMENTARY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CHECK_BOX,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea1(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CONTENT_INFO,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DEFINITION,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea4(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DESCRIPTION_TERM,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea5(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DISCLOSURE_TRIANGLE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FEED,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ea9(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FOOTER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eac(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOGGLE_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ead(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eae(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LINK,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eaf(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MAIN_CONTENT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb0(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARK,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MATH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NAVIGATIONAL_LINK,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb3(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_REGION,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb4(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH_BOX,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb5(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_STATUS,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb6(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SWITCH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb8(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eb9(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT_DIALOG,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eba(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_APPLICATION,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ebb(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BLOCKQUOTE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ebc(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ebd(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON_DROP_DOWN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ebe(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CELL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ebf(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLOR_WELL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec0(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLUMN_HEADER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec2(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec3(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE_TIME,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec4(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIALOG,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec5(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIRECTORY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec6(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DOCUMENT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec7(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_EMBEDDED_OBJECT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec8(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_GRAPHIC,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ec9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING_WITH_LEVEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eca(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_INPUT_TIME,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ecb(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LIST_BOX,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ecc(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LOG,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ecd(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARQUEE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ece(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ecf(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BAR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed0(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_ITEM,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_METER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed3(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NOTE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed4(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_POP_UP_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed5(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_PROGRESS_INDICATOR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed6(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed7(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO_GROUP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed8(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ROW_HEADER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ed9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SCROLL_BAR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eda(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4edb(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SLIDER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4edc(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPIN_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4edd(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPLITTER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ede(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4edf(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TABLE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_LIST,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_PANEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee2(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIME,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee3(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIMER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee4(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLBAR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee5(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLTIP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee7(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_GRID,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee8(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_ITEM,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ee9(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_AM_PM_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eea(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_DAY_OF_MONTH_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eeb(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_HOUR_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eec(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DEFAULT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eed(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_ELEMENT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eee(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_ELEMENT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eef(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef0(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef3(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef4(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef5(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef6(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_EXIT_FULL_SCREEN_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef7(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef8(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4ef9(size_without_padding=31,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_OFF_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4efa(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_ON_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4efb(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DOWNLOAD_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4efc(size_without_padding=30,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4eff(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f00(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f01(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f02(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f03(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_SLIDER_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f04(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_SLIDER_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f05(size_without_padding=29,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f06(size_without_padding=42,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f07(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f09(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f0a(size_without_padding=37,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f0d(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f0e(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MILLISECOND_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f0f(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MINUTE_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f10(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MONTH_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f11(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_SECOND_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f13(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_YEAR_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f14(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_INPUT_WEEK_TEMPLATE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f15(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_MULTIPLE_FILE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f16(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f17(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f18(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_DOMAIN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f19(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_LOCAL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f1a(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOMAIN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f1b(size_without_padding=47,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOTS,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f1c(size_without_padding=65,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_LOCAL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f1d(size_without_padding=75,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_NO_AT_SIGN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f1e(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_MULTIPLE_EMAIL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f1f(size_without_padding=48,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f20(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW_DATETIME,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f21(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f22(size_without_padding=34,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW_DATETIME,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f23(size_without_padding=81,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_DATETIME,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f24(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_NUMBER,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f25(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f26(size_without_padding=51,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_CHECKBOX,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f27(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_FILE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f28(size_without_padding=41,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_RADIO,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f29(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_SELECT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f2a(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f2b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_URL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f2c(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_PATTERN_MISMATCH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f2d(size_without_padding=77,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f2e(size_without_padding=64,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH_CLOSE_TO_LIMIT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f2f(size_without_padding=96,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_LONG,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f30(size_without_padding=95,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f31(size_without_padding=97,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT_PLURAL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f32(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f33(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS_SUBMENU_TITLE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f34(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CAST,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f35(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_ENTER_FULLSCREEN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f36(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_EXIT_FULLSCREEN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f37(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_STOP_CAST,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f38(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_MUTE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f39(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_UNMUTE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f3a(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PLAY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f3b(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PAUSE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f3c(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_DOWNLOAD,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f3d(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_DISABLE_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f3e(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f3f(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TO_UNKNOWN_DEVICE_TEXT,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f40(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_NO_LABEL,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f41(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_OFF,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@4f42(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_PLUGIN_INITIALIZATION_ERROR,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@5bd6(size_without_padding=27,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_NOT_AVAILABLE,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@5bd7(size_without_padding=69,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_CAN_NOT_BE_LOADED,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@5bd8(size_without_padding=121,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@5bd9(size_without_padding=161,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN_SUGGESTIONS,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@5bda(size_without_padding=80,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_PARENTAL_PERMISSION_NEEDED,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@6917(size_without_padding=23,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_FAMILY,object_path=,source_path=,flags={},num_aliases=1) +.pak.translations@6918(size_without_padding=9,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_SIZE,object_path=,source_path=,flags={},num_aliases=1)
diff --git a/tools/perf/chromium.perf.fyi.extras.json b/tools/perf/chromium.perf.fyi.extras.json index 17e8dc7..a81aa679 100644 --- a/tools/perf/chromium.perf.fyi.extras.json +++ b/tools/perf/chromium.perf.fyi.extras.json
@@ -129,7 +129,7 @@ }, { "args": [ - "smoothness.key_silk_cases", + "system_health.common_desktop", "-v", "--upload-results", "--output-format=histograms", @@ -139,7 +139,7 @@ "--also-run-disabled-tests" ], "isolate_name": "telemetry_perf_tests", - "name": "smoothness.key_silk_cases", + "name": "system_health.common_desktop", "override_compile_targets": [ "telemetry_perf_tests" ], @@ -153,7 +153,7 @@ }, { "args": [ - "smoothness.key_silk_cases", + "system_health.common_desktop", "-v", "--upload-results", "--output-format=histograms", @@ -163,7 +163,55 @@ "--also-run-disabled-tests" ], "isolate_name": "telemetry_perf_tests", - "name": "smoothness.key_silk_cases.reference", + "name": "system_health.common_desktop.reference", + "override_compile_targets": [ + "telemetry_perf_tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "expiration": 36000, + "hard_timeout": 10800, + "ignore_task_failure": false, + "io_timeout": 3600 + } + }, + { + "args": [ + "system_health.memory_desktop", + "-v", + "--upload-results", + "--output-format=histograms", + "--output-format=json-test-results", + "--browser=release", + "--xvfb", + "--also-run-disabled-tests" + ], + "isolate_name": "telemetry_perf_tests", + "name": "system_health.memory_desktop", + "override_compile_targets": [ + "telemetry_perf_tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "expiration": 36000, + "hard_timeout": 10800, + "ignore_task_failure": false, + "io_timeout": 3600 + } + }, + { + "args": [ + "system_health.memory_desktop", + "-v", + "--upload-results", + "--output-format=histograms", + "--output-format=json-test-results", + "--browser=reference", + "--xvfb", + "--also-run-disabled-tests" + ], + "isolate_name": "telemetry_perf_tests", + "name": "system_health.memory_desktop.reference", "override_compile_targets": [ "telemetry_perf_tests" ],
diff --git a/ui/views/controls/button/checkbox.cc b/ui/views/controls/button/checkbox.cc index 0b27318a..968aaf4 100644 --- a/ui/views/controls/button/checkbox.cc +++ b/ui/views/controls/button/checkbox.cc
@@ -147,6 +147,10 @@ UpdateImage(); } +void Checkbox::SetMultiLine(bool multi_line) { + label()->SetMultiLine(multi_line); +} + // TODO(tetsui): Remove this method and |use_md_| when MD for secondary UI // becomes default and IsSecondaryUiMaterial() is tautology. bool Checkbox::UseMd() const {
diff --git a/ui/views/controls/button/checkbox.h b/ui/views/controls/button/checkbox.h index 49a02ff..7fc2735 100644 --- a/ui/views/controls/button/checkbox.h +++ b/ui/views/controls/button/checkbox.h
@@ -37,6 +37,8 @@ virtual void SetChecked(bool checked); bool checked() const { return checked_; } + void SetMultiLine(bool multi_line); + protected: // Returns whether MD is enabled. Returns true if |force_md| in the // constructor or --secondary-ui-md flag is set.
diff --git a/ui/views/controls/scroll_view_unittest.cc b/ui/views/controls/scroll_view_unittest.cc index 05a8b37..d57fbb05 100644 --- a/ui/views/controls/scroll_view_unittest.cc +++ b/ui/views/controls/scroll_view_unittest.cc
@@ -99,6 +99,8 @@ SetBounds(x(), y(), pref.width(), pref.height()); } + void SetFocus() { Focus(); } + private: DISALLOW_COPY_AND_ASSIGN(FixedView); }; @@ -633,6 +635,34 @@ EXPECT_EQ(415 - viewport_height, test_api.CurrentOffset().y()); } +// Verifies that child scrolls into view when it's focused. +TEST_F(ScrollViewTest, ScrollChildToVisibleOnFocus) { + ScrollViewTestApi test_api(&scroll_view_); + CustomView* contents = new CustomView; + scroll_view_.SetContents(contents); + contents->SetPreferredSize(gfx::Size(500, 1000)); + FixedView* child = new FixedView; + child->SetPreferredSize(gfx::Size(10, 10)); + child->SetPosition(gfx::Point(0, 405)); + contents->AddChildView(child); + + scroll_view_.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); + scroll_view_.Layout(); + EXPECT_EQ(gfx::Point(), test_api.IntegralViewOffset()); + + // Set focus to the child control. This should cause the control to scroll to + // y=405 height=10. Like the above test, this should make the y position of + // the content at (405 + 10) - viewport_height (scroll region bottom aligned). + child->SetFocus(); + const int viewport_height = test_api.contents_viewport()->height(); + + // Expect there to be a horizontal scrollbar, making the viewport shorter. + EXPECT_EQ(100 - scroll_view_.GetScrollBarLayoutHeight(), viewport_height); + + gfx::ScrollOffset offset = test_api.CurrentOffset(); + EXPECT_EQ(415 - viewport_height, offset.y()); +} + // Verifies ClipHeightTo() uses the height of the content when it is between the // minimum and maximum height values. TEST_F(ScrollViewTest, ClipHeightToNormalContentHeight) {
diff --git a/ui/views/view.cc b/ui/views/view.cc index 9710786b..8987c57 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc
@@ -1478,6 +1478,10 @@ } } +void View::ScrollViewToVisible() { + ScrollRectToVisible(GetLocalBounds()); +} + int View::GetPageScrollIncrement(ScrollView* scroll_view, bool is_horizontal, bool is_positive) { return 0; @@ -1797,6 +1801,7 @@ void View::Focus() { OnFocus(); + ScrollViewToVisible(); } void View::Blur() {
diff --git a/ui/views/view.h b/ui/views/view.h index da4b110..23a3e5e 100644 --- a/ui/views/view.h +++ b/ui/views/view.h
@@ -1108,6 +1108,10 @@ // the child view, such as Viewport, to override appropriately. virtual void ScrollRectToVisible(const gfx::Rect& rect); + // Scrolls the view's bounds or some subset thereof to be visible. By default + // this function calls ScrollRectToVisible(GetLocalBounds()). + virtual void ScrollViewToVisible(); + // The following methods are used by ScrollView to determine the amount // to scroll relative to the visible bounds of the view. For example, a // return value of 10 indicates the scrollview should scroll 10 pixels in