diff --git a/DEPS b/DEPS index 4279eee2c..f432a98b 100644 --- a/DEPS +++ b/DEPS
@@ -40,7 +40,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': '57c9d20102fd53a960293b45e3fed7cb1aac94fd', + 'skia_revision': 'fcc4a071d9dff4f3bac0bd55dab8f69a4436d15d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other.
diff --git a/base/android/java/src/org/chromium/base/SysUtils.java b/base/android/java/src/org/chromium/base/SysUtils.java index e86bd459..5979ca4 100644 --- a/base/android/java/src/org/chromium/base/SysUtils.java +++ b/base/android/java/src/org/chromium/base/SysUtils.java
@@ -4,6 +4,7 @@ package org.chromium.base; +import android.app.ActivityManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; @@ -104,6 +105,19 @@ } /** + * @return Whether or not the system has low available memory. + */ + @CalledByNative + private static boolean isCurrentlyLowMemory() { + ActivityManager am = + (ActivityManager) ContextUtils.getApplicationContext().getSystemService( + Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo(); + am.getMemoryInfo(info); + return info.lowMemory; + } + + /** * Resets the cached value, if any. */ @VisibleForTesting
diff --git a/base/android/sys_utils.cc b/base/android/sys_utils.cc index a576644..6201f8c4 100644 --- a/base/android/sys_utils.cc +++ b/base/android/sys_utils.cc
@@ -16,6 +16,11 @@ return Java_SysUtils_isLowEndDevice(env); } +bool SysUtils::IsCurrentlyLowMemory() { + JNIEnv* env = AttachCurrentThread(); + return Java_SysUtils_isCurrentlyLowMemory(env); +} + } // namespace android } // namespace base
diff --git a/base/android/sys_utils.h b/base/android/sys_utils.h index 2edbdd5..b1e368b 100644 --- a/base/android/sys_utils.h +++ b/base/android/sys_utils.h
@@ -14,6 +14,8 @@ public: // Returns true iff this is a low-end device. static bool IsLowEndDeviceFromJni(); + // Returns true if system has low available memory. + static bool IsCurrentlyLowMemory(); }; } // namespace android
diff --git a/build/android/pylib/utils/device_dependencies.py b/build/android/pylib/utils/device_dependencies.py index 9046122..597c883b 100644 --- a/build/android/pylib/utils/device_dependencies.py +++ b/build/android/pylib/utils/device_dependencies.py
@@ -16,8 +16,12 @@ re.compile(r'.*\.py'), # Some test_support targets include python deps. re.compile(r'.*\.stamp'), # Stamp files should never be included. - # Some test_support targets include python deps. - re.compile(r'.*\.mojom\.js'), + # Adding dependency on mojom targets adds data dependency on js bindings. + # Do not include those files except for JsToCppTest.mojom.js, which is + # required by webkit_unit_tests during runtime. + # TODO(yzshen): Remove this rule by generating foo_js that targets can + # explicitly depend on (crbug.com/603212). + re.compile(r'.*(?<!JsToCpp)\.mojom\.js'), # Chrome external extensions config file. re.compile(r'.*external_extensions\.json'),
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 37bf601..f1f0836 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -472,6 +472,7 @@ "//components/payments/content/android:java", "//components/payments/mojom:mojom_parser_java", "//components/policy/android:policy_java", + "//components/policy/android:policy_java_test_support", "//components/precache/android:precache_java", "//components/precache/android:precache_javatests", "//components/signin/core/browser/android:java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java index 37d037a..6d265c65 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -244,6 +244,11 @@ final Activity activity, final @Nullable Callback<Boolean> onSearchEngineFinalized) { assert TemplateUrlService.getInstance().isLoaded(); + if (TemplateUrlService.getInstance().isDefaultSearchManaged()) { + if (onSearchEngineFinalized != null) onSearchEngineFinalized.onResult(true); + return; + } + final int shouldShow = getSearchEnginePromoShowType(); Callable<PromoDialog> dialogCreator; switch (shouldShow) {
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 9f958ec..e0b804ed 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -1459,6 +1459,7 @@ "javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEngineDialogHelperUtils.java", "javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialogTest.java", "javatests/src/org/chromium/chrome/browser/locale/LocaleManagerReferralTest.java", + "javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java", "javatests/src/org/chromium/chrome/browser/media/RouterTestUtils.java", "javatests/src/org/chromium/chrome/browser/media/remote/CastNotificationTest.java", "javatests/src/org/chromium/chrome/browser/media/remote/CastPositionTransferTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java new file mode 100644 index 0000000..35b8457b --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java
@@ -0,0 +1,87 @@ +// 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. + +package org.chromium.chrome.browser.locale; + +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.Callback; +import org.chromium.base.ThreadUtils; +import org.chromium.base.library_loader.ProcessInitException; +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.init.ChromeBrowserInitializer; +import org.chromium.chrome.browser.searchwidget.SearchActivity; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.util.ActivityUtils; +import org.chromium.policy.test.annotations.Policies; + +import java.util.concurrent.TimeoutException; + +/** + * Integration tests for {@link LocaleManager}. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +public class LocaleManagerTest { + @Before + public void setUp() { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + try { + ChromeBrowserInitializer + .getInstance( + InstrumentationRegistry.getInstrumentation().getTargetContext()) + .handleSynchronousStartup(); + } catch (ProcessInitException e) { + Assert.fail("Failed to load browser"); + } + } + }); + } + + @Policies.Add({ @Policies.Item(key = "DefaultSearchProviderEnabled", string = "false") }) + @SmallTest + @Test + public void testShowSearchEnginePromoDseDisabled() + throws InterruptedException, TimeoutException { + final CallbackHelper getShowTypeCallback = new CallbackHelper(); + LocaleManager.setInstanceForTest(new LocaleManager() { + @Override + public int getSearchEnginePromoShowType() { + getShowTypeCallback.notifyCalled(); + return LocaleManager.SEARCH_ENGINE_PROMO_DONT_SHOW; + } + }); + + // Launch any activity as an Activity ref is required to attempt to show the activity. + final SearchActivity searchActivity = ActivityUtils.waitForActivity( + InstrumentationRegistry.getInstrumentation(), SearchActivity.class); + + final CallbackHelper searchEnginesFinalizedCallback = new CallbackHelper(); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + LocaleManager.getInstance().showSearchEnginePromoIfNeeded( + searchActivity, new Callback<Boolean>() { + @Override + public void onResult(Boolean result) { + Assert.assertTrue(result); + searchEnginesFinalizedCallback.notifyCalled(); + } + }); + } + }); + searchEnginesFinalizedCallback.waitForCallback(0); + Assert.assertEquals(0, getShowTypeCallback.getCallCount()); + } +}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index bad26a43..20a1513 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2321,8 +2321,6 @@ "safe_browsing/client_side_detection_service.h", "safe_browsing/client_side_model_loader.cc", "safe_browsing/client_side_model_loader.h", - "safe_browsing/disk_image_type_sniffer_mac.cc", - "safe_browsing/disk_image_type_sniffer_mac.h", "safe_browsing/download_feedback.cc", "safe_browsing/download_feedback.h", "safe_browsing/download_feedback_service.cc",
diff --git a/chrome/browser/banners/app_banner_manager.cc b/chrome/browser/banners/app_banner_manager.cc index 9524f7ef..d60e013b 100644 --- a/chrome/browser/banners/app_banner_manager.cc +++ b/chrome/browser/banners/app_banner_manager.cc
@@ -78,7 +78,7 @@ } UpdateState(State::ACTIVE); - is_debug_mode_ = is_debug_mode; + triggered_by_devtools_ = is_debug_mode; page_requested_prompt_ = false; // We only need to call ReportStatus if we aren't in debug mode (this avoids @@ -110,6 +110,7 @@ if (binding_.is_bound()) binding_.Close(); + UpdateState(State::PENDING_MANIFEST); manager_->GetData( ParamsToGetManifest(), base::Bind(&AppBannerManager::OnDidGetManifest, GetWeakPtr())); @@ -154,7 +155,7 @@ has_sufficient_engagement_(false), load_finished_(false), page_requested_prompt_(false), - is_debug_mode_(false), + triggered_by_devtools_(false), need_to_log_status_(false), weak_factory_(this) { // Ensure the InstallableManager exists since we have a hard dependency on it. @@ -193,7 +194,7 @@ } bool AppBannerManager::IsDebugMode() const { - return is_debug_mode_ || + return triggered_by_devtools_ || base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kBypassAppBannerEngagementChecks); } @@ -206,6 +207,7 @@ } void AppBannerManager::OnDidGetManifest(const InstallableData& data) { + UpdateState(State::ACTIVE); if (data.error_code != NO_ERROR_DETECTED) { ReportStatus(web_contents(), data.error_code); Stop(); @@ -237,6 +239,9 @@ params.check_installable = true; params.fetch_valid_primary_icon = true; + // Don't wait for the service worker if this was triggered from devtools. + params.wait_for_worker = !triggered_by_devtools_; + return params; } @@ -245,6 +250,7 @@ return; // Fetch and verify the other required information. + UpdateState(State::PENDING_INSTALLABLE_CHECK); manager_->GetData(ParamsToPerformInstallableCheck(), base::Bind(&AppBannerManager::OnDidPerformInstallableCheck, GetWeakPtr())); @@ -252,6 +258,7 @@ void AppBannerManager::OnDidPerformInstallableCheck( const InstallableData& data) { + UpdateState(State::ACTIVE); if (data.is_installable) TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_REQUESTED); @@ -319,21 +326,41 @@ } void AppBannerManager::Stop() { - if (state_ == State::PENDING_EVENT && !page_requested_prompt_) { - TrackBeforeInstallEvent( - BEFORE_INSTALL_EVENT_PROMPT_NOT_CALLED_AFTER_PREVENT_DEFAULT); - ReportStatus(web_contents(), RENDERER_CANCELLED); - } else if (state_ == State::PENDING_ENGAGEMENT && - !has_sufficient_engagement_) { - TrackDisplayEvent(DISPLAY_EVENT_NOT_VISITED_ENOUGH); - ReportStatus(web_contents(), INSUFFICIENT_ENGAGEMENT); + // Record the status if we are currently waiting for data. + InstallableStatusCode code = NO_ERROR_DETECTED; + switch (state_) { + case State::PENDING_EVENT: + if (!page_requested_prompt_) { + TrackBeforeInstallEvent( + BEFORE_INSTALL_EVENT_PROMPT_NOT_CALLED_AFTER_PREVENT_DEFAULT); + code = RENDERER_CANCELLED; + } + break; + case State::PENDING_ENGAGEMENT: + if (!has_sufficient_engagement_) { + TrackDisplayEvent(DISPLAY_EVENT_NOT_VISITED_ENOUGH); + code = INSUFFICIENT_ENGAGEMENT; + } + break; + case State::PENDING_MANIFEST: + code = WAITING_FOR_MANIFEST; + break; + case State::PENDING_INSTALLABLE_CHECK: + code = WAITING_FOR_INSTALLABLE_CHECK; + break; + case State::ACTIVE: + case State::INACTIVE: + case State::COMPLETE: + break; } + if (code != NO_ERROR_DETECTED) + ReportStatus(web_contents(), code); + // In every non-debug run through the banner pipeline, we should have called // ReportStatus() and set need_to_log_status_ to false. The only case where - // we don't is if we're still active and waiting for a callback from the - // InstallableManager (e.g. the renderer crashes or the browser is shutting - // down). These situations are explicitly not logged. + // we don't is if we're still active and waiting for native app data, which is + // explicitly not logged. DCHECK(!need_to_log_status_ || is_active()); weak_factory_.InvalidateWeakPtrs();
diff --git a/chrome/browser/banners/app_banner_manager.h b/chrome/browser/banners/app_banner_manager.h index d14251b7d..9bd558d 100644 --- a/chrome/browser/banners/app_banner_manager.h +++ b/chrome/browser/banners/app_banner_manager.h
@@ -101,6 +101,14 @@ // The banner pipeline is currently running for this page load. ACTIVE, + // The banner pipeline is currently waiting for the page manifest to be + // fetched. + PENDING_MANIFEST, + + // The banner pipeline is currently waiting for the installability criteria + // to be checked. + PENDING_INSTALLABLE_CHECK, + // The banner pipeline has finished running, but is waiting for sufficient // engagement to trigger the banner. PENDING_ENGAGEMENT, @@ -137,7 +145,7 @@ virtual int GetIdealPrimaryIconSizeInPx(); virtual int GetMinimumPrimaryIconSizeInPx(); - // Returns true if |is_debug_mode_| is true or the + // Returns true if |triggered_by_devtools_| is true or the // kBypassAppBannerEngagementChecks flag is set. virtual bool IsDebugMode() const; @@ -212,8 +220,18 @@ int event_request_id() const { return event_request_id_; } bool is_active() const { return state_ == State::ACTIVE; } bool is_active_or_pending() const { - return state_ == State::ACTIVE || state_ == State::PENDING_ENGAGEMENT || - state_ == State::PENDING_EVENT; + switch (state_) { + case State::ACTIVE: + case State::PENDING_MANIFEST: + case State::PENDING_INSTALLABLE_CHECK: + case State::PENDING_ENGAGEMENT: + case State::PENDING_EVENT: + return true; + case State::INACTIVE: + case State::COMPLETE: + return false; + } + return false; } bool is_complete() const { return state_ == State::COMPLETE; } bool is_pending_engagement() const { @@ -295,8 +313,8 @@ // Record whether the page requests for a banner to be shown later on. bool page_requested_prompt_; - // Whether we should be logging errors to the console for this request. - bool is_debug_mode_; + // Whether the current flow was begun via devtools. + bool triggered_by_devtools_; // Whether the installable status has been logged for this run. bool need_to_log_status_;
diff --git a/chrome/browser/chromeos/system_logs/single_log_source.cc b/chrome/browser/chromeos/system_logs/single_log_source.cc index 0d5b7ae..817c4be3 100644 --- a/chrome/browser/chromeos/system_logs/single_log_source.cc +++ b/chrome/browser/chromeos/system_logs/single_log_source.cc
@@ -6,7 +6,11 @@ #include "base/bind.h" #include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/process/process_info.h" +#include "base/strings/string_split.h" #include "base/task_scheduler/post_task.h" +#include "base/time/time.h" #include "content/public/browser/browser_thread.h" namespace system_logs { @@ -16,6 +20,16 @@ constexpr char kDefaultSystemLogDirPath[] = "/var/log"; constexpr int kMaxNumAllowedLogRotationsDuringFileRead = 3; +// For log files that contain old logging, start reading from the first +// timestamp that is less than this amount of time before the current session of +// Chrome started. +constexpr base::TimeDelta kLogCutoffTimeBeforeChromeStart = + base::TimeDelta::FromMinutes(10); + +// A custom timestamp for when the current Chrome session started. Used during +// testing to override the actual time. +const base::Time* g_chrome_start_time_for_test = nullptr; + // Converts a logs source type to the corresponding file path, relative to the // base system log directory path. In the future, if non-file source types are // added, this function should return an empty file path. @@ -53,10 +67,74 @@ iter->second += value; } +// Returns the time that the current Chrome process started. Will instead return +// |*g_chrome_start_time_for_test| if it is set. +base::Time GetChromeStartTime() { + if (g_chrome_start_time_for_test) + return *g_chrome_start_time_for_test; + return base::CurrentProcessInfo::CreationTime(); +} + +// Returns the file offset into |path| of the first line that starts with a +// timestamp no earlier than |time|. Returns 0 if no such offset could be +// determined (e.g. can't open file, no timestamps present). +size_t GetFirstFileOffsetWithTime(const base::FilePath& path, + const base::Time& time) { + base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ); + if (!file.IsValid()) + return 0; + + const size_t file_size = file.GetLength(); + if (file_size == 0) + return 0; + + std::string file_contents; + file_contents.resize(file_size); + size_t size_read = file.ReadAtCurrentPos(&file_contents[0], file_size); + + if (size_read < file_size) + return 0; + + std::vector<base::StringPiece> lines = base::SplitStringPiece( + file_contents, "\n", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + + bool any_timestamp_found = false; + + // Find the first line with timestamp >= |time|. If a line has no timestamp, + // just advance to the next line. + size_t offset = 0; + base::Time timestamp; + for (const auto& line : lines) { + if (base::Time::FromString(line.as_string().c_str(), ×tamp)) { + any_timestamp_found = true; + + if (timestamp >= time) + break; + } + + // Include the newline in the offset. + offset += line.length() + 1; + } + + // If the file does not have any timestamps at all, don't skip any contents. + if (!any_timestamp_found) + return 0; + + if (offset > 0 && offset >= file_size && lines.back().as_string().empty()) { + // The last line may or may not have ended with a newline. If it ended with + // a newline, |lines| would end with an extra empty line after the newline. + // This would have resulted in an extra nonexistent newline being counted + // during the computation of |offset|. + --offset; + } + return offset; +} + } // namespace -SingleLogSource::SingleLogSource(SupportedSource source) - : SystemLogsSource(GetLogFileSourceRelativeFilePath(source).value()), +SingleLogSource::SingleLogSource(SupportedSource source_type) + : SystemLogsSource(GetLogFileSourceRelativeFilePath(source_type).value()), + source_type_(source_type), log_file_dir_path_(kDefaultSystemLogDirPath), num_bytes_read_(0), file_inode_(0), @@ -64,6 +142,12 @@ SingleLogSource::~SingleLogSource() {} +// static +void SingleLogSource::SetChromeStartTimeForTesting( + const base::Time* start_time) { + g_chrome_start_time_for_test = start_time; +} + void SingleLogSource::Fetch(const SysLogsSourceCallback& callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!callback.is_null()); @@ -90,6 +174,18 @@ if (!file_.IsValid()) return; + // Determine actual offset from which to start reading. + if (source_type_ == SupportedSource::kMessages) { + const base::Time earliest_log_time = + GetChromeStartTime() - kLogCutoffTimeBeforeChromeStart; + + num_bytes_read_ = + GetFirstFileOffsetWithTime(GetLogFilePath(), earliest_log_time); + } else { + num_bytes_read_ = 0; + } + file_.Seek(base::File::FROM_BEGIN, num_bytes_read_); + file_inode_ = GetInodeValue(GetLogFilePath()); }
diff --git a/chrome/browser/chromeos/system_logs/single_log_source.h b/chrome/browser/chromeos/system_logs/single_log_source.h index d4ddaa6..6afca1a7 100644 --- a/chrome/browser/chromeos/system_logs/single_log_source.h +++ b/chrome/browser/chromeos/system_logs/single_log_source.h
@@ -13,6 +13,10 @@ #include "chrome/browser/feedback/system_logs/system_logs_fetcher.h" #include "components/feedback/anonymizer_tool.h" +namespace base { +class Time; +} + namespace system_logs { // Gathers log data from a single source, possibly incrementally. @@ -29,6 +33,11 @@ explicit SingleLogSource(SupportedSource source); ~SingleLogSource() override; + // During testing, use this to set a custom Chrome start time to override the + // actual start time. Does not take ownership of |start_time|. Call this again + // with |start_time|=nullptr when done with testing. + static void SetChromeStartTimeForTesting(const base::Time* start_time); + // system_logs::SystemLogsSource: void Fetch(const SysLogsSourceCallback& callback) override; @@ -53,6 +62,9 @@ // data. void ReadFile(size_t num_rotations_allowed, SystemLogsResponse* result); + // The source type. + const SupportedSource source_type_; + // Path to system log file directory. base::FilePath log_file_dir_path_;
diff --git a/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc b/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc index df830259..35ad0ee8 100644 --- a/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc +++ b/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc
@@ -13,12 +13,31 @@ #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/run_loop.h" +#include "base/strings/string_split.h" #include "base/test/scoped_task_environment.h" +#include "base/time/time.h" #include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h" namespace system_logs { +namespace { + +// Counts number of lines in a string. +size_t GetNumLinesInString(const std::string& string) { + size_t split_size = base::SplitString(string, "\n", base::KEEP_WHITESPACE, + base::SPLIT_WANT_ALL) + .size(); + // If there is an extra newline at the end, it will generate an extra empty + // string. Do not count this as an extra line. + if (!string.empty() && string.back() == '\n') + --split_size; + + return split_size; +} + +} // namespace + class SingleLogSourceTest : public ::testing::Test { public: SingleLogSourceTest() @@ -28,7 +47,9 @@ InitializeTestLogDir(); } - ~SingleLogSourceTest() override {} + ~SingleLogSourceTest() override { + SingleLogSource::SetChromeStartTimeForTesting(nullptr); + } protected: // Sets up a dummy system log directory. @@ -330,4 +351,123 @@ EXPECT_EQ("Also no newline here...yet\n", latest_response()); } +TEST_F(SingleLogSourceTest, ReadRecentLinesFromMessages) { + // Write some lines to messages. Use various timestamp styles. Some lines have + // timestamps, Some do not. All timestamps are in chronological order. + const base::FilePath messages_path = base::FilePath("messages"); + // All timestamps below include time zone info. Some are EDT (-0400) and + // others are PDT (-0700). These make sure that SingleLogSource is able to + // read various standard timestamp formats. + EXPECT_TRUE( + AppendToFile(messages_path, "13 Jun 2017 15:00:00 -0400 : Alpha\n")); + EXPECT_TRUE( + AppendToFile(messages_path, "13-Jun-2017 15:30 -04:00 : Bravo\n")); + EXPECT_TRUE(AppendToFile(messages_path, "Missing timestamp #1\n")); + EXPECT_TRUE( + AppendToFile(messages_path, "2017-06-13 3:30pm -04:00 : Charlie\n")); + EXPECT_TRUE(AppendToFile(messages_path, "\n")); + EXPECT_TRUE( + AppendToFile(messages_path, "13 Jun 2017 13:30:00 -0700 : Delta\n")); + EXPECT_TRUE( + AppendToFile(messages_path, "Tue Jun 13 17:00 EDT 2017 : Echo\n")); + EXPECT_TRUE(AppendToFile(messages_path, "Missing timestamp #2\n")); + EXPECT_TRUE( + AppendToFile(messages_path, "2017-06-13T17:30:00.125-04:00 : Foxtrot\n")); + EXPECT_TRUE( + AppendToFile(messages_path, "2017-06-13 3:00:00 PM PDT : Golf\n")); + + // The timestamp of the first message in file "messages". + base::Time first_line_time; + EXPECT_TRUE( + base::Time::FromString("13 Jun 2017 15:00:00 EDT", &first_line_time)); + + // Confirm that it was correctly parsed. + base::Time::Exploded exploded; + first_line_time.UTCExplode(&exploded); + EXPECT_EQ(2017, exploded.year); + EXPECT_EQ(6, exploded.month); + EXPECT_EQ(2 /* Tue */, exploded.day_of_week); + EXPECT_EQ(13, exploded.day_of_month); + EXPECT_EQ(15 + 4 /* Convert from EDT to UTC */, exploded.hour); + EXPECT_EQ(0, exploded.minute); + EXPECT_EQ(0, exploded.second); + EXPECT_EQ(0, exploded.millisecond); + + // Provide a fake Chrome start time for testing: 15:00 EDT + base::Time chrome_start_time = first_line_time; + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + // Read from messages. The first line of messages should not have been read. + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(1, num_callback_calls()); + EXPECT_EQ(10U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time to: 15:15 EDT + chrome_start_time += base::TimeDelta::FromMinutes(15); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(2, num_callback_calls()); + EXPECT_EQ(9U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time: 15:45 EDT + chrome_start_time += base::TimeDelta::FromMinutes(30); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(3, num_callback_calls()); + EXPECT_EQ(5U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time: 17:10 EDT + chrome_start_time = first_line_time + base::TimeDelta::FromHours(2) + + base::TimeDelta::FromMinutes(10); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(4, num_callback_calls()); + EXPECT_EQ(4U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time: 17:40:00.125 EDT + chrome_start_time += + base::TimeDelta::FromMinutes(30) + base::TimeDelta::FromMilliseconds(125); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(5, num_callback_calls()); + EXPECT_EQ(2U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time: 17:40:00.126 EDT + chrome_start_time += base::TimeDelta::FromMilliseconds(1); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(6, num_callback_calls()); + EXPECT_EQ(1U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time: 18:10 EDT + chrome_start_time = first_line_time + base::TimeDelta::FromHours(3) + + base::TimeDelta::FromMinutes(10); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(7, num_callback_calls()); + EXPECT_EQ(1U, GetNumLinesInString(latest_response())) << latest_response(); + + // Update Chrome start time: 18:15 EDT + chrome_start_time += base::TimeDelta::FromMinutes(5); + SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time); + + InitializeSource(SingleLogSource::SupportedSource::kMessages); + FetchFromSource(); + EXPECT_EQ(8, num_callback_calls()); + EXPECT_EQ(0U, GetNumLinesInString(latest_response())) << latest_response(); +} + } // namespace system_logs
diff --git a/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc b/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc index 5068cb52..f6308a3d 100644 --- a/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc +++ b/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc
@@ -50,18 +50,6 @@ return; } - content::BrowserThread::PostTask( - content::BrowserThread::IO, FROM_HERE, - base::Bind(&ChromeOutOfProcessPatcher::PatchOnIOThread, this, operation, - base::Passed(&input_file), base::Passed(&patch_file), - base::Passed(&output_file))); -} - -void ChromeOutOfProcessPatcher::PatchOnIOThread(const std::string& operation, - base::File input_file, - base::File patch_file, - base::File output_file) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK(!utility_process_mojo_client_); utility_process_mojo_client_ = base::MakeUnique< @@ -86,8 +74,6 @@ } void ChromeOutOfProcessPatcher::PatchDone(int result) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - utility_process_mojo_client_.reset(); // Terminate the utility process. task_runner_->PostTask(FROM_HERE, base::Bind(callback_, result)); }
diff --git a/chrome/browser/component_updater/component_patcher_operation_out_of_process.h b/chrome/browser/component_updater/component_patcher_operation_out_of_process.h index e5ebe52..7d50058 100644 --- a/chrome/browser/component_updater/component_patcher_operation_out_of_process.h +++ b/chrome/browser/component_updater/component_patcher_operation_out_of_process.h
@@ -37,12 +37,6 @@ private: ~ChromeOutOfProcessPatcher() override; - // Perform a patch operation using chrome::mojom::FilePatcher. - void PatchOnIOThread(const std::string& operation, - base::File input_file, - base::File patch_file, - base::File output_file); - // Patch operation result handler. void PatchDone(int result);
diff --git a/chrome/browser/installable/installable_logging.cc b/chrome/browser/installable/installable_logging.cc index 00903a71..7d2f89a 100644 --- a/chrome/browser/installable/installable_logging.cc +++ b/chrome/browser/installable/installable_logging.cc
@@ -86,6 +86,8 @@ case SHOWING_NATIVE_APP_BANNER: case SHOWING_WEB_APP_BANNER: case FAILED_TO_CREATE_BANNER: + case WAITING_FOR_MANIFEST: + case WAITING_FOR_INSTALLABLE_CHECK: case MAX_ERROR_CODE: return; case RENDERER_EXITING:
diff --git a/chrome/browser/installable/installable_logging.h b/chrome/browser/installable/installable_logging.h index 24236272..94e9784 100644 --- a/chrome/browser/installable/installable_logging.h +++ b/chrome/browser/installable/installable_logging.h
@@ -47,6 +47,8 @@ URL_NOT_SUPPORTED_FOR_WEBAPK, IN_INCOGNITO, NOT_OFFLINE_CAPABLE, + WAITING_FOR_MANIFEST, + WAITING_FOR_INSTALLABLE_CHECK, MAX_ERROR_CODE, };
diff --git a/chrome/browser/installable/installable_manager.cc b/chrome/browser/installable/installable_manager.cc index a529d29..5bfa16bb 100644 --- a/chrome/browser/installable/installable_manager.cc +++ b/chrome/browser/installable/installable_manager.cc
@@ -15,7 +15,6 @@ #include "content/public/browser/manifest_icon_downloader.h" #include "content/public/browser/manifest_icon_selector.h" #include "content/public/browser/navigation_handle.h" -#include "content/public/browser/service_worker_context.h" #include "content/public/browser/storage_partition.h" #include "net/base/url_util.h" #include "third_party/WebKit/public/platform/WebDisplayMode.h" @@ -77,9 +76,16 @@ bool fetched = false; }; -struct InstallableManager::InstallableProperty { +struct InstallableManager::ValidManifestProperty { InstallableStatusCode error = NO_ERROR_DETECTED; - bool installable = false; + bool is_valid = false; + bool fetched = false; +}; + +struct InstallableManager::ServiceWorkerProperty { + InstallableStatusCode error = NO_ERROR_DETECTED; + bool has_worker = false; + bool is_waiting = false; bool fetched = false; }; @@ -101,16 +107,34 @@ InstallableManager::InstallableManager(content::WebContents* web_contents) : content::WebContentsObserver(web_contents), - manifest_(new ManifestProperty()), - installable_(new InstallableProperty()), + manifest_(base::MakeUnique<ManifestProperty>()), + valid_manifest_(base::MakeUnique<ValidManifestProperty>()), + worker_(base::MakeUnique<ServiceWorkerProperty>()), + service_worker_context_(nullptr), page_status_(InstallabilityCheckStatus::NOT_STARTED), menu_open_count_(0), menu_item_add_to_homescreen_count_(0), is_active_(false), is_pwa_check_complete_(false), - weak_factory_(this) {} + weak_factory_(this) { + // This is null in unit tests. + if (web_contents) { + content::StoragePartition* storage_partition = + content::BrowserContext::GetStoragePartition( + Profile::FromBrowserContext(web_contents->GetBrowserContext()), + web_contents->GetSiteInstance()); + DCHECK(storage_partition); -InstallableManager::~InstallableManager() = default; + service_worker_context_ = storage_partition->GetServiceWorkerContext(); + service_worker_context_->AddObserver(this); + } +} + +InstallableManager::~InstallableManager() { + // Null in unit tests. + if (service_worker_context_) + service_worker_context_->RemoveObserver(this); +} // static bool InstallableManager::IsContentSecure(content::WebContents* web_contents) { @@ -229,8 +253,12 @@ if (manifest_->error != NO_ERROR_DETECTED) return manifest_->error; - if (params.check_installable && installable_->error != NO_ERROR_DETECTED) - return installable_->error; + if (params.check_installable) { + if (valid_manifest_->error != NO_ERROR_DETECTED) + return valid_manifest_->error; + if (worker_->error != NO_ERROR_DETECTED) + return worker_->error; + } if (params.fetch_valid_primary_icon) { IconProperty& icon = icons_[ParamsForPrimaryIcon(params)]; @@ -255,13 +283,21 @@ return manifest_->error; } -InstallableStatusCode InstallableManager::installable_error() const { - return installable_->error; +InstallableStatusCode InstallableManager::valid_manifest_error() const { + return valid_manifest_->error; } -void InstallableManager::set_installable_error( +void InstallableManager::set_valid_manifest_error( InstallableStatusCode error_code) { - installable_->error = error_code; + valid_manifest_->error = error_code; +} + +InstallableStatusCode InstallableManager::worker_error() const { + return worker_->error; +} + +bool InstallableManager::worker_waiting() const { + return worker_->is_waiting; } InstallableStatusCode InstallableManager::icon_error( @@ -289,11 +325,12 @@ // a. the params did not request it, OR // b. the resource has been fetched/checked. return manifest_->fetched && - (!params.check_installable || installable_->fetched) && + (!params.check_installable || + (valid_manifest_->fetched && worker_->fetched)) && (!params.fetch_valid_primary_icon || - IsIconFetched(ParamsForPrimaryIcon(params))) && + IsIconFetched(ParamsForPrimaryIcon(params))) && (!params.fetch_valid_badge_icon || - IsIconFetched(ParamsForBadgeIcon(params))); + IsIconFetched(ParamsForBadgeIcon(params))); } void InstallableManager::Reset() { @@ -317,8 +354,9 @@ } page_status_ = InstallabilityCheckStatus::NOT_STARTED; - manifest_.reset(new ManifestProperty()); - installable_.reset(new InstallableProperty()); + manifest_ = base::MakeUnique<ManifestProperty>(); + valid_manifest_ = base::MakeUnique<ValidManifestProperty>(); + worker_ = base::MakeUnique<ServiceWorkerProperty>(); is_active_ = false; } @@ -327,7 +365,8 @@ DCHECK(!tasks_.empty()); const InstallableParams& params = tasks_[0].first; - installable_->fetched = true; + valid_manifest_->fetched = true; + worker_->fetched = true; SetIconFetched(ParamsForPrimaryIcon(params)); SetIconFetched(ParamsForBadgeIcon(params)); } @@ -381,6 +420,12 @@ if (!check_passed || IsComplete(params)) { RecordQueuedMetricsOnTaskCompletion(params, check_passed); RunCallback(task, code); + + // Sites can always register a service worker after we finish checking, so + // don't cache a missing service worker error to ensure we always check + // again. + if (worker_error() == NO_MATCHING_SERVICE_WORKER) + worker_ = base::MakeUnique<ServiceWorkerProperty>(); tasks_.erase(tasks_.begin()); StartNextTask(); return; @@ -391,8 +436,10 @@ } else if (params.fetch_valid_primary_icon && !IsIconFetched(ParamsForPrimaryIcon(params))) { CheckAndFetchBestIcon(ParamsForPrimaryIcon(params)); - } else if (params.check_installable && !installable_->fetched) { + } else if (params.check_installable && !valid_manifest_->fetched) { CheckInstallable(); + } else if (params.check_installable && !worker_->fetched) { + CheckServiceWorker(); } else if (params.fetch_valid_badge_icon && !IsIconFetched(ParamsForBadgeIcon(params))) { CheckAndFetchBestIcon(ParamsForBadgeIcon(params)); @@ -431,33 +478,29 @@ } void InstallableManager::CheckInstallable() { - DCHECK(!installable_->fetched); + DCHECK(!valid_manifest_->fetched); DCHECK(!manifest().IsEmpty()); - if (IsManifestValidForWebApp(manifest())) { - CheckServiceWorker(); - } else { - installable_->installable = false; - installable_->fetched = true; - WorkOnTask(); - } + valid_manifest_->is_valid = IsManifestValidForWebApp(manifest()); + valid_manifest_->fetched = true; + WorkOnTask(); } bool InstallableManager::IsManifestValidForWebApp( const content::Manifest& manifest) { if (manifest.IsEmpty()) { - installable_->error = MANIFEST_EMPTY; + valid_manifest_->error = MANIFEST_EMPTY; return false; } if (!manifest.start_url.is_valid()) { - installable_->error = START_URL_NOT_VALID; + valid_manifest_->error = START_URL_NOT_VALID; return false; } if ((manifest.name.is_null() || manifest.name.string().empty()) && (manifest.short_name.is_null() || manifest.short_name.string().empty())) { - installable_->error = MANIFEST_MISSING_NAME_OR_SHORT_NAME; + valid_manifest_->error = MANIFEST_MISSING_NAME_OR_SHORT_NAME; return false; } @@ -466,12 +509,12 @@ // this check moot. See https://crbug.com/604390. if (manifest.display != blink::kWebDisplayModeStandalone && manifest.display != blink::kWebDisplayModeFullscreen) { - installable_->error = MANIFEST_DISPLAY_NOT_SUPPORTED; + valid_manifest_->error = MANIFEST_DISPLAY_NOT_SUPPORTED; return false; } if (!DoesManifestContainRequiredIcon(manifest)) { - installable_->error = MANIFEST_MISSING_SUITABLE_ICON; + valid_manifest_->error = MANIFEST_MISSING_SUITABLE_ICON; return false; } @@ -479,22 +522,14 @@ } void InstallableManager::CheckServiceWorker() { - DCHECK(!installable_->fetched); + DCHECK(!worker_->fetched); DCHECK(!manifest().IsEmpty()); DCHECK(manifest().start_url.is_valid()); - content::WebContents* web_contents = GetWebContents(); - // Check to see if there is a single service worker controlling this page // and the manifest's start url. - content::StoragePartition* storage_partition = - content::BrowserContext::GetStoragePartition( - Profile::FromBrowserContext(web_contents->GetBrowserContext()), - web_contents->GetSiteInstance()); - DCHECK(storage_partition); - - storage_partition->GetServiceWorkerContext()->CheckHasServiceWorker( - web_contents->GetLastCommittedURL(), manifest().start_url, + service_worker_context_->CheckHasServiceWorker( + GetWebContents()->GetLastCommittedURL(), manifest().start_url, base::Bind(&InstallableManager::OnDidCheckHasServiceWorker, weak_factory_.GetWeakPtr())); } @@ -506,19 +541,28 @@ switch (capability) { case content::ServiceWorkerCapability::SERVICE_WORKER_WITH_FETCH_HANDLER: - installable_->installable = true; + worker_->has_worker = true; break; case content::ServiceWorkerCapability::SERVICE_WORKER_NO_FETCH_HANDLER: - installable_->installable = false; - installable_->error = NOT_OFFLINE_CAPABLE; + worker_->has_worker = false; + worker_->error = NOT_OFFLINE_CAPABLE; break; case content::ServiceWorkerCapability::NO_SERVICE_WORKER: - installable_->installable = false; - installable_->error = NO_MATCHING_SERVICE_WORKER; + InstallableParams& params = tasks_[0].first; + if (params.wait_for_worker) { + // Wait for ServiceWorkerContextObserver::OnRegistrationStored. Set the + // param |wait_for_worker| to false so we only wait once per task. + params.wait_for_worker = false; + worker_->is_waiting = true; + OnWaitingForServiceWorker(); + return; + } + worker_->has_worker = false; + worker_->error = NO_MATCHING_SERVICE_WORKER; break; } - installable_->fetched = true; + worker_->fetched = true; WorkOnTask(); } @@ -569,6 +613,22 @@ WorkOnTask(); } +void InstallableManager::OnRegistrationStored(const GURL& pattern) { + // If we aren't currently waiting, either: + // a) we've already failed the check, or + // b) we haven't yet called CheckHasServiceWorker. + // Otherwise if the scope doesn't match we keep waiting. + if (!worker_->is_waiting || !content::ServiceWorkerContext::ScopeMatches( + pattern, manifest().start_url)) { + return; + } + + // This will call CheckHasServiceWorker to check whether the service worker + // controls the start_url and if it has a fetch handler. + worker_->is_waiting = false; + WorkOnTask(); +} + void InstallableManager::DidFinishNavigation( content::NavigationHandle* handle) { if (handle->IsInMainFrame() && handle->HasCommitted() && @@ -591,5 +651,5 @@ } bool InstallableManager::is_installable() const { - return installable_->installable; + return valid_manifest_->is_valid && worker_->has_worker; }
diff --git a/chrome/browser/installable/installable_manager.h b/chrome/browser/installable/installable_manager.h index 6f920437..1a53d37b 100644 --- a/chrome/browser/installable/installable_manager.h +++ b/chrome/browser/installable/installable_manager.h
@@ -18,6 +18,7 @@ #include "chrome/browser/installable/installable_logging.h" #include "chrome/browser/installable/installable_metrics.h" #include "content/public/browser/service_worker_context.h" +#include "content/public/browser/service_worker_context_observer.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "content/public/common/manifest.h" @@ -44,11 +45,6 @@ // |fetch_valid_badge_icon| is true. int minimum_badge_icon_size_in_px = -1; - // Check whether the site is installable. That is, it has a manifest valid for - // a web app and a service worker controlling the manifest start URL and the - // current URL. - bool check_installable = false; - // Check whether there is a fetchable, non-empty icon in the manifest // conforming to the primary icon size parameters. bool fetch_valid_primary_icon = false; @@ -56,6 +52,16 @@ // Check whether there is a fetchable, non-empty icon in the manifest // conforming to the badge icon size parameters. bool fetch_valid_badge_icon = false; + + // Check whether the site is installable. That is, it has a manifest valid for + // a web app and a service worker controlling the manifest start URL and the + // current URL. + bool check_installable = false; + + // Whether or not to wait indefinitely for a service worker. If this is set to + // false, the worker status will not be cached and will be re-checked if + // GetData() is called again for the current page. + bool wait_for_worker = true; }; // This struct is passed to an InstallableCallback when the InstallableManager @@ -104,7 +110,8 @@ // This class is responsible for fetching the resources required to check and // install a site. class InstallableManager - : public content::WebContentsObserver, + : public content::ServiceWorkerContextObserver, + public content::WebContentsObserver, public content::WebContentsUserData<InstallableManager> { public: explicit InstallableManager(content::WebContents* web_contents); @@ -124,10 +131,14 @@ // when the data is ready; the synchronous execution ensures that the // references |callback| receives in its InstallableData argument are valid. // + // Clients must be prepared for |callback| to not ever be invoked. For + // instance, if installability checking is requested, this method will wait + // until the site registers a service worker (and hence not invoke |callback| + // at all if a service worker is never registered). + // // Calls requesting data that is already fetched will return the cached data. - // This method is marked virtual so clients may mock this object in tests. - virtual void GetData(const InstallableParams& params, - const InstallableCallback& callback); + void GetData(const InstallableParams& params, + const InstallableCallback& callback); // Called via AppBannerManagerAndroid to record metrics on how often the // installable check is completed when the menu or add to homescreen menu item @@ -137,18 +148,27 @@ void RecordQueuedMetricsOnTaskCompletion(const InstallableParams& params, bool check_passed); + protected: + // For mocking in tests. + virtual void OnWaitingForServiceWorker() {} + private: friend class InstallableManagerBrowserTest; friend class InstallableManagerUnitTest; FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest, ManagerBeginsInEmptyState); FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest, CheckWebapp); + FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest, + CheckLazyServiceWorkerPassesWhenWaiting); + FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest, + CheckLazyServiceWorkerNoFetchHandlerFails); using Task = std::pair<InstallableParams, InstallableCallback>; using IconParams = std::tuple<int, int, content::Manifest::Icon::IconPurpose>; struct ManifestProperty; - struct InstallableProperty; + struct ValidManifestProperty; + struct ServiceWorkerProperty; struct IconProperty; // Returns an IconParams object that queries for a primary icon conforming to @@ -171,8 +191,10 @@ // Gets/sets parts of particular properties. Exposed for testing. InstallableStatusCode manifest_error() const; - InstallableStatusCode installable_error() const; - void set_installable_error(InstallableStatusCode error_code); + InstallableStatusCode valid_manifest_error() const; + void set_valid_manifest_error(InstallableStatusCode error_code); + InstallableStatusCode worker_error() const; + bool worker_waiting() const; InstallableStatusCode icon_error(const IconParams& icon_params); GURL& icon_url(const IconParams& icon_params); const SkBitmap* icon(const IconParams& icon); @@ -209,8 +231,12 @@ void OnDidCheckHasServiceWorker(content::ServiceWorkerCapability capability); void CheckAndFetchBestIcon(const IconParams& params); - void OnIconFetched( - const GURL icon_url, const IconParams& params, const SkBitmap& bitmap); + void OnIconFetched(const GURL icon_url, + const IconParams& params, + const SkBitmap& bitmap); + + // content::ServiceWorkerContextObserver overrides + void OnRegistrationStored(const GURL& pattern) override; // content::WebContentsObserver overrides void DidFinishNavigation(content::NavigationHandle* handle) override; @@ -225,9 +251,14 @@ // Installable properties cached on this object. std::unique_ptr<ManifestProperty> manifest_; - std::unique_ptr<InstallableProperty> installable_; + std::unique_ptr<ValidManifestProperty> valid_manifest_; + std::unique_ptr<ServiceWorkerProperty> worker_; std::map<IconParams, IconProperty> icons_; + // Owned by the storage partition attached to the content::WebContents which + // this object is scoped to. + content::ServiceWorkerContext* service_worker_context_; + // Whether or not the current page is a PWA. This is reset per navigation and // is independent of the caching mechanism, i.e. if a PWA check is run // multiple times for one page, this will be set on the first check.
diff --git a/chrome/browser/installable/installable_manager_browsertest.cc b/chrome/browser/installable/installable_manager_browsertest.cc index 58cabb8..d7c9b70 100644 --- a/chrome/browser/installable/installable_manager_browsertest.cc +++ b/chrome/browser/installable/installable_manager_browsertest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/installable/installable_manager.h" #include "base/command_line.h" +#include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/ui/browser.h" @@ -12,6 +13,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "content/public/test/browser_test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" using IconPurpose = content::Manifest::Icon::IconPurpose; @@ -58,6 +60,25 @@ } // anonymous namespace +// Used only for testing pages with no service workers. This class will dispatch +// a RunLoop::QuitClosure when it begins waiting for a service worker to be +// registered. +class LazyWorkerInstallableManager : public InstallableManager { + public: + LazyWorkerInstallableManager(content::WebContents* web_contents, + base::Closure quit_closure) + : InstallableManager(web_contents), quit_closure_(quit_closure) {} + ~LazyWorkerInstallableManager() override {} + + protected: + void OnWaitingForServiceWorker() override { + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_); + }; + + private: + base::Closure quit_closure_; +}; + class CallbackTester { public: explicit CallbackTester(base::Closure quit_closure) @@ -214,7 +235,8 @@ EXPECT_FALSE(manager->is_installable()); EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); - EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); EXPECT_TRUE(manager->tasks_.empty()); } @@ -543,7 +565,8 @@ EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); - EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); EXPECT_TRUE(manager->tasks_.empty()); } @@ -579,7 +602,8 @@ EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); - EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); EXPECT_TRUE(manager->tasks_.empty()); } @@ -594,7 +618,8 @@ EXPECT_FALSE(manager->is_installable()); EXPECT_TRUE(manager->icons_.empty()); EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); - EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); EXPECT_TRUE(manager->tasks_.empty()); } } @@ -647,13 +672,15 @@ EXPECT_EQ(GetStatus(), InstallabilityCheckStatus::NOT_COMPLETED); } - // Fetch the full criteria should fail. + // Fetching the full criteria should fail if we don't wait for the worker. { base::RunLoop run_loop; std::unique_ptr<CallbackTester> tester( new CallbackTester(run_loop.QuitClosure())); - RunInstallableManager(tester.get(), GetWebAppParams()); + InstallableParams params = GetWebAppParams(); + params.wait_for_worker = false; + RunInstallableManager(tester.get(), params); run_loop.Run(); EXPECT_FALSE(tester->manifest().IsEmpty()); @@ -671,6 +698,175 @@ } IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, + CheckLazyServiceWorkerPassesWhenWaiting) { + base::RunLoop tester_run_loop, sw_run_loop; + std::unique_ptr<CallbackTester> tester( + new CallbackTester(tester_run_loop.QuitClosure())); + + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + auto manager = base::MakeUnique<LazyWorkerInstallableManager>( + web_contents, sw_run_loop.QuitClosure()); + + // Load a URL with no service worker. + GURL test_url = embedded_test_server()->GetURL( + "/banners/manifest_no_service_worker.html"); + ui_test_utils::NavigateToURL(browser(), test_url); + + // Kick off fetching the data. This should block on waiting for a worker. + manager->GetData(GetWebAppParams(), + base::Bind(&CallbackTester::OnDidFinishInstallableCheck, + base::Unretained(tester.get()))); + sw_run_loop.Run(); + + // We should now be waiting for the service worker. + EXPECT_FALSE(manager->manifest().IsEmpty()); + EXPECT_FALSE(manager->manifest_url().is_empty()); + EXPECT_FALSE(manager->is_installable()); + EXPECT_EQ(1u, manager->icons_.size()); + EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); + EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); + EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); + EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); + EXPECT_TRUE(manager->worker_waiting()); + EXPECT_FALSE(manager->tasks_.empty()); + + // Load the service worker. + EXPECT_TRUE(content::ExecuteScript( + web_contents, "navigator.serviceWorker.register('service_worker.js');")); + tester_run_loop.Run(); + + // We should have passed now. + EXPECT_FALSE(tester->manifest().IsEmpty()); + EXPECT_FALSE(tester->manifest_url().is_empty()); + EXPECT_FALSE(tester->primary_icon_url().is_empty()); + EXPECT_NE(nullptr, tester->primary_icon()); + EXPECT_TRUE(tester->is_installable()); + EXPECT_TRUE(tester->badge_icon_url().is_empty()); + EXPECT_EQ(nullptr, tester->badge_icon()); + EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); + EXPECT_EQ(manager->page_status_, + InstallabilityCheckStatus::COMPLETE_PROGRESSIVE_WEB_APP); + + // Verify internal state. + EXPECT_FALSE(manager->manifest().IsEmpty()); + EXPECT_FALSE(manager->manifest_url().is_empty()); + EXPECT_TRUE(manager->is_installable()); + EXPECT_EQ(1u, manager->icons_.size()); + EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty())); + EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams))); + EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error()); + EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error()); + EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams))); + EXPECT_FALSE(manager->worker_waiting()); + EXPECT_TRUE(manager->tasks_.empty()); +} + +IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, + CheckLazyServiceWorkerNoFetchHandlerFails) { + base::RunLoop tester_run_loop, sw_run_loop; + std::unique_ptr<CallbackTester> tester( + new CallbackTester(tester_run_loop.QuitClosure())); + + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + auto manager = base::MakeUnique<LazyWorkerInstallableManager>( + web_contents, sw_run_loop.QuitClosure()); + + // Load a URL with no service worker. + GURL test_url = embedded_test_server()->GetURL( + "/banners/manifest_no_service_worker.html"); + ui_test_utils::NavigateToURL(browser(), test_url); + + // Kick off fetching the data. This should block on waiting for a worker. + manager->GetData(GetWebAppParams(), + base::Bind(&CallbackTester::OnDidFinishInstallableCheck, + base::Unretained(tester.get()))); + sw_run_loop.Run(); + + // We should now be waiting for the service worker. + EXPECT_TRUE(manager->worker_waiting()); + EXPECT_FALSE(manager->tasks_.empty()); + + // Load the service worker with no fetch handler. + EXPECT_TRUE(content::ExecuteScript(web_contents, + "navigator.serviceWorker.register('" + "service_worker_no_fetch_handler.js');")); + tester_run_loop.Run(); + + // We should fail the check. + EXPECT_FALSE(tester->manifest().IsEmpty()); + EXPECT_FALSE(tester->manifest_url().is_empty()); + EXPECT_FALSE(tester->primary_icon_url().is_empty()); + EXPECT_NE(nullptr, tester->primary_icon()); + EXPECT_FALSE(tester->is_installable()); + EXPECT_TRUE(tester->badge_icon_url().is_empty()); + EXPECT_EQ(nullptr, tester->badge_icon()); + EXPECT_EQ(NOT_OFFLINE_CAPABLE, tester->error_code()); + EXPECT_FALSE(manager->worker_waiting()); + EXPECT_EQ(manager->page_status_, + InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP); +} + +IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, + CheckServiceWorkerErrorIsNotCached) { + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + base::RunLoop sw_run_loop; + auto manager = base::MakeUnique<LazyWorkerInstallableManager>( + web_contents, sw_run_loop.QuitClosure()); + + // Load a URL with no service worker. + GURL test_url = embedded_test_server()->GetURL( + "/banners/manifest_no_service_worker.html"); + ui_test_utils::NavigateToURL(browser(), test_url); + + { + base::RunLoop tester_run_loop; + std::unique_ptr<CallbackTester> tester( + new CallbackTester(tester_run_loop.QuitClosure())); + + InstallableParams params = GetWebAppParams(); + params.wait_for_worker = false; + manager->GetData(params, + base::Bind(&CallbackTester::OnDidFinishInstallableCheck, + base::Unretained(tester.get()))); + tester_run_loop.Run(); + + // We should have returned with an error. + EXPECT_FALSE(tester->manifest().IsEmpty()); + EXPECT_FALSE(tester->is_installable()); + EXPECT_EQ(NO_MATCHING_SERVICE_WORKER, tester->error_code()); + } + + { + base::RunLoop tester_run_loop; + std::unique_ptr<CallbackTester> tester( + new CallbackTester(tester_run_loop.QuitClosure())); + + InstallableParams params = GetWebAppParams(); + params.wait_for_worker = true; + manager->GetData(params, + base::Bind(&CallbackTester::OnDidFinishInstallableCheck, + base::Unretained(tester.get()))); + sw_run_loop.Run(); + + EXPECT_TRUE(content::ExecuteScript( + web_contents, + "navigator.serviceWorker.register('service_worker.js');")); + tester_run_loop.Run(); + + // The callback should tell us that the page is installable + EXPECT_FALSE(tester->manifest().IsEmpty()); + EXPECT_TRUE(tester->is_installable()); + EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code()); + } +} + +IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckPageWithNoServiceWorkerFetchHandler) { base::RunLoop run_loop; std::unique_ptr<CallbackTester> tester(
diff --git a/chrome/browser/installable/installable_manager_unittest.cc b/chrome/browser/installable/installable_manager_unittest.cc index deef909..eb5bfa4 100644 --- a/chrome/browser/installable/installable_manager_unittest.cc +++ b/chrome/browser/installable/installable_manager_unittest.cc
@@ -12,7 +12,8 @@ class InstallableManagerUnitTest : public testing::Test { public: - InstallableManagerUnitTest() : manager_(new InstallableManager(nullptr)) { } + InstallableManagerUnitTest() + : manager_(base::MakeUnique<InstallableManager>(nullptr)) {} protected: static base::NullableString16 ToNullableUTF16(const std::string& str) { @@ -39,12 +40,12 @@ bool IsManifestValid(const content::Manifest& manifest) { // Explicitly reset the error code before running the method. - manager_->set_installable_error(NO_ERROR_DETECTED); + manager_->set_valid_manifest_error(NO_ERROR_DETECTED); return manager_->IsManifestValidForWebApp(manifest); } InstallableStatusCode GetErrorCode() { - return manager_->installable_error(); + return manager_->valid_manifest_error(); } private:
diff --git a/chrome/browser/media/webrtc/media_stream_devices_controller.cc b/chrome/browser/media/webrtc/media_stream_devices_controller.cc index 7fd2557..ec4e8ea 100644 --- a/chrome/browser/media/webrtc/media_stream_devices_controller.cc +++ b/chrome/browser/media/webrtc/media_stream_devices_controller.cc
@@ -447,6 +447,12 @@ PermissionPromptDelegate* delegate) { content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( request.render_process_id, request.render_frame_id); + // The RFH may have been destroyed by the time the request is processed. + if (!rfh) { + callback.Run(content::MediaStreamDevices(), + content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, + std::unique_ptr<content::MediaStreamUI>()); + } content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(rfh); if (request.request_type == content::MEDIA_OPEN_DEVICE_PEPPER_ONLY) {
diff --git a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.cc b/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.cc deleted file mode 100644 index ad2231d9..0000000 --- a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.cc +++ /dev/null
@@ -1,42 +0,0 @@ -// 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 "chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h" -#include "content/public/browser/browser_thread.h" - -namespace safe_browsing { - -namespace { - -const uint8_t kKolySignature[4] = {'k', 'o', 'l', 'y'}; -constexpr size_t kSizeKolySignatureInBytes = sizeof(kKolySignature); -const size_t kSizeKolyTrailerInBytes = 512; - -} // namespace - -DiskImageTypeSnifferMac::DiskImageTypeSnifferMac() {} - -// static -bool DiskImageTypeSnifferMac::IsAppleDiskImage(const base::FilePath& dmg_file) { - DCHECK_CURRENTLY_ON(content::BrowserThread::FILE); - - base::File file(dmg_file, base::File::FLAG_OPEN | base::File::FLAG_READ); - if (!file.IsValid()) - return false; - - char data[kSizeKolySignatureInBytes]; - - if (file.Seek(base::File::FROM_END, -1 * kSizeKolyTrailerInBytes) == -1) - return false; - - if (file.ReadAtCurrentPos(data, kSizeKolySignatureInBytes) != - kSizeKolySignatureInBytes) - return false; - - return (memcmp(data, kKolySignature, kSizeKolySignatureInBytes) == 0); -} - -DiskImageTypeSnifferMac::~DiskImageTypeSnifferMac() = default; - -} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h b/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h deleted file mode 100644 index 3044482..0000000 --- a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h +++ /dev/null
@@ -1,36 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_SAFE_BROWSING_DISK_IMAGE_TYPE_SNIFFER_MAC_H_ -#define CHROME_BROWSER_SAFE_BROWSING_DISK_IMAGE_TYPE_SNIFFER_MAC_H_ - -#include "base/files/file.h" -#include "base/files/file_path.h" -#include "base/memory/ref_counted.h" - -namespace safe_browsing { - -// This class is used to determine whether a given file is a Mac archive type, -// regardless of file extension. It does so by determining whether the file has -// the 'koly' signature typical of Mac archive files. -class DiskImageTypeSnifferMac - : public base::RefCountedThreadSafe<DiskImageTypeSnifferMac> { - public: - DiskImageTypeSnifferMac(); - - // Reads trailer from file to see if it is a DMG type. Must be called on the - // FILE thread. - static bool IsAppleDiskImage(const base::FilePath& dmg_file); - - private: - friend class base::RefCountedThreadSafe<DiskImageTypeSnifferMac>; - - ~DiskImageTypeSnifferMac(); - - DISALLOW_COPY_AND_ASSIGN(DiskImageTypeSnifferMac); -}; - -} // namespace safe_browsing - -#endif // CHROME_BROWSER_SAFE_BROWSING_DISK_IMAGE_TYPE_SNIFFE_MAC_H_
diff --git a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc b/chrome/browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc deleted file mode 100644 index 13f5a89c..0000000 --- a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc +++ /dev/null
@@ -1,106 +0,0 @@ -// 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 "chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h" - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/path_service.h" -#include "base/strings/string_number_conversions.h" -#include "chrome/common/chrome_paths.h" -#include "content/public/test/test_browser_thread_bundle.h" -#include "content/public/test/test_utils.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace safe_browsing { -namespace { - -struct ArchiveTestCase { - // The disk image file to open. - const char* file_name; - - // Expectation regarding the file being recognized as a DMG. As the UDIFParser - // class currently only supports certain UDIF features, this is used to - // properly test expectations. - bool expected_results; -}; - -std::ostream& operator<<(std::ostream& os, const ArchiveTestCase& test_case) { - os << test_case.file_name; - return os; -} - -class DiskImageTypeSnifferMacTest - : public testing::TestWithParam<ArchiveTestCase> { - protected: - base::FilePath GetFilePath(const char* file_name) { - base::FilePath test_data; - EXPECT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &test_data)); - return test_data.AppendASCII("chrome") - .AppendASCII("safe_browsing_dmg") - .AppendASCII(file_name); - } - - private: - content::TestBrowserThreadBundle thread_bundle_; -}; - -TEST_P(DiskImageTypeSnifferMacTest, SniffDiskImage) { - const ArchiveTestCase& test_case = GetParam(); - DVLOG(1) << "Test case: " << test_case; - - base::FilePath path; - ASSERT_NO_FATAL_FAILURE(path = GetFilePath(test_case.file_name)); - - ASSERT_EQ(test_case.expected_results, - DiskImageTypeSnifferMac::IsAppleDiskImage(path)); -} - -const ArchiveTestCase cases[] = { - {"dmg_UDBZ_GPTSPUD.dmg", true}, - {"dmg_UDBZ_NONE.dmg", true}, - {"dmg_UDBZ_SPUD.dmg", true}, - {"dmg_UDCO_GPTSPUD.dmg", true}, - {"dmg_UDCO_NONE.dmg", true}, - {"dmg_UDCO_SPUD.dmg", true}, - {"dmg_UDRO_GPTSPUD.dmg", true}, - {"dmg_UDRO_NONE.dmg", true}, - {"dmg_UDRO_SPUD.dmg", true}, - // UDRW not supported. - {"dmg_UDRW_GPTSPUD.dmg", false}, - // UDRW not supported. - {"dmg_UDRW_NONE.dmg", false}, - // UDRW not supported. - {"dmg_UDRW_SPUD.dmg", false}, - // Sparse images not supported. - {"dmg_UDSP_GPTSPUD.sparseimage", false}, - // UDRW not supported. - {"dmg_UDSP_NONE.sparseimage", false}, - // Sparse images not supported. - {"dmg_UDSP_SPUD.sparseimage", false}, - // CD/DVD format not supported. - {"dmg_UDTO_GPTSPUD.cdr", false}, - // CD/DVD format not supported. - {"dmg_UDTO_NONE.cdr", false}, - // CD/DVD format not supported. - {"dmg_UDTO_SPUD.cdr", false}, - {"dmg_UDZO_GPTSPUD.dmg", true}, - {"dmg_UDZO_SPUD.dmg", true}, - {"dmg_UFBI_GPTSPUD.dmg", true}, - {"dmg_UFBI_SPUD.dmg", true}, - {"mach_o_in_dmg.dmg", true}, - // Absence of 'koly' signature will cause parsing to fail - even if file has - // .dmg extension. - {"mach_o_in_dmg_no_koly_signature.dmg", false}, - // Type sniffer should realize DMG type even without extension. - {"mach_o_in_dmg.txt", true} - -}; - -INSTANTIATE_TEST_CASE_P(DiskImageTypeSnifferMacTestInstantiation, - DiskImageTypeSnifferMacTest, - testing::ValuesIn(cases)); - -} // namespace -} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc index 501f22d..aad28a88 100644 --- a/chrome/browser/safe_browsing/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -74,7 +74,6 @@ #include "net/url_request/url_request_status.h" #if defined(OS_MACOSX) -#include "chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h" #include "chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.h" #endif @@ -472,19 +471,7 @@ StartExtractDmgFeatures(); #endif } else { -#if defined(OS_MACOSX) - // Checks for existence of "koly" signature even if file doesn't have - // archive-type extension, then calls ExtractFileOrDmgFeatures() with - // result. - BrowserThread::PostTaskAndReplyWithResult( - BrowserThread::FILE, FROM_HERE, - base::Bind(DiskImageTypeSnifferMac::IsAppleDiskImage, - item_->GetTargetFilePath()), - base::Bind(&CheckClientDownloadRequest::ExtractFileOrDmgFeatures, - this)); -#else StartExtractFileFeatures(); -#endif } } @@ -792,23 +779,6 @@ dmg_analysis_start_time_ = base::TimeTicks::Now(); } - // Extracts DMG features if file has 'koly' signature, otherwise extracts - // regular file features. - void ExtractFileOrDmgFeatures(bool download_file_has_koly_signature) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - UMA_HISTOGRAM_BOOLEAN( - "SBClientDownload." - "DownloadFileWithoutDiskImageExtensionHasKolySignature", - download_file_has_koly_signature); - // Returns if DownloadItem was destroyed during parsing of file metadata. - if (item_ == nullptr) - return; - if (download_file_has_koly_signature) - StartExtractDmgFeatures(); - else - StartExtractFileFeatures(); - } - void OnDmgAnalysisFinished(const ArchiveAnalyzerResults& results) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_EQ(ClientDownloadRequest::MAC_EXECUTABLE, type_);
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc index e46582e..eee25760 100644 --- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -33,7 +33,6 @@ #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.h" #include "chrome/browser/safe_browsing/local_database_manager.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" -#include "chrome/common/chrome_paths.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" #include "chrome/common/safe_browsing/file_type_policies_test_util.h" #include "chrome/test/base/testing_profile.h" @@ -1444,76 +1443,6 @@ CheckClientDownloadReportCorruptDmg) { CheckClientDownloadReportCorruptArchive(DMG); } - -// Test that downloaded files with no disk image extension that have a 'koly' -// trailer are treated as disk images and processed accordingly. -TEST_F(DownloadProtectionServiceTest, - CheckClientDownloadReportDmgWithoutExtension) { - net::FakeURLFetcherFactory factory(NULL); - PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK, - net::URLRequestStatus::SUCCESS); - - base::FilePath test_data; - EXPECT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &test_data)); - test_data = test_data.AppendASCII("chrome") - .AppendASCII("safe_browsing_dmg") - .AppendASCII("mach_o_in_dmg.txt"); - - NiceMockDownloadItem item; - PrepareBasicDownloadItemWithFullPaths( - &item, {"http://www.evil.com/a.dmg"}, // url_chain - "http://www.google.com/", // referrer - test_data, // tmp_path - temp_dir_.GetPath().Append(FILE_PATH_LITERAL("a.dmg"))); // final_path - - RunLoop run_loop; - download_service_->CheckClientDownload( - &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, - base::Unretained(this), run_loop.QuitClosure())); - run_loop.Run(); - - ASSERT_TRUE(HasClientDownloadRequest()); - EXPECT_TRUE(GetClientDownloadRequest()->archive_valid()); - ClearClientDownloadRequest(); - - Mock::VerifyAndClearExpectations(sb_service_.get()); - Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); -} - -// Demonstrate that a .dmg file whose a) extension has been changed to .txt and -// b) 'koly' signature has been removed is not processed as a disk image. -TEST_F(DownloadProtectionServiceTest, CheckClientDownloadReportDmgWithoutKoly) { - net::FakeURLFetcherFactory factory(NULL); - PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK, - net::URLRequestStatus::SUCCESS); - - base::FilePath test_data; - EXPECT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &test_data)); - test_data = test_data.AppendASCII("chrome") - .AppendASCII("safe_browsing_dmg") - .AppendASCII("mach_o_in_dmg_no_koly_signature.txt"); - - NiceMockDownloadItem item; - PrepareBasicDownloadItemWithFullPaths( - &item, {"http://www.evil.com/a.dmg"}, // url_chain - "http://www.google.com/", // referrer - test_data, // tmp_path - temp_dir_.GetPath().Append(FILE_PATH_LITERAL("a.dmg"))); // final_path - - RunLoop run_loop; - download_service_->CheckClientDownload( - &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback, - base::Unretained(this), run_loop.QuitClosure())); - run_loop.Run(); - - ASSERT_TRUE(HasClientDownloadRequest()); - EXPECT_FALSE(GetClientDownloadRequest()->archive_valid()); - ClearClientDownloadRequest(); - - Mock::VerifyAndClearExpectations(sb_service_.get()); - Mock::VerifyAndClearExpectations(binary_feature_extractor_.get()); -} - #endif TEST_F(DownloadProtectionServiceTest, CheckClientDownloadValidateRequest) { @@ -1927,25 +1856,10 @@ EXPECT_CALL(*sb_service_->mock_database_manager(), MatchDownloadWhitelistUrl(_)) .WillRepeatedly(Return(false)); - -#if defined(OS_MACOSX) - // Expects that MockDownloadItem will go out of scope while asynchronous - // processing is parsing file metadata, and thus ExtractFileOrDmgFeatures() - // will return rather than continuing to process the download. - EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)) - .Times(0); - EXPECT_CALL(*binary_feature_extractor_.get(), - ExtractImageFeatures( - tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)) - .Times(0); -#else - // Expects synchronous processing that continues to extract features from - // download even after MockDownloadItem goes out of scope. EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _)); EXPECT_CALL(*binary_feature_extractor_.get(), ExtractImageFeatures( tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _)); -#endif download_service_->CheckClientDownload( &item,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 182c97c..41e6fa7 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4263,7 +4263,6 @@ "../browser/safe_browsing/client_side_detection_host_unittest.cc", "../browser/safe_browsing/client_side_detection_service_unittest.cc", "../browser/safe_browsing/client_side_model_loader_unittest.cc", - "../browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc", "../browser/safe_browsing/download_feedback_service_unittest.cc", "../browser/safe_browsing/download_feedback_unittest.cc", "../browser/safe_browsing/download_protection_service_unittest.cc", @@ -4949,9 +4948,6 @@ "$_output_dir/hfs_plus.img", "$_output_dir/hfsx_case_sensitive.img", "$_output_dir/mach_o_in_dmg.dmg", - "$_output_dir/mach_o_in_dmg.txt", - "$_output_dir/mach_o_in_dmg_no_koly_signature.dmg", - "$_output_dir/mach_o_in_dmg_no_koly_signature.txt", ] args = [ rebase_path(shell_script, root_out_dir),
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java index 94e6f21..6457715 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
@@ -16,6 +16,7 @@ import org.chromium.chrome.test.ChromeInstrumentationTestRunner.ChromeDisableIfSkipCheck; import org.chromium.chrome.test.ChromeInstrumentationTestRunner.ChromeRestrictionSkipCheck; import org.chromium.content.browser.test.ChildProcessAllocatorSettingsHook; +import org.chromium.policy.test.annotations.Policies; import java.util.List; @@ -40,7 +41,7 @@ private static List<PreTestHook> defaultPreTestHooks() { return CollectionUtil.newArrayList(CommandLineFlags.getRegistrationHook(), - new ChildProcessAllocatorSettingsHook()); + new ChildProcessAllocatorSettingsHook(), Policies.getRegistrationHook()); } }
diff --git a/chrome/test/data/safe_browsing/dmg/generate_test_data.sh b/chrome/test/data/safe_browsing/dmg/generate_test_data.sh index cbb266fa..a1a6b655 100755 --- a/chrome/test/data/safe_browsing/dmg/generate_test_data.sh +++ b/chrome/test/data/safe_browsing/dmg/generate_test_data.sh
@@ -84,23 +84,6 @@ "${OUT_DIR}/mach_o_in_dmg" rm -rf "${DMG_SOURCE}" - - # Copy of Mach-O DMG with 'koly' signature overwritten ####################### - cp "${OUT_DIR}/mach_o_in_dmg.dmg" \ - "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg" - # Gets size of Mach-O DMG copy. - SIZE=`stat -f%z "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg"` - # Overwrites 'koly' with '????'. - printf '\xa1\xa1\xa1\xa1' | dd conv=notrunc \ - of="${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg" \ - bs=1 seek=$(($SIZE - 512)) - - # Copy of Mach-O DMG with extension changed to .txt. - cp "${OUT_DIR}/mach_o_in_dmg.dmg" "${OUT_DIR}/mach_o_in_dmg.txt" - - # Copy of Mach-O DMG with extension changed to .txt and no 'koly' signature ## - cp "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg" \ - "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.txt" } # Silence any stdout, but keep stderr.
diff --git a/components/history/core/browser/top_sites_impl.cc b/components/history/core/browser/top_sites_impl.cc index 53171ff..9908ad0 100644 --- a/components/history/core/browser/top_sites_impl.cc +++ b/components/history/core/browser/top_sites_impl.cc
@@ -136,38 +136,25 @@ bool TopSitesImpl::SetPageThumbnail(const GURL& url, const gfx::Image& thumbnail, const ThumbnailScore& score) { - DCHECK(thread_checker_.CalledOnValidThread()); + ThumbnailEvent result = SetPageThumbnailImpl(url, thumbnail, score); - if (!loaded_) { - // TODO(sky): I need to cache these and apply them after the load - // completes. - return false; + UMA_HISTOGRAM_ENUMERATION("Thumbnails.AddedToTopSites", result, + THUMBNAIL_EVENT_COUNT); + + switch (result) { + case THUMBNAIL_FAILURE: + case THUMBNAIL_TOPSITES_FULL: + case THUMBNAIL_KEPT_EXISTING: + return false; + case THUMBNAIL_ADDED_TEMP: + case THUMBNAIL_ADDED_REGULAR: + return true; + case THUMBNAIL_PROMOTED_TEMP_TO_REGULAR: + case THUMBNAIL_EVENT_COUNT: + NOTREACHED(); } - bool add_temp_thumbnail = false; - if (!IsKnownURL(url)) { - if (IsNonForcedFull()) - return false; // We're full, and this URL is not known to us. - - add_temp_thumbnail = true; - } - - if (!can_add_url_to_history_.Run(url)) - return false; // It's not a real webpage. - - scoped_refptr<base::RefCountedBytes> thumbnail_data; - if (!EncodeBitmap(thumbnail, &thumbnail_data)) - return false; - - if (add_temp_thumbnail) { - // Always remove the existing entry and then add it back. That way if we end - // up with too many temp thumbnails we'll prune the oldest first. - RemoveTemporaryThumbnailByURL(url); - AddTemporaryThumbnail(url, thumbnail_data.get(), score); - return true; - } - - return SetPageThumbnailEncoded(url, thumbnail_data.get(), score); + return false; } // WARNING: this function may be invoked on any thread. @@ -489,11 +476,51 @@ } } -bool TopSitesImpl::SetPageThumbnailNoDB( +TopSitesImpl::ThumbnailEvent TopSitesImpl::SetPageThumbnailImpl( + const GURL& url, + const gfx::Image& thumbnail, + const ThumbnailScore& score) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (!loaded_) { + // TODO(sky): I need to cache these and apply them after the load + // completes. + return THUMBNAIL_FAILURE; + } + + bool add_temp_thumbnail = false; + if (!IsKnownURL(url)) { + if (IsNonForcedFull()) { + // We're full, and this URL is not known to us. + return THUMBNAIL_TOPSITES_FULL; + } + + add_temp_thumbnail = true; + } + + if (!can_add_url_to_history_.Run(url)) + return THUMBNAIL_FAILURE; // It's not a real webpage. + + scoped_refptr<base::RefCountedBytes> thumbnail_data; + if (!EncodeBitmap(thumbnail, &thumbnail_data)) + return THUMBNAIL_FAILURE; + + if (add_temp_thumbnail) { + // Always remove the existing entry and then add it back. That way if we end + // up with too many temp thumbnails we'll prune the oldest first. + RemoveTemporaryThumbnailByURL(url); + AddTemporaryThumbnail(url, thumbnail_data.get(), score); + return THUMBNAIL_ADDED_TEMP; + } + + bool success = SetPageThumbnailEncoded(url, thumbnail_data.get(), score); + return success ? THUMBNAIL_ADDED_REGULAR : THUMBNAIL_KEPT_EXISTING; +} + +bool TopSitesImpl::SetPageThumbnailInCache( const GURL& url, const base::RefCountedMemory* thumbnail_data, const ThumbnailScore& score) { - // This should only be invoked when we know about the url. DCHECK(cache_->IsKnownURL(url)); const MostVisitedURL& most_visited = @@ -524,13 +551,12 @@ const GURL& url, const base::RefCountedMemory* thumbnail, const ThumbnailScore& score) { - if (!SetPageThumbnailNoDB(url, thumbnail, score)) + DCHECK(cache_->IsKnownURL(url)); + + if (!SetPageThumbnailInCache(url, thumbnail, score)) return false; // Update the database. - if (!cache_->IsKnownURL(url)) - return false; - size_t index = cache_->GetURLIndex(url); int url_rank = index - cache_->GetNumForcedURLs(); const MostVisitedURL& most_visited = cache_->top_sites()[index]; @@ -743,8 +769,14 @@ for (TempImages::iterator it = temp_images_.begin(); it != temp_images_.end(); ++it) { if (canonical_url == cache_->GetCanonicalURL(it->first)) { - SetPageThumbnailEncoded( + // We can't have a non-temp thumbnail yet, so this should always + // successfully set the thumbnail. + bool success = SetPageThumbnailEncoded( mv.url, it->second.thumbnail.get(), it->second.thumbnail_score); + DCHECK(success); + UMA_HISTOGRAM_ENUMERATION("Thumbnails.AddedToTopSites", + THUMBNAIL_PROMOTED_TEMP_TO_REGULAR, + THUMBNAIL_EVENT_COUNT); temp_images_.erase(it); break; }
diff --git a/components/history/core/browser/top_sites_impl.h b/components/history/core/browser/top_sites_impl.h index 3024d448..98bc72f 100644 --- a/components/history/core/browser/top_sites_impl.h +++ b/components/history/core/browser/top_sites_impl.h
@@ -119,6 +119,21 @@ CALL_LOCATION_FROM_OTHER_PLACES, }; + // An enum representing various outcomes of adding a page thumbnail, for use + // in UMA histograms. Most of these are recorded from SetPageThumbnail, + // except for PROMOTED_TEMP_TO_REGULAR which can happen during SetTopSites. + // Do not change existing entries, and only add new ones at the end! + enum ThumbnailEvent { + THUMBNAIL_FAILURE = 0, + THUMBNAIL_TOPSITES_FULL = 1, + THUMBNAIL_KEPT_EXISTING = 2, + THUMBNAIL_ADDED_TEMP = 3, + THUMBNAIL_ADDED_REGULAR = 4, + THUMBNAIL_PROMOTED_TEMP_TO_REGULAR = 5, + // Add new entries here. + THUMBNAIL_EVENT_COUNT = 6 + }; + friend class TopSitesImplTest; FRIEND_TEST_ALL_PREFIXES(TopSitesImplTest, DiffMostVisited); FRIEND_TEST_ALL_PREFIXES(TopSitesImplTest, DiffMostVisitedWithForced); @@ -146,14 +161,22 @@ const MostVisitedURLList& new_list, TopSitesDelta* delta); - // Sets the thumbnail without writing to the database. - // Returns true if the thumbnail was set, false if the existing one is better. - bool SetPageThumbnailNoDB(const GURL& url, - const base::RefCountedMemory* thumbnail_data, - const ThumbnailScore& score); + // The actual implementation of SetPageThumbnail. It returns a more detailed + // status code (for UMA) rather than just a bool. + ThumbnailEvent SetPageThumbnailImpl(const GURL& url, + const gfx::Image& thumbnail, + const ThumbnailScore& score); - // A version of SetPageThumbnail that takes RefCountedBytes as - // returned by HistoryService. + // Sets the thumbnail without writing to the database, i.e. updates the cache + // only. Must only be called for known URLs. Returns true if the thumbnail was + // set, false if the existing one (if any) is better. + bool SetPageThumbnailInCache(const GURL& url, + const base::RefCountedMemory* thumbnail_data, + const ThumbnailScore& score); + + // The major part of SetPageThumbnail, which sets the thumbnail both in the + // cache and in the database. Must only be called for known URLs. Returns true + // if the thumbnail was set, false if the existing one (if any) is better. bool SetPageThumbnailEncoded(const GURL& url, const base::RefCountedMemory* thumbnail, const ThumbnailScore& score);
diff --git a/components/safe_json/safe_json_parser_impl.cc b/components/safe_json/safe_json_parser_impl.cc index 8f0ea48..9694dad8 100644 --- a/components/safe_json/safe_json_parser_impl.cc +++ b/components/safe_json/safe_json_parser_impl.cc
@@ -19,23 +19,12 @@ const ErrorCallback& error_callback) : unsafe_json_(unsafe_json), success_callback_(success_callback), - error_callback_(error_callback) { - io_thread_checker_.DetachFromThread(); -} + error_callback_(error_callback) {} SafeJsonParserImpl::~SafeJsonParserImpl() = default; void SafeJsonParserImpl::Start() { - caller_task_runner_ = base::SequencedTaskRunnerHandle::Get(); - - content::BrowserThread::PostTask( - content::BrowserThread::IO, FROM_HERE, - base::Bind(&SafeJsonParserImpl::StartOnIOThread, base::Unretained(this))); -} - -void SafeJsonParserImpl::StartOnIOThread() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(io_thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); mojo_json_parser_.reset( new content::UtilityProcessMojoClient<mojom::SafeJsonParser>( l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_JSON_PARSER_NAME))); @@ -50,34 +39,27 @@ } void SafeJsonParserImpl::OnConnectionError() { - DCHECK(io_thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Shut down the utility process. mojo_json_parser_.reset(); - caller_task_runner_->PostTask( - FROM_HERE, - base::Bind(&SafeJsonParserImpl::ReportResults, base::Unretained(this), - nullptr, "Connection error with the json parser process.")); + ReportResults(nullptr, "Connection error with the json parser process."); } void SafeJsonParserImpl::OnParseDone(std::unique_ptr<base::Value> result, const base::Optional<std::string>& error) { - DCHECK(io_thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Shut down the utility process. mojo_json_parser_.reset(); - // Call ReportResults() on caller's thread. - caller_task_runner_->PostTask( - FROM_HERE, - base::Bind(&SafeJsonParserImpl::ReportResults, base::Unretained(this), - base::Passed(&result), error.value_or(""))); + ReportResults(std::move(result), error.value_or("")); } void SafeJsonParserImpl::ReportResults(std::unique_ptr<base::Value> parsed_json, const std::string& error) { - DCHECK(caller_task_runner_->RunsTasksOnCurrentThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (error.empty() && parsed_json) { if (!success_callback_.is_null()) success_callback_.Run(std::move(parsed_json));
diff --git a/components/safe_json/safe_json_parser_impl.h b/components/safe_json/safe_json_parser_impl.h index 03ac995..54da8dc 100644 --- a/components/safe_json/safe_json_parser_impl.h +++ b/components/safe_json/safe_json_parser_impl.h
@@ -17,7 +17,6 @@ #include "content/public/browser/utility_process_mojo_client.h" namespace base { -class SequencedTaskRunner; class Value; } @@ -50,16 +49,11 @@ const std::string unsafe_json_; SuccessCallback success_callback_; ErrorCallback error_callback_; - scoped_refptr<base::SequencedTaskRunner> caller_task_runner_; std::unique_ptr<content::UtilityProcessMojoClient<mojom::SafeJsonParser>> mojo_json_parser_; - // Used instead of DCHECK_CURRENTLY_ON(BrowserThread::IO) because it's - // posssible that it fails when the IO thread message loop is shutting down. - // This happens after the IO thread has unregistered from the BrowserThread - // list. - base::ThreadChecker io_thread_checker_; + SEQUENCE_CHECKER(sequence_checker_); DISALLOW_COPY_AND_ASSIGN(SafeJsonParserImpl); };
diff --git a/components/translate/core/browser/BUILD.gn b/components/translate/core/browser/BUILD.gn index 6f6721e7..4564ee8 100644 --- a/components/translate/core/browser/BUILD.gn +++ b/components/translate/core/browser/BUILD.gn
@@ -102,6 +102,7 @@ "mock_translate_ranker.h", "ranker_model_loader_unittest.cc", "ranker_model_unittest.cc", + "translate_accept_languages_unittest.cc", "translate_browser_metrics_unittest.cc", "translate_language_list_unittest.cc", "translate_manager_unittest.cc",
diff --git a/components/translate/core/browser/translate_accept_languages_unittest.cc b/components/translate/core/browser/translate_accept_languages_unittest.cc new file mode 100644 index 0000000..c3055c47 --- /dev/null +++ b/components/translate/core/browser/translate_accept_languages_unittest.cc
@@ -0,0 +1,66 @@ +// 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 "components/translate/core/browser/translate_accept_languages.h" + +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "components/translate/core/browser/translate_download_manager.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace translate { +namespace { + +TEST(TranslateAcceptLanguagesTest, TestIsAcceptLanguage) { + const char* const pref_setting = "translate-accept-languages"; + TestingPrefServiceSimple prefs; + prefs.registry()->RegisterStringPref(pref_setting, "en-US,es,zh-CN"); + TranslateAcceptLanguages accept_languages(&prefs, pref_setting); + + // All valid. + EXPECT_TRUE(accept_languages.IsAcceptLanguage("en")); + EXPECT_TRUE(accept_languages.IsAcceptLanguage("en-US")); + EXPECT_TRUE(accept_languages.IsAcceptLanguage("es")); + EXPECT_TRUE(accept_languages.IsAcceptLanguage("zh-CN")); + + // Not valid language. + EXPECT_FALSE(accept_languages.IsAcceptLanguage("xx")); + + // zh-XX cannot be shortened to zh. + EXPECT_FALSE(accept_languages.IsAcceptLanguage("zh")); +} + +// RAII class to set the TranslateDownloadManager application locale, and then +// restore it to the original value when the object goes out of scope. +class TranslateLocaleRestorer { + public: + explicit TranslateLocaleRestorer(const std::string& new_locale) + : existing_locale_( + TranslateDownloadManager::GetInstance()->application_locale()) { + TranslateDownloadManager::GetInstance()->set_application_locale(new_locale); + } + ~TranslateLocaleRestorer() { + TranslateDownloadManager::GetInstance()->set_application_locale( + existing_locale_); + } + + private: + const std::string existing_locale_; +}; + +TEST(TranslateAcceptLanguagesTest, TestCanBeAcceptLanguage) { + TranslateLocaleRestorer locale_restorer("es"); + + // Valid accept languages. + EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("en")); + EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("en-US")); + EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("es")); + EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("zh-CN")); + + // Not valid language. + EXPECT_FALSE(TranslateAcceptLanguages::CanBeAcceptLanguage("xx")); +} + +} // namespace +} // namespace translate
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 76c3837a..1c89c14 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -342,10 +342,10 @@ "appcache/appcache_storage.h", "appcache/appcache_storage_impl.cc", "appcache/appcache_storage_impl.h", + "appcache/appcache_subresource_url_factory.cc", + "appcache/appcache_subresource_url_factory.h", "appcache/appcache_update_job.cc", "appcache/appcache_update_job.h", - "appcache/appcache_url_loader_factory.cc", - "appcache/appcache_url_loader_factory.h", "appcache/appcache_url_loader_job.cc", "appcache/appcache_url_loader_job.h", "appcache/appcache_url_loader_request.cc", @@ -936,6 +936,7 @@ "loader/upload_progress_tracker.h", "loader/url_loader_factory_impl.cc", "loader/url_loader_factory_impl.h", + "loader/url_loader_request_handler.cc", "loader/url_loader_request_handler.h", "loader/wake_lock_resource_throttle.cc", "loader/wake_lock_resource_throttle.h",
diff --git a/content/browser/appcache/appcache_request_handler.cc b/content/browser/appcache/appcache_request_handler.cc index 1e2fe1b..dc0070c 100644 --- a/content/browser/appcache/appcache_request_handler.cc +++ b/content/browser/appcache/appcache_request_handler.cc
@@ -13,7 +13,7 @@ #include "content/browser/appcache/appcache_navigation_handle_core.h" #include "content/browser/appcache/appcache_policy.h" #include "content/browser/appcache/appcache_request.h" -#include "content/browser/appcache/appcache_url_loader_factory.h" +#include "content/browser/appcache/appcache_subresource_url_factory.h" #include "content/browser/appcache/appcache_url_loader_job.h" #include "content/browser/appcache/appcache_url_loader_request.h" #include "content/browser/appcache/appcache_url_request_job.h" @@ -232,11 +232,13 @@ std::unique_ptr<AppCacheRequestHandler> AppCacheRequestHandler::InitializeForNavigationNetworkService( const ResourceRequest& request, - AppCacheNavigationHandleCore* appcache_handle_core) { + AppCacheNavigationHandleCore* appcache_handle_core, + URLLoaderFactoryGetter* url_loader_factory_getter) { std::unique_ptr<AppCacheRequestHandler> handler = appcache_handle_core->host()->CreateRequestHandler( AppCacheURLLoaderRequest::Create(request), request.resource_type, request.should_reset_appcache); + handler->set_network_url_loader_factory_getter(url_loader_factory_getter); return handler; } @@ -545,4 +547,10 @@ std::move(callback)); } +mojom::URLLoaderFactoryPtr +AppCacheRequestHandler::MaybeCreateSubresourceFactory() { + return AppCacheSubresourceURLFactory::CreateURLLoaderFactory( + network_url_loader_factory_getter_.get()); +} + } // namespace content
diff --git a/content/browser/appcache/appcache_request_handler.h b/content/browser/appcache/appcache_request_handler.h index b0ed05f..9fa3939 100644 --- a/content/browser/appcache/appcache_request_handler.h +++ b/content/browser/appcache/appcache_request_handler.h
@@ -17,6 +17,7 @@ #include "content/browser/appcache/appcache_host.h" #include "content/browser/appcache/appcache_service_impl.h" #include "content/browser/loader/url_loader_request_handler.h" +#include "content/browser/url_loader_factory_getter.h" #include "content/common/content_export.h" #include "content/public/common/resource_type.h" @@ -76,7 +77,8 @@ static std::unique_ptr<AppCacheRequestHandler> InitializeForNavigationNetworkService( const ResourceRequest& request, - AppCacheNavigationHandleCore* appcache_handle_core); + AppCacheNavigationHandleCore* appcache_handle_core, + URLLoaderFactoryGetter* url_loader_factory_getter); private: friend class AppCacheHost; @@ -148,6 +150,12 @@ void MaybeCreateLoader(const ResourceRequest& resource_request, ResourceContext* resource_context, LoaderCallback callback) override; + mojom::URLLoaderFactoryPtr MaybeCreateSubresourceFactory() override; + + void set_network_url_loader_factory_getter( + URLLoaderFactoryGetter* url_loader_factory_getter) { + network_url_loader_factory_getter_ = url_loader_factory_getter; + } // Data members ----------------------------------------------- @@ -216,7 +224,12 @@ // the AppCache, we delete the job. std::unique_ptr<AppCacheJob> navigation_request_job_; + // In the network service world, points to the getter for the network URL + // loader. + scoped_refptr<URLLoaderFactoryGetter> network_url_loader_factory_getter_; + friend class content::AppCacheRequestHandlerTest; + DISALLOW_COPY_AND_ASSIGN(AppCacheRequestHandler); };
diff --git a/content/browser/appcache/appcache_subresource_url_factory.cc b/content/browser/appcache/appcache_subresource_url_factory.cc new file mode 100644 index 0000000..d90257f3 --- /dev/null +++ b/content/browser/appcache/appcache_subresource_url_factory.cc
@@ -0,0 +1,78 @@ +// 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/appcache/appcache_subresource_url_factory.h" + +#include "base/bind.h" +#include "base/logging.h" +#include "content/browser/appcache/appcache_request_handler.h" +#include "content/browser/appcache/appcache_url_loader_job.h" +#include "content/browser/appcache/appcache_url_loader_request.h" +#include "content/browser/url_loader_factory_getter.h" +#include "content/common/resource_request.h" +#include "content/common/url_loader_factory.mojom.h" +#include "content/public/browser/browser_thread.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/interface_ptr.h" +#include "net/traffic_annotation/network_traffic_annotation.h" + +namespace content { + +// Implements the URLLoaderFactory mojom for AppCache requests. +AppCacheSubresourceURLFactory::AppCacheSubresourceURLFactory( + mojom::URLLoaderFactoryRequest request, + URLLoaderFactoryGetter* default_url_loader_factory_getter) + : binding_(this, std::move(request)), + default_url_loader_factory_getter_(default_url_loader_factory_getter) { + binding_.set_connection_error_handler( + base::Bind(&AppCacheSubresourceURLFactory::OnConnectionError, + base::Unretained(this))); +} + +AppCacheSubresourceURLFactory::~AppCacheSubresourceURLFactory() {} + +// static +mojom::URLLoaderFactoryPtr +AppCacheSubresourceURLFactory::CreateURLLoaderFactory( + URLLoaderFactoryGetter* default_url_loader_factory_getter) { + mojom::URLLoaderFactoryPtr loader_factory; + mojom::URLLoaderFactoryRequest request = mojo::MakeRequest(&loader_factory); + + // This instance will get deleted when the client drops the connection. + // Please see OnConnectionError() for details. + new AppCacheSubresourceURLFactory(std::move(request), + default_url_loader_factory_getter); + return loader_factory; +} + +void AppCacheSubresourceURLFactory::CreateLoaderAndStart( + mojom::URLLoaderAssociatedRequest url_loader_request, + int32_t routing_id, + int32_t request_id, + uint32_t options, + const ResourceRequest& request, + mojom::URLLoaderClientPtr client, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DLOG(WARNING) << "Received request for loading : " << request.url.spec(); + default_url_loader_factory_getter_->GetNetworkFactory() + ->get() + ->CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest(), routing_id, + request_id, options, request, std::move(client), + traffic_annotation); +} + +void AppCacheSubresourceURLFactory::SyncLoad(int32_t routing_id, + int32_t request_id, + const ResourceRequest& request, + SyncLoadCallback callback) { + NOTREACHED(); +} + +void AppCacheSubresourceURLFactory::OnConnectionError() { + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); +} + +} // namespace content \ No newline at end of file
diff --git a/content/browser/appcache/appcache_url_loader_factory.h b/content/browser/appcache/appcache_subresource_url_factory.h similarity index 73% rename from content/browser/appcache/appcache_url_loader_factory.h rename to content/browser/appcache/appcache_subresource_url_factory.h index 6b1eacb..f55afc47 100644 --- a/content/browser/appcache/appcache_url_loader_factory.h +++ b/content/browser/appcache/appcache_subresource_url_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_APPCACHE_APPCACHE_URL_LOADER_FACTORY_H_ -#define CONTENT_BROWSER_APPCACHE_APPCACHE_URL_LOADER_FACTORY_H_ +#ifndef CONTENT_BROWSER_APPCACHE_APPCACHE_SUBRESOURCE_URL_FACTORY_H_ +#define CONTENT_BROWSER_APPCACHE_APPCACHE_SUBRESOURCE_URL_FACTORY_H_ #include "base/memory/ref_counted.h" #include "content/common/url_loader_factory.mojom.h" @@ -17,10 +17,10 @@ class AppCacheServiceImpl; class URLLoaderFactoryGetter; -// Implements the URLLoaderFactory mojom for AppCache requests. -class AppCacheURLLoaderFactory : public mojom::URLLoaderFactory { +// Implements the URLLoaderFactory mojom for AppCache subresource requests. +class AppCacheSubresourceURLFactory : public mojom::URLLoaderFactory { public: - ~AppCacheURLLoaderFactory() override; + ~AppCacheSubresourceURLFactory() override; // Factory function to create an instance of the factory. // 1. The |factory_getter| parameter is used to query the network service @@ -46,8 +46,8 @@ SyncLoadCallback callback) override; private: - AppCacheURLLoaderFactory(mojom::URLLoaderFactoryRequest request, - URLLoaderFactoryGetter* factory_getter); + AppCacheSubresourceURLFactory(mojom::URLLoaderFactoryRequest request, + URLLoaderFactoryGetter* factory_getter); void OnConnectionError(); @@ -56,9 +56,9 @@ // Used to retrieve the network service factory to pass unhandled requests to // the network service. - scoped_refptr<URLLoaderFactoryGetter> factory_getter_; + scoped_refptr<URLLoaderFactoryGetter> default_url_loader_factory_getter_; - DISALLOW_COPY_AND_ASSIGN(AppCacheURLLoaderFactory); + DISALLOW_COPY_AND_ASSIGN(AppCacheSubresourceURLFactory); }; } // namespace content
diff --git a/content/browser/appcache/appcache_url_loader_factory.cc b/content/browser/appcache/appcache_url_loader_factory.cc deleted file mode 100644 index 63cd59d3..0000000 --- a/content/browser/appcache/appcache_url_loader_factory.cc +++ /dev/null
@@ -1,69 +0,0 @@ -// 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/appcache/appcache_url_loader_factory.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "content/browser/appcache/appcache_request_handler.h" -#include "content/browser/appcache/appcache_url_loader_job.h" -#include "content/browser/appcache/appcache_url_loader_request.h" -#include "content/browser/url_loader_factory_getter.h" -#include "content/common/resource_request.h" -#include "content/common/url_loader_factory.mojom.h" -#include "content/public/browser/browser_thread.h" -#include "mojo/public/cpp/bindings/binding.h" -#include "mojo/public/cpp/bindings/binding_set.h" -#include "mojo/public/cpp/bindings/interface_ptr.h" -#include "net/traffic_annotation/network_traffic_annotation.h" - -namespace content { - -// Implements the URLLoaderFactory mojom for AppCache requests. -AppCacheURLLoaderFactory::AppCacheURLLoaderFactory( - mojom::URLLoaderFactoryRequest request, - URLLoaderFactoryGetter* factory_getter) - : binding_(this, std::move(request)), factory_getter_(factory_getter) { - binding_.set_connection_error_handler(base::Bind( - &AppCacheURLLoaderFactory::OnConnectionError, base::Unretained(this))); -} - -AppCacheURLLoaderFactory::~AppCacheURLLoaderFactory() {} - -// static -mojom::URLLoaderFactoryPtr AppCacheURLLoaderFactory::CreateURLLoaderFactory( - URLLoaderFactoryGetter* factory_getter) { - mojom::URLLoaderFactoryPtr loader_factory; - mojom::URLLoaderFactoryRequest request = mojo::MakeRequest(&loader_factory); - - // This instance will get deleted when the client drops the connection. - // Please see OnConnectionError() for details. - new AppCacheURLLoaderFactory(std::move(request), factory_getter); - return loader_factory; -} - -void AppCacheURLLoaderFactory::CreateLoaderAndStart( - mojom::URLLoaderAssociatedRequest url_loader_request, - int32_t routing_id, - int32_t request_id, - uint32_t options, - const ResourceRequest& request, - mojom::URLLoaderClientPtr client, - const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - NOTREACHED() << "Currently not implemented"; -} - -void AppCacheURLLoaderFactory::SyncLoad(int32_t routing_id, - int32_t request_id, - const ResourceRequest& request, - SyncLoadCallback callback) { - NOTREACHED(); -} - -void AppCacheURLLoaderFactory::OnConnectionError() { - base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); -} - -} // namespace content \ No newline at end of file
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index 54ac9d57..c130d36 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -573,7 +573,8 @@ std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, - bool is_stream) { + bool is_stream, + mojom::URLLoaderFactoryPtrInfo subresource_loader_factory_info) { DCHECK(state_ == STARTED); DCHECK(response); TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationRequest", this, @@ -646,6 +647,8 @@ body_ = std::move(body); handle_ = std::move(consumer_handle); + subresource_loader_factory_info_ = std::move(subresource_loader_factory_info); + // Check if the navigation should be allowed to proceed. navigation_handle_->WillProcessResponse( render_frame_host, response->head.headers.get(), @@ -922,9 +925,10 @@ DCHECK_EQ(request_params_.has_user_gesture, begin_params_.has_user_gesture); - render_frame_host->CommitNavigation(response_.get(), std::move(body_), - std::move(handle_), common_params_, - request_params_, is_view_source_); + render_frame_host->CommitNavigation( + response_.get(), std::move(body_), std::move(handle_), common_params_, + request_params_, is_view_source_, + std::move(subresource_loader_factory_info_)); frame_tree_node_->ResetNavigationRequest(true, true); }
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h index 7e90d70..73856c4 100644 --- a/content/browser/frame_host/navigation_request.h +++ b/content/browser/frame_host/navigation_request.h
@@ -205,7 +205,9 @@ std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, - bool is_stream) override; + bool is_stream, + mojom::URLLoaderFactoryPtrInfo + subresource_url_loader_factory_info) override; void OnRequestFailed(bool has_stale_copy_in_cache, int net_error) override; void OnRequestStarted(base::TimeTicks timestamp) override; @@ -286,6 +288,10 @@ base::Closure on_start_checks_complete_closure_; + // Used in the network service world to pass the subressource loader factory + // to the renderer. Currently only used by AppCache. + mojom::URLLoaderFactoryPtrInfo subresource_loader_factory_info_; + base::WeakPtrFactory<NavigationRequest> weak_factory_; DISALLOW_COPY_AND_ASSIGN(NavigationRequest);
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc index 8268976..55f3127 100644 --- a/content/browser/frame_host/navigator_impl.cc +++ b/content/browser/frame_host/navigator_impl.cc
@@ -29,6 +29,7 @@ #include "content/common/navigation_params.h" #include "content/common/page_messages.h" #include "content/common/site_isolation_policy.h" +#include "content/common/url_loader_factory.mojom.h" #include "content/common/view_messages.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" @@ -1173,7 +1174,8 @@ nullptr, // response nullptr, // body mojo::ScopedDataPipeConsumerHandle(), scoped_request->common_params(), - scoped_request->request_params(), scoped_request->is_view_source()); + scoped_request->request_params(), scoped_request->is_view_source(), + mojom::URLLoaderFactoryPtrInfo()); return; }
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 3754bebc..d3f875d 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2990,7 +2990,8 @@ CSPDisposition::CHECK /* should_check_main_world_csp */); if (IsBrowserSideNavigationEnabled()) { CommitNavigation(nullptr, nullptr, mojo::ScopedDataPipeConsumerHandle(), - common_params, RequestNavigationParams(), false); + common_params, RequestNavigationParams(), false, + mojom::URLLoaderFactoryPtrInfo()); } else { Navigate(common_params, StartNavigationParams(), RequestNavigationParams()); } @@ -3140,7 +3141,8 @@ mojo::ScopedDataPipeConsumerHandle handle, const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, - bool is_view_source) { + bool is_view_source, + mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_info) { TRACE_EVENT2("navigation", "RenderFrameHostImpl::CommitNavigation", "frame_tree_node", frame_tree_node_->frame_tree_node_id(), "url", common_params.url.possibly_invalid_spec()); @@ -3171,13 +3173,18 @@ // TODO(scottmg): Pass a factory for SW, etc. once we have one. if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableNetworkService)) { - const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); - if (std::find(schemes.begin(), schemes.end(), common_params.url.scheme()) != - schemes.end()) { - commit_data.url_loader_factory = CreateWebUIURLLoader(frame_tree_node_) - .PassInterface() - .PassHandle() - .release(); + if (!subresource_url_loader_factory_info.is_valid()) { + const auto& schemes = URLDataManagerBackend::GetWebUISchemes(); + if (std::find(schemes.begin(), schemes.end(), + common_params.url.scheme()) != schemes.end()) { + commit_data.url_loader_factory = CreateWebUIURLLoader(frame_tree_node_) + .PassInterface() + .PassHandle() + .release(); + } + } else { + commit_data.url_loader_factory = + subresource_url_loader_factory_info.PassHandle().release(); } } Send(new FrameMsg_CommitNavigation(routing_id_, head, body_url, commit_data,
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index db36975..dc24b89 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -41,6 +41,7 @@ #include "content/common/frame_replication_state.h" #include "content/common/image_downloader/image_downloader.mojom.h" #include "content/common/navigation_params.h" +#include "content/common/url_loader_factory.mojom.h" #include "content/public/browser/render_frame_host.h" #include "content/public/common/javascript_dialog_type.h" #include "content/public/common/previews_state.h" @@ -523,12 +524,17 @@ // PlzNavigate: Indicates that a navigation is ready to commit and can be // handled by this RenderFrame. - void CommitNavigation(ResourceResponse* response, - std::unique_ptr<StreamHandle> body, - mojo::ScopedDataPipeConsumerHandle handle, - const CommonNavigationParams& common_params, - const RequestNavigationParams& request_params, - bool is_view_source); + // |subresource_url_loader_factory_info| is used in network service land to + // allow factories interested in handling subresource requests to the + // renderer. E.g. AppCache. + void CommitNavigation( + ResourceResponse* response, + std::unique_ptr<StreamHandle> body, + mojo::ScopedDataPipeConsumerHandle handle, + const CommonNavigationParams& common_params, + const RequestNavigationParams& request_params, + bool is_view_source, + mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_info); // PlzNavigate // Indicates that a navigation failed and that this RenderFrame should display
diff --git a/content/browser/loader/navigation_url_loader_delegate.h b/content/browser/loader/navigation_url_loader_delegate.h index 8a71b22..c31a9e0 100644 --- a/content/browser/loader/navigation_url_loader_delegate.h +++ b/content/browser/loader/navigation_url_loader_delegate.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "content/common/content_export.h" +#include "content/common/url_loader_factory.mojom.h" #include "mojo/public/cpp/system/data_pipe.h" namespace net { @@ -38,6 +39,9 @@ // |body_stream|. |navigation_data| is passed to the NavigationHandle. // If --enable-network-service, then |consumer_handle| will be used, // otherwise |body_stream|. Only one of these will ever be non-null. + // |subresource_url_loader_factory_info| is used in the network service only + // for passing factories which are interested in handling subresource + // requests like AppCache. virtual void OnResponseStarted( const scoped_refptr<ResourceResponse>& response, std::unique_ptr<StreamHandle> body_stream, @@ -46,7 +50,8 @@ std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, - bool is_stream) = 0; + bool is_stream, + mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_info) = 0; // 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
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index b7827ed..71d0c2cb 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -101,10 +101,10 @@ bool is_stream) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - delegate_->OnResponseStarted(response, std::move(body), - mojo::ScopedDataPipeConsumerHandle(), ssl_status, - std::move(navigation_data), request_id, - is_download, is_stream); + delegate_->OnResponseStarted( + response, std::move(body), mojo::ScopedDataPipeConsumerHandle(), + ssl_status, std::move(navigation_data), request_id, is_download, + is_stream, mojom::URLLoaderFactoryPtrInfo()); } void NavigationURLLoaderImpl::NotifyRequestFailed(bool in_cache,
diff --git a/content/browser/loader/navigation_url_loader_network_service.cc b/content/browser/loader/navigation_url_loader_network_service.cc index df66bde..e4bba52 100644 --- a/content/browser/loader/navigation_url_loader_network_service.cc +++ b/content/browser/loader/navigation_url_loader_network_service.cc
@@ -75,11 +75,11 @@ URLLoaderRequestController( std::unique_ptr<ResourceRequest> resource_request, ResourceContext* resource_context, - scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter, + scoped_refptr<URLLoaderFactoryGetter> default_url_loader_factory_getter, const base::WeakPtr<NavigationURLLoaderNetworkService>& owner) : resource_request_(std::move(resource_request)), resource_context_(resource_context), - url_loader_factory_getter_(url_loader_factory_getter), + default_url_loader_factory_getter_(default_url_loader_factory_getter), owner_(owner) {} ~URLLoaderRequestController() override { @@ -141,7 +141,8 @@ if (appcache_handle_core) { std::unique_ptr<URLLoaderRequestHandler> appcache_handler = AppCacheRequestHandler::InitializeForNavigationNetworkService( - *resource_request_, appcache_handle_core); + *resource_request_, appcache_handle_core, + default_url_loader_factory_getter_.get()); if (appcache_handler) handlers_.push_back(std::move(appcache_handler)); } @@ -162,6 +163,15 @@ GetContentClient()->browser()->CreateURLLoaderThrottles( web_contents_getter_), *resource_request_, this); + + DCHECK_GT(handler_index_, 0U); + + mojom::URLLoaderFactoryPtr subresource_loader_factory = + handlers_[handler_index_ - 1]->MaybeCreateSubresourceFactory(); + if (subresource_loader_factory.get()) { + subresource_url_loader_factory_ptr_info_ = + subresource_loader_factory.PassInterface(); + } return; } @@ -176,9 +186,9 @@ mojom::URLLoaderFactory* factory = nullptr; DCHECK_EQ(handlers_.size(), handler_index_); if (resource_request_->url.SchemeIs(url::kBlobScheme)) { - factory = url_loader_factory_getter_->GetBlobFactory()->get(); + factory = default_url_loader_factory_getter_->GetBlobFactory()->get(); } else { - factory = url_loader_factory_getter_->GetNetworkFactory()->get(); + factory = default_url_loader_factory_getter_->GetNetworkFactory()->get(); } url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart( factory, @@ -196,6 +206,12 @@ url_loader_->FollowRedirect(); } + // Ownership of the URLLoaderFactoryPtrInfo instance is transferred to the + // caller. + mojom::URLLoaderFactoryPtrInfo GetSubresourceURLLoaderFactory() { + return std::move(subresource_url_loader_factory_ptr_info_); + } + private: // mojom::URLLoaderClient implementation: void OnReceiveResponse( @@ -250,7 +266,7 @@ ResourceContext* resource_context_; base::Callback<WebContents*()> web_contents_getter_; - scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_; + scoped_refptr<URLLoaderFactoryGetter> default_url_loader_factory_getter_; mojom::URLLoaderFactoryPtr webui_factory_ptr_; @@ -259,6 +275,10 @@ // This is referenced only on the UI thread. base::WeakPtr<NavigationURLLoaderNetworkService> owner_; + // Currently used by the AppCache loader to pass its factory to the + // renderer which enables it to handle subresources. + mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_ptr_info_; + DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); }; @@ -394,10 +414,11 @@ // Temporarily, we pass both a stream (null) and the data pipe to the // delegate until PlzNavigate has shipped and we can be comfortable fully // switching to the data pipe. - delegate_->OnResponseStarted(response_, nullptr, std::move(body), ssl_status_, - std::unique_ptr<NavigationData>(), - GlobalRequestID(-1, g_next_request_id), - false /* is_download? */, false /* is_stream */); + delegate_->OnResponseStarted( + response_, nullptr, std::move(body), ssl_status_, + std::unique_ptr<NavigationData>(), GlobalRequestID(-1, g_next_request_id), + false /* is_download? */, false /* is_stream */, + request_controller_->GetSubresourceURLLoaderFactory()); } void NavigationURLLoaderNetworkService::OnComplete(
diff --git a/content/browser/loader/url_loader_request_handler.cc b/content/browser/loader/url_loader_request_handler.cc new file mode 100644 index 0000000..0925e224 --- /dev/null +++ b/content/browser/loader/url_loader_request_handler.cc
@@ -0,0 +1,14 @@ +// 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/loader/url_loader_request_handler.h" + +namespace content { + +mojom::URLLoaderFactoryPtr +URLLoaderRequestHandler::MaybeCreateSubresourceFactory() { + return nullptr; +} + +} // namespace content \ No newline at end of file
diff --git a/content/browser/loader/url_loader_request_handler.h b/content/browser/loader/url_loader_request_handler.h index 11a6e030..f52974c0 100644 --- a/content/browser/loader/url_loader_request_handler.h +++ b/content/browser/loader/url_loader_request_handler.h
@@ -9,6 +9,7 @@ #include "base/callback_forward.h" #include "base/macros.h" #include "content/common/url_loader.mojom.h" +#include "content/common/url_loader_factory.mojom.h" namespace content { @@ -33,6 +34,11 @@ virtual void MaybeCreateLoader(const ResourceRequest& resource_request, ResourceContext* resource_context, LoaderCallback callback) = 0; + + // Returns the URLLoaderFactory if any to be used for subsequent URL requests + // going forward. Subclasses who want to handle subresource requests etc may + // want to override this to return a custom factory. + virtual mojom::URLLoaderFactoryPtr MaybeCreateSubresourceFactory(); }; } // namespace content
diff --git a/content/browser/service_worker/service_worker_context_request_handler.cc b/content/browser/service_worker/service_worker_context_request_handler.cc index 8677521..364e41f7 100644 --- a/content/browser/service_worker/service_worker_context_request_handler.cc +++ b/content/browser/service_worker/service_worker_context_request_handler.cc
@@ -209,8 +209,7 @@ int extra_load_flags = 0; base::TimeDelta time_since_last_check = base::Time::Now() - registration->last_update_check(); - if (time_since_last_check > - base::TimeDelta::FromHours(kServiceWorkerScriptMaxCacheAgeInHours) || + if (time_since_last_check > kServiceWorkerScriptMaxCacheAge || version_->force_bypass_cache_for_scripts()) { extra_load_flags = net::LOAD_BYPASS_CACHE; }
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc index f6354f2..5938ee65 100644 --- a/content/browser/service_worker/service_worker_job_unittest.cc +++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -920,8 +920,7 @@ base::TimeDelta time_since_last_check = base::Time::Now() - registration->last_update_check(); if (!is_update || script.GetOrigin() != kNoChangeOrigin || - time_since_last_check > base::TimeDelta::FromHours( - kServiceWorkerScriptMaxCacheAgeInHours)) { + time_since_last_check > kServiceWorkerScriptMaxCacheAge) { version->embedded_worker()->OnNetworkAccessedForScriptLoad(); }
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc index e77a33a..2ab2cb2 100644 --- a/content/browser/service_worker/service_worker_metrics.cc +++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -493,6 +493,11 @@ static_cast<int>(preparation), static_cast<int>(WorkerPreparationType::NUM_TYPES)); if (did_navigation_preload) { + // TODO(falken): Consider removing this UMA if it turns out the same as + // ServiceWorker.NavPreload.WorkerPreparationType. That UMA is logged at + // the same time as the other NavPreload metrics (which requires both the + // worker to start and the nav preload response to arrive successfuly), so + // they are more safely compared together. UMA_HISTOGRAM_ENUMERATION( "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Type_" "NavigationPreloadEnabled", @@ -843,6 +848,7 @@ base::TimeDelta worker_start, base::TimeDelta response_start, EmbeddedWorkerStatus initial_worker_status, + StartSituation start_situation, ResourceType resource_type) { DCHECK_GE(worker_start.ToInternalValue(), 0); DCHECK_GE(response_start.ToInternalValue(), 0); @@ -860,7 +866,14 @@ if (nav_preload_finished_first) { worker_wait_time = worker_start - response_start; } + const bool worker_start_occurred = + initial_worker_status != EmbeddedWorkerStatus::RUNNING; + const WorkerPreparationType preparation = + GetWorkerPreparationType(initial_worker_status, start_situation); + UMA_HISTOGRAM_ENUMERATION( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", preparation, + WorkerPreparationType::NUM_TYPES); UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start); UMA_HISTOGRAM_BOOLEAN("ServiceWorker.NavPreload.FinishedFirst_MainFrame", @@ -872,8 +885,6 @@ "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame", worker_wait_time); } - const bool worker_start_occurred = - initial_worker_status != EmbeddedWorkerStatus::RUNNING; if (worker_start_occurred) { UMA_HISTOGRAM_MEDIUM_TIMES( "ServiceWorker.NavPreload.ResponseTime_MainFrame_"
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h index 9298deb..0305ca76 100644 --- a/content/browser/service_worker/service_worker_metrics.h +++ b/content/browser/service_worker/service_worker_metrics.h
@@ -344,6 +344,7 @@ base::TimeDelta worker_start, base::TimeDelta response_start, EmbeddedWorkerStatus initial_worker_status, + StartSituation start_situation, ResourceType resource_type); // Records the result of trying to handle a request for a service worker
diff --git a/content/browser/service_worker/service_worker_metrics_unittest.cc b/content/browser/service_worker/service_worker_metrics_unittest.cc index 50efb2c..75b2697 100644 --- a/content/browser/service_worker/service_worker_metrics_unittest.cc +++ b/content/browser/service_worker/service_worker_metrics_unittest.cc
@@ -24,6 +24,8 @@ void ExpectNoNavPreloadMainFrameUMA( const base::HistogramTester& histogram_tester) { histogram_tester.ExpectTotalCount( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", 0); + histogram_tester.ExpectTotalCount( "ServiceWorker.NavPreload.ResponseTime_MainFrame", 0); histogram_tester.ExpectTotalCount( "ServiceWorker.NavPreload.FinishedFirst_MainFrame", 0); @@ -33,45 +35,38 @@ "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame", 0); histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.ResponseTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.ResponseTime_MainFrame_WorkerStartOccurred", 0); + histogram_tester.ExpectTotalCount( + "ServiceWorker.NavPreload.FinishedFirst_MainFrame_WorkerStartOccurred", 0); histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.FinishedFirst_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_WorkerStartOccurred", 0); histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_" - "WorkerStartOccurred", - 0); - histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_WorkerStartOccurred", 0); } void ExpectNoNavPreloadWorkerStartOccurredUMA( const base::HistogramTester& histogram_tester) { histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.ResponseTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.ResponseTime_MainFrame_WorkerStartOccurred", 0); + histogram_tester.ExpectTotalCount( + "ServiceWorker.NavPreload.FinishedFirst_MainFrame_WorkerStartOccurred", 0); histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.FinishedFirst_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_WorkerStartOccurred", 0); histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_" - "WorkerStartOccurred", - 0); - histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_WorkerStartOccurred", 0); } } // namespace +using StartSituation = ServiceWorkerMetrics::StartSituation; +using WorkerPreparationType = ServiceWorkerMetrics::WorkerPreparationType; + TEST(ServiceWorkerMetricsTest, ActivatedWorkerPreparation) { base::TimeDelta time = base::TimeDelta::FromMilliseconds(123); { @@ -82,9 +77,7 @@ ServiceWorkerMetrics::StartSituation::UNKNOWN, false /* did_navigation_preload */); histogram_tester.ExpectUniqueSample( - kPreparationType, - static_cast<int>(ServiceWorkerMetrics::WorkerPreparationType::STARTING), - 1); + kPreparationType, static_cast<int>(WorkerPreparationType::STARTING), 1); histogram_tester.ExpectTotalCount( kPreparationType + kNavigationPreloadSuffix, 0); histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1); @@ -98,19 +91,14 @@ // Test preparation when the worker started up during startup. base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordActivatedWorkerPreparationForMainFrame( - time, EmbeddedWorkerStatus::STOPPED, - ServiceWorkerMetrics::StartSituation::DURING_STARTUP, + time, EmbeddedWorkerStatus::STOPPED, StartSituation::DURING_STARTUP, true /* did_navigation_preload */); histogram_tester.ExpectUniqueSample( kPreparationType, - static_cast<int>( - ServiceWorkerMetrics::WorkerPreparationType::START_DURING_STARTUP), - 1); + static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1); histogram_tester.ExpectUniqueSample( kPreparationType + kNavigationPreloadSuffix, - static_cast<int>( - ServiceWorkerMetrics::WorkerPreparationType::START_DURING_STARTUP), - 1); + static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1); histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1); histogram_tester.ExpectTimeBucketCount( kPreparationTime + kNavigationPreloadSuffix, time, 1); @@ -122,19 +110,14 @@ // Test preparation when the worker started up in an existing process. base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordActivatedWorkerPreparationForMainFrame( - time, EmbeddedWorkerStatus::STOPPED, - ServiceWorkerMetrics::StartSituation::EXISTING_PROCESS, + time, EmbeddedWorkerStatus::STOPPED, StartSituation::EXISTING_PROCESS, true /* did_navigation_preload */); histogram_tester.ExpectUniqueSample( kPreparationType, - static_cast<int>(ServiceWorkerMetrics::WorkerPreparationType:: - START_IN_EXISTING_PROCESS), - 1); + static_cast<int>(WorkerPreparationType::START_IN_EXISTING_PROCESS), 1); histogram_tester.ExpectUniqueSample( kPreparationType + kNavigationPreloadSuffix, - static_cast<int>(ServiceWorkerMetrics::WorkerPreparationType:: - START_IN_EXISTING_PROCESS), - 1); + static_cast<int>(WorkerPreparationType::START_IN_EXISTING_PROCESS), 1); histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1); histogram_tester.ExpectTimeBucketCount( kPreparationTime + kNavigationPreloadSuffix, time, 1); @@ -153,11 +136,15 @@ base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(123); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789); EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::RUNNING; + StartSituation start_situation = StartSituation::EXISTING_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_MAIN_FRAME); + histogram_tester.ExpectUniqueSample( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", + static_cast<int>(WorkerPreparationType::RUNNING), 1); histogram_tester.ExpectTimeBucketCount( "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1); histogram_tester.ExpectUniqueSample( @@ -176,9 +163,10 @@ base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(123); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789); EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::RUNNING; + StartSituation start_situation = StartSituation::EXISTING_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_SUB_FRAME); ExpectNoNavPreloadMainFrameUMA(histogram_tester); @@ -190,11 +178,15 @@ base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(234); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789); EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED; + StartSituation start_situation = StartSituation::NEW_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_MAIN_FRAME); + histogram_tester.ExpectUniqueSample( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", + static_cast<int>(WorkerPreparationType::START_IN_NEW_PROCESS), 1); histogram_tester.ExpectTimeBucketCount( "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1); histogram_tester.ExpectUniqueSample( @@ -205,20 +197,16 @@ "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame", 0); histogram_tester.ExpectTimeBucketCount( - "ServiceWorker.NavPreload.ResponseTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.ResponseTime_MainFrame_WorkerStartOccurred", response_start, 1); histogram_tester.ExpectUniqueSample( - "ServiceWorker.NavPreload.FinishedFirst_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.FinishedFirst_MainFrame_WorkerStartOccurred", false, 1); histogram_tester.ExpectTimeBucketCount( - "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_WorkerStartOccurred", worker_start, 1); histogram_tester.ExpectTotalCount( - "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_" - "WorkerStartOccurred", + "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_WorkerStartOccurred", 0); } @@ -227,27 +215,31 @@ base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(234); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789); EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED; + StartSituation start_situation = StartSituation::EXISTING_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_SUB_FRAME); ExpectNoNavPreloadMainFrameUMA(histogram_tester); } -// The worker was already starting up (STARTING). This gets logged the same as -// if it were STOPPED, since any status other than RUNNING gets logged to the -// "_WorkerStartOccurred" suffix. +// The worker was already starting up (STARTING). This gets logged to the +// _WorkerStartOccurred suffix as well. TEST(ServiceWorkerMetricsTest, - NavigationPreloadResponse_WorkerStart_BrowserStartup) { + NavigationPreloadResponse_WorkerStart_WorkerStarting) { base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(234); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789); EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STARTING; + StartSituation start_situation = StartSituation::NEW_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_MAIN_FRAME); + histogram_tester.ExpectUniqueSample( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", + static_cast<int>(WorkerPreparationType::STARTING), 1); histogram_tester.ExpectTimeBucketCount( "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1); histogram_tester.ExpectUniqueSample( @@ -281,12 +273,15 @@ base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(2345); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(456); base::TimeDelta wait_time = worker_start - response_start; - // STOPPING is also logged the same as STOPPED. EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPING; + StartSituation start_situation = StartSituation::NEW_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_MAIN_FRAME); + histogram_tester.ExpectUniqueSample( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", + static_cast<int>(WorkerPreparationType::STOPPING), 1); histogram_tester.ExpectTimeBucketCount( "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1); histogram_tester.ExpectUniqueSample( @@ -316,12 +311,28 @@ base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(2345); base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(456); EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED; + StartSituation start_situation = StartSituation::NEW_PROCESS; base::HistogramTester histogram_tester; ServiceWorkerMetrics::RecordNavigationPreloadResponse( - worker_start, response_start, initial_worker_status, + worker_start, response_start, initial_worker_status, start_situation, RESOURCE_TYPE_SUB_FRAME); ExpectNoNavPreloadMainFrameUMA(histogram_tester); } +// The worker started up during browser startup. +TEST(ServiceWorkerMetricsTest, NavigationPreloadResponse_BrowserStartup) { + base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(2345); + base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(456); + EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED; + StartSituation start_situation = StartSituation::DURING_STARTUP; + base::HistogramTester histogram_tester; + ServiceWorkerMetrics::RecordNavigationPreloadResponse( + worker_start, response_start, initial_worker_status, start_situation, + RESOURCE_TYPE_MAIN_FRAME); + histogram_tester.ExpectUniqueSample( + "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", + static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1); +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc index 5633043..01d4344 100644 --- a/content/browser/service_worker/service_worker_url_request_job.cc +++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -288,7 +288,8 @@ ServiceWorkerMetrics::RecordNavigationPreloadResponse( owner_->worker_ready_time_ - owner_->worker_start_time_, navigation_preload_response_time_ - owner_->worker_start_time_, - owner_->initial_worker_status_, owner_->resource_type_); + owner_->initial_worker_status_, owner_->worker_start_situation_, + owner_->resource_type_); phase_ = Phase::RECORDED; }
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 306710a..1f755b4 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -11,10 +11,8 @@ #include <string> #include "base/command_line.h" -#include "base/debug/alias.h" #include "base/guid.h" #include "base/location.h" -#include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" @@ -23,16 +21,12 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_tick_clock.h" -#include "base/time/time.h" #include "content/browser/bad_message.h" #include "content/browser/child_process_security_policy_impl.h" -#include "content/browser/service_worker/embedded_worker_instance.h" #include "content/browser/service_worker/embedded_worker_registry.h" -#include "content/browser/service_worker/embedded_worker_status.h" #include "content/browser/service_worker/service_worker_client_utils.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" -#include "content/browser/service_worker/service_worker_metrics.h" #include "content/browser/service_worker/service_worker_registration.h" #include "content/common/origin_trials/trial_token_validator.h" #include "content/common/service_worker/embedded_worker_messages.h" @@ -56,14 +50,21 @@ namespace { -// Time to wait until stopping an idle worker. -const int kIdleWorkerTimeoutSeconds = 30; +// Timeout for an installed worker to start. +constexpr base::TimeDelta kStartInstalledWorkerTimeout = + base::TimeDelta::FromSeconds(60); -// Default delay for scheduled update. -const int kUpdateDelaySeconds = 1; +// Timeout for a request to be handled. +constexpr base::TimeDelta kRequestTimeout = base::TimeDelta::FromMinutes(5); + +// Time to wait until stopping an idle worker. +constexpr base::TimeDelta kIdleWorkerTimeout = base::TimeDelta::FromSeconds(30); // Timeout for waiting for a response to a ping. -const int kPingTimeoutSeconds = 30; +constexpr base::TimeDelta kPingTimeout = base::TimeDelta::FromSeconds(30); + +// Default delay for scheduled update. +constexpr base::TimeDelta kUpdateDelay = base::TimeDelta::FromSeconds(1); const char kClaimClientsStateErrorMesage[] = "Only the active worker can claim clients."; @@ -202,11 +203,9 @@ } // namespace -const int ServiceWorkerVersion::kTimeoutTimerDelaySeconds = 30; -const int ServiceWorkerVersion::kStartInstalledWorkerTimeoutSeconds = 60; -const int ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes = 5; -const int ServiceWorkerVersion::kRequestTimeoutMinutes = 5; -const int ServiceWorkerVersion::kStopWorkerTimeoutSeconds = 5; +constexpr base::TimeDelta ServiceWorkerVersion::kTimeoutTimerDelay; +constexpr base::TimeDelta ServiceWorkerVersion::kStartNewWorkerTimeout; +constexpr base::TimeDelta ServiceWorkerVersion::kStopWorkerTimeout; void ServiceWorkerVersion::RestartTick(base::TimeTicks* time) const { *time = tick_clock_->NowTicks(); @@ -249,8 +248,7 @@ // - OnPingTimeout() if the worker hasn't reponded within a certain period. // - PingWorker() if we're running ping timer and can send next ping. void CheckPingStatus() { - if (version_->GetTickDuration(ping_time_) > - base::TimeDelta::FromSeconds(kPingTimeoutSeconds)) { + if (version_->GetTickDuration(ping_time_) > kPingTimeout) { ping_state_ = PING_TIMED_OUT; version_->OnPingTimeout(); return; @@ -506,8 +504,7 @@ // Protect |this| until the timer fires, since we may be stopping // and soon no one might hold a reference to us. context_->ProtectVersion(make_scoped_refptr(this)); - update_timer_.Start(FROM_HERE, - base::TimeDelta::FromSeconds(kUpdateDelaySeconds), + update_timer_.Start(FROM_HERE, kUpdateDelay, base::Bind(&ServiceWorkerVersion::StartUpdate, weak_factory_.GetWeakPtr())); } @@ -529,9 +526,8 @@ int ServiceWorkerVersion::StartRequest( ServiceWorkerMetrics::EventType event_type, const StatusCallback& error_callback) { - return StartRequestWithCustomTimeout( - event_type, error_callback, - base::TimeDelta::FromMinutes(kRequestTimeoutMinutes), KILL_ON_TIMEOUT); + return StartRequestWithCustomTimeout(event_type, error_callback, + kRequestTimeout, KILL_ON_TIMEOUT); } int ServiceWorkerVersion::StartRequestWithCustomTimeout( @@ -776,9 +772,7 @@ } // Reactivate request timeouts, setting them all to the same expiration time. - SetAllRequestExpirations( - tick_clock_->NowTicks() + - base::TimeDelta::FromMinutes(kRequestTimeoutMinutes)); + SetAllRequestExpirations(tick_clock_->NowTicks() + kRequestTimeout); } void ServiceWorkerVersion::SetMainScriptHttpResponseInfo( @@ -877,8 +871,7 @@ // Shorten the interval so stalling in stopped can be fixed quickly. Once the // worker stops, the timer is disabled. The interval will be reset to normal // when the worker starts up again. - SetTimeoutTimerInterval( - base::TimeDelta::FromSeconds(kStopWorkerTimeoutSeconds)); + SetTimeoutTimerInterval(kStopWorkerTimeout); for (auto& observer : listeners_) observer.OnRunningStateChanged(this); } @@ -1498,9 +1491,8 @@ // Ping will be activated in OnScriptLoaded. ping_controller_->Deactivate(); - timeout_timer_.Start(FROM_HERE, - base::TimeDelta::FromSeconds(kTimeoutTimerDelaySeconds), - this, &ServiceWorkerVersion::OnTimeoutTimer); + timeout_timer_.Start(FROM_HERE, kTimeoutTimerDelay, this, + &ServiceWorkerVersion::OnTimeoutTimer); } void ServiceWorkerVersion::StopTimeoutTimer() { @@ -1536,8 +1528,7 @@ MarkIfStale(); // Stopping the worker hasn't finished within a certain period. - if (GetTickDuration(stop_time_) > - base::TimeDelta::FromSeconds(kStopWorkerTimeoutSeconds)) { + if (GetTickDuration(stop_time_) > kStopWorkerTimeout) { DCHECK_EQ(EmbeddedWorkerStatus::STOPPING, running_status()); if (IsInstalled(status())) { ServiceWorkerMetrics::RecordWorkerStopped( @@ -1560,18 +1551,16 @@ // Trigger update if worker is stale and we waited long enough for it to go // idle. - if (GetTickDuration(stale_time_) > - base::TimeDelta::FromMinutes(kRequestTimeoutMinutes)) { + if (GetTickDuration(stale_time_) > kRequestTimeout) { ClearTick(&stale_time_); if (!update_timer_.IsRunning()) ScheduleUpdate(); } // Starting a worker hasn't finished within a certain period. - const base::TimeDelta start_limit = - IsInstalled(status()) - ? base::TimeDelta::FromSeconds(kStartInstalledWorkerTimeoutSeconds) - : base::TimeDelta::FromMinutes(kStartNewWorkerTimeoutMinutes); + const base::TimeDelta start_limit = IsInstalled(status()) + ? kStartInstalledWorkerTimeout + : kStartNewWorkerTimeout; if (GetTickDuration(start_time_) > start_limit) { DCHECK(running_status() == EmbeddedWorkerStatus::STARTING || running_status() == EmbeddedWorkerStatus::STOPPING) @@ -1605,8 +1594,7 @@ return; // The worker has been idle for longer than a certain period. - if (GetTickDuration(idle_time_) > - base::TimeDelta::FromSeconds(kIdleWorkerTimeoutSeconds)) { + if (GetTickDuration(idle_time_) > kIdleWorkerTimeout) { StopWorkerIfIdle(); return; } @@ -1762,8 +1750,7 @@ return; base::TimeDelta time_since_last_check = base::Time::Now() - registration->last_update_check(); - if (time_since_last_check > - base::TimeDelta::FromHours(kServiceWorkerScriptMaxCacheAgeInHours)) + if (time_since_last_check > kServiceWorkerScriptMaxCacheAge) RestartTick(&stale_time_); }
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index 39130015..b02df70e 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -535,15 +535,14 @@ }; // The timeout timer interval. - static const int kTimeoutTimerDelaySeconds; - // Timeout for an installed worker to start. - static const int kStartInstalledWorkerTimeoutSeconds; + static constexpr base::TimeDelta kTimeoutTimerDelay = + base::TimeDelta::FromSeconds(30); // Timeout for a new worker to start. - static const int kStartNewWorkerTimeoutMinutes; - // Timeout for a request to be handled. - static const int kRequestTimeoutMinutes; + static constexpr base::TimeDelta kStartNewWorkerTimeout = + base::TimeDelta::FromMinutes(5); // Timeout for the worker to stop. - static const int kStopWorkerTimeoutSeconds; + static constexpr base::TimeDelta kStopWorkerTimeout = + base::TimeDelta::FromSeconds(5); ~ServiceWorkerVersion() override;
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc index 3b074dd..925ba94 100644 --- a/content/browser/service_worker/service_worker_version_unittest.cc +++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -767,10 +767,9 @@ // Simulate it running for past the wait threshold. The update will be // scheduled. - version_->stale_time_ = - base::TimeTicks::Now() - - base::TimeDelta::FromMinutes( - ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1); + version_->stale_time_ = base::TimeTicks::Now() - + ServiceWorkerVersion::kStartNewWorkerTimeout - + base::TimeDelta::FromMinutes(1); version_->OnTimeoutTimer(); EXPECT_TRUE(version_->stale_time_.is_null()); EXPECT_TRUE(version_->update_timer_.IsRunning()); @@ -782,10 +781,9 @@ version_->SetStatus(ServiceWorkerVersion::ACTIVATED); registration_->SetActiveVersion(version_); registration_->set_last_update_check(GetYesterday()); - base::TimeTicks stale_time = - base::TimeTicks::Now() - - base::TimeDelta::FromMinutes( - ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1); + base::TimeTicks stale_time = base::TimeTicks::Now() - + ServiceWorkerVersion::kStartNewWorkerTimeout - + base::TimeDelta::FromMinutes(1); version_->stale_time_ = stale_time; // Stale time is not deferred. @@ -1134,10 +1132,9 @@ // Simulate timeout. EXPECT_TRUE(version_->timeout_timer_.IsRunning()); - version_->start_time_ = - base::TimeTicks::Now() - - base::TimeDelta::FromMinutes( - ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1); + version_->start_time_ = base::TimeTicks::Now() - + ServiceWorkerVersion::kStartNewWorkerTimeout - + base::TimeDelta::FromMinutes(1); version_->timeout_timer_.user_task().Run(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); @@ -1163,15 +1160,13 @@ // Worker is now stalled in stopping. Verify a fast timeout is in place. EXPECT_TRUE(version_->timeout_timer_.IsRunning()); - EXPECT_EQ(base::TimeDelta::FromSeconds( - ServiceWorkerVersion::kStopWorkerTimeoutSeconds), + EXPECT_EQ(ServiceWorkerVersion::kStopWorkerTimeout, version_->timeout_timer_.GetCurrentDelay()); // Simulate timeout. - version_->stop_time_ = - base::TimeTicks::Now() - - base::TimeDelta::FromSeconds( - ServiceWorkerVersion::kStopWorkerTimeoutSeconds + 1); + version_->stop_time_ = base::TimeTicks::Now() - + ServiceWorkerVersion::kStopWorkerTimeout - + base::TimeDelta::FromSeconds(1); version_->timeout_timer_.user_task().Run(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(SERVICE_WORKER_OK, status); @@ -1187,8 +1182,7 @@ // The timeout interval should be reset to normal. EXPECT_TRUE(version_->timeout_timer_.IsRunning()); - EXPECT_EQ(base::TimeDelta::FromSeconds( - ServiceWorkerVersion::kTimeoutTimerDelaySeconds), + EXPECT_EQ(ServiceWorkerVersion::kTimeoutTimerDelay, version_->timeout_timer_.GetCurrentDelay()); } @@ -1215,10 +1209,9 @@ // Simulate timeout. The worker should stop and get restarted. EXPECT_TRUE(version_->timeout_timer_.IsRunning()); - version_->stop_time_ = - base::TimeTicks::Now() - - base::TimeDelta::FromSeconds( - ServiceWorkerVersion::kStopWorkerTimeoutSeconds + 1); + version_->stop_time_ = base::TimeTicks::Now() - + ServiceWorkerVersion::kStopWorkerTimeout - + base::TimeDelta::FromSeconds(1); version_->timeout_timer_.user_task().Run(); base::RunLoop().RunUntilIdle(); EXPECT_EQ(SERVICE_WORKER_OK, status);
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc index f1fc6813..753fd63f4 100644 --- a/content/child/resource_dispatcher.cc +++ b/content/child/resource_dispatcher.cc
@@ -778,9 +778,18 @@ // WebURLLoaderImpl::Context::OnReceivedResponse. client_ptr->OnReceiveResponse(ResourceResponseHead(), base::nullopt, mojom::DownloadedTempFilePtr()); + + // Abort if the request is cancelled. + if (!GetPendingRequestInfo(request_id)) + return; + // Start streaming now. client_ptr->OnStartLoadingResponseBody(std::move(consumer_handle)); + // Abort if the request is cancelled. + if (!GetPendingRequestInfo(request_id)) + return; + // Call OnComplete now too, as it won't get called on the client. // TODO(kinuko): Fill this properly. ResourceRequestCompletionStatus completion_status;
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h index ea22f5c3..a3f10c41 100644 --- a/content/common/service_worker/service_worker_types.h +++ b/content/common/service_worker/service_worker_types.h
@@ -53,7 +53,8 @@ // The HTTP cache is bypassed for Service Worker scripts if the last network // fetch occurred over 24 hours ago. -static const int kServiceWorkerScriptMaxCacheAgeInHours = 24; +static constexpr base::TimeDelta kServiceWorkerScriptMaxCacheAge = + base::TimeDelta::FromHours(24); // ServiceWorker provider type. enum ServiceWorkerProviderType {
diff --git a/content/public/browser/utility_process_mojo_client.h b/content/public/browser/utility_process_mojo_client.h index c6ecfdf6..164c1dd3 100644 --- a/content/public/browser/utility_process_mojo_client.h +++ b/content/public/browser/utility_process_mojo_client.h
@@ -66,7 +66,7 @@ // Starts the utility process and connects to the remote Mojo service. void Start() { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(error_callback_); DCHECK(!start_called_); @@ -79,7 +79,7 @@ // Returns the Mojo service used to make calls to the utility process. MojoInterface* service() WARN_UNUSED_RESULT { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(start_called_); return service_.get(); @@ -174,7 +174,7 @@ bool start_called_ = false; // Checks that this class is always accessed from the same thread. - base::ThreadChecker thread_checker_; + SEQUENCE_CHECKER(sequence_checker_); DISALLOW_COPY_AND_ASSIGN(UtilityProcessMojoClient); };
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index e956f2d..f4e1e08 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -41,6 +41,7 @@ #include "ui/base/platform_window_defaults.h" #include "ui/base/test/material_design_controller_test_api.h" #include "ui/compositor/compositor_switches.h" +#include "ui/gfx/color_space_switches.h" #include "ui/gl/gl_implementation.h" #include "ui/gl/gl_switches.h" @@ -224,6 +225,10 @@ if (use_software_gl && !use_software_compositing_) command_line->AppendSwitch(switches::kOverrideUseSoftwareGLForTests); + // Use an sRGB color profile to ensure that the machine's color profile does + // not affect the results. + command_line->AppendSwitchASCII(switches::kForceColorProfile, "srgb"); + test_host_resolver_ = base::MakeUnique<TestHostResolver>(); ContentBrowserSanityChecker scoped_enable_sanity_checks; @@ -238,6 +243,7 @@ base::FeatureList::GetInstance()->GetFeatureOverrides(&enabled_features, &disabled_features); } + if (!enabled_features.empty()) { command_line->AppendSwitchASCII(switches::kEnableFeatures, enabled_features);
diff --git a/content/test/test_navigation_url_loader.cc b/content/test/test_navigation_url_loader.cc index ee27c8a8..7ea49f2 100644 --- a/content/test/test_navigation_url_loader.cc +++ b/content/test/test_navigation_url_loader.cc
@@ -7,6 +7,7 @@ #include <utility> #include "content/browser/loader/navigation_url_loader_delegate.h" +#include "content/common/url_loader_factory.mojom.h" #include "content/public/browser/global_request_id.h" #include "content/public/browser/navigation_data.h" #include "content/public/browser/render_process_host.h" @@ -71,7 +72,8 @@ GlobalRequestID global_id(child_id, ++request_id); delegate_->OnResponseStarted( response, std::move(body), mojo::ScopedDataPipeConsumerHandle(), - SSLStatus(), std::move(navigation_data), global_id, false, false); + SSLStatus(), std::move(navigation_data), global_id, false, false, + mojom::URLLoaderFactoryPtrInfo()); } TestNavigationURLLoader::~TestNavigationURLLoader() {}
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc index 1d74335d..26ec48c 100644 --- a/content/test/test_navigation_url_loader_delegate.cc +++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -64,7 +64,8 @@ std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, - bool is_stream) { + bool is_stream, + mojom::URLLoaderFactoryPtrInfo loader_factory_ptr_info) { response_ = response; body_ = std::move(body); handle_ = std::move(consumer_handle);
diff --git a/content/test/test_navigation_url_loader_delegate.h b/content/test/test_navigation_url_loader_delegate.h index 1916f3f3..8289309 100644 --- a/content/test/test_navigation_url_loader_delegate.h +++ b/content/test/test_navigation_url_loader_delegate.h
@@ -55,14 +55,16 @@ void OnRequestRedirected( const net::RedirectInfo& redirect_info, const scoped_refptr<ResourceResponse>& response) override; - void OnResponseStarted(const scoped_refptr<ResourceResponse>& response, - std::unique_ptr<StreamHandle> body, - mojo::ScopedDataPipeConsumerHandle consumer_handle, - const SSLStatus& ssl_status, - std::unique_ptr<NavigationData> navigation_data, - const GlobalRequestID& request_id, - bool is_download, - bool is_stream) override; + void OnResponseStarted( + const scoped_refptr<ResourceResponse>& response, + std::unique_ptr<StreamHandle> body, + mojo::ScopedDataPipeConsumerHandle consumer_handle, + const SSLStatus& ssl_status, + std::unique_ptr<NavigationData> navigation_data, + const GlobalRequestID& request_id, + bool is_download, + bool is_stream, + mojom::URLLoaderFactoryPtrInfo loader_factory_ptr_info) override; void OnRequestFailed(bool in_cache, int net_error) override; void OnRequestStarted(base::TimeTicks timestamp) override;
diff --git a/ios/chrome/browser/web/progress_indicator_egtest.mm b/ios/chrome/browser/web/progress_indicator_egtest.mm index 54c735ca..93beaf4e 100644 --- a/ios/chrome/browser/web/progress_indicator_egtest.mm +++ b/ios/chrome/browser/web/progress_indicator_egtest.mm
@@ -163,7 +163,8 @@ // Tests that the progress indicator is shown and has expected progress value // after a form is submitted, and the toolbar is visible. -- (void)testProgressIndicatorShownOnFormSubmit { +// TODO(crbug.com/734874): Reenable test when fixed. +- (void)DISABLED_testProgressIndicatorShownOnFormSubmit { if (IsIPadIdiom()) { EARL_GREY_TEST_SKIPPED(@"Skipped for iPad (no progress view in tablet)"); }
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc index 36c6b86a..98f65439 100644 --- a/mojo/public/cpp/bindings/lib/message.cc +++ b/mojo/public/cpp/bindings/lib/message.cc
@@ -41,10 +41,10 @@ // An internal serialization context used to initialize new serialized messages. struct MessageInfo { - MessageInfo(size_t total_size, std::vector<ScopedHandle> handles) - : total_size(total_size), handles(std::move(handles)) {} + MessageInfo(size_t total_size, std::vector<ScopedHandle>* handles) + : total_size(total_size), handles(handles) {} const size_t total_size; - std::vector<ScopedHandle> handles; + std::vector<ScopedHandle>* handles; internal::Buffer payload_buffer; }; @@ -53,13 +53,14 @@ size_t* num_handles) { auto* info = reinterpret_cast<MessageInfo*>(context); *num_bytes = info->total_size; - *num_handles = info->handles.size(); + *num_handles = info->handles ? info->handles->size() : 0; } void SerializeHandlesFromMessageInfo(uintptr_t context, MojoHandle* handles) { auto* info = reinterpret_cast<MessageInfo*>(context); - for (size_t i = 0; i < info->handles.size(); ++i) - handles[i] = info->handles[i].release().value(); + DCHECK(info->handles); + for (size_t i = 0; i < info->handles->size(); ++i) + handles[i] = info->handles->at(i).release().value(); } void SerializePayloadFromMessageInfo(uintptr_t context, void* storage) { @@ -141,13 +142,13 @@ uint32_t flags, size_t payload_size, size_t payload_interface_id_count, - std::vector<ScopedHandle> handles, + std::vector<ScopedHandle>* handles, ScopedMessageHandle* out_handle, internal::Buffer* out_buffer) { internal::Buffer buffer; MessageInfo info( ComputeTotalSize(flags, payload_size, payload_interface_id_count), - std::move(handles)); + handles); ScopedMessageHandle handle; MojoResult rv = mojo::CreateMessage(reinterpret_cast<uintptr_t>(&info), &kMessageInfoThunks, &handle); @@ -180,11 +181,10 @@ Message::Message(uint32_t name, uint32_t flags, size_t payload_size, - size_t payload_interface_id_count, - std::vector<ScopedHandle> handles) { + size_t payload_interface_id_count) { CreateSerializedMessageObject(name, flags, payload_size, - payload_interface_id_count, std::move(handles), - &handle_, &payload_buffer_); + payload_interface_id_count, nullptr, &handle_, + &payload_buffer_); data_ = payload_buffer_.data(); data_size_ = payload_buffer_.size(); transferable_ = true; @@ -274,8 +274,9 @@ return array_pointer ? array_pointer->storage() : nullptr; } -void Message::AttachHandles(std::vector<ScopedHandle> handles) { - if (handles.empty()) +void Message::AttachHandles(std::vector<ScopedHandle>* handles) { + DCHECK(handles); + if (handles->empty()) return; // Sanity-check the current serialized message state. We must have a valid @@ -290,7 +291,7 @@ MOJO_GET_SERIALIZED_MESSAGE_CONTENTS_FLAG_NONE); DCHECK_EQ(MOJO_RESULT_OK, rv); - MessageInfo new_info(data_size_, std::move(handles)); + MessageInfo new_info(data_size_, handles); ScopedMessageHandle new_handle; rv = mojo::CreateMessage(reinterpret_cast<uintptr_t>(&new_info), &kMessageInfoThunks, &new_handle); @@ -380,7 +381,9 @@ PassThroughFilter::~PassThroughFilter() {} -bool PassThroughFilter::Accept(Message* message) { return true; } +bool PassThroughFilter::Accept(Message* message) { + return true; +} SyncMessageResponseContext::SyncMessageResponseContext() : outer_context_(current()) {
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.cc b/mojo/public/cpp/bindings/lib/serialization_context.cc index d17e3349..8e4d86b 100644 --- a/mojo/public/cpp/bindings/lib/serialization_context.cc +++ b/mojo/public/cpp/bindings/lib/serialization_context.cc
@@ -7,6 +7,7 @@ #include <limits> #include "base/logging.h" +#include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/system/core.h" namespace mojo { @@ -46,5 +47,11 @@ DCHECK(!custom_contexts || custom_contexts->empty()); } +void SerializationContext::AttachHandlesToMessage(Message* message) { + associated_endpoint_handles.swap( + *message->mutable_associated_endpoint_handles()); + message->AttachHandles(handles.mutable_handles()); +} + } // namespace internal } // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.h b/mojo/public/cpp/bindings/lib/serialization_context.h index 2d0d4b4a..6a6e5142 100644 --- a/mojo/public/cpp/bindings/lib/serialization_context.h +++ b/mojo/public/cpp/bindings/lib/serialization_context.h
@@ -18,6 +18,9 @@ #include "mojo/public/cpp/system/handle.h" namespace mojo { + +class Message; + namespace internal { // A container for handles during serialization/deserialization. @@ -27,6 +30,7 @@ ~SerializedHandleVector(); size_t size() const { return handles_.size(); } + std::vector<mojo::ScopedHandle>* mutable_handles() { return &handles_; } // Adds a handle to the handle list and returns its index for encoding. Handle_Data AddHandle(mojo::ScopedHandle handle); @@ -57,6 +61,10 @@ ~SerializationContext(); + // Transfers ownership of any accumulated handles and associated endpoint + // handles into |*message|. + void AttachHandlesToMessage(Message* message); + // Opaque context pointers returned by StringTraits::SetUpContext(). std::unique_ptr<std::queue<void*>> custom_contexts;
diff --git a/mojo/public/cpp/bindings/message.h b/mojo/public/cpp/bindings/message.h index 07d0a7c..9fabda4 100644 --- a/mojo/public/cpp/bindings/message.h +++ b/mojo/public/cpp/bindings/message.h
@@ -51,8 +51,7 @@ Message(uint32_t name, uint32_t flags, size_t payload_size, - size_t payload_interface_id_count, - std::vector<ScopedHandle> handles = std::vector<ScopedHandle>()); + size_t payload_interface_id_count); // Constructs a new serialized Message object from an existing // ScopedMessageHandle; e.g., one read from a message pipe. @@ -151,8 +150,8 @@ // Attaches handles to this Message. Note that this requires the underlying // message object to be reallocated and the payload to be copied into a new - // buffer. - void AttachHandles(std::vector<ScopedHandle> handles); + // buffer. Takes ownership of the contents of |*handles|. + void AttachHandles(std::vector<ScopedHandle>* handles); // Takes a scoped MessageHandle which may be passed to |WriteMessageNew()| for // transmission. Note that this invalidates this Message object, taking
diff --git a/mojo/public/cpp/bindings/tests/connector_unittest.cc b/mojo/public/cpp/bindings/tests/connector_unittest.cc index 63fc1efa..3f5b8f44 100644 --- a/mojo/public/cpp/bindings/tests/connector_unittest.cc +++ b/mojo/public/cpp/bindings/tests/connector_unittest.cc
@@ -103,7 +103,7 @@ const size_t size = strlen(text) + 1; // Plus null terminator. Message message(1, 0, size, 0); memcpy(message.payload_buffer()->Allocate(size), text, size); - message.AttachHandles(std::move(handles)); + message.AttachHandles(&handles); return message; }
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl index 1aaba401..fcf1596 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -35,13 +35,9 @@ {%- macro build_message(struct, input_pattern, struct_display_name, serialization_context, message) -%} {{struct_macros.serialize(struct, struct_display_name, input_pattern, - "params", "%s.payload_buffer()"|format(message), + "params", "(%s)->payload_buffer()"|format(message), serialization_context)}} - ({{serialization_context}})->associated_endpoint_handles.swap( - *{{message}}.mutable_associated_endpoint_handles()); - std::vector<mojo::ScopedHandle> handles_to_attach; - ({{serialization_context}})->handles.Swap(&handles_to_attach); - {{message}}.AttachHandles(std::move(handles_to_attach)); + ({{serialization_context}})->AttachHandlesToMessage({{message}}); {%- endmacro %} {#--- Begin #} @@ -167,7 +163,7 @@ mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse, size, serialization_context.associated_endpoint_count); {{build_message(params_struct, "param_%s", params_description, - "&serialization_context", "message")}} + "&serialization_context", "&message")}} bool result = false; std::unique_ptr<mojo::MessageReceiver> responder( @@ -194,7 +190,7 @@ mojo::Message message({{message_name}}, kFlags, size, serialization_context.associated_endpoint_count); {{build_message(params_struct, "in_%s", params_description, - "&serialization_context", "message")}} + "&serialization_context", "&message")}} {%- if method.response_parameters != None %} std::unique_ptr<mojo::MessageReceiver> responder( @@ -276,7 +272,7 @@ mojo::Message message({{message_name}}, flags, size, serialization_context.associated_endpoint_count); {{build_message(response_params_struct, "in_%s", params_description, - "&serialization_context", "message")}} + "&serialization_context", "&message")}} message.set_request_id(request_id_); ignore_result(responder_->Accept(&message)); // TODO(darin): Accept() returning false indicates a malformed message, and
diff --git a/net/BUILD.gn b/net/BUILD.gn index 4ba004e6..325b891 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1185,8 +1185,6 @@ "quic/core/crypto/curve25519_key_exchange.h", "quic/core/crypto/ephemeral_key_source.h", "quic/core/crypto/key_exchange.h", - "quic/core/crypto/local_strike_register_client.cc", - "quic/core/crypto/local_strike_register_client.h", "quic/core/crypto/null_decrypter.cc", "quic/core/crypto/null_decrypter.h", "quic/core/crypto/null_encrypter.cc", @@ -1212,9 +1210,6 @@ "quic/core/crypto/quic_random.h", "quic/core/crypto/scoped_evp_aead_ctx.cc", "quic/core/crypto/scoped_evp_aead_ctx.h", - "quic/core/crypto/strike_register.cc", - "quic/core/crypto/strike_register.h", - "quic/core/crypto/strike_register_client.h", "quic/core/frames/quic_ack_frame.cc", "quic/core/frames/quic_ack_frame.h", "quic/core/frames/quic_blocked_frame.cc", @@ -3045,8 +3040,6 @@ "quic/platform/impl/quic_test_loopback_impl.h", "quic/test_tools/crypto_test_utils.cc", "quic/test_tools/crypto_test_utils.h", - "quic/test_tools/delayed_verify_strike_register_client.cc", - "quic/test_tools/delayed_verify_strike_register_client.h", "quic/test_tools/failing_proof_source.cc", "quic/test_tools/failing_proof_source.h", "quic/test_tools/fake_proof_source.cc", @@ -4873,7 +4866,6 @@ "quic/core/crypto/crypto_server_test.cc", "quic/core/crypto/crypto_utils_test.cc", "quic/core/crypto/curve25519_key_exchange_test.cc", - "quic/core/crypto/local_strike_register_client_test.cc", "quic/core/crypto/null_decrypter_test.cc", "quic/core/crypto/null_encrypter_test.cc", "quic/core/crypto/p256_key_exchange_test.cc", @@ -4881,7 +4873,6 @@ "quic/core/crypto/quic_crypto_client_config_test.cc", "quic/core/crypto/quic_crypto_server_config_test.cc", "quic/core/crypto/quic_random_test.cc", - "quic/core/crypto/strike_register_test.cc", "quic/core/frames/quic_frames_test.cc", "quic/core/packet_number_indexed_queue_test.cc", "quic/core/quic_alarm_test.cc",
diff --git a/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc b/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc index ea69e90..d3e4d1e5 100644 --- a/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc +++ b/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
@@ -407,7 +407,7 @@ kDefaultServerHostName, Perspective::IS_CLIENT), server_maker_(GetParam(), - GetPeerInMemoryConnectionId(connection_id_), + connection_id_, &clock_, kDefaultServerHostName, Perspective::IS_SERVER),
diff --git a/net/quic/chromium/quic_http_stream_test.cc b/net/quic/chromium/quic_http_stream_test.cc index 9e48dc9b..5af59cc 100644 --- a/net/quic/chromium/quic_http_stream_test.cc +++ b/net/quic/chromium/quic_http_stream_test.cc
@@ -193,7 +193,7 @@ kDefaultServerHostName, Perspective::IS_CLIENT), server_maker_(GetParam(), - GetPeerInMemoryConnectionId(connection_id_), + connection_id_, &clock_, kDefaultServerHostName, Perspective::IS_SERVER),
diff --git a/net/quic/core/congestion_control/bbr_sender.cc b/net/quic/core/congestion_control/bbr_sender.cc index 0d40c3f..fb02690 100644 --- a/net/quic/core/congestion_control/bbr_sender.cc +++ b/net/quic/core/congestion_control/bbr_sender.cc
@@ -555,26 +555,8 @@ // Exit recovery if appropriate. if (!has_losses && last_acked_packet > end_recovery_at_) { recovery_state_ = NOT_IN_RECOVERY; - return; } - if (!FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation) { - return; - } - - // Use "single round in conservation" approach outside of PROBE_BW. - if (mode_ != PROBE_BW) { - return; - } - - // Switch between conservation and growth depending on position in the - // gain cycle. - if (cycle_current_offset_ == 0 || - cycle_current_offset_ == kGainCycleLength - 1) { - recovery_state_ = GROWTH; - } else { - recovery_state_ = CONSERVATION; - } break; } }
diff --git a/net/quic/core/congestion_control/bbr_sender_test.cc b/net/quic/core/congestion_control/bbr_sender_test.cc index cad6186c..770169f 100644 --- a/net/quic/core/congestion_control/bbr_sender_test.cc +++ b/net/quic/core/congestion_control/bbr_sender_test.cc
@@ -82,19 +82,18 @@ "Receiver", "BBR sender", Perspective::IS_SERVER, - /*connection_id=*/GetPeerInMemoryConnectionId(42)), + /*connection_id=*/42), competing_receiver_(&simulator_, "Competing receiver", "Competing sender", Perspective::IS_SERVER, - /*connection_id=*/GetPeerInMemoryConnectionId(43)), + /*connection_id=*/43), receiver_multiplexer_("Receiver multiplexer", {&receiver_, &competing_receiver_}) { // These will be changed by the appropriate tests as necessary. FLAGS_quic_reloadable_flag_quic_bbr_slow_recent_delivery = false; FLAGS_quic_reloadable_flag_quic_bbr_add_tso_cwnd = false; - FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation = true; FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation2 = true; rtt_stats_ = bbr_sender_.connection()->sent_packet_manager().GetRttStats(); @@ -443,13 +442,8 @@ timeout); ASSERT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode); - if (FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation) { - ASSERT_EQ(BbrSender::CONSERVATION, - sender_->ExportDebugState().recovery_state); - } else { - ASSERT_EQ(BbrSender::NOT_IN_RECOVERY, - sender_->ExportDebugState().recovery_state); - } + ASSERT_EQ(BbrSender::NOT_IN_RECOVERY, + sender_->ExportDebugState().recovery_state); ASSERT_TRUE(simulator_result); }
diff --git a/net/quic/core/congestion_control/send_algorithm_interface.cc b/net/quic/core/congestion_control/send_algorithm_interface.cc index 385d46ed..c0d3bb5 100644 --- a/net/quic/core/congestion_control/send_algorithm_interface.cc +++ b/net/quic/core/congestion_control/send_algorithm_interface.cc
@@ -29,13 +29,9 @@ QuicPacketCount max_congestion_window = kDefaultMaxCongestionWindowPackets; switch (congestion_control_type) { case kBBR: - if (FLAGS_quic_reloadable_flag_quic_allow_new_bbr) { - return new BbrSender(rtt_stats, unacked_packets, - initial_congestion_window, max_congestion_window, - random); - } - // Fall back to CUBIC if BBR is disabled. - // FALLTHROUGH_INTENDED + return new BbrSender(rtt_stats, unacked_packets, + initial_congestion_window, max_congestion_window, + random); case kPCC: if (FLAGS_quic_reloadable_flag_quic_enable_pcc) { QUIC_FLAG_COUNT(quic_reloadable_flag_quic_enable_pcc);
diff --git a/net/quic/core/congestion_control/send_algorithm_test.cc b/net/quic/core/congestion_control/send_algorithm_test.cc index 166cad36..4eff9d9ff 100644 --- a/net/quic/core/congestion_control/send_algorithm_test.cc +++ b/net/quic/core/congestion_control/send_algorithm_test.cc
@@ -193,7 +193,7 @@ "Receiver", "QUIC sender", Perspective::IS_SERVER, - net::test::GetPeerInMemoryConnectionId(42)) { + 42) { FLAGS_quic_reloadable_flag_quic_fix_cubic_convex_mode = true; FLAGS_quic_reloadable_flag_quic_fix_cubic_bytes_quantization = true; FLAGS_quic_reloadable_flag_quic_fix_beta_last_max = true;
diff --git a/net/quic/core/crypto/crypto_handshake_message.cc b/net/quic/core/crypto/crypto_handshake_message.cc index 0d0813a..d5dee25 100644 --- a/net/quic/core/crypto/crypto_handshake_message.cc +++ b/net/quic/core/crypto/crypto_handshake_message.cc
@@ -251,9 +251,7 @@ if (it->second.size() == 8) { uint64_t value; memcpy(&value, it->second.data(), sizeof(value)); - if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)) { - value = QuicEndian::NetToHost64(value); - } + value = QuicEndian::NetToHost64(value); ret += QuicTextUtils::Uint64ToString(value); done = true; }
diff --git a/net/quic/core/crypto/crypto_server_test.cc b/net/quic/core/crypto/crypto_server_test.cc index 1ca1e1e..1da1384dc 100644 --- a/net/quic/core/crypto/crypto_server_test.cc +++ b/net/quic/core/crypto/crypto_server_test.cc
@@ -24,7 +24,6 @@ #include "net/quic/platform/api/quic_test.h" #include "net/quic/platform/api/quic_text_utils.h" #include "net/quic/test_tools/crypto_test_utils.h" -#include "net/quic/test_tools/delayed_verify_strike_register_client.h" #include "net/quic/test_tools/failing_proof_source.h" #include "net/quic/test_tools/mock_clock.h" #include "net/quic/test_tools/mock_random.h" @@ -361,11 +360,8 @@ } else { ASSERT_EQ(QUIC_NO_ERROR, out_.GetUint64(kRCID, &server_designated_connection_id)); - if (QuicUtils::IsConnectionIdWireFormatBigEndian( - Perspective::IS_SERVER)) { - server_designated_connection_id = - QuicEndian::NetToHost64(server_designated_connection_id); - } + server_designated_connection_id = + QuicEndian::NetToHost64(server_designated_connection_id); EXPECT_EQ(rand_for_id_generation_.RandUint64(), server_designated_connection_id); }
diff --git a/net/quic/core/crypto/local_strike_register_client.cc b/net/quic/core/crypto/local_strike_register_client.cc deleted file mode 100644 index d0467f9..0000000 --- a/net/quic/core/crypto/local_strike_register_client.cc +++ /dev/null
@@ -1,51 +0,0 @@ -// Copyright 2013 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 "net/quic/core/crypto/local_strike_register_client.h" - -#include "net/quic/core/crypto/crypto_protocol.h" - -using std::string; - -namespace net { - -LocalStrikeRegisterClient::LocalStrikeRegisterClient( - unsigned max_entries, - uint32_t current_time_external, - uint32_t window_secs, - const uint8_t orbit[8], - StrikeRegister::StartupType startup) - : strike_register_(max_entries, - current_time_external, - window_secs, - orbit, - startup) {} - -bool LocalStrikeRegisterClient::IsKnownOrbit(QuicStringPiece orbit) const { - QuicWriterMutexLock lock(&m_); - if (orbit.length() != kOrbitSize) { - return false; - } - return memcmp(orbit.data(), strike_register_.orbit(), kOrbitSize) == 0; -} - -void LocalStrikeRegisterClient::VerifyNonceIsValidAndUnique( - QuicStringPiece nonce, - QuicWallTime now, - ResultCallback* cb) { - InsertStatus nonce_error; - if (nonce.length() != kNonceSize) { - nonce_error = NONCE_INVALID_FAILURE; - } else { - QuicWriterMutexLock lock(&m_); - nonce_error = - strike_register_.Insert(reinterpret_cast<const uint8_t*>(nonce.data()), - static_cast<uint32_t>(now.ToUNIXSeconds())); - } - - // m_ must not be held when the ResultCallback runs. - cb->Run((nonce_error == NONCE_OK), nonce_error); -} - -} // namespace net
diff --git a/net/quic/core/crypto/local_strike_register_client.h b/net/quic/core/crypto/local_strike_register_client.h deleted file mode 100644 index 315c415..0000000 --- a/net/quic/core/crypto/local_strike_register_client.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2013 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. - -#ifndef NET_QUIC_CORE_CRYPTO_LOCAL_STRIKE_REGISTER_CLIENT_H_ -#define NET_QUIC_CORE_CRYPTO_LOCAL_STRIKE_REGISTER_CLIENT_H_ - -#include <cstdint> - -#include "base/macros.h" -#include "net/quic/core/crypto/strike_register.h" -#include "net/quic/core/crypto/strike_register_client.h" -#include "net/quic/core/quic_time.h" -#include "net/quic/platform/api/quic_export.h" -#include "net/quic/platform/api/quic_mutex.h" -#include "net/quic/platform/api/quic_string_piece.h" - -namespace net { - -// StrikeRegisterClient implementation that wraps a local in-memory -// strike register. -class QUIC_EXPORT_PRIVATE LocalStrikeRegisterClient - : public StrikeRegisterClient { - public: - LocalStrikeRegisterClient(unsigned max_entries, - uint32_t current_time_external, - uint32_t window_secs, - const uint8_t orbit[8], - StrikeRegister::StartupType startup); - - bool IsKnownOrbit(QuicStringPiece orbit) const override; - void VerifyNonceIsValidAndUnique(QuicStringPiece nonce, - QuicWallTime now, - ResultCallback* cb) override; - - private: - mutable QuicMutex m_; - StrikeRegister strike_register_ GUARDED_BY(m_); - - DISALLOW_COPY_AND_ASSIGN(LocalStrikeRegisterClient); -}; - -} // namespace net - -#endif // NET_QUIC_CORE_CRYPTO_LOCAL_STRIKE_REGISTER_CLIENT_H_
diff --git a/net/quic/core/crypto/local_strike_register_client_test.cc b/net/quic/core/crypto/local_strike_register_client_test.cc deleted file mode 100644 index 79fa94f..0000000 --- a/net/quic/core/crypto/local_strike_register_client_test.cc +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2013 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 "net/quic/core/crypto/local_strike_register_client.h" - -#include <memory> - -#include "base/macros.h" -#include "base/sys_byteorder.h" -#include "net/quic/core/crypto/crypto_protocol.h" -#include "net/quic/core/quic_time.h" -#include "net/quic/platform/api/quic_str_cat.h" -#include "net/quic/platform/api/quic_test.h" - -using std::string; - -namespace net { -namespace test { -namespace { - -class RecordResultCallback : public StrikeRegisterClient::ResultCallback { - public: - // RecordResultCallback stores the argument to RunImpl in - // |*saved_value| and sets |*called| to true. The callback is self - // deleting. - RecordResultCallback(bool* called, - bool* saved_value, - InsertStatus* saved_nonce_error) - : called_(called), - saved_value_(saved_value), - saved_nonce_error_(saved_nonce_error) { - *called_ = false; - } - - protected: - void RunImpl(bool nonce_is_valid_and_unique, - InsertStatus nonce_error) override { - *called_ = true; - *saved_value_ = nonce_is_valid_and_unique; - *saved_nonce_error_ = nonce_error; - } - - private: - bool* called_; - bool* saved_value_; - InsertStatus* saved_nonce_error_; - - DISALLOW_COPY_AND_ASSIGN(RecordResultCallback); -}; - -const uint8_t kOrbit[] = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0"; -const uint32_t kCurrentTimeExternalSecs = 12345678; -size_t kMaxEntries = 100; -uint32_t kWindowSecs = 60; - -class LocalStrikeRegisterClientTest : public QuicTest { - protected: - LocalStrikeRegisterClientTest() {} - - void SetUp() override { - strike_register_.reset(new LocalStrikeRegisterClient( - kMaxEntries, kCurrentTimeExternalSecs, kWindowSecs, kOrbit, - StrikeRegister::NO_STARTUP_PERIOD_NEEDED)); - } - - std::unique_ptr<LocalStrikeRegisterClient> strike_register_; -}; - -TEST_F(LocalStrikeRegisterClientTest, CheckOrbit) { - EXPECT_TRUE(strike_register_->IsKnownOrbit( - QuicStringPiece(reinterpret_cast<const char*>(kOrbit), kOrbitSize))); - EXPECT_FALSE(strike_register_->IsKnownOrbit( - QuicStringPiece(reinterpret_cast<const char*>(kOrbit), kOrbitSize - 1))); - EXPECT_FALSE(strike_register_->IsKnownOrbit( - QuicStringPiece(reinterpret_cast<const char*>(kOrbit), kOrbitSize + 1))); - EXPECT_FALSE(strike_register_->IsKnownOrbit( - QuicStringPiece(reinterpret_cast<const char*>(kOrbit) + 1, kOrbitSize))); -} - -TEST_F(LocalStrikeRegisterClientTest, IncorrectNonceLength) { - string valid_nonce; - uint32_t norder = base::HostToNet32(kCurrentTimeExternalSecs); - valid_nonce.assign(reinterpret_cast<const char*>(&norder), sizeof(norder)); - valid_nonce = QuicStrCat( - valid_nonce, string(reinterpret_cast<const char*>(kOrbit), kOrbitSize), - string(20, '\x17')); // 20 'random' bytes. - - { - // Validation fails if you remove a byte from the nonce. - bool called = false; - bool is_valid = false; - InsertStatus nonce_error = NONCE_UNKNOWN_FAILURE; - string short_nonce = valid_nonce.substr(0, valid_nonce.length() - 1); - strike_register_->VerifyNonceIsValidAndUnique( - short_nonce, QuicWallTime::FromUNIXSeconds(kCurrentTimeExternalSecs), - new RecordResultCallback(&called, &is_valid, &nonce_error)); - EXPECT_TRUE(called); - EXPECT_FALSE(is_valid); - EXPECT_EQ(NONCE_INVALID_FAILURE, nonce_error); - } - - { - // Validation fails if you add a byte to the nonce. - bool called = false; - bool is_valid = false; - InsertStatus nonce_error = NONCE_UNKNOWN_FAILURE; - string long_nonce = QuicStrCat(valid_nonce, "a"); - strike_register_->VerifyNonceIsValidAndUnique( - long_nonce, QuicWallTime::FromUNIXSeconds(kCurrentTimeExternalSecs), - new RecordResultCallback(&called, &is_valid, &nonce_error)); - EXPECT_TRUE(called); - EXPECT_FALSE(is_valid); - EXPECT_EQ(NONCE_INVALID_FAILURE, nonce_error); - } - - { - // Verify that the base nonce validates was valid. - bool called = false; - bool is_valid = false; - InsertStatus nonce_error = NONCE_UNKNOWN_FAILURE; - strike_register_->VerifyNonceIsValidAndUnique( - valid_nonce, QuicWallTime::FromUNIXSeconds(kCurrentTimeExternalSecs), - new RecordResultCallback(&called, &is_valid, &nonce_error)); - EXPECT_TRUE(called); - EXPECT_TRUE(is_valid); - EXPECT_EQ(NONCE_OK, nonce_error); - } -} - -} // namespace -} // namespace test -} // namespace net
diff --git a/net/quic/core/crypto/quic_crypto_client_config.cc b/net/quic/core/crypto/quic_crypto_client_config.cc index 460a618..8317145 100644 --- a/net/quic/core/crypto/quic_crypto_client_config.cc +++ b/net/quic/core/crypto/quic_crypto_client_config.cc
@@ -507,9 +507,7 @@ CryptoHandshakeMessage* out, string* error_details) const { DCHECK(error_details != nullptr); - if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_CLIENT)) { - connection_id = QuicEndian::HostToNet64(connection_id); - } + connection_id = QuicEndian::HostToNet64(connection_id); FillInchoateClientHello(server_id, preferred_version, cached, rand, /* demand_x509_proof= */ true, out_params, out); @@ -825,9 +823,7 @@ *error_details = "Missing kRCID"; return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND; } - if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_CLIENT)) { - connection_id = QuicEndian::NetToHost64(connection_id); - } + connection_id = QuicEndian::NetToHost64(connection_id); cached->add_server_designated_connection_id(connection_id); if (!nonce.empty()) { cached->add_server_nonce(nonce.as_string());
diff --git a/net/quic/core/crypto/quic_crypto_client_config_test.cc b/net/quic/core/crypto/quic_crypto_client_config_test.cc index 7ab73aa..a9490e13 100644 --- a/net/quic/core/crypto/quic_crypto_client_config_test.cc +++ b/net/quic/core/crypto/quic_crypto_client_config_test.cc
@@ -538,9 +538,7 @@ AllSupportedVersions().front(), "", &cached, out_params, &error)); EXPECT_TRUE(cached.has_server_designated_connection_id()); - EXPECT_EQ(QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_CLIENT) - ? QuicEndian::NetToHost64(kConnectionId) - : kConnectionId, + EXPECT_EQ(QuicEndian::NetToHost64(kConnectionId), cached.GetNextServerDesignatedConnectionId()); EXPECT_EQ(server_nonce, cached.GetNextServerNonce()); }
diff --git a/net/quic/core/crypto/quic_crypto_server_config.cc b/net/quic/core/crypto/quic_crypto_server_config.cc index 02446b6..0f7ea499 100644 --- a/net/quic/core/crypto/quic_crypto_server_config.cc +++ b/net/quic/core/crypto/quic_crypto_server_config.cc
@@ -742,9 +742,7 @@ const QuicReferenceCountedPointer<Config>& requested_config, const QuicReferenceCountedPointer<Config>& primary_config, std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const { - if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_SERVER)) { - connection_id = QuicEndian::HostToNet64(connection_id); - } + connection_id = QuicEndian::HostToNet64(connection_id); ProcessClientHelloHelper helper(&done_cb); @@ -1470,11 +1468,8 @@ << "with server-designated connection ID " << server_designated_connection_id; out->set_tag(kSREJ); - if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_SERVER)) { - server_designated_connection_id = - QuicEndian::HostToNet64(server_designated_connection_id); - } - out->SetValue(kRCID, server_designated_connection_id); + out->SetValue(kRCID, + QuicEndian::HostToNet64(server_designated_connection_id)); } else { out->set_tag(kREJ); }
diff --git a/net/quic/core/crypto/strike_register.cc b/net/quic/core/crypto/strike_register.cc deleted file mode 100644 index b5c4e937..0000000 --- a/net/quic/core/crypto/strike_register.cc +++ /dev/null
@@ -1,516 +0,0 @@ -// Copyright (c) 2013 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 "net/quic/core/crypto/strike_register.h" - -#include <algorithm> -#include <limits> - -#include "net/quic/platform/api/quic_logging.h" - -namespace net { - -namespace { - -uint32_t GetInitialHorizon(uint32_t current_time_internal, - uint32_t window_secs, - StrikeRegister::StartupType startup) { - if (startup == StrikeRegister::DENY_REQUESTS_AT_STARTUP) { - // The horizon is initially set |window_secs| into the future because, if - // we just crashed, then we may have accepted nonces in the span - // [current_time...current_time+window_secs] and so we conservatively - // reject the whole timespan unless |startup| tells us otherwise. - return current_time_internal + window_secs + 1; - } else { // startup == StrikeRegister::NO_STARTUP_PERIOD_NEEDED - // The orbit can be assumed to be globally unique. Use a horizon - // in the past. - return 0; - } -} - -} // namespace - -// static -const uint32_t StrikeRegister::kExternalNodeSize = 24; -// static -const uint32_t StrikeRegister::kNil = (1u << 31) | 1; -// static -const uint32_t StrikeRegister::kExternalFlag = 1 << 23; - -// InternalNode represents a non-leaf node in the critbit tree. See the comment -// in the .h file for details. -class StrikeRegister::InternalNode { - public: - void SetChild(unsigned direction, uint32_t child) { - data_[direction] = (data_[direction] & 0xff) | (child << 8); - } - - void SetCritByte(uint8_t critbyte) { - data_[0] = (data_[0] & 0xffffff00) | critbyte; - } - - void SetOtherBits(uint8_t otherbits) { - data_[1] = (data_[1] & 0xffffff00) | otherbits; - } - - void SetNextPtr(uint32_t next) { data_[0] = next; } - - uint32_t next() const { return data_[0]; } - - uint32_t child(unsigned n) const { return data_[n] >> 8; } - - uint8_t critbyte() const { return static_cast<uint8_t>(data_[0]); } - - uint8_t otherbits() const { return static_cast<uint8_t>(data_[1]); } - - // These bytes are organised thus: - // <24 bits> left child - // <8 bits> crit-byte - // <24 bits> right child - // <8 bits> other-bits - uint32_t data_[2]; -}; - -// kCreationTimeFromInternalEpoch contains the number of seconds between the -// start of the internal epoch and the creation time. This allows us -// to consider times that are before the creation time. -static const uint32_t kCreationTimeFromInternalEpoch = 63115200; // 2 years. - -void StrikeRegister::ValidateStrikeRegisterConfig(unsigned max_entries) { - // We only have 23 bits of index available. - CHECK_LT(max_entries, 1u << 23); - CHECK_GT(max_entries, 1u); // There must be at least two entries. - CHECK_EQ(sizeof(InternalNode), 8u); // in case of compiler changes. -} - -StrikeRegister::StrikeRegister(unsigned max_entries, - uint32_t current_time, - uint32_t window_secs, - const uint8_t orbit[8], - StartupType startup) - : max_entries_(max_entries), - window_secs_(window_secs), - internal_epoch_(current_time > kCreationTimeFromInternalEpoch - ? current_time - kCreationTimeFromInternalEpoch - : 0), - horizon_(GetInitialHorizon(ExternalTimeToInternal(current_time), - window_secs, - startup)) { - memcpy(orbit_, orbit, sizeof(orbit_)); - - ValidateStrikeRegisterConfig(max_entries); - internal_nodes_ = new InternalNode[max_entries]; - external_nodes_.reset(new uint8_t[kExternalNodeSize * max_entries]); - - Reset(); -} - -StrikeRegister::~StrikeRegister() { - delete[] internal_nodes_; -} - -void StrikeRegister::Reset() { - // Thread a free list through all of the internal nodes. - internal_node_free_head_ = 0; - for (unsigned i = 0; i < max_entries_ - 1; i++) { - internal_nodes_[i].SetNextPtr(i + 1); - } - internal_nodes_[max_entries_ - 1].SetNextPtr(kNil); - - // Also thread a free list through the external nodes. - external_node_free_head_ = 0; - for (unsigned i = 0; i < max_entries_ - 1; i++) { - external_node_next_ptr(i) = i + 1; - } - external_node_next_ptr(max_entries_ - 1) = kNil; - - // This is the root of the tree. - internal_node_head_ = kNil; -} - -InsertStatus StrikeRegister::Insert(const uint8_t nonce[32], - uint32_t current_time_external) { - // Make space for the insertion if the strike register is full. - while (external_node_free_head_ == kNil || internal_node_free_head_ == kNil) { - DropOldestNode(); - } - - const uint32_t current_time = ExternalTimeToInternal(current_time_external); - - // Check to see if the orbit is correct. - if (memcmp(nonce + sizeof(current_time), orbit_, sizeof(orbit_))) { - return NONCE_INVALID_ORBIT_FAILURE; - } - - const uint32_t nonce_time = ExternalTimeToInternal(TimeFromBytes(nonce)); - - // Check that the timestamp is in the valid range. - std::pair<uint32_t, uint32_t> valid_range = - StrikeRegister::GetValidRange(current_time); - if (nonce_time < valid_range.first || nonce_time > valid_range.second) { - return NONCE_INVALID_TIME_FAILURE; - } - - // We strip the orbit out of the nonce. - uint8_t value[24]; - memcpy(value, nonce, sizeof(nonce_time)); - memcpy(value + sizeof(nonce_time), - nonce + sizeof(nonce_time) + sizeof(orbit_), - sizeof(value) - sizeof(nonce_time)); - - // Find the best match to |value| in the crit-bit tree. The best match is - // simply the value which /could/ match |value|, if any does, so we still - // need a memcmp to check. - uint32_t best_match_index = BestMatch(value); - if (best_match_index == kNil) { - // Empty tree. Just insert the new value at the root. - uint32_t index = GetFreeExternalNode(); - memcpy(external_node(index), value, sizeof(value)); - internal_node_head_ = (index | kExternalFlag) << 8; - DCHECK_LE(horizon_, nonce_time); - return NONCE_OK; - } - - const uint8_t* best_match = external_node(best_match_index); - if (memcmp(best_match, value, sizeof(value)) == 0) { - // We found the value in the tree. - return NONCE_NOT_UNIQUE_FAILURE; - } - - // We are going to insert a new entry into the tree, so get the nodes now. - uint32_t internal_node_index = GetFreeInternalNode(); - uint32_t external_node_index = GetFreeExternalNode(); - - // If we just evicted the best match, then we have to try and match again. - // We know that we didn't just empty the tree because we require that - // max_entries_ >= 2. Also, we know that it doesn't match because, if it - // did, it would have been returned previously. - if (external_node_index == best_match_index) { - best_match_index = BestMatch(value); - best_match = external_node(best_match_index); - } - - // Now we need to find the first bit where we differ from |best_match|. - uint8_t differing_byte; - uint8_t new_other_bits; - for (differing_byte = 0; differing_byte < arraysize(value); - differing_byte++) { - new_other_bits = value[differing_byte] ^ best_match[differing_byte]; - if (new_other_bits) { - break; - } - } - - // Once we have the XOR the of first differing byte in new_other_bits we need - // to find the most significant differing bit. We could do this with a simple - // for loop, testing bits 7..0. Instead we fold the bits so that we end up - // with a byte where all the bits below the most significant one, are set. - new_other_bits |= new_other_bits >> 1; - new_other_bits |= new_other_bits >> 2; - new_other_bits |= new_other_bits >> 4; - // Now this bit trick results in all the bits set, except the original - // most-significant one. - new_other_bits = (new_other_bits & ~(new_other_bits >> 1)) ^ 255; - - // Consider the effect of ORing against |new_other_bits|. If |value| did not - // have the critical bit set, the result is the same as |new_other_bits|. If - // it did, the result is all ones. - - unsigned newdirection; - if ((new_other_bits | value[differing_byte]) == 0xff) { - newdirection = 1; - } else { - newdirection = 0; - } - - memcpy(external_node(external_node_index), value, sizeof(value)); - InternalNode* inode = &internal_nodes_[internal_node_index]; - - inode->SetChild(newdirection, external_node_index | kExternalFlag); - inode->SetCritByte(differing_byte); - inode->SetOtherBits(new_other_bits); - - // |where_index| is a pointer to the uint32_t which needs to be updated in - // order to insert the new internal node into the tree. The internal nodes - // store the child indexes in the top 24-bits of a 32-bit word and, to keep - // the code simple, we define that |internal_node_head_| is organised the - // same way. - DCHECK_EQ(internal_node_head_ & 0xff, 0u); - uint32_t* where_index = &internal_node_head_; - while (((*where_index >> 8) & kExternalFlag) == 0) { - InternalNode* node = &internal_nodes_[*where_index >> 8]; - if (node->critbyte() > differing_byte) { - break; - } - if (node->critbyte() == differing_byte && - node->otherbits() > new_other_bits) { - break; - } - if (node->critbyte() == differing_byte && - node->otherbits() == new_other_bits) { - CHECK(false); - } - - uint8_t c = value[node->critbyte()]; - const int direction = - (1 + static_cast<unsigned>(node->otherbits() | c)) >> 8; - where_index = &node->data_[direction]; - } - - inode->SetChild(newdirection ^ 1, *where_index >> 8); - *where_index = (*where_index & 0xff) | (internal_node_index << 8); - - DCHECK_LE(horizon_, nonce_time); - return NONCE_OK; -} - -const uint8_t* StrikeRegister::orbit() const { - return orbit_; -} - -uint32_t StrikeRegister::GetCurrentValidWindowSecs( - uint32_t current_time_external) const { - uint32_t current_time = ExternalTimeToInternal(current_time_external); - std::pair<uint32_t, uint32_t> valid_range = - StrikeRegister::GetValidRange(current_time); - if (valid_range.second >= valid_range.first) { - return valid_range.second - current_time + 1; - } else { - return 0; - } -} - -void StrikeRegister::Validate() { - std::set<uint32_t> free_internal_nodes; - for (uint32_t i = internal_node_free_head_; i != kNil; - i = internal_nodes_[i].next()) { - CHECK_LT(i, max_entries_); - CHECK_EQ(free_internal_nodes.count(i), 0u); - free_internal_nodes.insert(i); - } - - std::set<uint32_t> free_external_nodes; - for (uint32_t i = external_node_free_head_; i != kNil; - i = external_node_next_ptr(i)) { - CHECK_LT(i, max_entries_); - CHECK_EQ(free_external_nodes.count(i), 0u); - free_external_nodes.insert(i); - } - - std::set<uint32_t> used_external_nodes; - std::set<uint32_t> used_internal_nodes; - - if (internal_node_head_ != kNil && - ((internal_node_head_ >> 8) & kExternalFlag) == 0) { - std::vector<std::pair<unsigned, bool>> bits; - ValidateTree(internal_node_head_ >> 8, -1, bits, free_internal_nodes, - free_external_nodes, &used_internal_nodes, - &used_external_nodes); - } -} - -// static -uint32_t StrikeRegister::TimeFromBytes(const uint8_t d[4]) { - return static_cast<uint32_t>(d[0]) << 24 | static_cast<uint32_t>(d[1]) << 16 | - static_cast<uint32_t>(d[2]) << 8 | static_cast<uint32_t>(d[3]); -} - -std::pair<uint32_t, uint32_t> StrikeRegister::GetValidRange( - uint32_t current_time_internal) const { - if (current_time_internal < horizon_) { - // Empty valid range. - return std::make_pair(std::numeric_limits<uint32_t>::max(), 0); - } - - uint32_t lower_bound; - if (current_time_internal >= window_secs_) { - lower_bound = std::max(horizon_, current_time_internal - window_secs_); - } else { - lower_bound = horizon_; - } - - // Also limit the upper range based on horizon_. This makes the - // strike register reject inserts that are far in the future and - // would consume strike register resources for a long time. This - // allows the strike server to degrade optimally in cases where the - // insert rate exceeds |max_entries_ / (2 * window_secs_)| entries - // per second. - uint32_t upper_bound = - current_time_internal + - std::min(current_time_internal - horizon_, window_secs_); - - return std::make_pair(lower_bound, upper_bound); -} - -uint32_t StrikeRegister::ExternalTimeToInternal(uint32_t external_time) const { - return external_time - internal_epoch_; -} - -uint32_t StrikeRegister::BestMatch(const uint8_t v[24]) const { - if (internal_node_head_ == kNil) { - return kNil; - } - - uint32_t next = internal_node_head_ >> 8; - while ((next & kExternalFlag) == 0) { - InternalNode* node = &internal_nodes_[next]; - uint8_t b = v[node->critbyte()]; - unsigned direction = - (1 + static_cast<unsigned>(node->otherbits() | b)) >> 8; - next = node->child(direction); - } - - return next & ~kExternalFlag; -} - -uint32_t& StrikeRegister::external_node_next_ptr(unsigned i) { - return *reinterpret_cast<uint32_t*>(&external_nodes_[i * kExternalNodeSize]); -} - -uint8_t* StrikeRegister::external_node(unsigned i) { - return &external_nodes_[i * kExternalNodeSize]; -} - -uint32_t StrikeRegister::GetFreeExternalNode() { - uint32_t index = external_node_free_head_; - DCHECK(index != kNil); - external_node_free_head_ = external_node_next_ptr(index); - return index; -} - -uint32_t StrikeRegister::GetFreeInternalNode() { - uint32_t index = internal_node_free_head_; - DCHECK(index != kNil); - internal_node_free_head_ = internal_nodes_[index].next(); - return index; -} - -void StrikeRegister::DropOldestNode() { - // DropOldestNode should never be called on an empty tree. - DCHECK(internal_node_head_ != kNil); - - // An internal node in a crit-bit tree always has exactly two children. - // This means that, if we are removing an external node (which is one of - // those children), then we also need to remove an internal node. In order - // to do that we keep pointers to the parent (wherep) and grandparent - // (whereq) when walking down the tree. - - uint32_t p = internal_node_head_ >> 8, *wherep = &internal_node_head_, - *whereq = nullptr; - while ((p & kExternalFlag) == 0) { - whereq = wherep; - InternalNode* inode = &internal_nodes_[p]; - // We always go left, towards the smallest element, exploiting the fact - // that the timestamp is big-endian and at the start of the value. - wherep = &inode->data_[0]; - p = (*wherep) >> 8; - } - - const uint32_t ext_index = p & ~kExternalFlag; - const uint8_t* ext_node = external_node(ext_index); - uint32_t new_horizon = ExternalTimeToInternal(TimeFromBytes(ext_node)) + 1; - DCHECK_LE(horizon_, new_horizon); - horizon_ = new_horizon; - - if (!whereq) { - // We are removing the last element in a tree. - internal_node_head_ = kNil; - FreeExternalNode(ext_index); - return; - } - - // |wherep| points to the left child pointer in the parent so we can add - // one and dereference to get the right child. - const uint32_t other_child = wherep[1]; - FreeInternalNode((*whereq) >> 8); - *whereq = (*whereq & 0xff) | (other_child & 0xffffff00); - FreeExternalNode(ext_index); -} - -void StrikeRegister::FreeExternalNode(uint32_t index) { - external_node_next_ptr(index) = external_node_free_head_; - external_node_free_head_ = index; -} - -void StrikeRegister::FreeInternalNode(uint32_t index) { - internal_nodes_[index].SetNextPtr(internal_node_free_head_); - internal_node_free_head_ = index; -} - -void StrikeRegister::ValidateTree( - uint32_t internal_node, - int last_bit, - const std::vector<std::pair<unsigned, bool>>& bits, - const std::set<uint32_t>& free_internal_nodes, - const std::set<uint32_t>& free_external_nodes, - std::set<uint32_t>* used_internal_nodes, - std::set<uint32_t>* used_external_nodes) { - CHECK_LT(internal_node, max_entries_); - const InternalNode* i = &internal_nodes_[internal_node]; - unsigned bit = 0; - switch (i->otherbits()) { - case 0xff & ~(1 << 7): - bit = 0; - break; - case 0xff & ~(1 << 6): - bit = 1; - break; - case 0xff & ~(1 << 5): - bit = 2; - break; - case 0xff & ~(1 << 4): - bit = 3; - break; - case 0xff & ~(1 << 3): - bit = 4; - break; - case 0xff & ~(1 << 2): - bit = 5; - break; - case 0xff & ~(1 << 1): - bit = 6; - break; - case 0xff & ~1: - bit = 7; - break; - default: - CHECK(false); - } - - bit += 8 * i->critbyte(); - if (last_bit > -1) { - CHECK_GT(bit, static_cast<unsigned>(last_bit)); - } - - CHECK_EQ(free_internal_nodes.count(internal_node), 0u); - - for (unsigned child = 0; child < 2; child++) { - if (i->child(child) & kExternalFlag) { - uint32_t ext = i->child(child) & ~kExternalFlag; - CHECK_EQ(free_external_nodes.count(ext), 0u); - CHECK_EQ(used_external_nodes->count(ext), 0u); - used_external_nodes->insert(ext); - const uint8_t* bytes = external_node(ext); - for (const std::pair<unsigned, bool>& pair : bits) { - unsigned byte = pair.first / 8; - DCHECK_LE(byte, 0xffu); - unsigned bit_new = pair.first % 8; - static const uint8_t kMasks[8] = {0x80, 0x40, 0x20, 0x10, - 0x08, 0x04, 0x02, 0x01}; - CHECK_EQ((bytes[byte] & kMasks[bit_new]) != 0, pair.second); - } - } else { - uint32_t inter = i->child(child); - std::vector<std::pair<unsigned, bool>> new_bits(bits); - new_bits.push_back(std::pair<unsigned, bool>(bit, child != 0)); - CHECK_EQ(free_internal_nodes.count(inter), 0u); - CHECK_EQ(used_internal_nodes->count(inter), 0u); - used_internal_nodes->insert(inter); - ValidateTree(inter, bit, bits, free_internal_nodes, free_external_nodes, - used_internal_nodes, used_external_nodes); - } - } -} - -} // namespace net
diff --git a/net/quic/core/crypto/strike_register.h b/net/quic/core/crypto/strike_register.h deleted file mode 100644 index d12ebc2..0000000 --- a/net/quic/core/crypto/strike_register.h +++ /dev/null
@@ -1,222 +0,0 @@ -// Copyright (c) 2013 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. - -#ifndef NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_H_ -#define NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_H_ - -#include <cstdint> -#include <memory> -#include <set> -#include <utility> -#include <vector> - -#include "base/macros.h" -#include "net/quic/platform/api/quic_export.h" - -namespace net { - -// InsertStatus enum values cannot be changed, they need to be stable. -enum InsertStatus { - NONCE_OK = 0, - // The default error value for nonce verification failures from strike - // register (covers old strike registers and unknown failures). - NONCE_UNKNOWN_FAILURE = 1, - // Decrypted nonce had incorrect length. - NONCE_INVALID_FAILURE = 2, - // Nonce is not unique. - NONCE_NOT_UNIQUE_FAILURE = 3, - // Nonce's orbit is invalid or incorrect. - NONCE_INVALID_ORBIT_FAILURE = 4, - // Nonce's timestamp is not in the strike register's valid time range. - NONCE_INVALID_TIME_FAILURE = 5, - // Strike register's RPC call timed out, nonce couldn't be verified. - STRIKE_REGISTER_TIMEOUT = 6, - // Strike register is down, nonce couldn't be verified. - STRIKE_REGISTER_FAILURE = 7, -}; - -// A StrikeRegister is critbit tree which stores a set of observed nonces. -// We use a critbit tree because: -// 1) It's immune to algorithmic complexity attacks. If we had used a hash -// tree, an attacker could send us a series of values which stretch out one -// of the hash chains, causing us to do much more work than normal. -// 2) We can write it to use a fixed block of memory: avoiding fragmentation -// issues and so forth. (We might be able to do that with the STL -// algorithms and a custom allocator, but I don't want to go there.) -// 3) It's simple (compared to balanced binary trees) and doesn't involve -// bouncing nearly as many cache lines around. -// 4) It allows us to query for the oldest element in log(n) time. -// -// This code is based on djb's public domain critbit tree from qhasm. -// -// A critbit tree has external and internal nodes. External nodes are just the -// nonce values (which are stored with internal times, see below, and without -// the orbit values included). Internal nodes contain the bit number at which -// the tree is branching and exactly two children. The critical bit is stored -// as a byte number and a byte (|otherbits|) which has all the bits set -// /except/ the one in question. -// -// Internal nodes have exactly two children: an internal node with only a -// single child would be useless. -// -// The branching bit number (considering the MSB to be the 1st bit) is -// monotonically increasing as you go down the tree. -// -// There are two distinct time representations used. External times are those -// which are exposed to the users of this class. They are expected to be a -// count of the number of seconds since the UNIX epoch. Internal times are a -// count of the number of seconds since a point in time a couple of years -// before the creation time given to the constructor. (See -// |ExternalTimeToInternal|) This avoids having to worry about overflow since -// we assume that no process will run for 130 years. -class QUIC_EXPORT_PRIVATE StrikeRegister { - public: - enum StartupType { - // DENY_REQUESTS_AT_STARTUP is the typical mode for a strike register. - // Because servers can crash and the strike-register memory-based, the - // state of the strike-register may be lost at any time. Thus the previous - // instance of the server may have accepted an nonce with time - // now+window_secs, which was forgotten in the crash. Therefore - // DENY_REQUESTS_AT_STARTUP causes the strike-register to reject all - // requests timestampped before window_secs + the creation time (the - // quiescent period). - DENY_REQUESTS_AT_STARTUP, - // NO_STARTUP_PERIOD_NEEDED indicates that no quiescent period is required. - // This may be because the strike-register is using an orbit randomly - // generated at startup and therefore nonces accepted by the previous - // instance of the strike-register are invalid for that reason. - NO_STARTUP_PERIOD_NEEDED, - }; - - // An external node takes 24 bytes as we don't record the orbit. - static const uint32_t kExternalNodeSize; - - // We address the nodes by their index in the array. This means that 0 is a - // valid index. Therefore this is our invalid index. It also has a one bit - // in the LSB position because we tend to store indexes shifted up 8 bits - // and this distinguishes kNil from (kExternalFlag | 0) << 8. - static const uint32_t kNil; - - // Our pointers from internal nodes can either point to an internal or - // external node. We flag the 24th bit to mark a pointer as external. - static const uint32_t kExternalFlag; - - // Allows early validation before a strike register is created. - static void ValidateStrikeRegisterConfig(unsigned max_entries); - - // Construct a new set which can hold, at most, |max_entries| (which must be - // less than 2**23). See the comments around StartupType about initial - // behaviour. Otherwise, all nonces that are outside +/- |window_secs| from - // the current time will be rejected. Additionally, all nonces that have an - // orbit value other than |orbit| will be rejected. - // - // (Note that this code is independent of the actual units of time used, but - // you should use seconds.) - StrikeRegister(unsigned max_entries, - uint32_t current_time_external, - uint32_t window_secs, - const uint8_t orbit[8], - StartupType startup); - - ~StrikeRegister(); - - void Reset(); - - // |Insert| queries to see if |nonce| is - // a) for the wrong orbit - // b) before the current horizon - // c) outside of the valid time window - // d) already in the set of observed nonces - // and returns the failure reason if any of these are true. It is also free to - // return failure reason for other reasons as it's always safe to reject an - // nonce. - // - // nonces are: - // 4 bytes of timestamp (UNIX epoch seconds) - // 8 bytes of orbit value (a cluster id) - // 20 bytes of random data - // - // Otherwise, it inserts |nonce| into the observed set and returns NONCE_OK. - InsertStatus Insert(const uint8_t nonce[32], uint32_t current_time); - - // orbit returns a pointer to the 8-byte orbit value for this - // strike-register. - const uint8_t* orbit() const; - - // Time window for which the strike register has complete information. - uint32_t GetCurrentValidWindowSecs(uint32_t current_time_external) const; - - // This is a debugging aid which checks the tree for sanity. - void Validate(); - - private: - class InternalNode; - - // TimeFromBytes returns a big-endian uint32_t from |d|. - static uint32_t TimeFromBytes(const uint8_t d[4]); - - // Range of internal times for which the strike register has - // complete information. A nonce is within the valid range of the - // strike register if: - // valid_range.first <= nonce_time_internal <= valid_range.second - std::pair<uint32_t, uint32_t> GetValidRange( - uint32_t current_time_internal) const; - - // ExternalTimeToInternal converts an external time value into an internal - // time value using |internal_epoch_|. - uint32_t ExternalTimeToInternal(uint32_t external_time) const; - - // BestMatch returns either kNil, or an external node index which could - // possibly match |v|. - uint32_t BestMatch(const uint8_t v[24]) const; - - // external_node_next_ptr returns the 'next' pointer embedded in external - // node |i|. This is used to thread a free list through the external nodes. - uint32_t& external_node_next_ptr(unsigned i); - - uint8_t* external_node(unsigned i); - - uint32_t GetFreeExternalNode(); - - uint32_t GetFreeInternalNode(); - - // DropOldestNode removes the oldest node in the tree and updates |horizon_| - // accordingly. - void DropOldestNode(); - - void FreeExternalNode(uint32_t index); - - void FreeInternalNode(uint32_t index); - - void ValidateTree(uint32_t internal_node, - int last_bit, - const std::vector<std::pair<unsigned, bool>>& bits, - const std::set<uint32_t>& free_internal_nodes, - const std::set<uint32_t>& free_external_nodes, - std::set<uint32_t>* used_internal_nodes, - std::set<uint32_t>* used_external_nodes); - - const uint32_t max_entries_; - const uint32_t window_secs_; - // internal_epoch_ contains the external time value of the start of internal - // time. - const uint32_t internal_epoch_; - uint8_t orbit_[8]; - // The strike register will reject nonces with internal times < |horizon_| . - uint32_t horizon_; - - uint32_t internal_node_free_head_; - uint32_t external_node_free_head_; - uint32_t internal_node_head_; - // internal_nodes_ can't be a scoped_ptr because the type isn't defined in - // this header. - InternalNode* internal_nodes_; - std::unique_ptr<uint8_t[]> external_nodes_; - - DISALLOW_COPY_AND_ASSIGN(StrikeRegister); -}; - -} // namespace net - -#endif // NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_H_
diff --git a/net/quic/core/crypto/strike_register_client.h b/net/quic/core/crypto/strike_register_client.h deleted file mode 100644 index 06291ae4..0000000 --- a/net/quic/core/crypto/strike_register_client.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2013 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. - -#ifndef NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_CLIENT_H_ -#define NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_CLIENT_H_ - -#include <string> - -#include "base/macros.h" -#include "net/quic/core/crypto/strike_register.h" -#include "net/quic/core/quic_time.h" -#include "net/quic/platform/api/quic_export.h" -#include "net/quic/platform/api/quic_string_piece.h" - -namespace net { - -// Interface implemented by clients that talk to strike registers -// implemented as local or remote services. -class QUIC_EXPORT_PRIVATE StrikeRegisterClient { - public: - // Single use callback that will be invoked once the validation - // operation is complete. - class QUIC_EXPORT_PRIVATE ResultCallback { - public: - ResultCallback() {} - virtual ~ResultCallback() {} - void Run(bool nonce_is_valid_and_unique, InsertStatus nonce_error) { - RunImpl(nonce_is_valid_and_unique, nonce_error); - delete this; - } - - protected: - virtual void RunImpl(bool nonce_is_valid_and_unique, - InsertStatus nonce_error) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(ResultCallback); - }; - - StrikeRegisterClient() {} - virtual ~StrikeRegisterClient() {} - - // Returns true iff the strike register knows about the given orbit. - virtual bool IsKnownOrbit(QuicStringPiece orbit) const = 0; - // Validate a nonce for freshness and uniqueness. - // Will invoke cb->Run(ValidateResponse::nonce_is_valid_and_unique(), - // ValidateResponse::nonce_error()) - // once the asynchronous operation is complete. - virtual void VerifyNonceIsValidAndUnique(QuicStringPiece nonce, - QuicWallTime now, - ResultCallback* cb) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(StrikeRegisterClient); -}; - -} // namespace net - -#endif // NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_CLIENT_H_
diff --git a/net/quic/core/crypto/strike_register_test.cc b/net/quic/core/crypto/strike_register_test.cc deleted file mode 100644 index bcf2ec2..0000000 --- a/net/quic/core/crypto/strike_register_test.cc +++ /dev/null
@@ -1,408 +0,0 @@ -// Copyright (c) 2013 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 "net/quic/core/crypto/strike_register.h" - -#include <cstdint> -#include <memory> -#include <set> -#include <string> - -#include "base/rand_util.h" -#include "net/quic/platform/api/quic_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -namespace { - -using std::string; - -const uint8_t kOrbit[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - -// StrikeRegisterTests don't look at the random bytes so this function can -// simply set the random bytes to 0. -void SetNonce(uint8_t nonce[32], unsigned time, const uint8_t orbit[8]) { - nonce[0] = time >> 24; - nonce[1] = time >> 16; - nonce[2] = time >> 8; - nonce[3] = time; - memcpy(nonce + 4, orbit, 8); - memset(nonce + 12, 0, 20); -} - -class StrikeRegisterTest : public QuicTest {}; - -TEST_F(StrikeRegisterTest, SimpleHorizon) { - // The set must reject values created on or before its own creation time. - StrikeRegister set(10 /* max size */, 1000 /* current time */, - 100 /* window secs */, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP); - uint8_t nonce[32]; - SetNonce(nonce, 999, kOrbit); - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1000)); - SetNonce(nonce, 1000, kOrbit); - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1000)); - - EXPECT_EQ(0u, set.GetCurrentValidWindowSecs(1000 /* current time */)); - EXPECT_EQ(0u, set.GetCurrentValidWindowSecs(1100 /* current time */)); - EXPECT_EQ(1u, set.GetCurrentValidWindowSecs(1101 /* current time */)); - EXPECT_EQ(50u, set.GetCurrentValidWindowSecs(1150 /* current time */)); - EXPECT_EQ(100u, set.GetCurrentValidWindowSecs(1200 /* current time */)); - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1300 /* current time */)); -} - -TEST_F(StrikeRegisterTest, NoStartupMode) { - // Check that a strike register works immediately if NO_STARTUP_PERIOD_NEEDED - // is specified. - StrikeRegister set(10 /* max size */, 1000 /* current time */, - 100 /* window secs */, kOrbit, - StrikeRegister::NO_STARTUP_PERIOD_NEEDED); - uint8_t nonce[32]; - SetNonce(nonce, 1000, kOrbit); - EXPECT_EQ(NONCE_OK, set.Insert(nonce, 1000)); - EXPECT_EQ(NONCE_NOT_UNIQUE_FAILURE, set.Insert(nonce, 1000)); - - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1000 /* current time */)); - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1050 /* current time */)); - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1100 /* current time */)); - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1200 /* current time */)); - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1300 /* current time */)); -} - -TEST_F(StrikeRegisterTest, WindowFuture) { - // The set must reject values outside the window. - StrikeRegister set(10 /* max size */, 1000 /* current time */, - 100 /* window secs */, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP); - uint8_t nonce[32]; - SetNonce(nonce, 1101, kOrbit); - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1000)); - SetNonce(nonce, 999, kOrbit); - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1100)); -} - -TEST_F(StrikeRegisterTest, BadOrbit) { - // The set must reject values with the wrong orbit - StrikeRegister set(10 /* max size */, 1000 /* current time */, - 100 /* window secs */, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP); - uint8_t nonce[32]; - static const uint8_t kBadOrbit[8] = {0, 0, 0, 0, 1, 1, 1, 1}; - SetNonce(nonce, 1101, kBadOrbit); - EXPECT_EQ(NONCE_INVALID_ORBIT_FAILURE, set.Insert(nonce, 1100)); -} - -TEST_F(StrikeRegisterTest, OneValue) { - StrikeRegister set(10 /* max size */, 1000 /* current time */, - 100 /* window secs */, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP); - uint8_t nonce[32]; - SetNonce(nonce, 1101, kOrbit); - EXPECT_EQ(NONCE_OK, set.Insert(nonce, 1101)); -} - -TEST_F(StrikeRegisterTest, RejectDuplicate) { - // The set must reject values with the wrong orbit - StrikeRegister set(10 /* max size */, 1000 /* current time */, - 100 /* window secs */, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP); - uint8_t nonce[32]; - SetNonce(nonce, 1101, kOrbit); - EXPECT_EQ(NONCE_OK, set.Insert(nonce, 1101)); - EXPECT_EQ(NONCE_NOT_UNIQUE_FAILURE, set.Insert(nonce, 1101)); -} - -TEST_F(StrikeRegisterTest, HorizonUpdating) { - StrikeRegister::StartupType startup_types[] = { - StrikeRegister::DENY_REQUESTS_AT_STARTUP, - StrikeRegister::NO_STARTUP_PERIOD_NEEDED}; - - for (size_t type_idx = 0; type_idx < arraysize(startup_types); ++type_idx) { - StrikeRegister set(5 /* max size */, 500 /* current time */, - 100 /* window secs */, kOrbit, startup_types[type_idx]); - uint8_t nonce[6][32]; - for (unsigned i = 0; i < 5; i++) { - SetNonce(nonce[i], 1101 + i, kOrbit); - nonce[i][31] = i; - EXPECT_EQ(NONCE_OK, set.Insert(nonce[i], 1100)); - } - - // Valid window is still equal to |window_secs + 1|. - EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1100)); - - // This should push the oldest value out and force the horizon to - // be updated. - SetNonce(nonce[5], 1110, kOrbit); - EXPECT_EQ(NONCE_OK, set.Insert(nonce[5], 1110)); - // Effective horizon is computed based on the timestamp of the - // value that was pushed out. - EXPECT_EQ(9u, set.GetCurrentValidWindowSecs(1110)); - - SetNonce(nonce[5], 1111, kOrbit); - EXPECT_EQ(NONCE_OK, set.Insert(nonce[5], 1110)); - EXPECT_EQ(8u, set.GetCurrentValidWindowSecs(1110)); - - // This should be behind the horizon now: - SetNonce(nonce[5], 1101, kOrbit); - nonce[5][31] = 10; - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce[5], 1110)); - - // Insert beyond the valid range. - SetNonce(nonce[5], 1117, kOrbit); - nonce[5][31] = 2; - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce[5], 1110)); - - // Insert at the upper valid range. - SetNonce(nonce[5], 1116, kOrbit); - nonce[5][31] = 1; - EXPECT_EQ(NONCE_OK, set.Insert(nonce[5], 1110)); - - // This should be beyond the upper valid range now: - SetNonce(nonce[5], 1116, kOrbit); - nonce[5][31] = 2; - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce[5], 1110)); - } -} - -TEST_F(StrikeRegisterTest, InsertMany) { - StrikeRegister set(5000 /* max size */, 1000 /* current time */, - 500 /* window secs */, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP); - - uint8_t nonce[32]; - SetNonce(nonce, 1101, kOrbit); - for (unsigned i = 0; i < 100000; i++) { - SetNonce(nonce, 1101 + i / 500, kOrbit); - memcpy(nonce + 12, &i, sizeof(i)); - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1100)); - } -} - -// For the following test we create a slow, but simple, version of a -// StrikeRegister. The behaviour of this object is much easier to understand -// than the fully fledged version. We then create a test to show, empirically, -// that the two objects have identical behaviour. - -// A SlowStrikeRegister has the same public interface as a StrikeRegister, but -// is much slower. Hopefully it is also more obviously correct and we can -// empirically test that their behaviours are identical. -class SlowStrikeRegister { - public: - SlowStrikeRegister(unsigned max_entries, - uint32_t current_time, - uint32_t window_secs, - const uint8_t orbit[8]) - : max_entries_(max_entries), - window_secs_(window_secs), - creation_time_(current_time), - horizon_(ExternalTimeToInternal(current_time + window_secs) + 1) { - memcpy(orbit_, orbit, sizeof(orbit_)); - } - - InsertStatus Insert(const uint8_t nonce_bytes[32], - const uint32_t nonce_time_external, - const uint32_t current_time_external) { - if (nonces_.size() == max_entries_) { - DropOldestEntry(); - } - - const uint32_t current_time = ExternalTimeToInternal(current_time_external); - - // Check to see if the orbit is correct. - if (memcmp(nonce_bytes + 4, orbit_, sizeof(orbit_))) { - return NONCE_INVALID_ORBIT_FAILURE; - } - const uint32_t nonce_time = - ExternalTimeToInternal(TimeFromBytes(nonce_bytes)); - EXPECT_EQ(ExternalTimeToInternal(nonce_time_external), nonce_time); - // We have dropped one or more nonces with a time value of |horizon_ - 1|, - // so we have to reject anything with a timestamp less than or - // equal to that. - if (nonce_time < horizon_) { - return NONCE_INVALID_TIME_FAILURE; - } - - // Check that the timestamp is in the current window. - if ((current_time > window_secs_ && - nonce_time < (current_time - window_secs_)) || - nonce_time > (current_time + window_secs_)) { - return NONCE_INVALID_TIME_FAILURE; - } - - std::pair<uint32_t, string> nonce = std::make_pair( - nonce_time, string(reinterpret_cast<const char*>(nonce_bytes), 32)); - - std::set<std::pair<uint32_t, string>>::const_iterator it = - nonces_.find(nonce); - if (it != nonces_.end()) { - return NONCE_NOT_UNIQUE_FAILURE; - } - - nonces_.insert(nonce); - return NONCE_OK; - } - - uint32_t GetCurrentValidWindowSecs( - const uint32_t current_time_external) const { - const uint32_t current_time = ExternalTimeToInternal(current_time_external); - if (horizon_ > current_time) { - return 0; - } - return 1 + std::min(current_time - horizon_, window_secs_); - } - - private: - // TimeFromBytes returns a big-endian uint32_t from |d|. - static uint32_t TimeFromBytes(const uint8_t d[4]) { - return static_cast<uint32_t>(d[0]) << 24 | - static_cast<uint32_t>(d[1]) << 16 | - static_cast<uint32_t>(d[2]) << 8 | static_cast<uint32_t>(d[3]); - } - - uint32_t ExternalTimeToInternal(uint32_t external_time) const { - static const uint32_t kCreationTimeFromInternalEpoch = 63115200.0; - uint32_t internal_epoch = 0; - if (creation_time_ > kCreationTimeFromInternalEpoch) { - internal_epoch = creation_time_ - kCreationTimeFromInternalEpoch; - } - - return external_time - internal_epoch; - } - - void DropOldestEntry() { - std::set<std::pair<uint32_t, string>>::iterator oldest = nonces_.begin(); - horizon_ = oldest->first + 1; - nonces_.erase(oldest); - } - - const unsigned max_entries_; - const unsigned window_secs_; - const uint32_t creation_time_; - uint8_t orbit_[8]; - uint32_t horizon_; - - std::set<std::pair<uint32_t, string>> nonces_; -}; - -class StrikeRegisterStressTest : public QuicTest {}; - -TEST_F(StrikeRegisterStressTest, InOrderInsertion) { - // Fixed seed gives reproducibility for this test. - srand(42); - - unsigned max_entries = 64; - uint32_t current_time = 10000, window = 200; - std::unique_ptr<StrikeRegister> s1( - new StrikeRegister(max_entries, current_time, window, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP)); - std::unique_ptr<SlowStrikeRegister> s2( - new SlowStrikeRegister(max_entries, current_time, window, kOrbit)); - - uint64_t i; - const uint64_t kMaxIterations = 10000; - for (i = 0; i < kMaxIterations; i++) { - const uint32_t time = current_time + i; - - uint8_t nonce[32]; - SetNonce(nonce, time, kOrbit); - - // There are 2048 possible nonce values: - const uint32_t v = rand() % 2048; - nonce[30] = v >> 8; - nonce[31] = v; - - const InsertStatus nonce_error2 = s2->Insert(nonce, time, time); - const InsertStatus nonce_error1 = s1->Insert(nonce, time); - EXPECT_EQ(nonce_error1, nonce_error2); - - // Inserts succeed after the startup period. - if (time > current_time + window) { - EXPECT_EQ(NONCE_OK, nonce_error1); - } else { - EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, nonce_error1); - } - EXPECT_EQ(s1->GetCurrentValidWindowSecs(time), - s2->GetCurrentValidWindowSecs(time)); - - if (i % 10 == 0) { - s1->Validate(); - } - - if (HasFailure()) { - break; - } - } - - if (i != kMaxIterations) { - FAIL() << "Failed after " << i << " iterations"; - } -} - -TEST_F(StrikeRegisterStressTest, Stress) { - // Fixed seed gives reproducibility for this test. - srand(42); - unsigned max_entries = 64; - uint32_t current_time = 10000, window = 200; - std::unique_ptr<StrikeRegister> s1( - new StrikeRegister(max_entries, current_time, window, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP)); - std::unique_ptr<SlowStrikeRegister> s2( - new SlowStrikeRegister(max_entries, current_time, window, kOrbit)); - uint64_t i; - - // When making changes it's worth removing the limit on this test and running - // it for a while. For the initial development an opt binary was left running - // for 10 minutes. - const uint64_t kMaxIterations = 10000; - for (i = 0; i < kMaxIterations; i++) { - if (rand() % 1000 == 0) { - // 0.1% chance of resetting the sets. - max_entries = rand() % 300 + 2; - current_time = rand() % 10000; - window = rand() % 500; - s1.reset(new StrikeRegister(max_entries, current_time, window, kOrbit, - StrikeRegister::DENY_REQUESTS_AT_STARTUP)); - s2.reset( - new SlowStrikeRegister(max_entries, current_time, window, kOrbit)); - } - - int32_t time_delta = rand() % (window * 4); - time_delta -= window * 2; - const uint32_t time = current_time + time_delta; - if (time_delta < 0 && time > current_time) { - continue; // overflow - } - - uint8_t nonce[32]; - SetNonce(nonce, time, kOrbit); - - // There are 2048 possible nonce values: - const uint32_t v = rand() % 2048; - nonce[30] = v >> 8; - nonce[31] = v; - - const InsertStatus nonce_error2 = s2->Insert(nonce, time, time); - const InsertStatus nonce_error1 = s1->Insert(nonce, time); - EXPECT_EQ(nonce_error1, nonce_error2); - EXPECT_EQ(s1->GetCurrentValidWindowSecs(time), - s2->GetCurrentValidWindowSecs(time)); - - if (i % 10 == 0) { - s1->Validate(); - } - - if (HasFailure()) { - break; - } - } - - if (i != kMaxIterations) { - FAIL() << "Failed after " << i << " iterations"; - } -} - -} // namespace - -} // namespace net
diff --git a/net/quic/core/frames/quic_ack_frame.cc b/net/quic/core/frames/quic_ack_frame.cc index 0741a15..fdb6e9b 100644 --- a/net/quic/core/frames/quic_ack_frame.cc +++ b/net/quic/core/frames/quic_ack_frame.cc
@@ -115,23 +115,6 @@ return packet_number_intervals_.rbegin()->Length(); } -PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound( - QuicPacketNumber packet_number) const { - // lower_bound returns the first interval that contains |packet_number| or the - // first interval after |packet_number|. - auto itr = packet_number_intervals_.Find(packet_number); - if (itr != packet_number_intervals_.end()) { - return itr; - } - for (itr = packet_number_intervals_.begin(); - itr != packet_number_intervals_.end(); ++itr) { - if (packet_number < itr->min()) { - return itr; - } - } - return packet_number_intervals_.end(); -} - PacketNumberQueue::const_iterator PacketNumberQueue::begin() const { return packet_number_intervals_.begin(); }
diff --git a/net/quic/core/frames/quic_ack_frame.h b/net/quic/core/frames/quic_ack_frame.h index ef4829c..db33248 100644 --- a/net/quic/core/frames/quic_ack_frame.h +++ b/net/quic/core/frames/quic_ack_frame.h
@@ -82,7 +82,6 @@ const_iterator end() const; const_reverse_iterator rbegin() const; const_reverse_iterator rend() const; - const_iterator lower_bound(QuicPacketNumber packet_number) const; friend QUIC_EXPORT_PRIVATE std::ostream& operator<<( std::ostream& os,
diff --git a/net/quic/core/frames/quic_frames_test.cc b/net/quic/core/frames/quic_frames_test.cc index b0a77377..f591cd7 100644 --- a/net/quic/core/frames/quic_frames_test.cc +++ b/net/quic/core/frames/quic_frames_test.cc
@@ -242,29 +242,6 @@ EXPECT_EQ(expected_intervals, actual_intervals); } -TEST_F(PacketNumberQueueTest, LowerBoundEquals) { - PacketNumberQueue queue; - queue.Add(1, 100); - - PacketNumberQueue::const_iterator it = queue.lower_bound(10); - ASSERT_NE(queue.end(), it); - EXPECT_TRUE(it->Contains(10u)); - - it = queue.lower_bound(101); - EXPECT_TRUE(queue.end() == it); -} - -TEST_F(PacketNumberQueueTest, LowerBoundGreater) { - PacketNumberQueue queue; - queue.Add(15, 25); - queue.Add(50, 100); - - PacketNumberQueue::const_iterator it = queue.lower_bound(10); - ASSERT_NE(queue.end(), it); - EXPECT_EQ(15u, it->min()); - EXPECT_EQ(25u, it->max()); -} - TEST_F(PacketNumberQueueTest, IntervalLengthAndRemoveInterval) { PacketNumberQueue queue; queue.Add(1, 10);
diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc index 3f31667..cf14b3e 100644 --- a/net/quic/core/quic_connection_test.cc +++ b/net/quic/core/quic_connection_test.cc
@@ -704,7 +704,7 @@ peer_framer_(SupportedVersions(version()), QuicTime::Zero(), Perspective::IS_SERVER), - peer_creator_(GetPeerInMemoryConnectionId(connection_id_), + peer_creator_(connection_id_, &peer_framer_, &buffer_allocator_, /*delegate=*/nullptr), @@ -846,8 +846,7 @@ QuicFrame frame, EncryptionLevel level) { QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.packet_number_length = packet_number_length_; header.public_header.connection_id_length = connection_id_length_; header.packet_number = number; @@ -958,8 +957,7 @@ QuicPacketHeader header; // Set connection_id to peer's in memory representation as this data packet // is created by peer_framer. - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.packet_number_length = packet_number_length_; header.public_header.connection_id_length = connection_id_length_; header.packet_number = number; @@ -976,8 +974,7 @@ QuicPacketHeader header; // Set connection_id to peer's in memory representation as this connection // close packet is created by peer_framer. - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.packet_number = number; QuicConnectionCloseFrame qccf; @@ -1216,8 +1213,7 @@ connection_.SetMaxPacketLength(1000); QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.version_flag = true; header.packet_number = 1; @@ -1250,8 +1246,7 @@ EXPECT_EQ(1000u, connection_.max_packet_length()); QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.version_flag = true; header.packet_number = 1; @@ -4447,8 +4442,7 @@ TEST_P(QuicConnectionTest, PublicReset) { QuicPublicResetPacket header; // Public reset packet in only built by server. - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.reset_flag = true; header.public_header.version_flag = false; std::unique_ptr<QuicEncryptedPacket> packet( @@ -4514,8 +4508,7 @@ peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.version_flag = true; header.packet_number = 12; @@ -4550,8 +4543,7 @@ peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.version_flag = true; header.packet_number = 12; @@ -4593,8 +4585,7 @@ peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.public_header.version_flag = true; header.packet_number = 12; @@ -4623,8 +4614,8 @@ // Send a version negotiation packet. std::unique_ptr<QuicEncryptedPacket> encrypted( - peer_framer_.BuildVersionNegotiationPacket( - GetPeerInMemoryConnectionId(connection_id_), AllSupportedVersions())); + peer_framer_.BuildVersionNegotiationPacket(connection_id_, + AllSupportedVersions())); std::unique_ptr<QuicReceivedPacket> received( ConstructReceivedPacket(*encrypted, QuicTime::Zero())); connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *received); @@ -4632,8 +4623,7 @@ // Now force another packet. The connection should transition into // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion. QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.packet_number = 12; header.public_header.version_flag = false; QuicFrames frames; @@ -4659,8 +4649,8 @@ OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, _, ConnectionCloseSource::FROM_SELF)); std::unique_ptr<QuicEncryptedPacket> encrypted( - framer_.BuildVersionNegotiationPacket( - GetPeerInMemoryConnectionId(connection_id_), AllSupportedVersions())); + framer_.BuildVersionNegotiationPacket(connection_id_, + AllSupportedVersions())); std::unique_ptr<QuicReceivedPacket> received( ConstructReceivedPacket(*encrypted, QuicTime::Zero())); connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *received); @@ -4716,8 +4706,7 @@ TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) { // Construct a packet with stream frame and connection close frame. QuicPacketHeader header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id_); + header.public_header.connection_id = connection_id_; header.packet_number = 1; header.public_header.version_flag = false;
diff --git a/net/quic/core/quic_crypto_client_stream_test.cc b/net/quic/core/quic_crypto_client_stream_test.cc index 0cb590da..e841dff2 100644 --- a/net/quic/core/quic_crypto_client_stream_test.cc +++ b/net/quic/core/quic_crypto_client_stream_test.cc
@@ -463,7 +463,7 @@ client_state->GetNextServerDesignatedConnectionId(); QuicConnectionId expected_id = server_session_->connection()->random_generator()->RandUint64(); - EXPECT_EQ(GetPeerInMemoryConnectionId(expected_id), server_designated_id); + EXPECT_EQ(expected_id, server_designated_id); EXPECT_FALSE(client_state->has_server_designated_connection_id()); }
diff --git a/net/quic/core/quic_crypto_server_stream_test.cc b/net/quic/core/quic_crypto_server_stream_test.cc index 0a6ae1f0..c91de4f 100644 --- a/net/quic/core/quic_crypto_server_stream_test.cc +++ b/net/quic/core/quic_crypto_server_stream_test.cc
@@ -265,8 +265,7 @@ client_state->GetNextServerDesignatedConnectionId(); const QuicConnectionId expected_id = server_connection_->random_generator()->RandUint64(); - EXPECT_EQ(GetPeerInMemoryConnectionId(expected_id), - server_designated_connection_id); + EXPECT_EQ(expected_id, server_designated_connection_id); EXPECT_FALSE(client_state->has_server_designated_connection_id()); ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0))); } @@ -297,8 +296,7 @@ client_state->GetNextServerDesignatedConnectionId(); const QuicConnectionId expected_id = server_connection_->random_generator()->RandUint64(); - EXPECT_EQ(GetPeerInMemoryConnectionId(expected_id), - server_designated_connection_id); + EXPECT_EQ(expected_id, server_designated_connection_id); EXPECT_FALSE(client_state->has_server_designated_connection_id()); ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
diff --git a/net/quic/core/quic_data_reader.cc b/net/quic/core/quic_data_reader.cc index c748efc..71f1003 100644 --- a/net/quic/core/quic_data_reader.cc +++ b/net/quic/core/quic_data_reader.cc
@@ -13,6 +13,9 @@ namespace net { +#define ENDPOINT \ + (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") + QuicDataReader::QuicDataReader(const char* data, const size_t len, Perspective perspective, @@ -21,7 +24,9 @@ len_(len), pos_(0), perspective_(perspective), - endianness_(endianness) {} + endianness_(endianness) { + QUIC_DVLOG(1) << ENDPOINT << "QuicDataReader"; +} bool QuicDataReader::ReadUInt8(uint8_t* result) { return ReadBytes(result, sizeof(*result)); @@ -137,10 +142,7 @@ if (!ReadBytes(connection_id, sizeof(*connection_id))) { return false; } - - if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective_)) { - *connection_id = QuicEndian::NetToHost64(*connection_id); - } + *connection_id = QuicEndian::NetToHost64(*connection_id); return true; }
diff --git a/net/quic/core/quic_data_reader.h b/net/quic/core/quic_data_reader.h index 755f2fcc..56c53a41 100644 --- a/net/quic/core/quic_data_reader.h +++ b/net/quic/core/quic_data_reader.h
@@ -144,6 +144,7 @@ // The location of the next read from our data buffer. size_t pos_; + // TODO(zhongyi): remove this field as it is no longer used. // Perspective of this data reader. Please note, although client and server // may have different in-memory representation of the same field, the on wire // representation must be consistent.
diff --git a/net/quic/core/quic_data_writer.cc b/net/quic/core/quic_data_writer.cc index 3290dba..e4716b3 100644 --- a/net/quic/core/quic_data_writer.cc +++ b/net/quic/core/quic_data_writer.cc
@@ -13,6 +13,9 @@ namespace net { +#define ENDPOINT \ + (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") + QuicDataWriter::QuicDataWriter(size_t size, char* buffer, Perspective perspective, @@ -21,7 +24,9 @@ capacity_(size), length_(0), perspective_(perspective), - endianness_(endianness) {} + endianness_(endianness) { + QUIC_DVLOG(1) << ENDPOINT << "QuicDataWriter"; +} QuicDataWriter::~QuicDataWriter() {} @@ -173,9 +178,7 @@ } bool QuicDataWriter::WriteConnectionId(uint64_t connection_id) { - if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective_)) { - connection_id = QuicEndian::HostToNet64(connection_id); - } + connection_id = QuicEndian::HostToNet64(connection_id); return WriteBytes(&connection_id, sizeof(connection_id)); }
diff --git a/net/quic/core/quic_data_writer.h b/net/quic/core/quic_data_writer.h index 8c0f400..46df686 100644 --- a/net/quic/core/quic_data_writer.h +++ b/net/quic/core/quic_data_writer.h
@@ -88,6 +88,7 @@ size_t capacity_; // Allocation size of payload (or -1 if buffer is const). size_t length_; // Current length of the buffer. + // TODO(zhongyi): remove this field as it is no longer used. // Perspective of this data writer. Please note, although client and server // may have different in-memory representation of the same field, the on wire // representation must be consistent.
diff --git a/net/quic/core/quic_data_writer_test.cc b/net/quic/core/quic_data_writer_test.cc index e44a12b..c6c2d7c3 100644 --- a/net/quic/core/quic_data_writer_test.cc +++ b/net/quic/core/quic_data_writer_test.cc
@@ -254,9 +254,6 @@ TEST_P(QuicDataWriterTest, WriteConnectionId) { uint64_t connection_id = 0x0011223344556677; - char little_endian[] = { - 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, - }; char big_endian[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, }; @@ -265,12 +262,8 @@ QuicDataWriter writer(kBufferLength, buffer, GetParam().perspective, GetParam().endianness); writer.WriteConnectionId(connection_id); - test::CompareCharArraysWithHexError( - "connection_id", buffer, kBufferLength, - QuicUtils::IsConnectionIdWireFormatBigEndian(GetParam().perspective) - ? big_endian - : little_endian, - kBufferLength); + test::CompareCharArraysWithHexError("connection_id", buffer, kBufferLength, + big_endian, kBufferLength); uint64_t read_connection_id; QuicDataReader reader(buffer, kBufferLength, GetParam().perspective,
diff --git a/net/quic/core/quic_flags_list.h b/net/quic/core/quic_flags_list.h index d8c39b4..9e7b1ae7 100644 --- a/net/quic/core/quic_flags_list.h +++ b/net/quic/core/quic_flags_list.h
@@ -7,10 +7,6 @@ // This file contains the list of QUIC protocol flags. -// If true, QUIC BBR congestion control may be enabled via Finch and/or via QUIC -// connection options. -QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_allow_new_bbr, true) - // Time period for which a given connection_id should live in the time-wait // state. QUIC_FLAG(int64_t, FLAGS_quic_time_wait_list_seconds, 200) @@ -143,18 +139,6 @@ // If true, enable QUIC v39. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_39, true) -// If true, on client side, 8-byte connection ID in public header is read and -// written in big endian. -QUIC_FLAG(bool, - FLAGS_quic_restart_flag_quic_big_endian_connection_id_client, - true) - -// If true, on server side, 8-byte connection ID in public header is read and -// written in big endian. -QUIC_FLAG(bool, - FLAGS_quic_restart_flag_quic_big_endian_connection_id_server, - true) - // Simplify QUIC\'s adaptive time loss detection to measure the necessary // reordering window for every spurious retransmit. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_adaptive_time_loss, false) @@ -163,10 +147,6 @@ // compressed for QUIC version >= 38. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_random_padding, true) -// Use conservation in PROBE_BW ouside of super-unity gain and immediately -// preceeding cycle. -QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation, false) - // Increase BBR's inflight limit if recent ack rate is low. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_slow_recent_delivery, false)
diff --git a/net/quic/core/quic_flow_controller.h b/net/quic/core/quic_flow_controller.h index f183741a..6d79a43 100644 --- a/net/quic/core/quic_flow_controller.h +++ b/net/quic/core/quic_flow_controller.h
@@ -97,10 +97,6 @@ receive_window_size_limit_ = receive_window_size_limit; } - void set_auto_tune_receive_window(bool enable) { - auto_tune_receive_window_ = enable; - } - // Should only be called before any data is received. void UpdateReceiveWindowSize(QuicStreamOffset size);
diff --git a/net/quic/core/quic_flow_controller_test.cc b/net/quic/core/quic_flow_controller_test.cc index 0c17adb..9feb3c3 100644 --- a/net/quic/core/quic_flow_controller_test.cc +++ b/net/quic/core/quic_flow_controller_test.cc
@@ -34,27 +34,24 @@ class QuicFlowControllerTest : public QuicTest { public: - QuicFlowControllerTest() - : stream_id_(1234), - send_window_(kInitialSessionFlowControlWindowForTest), - receive_window_(kInitialSessionFlowControlWindowForTest), - connection_(&helper_, &alarm_factory_, Perspective::IS_CLIENT) {} - void Initialize() { flow_controller_.reset(new QuicFlowController( &connection_, stream_id_, Perspective::IS_CLIENT, send_window_, - receive_window_, false, &session_flow_controller_)); + receive_window_, should_auto_tune_receive_window_, + &session_flow_controller_)); } protected: - QuicStreamId stream_id_; - QuicByteCount send_window_; - QuicByteCount receive_window_; + QuicStreamId stream_id_ = 1234; + QuicByteCount send_window_ = kInitialSessionFlowControlWindowForTest; + QuicByteCount receive_window_ = kInitialSessionFlowControlWindowForTest; std::unique_ptr<QuicFlowController> flow_controller_; MockQuicConnectionHelper helper_; MockAlarmFactory alarm_factory_; - MockQuicConnection connection_; + MockQuicConnection connection_ = {&helper_, &alarm_factory_, + Perspective::IS_CLIENT}; MockFlowController session_flow_controller_; + bool should_auto_tune_receive_window_ = false; }; TEST_F(QuicFlowControllerTest, SendingBytes) { @@ -167,8 +164,9 @@ // This test will generate two WINDOW_UPDATE frames. EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(1); + should_auto_tune_receive_window_ = true; Initialize(); - flow_controller_->set_auto_tune_receive_window(true); + EXPECT_TRUE(flow_controller_->auto_tune_receive_window()); // Make sure clock is inititialized. connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); @@ -221,7 +219,7 @@ EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2); Initialize(); - flow_controller_->set_auto_tune_receive_window(false); + EXPECT_FALSE(flow_controller_->auto_tune_receive_window()); // Make sure clock is inititialized. connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); @@ -273,8 +271,9 @@ // This test will generate two WINDOW_UPDATE frames. EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(1); + should_auto_tune_receive_window_ = true; Initialize(); - flow_controller_->set_auto_tune_receive_window(true); + EXPECT_TRUE(flow_controller_->auto_tune_receive_window()); // Make sure clock is inititialized. connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); @@ -330,7 +329,7 @@ EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2); Initialize(); - flow_controller_->set_auto_tune_receive_window(false); + EXPECT_FALSE(flow_controller_->auto_tune_receive_window()); // Make sure clock is inititialized. connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
diff --git a/net/quic/core/quic_framer_test.cc b/net/quic/core/quic_framer_test.cc index a04fdc6..ed3979b 100644 --- a/net/quic/core/quic_framer_test.cc +++ b/net/quic/core/quic_framer_test.cc
@@ -446,26 +446,6 @@ test::TestQuicVisitor visitor_; }; -// Helper function to get index of packets in hex format. -// For each packet in hex format, integers and floating numbers are in big -// endian for v38 and up, and connection ID is in big endian according to -// perspective and flags. -// There are 4 combinations: -// 0 : little endian connection ID, little endian integers/floating numbers. -// 1 : big endian connection ID, little endian integers/floating numbers. -// 2 : little endian connection ID, big endian integers/floating numbers. -// 3 : big endian connection ID, big endian integers/floating numbers. -size_t GetPacketIndex(QuicVersion version, Perspective perspective) { - size_t index = 0; - if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)) { - index = 1; - } - if (version > QUIC_VERSION_38) { - index += 2; - } - return index; -} - // Run all framer tests with all supported versions of QUIC. INSTANTIATE_TEST_CASE_P(QuicFramerTests, QuicFramerTest, @@ -585,17 +565,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - // private flags - 0x00, - }; - - unsigned char packet_cid_be[kMaxPacketSize + 1] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -610,15 +579,7 @@ memset(packet + header_size, 0, kMaxPacketSize - header_size); - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_QUIC_BUG(framer_.ProcessPacket(encrypted), "Packet too large:1"); ASSERT_TRUE(visitor_.header_.get()); @@ -634,15 +595,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -652,26 +604,15 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -694,8 +635,9 @@ } else { expected_error = "Unable to read packet number."; } - CheckProcessingFails(packets[index], i, expected_error, - QUIC_INVALID_PACKET_HEADER); + CheckProcessingFails( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i, + expected_error, QUIC_INVALID_PACKET_HEADER); } } @@ -760,17 +702,6 @@ // public flags (version) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - }; - - unsigned char packet_cid_be[] = { - // public flags (version) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -782,17 +713,6 @@ // public flags (version) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - }; - - unsigned char packet_cid_be39[] = { - // public flags (version) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -801,11 +721,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -831,8 +749,9 @@ } else { expected_error = "Unable to read packet number."; } - CheckProcessingFails(packets[index], i, expected_error, - QUIC_INVALID_PACKET_HEADER); + CheckProcessingFails( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i, + expected_error, QUIC_INVALID_PACKET_HEADER); } } @@ -844,15 +763,6 @@ // public flags (8 byte connection_id and 4 byte packet number) 0x28, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id and 4 byte packet number) - 0x28, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -862,26 +772,15 @@ // public flags (8 byte connection_id and 4 byte packet number) 0x28, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x56, 0x78, 0x9A, 0xBC, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id and 4 byte packet number) - 0x28, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x56, 0x78, 0x9A, 0xBC, }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -904,8 +803,9 @@ } else { expected_error = "Unable to read packet number."; } - CheckProcessingFails(packets[index], i, expected_error, - QUIC_INVALID_PACKET_HEADER); + CheckProcessingFails( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i, + expected_error, QUIC_INVALID_PACKET_HEADER); } } @@ -917,15 +817,6 @@ // public flags (8 byte connection_id and 2 byte packet number) 0x18, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id and 2 byte packet number) - 0x18, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, @@ -935,26 +826,15 @@ // public flags (8 byte connection_id and 2 byte packet number) 0x18, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x9A, 0xBC, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id and 2 byte packet number) - 0x18, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x9A, 0xBC, }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -979,8 +859,9 @@ } else { expected_error = "Unable to read packet number."; } - CheckProcessingFails(packets[index], i, expected_error, - QUIC_INVALID_PACKET_HEADER); + CheckProcessingFails( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i, + expected_error, QUIC_INVALID_PACKET_HEADER); } } @@ -992,30 +873,13 @@ // public flags (8 byte connection_id and 1 byte packet number) 0x08, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id and 1 byte packet number) - 0x08, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, }; // clang-format on - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -1040,11 +904,7 @@ } else { expected_error = "Unable to read packet number."; } - CheckProcessingFails( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet, - i, expected_error, QUIC_INVALID_PACKET_HEADER); + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } } @@ -1112,24 +972,6 @@ // public flags: includes nonce flag 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // nonce - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (padding) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be[] = { - // public flags: includes nonce flag - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // nonce 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, @@ -1148,24 +990,6 @@ // public flags: includes nonce flag 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // nonce - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (padding) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be39[] = { - // public flags: includes nonce flag - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // nonce 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, @@ -1180,11 +1004,10 @@ 0x00, 0x00, 0x00, 0x00 }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); ASSERT_TRUE(visitor_.public_header_->nonce != nullptr); @@ -1201,23 +1024,6 @@ // public flags (8 byte connection_id, version flag and an unknown flag) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', '0', '0', - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id, version flag and an unknown flag) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', '0', '0', @@ -1234,23 +1040,6 @@ // public flags (8 byte connection_id, version flag and an unknown flag) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', '0', '0', - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id, version flag and an unknown flag) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', '0', '0', @@ -1263,11 +1052,10 @@ 0x00, 0x00, 0x00, 0x00 }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -1283,34 +1071,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (padding frame) - 0x00, - // Ignored data (which in this case is a stream frame) - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -1339,15 +1099,7 @@ return; } - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -1360,9 +1112,7 @@ EXPECT_EQ(28, visitor_.padding_frames_[0]->num_padding_bytes); // A packet with no frames is not acceptable. CheckProcessingFails( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet, + packet, GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -1375,35 +1125,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // paddings - 0x00, 0x00, - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - // paddings - 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -1432,35 +1153,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // paddings - 0x00, 0x00, - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - // paddings - 0x00, 0x00, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -1490,11 +1182,9 @@ return; } - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.header_.get()); @@ -1518,31 +1208,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -1567,31 +1232,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -1612,11 +1252,10 @@ 'r', 'l', 'd', '!', }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -1632,8 +1271,9 @@ CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); // Now test framing boundaries. - CheckStreamFrameBoundaries(packets[index], kQuicMaxStreamIdSize, - !kIncludeVersion); + CheckStreamFrameBoundaries( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, + kQuicMaxStreamIdSize, !kIncludeVersion); } TEST_P(QuicFramerTest, MissingDiversificationNonce) { @@ -1648,31 +1288,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -1697,31 +1312,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, // packet number 0x12, 0x34, 0x56, 0x78, @@ -1743,11 +1333,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_FALSE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error()); } @@ -1758,31 +1346,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFE, - // stream id - 0x04, 0x03, 0x02, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -1807,31 +1370,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFE, - // stream id - 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, // packet number 0x12, 0x34, 0x56, 0x78, @@ -1853,11 +1391,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -1875,7 +1411,9 @@ // Now test framing boundaries. const size_t stream_id_size = 3; - CheckStreamFrameBoundaries(packets[index], stream_id_size, !kIncludeVersion); + CheckStreamFrameBoundaries( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, stream_id_size, + !kIncludeVersion); } TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { @@ -1884,31 +1422,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFD, - // stream id - 0x04, 0x03, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -1929,32 +1442,7 @@ 'r', 'l', 'd', '!', }; - unsigned char packet39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFD, - // stream id - 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { + unsigned char packet39[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -1979,11 +1467,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2001,7 +1487,9 @@ // Now test framing boundaries. const size_t stream_id_size = 2; - CheckStreamFrameBoundaries(packets[index], stream_id_size, !kIncludeVersion); + CheckStreamFrameBoundaries( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, stream_id_size, + !kIncludeVersion); } TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { @@ -2010,31 +1498,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFC, - // stream id - 0x04, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -2055,32 +1518,7 @@ 'r', 'l', 'd', '!', }; - unsigned char packet39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFC, - // stream id - 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { + unsigned char packet39[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -2105,11 +1543,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2127,7 +1563,9 @@ // Now test framing boundaries. const size_t stream_id_size = 1; - CheckStreamFrameBoundaries(packets[index], stream_id_size, !kIncludeVersion); + CheckStreamFrameBoundaries( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, stream_id_size, + !kIncludeVersion); } TEST_P(QuicFramerTest, StreamFrameWithVersion) { @@ -2136,33 +1574,6 @@ // public flags (version, 8 byte connection_id) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (version, 8 byte connection_id) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -2185,34 +1596,7 @@ 'r', 'l', 'd', '!', }; - unsigned char packet39[] = { - // public flags (version, 8 byte connection_id) - 0x39, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { + unsigned char packet39[] = { // public flags (version, 8 byte connection_id) 0x39, // connection_id @@ -2239,11 +1623,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2261,8 +1643,9 @@ CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); // Now test framing boundaries. - CheckStreamFrameBoundaries(packets[index], kQuicMaxStreamIdSize, - kIncludeVersion); + CheckStreamFrameBoundaries( + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, + kQuicMaxStreamIdSize, kIncludeVersion); } TEST_P(QuicFramerTest, RejectPacket) { @@ -2273,31 +1656,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -2322,31 +1680,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -2368,11 +1701,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2392,26 +1723,11 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, }; // clang-format on - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2425,27 +1741,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (ack frame) - // (one ack block, 2 byte largest observed, 2 byte block length) - 0x45, - // largest acked - 0x34, 0x12, - // Zero delta time. - 0x00, 0x00, - // first ack block length. - 0x34, 0x12, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -2467,27 +1762,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (ack frame) - // (one ack block, 2 byte largest observed, 2 byte block length) - 0x45, - // largest acked - 0x12, 0x34, - // Zero delta time. - 0x00, 0x00, - // first ack block length. - 0x12, 0x34, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, @@ -2505,12 +1779,9 @@ 0x00, }; // clang-format on - - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2546,7 +1817,7 @@ expected_error = "Unable to read num received packets."; } CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -2560,53 +1831,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (ack frame) - // (more than one ack block, 2 byte largest observed, 2 byte block length) - 0x65, - // largest acked - 0x34, 0x12, - // Zero delta time. - 0x00, 0x00, - // num ack blocks ranges. - 0x04, - // first ack block length. - 0x01, 0x00, - // gap to next block. - 0x01, - // ack block length. - 0xaf, 0x0e, - // gap to next block. - 0xff, - // ack block length. - 0x00, 0x00, - // gap to next block. - 0x91, - // ack block length. - 0xea, 0x01, - // gap to next block. - 0x05, - // ack block length. - 0x04, 0x00, - // Number of timestamps. - 0x02, - // Delta from largest observed. - 0x01, - // Delta time. - 0x10, 0x32, 0x54, 0x76, - // Delta from largest observed. - 0x02, - // Delta time. - 0x10, 0x32, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -2654,53 +1878,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (ack frame) - // (more than one ack block, 2 byte largest observed, 2 byte block length) - 0x65, - // largest acked - 0x12, 0x34, - // Zero delta time. - 0x00, 0x00, - // num ack blocks ranges. - 0x04, - // first ack block length. - 0x00, 0x01, - // gap to next block. - 0x01, - // ack block length. - 0x0e, 0xaf, - // gap to next block. - 0xff, - // ack block length. - 0x00, 0x00, - // gap to next block. - 0x91, - // ack block length. - 0x01, 0xea, - // gap to next block. - 0x05, - // ack block length. - 0x00, 0x04, - // Number of timestamps. - 0x02, - // Delta from largest observed. - 0x01, - // Delta time. - 0x76, 0x54, 0x32, 0x10, - // Delta from largest observed. - 0x02, - // Delta time. - 0x32, 0x10, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, @@ -2744,12 +1921,9 @@ 0x32, 0x10, }; // clang-format on - - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2836,7 +2010,7 @@ } CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -2850,22 +2024,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xA8, 0x9A, 0x78, 0x56, - 0x34, 0x12, - // frame type (stop waiting frame) - 0x06, - // least packet number awaiting an ack, delta from packet number. - 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xA8, 0x9A, 0x78, 0x56, @@ -2881,22 +2039,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xA8, - // frame type (stop waiting frame) - 0x06, - // least packet number awaiting an ack, delta from packet number. - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -2909,11 +2051,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -2931,7 +2071,7 @@ string expected_error; expected_error = "Unable to read least unacked delta."; CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -2945,29 +2085,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (rst stream frame) - 0x01, - // stream id - 0x04, 0x03, 0x02, 0x01, - - // sent byte offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - - // error code - 0x01, 0x00, 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -2990,29 +2107,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (rst stream frame) - 0x01, - // stream id - 0x01, 0x02, 0x03, 0x04, - - // sent byte offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - - // error code - 0x00, 0x00, 0x00, 0x01, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -3032,11 +2126,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -3062,7 +2154,7 @@ expected_error = "Unable to read rst stream error code."; } CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -3076,30 +2168,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (connection close frame) - 0x02, - // error code - 0x11, 0x00, 0x00, 0x00, - - // error details length - 0x0d, 0x00, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -3123,30 +2191,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (connection close frame) - 0x02, - // error code - 0x00, 0x00, 0x00, 0x11, - - // error details length - 0x00, 0x0d, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -3167,11 +2211,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -3196,7 +2238,7 @@ expected_error = "Unable to read connection close error details."; } CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -3210,31 +2252,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (go away frame) - 0x03, - // error code - 0x09, 0x00, 0x00, 0x00, - // stream id - 0x04, 0x03, 0x02, 0x01, - // error details length - 0x0d, 0x00, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -3259,31 +2276,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (go away frame) - 0x03, - // error code - 0x00, 0x00, 0x00, 0x09, - // stream id - 0x01, 0x02, 0x03, 0x04, - // error details length - 0x00, 0x0d, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -3305,11 +2297,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -3335,7 +2325,7 @@ expected_error = "Unable to read goaway reason."; } CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -3346,25 +2336,6 @@ TEST_P(QuicFramerTest, WindowUpdateFrame) { // clang-format off unsigned char packet[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (window update frame) - 0x04, - // stream id - 0x04, 0x03, 0x02, 0x01, - // byte offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - }; - - unsigned char packet_cid_be[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -3383,25 +2354,6 @@ }; unsigned char packet39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (window update frame) - 0x04, - // stream id - 0x01, 0x02, 0x03, 0x04, - // byte offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - }; - - unsigned char packet_cid_be39[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -3420,11 +2372,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -3445,7 +2395,7 @@ expected_error = "Unable to read window byte_offset."; } CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -3456,22 +2406,6 @@ TEST_P(QuicFramerTest, BlockedFrame) { // clang-format off unsigned char packet[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (blocked frame) - 0x05, - // stream id - 0x04, 0x03, 0x02, 0x01, - }; - - unsigned char packet_cid_be[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -3487,22 +2421,6 @@ }; unsigned char packet39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (blocked frame) - 0x05, - // stream id - 0x01, 0x02, 0x03, 0x04, - }; - - unsigned char packet_cid_be39[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -3518,11 +2436,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -3537,7 +2453,7 @@ ++i) { string expected_error = "Unable to read stream_id."; CheckProcessingFails( - packets[index], + framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER), @@ -3548,20 +2464,6 @@ TEST_P(QuicFramerTest, PingFrame) { // clang-format off unsigned char packet[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (ping frame) - 0x07, - }; - - unsigned char packet_cid_be[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -3575,20 +2477,6 @@ }; unsigned char packet39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (ping frame) - 0x07, - }; - - unsigned char packet_cid_be39[] = { // public flags (8 byte connection_id) 0x38, // connection_id @@ -3602,11 +2490,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); @@ -3625,32 +2511,6 @@ // public flags (public reset, 8 byte connection_id) 0x0A, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (2) + padding - 0x02, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // tag kRSEQ - 'R', 'S', 'E', 'Q', - // end offset 16 - 0x10, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - // rejected packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte connection_id) - 0x0A, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) 'P', 'R', 'S', 'T', @@ -3673,15 +2533,7 @@ }; // clang-format on - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.public_reset_packet_.get()); @@ -3695,41 +2547,20 @@ visitor_.public_reset_packet_->client_address.host().address_family()); // Now test framing boundaries. - if (!QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())) { - for (size_t i = 0; i < arraysize(packet); ++i) { - string expected_error; - QUIC_DLOG(INFO) << "iteration: " << i; - if (i < kConnectionIdOffset) { - expected_error = "Unable to read public flags."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PACKET_HEADER); - } else if (i < kPublicResetPacketMessageTagOffset) { - expected_error = "Unable to read ConnectionId."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PACKET_HEADER); - } else { - expected_error = "Unable to read reset message."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PUBLIC_RST_PACKET); - } - } - return; - } - - for (size_t i = 0; i < arraysize(packet_cid_be); ++i) { + for (size_t i = 0; i < arraysize(packet); ++i) { string expected_error; QUIC_DLOG(INFO) << "iteration: " << i; if (i < kConnectionIdOffset) { expected_error = "Unable to read public flags."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } else if (i < kPublicResetPacketMessageTagOffset) { expected_error = "Unable to read ConnectionId."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } else { expected_error = "Unable to read reset message."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PUBLIC_RST_PACKET); } } @@ -3743,32 +2574,6 @@ // public flags (public reset, 8 byte connection_id) 0x0E, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (2) + padding - 0x02, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // tag kRSEQ - 'R', 'S', 'E', 'Q', - // end offset 16 - 0x10, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - // rejected packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte connection_id) - 0x0E, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) 'P', 'R', 'S', 'T', @@ -3791,15 +2596,7 @@ }; // clang-format on - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.public_reset_packet_.get()); @@ -3813,41 +2610,20 @@ visitor_.public_reset_packet_->client_address.host().address_family()); // Now test framing boundaries. - if (!QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())) { - for (size_t i = 0; i < arraysize(packet); ++i) { - string expected_error; - QUIC_DLOG(INFO) << "iteration: " << i; - if (i < kConnectionIdOffset) { - expected_error = "Unable to read public flags."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PACKET_HEADER); - } else if (i < kPublicResetPacketMessageTagOffset) { - expected_error = "Unable to read ConnectionId."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PACKET_HEADER); - } else { - expected_error = "Unable to read reset message."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PUBLIC_RST_PACKET); - } - } - return; - } - - for (size_t i = 0; i < arraysize(packet_cid_be); ++i) { + for (size_t i = 0; i < arraysize(packet); ++i) { string expected_error; QUIC_DLOG(INFO) << "iteration: " << i; if (i < kConnectionIdOffset) { expected_error = "Unable to read public flags."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } else if (i < kPublicResetPacketMessageTagOffset) { expected_error = "Unable to read ConnectionId."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } else { expected_error = "Unable to read reset message."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PUBLIC_RST_PACKET); } } @@ -3859,34 +2635,6 @@ // public flags (public reset, 8 byte connection_id) 0x0A, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (2) + padding - 0x02, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // tag kRSEQ - 'R', 'S', 'E', 'Q', - // end offset 16 - 0x10, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - // rejected packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, 0x00, 0x00, - // trailing junk - 'j', 'u', 'n', 'k', - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte connection_id) - 0x0A, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) 'P', 'R', 'S', 'T', @@ -3912,14 +2660,8 @@ // clang-format on string expected_error = "Unable to read reset message."; - CheckProcessingFails( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet, - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - expected_error, QUIC_INVALID_PUBLIC_RST_PACKET); + CheckProcessingFails(packet, arraysize(packet), expected_error, + QUIC_INVALID_PUBLIC_RST_PACKET); } TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { @@ -3928,40 +2670,6 @@ // public flags (public reset, 8 byte connection_id) 0x0A, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (3) + padding - 0x03, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // tag kRSEQ - 'R', 'S', 'E', 'Q', - // end offset 16 - 0x10, 0x00, 0x00, 0x00, - // tag kCADR - 'C', 'A', 'D', 'R', - // end offset 24 - 0x18, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - // rejected packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, 0x00, 0x00, - // client address: 4.31.198.44:443 - 0x02, 0x00, - 0x04, 0x1F, 0xC6, 0x2C, - 0xBB, 0x01, - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte connection_id) - 0x0A, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) 'P', 'R', 'S', 'T', @@ -3992,15 +2700,7 @@ }; // clang-format on - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.public_reset_packet_.get()); @@ -4014,41 +2714,20 @@ EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); // Now test framing boundaries. - if (!QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())) { - for (size_t i = 0; i < arraysize(packet); ++i) { - string expected_error; - QUIC_DLOG(INFO) << "iteration: " << i; - if (i < kConnectionIdOffset) { - expected_error = "Unable to read public flags."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PACKET_HEADER); - } else if (i < kPublicResetPacketMessageTagOffset) { - expected_error = "Unable to read ConnectionId."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PACKET_HEADER); - } else { - expected_error = "Unable to read reset message."; - CheckProcessingFails(packet, i, expected_error, - QUIC_INVALID_PUBLIC_RST_PACKET); - } - } - return; - } - - for (size_t i = 0; i < arraysize(packet_cid_be); ++i) { + for (size_t i = 0; i < arraysize(packet); ++i) { string expected_error; QUIC_DLOG(INFO) << "iteration: " << i; if (i < kConnectionIdOffset) { expected_error = "Unable to read public flags."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } else if (i < kPublicResetPacketMessageTagOffset) { expected_error = "Unable to read ConnectionId."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); } else { expected_error = "Unable to read reset message."; - CheckProcessingFails(packet_cid_be, i, expected_error, + CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PUBLIC_RST_PACKET); } } @@ -4060,17 +2739,6 @@ // public flags (version, 8 byte connection_id) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - 'Q', '2', '.', '0', - }; - - unsigned char packet_cid_be[] = { - // public flags (version, 8 byte connection_id) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -4080,15 +2748,7 @@ QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); @@ -4106,11 +2766,7 @@ expected_error = "Unable to read supported version in negotiation."; error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; } - CheckProcessingFails( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet, - i, expected_error, error_code); + CheckProcessingFails(packet, i, expected_error, error_code); } } @@ -4120,17 +2776,6 @@ // public flags (version, 8 byte connection_id) 0x3D, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - 'Q', '2', '.', '0', - }; - - unsigned char packet_cid_be[] = { - // public flags (version, 8 byte connection_id) - 0x3D, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -4140,15 +2785,7 @@ QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); - QuicEncryptedPacket encrypted( - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet), - false); + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); @@ -4166,11 +2803,7 @@ expected_error = "Unable to read supported version in negotiation."; error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; } - CheckProcessingFails( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet, - i, expected_error, error_code); + CheckProcessingFails(packet, i, expected_error, error_code); } } @@ -4188,21 +2821,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be[kMaxPacketSize] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -4217,21 +2835,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be39[kMaxPacketSize] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -4243,21 +2846,20 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - uint64_t header_size = GetPacketHeaderSize( framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER); - memset((packets[index]) + header_size + 1, 0x00, - kMaxPacketSize - header_size - 1); + memset((framer_.version() <= QUIC_VERSION_38 ? packet : packet39) + + header_size + 1, + 0x00, kMaxPacketSize - header_size - 1); std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) { @@ -4281,35 +2883,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // paddings - 0x00, 0x00, - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - // paddings - 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -4338,35 +2911,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // paddings - 0x00, 0x00, - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - // paddings - 0x00, 0x00, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -4392,15 +2936,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { @@ -4418,20 +2960,6 @@ // public flags (8 byte connection_id and 4 byte packet number) 0x28, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be[kMaxPacketSize] = { - // public flags (8 byte connection_id and 4 byte packet number) - 0x28, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -4445,20 +2973,6 @@ // public flags (8 byte connection_id and 4 byte packet number) 0x28, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x56, 0x78, 0x9A, 0xBC, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be39[kMaxPacketSize] = { - // public flags (8 byte connection_id and 4 byte packet number) - 0x28, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x56, 0x78, 0x9A, 0xBC, @@ -4469,21 +2983,20 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - uint64_t header_size = GetPacketHeaderSize( framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER); - memset((packets[index]) + header_size + 1, 0x00, - kMaxPacketSize - header_size - 1); + memset((framer_.version() <= QUIC_VERSION_38 ? packet : packet39) + + header_size + 1, + 0x00, kMaxPacketSize - header_size - 1); std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { @@ -4501,20 +3014,6 @@ // public flags (8 byte connection_id and 2 byte packet number) 0x18, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be[kMaxPacketSize] = { - // public flags (8 byte connection_id and 2 byte packet number) - 0x18, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, @@ -4528,20 +3027,6 @@ // public flags (8 byte connection_id and 2 byte packet number) 0x18, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x9A, 0xBC, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be39[kMaxPacketSize] = { - // public flags (8 byte connection_id and 2 byte packet number) - 0x18, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x9A, 0xBC, @@ -4552,21 +3037,20 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - uint64_t header_size = GetPacketHeaderSize( framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER); - memset((packets[index]) + header_size + 1, 0x00, - kMaxPacketSize - header_size - 1); + memset((framer_.version() <= QUIC_VERSION_38 ? packet : packet39) + + header_size + 1, + 0x00, kMaxPacketSize - header_size - 1); std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { @@ -4584,20 +3068,6 @@ // public flags (8 byte connection_id and 1 byte packet number) 0x08, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, - - // frame type (padding frame) - 0x00, - 0x00, 0x00, 0x00, 0x00 - }; - - unsigned char packet_cid_be[kMaxPacketSize] = { - // public flags (8 byte connection_id and 1 byte packet number) - 0x08, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, @@ -4611,24 +3081,14 @@ uint64_t header_size = GetPacketHeaderSize( framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER); - memset((QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet) + - header_size + 1, - 0x00, kMaxPacketSize - header_size - 1); + memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError( - "constructed packet", data->data(), data->length(), - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet)); + test::CompareCharArraysWithHexError("constructed packet", data->data(), + data->length(), AsChars(packet), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildStreamFramePacket) { @@ -4648,29 +3108,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin and no length) - 0xDF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -4693,29 +3130,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin and no length) - 0xDF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -4735,15 +3149,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { @@ -4763,27 +3175,6 @@ static_cast<unsigned char>( FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D), // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (stream frame with fin and no length) - 0xDF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, - // data - 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (version, 8 byte connection_id) - static_cast<unsigned char>( - FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D), - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -4805,27 +3196,6 @@ static_cast<unsigned char>( FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D), // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (stream frame with fin and no length) - 0xDF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54, - // data - 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (version, 8 byte connection_id) - static_cast<unsigned char>( - FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D), - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -4843,16 +3213,14 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { @@ -4861,15 +3229,6 @@ // public flags (version, 8 byte connection_id) 0x0D, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), - }; - - unsigned char packet_cid_be[] = { - // public flags (version, 8 byte connection_id) - 0x0D, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), @@ -4880,15 +3239,9 @@ std::unique_ptr<QuicEncryptedPacket> data( framer_.BuildVersionNegotiationPacket(connection_id, SupportedVersions(GetParam()))); - test::CompareCharArraysWithHexError( - "constructed packet", data->data(), data->length(), - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet)); + test::CompareCharArraysWithHexError("constructed packet", data->data(), + data->length(), AsChars(packet), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) { @@ -4911,27 +3264,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (ack frame) - // (no ack blocks, 2 byte largest observed, 2 byte block length) - 0x45, - // largest acked - 0x34, 0x12, - // Zero delta time. - 0x00, 0x00, - // first ack block length. - 0x34, 0x12, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -4953,27 +3285,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (ack frame) - // (no ack blocks, 2 byte largest observed, 2 byte block length) - 0x45, - // largest acked - 0x12, 0x34, - // Zero delta time. - 0x00, 0x00, - // first ack block length. - 0x12, 0x34, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, @@ -4992,15 +3303,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) { @@ -5026,45 +3335,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (ack frame) - // (has ack blocks, 2 byte largest observed, 2 byte block length) - 0x65, - // largest acked - 0x34, 0x12, - // Zero delta time. - 0x00, 0x00, - // num ack blocks ranges. - 0x04, - // first ack block length. - 0x01, 0x00, - // gap to next block. - 0x01, - // ack block length. - 0xaf, 0x0e, - // gap to next block. - 0xff, - // ack block length. - 0x00, 0x00, - // gap to next block. - 0x91, - // ack block length. - 0xea, 0x01, - // gap to next block. - 0x05, - // ack block length. - 0x04, 0x00, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -5104,45 +3374,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (ack frame) - // (has ack blocks, 2 byte largest observed, 2 byte block length) - 0x65, - // largest acked - 0x12, 0x34, - // Zero delta time. - 0x00, 0x00, - // num ack blocks ranges. - 0x04, - // first ack block length. - 0x00, 0x01, - // gap to next block. - 0x01, - // ack block length. - 0x0e, 0xaf, - // gap to next block. - 0xff, - // ack block length. - 0x00, 0x00, - // gap to next block. - 0x91, - // ack block length. - 0x01, 0xea, - // gap to next block. - 0x05, - // ack block length. - 0x00, 0x04, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, @@ -5179,15 +3410,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) { @@ -5214,99 +3443,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - // frame type (ack frame) - // (has ack blocks, 2 byte largest observed, 2 byte block length) - 0x65, - // largest acked - 0x34, 0x12, - // Zero delta time. - 0x00, 0x00, - // num ack blocks ranges. - 0xff, - // first ack block length. - 0xdd, 0x0f, - // 255 = 4 * 63 + 3 - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -5400,99 +3536,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - // frame type (ack frame) - // (has ack blocks, 2 byte largest observed, 2 byte block length) - 0x65, - // largest acked - 0x12, 0x34, - // Zero delta time. - 0x00, 0x00, - // num ack blocks ranges. - 0xff, - // first ack block length. - 0x0f, 0xdd, - // 255 = 4 * 63 + 3 - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, - // num timestamps. - 0x00, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, @@ -5583,15 +3626,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) { @@ -5611,22 +3652,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, - - // frame type (stop waiting frame) - 0x06, - // least packet number awaiting an ack, delta from packet number. - 0x1C, 0x00, 0x00, 0x00, - 0x00, 0x00, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, @@ -5642,22 +3667,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, - - // frame type (stop waiting frame) - 0x06, - // least packet number awaiting an ack, delta from packet number. - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, @@ -5670,15 +3679,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { @@ -5698,27 +3705,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (rst stream frame) - 0x01, - // stream id - 0x04, 0x03, 0x02, 0x01, - // sent byte offset - 0x01, 0x02, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08, - // error code - 0x08, 0x07, 0x06, 0x05, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -5739,27 +3725,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (rst stream frame) - 0x01, - // stream id - 0x01, 0x02, 0x03, 0x04, - // sent byte offset - 0x08, 0x07, 0x06, 0x05, - 0x04, 0x03, 0x02, 0x01, - // error code - 0x05, 0x06, 0x07, 0x08, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -5777,17 +3742,15 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - QuicFrames frames = {QuicFrame(&rst_frame)}; std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildCloseFramePacket) { @@ -5808,29 +3771,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (connection close frame) - 0x02, - // error code - 0x08, 0x07, 0x06, 0x05, - // error details length - 0x0d, 0x00, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -5853,29 +3793,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (connection close frame) - 0x02, - // error code - 0x05, 0x06, 0x07, 0x08, - // error details length - 0x00, 0x0d, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -5895,15 +3812,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildGoAwayPacket) { @@ -5925,31 +3840,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (go away frame) - 0x03, - // error code - 0x08, 0x07, 0x06, 0x05, - // stream id - 0x04, 0x03, 0x02, 0x01, - // error details length - 0x0d, 0x00, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -5974,31 +3864,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (go away frame) - 0x03, - // error code - 0x05, 0x06, 0x07, 0x08, - // stream id - 0x01, 0x02, 0x03, 0x04, - // error details length - 0x00, 0x0d, - // error details - 'b', 'e', 'c', 'a', - 'u', 's', 'e', ' ', - 'I', ' ', 'c', 'a', - 'n', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -6020,15 +3885,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { @@ -6049,25 +3912,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (window update frame) - 0x04, - // stream id - 0x04, 0x03, 0x02, 0x01, - // byte offset - 0x88, 0x77, 0x66, 0x55, - 0x44, 0x33, 0x22, 0x11, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -6086,25 +3930,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (window update frame) - 0x04, - // stream id - 0x01, 0x02, 0x03, 0x04, - // byte offset - 0x11, 0x22, 0x33, 0x44, - 0x55, 0x66, 0x77, 0x88, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -6120,15 +3945,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildBlockedPacket) { @@ -6148,22 +3971,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (blocked frame) - 0x05, - // stream id - 0x04, 0x03, 0x02, 0x01, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -6179,22 +3986,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (blocked frame) - 0x05, - // stream id - 0x01, 0x02, 0x03, 0x04, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -6207,15 +3998,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildPingPacket) { @@ -6232,20 +4021,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (ping frame) - 0x07, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -6259,20 +4034,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (ping frame) - 0x07, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -6283,15 +4044,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } // Test that the MTU discovery packet is serialized correctly as a PING packet. @@ -6309,20 +4068,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (ping frame) - 0x07, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -6336,20 +4081,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (ping frame) - 0x07, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -6360,15 +4091,13 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError("constructed packet", data->data(), - data->length(), AsChars(packets[index]), - arraysize(packet)); + test::CompareCharArraysWithHexError( + "constructed packet", data->data(), data->length(), + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildPublicResetPacketOld) { @@ -6384,25 +4113,6 @@ // public flags (public reset, 8 byte ConnectionId) 0x0E, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (1) + padding - 0x01, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte ConnectionId) - 0x0E, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) 'P', 'R', 'S', 'T', @@ -6421,15 +4131,9 @@ std::unique_ptr<QuicEncryptedPacket> data( framer_.BuildPublicResetPacket(reset_packet)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError( - "constructed packet", data->data(), data->length(), - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet)); + test::CompareCharArraysWithHexError("constructed packet", data->data(), + data->length(), AsChars(packet), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildPublicResetPacket) { @@ -6445,25 +4149,6 @@ // public flags (public reset, 8 byte ConnectionId) 0x0A, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (1) + padding - 0x01, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte ConnectionId) - 0x0A, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) @@ -6484,15 +4169,9 @@ framer_.BuildPublicResetPacket(reset_packet)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError( - "constructed packet", data->data(), data->length(), - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet)); + test::CompareCharArraysWithHexError("constructed packet", data->data(), + data->length(), AsChars(packet), + arraysize(packet)); } TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) { @@ -6510,33 +4189,6 @@ // public flags (public reset, 8 byte ConnectionId) 0x0A, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // message tag (kPRST) - 'P', 'R', 'S', 'T', - // num_entries (2) + padding - 0x02, 0x00, 0x00, 0x00, - // tag kRNON - 'R', 'N', 'O', 'N', - // end offset 8 - 0x08, 0x00, 0x00, 0x00, - // tag kCADR - 'C', 'A', 'D', 'R', - // end offset 16 - 0x10, 0x00, 0x00, 0x00, - // nonce proof - 0x89, 0x67, 0x45, 0x23, - 0x01, 0xEF, 0xCD, 0xAB, - // client address - 0x02, 0x00, - 0x7F, 0x00, 0x00, 0x01, - 0x34, 0x12, - }; - - unsigned char packet_cid_be[] = { - // public flags (public reset, 8 byte ConnectionId) - 0x0A, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // message tag (kPRST) @@ -6565,16 +4217,9 @@ framer_.BuildPublicResetPacket(reset_packet)); ASSERT_TRUE(data != nullptr); - test::CompareCharArraysWithHexError( - "constructed packet", data->data(), data->length(), - AsChars( - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? packet_cid_be - : packet), - - QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective()) - ? arraysize(packet_cid_be) - : arraysize(packet)); + test::CompareCharArraysWithHexError("constructed packet", data->data(), + data->length(), AsChars(packet), + arraysize(packet)); } TEST_P(QuicFramerTest, EncryptPacket) { @@ -6584,23 +4229,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // redundancy - 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -6617,23 +4245,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // redundancy - 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -6646,12 +4257,10 @@ 'm', 'n', 'o', 'p', }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); std::unique_ptr<QuicPacket> raw(new QuicPacket( - AsChars(packets[index]), arraysize(packet), false, - PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER)); char buffer[kMaxPacketSize]; size_t encrypted_length = framer_.EncryptPayload( @@ -6668,25 +4277,6 @@ // public flags (version, 8 byte connection_id) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '.', '1', '0', - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // redundancy - 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', - }; - - unsigned char packet_cid_be[] = { - // public flags (version, 8 byte connection_id) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '.', '1', '0', @@ -6705,25 +4295,6 @@ // public flags (version, 8 byte connection_id) 0x39, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // version tag - 'Q', '.', '1', '0', - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // redundancy - 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', - 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', - }; - - unsigned char packet_cid_be39[] = { - // public flags (version, 8 byte connection_id) - 0x39, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // version tag 'Q', '.', '1', '0', @@ -6739,12 +4310,9 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - std::unique_ptr<QuicPacket> raw(new QuicPacket( - AsChars(packets[index]), arraysize(packet), false, - PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER)); char buffer[kMaxPacketSize]; size_t encrypted_length = framer_.EncryptPayload( @@ -6862,45 +4430,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - - // frame type (ack frame) - 0x40, - // least packet number awaiting an ack - 0xA0, 0x9A, 0x78, 0x56, - 0x34, 0x12, - // largest observed packet number - 0xBF, 0x9A, 0x78, 0x56, - 0x34, 0x12, - // num missing packets - 0x01, - // missing packet - 0xBE, 0x9A, 0x78, 0x56, - 0x34, 0x12, - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -6939,45 +4468,6 @@ // public flags (8 byte connection_id) 0x38, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - - // frame type (ack frame) - 0x40, - // least packet number awaiting an ack - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xA0, - // largest observed packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBF, - // num missing packets - 0x01, - // missing packet - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBE, - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x38, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -7013,9 +4503,6 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - MockFramerVisitor visitor; framer_.set_visitor(&visitor); EXPECT_CALL(visitor, OnPacket()); @@ -7027,8 +4514,9 @@ EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true)); EXPECT_CALL(visitor, OnDecryptedPacket(_)); - QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet), - false); + QuicEncryptedPacket encrypted( + AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39), + arraysize(packet), false); EXPECT_TRUE(framer_.ProcessPacket(encrypted)); EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); } @@ -7149,33 +4637,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0xBC, 0x9A, 0x78, 0x56, - 0x34, 0x12, - // private flags - 0x00, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x04, 0x03, 0x02, 0x01, - // offset - 0x54, 0x76, 0x10, 0x32, - 0xDC, 0xFE, 0x98, 0xBA, - // data length - 0x0c, 0x00, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0xBC, 0x9A, 0x78, 0x56, @@ -7202,33 +4663,6 @@ // public flags (8 byte connection_id) 0x3C, // connection_id - 0x10, 0x32, 0x54, 0x76, - 0x98, 0xBA, 0xDC, 0xFE, - // packet number - 0x12, 0x34, 0x56, 0x78, - 0x9A, 0xBC, - // private flags - 0x00, - - // frame type (stream frame with fin) - 0xFF, - // stream id - 0x01, 0x02, 0x03, 0x04, - // offset - 0xBA, 0x98, 0xFE, 0xDC, - 0x32, 0x10, 0x76, 0x54, - // data length - 0x00, 0x0c, - // data - 'h', 'e', 'l', 'l', - 'o', ' ', 'w', 'o', - 'r', 'l', 'd', '!', - }; - - unsigned char packet_cid_be39[] = { - // public flags (8 byte connection_id) - 0x3C, - // connection_id 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, // packet number 0x12, 0x34, 0x56, 0x78, @@ -7252,10 +4686,8 @@ }; // clang-format on - unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39}; - size_t index = GetPacketIndex(framer_.version(), framer_.perspective()); - - QuicFramerFuzzFunc(packets[index], arraysize(packet)); + QuicFramerFuzzFunc(framer_.version() <= QUIC_VERSION_38 ? packet : packet39, + arraysize(packet)); } } // namespace
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc index 7233e52..5c334833 100644 --- a/net/quic/core/quic_sent_packet_manager.cc +++ b/net/quic/core/quic_sent_packet_manager.cc
@@ -105,8 +105,7 @@ config.GetInitialRoundTripTimeUsToSend()))); } // Configure congestion control. - if (FLAGS_quic_reloadable_flag_quic_allow_new_bbr && - config.HasClientRequestedIndependentOption(kTBBR, perspective_)) { + if (config.HasClientRequestedIndependentOption(kTBBR, perspective_)) { SetSendAlgorithm(kBBR); } if (config.HasClientRequestedIndependentOption(kRENO, perspective_)) {
diff --git a/net/quic/core/quic_sent_packet_manager_test.cc b/net/quic/core/quic_sent_packet_manager_test.cc index 25608411..49354b5 100644 --- a/net/quic/core/quic_sent_packet_manager_test.cc +++ b/net/quic/core/quic_sent_packet_manager_test.cc
@@ -1370,7 +1370,6 @@ } TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) { - FLAGS_quic_reloadable_flag_quic_allow_new_bbr = true; QuicConfig config; QuicTagVector options; @@ -1455,7 +1454,6 @@ } TEST_F(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) { - FLAGS_quic_reloadable_flag_quic_allow_new_bbr = true; FLAGS_quic_reloadable_flag_quic_enable_pcc = true; QuicConfig config; QuicTagVector options;
diff --git a/net/quic/core/quic_stream.cc b/net/quic/core/quic_stream.cc index 94194f4..2aa2ac93 100644 --- a/net/quic/core/quic_stream.cc +++ b/net/quic/core/quic_stream.cc
@@ -82,8 +82,9 @@ } QuicStream::~QuicStream() { - QUIC_LOG_IF(WARNING, session_ != nullptr && session_->use_stream_notifier() && - IsWaitingForAcks()) + QUIC_DLOG_IF(WARNING, session_ != nullptr && + session_->use_stream_notifier() && + IsWaitingForAcks()) << "Stream destroyed while waiting for acks."; }
diff --git a/net/quic/core/quic_utils.cc b/net/quic/core/quic_utils.cc index 62a4cac..078a26ca 100644 --- a/net/quic/core/quic_utils.cc +++ b/net/quic/core/quic_utils.cc
@@ -210,14 +210,6 @@ } // static -bool QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective perspective) { - return (perspective == Perspective::IS_CLIENT && - FLAGS_quic_restart_flag_quic_big_endian_connection_id_client) || - (perspective == Perspective::IS_SERVER && - FLAGS_quic_restart_flag_quic_big_endian_connection_id_server); -} - -// static void QuicUtils::CopyToBuffer(QuicIOVector iov, size_t iov_offset, size_t length,
diff --git a/net/quic/core/quic_utils.h b/net/quic/core/quic_utils.h index 61bff04..52bc8187 100644 --- a/net/quic/core/quic_utils.h +++ b/net/quic/core/quic_utils.h
@@ -60,12 +60,6 @@ const QuicSocketAddress& old_address, const QuicSocketAddress& new_address); - // Returns whether connection id needs to be read/write in big endian. - // TODO(fayang): Remove this method once deprecating - // FLAGS_quic_restart_flag_quic_big_endian_connection_id_client and - // FLAGS_quic_restart_flag_quic_big_endian_connection_id_server. - static bool IsConnectionIdWireFormatBigEndian(Perspective perspective); - // Copies |length| bytes from iov starting at offset |iov_offset| into buffer. // |iov| must be at least iov_offset+length total length and buffer must be // at least |length| long.
diff --git a/net/quic/quartc/quartc_factory.cc b/net/quic/quartc/quartc_factory.cc index c65a86e..08944a5 100644 --- a/net/quic/quartc/quartc_factory.cc +++ b/net/quic/quartc/quartc_factory.cc
@@ -42,7 +42,7 @@ DCHECK(task_runner_); DCHECK(!scheduled_task_); - scheduled_task_.reset(task_runner_->Schedule(this, delay_ms).release()); + scheduled_task_ = task_runner_->Schedule(this, delay_ms); } void CancelImpl() override {
diff --git a/net/quic/test_tools/delayed_verify_strike_register_client.cc b/net/quic/test_tools/delayed_verify_strike_register_client.cc deleted file mode 100644 index da736d79..0000000 --- a/net/quic/test_tools/delayed_verify_strike_register_client.cc +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2013 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 "net/quic/test_tools/delayed_verify_strike_register_client.h" - -using std::string; - -namespace net { -namespace test { - -DelayedVerifyStrikeRegisterClient::DelayedVerifyStrikeRegisterClient( - unsigned max_entries, - uint32_t current_time_external, - uint32_t window_secs, - const uint8_t orbit[8], - StrikeRegister::StartupType startup) - : LocalStrikeRegisterClient(max_entries, - current_time_external, - window_secs, - orbit, - startup), - delay_verifications_(false) {} - -DelayedVerifyStrikeRegisterClient::~DelayedVerifyStrikeRegisterClient() {} - -void DelayedVerifyStrikeRegisterClient::VerifyNonceIsValidAndUnique( - QuicStringPiece nonce, - QuicWallTime now, - ResultCallback* cb) { - if (delay_verifications_) { - pending_verifications_.push_back(VerifyArgs(nonce, now, cb)); - } else { - LocalStrikeRegisterClient::VerifyNonceIsValidAndUnique(nonce, now, cb); - } -} - -int DelayedVerifyStrikeRegisterClient::PendingVerifications() const { - return pending_verifications_.size(); -} - -void DelayedVerifyStrikeRegisterClient::RunPendingVerifications() { - std::vector<VerifyArgs> pending; - pending_verifications_.swap(pending); - for (std::vector<VerifyArgs>::const_iterator it = pending.begin(), - end = pending.end(); - it != end; ++it) { - LocalStrikeRegisterClient::VerifyNonceIsValidAndUnique(it->nonce, it->now, - it->cb); - } -} - -} // namespace test -} // namespace net
diff --git a/net/quic/test_tools/delayed_verify_strike_register_client.h b/net/quic/test_tools/delayed_verify_strike_register_client.h deleted file mode 100644 index 98be376..0000000 --- a/net/quic/test_tools/delayed_verify_strike_register_client.h +++ /dev/null
@@ -1,62 +0,0 @@ -// Copyright 2013 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. - -#ifndef NET_QUIC_TEST_TOOLS_DELAYED_VERIFY_STRIKE_REGISTER_CLIENT_H_ -#define NET_QUIC_TEST_TOOLS_DELAYED_VERIFY_STRIKE_REGISTER_CLIENT_H_ - -#include <cstdint> -#include <string> -#include <vector> - -#include "base/macros.h" -#include "net/quic/core/crypto/local_strike_register_client.h" -#include "net/quic/platform/api/quic_string_piece.h" - -namespace net { -namespace test { - -// Test helper that allows delaying execution of nonce verification -// callbacks until a later time. -class DelayedVerifyStrikeRegisterClient : public LocalStrikeRegisterClient { - public: - DelayedVerifyStrikeRegisterClient(unsigned max_entries, - uint32_t current_time_external, - uint32_t window_secs, - const uint8_t orbit[8], - StrikeRegister::StartupType startup); - ~DelayedVerifyStrikeRegisterClient() override; - - void VerifyNonceIsValidAndUnique(QuicStringPiece nonce, - QuicWallTime now, - ResultCallback* cb) override; - - // Start queueing verifications instead of executing them immediately. - void StartDelayingVerification() { delay_verifications_ = true; } - // Number of verifications that are queued. - int PendingVerifications() const; - // Run all pending verifications. - void RunPendingVerifications(); - - private: - struct VerifyArgs { - VerifyArgs(QuicStringPiece in_nonce, - QuicWallTime in_now, - ResultCallback* in_cb) - : nonce(in_nonce.as_string()), now(in_now), cb(in_cb) {} - - std::string nonce; - QuicWallTime now; - ResultCallback* cb; - }; - - bool delay_verifications_; - std::vector<VerifyArgs> pending_verifications_; - - DISALLOW_COPY_AND_ASSIGN(DelayedVerifyStrikeRegisterClient); -}; - -} // namespace test -} // namespace net - -#endif // NET_QUIC_TEST_TOOLS_DELAYED_VERIFY_STRIKE_REGISTER_CLIENT_H_
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc index e06f266..c339e185 100644 --- a/net/quic/test_tools/quic_test_utils.cc +++ b/net/quic/test_tools/quic_test_utils.cc
@@ -113,15 +113,6 @@ } } -QuicConnectionId GetPeerInMemoryConnectionId(QuicConnectionId connection_id) { - if (FLAGS_quic_restart_flag_quic_big_endian_connection_id_client == - FLAGS_quic_restart_flag_quic_big_endian_connection_id_server) { - // Both endpoints have same endianess. - return connection_id; - } - return net::QuicEndian::NetToHost64(connection_id); -} - MockFramerVisitor::MockFramerVisitor() { // By default, we want to accept packets. ON_CALL(*this, OnProtocolVersionMismatch(_)) @@ -258,29 +249,23 @@ MockQuicConnection::MockQuicConnection(MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory, Perspective perspective) - : MockQuicConnection( - QuicUtils::IsConnectionIdWireFormatBigEndian(perspective) - ? QuicEndian::NetToHost64(kTestConnectionId) - : kTestConnectionId, - QuicSocketAddress(TestPeerIPAddress(), kTestPort), - helper, - alarm_factory, - perspective, - AllSupportedVersions()) {} + : MockQuicConnection(QuicEndian::NetToHost64(kTestConnectionId), + QuicSocketAddress(TestPeerIPAddress(), kTestPort), + helper, + alarm_factory, + perspective, + AllSupportedVersions()) {} MockQuicConnection::MockQuicConnection(QuicSocketAddress address, MockQuicConnectionHelper* helper, MockAlarmFactory* alarm_factory, Perspective perspective) - : MockQuicConnection( - QuicUtils::IsConnectionIdWireFormatBigEndian(perspective) - ? QuicEndian::NetToHost64(kTestConnectionId) - : kTestConnectionId, - address, - helper, - alarm_factory, - perspective, - AllSupportedVersions()) {} + : MockQuicConnection(QuicEndian::NetToHost64(kTestConnectionId), + address, + helper, + alarm_factory, + perspective, + AllSupportedVersions()) {} MockQuicConnection::MockQuicConnection(QuicConnectionId connection_id, MockQuicConnectionHelper* helper, @@ -298,15 +283,12 @@ MockAlarmFactory* alarm_factory, Perspective perspective, const QuicVersionVector& supported_versions) - : MockQuicConnection( - QuicUtils::IsConnectionIdWireFormatBigEndian(perspective) - ? QuicEndian::NetToHost64(kTestConnectionId) - : kTestConnectionId, - QuicSocketAddress(TestPeerIPAddress(), kTestPort), - helper, - alarm_factory, - perspective, - supported_versions) {} + : MockQuicConnection(QuicEndian::NetToHost64(kTestConnectionId), + QuicSocketAddress(TestPeerIPAddress(), kTestPort), + helper, + alarm_factory, + perspective, + supported_versions) {} MockQuicConnection::MockQuicConnection( QuicConnectionId connection_id,
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h index 7553d65..e6aa723 100644 --- a/net/quic/test_tools/quic_test_utils.h +++ b/net/quic/test_tools/quic_test_utils.h
@@ -178,10 +178,6 @@ // Compute SHA-1 hash of the supplied std::string. std::string Sha1Hash(QuicStringPiece data); -// Given endpoint in memory |connection_id|, returns peer's in memory connection -// id. -QuicConnectionId GetPeerInMemoryConnectionId(QuicConnectionId connection_id); - // Simple random number generator used to compute random numbers suitable // for pseudo-randomly dropping packets in tests. It works by computing // the sha1 hash of the current seed, and using the first 64 bits as
diff --git a/net/quic/test_tools/simulator/quic_endpoint_test.cc b/net/quic/test_tools/simulator/quic_endpoint_test.cc index fffd3638..f402908 100644 --- a/net/quic/test_tools/simulator/quic_endpoint_test.cc +++ b/net/quic/test_tools/simulator/quic_endpoint_test.cc
@@ -15,7 +15,6 @@ using ::testing::_; using ::testing::NiceMock; using ::testing::Return; -using net::test::GetPeerInMemoryConnectionId; namespace net { namespace simulator { @@ -48,8 +47,7 @@ QuicEndpoint endpoint_a(&simulator_, "Endpoint A", "Endpoint B", Perspective::IS_CLIENT, 42); QuicEndpoint endpoint_b(&simulator_, "Endpoint B", "Endpoint A", - Perspective::IS_SERVER, - GetPeerInMemoryConnectionId(42)); + Perspective::IS_SERVER, 42); auto link_a = Link(&endpoint_a, switch_.port(1)); auto link_b = Link(&endpoint_b, switch_.port(2)); @@ -84,8 +82,7 @@ QuicEndpoint endpoint_a(&simulator_, "Endpoint A", "Endpoint B", Perspective::IS_CLIENT, 42); QuicEndpoint endpoint_b(&simulator_, "Endpoint B", "Endpoint A", - Perspective::IS_SERVER, - GetPeerInMemoryConnectionId(42)); + Perspective::IS_SERVER, 42); auto link_a = Link(&endpoint_a, switch_.port(1)); auto link_b = Link(&endpoint_b, switch_.port(2)); @@ -125,8 +122,7 @@ QuicEndpoint endpoint_a(&simulator_, "Endpoint A", "Endpoint B", Perspective::IS_CLIENT, 42); QuicEndpoint endpoint_b(&simulator_, "Endpoint B", "Endpoint A", - Perspective::IS_SERVER, - GetPeerInMemoryConnectionId(42)); + Perspective::IS_SERVER, 42); auto link_a = Link(&endpoint_a, switch_.port(1)); auto link_b = Link(&endpoint_b, switch_.port(2)); @@ -154,14 +150,11 @@ auto endpoint_c = QuicMakeUnique<QuicEndpoint>( &simulator_, "Endpoint C", "Endpoint D (C)", Perspective::IS_CLIENT, 44); auto endpoint_d_a = QuicMakeUnique<QuicEndpoint>( - &simulator_, "Endpoint D (A)", "Endpoint A", Perspective::IS_SERVER, - GetPeerInMemoryConnectionId(42)); + &simulator_, "Endpoint D (A)", "Endpoint A", Perspective::IS_SERVER, 42); auto endpoint_d_b = QuicMakeUnique<QuicEndpoint>( - &simulator_, "Endpoint D (B)", "Endpoint B", Perspective::IS_SERVER, - GetPeerInMemoryConnectionId(43)); + &simulator_, "Endpoint D (B)", "Endpoint B", Perspective::IS_SERVER, 43); auto endpoint_d_c = QuicMakeUnique<QuicEndpoint>( - &simulator_, "Endpoint D (C)", "Endpoint C", Perspective::IS_SERVER, - GetPeerInMemoryConnectionId(44)); + &simulator_, "Endpoint D (C)", "Endpoint C", Perspective::IS_SERVER, 44); QuicEndpointMultiplexer endpoint_d( "Endpoint D", {endpoint_d_a.get(), endpoint_d_b.get(), endpoint_d_c.get()});
diff --git a/net/tools/quic/chlo_extractor_test.cc b/net/tools/quic/chlo_extractor_test.cc index 54f5a310..90de56b 100644 --- a/net/tools/quic/chlo_extractor_test.cc +++ b/net/tools/quic/chlo_extractor_test.cc
@@ -95,8 +95,7 @@ EXPECT_TRUE(ChloExtractor::Extract(*packet_, versions, &delegate_)) << QuicVersionToString(version); EXPECT_EQ(version, delegate_.version()); - EXPECT_EQ(GetPeerInMemoryConnectionId(header_.public_header.connection_id), - delegate_.connection_id()); + EXPECT_EQ(header_.public_header.connection_id, delegate_.connection_id()); EXPECT_EQ(client_hello.DebugString(Perspective::IS_SERVER), delegate_.chlo()) << QuicVersionToString(version);
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc index 2278c61d..3d1c0ac 100644 --- a/net/tools/quic/end_to_end_test.cc +++ b/net/tools/quic/end_to_end_test.cc
@@ -88,9 +88,7 @@ QuicTag congestion_control_tag, bool disable_hpack_dynamic_table, bool force_hol_blocking, - bool use_cheap_stateless_reject, - bool connection_id_big_endian_client, - bool connection_id_big_endian_server) + bool use_cheap_stateless_reject) : client_supported_versions(client_supported_versions), server_supported_versions(server_supported_versions), negotiated_version(negotiated_version), @@ -100,9 +98,7 @@ congestion_control_tag(congestion_control_tag), disable_hpack_dynamic_table(disable_hpack_dynamic_table), force_hol_blocking(force_hol_blocking), - use_cheap_stateless_reject(use_cheap_stateless_reject), - connection_id_big_endian_client(connection_id_big_endian_client), - connection_id_big_endian_server(connection_id_big_endian_server) {} + use_cheap_stateless_reject(use_cheap_stateless_reject) {} friend std::ostream& operator<<(std::ostream& os, const TestParams& p) { os << "{ server_supported_versions: " @@ -118,11 +114,8 @@ << QuicTagToString(p.congestion_control_tag); os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table; os << " force_hol_blocking: " << p.force_hol_blocking; - os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject; - os << " connection_id_big_endian_client: " - << p.connection_id_big_endian_client; - os << " connection_id_big_endian_server: " - << p.connection_id_big_endian_server << " }"; + os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject + << " }"; return os; } @@ -135,8 +128,6 @@ bool disable_hpack_dynamic_table; bool force_hol_blocking; bool use_cheap_stateless_reject; - bool connection_id_big_endian_client; - bool connection_id_big_endian_server; }; // Constructs various test permutations. @@ -162,7 +153,7 @@ // This must be kept in sync with the number of nested for-loops below as it // is used to prune the number of tests that are run. - const int kMaxEnabledOptions = 7; + const int kMaxEnabledOptions = 5; int max_enabled_options = 0; std::vector<TestParams> params; for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) { @@ -172,101 +163,84 @@ for (bool disable_hpack_dynamic_table : {false}) { for (bool force_hol_blocking : {true, false}) { for (bool use_cheap_stateless_reject : {true, false}) { - for (bool connection_id_big_endian_client : {true, false}) { - for (bool connection_id_big_endian_server : {true, false}) { - int enabled_options = 0; - if (force_hol_blocking) { - ++enabled_options; - } - if (congestion_control_tag != kQBIC) { - ++enabled_options; - } - if (disable_hpack_dynamic_table) { - ++enabled_options; - } - if (client_supports_stateless_rejects) { - ++enabled_options; - } - if (server_uses_stateless_rejects_if_peer_supported) { - ++enabled_options; - } - if (use_cheap_stateless_reject) { - ++enabled_options; - } - if (connection_id_big_endian_server) { - ++enabled_options; - } - if (connection_id_big_endian_client) { - ++enabled_options; - } - CHECK_GE(kMaxEnabledOptions, enabled_options); - if (enabled_options > max_enabled_options) { - max_enabled_options = enabled_options; - } + int enabled_options = 0; + if (force_hol_blocking) { + ++enabled_options; + } + if (congestion_control_tag != kQBIC) { + ++enabled_options; + } + if (disable_hpack_dynamic_table) { + ++enabled_options; + } + if (client_supports_stateless_rejects) { + ++enabled_options; + } + if (server_uses_stateless_rejects_if_peer_supported) { + ++enabled_options; + } + if (use_cheap_stateless_reject) { + ++enabled_options; + } + CHECK_GE(kMaxEnabledOptions, enabled_options); + if (enabled_options > max_enabled_options) { + max_enabled_options = enabled_options; + } - // Run tests with no options, a single option, or all the - // options enabled to avoid a combinatorial explosion. - if (enabled_options > 1 && - enabled_options < kMaxEnabledOptions) { + // Run tests with no options, a single option, or all the + // options enabled to avoid a combinatorial explosion. + if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) { + continue; + } + + for (const QuicVersionVector& client_versions : version_buckets) { + CHECK(!client_versions.empty()); + if (FilterSupportedVersions(client_versions).empty()) { + continue; + } + // Add an entry for server and client supporting all + // versions. + params.push_back(TestParams( + client_versions, all_supported_versions, + client_versions.front(), client_supports_stateless_rejects, + server_uses_stateless_rejects_if_peer_supported, + congestion_control_tag, disable_hpack_dynamic_table, + force_hol_blocking, use_cheap_stateless_reject)); + + // Run version negotiation tests tests with no options, or + // all the options enabled to avoid a combinatorial + // explosion. + if (enabled_options > 1 && + enabled_options < kMaxEnabledOptions) { + continue; + } + + // Test client supporting all versions and server supporting + // 1 version. Simulate an old server and exercise version + // downgrade in the client. Protocol negotiation should + // occur. Skip the i = 0 case because it is essentially the + // same as the default case. + for (size_t i = 1; i < client_versions.size(); ++i) { + QuicVersionVector server_supported_versions; + server_supported_versions.push_back(client_versions[i]); + if (FilterSupportedVersions(server_supported_versions) + .empty()) { continue; } - - for (const QuicVersionVector& client_versions : - version_buckets) { - CHECK(!client_versions.empty()); - if (FilterSupportedVersions(client_versions).empty()) { - continue; - } - // Add an entry for server and client supporting all - // versions. - params.push_back(TestParams( - client_versions, all_supported_versions, - client_versions.front(), - client_supports_stateless_rejects, - server_uses_stateless_rejects_if_peer_supported, - congestion_control_tag, disable_hpack_dynamic_table, - force_hol_blocking, use_cheap_stateless_reject, - connection_id_big_endian_client, - connection_id_big_endian_server)); - - // Run version negotiation tests tests with no options, or - // all the options enabled to avoid a combinatorial - // explosion. - if (enabled_options > 1 && - enabled_options < kMaxEnabledOptions) { - continue; - } - - // Test client supporting all versions and server supporting - // 1 version. Simulate an old server and exercise version - // downgrade in the client. Protocol negotiation should - // occur. Skip the i = 0 case because it is essentially the - // same as the default case. - for (size_t i = 1; i < client_versions.size(); ++i) { - QuicVersionVector server_supported_versions; - server_supported_versions.push_back(client_versions[i]); - if (FilterSupportedVersions(server_supported_versions) - .empty()) { - continue; - } - params.push_back(TestParams( - client_versions, server_supported_versions, - server_supported_versions.front(), - client_supports_stateless_rejects, - server_uses_stateless_rejects_if_peer_supported, - congestion_control_tag, disable_hpack_dynamic_table, - force_hol_blocking, use_cheap_stateless_reject, - connection_id_big_endian_client, - connection_id_big_endian_server)); - } // End of version for loop. - } // End of 2nd version for loop. - } // End of connection_id_big_endian_server - } // End of connection_id_big_endian_client - } // End of use_cheap_stateless_reject for loop. - } // End of force_hol_blocking loop. - } // End of disable_hpack_dynamic_table for loop. - } // End of congestion_control_tag for loop. - } // End of client_supports_stateless_rejects for loop. + params.push_back(TestParams( + client_versions, server_supported_versions, + server_supported_versions.front(), + client_supports_stateless_rejects, + server_uses_stateless_rejects_if_peer_supported, + congestion_control_tag, disable_hpack_dynamic_table, + force_hol_blocking, use_cheap_stateless_reject)); + } // End of version for loop. + } // End of 2nd version for loop. + } // End of use_cheap_stateless_reject for loop. + } // End of force_hol_blocking loop. + } // End of disable_hpack_dynamic_table for loop. + } // End of congestion_control_tag for loop. + } // End of client_supports_stateless_rejects for loop. CHECK_EQ(kMaxEnabledOptions, max_enabled_options); } // End of server_uses_stateless_rejects_if_peer_supported for loop. return params; @@ -334,11 +308,6 @@ AddToCache("/foo", 200, kFooResponseBody); AddToCache("/bar", 200, kBarResponseBody); - - FLAGS_quic_restart_flag_quic_big_endian_connection_id_client = - GetParam().connection_id_big_endian_client; - FLAGS_quic_restart_flag_quic_big_endian_connection_id_server = - GetParam().connection_id_big_endian_server; } ~EndToEndTest() override { @@ -1354,7 +1323,6 @@ } TEST_P(EndToEndTest, NegotiateCongestionControl) { - FLAGS_quic_reloadable_flag_quic_allow_new_bbr = true; ASSERT_TRUE(Initialize()); // For PCC, the underlying implementation may be a stub with a @@ -2022,8 +1990,7 @@ QuicConnectionId connection_id = client_->client()->session()->connection()->connection_id(); QuicPublicResetPacket header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(connection_id); + header.public_header.connection_id = connection_id; header.public_header.reset_flag = true; header.public_header.version_flag = false; QuicFramer framer(server_supported_versions_, QuicTime::Zero(), @@ -2055,8 +2022,7 @@ QuicConnectionId incorrect_connection_id = client_->client()->session()->connection()->connection_id() + 1; QuicPublicResetPacket header; - header.public_header.connection_id = - GetPeerInMemoryConnectionId(incorrect_connection_id); + header.public_header.connection_id = incorrect_connection_id; header.public_header.reset_flag = true; header.public_header.version_flag = false; QuicFramer framer(server_supported_versions_, QuicTime::Zero(), @@ -2119,9 +2085,8 @@ QuicConnectionId incorrect_connection_id = client_->client()->session()->connection()->connection_id() + 1; std::unique_ptr<QuicEncryptedPacket> packet( - QuicFramer::BuildVersionNegotiationPacket( - GetPeerInMemoryConnectionId(incorrect_connection_id), - server_supported_versions_)); + QuicFramer::BuildVersionNegotiationPacket(incorrect_connection_id, + server_supported_versions_)); testing::NiceMock<MockQuicConnectionDebugVisitor> visitor; client_->client()->session()->connection()->set_debug_visitor(&visitor); EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id))
diff --git a/net/tools/quic/platform/impl/quic_socket_utils.cc b/net/tools/quic/platform/impl/quic_socket_utils.cc index 621767c..e188da2e 100644 --- a/net/tools/quic/platform/impl/quic_socket_utils.cc +++ b/net/tools/quic/platform/impl/quic_socket_utils.cc
@@ -249,7 +249,7 @@ (kSpaceForIpv4 < kSpaceForIpv6) ? kSpaceForIpv6 : kSpaceForIpv4; char cbuf[kSpaceForIp]; if (!self_address.IsInitialized()) { - hdr.msg_control = 0; + hdr.msg_control = nullptr; hdr.msg_controllen = 0; } else { hdr.msg_control = cbuf;
diff --git a/net/tools/quic/quic_client_session_test.cc b/net/tools/quic/quic_client_session_test.cc index df2a8fa6..87ab095 100644 --- a/net/tools/quic/quic_client_session_test.cc +++ b/net/tools/quic/quic_client_session_test.cc
@@ -347,9 +347,8 @@ // Verify that a non-decryptable packet doesn't close the connection. QuicConnectionId connection_id = session_->connection()->connection_id(); std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( - GetPeerInMemoryConnectionId(connection_id), false, false, 100, "data", - PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr, - Perspective::IS_SERVER)); + connection_id, false, false, 100, "data", PACKET_8BYTE_CONNECTION_ID, + PACKET_6BYTE_PACKET_NUMBER, nullptr, Perspective::IS_SERVER)); std::unique_ptr<QuicReceivedPacket> received( ConstructReceivedPacket(*packet, QuicTime::Zero())); // Change the last byte of the encrypted data. @@ -373,9 +372,8 @@ QuicConnectionId connection_id = session_->connection()->connection_id(); QuicVersionVector versions = {GetParam()}; std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket( - GetPeerInMemoryConnectionId(connection_id), false, false, 100, "data", - PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, &versions, - Perspective::IS_SERVER)); + connection_id, false, false, 100, "data", PACKET_8BYTE_CONNECTION_ID, + PACKET_6BYTE_PACKET_NUMBER, &versions, Perspective::IS_SERVER)); std::unique_ptr<QuicReceivedPacket> received( ConstructReceivedPacket(*packet, QuicTime::Zero())); EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(1);
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc index 55e39e7..95c73c1 100644 --- a/net/tools/quic/quic_dispatcher_test.cc +++ b/net/tools/quic/quic_dispatcher_test.cc
@@ -257,9 +257,8 @@ QuicPacketNumber packet_number) { QuicVersionVector versions(SupportedVersions(version)); std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( - GetPeerInMemoryConnectionId(connection_id), has_version_flag, false, - packet_number, data, connection_id_length, packet_number_length, - &versions)); + connection_id, has_version_flag, false, packet_number, data, + connection_id_length, packet_number_length, &versions)); std::unique_ptr<QuicReceivedPacket> received_packet( ConstructReceivedPacket(*packet, helper_.GetClock()->Now()));
diff --git a/net/tools/quic/quic_time_wait_list_manager_test.cc b/net/tools/quic/quic_time_wait_list_manager_test.cc index e81ffae..c9e7a8e 100644 --- a/net/tools/quic/quic_time_wait_list_manager_test.cc +++ b/net/tools/quic/quic_time_wait_list_manager_test.cc
@@ -154,8 +154,7 @@ std::tr1::get<1>(packet_buffer)); framer.ProcessPacket(encrypted); QuicPublicResetPacket packet = visitor.public_reset_packet(); - return connection_id_ == GetPeerInMemoryConnectionId( - packet.public_header.connection_id) && + return connection_id_ == packet.public_header.connection_id && packet.public_header.reset_flag && !packet.public_header.version_flag && net::test::TestPeerIPAddress() == packet.client_address.host() &&
diff --git a/services/preferences/public/cpp/pref_store_client.h b/services/preferences/public/cpp/pref_store_client.h index b4d8245..b7ca96e9 100644 --- a/services/preferences/public/cpp/pref_store_client.h +++ b/services/preferences/public/cpp/pref_store_client.h
@@ -12,8 +12,6 @@ namespace prefs { -// TODO(tibell): Make PrefObserverStore use PrefStoreClient as a base class. - // An implementation of PrefStore which uses prefs::mojom::PrefStore as // the backing store of the preferences. //
diff --git a/services/service_manager/background/tests/BUILD.gn b/services/service_manager/background/tests/BUILD.gn index ad7b6ff..1e37afde 100644 --- a/services/service_manager/background/tests/BUILD.gn +++ b/services/service_manager/background/tests/BUILD.gn
@@ -32,9 +32,6 @@ sources = [ "test.mojom", ] - - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false } service("background_service_manager_test_service") {
diff --git a/services/service_manager/background/tests/test_service.cc b/services/service_manager/background/tests/test_service.cc index 4290dc8..695a4d24 100644 --- a/services/service_manager/background/tests/test_service.cc +++ b/services/service_manager/background/tests/test_service.cc
@@ -33,9 +33,7 @@ } // mojom::TestService - void Test(const TestCallback& callback) override { - callback.Run(); - } + void Test(TestCallback callback) override { std::move(callback).Run(); } void BindTestServiceRequest(const BindSourceInfo& source_info, mojom::TestServiceRequest request) {
diff --git a/services/service_manager/connect_params.cc b/services/service_manager/connect_params.cc index 7947a75..44a6428 100644 --- a/services/service_manager/connect_params.cc +++ b/services/service_manager/connect_params.cc
@@ -9,7 +9,7 @@ ConnectParams::ConnectParams() {} ConnectParams::~ConnectParams() { if (!start_service_callback_.is_null()) - start_service_callback_.Run(result_, resolved_identity_); + std::move(start_service_callback_).Run(result_, resolved_identity_); } } // namespace service_manager
diff --git a/services/service_manager/connect_params.h b/services/service_manager/connect_params.h index c0cbf65..7089ed18 100644 --- a/services/service_manager/connect_params.h +++ b/services/service_manager/connect_params.h
@@ -62,8 +62,8 @@ } void set_start_service_callback( - const Connector::StartServiceCallback& callback) { - start_service_callback_ = callback; + mojom::Connector::StartServiceCallback callback) { + start_service_callback_ = std::move(callback); } void set_response_data(mojom::ConnectResult result,
diff --git a/services/service_manager/public/cpp/service_context.cc b/services/service_manager/public/cpp/service_context.cc index 48dcf7db..a8241d8 100644 --- a/services/service_manager/public/cpp/service_context.cc +++ b/services/service_manager/public/cpp/service_context.cc
@@ -117,10 +117,10 @@ // ServiceContext, mojom::Service implementation: void ServiceContext::OnStart(const Identity& identity, - const OnStartCallback& callback) { + OnStartCallback callback) { identity_ = identity; - callback.Run(std::move(pending_connector_request_), - mojo::MakeRequest(&service_control_)); + std::move(callback).Run(std::move(pending_connector_request_), + mojo::MakeRequest(&service_control_)); service_->OnStart(); } @@ -128,9 +128,9 @@ const BindSourceInfo& source_info, const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe, - const OnBindInterfaceCallback& callback) { + OnBindInterfaceCallback callback) { // Acknowledge the request regardless of whether it's accepted. - callback.Run(); + std::move(callback).Run(); BinderRegistry* global_registry = GetGlobalBinderRegistryForService(identity_.name());
diff --git a/services/service_manager/public/cpp/service_context.h b/services/service_manager/public/cpp/service_context.h index c524864..808d1c85 100644 --- a/services/service_manager/public/cpp/service_context.h +++ b/services/service_manager/public/cpp/service_context.h
@@ -124,11 +124,11 @@ friend class service_manager::Service; // mojom::Service: - void OnStart(const Identity& info, const OnStartCallback& callback) override; + void OnStart(const Identity& info, OnStartCallback callback) override; void OnBindInterface(const BindSourceInfo& source_info, const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe, - const OnBindInterfaceCallback& callback) override; + OnBindInterfaceCallback callback) override; void OnConnectionError();
diff --git a/services/service_manager/public/interfaces/BUILD.gn b/services/service_manager/public/interfaces/BUILD.gn index 9cf87d8..e91d473 100644 --- a/services/service_manager/public/interfaces/BUILD.gn +++ b/services/service_manager/public/interfaces/BUILD.gn
@@ -23,9 +23,6 @@ "//mojo/common:common_custom_types", ] - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false - # TODO(crbug.com/699569): Convert to use the new JS bindings. use_new_js_bindings = false }
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc index 9d37a60..abaabd5 100644 --- a/services/service_manager/service_manager.cc +++ b/services/service_manager/service_manager.cc
@@ -409,12 +409,12 @@ void BindInterface(const service_manager::Identity& in_target, const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe, - const BindInterfaceCallback& callback) override { + BindInterfaceCallback callback) override { Identity target = in_target; mojom::ConnectResult result = ValidateConnectParams(&target, nullptr, nullptr); if (!Succeeded(result)) { - callback.Run(result, Identity()); + std::move(callback).Run(result, Identity()); return; } @@ -423,24 +423,24 @@ params->set_target(target); params->set_interface_request_info(interface_name, std::move(interface_pipe)); - params->set_start_service_callback(callback); + params->set_start_service_callback(std::move(callback)); service_manager_->Connect(std::move(params)); } void StartService(const Identity& in_target, - const StartServiceCallback& callback) override { + StartServiceCallback callback) override { Identity target = in_target; mojom::ConnectResult result = ValidateConnectParams(&target, nullptr, nullptr); if (!Succeeded(result)) { - callback.Run(result, Identity()); + std::move(callback).Run(result, Identity()); return; } std::unique_ptr<ConnectParams> params(new ConnectParams); params->set_source(identity_); params->set_target(target); - params->set_start_service_callback(callback); + params->set_start_service_callback(std::move(callback)); service_manager_->Connect(std::move(params)); } @@ -448,12 +448,12 @@ const Identity& in_target, mojo::ScopedMessagePipeHandle service_handle, mojom::PIDReceiverRequest pid_receiver_request, - const StartServiceWithProcessCallback& callback) override { + StartServiceWithProcessCallback callback) override { Identity target = in_target; mojom::ConnectResult result = ValidateConnectParams(&target, nullptr, nullptr); if (!Succeeded(result)) { - callback.Run(result, Identity()); + std::move(callback).Run(result, Identity()); return; } @@ -465,7 +465,7 @@ service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0)); params->set_client_process_info(std::move(service), std::move(pid_receiver_request)); - params->set_start_service_callback(callback); + params->set_start_service_callback(std::move(callback)); service_manager_->Connect(std::move(params)); }
diff --git a/services/service_manager/tests/connect/BUILD.gn b/services/service_manager/tests/connect/BUILD.gn index 4782e80..79df3ab 100644 --- a/services/service_manager/tests/connect/BUILD.gn +++ b/services/service_manager/tests/connect/BUILD.gn
@@ -39,9 +39,6 @@ deps = [ "//services/service_manager/public/interfaces", ] - - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false } service_manifest("manifest") {
diff --git a/services/service_manager/tests/connect/connect_test_app.cc b/services/service_manager/tests/connect/connect_test_app.cc index ab4ce52c5..8431a9e 100644 --- a/services/service_manager/tests/connect/connect_test_app.cc +++ b/services/service_manager/tests/connect/connect_test_app.cc
@@ -111,25 +111,25 @@ } // test::mojom::ConnectTestService: - void GetTitle(const GetTitleCallback& callback) override { - callback.Run("APP"); + void GetTitle(GetTitleCallback callback) override { + std::move(callback).Run("APP"); } - void GetInstance(const GetInstanceCallback& callback) override { - callback.Run(context()->identity().instance()); + void GetInstance(GetInstanceCallback callback) override { + std::move(callback).Run(context()->identity().instance()); } // test::mojom::StandaloneApp: void ConnectToAllowedAppInBlockedPackage( - const ConnectToAllowedAppInBlockedPackageCallback& callback) override { + ConnectToAllowedAppInBlockedPackageCallback callback) override { base::RunLoop run_loop; test::mojom::ConnectTestServicePtr test_service; context()->connector()->BindInterface("connect_test_a", &test_service); test_service.set_connection_error_handler( base::Bind(&ConnectTestApp::OnConnectionBlocked, base::Unretained(this), - callback, &run_loop)); - test_service->GetTitle( - base::Bind(&ConnectTestApp::OnGotTitle, base::Unretained(this), - callback, &run_loop)); + base::Unretained(&callback), &run_loop)); + test_service->GetTitle(base::Bind(&ConnectTestApp::OnGotTitle, + base::Unretained(this), + base::Unretained(&callback), &run_loop)); { // This message is dispatched as a task on the same run loop, so we need // to allow nesting in order to pump additional signals. @@ -139,7 +139,7 @@ } } void ConnectToClassInterface( - const ConnectToClassInterfaceCallback& callback) override { + ConnectToClassInterfaceCallback callback) override { test::mojom::ClassInterfacePtr class_interface; context()->connector()->BindInterface("connect_test_class_app", &class_interface); @@ -161,18 +161,18 @@ base::MessageLoop::current()); loop.Run(); } - callback.Run(ping_response, title_response); + std::move(callback).Run(ping_response, title_response); } // test::mojom::BlockedInterface: - void GetTitleBlocked(const GetTitleBlockedCallback& callback) override { - callback.Run("Called Blocked Interface!"); + void GetTitleBlocked(GetTitleBlockedCallback callback) override { + std::move(callback).Run("Called Blocked Interface!"); } // test::mojom::UserIdTest: void ConnectToClassAppAsDifferentUser( const service_manager::Identity& target, - const ConnectToClassAppAsDifferentUserCallback& callback) override { + ConnectToClassAppAsDifferentUserCallback callback) override { context()->connector()->StartService(target); mojom::ConnectResult result; Identity resolved_identity; @@ -185,21 +185,20 @@ base::MessageLoop::current()); loop.Run(); } - callback.Run(static_cast<int32_t>(result), resolved_identity); + std::move(callback).Run(static_cast<int32_t>(result), resolved_identity); } void OnConnectionBlocked( - const ConnectToAllowedAppInBlockedPackageCallback& callback, + ConnectToAllowedAppInBlockedPackageCallback* callback, base::RunLoop* run_loop) { - callback.Run("uninitialized"); + std::move(*callback).Run("uninitialized"); run_loop->Quit(); } - void OnGotTitle( - const ConnectToAllowedAppInBlockedPackageCallback& callback, - base::RunLoop* run_loop, - const std::string& title) { - callback.Run(title); + void OnGotTitle(ConnectToAllowedAppInBlockedPackageCallback* callback, + base::RunLoop* run_loop, + const std::string& title) { + std::move(*callback).Run(title); run_loop->Quit(); }
diff --git a/services/service_manager/tests/connect/connect_test_class_app.cc b/services/service_manager/tests/connect/connect_test_class_app.cc index 1c054ca..fc7dd5a8c 100644 --- a/services/service_manager/tests/connect/connect_test_class_app.cc +++ b/services/service_manager/tests/connect/connect_test_class_app.cc
@@ -64,17 +64,15 @@ } // test::mojom::ConnectTestService: - void GetTitle(const GetTitleCallback& callback) override { - callback.Run("CLASS APP"); + void GetTitle(GetTitleCallback callback) override { + std::move(callback).Run("CLASS APP"); } - void GetInstance(const GetInstanceCallback& callback) override { - callback.Run(context()->identity().instance()); + void GetInstance(GetInstanceCallback callback) override { + std::move(callback).Run(context()->identity().instance()); } // test::mojom::ClassInterface: - void Ping(const PingCallback& callback) override { - callback.Run("PONG"); - } + void Ping(PingCallback callback) override { std::move(callback).Run("PONG"); } void HandleQuit() { context()->QuitNow(); }
diff --git a/services/service_manager/tests/connect/connect_test_exe.cc b/services/service_manager/tests/connect/connect_test_exe.cc index a57a94b3..d88e8cf 100644 --- a/services/service_manager/tests/connect/connect_test_exe.cc +++ b/services/service_manager/tests/connect/connect_test_exe.cc
@@ -43,12 +43,12 @@ } // ConnectTestService: - void GetTitle(const GetTitleCallback& callback) override { - callback.Run("connect_test_exe"); + void GetTitle(GetTitleCallback callback) override { + std::move(callback).Run("connect_test_exe"); } - void GetInstance(const GetInstanceCallback& callback) override { - callback.Run(context()->identity().instance()); + void GetInstance(GetInstanceCallback callback) override { + std::move(callback).Run(context()->identity().instance()); } service_manager::BinderRegistry registry_;
diff --git a/services/service_manager/tests/connect/connect_test_package.cc b/services/service_manager/tests/connect/connect_test_package.cc index 192a0c89..f8a0972 100644 --- a/services/service_manager/tests/connect/connect_test_package.cc +++ b/services/service_manager/tests/connect/connect_test_package.cc
@@ -109,23 +109,23 @@ } // test::mojom::ConnectTestService: - void GetTitle(const GetTitleCallback& callback) override { - callback.Run(title_); + void GetTitle(GetTitleCallback callback) override { + std::move(callback).Run(title_); } - void GetInstance(const GetInstanceCallback& callback) override { - callback.Run(context()->identity().instance()); + void GetInstance(GetInstanceCallback callback) override { + std::move(callback).Run(context()->identity().instance()); } // test::mojom::BlockedInterface: - void GetTitleBlocked(const GetTitleBlockedCallback& callback) override { - callback.Run("Called Blocked Interface!"); + void GetTitleBlocked(GetTitleBlockedCallback callback) override { + std::move(callback).Run("Called Blocked Interface!"); } // test::mojom::UserIdTest: void ConnectToClassAppAsDifferentUser( const service_manager::Identity& target, - const ConnectToClassAppAsDifferentUserCallback& callback) override { + ConnectToClassAppAsDifferentUserCallback callback) override { context()->connector()->StartService(target); mojom::ConnectResult result; Identity resolved_identity; @@ -138,7 +138,7 @@ base::MessageLoop::current()); loop.Run(); } - callback.Run(static_cast<int32_t>(result), resolved_identity); + std::move(callback).Run(static_cast<int32_t>(result), resolved_identity); } // base::SimpleThread: @@ -225,12 +225,12 @@ } // test::mojom::ConnectTestService: - void GetTitle(const GetTitleCallback& callback) override { - callback.Run("ROOT"); + void GetTitle(GetTitleCallback callback) override { + std::move(callback).Run("ROOT"); } - void GetInstance(const GetInstanceCallback& callback) override { - callback.Run(context()->identity().instance()); + void GetInstance(GetInstanceCallback callback) override { + std::move(callback).Run(context()->identity().instance()); } void OnConnectionError() {
diff --git a/services/service_manager/tests/lifecycle/BUILD.gn b/services/service_manager/tests/lifecycle/BUILD.gn index f738aaf..e5bef8b 100644 --- a/services/service_manager/tests/lifecycle/BUILD.gn +++ b/services/service_manager/tests/lifecycle/BUILD.gn
@@ -36,9 +36,6 @@ sources = [ "lifecycle_unittest.mojom", ] - - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false } service_manifest("manifest") {
diff --git a/services/service_manager/tests/lifecycle/app_client.cc b/services/service_manager/tests/lifecycle/app_client.cc index 2df9e51..028ace0a 100644 --- a/services/service_manager/tests/lifecycle/app_client.cc +++ b/services/service_manager/tests/lifecycle/app_client.cc
@@ -35,8 +35,8 @@ bindings_.AddBinding(this, std::move(request)); } -void AppClient::Ping(const PingCallback& callback) { - callback.Run(); +void AppClient::Ping(PingCallback callback) { + std::move(callback).Run(); } void AppClient::GracefulQuit() {
diff --git a/services/service_manager/tests/lifecycle/app_client.h b/services/service_manager/tests/lifecycle/app_client.h index ca6e157..2202e95 100644 --- a/services/service_manager/tests/lifecycle/app_client.h +++ b/services/service_manager/tests/lifecycle/app_client.h
@@ -37,7 +37,7 @@ mojom::LifecycleControlRequest request); // LifecycleControl: - void Ping(const PingCallback& callback) override; + void Ping(PingCallback callback) override; void GracefulQuit() override; void Crash() override; void CloseServiceManagerConnection() override;
diff --git a/services/service_manager/tests/lifecycle/package.cc b/services/service_manager/tests/lifecycle/package.cc index 8e5be519..68c8a8e 100644 --- a/services/service_manager/tests/lifecycle/package.cc +++ b/services/service_manager/tests/lifecycle/package.cc
@@ -53,9 +53,7 @@ } // LifecycleControl: - void Ping(const PingCallback& callback) override { - callback.Run(); - } + void Ping(PingCallback callback) override { std::move(callback).Run(); } void GracefulQuit() override { service_manager_connection_closed_callback_.Run();
diff --git a/services/service_manager/tests/lifecycle/parent.cc b/services/service_manager/tests/lifecycle/parent.cc index 80af49bc..b6f85c2 100644 --- a/services/service_manager/tests/lifecycle/parent.cc +++ b/services/service_manager/tests/lifecycle/parent.cc
@@ -48,7 +48,7 @@ } // service_manager::test::mojom::Parent: - void ConnectToChild(const ConnectToChildCallback& callback) override { + void ConnectToChild(ConnectToChildCallback callback) override { service_manager::test::mojom::LifecycleControlPtr lifecycle; context()->connector()->BindInterface("lifecycle_unittest_app", &lifecycle); { @@ -58,7 +58,7 @@ base::MessageLoop::current()); loop.Run(); } - callback.Run(); + std::move(callback).Run(); } void Quit() override { base::MessageLoop::current()->QuitWhenIdle();
diff --git a/services/service_manager/tests/shutdown/BUILD.gn b/services/service_manager/tests/shutdown/BUILD.gn index bab6e0f..cdb4bde 100644 --- a/services/service_manager/tests/shutdown/BUILD.gn +++ b/services/service_manager/tests/shutdown/BUILD.gn
@@ -35,9 +35,6 @@ sources = [ "shutdown_unittest.mojom", ] - - # TODO(crbug.com/714018): Convert the implementation to use OnceCallback. - use_once_callback = false } service_manifest("shutdown_unittest_manifest") {
diff --git a/services/service_manager/tests/shutdown/shutdown_client_app.cc b/services/service_manager/tests/shutdown/shutdown_client_app.cc index f74a8f1..21996895 100644 --- a/services/service_manager/tests/shutdown/shutdown_client_app.cc +++ b/services/service_manager/tests/shutdown/shutdown_client_app.cc
@@ -41,7 +41,7 @@ } // mojom::ShutdownTestClientController: - void ConnectAndWait(const ConnectAndWaitCallback& callback) override { + void ConnectAndWait(ConnectAndWaitCallback callback) override { mojom::ShutdownTestServicePtr service; context()->connector()->BindInterface("shutdown_service", &service); @@ -58,7 +58,7 @@ client_binding.set_connection_error_handler(run_loop.QuitClosure()); run_loop.Run(); - callback.Run(); + std::move(callback).Run(); } BinderRegistry registry_;
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js index 8097e9c..ba9621fc 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -557,7 +557,7 @@ InspectorTest._pageLoadedCallback = InspectorTest.safeWrap(callback); if (UI.panels.network) - UI.panels.network._networkLogView.reset(); + NetworkLog.networkLog.reset(); InspectorTest.resourceTreeModel.reloadPage(hardReload, scriptToEvaluateOnLoad); }
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js index d4123b5d1..d3a5cef 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js
@@ -75,14 +75,14 @@ InspectorTest.waitForNetworkLogViewNodeForRequest = function(request) { var networkLogView = UI.panels.network._networkLogView; - var node = networkLogView._nodesByRequestId.get(request.requestId()); + var node = networkLogView.nodeForRequest(request); if (node) return Promise.resolve(node); - var promise = InspectorTest.waitForEvent(Network.NetworkLogView.Events.UpdateRequest, networkLogView, - updateRequest => updateRequest === request); - return promise.then(() => { - var node = networkLogView._nodesByRequestId.get(request.requestId()); + console.assert(networkLogView._staleRequests.has(request)); + + return InspectorTest.addSnifferPromise(networkLogView, '_didRefreshForTest').then(() => { + var node = networkLogView.nodeForRequest(request); console.assert(node); return node; }); @@ -113,7 +113,7 @@ InspectorTest.networkRequests = function() { - return NetworkLog.networkLog.requests().slice(); + return Array.from(NetworkLog.networkLog.requests()); } InspectorTest.dumpNetworkRequests = function() @@ -159,10 +159,12 @@ function innerCallback(msg) { - if (msg.messageText.indexOf("XHR loaded") !== -1) - callback(); - else + if (msg.messageText.indexOf("XHR loaded") !== -1) { + if (callback) + callback(); + } else { InspectorTest.addConsoleSniffer(innerCallback); + } } InspectorTest.addConsoleSniffer(innerCallback);
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html index 516e385..e2dbe34 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html
@@ -40,7 +40,7 @@ Network.NetworkPanel.revealAndFilter(filterArray); - var nodes = UI.panels.network._networkLogView._nodesByRequestId.valuesArray(); + var nodes = UI.panels.network._networkLogView.flatNodesList(); var foundNodesCount = 0; for (var i = 0; i < nodes.length; i++) { if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol])
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html index 2fe1e5b..831e3ce 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html
@@ -75,7 +75,7 @@ setNetworkLogFilter(filterObj.filterText, filterObj.isRegex); - var nodes = UI.panels.network._networkLogView._nodesByRequestId.valuesArray(); + var nodes = UI.panels.network._networkLogView.flatNodesList(); var foundNodesCount = 0; for (var i = 0; i < nodes.length; i++) { if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol])
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html index c8f083e..37c98c0 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html
@@ -29,25 +29,19 @@ InspectorTest.assertEquals(request1.requestHeadersText, request2.requestHeadersText, "Requests have different requestHeadersText"); } - function testXHRReplay(method, url, async, user, password, headers, withCredentials, payload, type, callback) + async function testXHRReplay(method, url, async, user, password, headers, withCredentials, payload, type, callback) { - InspectorTest.makeXHR(method, url, async, user, password, headers, withCredentials, payload, type, step2); + InspectorTest.makeXHR(method, url, async, user, password, headers, withCredentials, payload, type); - var originalRequest; - function step2() - { - originalRequest = lastRequest(); - dumpRequest(originalRequest); - InspectorTest.NetworkAgent.replayXHR(originalRequest.requestId()); - InspectorTest.addSniffer(Network.NetworkLogView.prototype, "_appendRequest", step3); - } + var originalRequest = await InspectorTest.waitForEvent( + NetworkLog.NetworkLog.Events.RequestAdded, NetworkLog.networkLog); + dumpRequest(originalRequest); + InspectorTest.NetworkAgent.replayXHR(originalRequest.requestId()); + var replayedRequest = await InspectorTest.waitForEvent( + NetworkLog.NetworkLog.Events.RequestAdded, NetworkLog.networkLog); - function step3() - { - var replayedRequest = lastRequest(); - assertRequestEqual(originalRequest, replayedRequest); - callback(); - } + assertRequestEqual(originalRequest, replayedRequest); + callback(); }
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html b/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html index 610b327..15dd824 100644 --- a/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html +++ b/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html
@@ -3,7 +3,7 @@ <script src="../../http/tests/inspector/inspector-test.js"></script> <script src="../../http/tests/inspector/network-test.js"></script> <script> -function test() { +async function test() { var target = UI.panels.network._networkLogView; var types = Common.resourceTypes; @@ -14,32 +14,33 @@ var requestFoo = new SDK.NetworkRequest(InspectorTest.networkManager, "", "", "", "", ""); requestFoo.setResourceType(types.Script); requestFoo.setRequestId("foo"); - target._appendRequest(requestFoo); + InspectorTest.networkManager._dispatcher._startNetworkRequest(requestFoo); + var requestBar = new SDK.NetworkRequest(InspectorTest.networkManager, "", "", "", "", ""); requestBar.setResourceType(types.Script); requestBar.setRequestId("bar"); - target._appendRequest(requestBar); - target._refresh(); + InspectorTest.networkManager._dispatcher._startNetworkRequest(requestBar); - function isFilteredOut(request) { - return !!target._nodesByRequestId.get(request.requestId())[Network.NetworkLogView._isFilteredOutSymbol]; + async function isFilteredOut(request) { + var node = await InspectorTest.waitForNetworkLogViewNodeForRequest(request); + return !!node[Network.NetworkLogView._isFilteredOutSymbol]; } InspectorTest.addResult(""); - InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + isFilteredOut(requestFoo)); - InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + isFilteredOut(requestBar)); + InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + await isFilteredOut(requestFoo)); + InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + await isFilteredOut(requestBar)); InspectorTest.addResult(""); requestFoo.setResourceType(types.XHR); - target._refreshRequest(requestFoo); + InspectorTest.networkManager._dispatcher._updateNetworkRequest(requestFoo); InspectorTest.addResult("Updated request [" + requestFoo.requestId() + "] type."); - target._refreshRequest(requestBar); + InspectorTest.networkManager._dispatcher._updateNetworkRequest(requestBar); InspectorTest.addResult("Updated request [" + requestBar.requestId() + "]."); target._refresh(); InspectorTest.addResult(""); - InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + isFilteredOut(requestFoo)); - InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + isFilteredOut(requestBar)); + InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + await isFilteredOut(requestFoo)); + InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + await isFilteredOut(requestBar)); InspectorTest.completeTest(); }
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html b/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html index b4f6e9c..34b35ae 100644 --- a/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html +++ b/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html
@@ -7,7 +7,7 @@ var target = UI.panels.network._networkLogView; target._resourceCategoryFilterUI._toggleTypeFilter(Common.resourceTypes.XHR.category().title, false); InspectorTest.addResult("Clicked '" + Common.resourceTypes.XHR.name() + "' button."); - target.reset(); + target._reset(); function appendRequest(id, type, startTime, endTime) { @@ -16,10 +16,10 @@ request.setRequestId(id); request.setIssueTime(startTime); request.endTime = endTime; - target._appendRequest(request); + InspectorTest.networkManager._dispatcher._startNetworkRequest(request); target._refresh(); - var isFilteredOut = !!target._nodesByRequestId.get(request.requestId())[Network.NetworkLogView._isFilteredOutSymbol]; + var isFilteredOut = !!target.nodeForRequest(request)[Network.NetworkLogView._isFilteredOutSymbol]; InspectorTest.addResult(""); InspectorTest.addResult("Appended request [" + request.requestId() + "] of type '" + request.resourceType().name() + "' is hidden: " + isFilteredOut + " from [" + request.startTime + "] to [" + request.endTime + "]"); InspectorTest.addResult("Timeline: from [" + target._calculator.minimumBoundary() + "] to [" + target._calculator.maximumBoundary() + "]");
diff --git a/third_party/WebKit/LayoutTests/webshare/idl.html b/third_party/WebKit/LayoutTests/webshare/idl.html index 3495d0a..c5dfede 100644 --- a/third_party/WebKit/LayoutTests/webshare/idl.html +++ b/third_party/WebKit/LayoutTests/webshare/idl.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<link rel="help" href="https://github.com/WICG/web-share/blob/master/docs/interface.md"> +<link rel="help" href="https://wicg.github.io/web-share/"> <script src=../resources/testharness.js></script> <script src=../resources/testharnessreport.js></script> <script src=../resources/WebIDLParser.js></script> @@ -9,14 +9,16 @@ }; </script> <script type="text/plain" id="tested"> - dictionary ShareData { - DOMString? title; - DOMString? text; - DOMString? url; - }; partial interface Navigator { + [SecureContext] Promise<void> share(ShareData data); }; + + dictionary ShareData { + USVString title; + USVString text; + USVString url; + }; </script> <script> "use strict";
diff --git a/third_party/WebKit/LayoutTests/webshare/share-arity.html b/third_party/WebKit/LayoutTests/webshare/share-arity.html index a7fc919..a44dca3 100644 --- a/third_party/WebKit/LayoutTests/webshare/share-arity.html +++ b/third_party/WebKit/LayoutTests/webshare/share-arity.html
@@ -6,10 +6,6 @@ <script> share_test((t, webshare, mock) => { - return callWithKeyDown(() => promise_rejects(t, new TypeError(), navigator.share())); -}, '0 arguments (promise rejection)'); - -share_test((t, webshare, mock) => { mock.pushShareResult('the title', 'the message', 'data:the url', webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({title: 'the title', text: 'the message', url: 'data:the url', unused: 'unexpected field'})); }, 'extra ShareData field (extra field ignored)');
diff --git a/third_party/WebKit/LayoutTests/webshare/share-error.html b/third_party/WebKit/LayoutTests/webshare/share-error.html index 070d9e7..ce81761c 100644 --- a/third_party/WebKit/LayoutTests/webshare/share-error.html +++ b/third_party/WebKit/LayoutTests/webshare/share-error.html
@@ -8,7 +8,7 @@ share_test((t, webshare, mock) => { mock.pushShareResult('the title', 'the message', 'data:the url', webshare.ShareError.CANCELED); - // promise_rejects doesn't test the exception message, so just undefined. + // promise_rejects doesn't test the exception message, so just match against undefined. return callWithKeyDown(() => promise_rejects( t, new DOMException(undefined, 'AbortError'), navigator.share({title: 'the title', text: 'the message', url: 'data:the url'})));
diff --git a/third_party/WebKit/LayoutTests/webshare/share-nonutf8-encoding.html b/third_party/WebKit/LayoutTests/webshare/share-nonutf8-encoding.html new file mode 100644 index 0000000..aeae78e --- /dev/null +++ b/third_party/WebKit/LayoutTests/webshare/share-nonutf8-encoding.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<meta charset="iso-8859-1"> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script src="../resources/mojo-helpers.js"></script> +<script src="resources/mock-share-service.js"></script> +<script> + +// Exact same test as in share-success.html, with same expectations. This tests +// that the page's encoding (ISO-8859-1) is ignored and Unicode characters are +// always percent-encoded in UTF-8. +share_test((t, webshare, mock) => { + const title = 'f\xe1ncy \u5199\u4f5c \ud83d\ude31'; + const url = 'https://\u6d4b\u8bd5.example.com/\ud83d\udcc4'; + const url_ascii = 'https://xn--0zwm56d.example.com/%F0%9F%93%84'; + mock.pushShareResult(title, '\ufffdx', url_ascii, webshare.ShareError.OK); + return callWithKeyDown(() => navigator.share( + {title: title, text: '\ud9a3x', url: url})); +}, 'successful share with Unicode characters'); + +</script>
diff --git a/third_party/WebKit/LayoutTests/webshare/share-success.html b/third_party/WebKit/LayoutTests/webshare/share-success.html index c16799c1..29ba63d 100644 --- a/third_party/WebKit/LayoutTests/webshare/share-success.html +++ b/third_party/WebKit/LayoutTests/webshare/share-success.html
@@ -10,7 +10,7 @@ } share_test((t, webshare, mock) => { - let url = 'https://www.example.com/some/path?some_query#some_fragment'; + const url = 'https://www.example.com/some/path?some_query#some_fragment'; mock.pushShareResult('the title', 'the message', getAbsoluteUrl(url), webshare.ShareError.OK); return callWithKeyDown(() => navigator.share( @@ -23,33 +23,55 @@ }, 'successful share with empty ShareData'); share_test((t, webshare, mock) => { - let url = '//www.example.com/some/path?some_query#some_fragment'; + const url = '//www.example.com/some/path?some_query#some_fragment'; mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({url: url})); }, 'successful share with URL without a scheme'); share_test((t, webshare, mock) => { - let url = '/some/path?some_query#some_fragment'; + const url = '/some/path?some_query#some_fragment'; mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({url: url})); }, 'successful share with a path-only URL'); share_test((t, webshare, mock) => { - let url = 'foo'; + const url = 'foo'; mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({url: url})); }, 'successful share with a relative URL'); share_test((t, webshare, mock) => { - let url = ''; + const url = ''; mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({url: url})); }, 'successful share with an empty URL'); share_test((t, webshare, mock) => { - let url = 'data:foo'; + const url = 'data:foo'; mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({url: url})); }, 'successful share with a data URL'); +share_test((t, webshare, mock) => { + const url = 'http://example.com/foo\\ab%63\r\n\t "<>`{}'; + // Expect '\' to normalize to '/', "%63" to normalize to 'c', '\r\n\t' + // to be removed, and all the other illegal characters to be percent-escaped. + const url_encoded = 'http://example.com/foo/abc%20%22%3C%3E%60%7B%7D'; + mock.pushShareResult('', '', url_encoded, webshare.ShareError.OK); + return callWithKeyDown(() => navigator.share({url: url})); +}, 'successful share with percent-encoded URL characters'); + +share_test((t, webshare, mock) => { + // Title is a string with BMP and non-BMP characters. + // Text contains invalid surrogates which should be converted into U+FFFD. + // URL contains non-ASCII characters in host and path. + const title = 'f\xe1ncy \u5199\u4f5c \ud83d\ude31'; + const url = 'https://\u6d4b\u8bd5.example.com/\ud83d\udcc4'; + // Host is IDNA-encoded. Path is percent-encoded. + const url_ascii = 'https://xn--0zwm56d.example.com/%F0%9F%93%84'; + mock.pushShareResult(title, '\ufffdx', url_ascii, webshare.ShareError.OK); + return callWithKeyDown(() => navigator.share( + {title: title, text: '\ud9a3x', url: url})); +}, 'successful share with Unicode characters'); + </script>
diff --git a/third_party/WebKit/LayoutTests/webshare/share-types.html b/third_party/WebKit/LayoutTests/webshare/share-types.html index dcdf202..04dd0f6 100644 --- a/third_party/WebKit/LayoutTests/webshare/share-types.html +++ b/third_party/WebKit/LayoutTests/webshare/share-types.html
@@ -5,9 +5,39 @@ <script src="resources/mock-share-service.js"></script> <script> +function getAbsoluteUrl(url) { + return new URL(url, location).toString(); +} + +share_test((t, webshare, mock) => { + mock.pushShareResult('', '', '', webshare.ShareError.OK); + return callWithKeyDown(() => navigator.share(undefined)); +}, 'share of undefined (expect treated as empty dictionary)'); + +share_test((t, webshare, mock) => { + mock.pushShareResult('', '', '', webshare.ShareError.OK); + return callWithKeyDown(() => navigator.share(null)); +}, 'share of null (expect treated as empty dictionary)'); + share_test((t, webshare, mock) => { mock.pushShareResult('384957', '[object Object]', '', webshare.ShareError.OK); return callWithKeyDown(() => navigator.share({title: 384957, text: {}})); }, 'share of types other than string (expect implicitly converted to string)'); +share_test((t, webshare, mock) => { + // A null title should convert into the string 'null' (because the field is + // not nullable, it just converts to a string like any other type). + mock.pushShareResult('null', '', '', webshare.ShareError.OK); + return callWithKeyDown(() => navigator.share({title: null, text: undefined})); +}, 'share of null/undefined dict values'); + +promise_test(t => { + // URL is invalid in that the URL Parser returns failure (port is too + // large). + const url = 'http://example.com:65536'; + return promise_rejects( + t, new DOMException(undefined, 'TypeError'), + navigator.share({url: url})); +}, 'share with an invalid URL'); + </script>
diff --git a/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html b/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html index 9e8fad7..038b658 100644 --- a/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html +++ b/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html
@@ -1,13 +1,12 @@ <!DOCTYPE html> <script src="../resources/testharness.js"></script> <script src="../resources/testharnessreport.js"></script> -<script src="../resources/mojo-helpers.js"></script> -<script src="resources/mock-share-service.js"></script> <script> -share_test((t, mock) => { +promise_test(t => { + // promise_rejects doesn't test the exception message, so just match against undefined. return promise_rejects( - t, new DOMException('Must be handling a user gesture to perform a share request.', 'SecurityError'), + t, new DOMException(undefined, 'SecurityError'), navigator.share({title: 'the title', text: 'the message', url: 'data:the url'})); }, 'share without a user gesture');
diff --git a/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl index 00b2f8b0..c6ea7fd 100644 --- a/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl +++ b/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl
@@ -460,7 +460,7 @@ state.Style()->SetGridAutoRepeat{{type}}sInsertionPoint(ComputedStyle::InitialGridAutoRepeat{{type}}sInsertionPoint()); state.Style()->SetAutoRepeatNamedGrid{{type}}Lines(ComputedStyle::InitialNamedGrid{{type}}Lines()); state.Style()->SetAutoRepeatOrderedNamedGrid{{type}}Lines(ComputedStyle::InitialOrderedNamedGrid{{type}}Lines()); - state.Style()->SetGridAutoRepeat{{type}}sType(ComputedStyle::InitialGridAutoRepeatType()); + state.Style()->SetGridAutoRepeat{{type}}sType(ComputedStyle::InitialGridAutoRepeat{{type}}sType()); }
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn index b7bd8611..d26178e0 100644 --- a/third_party/WebKit/Source/core/css/BUILD.gn +++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -498,6 +498,8 @@ "properties/CSSPropertyAnimationNameUtils.h", "properties/CSSPropertyBorderImageUtils.cpp", "properties/CSSPropertyBorderImageUtils.h", + "properties/CSSPropertyBoxShadowUtils.cpp", + "properties/CSSPropertyBoxShadowUtils.h", "properties/CSSPropertyColumnUtils.cpp", "properties/CSSPropertyColumnUtils.h", "properties/CSSPropertyCounterUtils.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h index b307c84..f03044f 100644 --- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h +++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -145,55 +145,6 @@ } template <> -inline CSSIdentifierValue::CSSIdentifierValue(EColumnFill column_fill) - : CSSValue(kIdentifierClass) { - switch (column_fill) { - case EColumnFill::kAuto: - value_id_ = CSSValueAuto; - break; - case EColumnFill::kBalance: - value_id_ = CSSValueBalance; - break; - } -} - -template <> -inline EColumnFill CSSIdentifierValue::ConvertTo() const { - if (value_id_ == CSSValueBalance) - return EColumnFill::kBalance; - if (value_id_ == CSSValueAuto) - return EColumnFill::kAuto; - NOTREACHED(); - return EColumnFill::kBalance; -} - -template <> -inline CSSIdentifierValue::CSSIdentifierValue(EColumnSpan column_span) - : CSSValue(kIdentifierClass) { - switch (column_span) { - case EColumnSpan::kAll: - value_id_ = CSSValueAll; - break; - case EColumnSpan::kNone: - value_id_ = CSSValueNone; - break; - } -} - -template <> -inline EColumnSpan CSSIdentifierValue::ConvertTo() const { - switch (value_id_) { - case CSSValueAll: - return EColumnSpan::kAll; - default: - NOTREACHED(); - // fall-through - case CSSValueNone: - return EColumnSpan::kNone; - } -} - -template <> inline EBorderStyle CSSIdentifierValue::ConvertTo() const { if (value_id_ == CSSValueAuto) // Valid for CSS outline-style return EBorderStyle::kDotted; @@ -456,10 +407,10 @@ inline CSSIdentifierValue::CSSIdentifierValue(EBackfaceVisibility e) : CSSValue(kIdentifierClass) { switch (e) { - case kBackfaceVisibilityVisible: + case EBackfaceVisibility::kVisible: value_id_ = CSSValueVisible; break; - case kBackfaceVisibilityHidden: + case EBackfaceVisibility::kHidden: value_id_ = CSSValueHidden; break; } @@ -469,15 +420,15 @@ inline EBackfaceVisibility CSSIdentifierValue::ConvertTo() const { switch (value_id_) { case CSSValueVisible: - return kBackfaceVisibilityVisible; + return EBackfaceVisibility::kVisible; case CSSValueHidden: - return kBackfaceVisibilityHidden; + return EBackfaceVisibility::kHidden; default: break; } NOTREACHED(); - return kBackfaceVisibilityHidden; + return EBackfaceVisibility::kHidden; } template <>
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5 index 85ba864c..a059d82 100644 --- a/third_party/WebKit/Source/core/css/CSSProperties.json5 +++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -637,7 +637,7 @@ field_template: "storage_only", type_name: "EBackfaceVisibility", field_group: "rare-non-inherited", - default_value: "kBackfaceVisibilityVisible", + default_value: "EBackfaceVisibility::kVisible", field_size: 1, }, { @@ -1063,8 +1063,9 @@ }, { name: "column-fill", - field_template: "storage_only", - default_value: "EColumnFill::kBalance", + field_template: "keyword", + keywords: ["balance", "auto"], + default_value: "balance", field_size: 1, field_group: "rare-non-inherited->multi-col", getter: "GetColumnFill", @@ -2911,9 +2912,10 @@ name: "column-span", api_class: true, api_methods: ["parseSingleValue"], - field_template: "storage_only", + field_template: "keyword", + keywords: ["none", "all"], field_group: "rare-non-inherited->multi-col", - default_value: "EColumnSpan::kNone", + default_value: "none", getter: "GetColumnSpan", field_size: 1, },
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp index cba547a..7aaf7c4 100644 --- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp +++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -3161,7 +3161,7 @@ return CSSIdentifierValue::Create(style.Appearance()); case CSSPropertyBackfaceVisibility: return CSSIdentifierValue::Create( - (style.BackfaceVisibility() == kBackfaceVisibilityHidden) + (style.BackfaceVisibility() == EBackfaceVisibility::kHidden) ? CSSValueHidden : CSSValueVisible); case CSSPropertyWebkitBorderImage:
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5 b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5 index 97a4a3d..b6a530a 100644 --- a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5 +++ b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
@@ -1018,19 +1018,19 @@ }, { name: "GridAutoRepeatColumnsType", - field_template: "storage_only", + field_template: "keyword", type_name: "AutoRepeatType", field_group: "rare-non-inherited->grid", - field_size: 3, - default_value: "AutoRepeatType::kNoAutoRepeat", + keywords: ["no-auto-repeat", "auto-fill", "auto-fit"], + default_value: "no-auto-repeat", }, { name: "GridAutoRepeatRowsType", - field_template: "storage_only", + field_template: "keyword", type_name: "AutoRepeatType", field_group: "rare-non-inherited->grid", - field_size: 3, - default_value: "AutoRepeatType::kNoAutoRepeat", + keywords: ["no-auto-repeat", "auto-fill", "auto-fit"], + default_value: "no-auto-repeat", }, ], }
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp index b408bd3..c6efe230 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -43,6 +43,7 @@ #include "core/css/properties/CSSPropertyAnimationIterationCountUtils.h" #include "core/css/properties/CSSPropertyAnimationNameUtils.h" #include "core/css/properties/CSSPropertyBorderImageUtils.h" +#include "core/css/properties/CSSPropertyBoxShadowUtils.h" #include "core/css/properties/CSSPropertyColumnUtils.h" #include "core/css/properties/CSSPropertyDescriptor.h" #include "core/css/properties/CSSPropertyFontUtils.h" @@ -498,72 +499,6 @@ return range_.AtEnd(); } -static CSSShadowValue* ParseSingleShadow(CSSParserTokenRange& range, - CSSParserMode css_parser_mode, - bool allow_inset_and_spread) { - CSSIdentifierValue* style = nullptr; - CSSValue* color = nullptr; - - if (range.AtEnd()) - return nullptr; - if (range.Peek().Id() == CSSValueInset) { - if (!allow_inset_and_spread) - return nullptr; - style = ConsumeIdent(range); - } - color = ConsumeColor(range, css_parser_mode); - - CSSPrimitiveValue* horizontal_offset = - ConsumeLength(range, css_parser_mode, kValueRangeAll); - if (!horizontal_offset) - return nullptr; - - CSSPrimitiveValue* vertical_offset = - ConsumeLength(range, css_parser_mode, kValueRangeAll); - if (!vertical_offset) - return nullptr; - - CSSPrimitiveValue* blur_radius = - ConsumeLength(range, css_parser_mode, kValueRangeAll); - CSSPrimitiveValue* spread_distance = nullptr; - if (blur_radius) { - // Blur radius must be non-negative. - if (blur_radius->GetDoubleValue() < 0) - return nullptr; - if (allow_inset_and_spread) - spread_distance = ConsumeLength(range, css_parser_mode, kValueRangeAll); - } - - if (!range.AtEnd()) { - if (!color) - color = ConsumeColor(range, css_parser_mode); - if (range.Peek().Id() == CSSValueInset) { - if (!allow_inset_and_spread || style) - return nullptr; - style = ConsumeIdent(range); - } - } - return CSSShadowValue::Create(horizontal_offset, vertical_offset, blur_radius, - spread_distance, style, color); -} - -static CSSValue* ConsumeShadow(CSSParserTokenRange& range, - CSSParserMode css_parser_mode, - bool allow_inset_and_spread) { - if (range.Peek().Id() == CSSValueNone) - return ConsumeIdent(range); - - CSSValueList* shadow_value_list = CSSValueList::CreateCommaSeparated(); - do { - if (CSSShadowValue* shadow_value = - ParseSingleShadow(range, css_parser_mode, allow_inset_and_spread)) - shadow_value_list->Append(*shadow_value); - else - return nullptr; - } while (ConsumeCommaIncludingWhitespace(range)); - return shadow_value_list; -} - static CSSFunctionValue* ConsumeFilterFunction( CSSParserTokenRange& range, const CSSParserContext* context) { @@ -575,7 +510,8 @@ CSSValue* parsed_value = nullptr; if (filter_type == CSSValueDropShadow) { - parsed_value = ParseSingleShadow(args, context->Mode(), false); + parsed_value = CSSPropertyBoxShadowUtils::ParseSingleShadow( + args, context->Mode(), AllowInsetAndSpread::kForbid); } else { if (args.AtEnd()) { context->Count(WebFeature::kCSSFilterFunctionNoArguments); @@ -1561,9 +1497,11 @@ range_, context_->Mode(), unitless); } case CSSPropertyTextShadow: - return ConsumeShadow(range_, context_->Mode(), false); + return CSSPropertyBoxShadowUtils::ConsumeShadow( + range_, context_->Mode(), AllowInsetAndSpread::kForbid); case CSSPropertyBoxShadow: - return ConsumeShadow(range_, context_->Mode(), true); + return CSSPropertyBoxShadowUtils::ConsumeShadow( + range_, context_->Mode(), AllowInsetAndSpread::kAllow); case CSSPropertyFilter: case CSSPropertyBackdropFilter: return ConsumeFilter(range_, context_);
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.cpp new file mode 100644 index 0000000..25855af --- /dev/null +++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.cpp
@@ -0,0 +1,82 @@ +// 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 "core/css/properties/CSSPropertyBoxShadowUtils.h" + +#include "core/CSSValueKeywords.h" +#include "core/css/CSSPrimitiveValue.h" +#include "core/css/CSSShadowValue.h" +#include "core/css/parser/CSSParserTokenRange.h" +#include "core/css/parser/CSSPropertyParserHelpers.h" +#include "platform/Length.h" + +namespace blink { + +class CSSIdentifierValue; +class CSSValue; + +CSSValue* CSSPropertyBoxShadowUtils::ConsumeShadow( + CSSParserTokenRange& range, + CSSParserMode css_parser_mode, + AllowInsetAndSpread inset_and_spread) { + if (range.Peek().Id() == CSSValueNone) + return CSSPropertyParserHelpers::ConsumeIdent(range); + return CSSPropertyParserHelpers::ConsumeCommaSeparatedList( + ParseSingleShadow, range, css_parser_mode, inset_and_spread); +} + +CSSShadowValue* CSSPropertyBoxShadowUtils::ParseSingleShadow( + CSSParserTokenRange& range, + CSSParserMode css_parser_mode, + AllowInsetAndSpread inset_and_spread) { + CSSIdentifierValue* style = nullptr; + CSSValue* color = nullptr; + + if (range.AtEnd()) + return nullptr; + if (range.Peek().Id() == CSSValueInset) { + if (inset_and_spread != AllowInsetAndSpread::kAllow) + return nullptr; + style = CSSPropertyParserHelpers::ConsumeIdent(range); + } + color = CSSPropertyParserHelpers::ConsumeColor(range, css_parser_mode); + + CSSPrimitiveValue* horizontal_offset = + CSSPropertyParserHelpers::ConsumeLength(range, css_parser_mode, + kValueRangeAll); + if (!horizontal_offset) + return nullptr; + + CSSPrimitiveValue* vertical_offset = CSSPropertyParserHelpers::ConsumeLength( + range, css_parser_mode, kValueRangeAll); + if (!vertical_offset) + return nullptr; + + CSSPrimitiveValue* blur_radius = CSSPropertyParserHelpers::ConsumeLength( + range, css_parser_mode, kValueRangeAll); + CSSPrimitiveValue* spread_distance = nullptr; + if (blur_radius) { + // Blur radius must be non-negative. + if (blur_radius->GetDoubleValue() < 0) + return nullptr; + if (inset_and_spread == AllowInsetAndSpread::kAllow) { + spread_distance = CSSPropertyParserHelpers::ConsumeLength( + range, css_parser_mode, kValueRangeAll); + } + } + + if (!range.AtEnd()) { + if (!color) + color = CSSPropertyParserHelpers::ConsumeColor(range, css_parser_mode); + if (range.Peek().Id() == CSSValueInset) { + if (inset_and_spread != AllowInsetAndSpread::kAllow || style) + return nullptr; + style = CSSPropertyParserHelpers::ConsumeIdent(range); + } + } + return CSSShadowValue::Create(horizontal_offset, vertical_offset, blur_radius, + spread_distance, style, color); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.h b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.h new file mode 100644 index 0000000..a039212 --- /dev/null +++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.h
@@ -0,0 +1,33 @@ +// 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. + +#ifndef CSSPropertyBoxShadowUtils_h +#define CSSPropertyBoxShadowUtils_h + +#include "core/css/parser/CSSParserMode.h" +#include "platform/wtf/Allocator.h" + +namespace blink { + +class CSSParserTokenRange; +class CSSShadowValue; +class CSSValue; + +enum class AllowInsetAndSpread { kAllow, kForbid }; + +class CSSPropertyBoxShadowUtils { + STATIC_ONLY(CSSPropertyBoxShadowUtils); + + public: + static CSSValue* ConsumeShadow(CSSParserTokenRange&, + CSSParserMode, + AllowInsetAndSpread); + static CSSShadowValue* ParseSingleShadow(CSSParserTokenRange&, + CSSParserMode, + AllowInsetAndSpread); +}; + +} // namespace blink + +#endif // CSSPropertyBoxShadowUtils_h
diff --git a/third_party/WebKit/Source/core/editing/Position.cpp b/third_party/WebKit/Source/core/editing/Position.cpp index eab61e4b..1627ec1 100644 --- a/third_party/WebKit/Source/core/editing/Position.cpp +++ b/third_party/WebKit/Source/core/editing/Position.cpp
@@ -153,6 +153,19 @@ } template <typename Strategy> +static int MinOffsetForNode(Node* anchor_node, int offset) { + if (anchor_node->IsCharacterDataNode()) + return std::min(offset, anchor_node->MaxCharacterOffset()); + + int new_offset = 0; + for (Node* node = Strategy::FirstChild(*anchor_node); + node && new_offset < offset; node = Strategy::NextSibling(*node)) + new_offset++; + + return new_offset; +} + +template <typename Strategy> int PositionTemplate<Strategy>::ComputeOffsetInContainerNode() const { if (!anchor_node_) return 0; @@ -163,7 +176,7 @@ case PositionAnchorType::kAfterChildren: return LastOffsetInNode(anchor_node_.Get()); case PositionAnchorType::kOffsetInAnchor: - return MinOffsetForNode(anchor_node_.Get(), offset_); + return MinOffsetForNode<Strategy>(anchor_node_.Get(), offset_); case PositionAnchorType::kBeforeAnchor: return Strategy::Index(*anchor_node_); case PositionAnchorType::kAfterAnchor: @@ -485,21 +498,6 @@ // static template <typename Strategy> -int PositionTemplate<Strategy>::MinOffsetForNode(Node* anchor_node, - int offset) { - if (anchor_node->IsCharacterDataNode()) - return std::min(offset, anchor_node->MaxCharacterOffset()); - - int new_offset = 0; - for (Node* node = Strategy::FirstChild(*anchor_node); - node && new_offset < offset; node = Strategy::NextSibling(*node)) - new_offset++; - - return new_offset; -} - -// static -template <typename Strategy> PositionTemplate<Strategy> PositionTemplate<Strategy>::FirstPositionInOrBeforeNode(Node* node) { if (!node)
diff --git a/third_party/WebKit/Source/core/editing/Position.h b/third_party/WebKit/Source/core/editing/Position.h index bb8a72408..5d05192 100644 --- a/third_party/WebKit/Source/core/editing/Position.h +++ b/third_party/WebKit/Source/core/editing/Position.h
@@ -191,7 +191,6 @@ static int LastOffsetInNode(Node* anchor_node); static PositionTemplate<Strategy> FirstPositionInNode(Node* anchor_node); static PositionTemplate<Strategy> LastPositionInNode(Node* anchor_node); - static int MinOffsetForNode(Node* anchor_node, int offset); static PositionTemplate<Strategy> FirstPositionInOrBeforeNode( Node* anchor_node); static PositionTemplate<Strategy> LastPositionInOrAfterNode(
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp index 26347fa5..f8c1e23 100644 --- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp +++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp
@@ -22,6 +22,15 @@ const DocumentMarker* marker_to_insert) { return marker_in_list->StartOffset() < marker_to_insert->StartOffset(); }); + + // DCHECK that we're not trying to add a marker that overlaps an existing one + // (this method only works for lists which don't allow overlapping markers) + if (pos != list->end()) + DCHECK_LE(marker->EndOffset(), (*pos)->StartOffset()); + + if (pos != list->begin()) + DCHECK_GE(marker->StartOffset(), (*std::prev(pos))->EndOffset()); + list->insert(pos - list->begin(), marker); } @@ -38,7 +47,7 @@ if (marker.StartOffset() > end_offset) break; - // pin the marker to the specified range and apply the shift delta + // Trim the marker to fit in dst_list's text node if (marker.EndOffset() > end_offset) marker.SetEndOffset(end_offset);
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h index f9c2a00..2c90ea3 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.h +++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -867,7 +867,7 @@ bool HasClipPath() const { return Style() && Style()->ClipPath(); } bool HasHiddenBackface() const { return Style() && - Style()->BackfaceVisibility() == kBackfaceVisibilityHidden; + Style()->BackfaceVisibility() == EBackfaceVisibility::kHidden; } bool HasBackdropFilter() const { return Style() && Style()->HasBackdropFilter();
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp index d04bd55..99a7f84 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -1170,7 +1170,7 @@ graphics_layer_->SetBackfaceVisibility( GetLayoutObject().Style()->BackfaceVisibility() == - kBackfaceVisibilityVisible); + EBackfaceVisibility::kVisible); } void CompositedLayerMapping::ComputeGraphicsLayerParentLocation( @@ -1335,7 +1335,7 @@ overflow_controls_host_layer_->SetMasksToBounds(true); overflow_controls_host_layer_->SetBackfaceVisibility( owning_layer_.GetLayoutObject().Style()->BackfaceVisibility() == - kBackfaceVisibilityVisible); + EBackfaceVisibility::kVisible); } void CompositedLayerMapping::UpdateChildContainmentLayerGeometry(
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp index 2cccce8b..43383fe 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp
@@ -78,7 +78,7 @@ if (RequiresCompositingForTransform(layout_object)) reasons |= kCompositingReason3DTransform; - if (style.BackfaceVisibility() == kBackfaceVisibilityHidden) + if (style.BackfaceVisibility() == EBackfaceVisibility::kHidden) reasons |= kCompositingReasonBackfaceVisibilityHidden; if (RequiresCompositingForAnimation(style))
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp index 321a433..3c2fa50 100644 --- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp +++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -2010,7 +2010,7 @@ // Check for hit test on backface if backface-visibility is 'hidden' if (local_transform_state && GetLayoutObject().Style()->BackfaceVisibility() == - kBackfaceVisibilityHidden) { + EBackfaceVisibility::kHidden) { TransformationMatrix inverted_matrix = local_transform_state->accumulated_transform_.Inverse(); // If the z-vector of the matrix is negative, the back is facing towards the
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h index 9ae5c30..c69c2eb 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.h +++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -435,14 +435,15 @@ // backface-visibility (aka -webkit-backface-visibility) static EBackfaceVisibility InitialBackfaceVisibility() { - return kBackfaceVisibilityVisible; + return EBackfaceVisibility::kVisible; } EBackfaceVisibility BackfaceVisibility() const { return static_cast<EBackfaceVisibility>( rare_non_inherited_data_->backface_visibility_); } void SetBackfaceVisibility(EBackfaceVisibility b) { - SET_VAR(rare_non_inherited_data_, backface_visibility_, b); + SET_VAR(rare_non_inherited_data_, backface_visibility_, + static_cast<unsigned>(b)); } // Background properties. @@ -625,17 +626,6 @@ InitialColumnCount()); } - // column-fill - static EColumnFill InitialColumnFill() { return EColumnFill::kBalance; } - EColumnFill GetColumnFill() const { - return static_cast<EColumnFill>( - rare_non_inherited_data_->multi_col_data_->column_fill_); - } - void SetColumnFill(EColumnFill column_fill) { - SET_NESTED_VAR(rare_non_inherited_data_, multi_col_data_, column_fill_, - static_cast<unsigned>(column_fill)); - } - // column-gap (aka -webkit-column-gap) float ColumnGap() const { return rare_non_inherited_data_->multi_col_data_->column_gap_; @@ -684,17 +674,6 @@ column_rule_, w); } - // column-span (aka -webkit-column-span) - static EColumnSpan InitialColumnSpan() { return EColumnSpan::kNone; } - EColumnSpan GetColumnSpan() const { - return static_cast<EColumnSpan>( - rare_non_inherited_data_->multi_col_data_->column_span_); - } - void SetColumnSpan(EColumnSpan column_span) { - SET_NESTED_VAR(rare_non_inherited_data_, multi_col_data_, column_span_, - static_cast<unsigned>(column_span)); - } - // column-width (aka -webkit-column-width) float ColumnWidth() const { return rare_non_inherited_data_->multi_col_data_->column_width_; @@ -1765,14 +1744,6 @@ bool HasTextCombine() const { return TextCombine() != ETextCombine::kNone; } // Grid utility functions. - AutoRepeatType GridAutoRepeatColumnsType() const { - return static_cast<AutoRepeatType>( - rare_non_inherited_data_->grid_data_->grid_auto_repeat_columns_type_); - } - AutoRepeatType GridAutoRepeatRowsType() const { - return static_cast<AutoRepeatType>( - rare_non_inherited_data_->grid_data_->grid_auto_repeat_rows_type_); - } GridAutoFlow GetGridAutoFlow() const { return static_cast<GridAutoFlow>( rare_non_inherited_data_->grid_data_->grid_auto_flow_); @@ -1795,16 +1766,6 @@ return (rare_non_inherited_data_->grid_data_->grid_auto_flow_ & kInternalAutoFlowAlgorithmDense) == kInternalAutoFlowAlgorithmDense; } - void SetGridAutoRepeatColumnsType(const AutoRepeatType auto_repeat_type) { - SET_NESTED_VAR(rare_non_inherited_data_, grid_data_, - grid_auto_repeat_columns_type_, - static_cast<unsigned>(auto_repeat_type)); - } - void SetGridAutoRepeatRowsType(const AutoRepeatType auto_repeat_type) { - SET_NESTED_VAR(rare_non_inherited_data_, grid_data_, - grid_auto_repeat_rows_type_, - static_cast<unsigned>(auto_repeat_type)); - } // align-content utility functions. ContentPosition AlignContentPosition() const {
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h index ca21928b..b04b54f 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h +++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -91,10 +91,6 @@ (1 << (kPseudoIdBackdrop - kFirstPublicPseudoId)) }; -enum class EColumnFill { kBalance, kAuto }; - -enum class EColumnSpan { kNone = 0, kAll }; - enum OutlineIsAuto { kOutlineIsAutoOff = 0, kOutlineIsAutoOn }; // Random visual rendering model attributes. Not inherited. @@ -198,10 +194,7 @@ enum OffsetRotationType { kOffsetRotationAuto, kOffsetRotationFixed }; -enum EBackfaceVisibility { - kBackfaceVisibilityVisible, - kBackfaceVisibilityHidden -}; +enum class EBackfaceVisibility { kVisible, kHidden }; enum ELineClampType { kLineClampLineCount, kLineClampPercentage }; @@ -331,8 +324,6 @@ kSnapAlignmentCenter }; -enum AutoRepeatType { kNoAutoRepeat, kAutoFill, kAutoFit }; - } // namespace blink #endif // ComputedStyleConstants_h
diff --git a/third_party/WebKit/Source/core/workers/Worklet.cpp b/third_party/WebKit/Source/core/workers/Worklet.cpp index 21fc3d7..634646ac 100644 --- a/third_party/WebKit/Source/core/workers/Worklet.cpp +++ b/third_party/WebKit/Source/core/workers/Worklet.cpp
@@ -12,9 +12,26 @@ #include "core/workers/WorkletPendingTasks.h" #include "platform/WebTaskRunner.h" #include "platform/wtf/WTF.h" +#include "public/platform/WebURLRequest.h" namespace blink { +namespace { + +WebURLRequest::FetchCredentialsMode ParseCredentialsOption( + const String& credentials_option) { + if (credentials_option == "omit") + return WebURLRequest::kFetchCredentialsModeOmit; + if (credentials_option == "same-origin") + return WebURLRequest::kFetchCredentialsModeSameOrigin; + if (credentials_option == "include") + return WebURLRequest::kFetchCredentialsModeInclude; + NOTREACHED(); + return WebURLRequest::kFetchCredentialsModeOmit; +} + +} // namespace + Worklet::Worklet(LocalFrame* frame) : ContextLifecycleObserver(frame->GetDocument()) { DCHECK(IsMainThread()); @@ -75,18 +92,6 @@ proxy->TerminateWorkletGlobalScope(); } -WebURLRequest::FetchCredentialsMode Worklet::ParseCredentialsOption( - const String& credentials_option) { - if (credentials_option == "omit") - return WebURLRequest::kFetchCredentialsModeOmit; - if (credentials_option == "same-origin") - return WebURLRequest::kFetchCredentialsModeSameOrigin; - if (credentials_option == "include") - return WebURLRequest::kFetchCredentialsModeInclude; - NOTREACHED(); - return WebURLRequest::kFetchCredentialsModeOmit; -} - WorkletGlobalScopeProxy* Worklet::FindAvailableGlobalScope() const { DCHECK(IsMainThread()); // TODO(nhiroki): Support the case where there are multiple global scopes.
diff --git a/third_party/WebKit/Source/core/workers/Worklet.h b/third_party/WebKit/Source/core/workers/Worklet.h index 3980eb8..d902fe5c 100644 --- a/third_party/WebKit/Source/core/workers/Worklet.h +++ b/third_party/WebKit/Source/core/workers/Worklet.h
@@ -12,7 +12,6 @@ #include "core/workers/WorkletOptions.h" #include "platform/bindings/ScriptWrappable.h" #include "platform/heap/Handle.h" -#include "public/platform/WebURLRequest.h" namespace blink { @@ -51,9 +50,6 @@ // The Worklet inherits the url and userAgent from the frame->document(). explicit Worklet(LocalFrame*); - static WebURLRequest::FetchCredentialsMode ParseCredentialsOption( - const String& credentials_option); - // Returns one of available global scopes. WorkletGlobalScopeProxy* FindAvailableGlobalScope() const;
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js index b2c8e893..7ed8b3042 100644 --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js
@@ -681,13 +681,8 @@ * @return {boolean} */ isNavigationRequest() { - return this._isNavigationRequest; - } - - markAsNavigationRequest() { - this._isNavigationRequest = true; - this.refresh(); - this._updateBackgroundColor(); + var pageLoad = NetworkLog.networkLog.pageLoadForRequest(this._request); + return pageLoad ? pageLoad.mainRequest === this._request : false; } /**
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js index 97f9f47..7436810 100644 --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
@@ -71,10 +71,8 @@ this._columns = new Network.NetworkLogViewColumns( this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting); - /** @type {!Map.<string, !Network.NetworkRequestNode>} */ - this._nodesByRequestId = new Map(); - /** @type {!Object.<string, boolean>} */ - this._staleRequestIds = {}; + /** @type {!Set<!SDK.NetworkRequest>} */ + this._staleRequests = new Set(); /** @type {number} */ this._mainRequestLoadTime = -1; /** @type {number} */ @@ -114,12 +112,9 @@ .addChangeListener(this._invalidateAllItems.bind(this, false), this); SDK.targetManager.observeModels(SDK.NetworkManager, this); - SDK.targetManager.addModelListener( - SDK.NetworkManager, SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this); - SDK.targetManager.addModelListener( - SDK.NetworkManager, SDK.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this); - SDK.targetManager.addModelListener( - SDK.NetworkManager, SDK.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this); + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestAdded, this._onRequestUpdated, this); + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestUpdated, this._onRequestUpdated, this); + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.Reset, this._reset, this); this._updateGroupByFrame(); Common.moduleSetting('network.group-by-frame').addChangeListener(() => this._updateGroupByFrame()); @@ -363,10 +358,10 @@ * @param {?string} groupKey */ _setGrouping(groupKey) { + if (this._activeGroupLookup) + this._activeGroupLookup.reset(); var groupLookup = groupKey ? this._groupLookups.get(groupKey) || null : null; this._activeGroupLookup = groupLookup; - if (groupLookup) - groupLookup.reset(); this._invalidateAllItems(); } @@ -379,7 +374,7 @@ * @return {?Network.NetworkRequestNode} */ nodeForRequest(request) { - return this._nodesByRequestId.get(request.requestId()); + return request[Network.NetworkLogView._networkNodeSymbol] || null; } /** @@ -402,17 +397,15 @@ * @param {!SDK.NetworkManager} networkManager */ modelAdded(networkManager) { - if (!networkManager.target().parentTarget()) { - var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); - if (resourceTreeModel) { - resourceTreeModel.addEventListener( - SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this); - resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this); - resourceTreeModel.addEventListener( - SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this); - } + // TODO(allada) Remove dependency on networkManager and instead use NetworkLog and PageLoad for needed data. + if (networkManager.target().parentTarget()) + return; + var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); + if (resourceTreeModel) { + resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this); + resourceTreeModel.addEventListener( + SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this); } - NetworkLog.networkLog.requestsForManager(networkManager).forEach(this._appendRequest.bind(this)); } /** @@ -423,8 +416,6 @@ if (!networkManager.target().parentTarget()) { var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); if (resourceTreeModel) { - resourceTreeModel.removeEventListener( - SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this); resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this); resourceTreeModel.removeEventListener( SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this); @@ -600,26 +591,24 @@ } _updateSummaryBar() { - var requestsNumber = this._nodesByRequestId.size; - - if (!requestsNumber) { - this._showRecordingHint(); - return; - } this._hideRecordingHint(); var transferSize = 0; - var selectedRequestsNumber = 0; + var selectedNodeNumber = 0; var selectedTransferSize = 0; var baseTime = -1; var maxTime = -1; - var nodes = this._nodesByRequestId.valuesArray(); - for (var i = 0; i < nodes.length; ++i) { - var request = nodes[i].request(); + + var nodeCount = 0; + for (var request of NetworkLog.networkLog.requests()) { + var node = request[Network.NetworkLogView._networkNodeSymbol]; + if (!node) + continue; + nodeCount++; var requestTransferSize = request.transferSize; transferSize += requestTransferSize; - if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol]) { - selectedRequestsNumber++; + if (!node[Network.NetworkLogView._isFilteredOutSymbol]) { + selectedNodeNumber++; selectedTransferSize += requestTransferSize; } if (request.url() === request.networkManager().target().inspectedURL() && @@ -629,6 +618,11 @@ maxTime = request.endTime; } + if (!nodeCount) { + this._showRecordingHint(); + return; + } + var summaryBar = this._summaryBarElement; summaryBar.removeChildren(); var separator = '\u2002\u2758\u2002'; @@ -644,13 +638,13 @@ return span; } - if (selectedRequestsNumber !== requestsNumber) { - appendChunk(Common.UIString('%d / %d requests', selectedRequestsNumber, requestsNumber)); + if (selectedNodeNumber !== nodeCount) { + appendChunk(Common.UIString('%d / %d requests', selectedNodeNumber, nodeCount)); appendChunk(separator); appendChunk(Common.UIString( '%s / %s transferred', Number.bytesToString(selectedTransferSize), Number.bytesToString(transferSize))); } else { - appendChunk(Common.UIString('%d requests', requestsNumber)); + appendChunk(Common.UIString('%d requests', nodeCount)); appendChunk(separator); appendChunk(Common.UIString('%s transferred', Number.bytesToString(transferSize))); } @@ -709,9 +703,7 @@ * @param {boolean=} deferUpdate */ _invalidateAllItems(deferUpdate) { - var requestIds = this._nodesByRequestId.keysArray(); - for (var i = 0; i < requestIds.length; ++i) - this._staleRequestIds[requestIds[i]] = true; + this._staleRequests = new Set(NetworkLog.networkLog.requests()); if (deferUpdate) this.scheduleRefresh(); else @@ -832,10 +824,22 @@ var nodesToInsert = new Map(); /** @type {!Array<!Network.NetworkNode>} */ var nodesToRefresh = []; - for (var requestId in this._staleRequestIds) { - var node = this._nodesByRequestId.get(requestId); + + /** @type {!Set<!Network.NetworkRequestNode>} */ + var staleNodes = new Set(); + + // While creating nodes it may add more entries into _staleRequests because redirect request nodes update the parent + // node so we loop until we have no more stale requests. + while (this._staleRequests.size) { + var request = this._staleRequests.firstValue(); + this._staleRequests.delete(request); + var node = request[Network.NetworkLogView._networkNodeSymbol]; if (!node) - continue; + node = this._createNodeForRequest(request); + staleNodes.add(node); + } + + for (var node of staleNodes) { var isFilteredOut = !this._applyFilter(node); if (isFilteredOut && node === this._hoveredNode) this._setHoveredNode(null); @@ -884,13 +888,16 @@ this._highlightNthMatchedRequestForSearch( this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false); - this._staleRequestIds = {}; this._updateSummaryBar(); if (nodesToInsert.size) this._columns.sortByCurrentColumn(); this._dataGrid.updateInstantly(); + this._didRefreshForTest(); + } + + _didRefreshForTest() { } /** @@ -907,7 +914,7 @@ return groupNode; } - reset() { + _reset() { this._requestWithHighlightedInitiators = null; this.dispatchEventToListeners(Network.NetworkLogView.Events.RequestSelected, null); @@ -925,8 +932,7 @@ if (this._activeGroupLookup) this._activeGroupLookup.reset(); - this._nodesByRequestId.clear(); - this._staleRequestIds = {}; + this._staleRequests.clear(); this._resetSuggestionBuilder(); this._mainRequestLoadTime = -1; @@ -935,6 +941,7 @@ this._dataGrid.rootNode().removeChildren(); this._updateSummaryBar(); this._dataGrid.setStickToBottom(true); + this.scheduleRefresh(); } /** @@ -948,37 +955,17 @@ } /** - * @param {!Common.Event} event - */ - _onRequestStarted(event) { - if (!this._recording) - return; - var request = /** @type {!SDK.NetworkRequest} */ (event.data); - this._appendRequest(request); - } - - /** * @param {!SDK.NetworkRequest} request */ - _appendRequest(request) { + _createNodeForRequest(request) { var node = new Network.NetworkRequestNode(this, request); + request[Network.NetworkLogView._networkNodeSymbol] = node; node[Network.NetworkLogView._isFilteredOutSymbol] = true; node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = false; - // In case of redirect request id is reassigned to a redirected - // request and we need to update _nodesByRequestId and search results. - var originalRequestNode = this._nodesByRequestId.get(request.requestId()); - if (originalRequestNode) - this._nodesByRequestId.set(originalRequestNode.request().requestId(), originalRequestNode); - this._nodesByRequestId.set(request.requestId(), node); - - // Pull all the redirects of the main request upon commit load. - if (request.redirects) { - for (var i = 0; i < request.redirects.length; ++i) - this._refreshRequest(request.redirects[i]); - } - - this._refreshRequest(request); + if (request.redirects) + request.redirects.forEach(this._refreshRequest.bind(this)); + return node; } /** @@ -993,9 +980,6 @@ * @param {!SDK.NetworkRequest} request */ _refreshRequest(request) { - if (!this._nodesByRequestId.get(request.requestId())) - return; - Network.NetworkLogView._subdomains(request.domain) .forEach( this._suggestionBuilder.addItem.bind(this._suggestionBuilder, Network.NetworkLogView.FilterType.Domain)); @@ -1037,47 +1021,11 @@ this._suggestionBuilder.addItem(Network.NetworkLogView.FilterType.SetCookieValue, cookie.value()); } - this._staleRequestIds[request.requestId()] = true; - this.dispatchEventToListeners(Network.NetworkLogView.Events.UpdateRequest, request); + this._staleRequests.add(request); this.scheduleRefresh(); } /** - * @param {!Common.Event} event - */ - _mainFrameNavigated(event) { - if (!this._recording) - return; - - var frame = /** @type {!SDK.ResourceTreeFrame} */ (event.data); - var loaderId = frame.loaderId; - - // Pick provisional load requests. - var requestsToPick = []; - var networkManager = frame.resourceTreeModel().target().model(SDK.NetworkManager); - var requests = networkManager ? NetworkLog.networkLog.requestsForManager(networkManager) : []; - for (var i = 0; i < requests.length; ++i) { - var request = requests[i]; - if (request.loaderId === loaderId) - requestsToPick.push(request); - } - - if (!Common.moduleSetting('network.preserve-log').get()) { - this.reset(); - for (var i = 0; i < requestsToPick.length; ++i) - this._appendRequest(requestsToPick[i]); - } - for (var i = 0; i < requestsToPick.length; ++i) { - var request = requestsToPick[i]; - var node = this._nodesByRequestId.get(request.requestId()); - if (node) { - node.markAsNavigationRequest(); - break; - } - } - } - - /** * @return {number} */ rowHeight() { @@ -1185,10 +1133,7 @@ } _harRequests() { - var requests = this._nodesByRequestId.valuesArray().map(function(node) { - return node.request(); - }); - var httpRequests = requests.filter(Network.NetworkLogView.HTTPRequestsFilter); + var httpRequests = NetworkLog.networkLog.requests().filter(Network.NetworkLogView.HTTPRequestsFilter); return httpRequests.filter(Network.NetworkLogView.FinishedRequestsFilter); } @@ -1238,7 +1183,7 @@ * @param {string} platform */ _copyAllCurlCommand(platform) { - var requests = this._nodesByRequestId.valuesArray().map(node => node.request()); + var requests = NetworkLog.networkLog.requests(); var commands = []; for (var request of requests) commands.push(this._generateCurlCommand(request, platform)); @@ -1601,8 +1546,8 @@ revealAndHighlightRequest(request) { this.removeAllNodeHighlights(); - var node = this._nodesByRequestId.get(request.requestId()); - if (node) { + var node = request[Network.NetworkLogView._networkNodeSymbol]; + if (node && this.attached) { node.reveal(); this._highlightNode(node); } @@ -1752,6 +1697,7 @@ Network.NetworkLogView._isFilteredOutSymbol = Symbol('isFilteredOut'); Network.NetworkLogView._isMatchingSearchQuerySymbol = Symbol('isMatchingSearchQuery'); +Network.NetworkLogView._networkNodeSymbol = Symbol('NetworkNode'); Network.NetworkLogView.HTTPSchemas = { 'http': true, @@ -1764,8 +1710,7 @@ Network.NetworkLogView.Events = { RequestSelected: Symbol('RequestSelected'), SearchCountUpdated: Symbol('SearchCountUpdated'), - SearchIndexUpdated: Symbol('SearchIndexUpdated'), - UpdateRequest: Symbol('UpdateRequest') + SearchIndexUpdated: Symbol('SearchIndexUpdated') }; /** @enum {string} */
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js index aed4007..f53b6b26 100644 --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
@@ -109,7 +109,9 @@ Network.NetworkLogView.Events.SearchCountUpdated, this._onSearchCountUpdated, this); this._networkLogView.addEventListener( Network.NetworkLogView.Events.SearchIndexUpdated, this._onSearchIndexUpdated, this); - this._networkLogView.addEventListener(Network.NetworkLogView.Events.UpdateRequest, this._onUpdateRequest, this); + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestAdded, this._onUpdateRequest, this); + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestUpdated, this._onUpdateRequest, this); + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.Reset, this._onNetworkLogReset, this); Components.DataSaverInfobar.maybeShowInPanel(this); } @@ -146,7 +148,7 @@ this._panelToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction)); this._clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear'); - this._clearButton.addEventListener(UI.ToolbarButton.Events.Click, this._onClearButtonClicked, this); + this._clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => NetworkLog.networkLog.reset(), this); this._panelToolbar.appendToolbarItem(this._clearButton); this._panelToolbar.appendSeparator(); var recordFilmStripButton = new UI.ToolbarSettingToggle( @@ -174,7 +176,7 @@ } this._panelToolbar.appendSeparator(); - this._preserveLogSetting = Common.moduleSetting('network.preserve-log'); + this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log'); this._panelToolbar.appendToolbarItem(new UI.ToolbarSettingCheckbox( this._preserveLogSetting, Common.UIString('Do not clear log on page reload / navigation'), Common.UIString('Preserve log'))); @@ -203,7 +205,7 @@ _toggleRecording() { if (!this._preserveLogSetting.get() && !this._toggleRecordAction.toggled()) - this._reset(); + NetworkLog.networkLog.reset(); this._toggleRecord(!this._toggleRecordAction.toggled()); } @@ -215,6 +217,9 @@ this._networkLogView.setRecording(toggled); if (!toggled && this._filmStripRecorder) this._filmStripRecorder.stopRecording(this._filmStripAvailable.bind(this)); + // TODO(einbinder) This should be moved to a setting/action that NetworkLog owns but NetworkPanel controls, but + // always be present in the command menu. + NetworkLog.networkLog.setIsRecording(toggled); } /** @@ -239,18 +244,12 @@ this._networkLogView.addFilmStripFrames(timestamps); } - /** - * @param {!Common.Event} event - */ - _onClearButtonClicked(event) { - this._reset(); - } - - _reset() { - this._calculator.reset(); - this._overviewPane.reset(); - this._networkLogView.reset(); + _onNetworkLogReset() { Network.BlockedURLsPane.reset(); + if (!this._preserveLogSetting.get()) { + this._calculator.reset(); + this._overviewPane.reset(); + } if (this._filmStripView) this._resetFilmStripView(); } @@ -259,8 +258,6 @@ * @param {!Common.Event} event */ _willReloadPage(event) { - if (!this._preserveLogSetting.get()) - this._reset(); this._toggleRecord(true); if (this._pendingStopTimer) { clearTimeout(this._pendingStopTimer);
diff --git a/third_party/WebKit/Source/devtools/front_end/network/module.json b/third_party/WebKit/Source/devtools/front_end/network/module.json index a53b112..7f19972 100644 --- a/third_party/WebKit/Source/devtools/front_end/network/module.json +++ b/third_party/WebKit/Source/devtools/front_end/network/module.json
@@ -63,26 +63,6 @@ ] }, { - "type": "setting", - "category": "Network", - "storageType": "session", - "title": "Preserve log", - "settingName": "network.preserve-log", - "settingType": "boolean", - "defaultValue": false, - "tags": "preserve, clear, reset", - "options": [ - { - "value": true, - "title": "Do not preserve log on page reload / navigation" - }, - { - "value": false, - "title": "Preserve log on page reload / navigation" - } - ] - }, - { "type": "@UI.ActionDelegate", "actionId": "network.toggle-recording", "iconClass": "largeicon-start-recording",
diff --git a/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js b/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js index 638f68d2..9c32457b 100644 --- a/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js +++ b/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js
@@ -31,14 +31,18 @@ /** * @implements {SDK.SDKModelObserver<!SDK.NetworkManager>} */ -NetworkLog.NetworkLog = class { +NetworkLog.NetworkLog = class extends Common.Object { constructor() { + super(); /** @type {!Array<!SDK.NetworkRequest>} */ this._requests = []; + /** @type {!Set<!SDK.NetworkRequest>} */ + this._requestsSet = new Set(); /** @type {!Map<!SDK.NetworkManager, !Map<string, !SDK.NetworkRequest>>} */ this._requestsByManagerAndId = new Map(); /** @type {!Map<!SDK.NetworkManager, !NetworkLog.PageLoad>} */ this._currentPageLoad = new Map(); + this._isRecording = true; SDK.targetManager.observeModels(SDK.NetworkManager, this); } @@ -51,10 +55,16 @@ eventListeners.push( networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this)); eventListeners.push( + networkManager.addEventListener(SDK.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this)); + eventListeners.push( networkManager.addEventListener(SDK.NetworkManager.Events.RequestRedirected, this._onRequestRedirect, this)); + eventListeners.push( + networkManager.addEventListener(SDK.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this)); var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); if (resourceTreeModel) { + eventListeners.push( + resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.WillReloadPage, this._willReloadPage, this)); eventListeners.push(resourceTreeModel.addEventListener( SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavigated, this)); eventListeners.push(resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._onLoad, this)); @@ -72,10 +82,32 @@ */ modelRemoved(networkManager) { this._requestsByManagerAndId.delete(networkManager); + this._removeNetworkManagerListeners(networkManager); + } + + /** + * @param {!SDK.NetworkManager} networkManager + */ + _removeNetworkManagerListeners(networkManager) { Common.EventTarget.removeEventListeners(networkManager[NetworkLog.NetworkLog._events]); } /** + * @param {boolean} enabled + */ + setIsRecording(enabled) { + if (this._isRecording === enabled) + return; + this._isRecording = enabled; + if (enabled) { + SDK.targetManager.observeModels(SDK.NetworkManager, this); + } else { + SDK.targetManager.unobserveModels(SDK.NetworkManager, this); + SDK.targetManager.models(SDK.NetworkManager).forEach(this._removeNetworkManagerListeners.bind(this)); + } + } + + /** * @param {string} url * @return {?SDK.NetworkRequest} */ @@ -233,7 +265,12 @@ * @return {?NetworkLog.PageLoad} */ pageLoadForRequest(request) { - return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol]; + return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] || null; + } + + _willReloadPage() { + if (!Common.moduleSetting('network_log.preserve-log').get()) + this.reset(); } /** @@ -245,24 +282,47 @@ if (!networkManager) return; - this._currentPageLoad.delete(networkManager); - var oldRequests = this.requestsForManager(networkManager); - this._requests = this._requests.filter(request => request.networkManager() !== networkManager); + var oldManagerRequests = this.requestsForManager(networkManager); + var oldRequestsSet = this._requestsSet; + this._requests = []; + this._requestsSet = new Set(); var idMap = new Map(); + // TODO(allada) This should be removed in a future patch, but if somewhere else does a request on this in a reset + // event it may cause problems. this._requestsByManagerAndId.set(networkManager, idMap); + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.Reset); // Preserve requests from the new session. var currentPageLoad = null; - for (var i = 0; i < oldRequests.length; ++i) { - var request = oldRequests[i]; - if (request.loaderId === mainFrame.loaderId) { - if (!currentPageLoad) - currentPageLoad = new NetworkLog.PageLoad(request); + var requestsToAdd = []; + for (var request of oldManagerRequests) { + if (request.loaderId !== mainFrame.loaderId) + continue; + if (!currentPageLoad) { + currentPageLoad = new NetworkLog.PageLoad(request); + if (request.redirects) + requestsToAdd.pushAll(request.redirects); + } + requestsToAdd.push(request); + } + + for (var request of requestsToAdd) { + oldRequestsSet.delete(request); + this._requests.push(request); + this._requestsSet.add(request); + idMap.set(request.requestId(), request); + request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad; + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request); + } + + if (Common.moduleSetting('network_log.preserve-log').get()) { + for (var request of oldRequestsSet) { this._requests.push(request); - idMap.set(request.requestId(), request); - request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad; + this._requestsSet.add(request); + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request); } } + if (currentPageLoad) this._currentPageLoad.set(networkManager, currentPageLoad); } @@ -273,8 +333,23 @@ _onRequestStarted(event) { var request = /** @type {!SDK.NetworkRequest} */ (event.data); this._requests.push(request); - this._requestsByManagerAndId.get(request.networkManager()).set(request.requestId(), request); - request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad.get(request.networkManager()); + this._requestsSet.add(request); + var idMap = this._requestsByManagerAndId.get(request.networkManager()); + if (idMap) + idMap.set(request.requestId(), request); + request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = + this._currentPageLoad.get(request.networkManager()) || null; + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request); + } + + /** + * @param {!Common.Event} event + */ + _onRequestUpdated(event) { + var request = /** @type {!SDK.NetworkRequest} */ (event.data); + if (!this._requestsSet.has(request)) + return; + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestUpdated, request); } /** @@ -315,6 +390,19 @@ var map = this._requestsByManagerAndId.get(networkManager); return map ? (map.get(requestId) || null) : null; } + + reset() { + this._requests = []; + this._requestsSet.clear(); + this._requestsByManagerAndId.forEach(map => map.clear()); + var networkManagers = new Set(SDK.targetManager.models(SDK.NetworkManager)); + for (var networkManager of this._currentPageLoad.keys()) { + if (!networkManagers.has(networkManager)) + this._currentPageLoad.delete(networkManager); + } + + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.Reset); + } }; NetworkLog.PageLoad = class { @@ -329,6 +417,7 @@ this.loadTime; /** @type {number} */ this.contentLoadTime; + this.mainRequest = mainRequest; } }; @@ -337,6 +426,12 @@ /** @typedef {!{initiators: !Set<!SDK.NetworkRequest>, initiated: !Set<!SDK.NetworkRequest>}} */ NetworkLog.NetworkLog.InitiatorGraph; +NetworkLog.NetworkLog.Events = { + Reset: Symbol('Reset'), + RequestAdded: Symbol('RequestAdded'), + RequestUpdated: Symbol('RequestUpdated') +}; + /** @typedef {!{type: !SDK.NetworkRequest.InitiatorType, url: string, lineNumber: number, columnNumber: number, scriptId: ?string}} */ NetworkLog.NetworkLog._InitiatorInfo;
diff --git a/third_party/WebKit/Source/devtools/front_end/network_log/module.json b/third_party/WebKit/Source/devtools/front_end/network_log/module.json index 5cbaa3b..41b2e10b 100644 --- a/third_party/WebKit/Source/devtools/front_end/network_log/module.json +++ b/third_party/WebKit/Source/devtools/front_end/network_log/module.json
@@ -1,4 +1,26 @@ { + "extensions": [ + { + "type": "setting", + "category": "Network", + "storageType": "session", + "title": "Preserve log", + "settingName": "network_log.preserve-log", + "settingType": "boolean", + "defaultValue": false, + "tags": "preserve, clear, reset", + "options": [ + { + "value": true, + "title": "Do not preserve log on page reload / navigation" + }, + { + "value": false, + "title": "Preserve log on page reload / navigation" + } + ] + } + ], "dependencies": [ "sdk" ],
diff --git a/third_party/WebKit/Source/modules/accessibility/OWNERS b/third_party/WebKit/Source/modules/accessibility/OWNERS index 5ec44f48..214d52cf 100644 --- a/third_party/WebKit/Source/modules/accessibility/OWNERS +++ b/third_party/WebKit/Source/modules/accessibility/OWNERS
@@ -1,5 +1,6 @@ aboxhall@chromium.org dmazzoni@chromium.org +nektar@chromium.org # TEAM: chromium-accessibility@chromium.org -# COMPONENT: UI>Accessibility +# COMPONENT: Blink>Accessibility
diff --git a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp index a90a6064..67e0bf8 100644 --- a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp +++ b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
@@ -12,6 +12,7 @@ #include "core/frame/LocalFrame.h" #include "core/frame/Navigator.h" #include "modules/webshare/ShareData.h" +#include "platform/bindings/V8ThrowException.h" #include "platform/mojo/MojoHelper.h" #include "public/platform/InterfaceProvider.h" #include "public/platform/Platform.h" @@ -69,7 +70,6 @@ if (error == mojom::blink::ShareError::OK) { resolver_->Resolve(); } else { - // TODO(mgiuca): Work out which error type to use. resolver_->Reject(DOMException::Create(kAbortError, ErrorToString(error))); } } @@ -109,6 +109,16 @@ DOMException* error = DOMException::Create(kSecurityError, error_message); return ScriptPromise::RejectWithDOMException(script_state, error); } + + Document* doc = ToDocument(ExecutionContext::From(script_state)); + DCHECK(doc); + KURL full_url = doc->CompleteURL(share_data.url()); + if (!full_url.IsNull() && !full_url.IsValid()) { + v8::Local<v8::Value> error = V8ThrowException::CreateTypeError( + script_state->GetIsolate(), "Invalid URL"); + return ScriptPromise::Reject(script_state, error); + } + if (!UserGestureIndicator::ProcessingUserGesture()) { DOMException* error = DOMException::Create( kSecurityError, @@ -116,8 +126,6 @@ return ScriptPromise::RejectWithDOMException(script_state, error); } - Document* doc = ToDocument(ExecutionContext::From(script_state)); - DCHECK(doc); if (!service_) { LocalFrame* frame = doc->GetFrame(); DCHECK(frame); @@ -134,7 +142,7 @@ service_->Share(share_data.hasTitle() ? share_data.title() : g_empty_string, share_data.hasText() ? share_data.text() : g_empty_string, - doc->CompleteURL(share_data.url()), + full_url, ConvertToBaseCallback(WTF::Bind(&ShareClientImpl::Callback, WrapPersistent(client))));
diff --git a/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl b/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl index 764b523d..49cdd07f 100644 --- a/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl +++ b/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://github.com/WICG/web-share/blob/master/docs/interface.md +// https://wicg.github.io/web-share/ [ OriginTrialEnabled=WebShare
diff --git a/third_party/WebKit/Source/modules/webshare/ShareData.idl b/third_party/WebKit/Source/modules/webshare/ShareData.idl index 9bb123cc..3911fe7 100644 --- a/third_party/WebKit/Source/modules/webshare/ShareData.idl +++ b/third_party/WebKit/Source/modules/webshare/ShareData.idl
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://github.com/WICG/web-share/blob/master/docs/interface.md +// https://wicg.github.io/web-share/ dictionary ShareData { - DOMString? title; - DOMString? text; - DOMString? url; + USVString title; + USVString text; + USVString url; };
diff --git a/third_party/WebKit/Source/platform/DEPS b/third_party/WebKit/Source/platform/DEPS index eaaea96..4edbeed 100644 --- a/third_party/WebKit/Source/platform/DEPS +++ b/third_party/WebKit/Source/platform/DEPS
@@ -23,6 +23,7 @@ "+base/strings/stringprintf.h", "+base/synchronization/waitable_event.h", "+base/sys_info.h", + "+base/android/sys_utils.h", "+base/test", "+base/test/fuzzed_data_provider.h", "+base/threading/thread_task_runner_handle.h",
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp index e9cf30e..7e08795 100644 --- a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp +++ b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
@@ -10,6 +10,10 @@ #include "platform/instrumentation/tracing/TraceEvent.h" #include "platform/wtf/allocator/Partitions.h" +#if OS(ANDROID) +#include "base/android/sys_utils.h" +#endif + namespace blink { // static @@ -33,6 +37,15 @@ } // static +bool MemoryCoordinator::IsCurrentlyLowMemory() { +#if OS(ANDROID) + return base::android::SysUtils::IsCurrentlyLowMemory(); +#else + return false; +#endif +} + +// static void MemoryCoordinator::Initialize() { is_low_end_device_ = ::base::SysInfo::IsLowEndDevice(); physical_memory_mb_ = ::base::SysInfo::AmountOfPhysicalMemoryMB();
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.h b/third_party/WebKit/Source/platform/MemoryCoordinator.h index c8e137b0..3149524 100644 --- a/third_party/WebKit/Source/platform/MemoryCoordinator.h +++ b/third_party/WebKit/Source/platform/MemoryCoordinator.h
@@ -45,6 +45,11 @@ // Override the value of the physical memory for testing. static void SetPhysicalMemoryMBForTesting(int64_t); + // Returns true when available memory is low. + // This is not cheap and should not be called repeatedly. + // TODO(keishi): Remove when MemoryState is ready. + static bool IsCurrentlyLowMemory(); + // Caches whether this device is a low-end device and the device physical // memory in static members. instance() is not used as it's a heap allocated // object - meaning it's not thread-safe as well as might break tests counting
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium index d111b700..2622116c 100644 --- a/third_party/libxml/README.chromium +++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@ Name: libxml URL: http://xmlsoft.org -Version: 074180119fc90d5fd04ef9e8a5ee1910d6f9ad8e +Version: 3939178e4cb797417ff033b1e04ab4b038e224d9 License: MIT License File: src/Copyright Security Critical: yes @@ -14,14 +14,10 @@ chromium/include/libxml/libxml_utils.h. - Applied these patches in chromium/*.patch: chromium-issue-599427.patch: workaround for VS 2015 Update 2 code-gen bug - chromium-issue-620679.patch: See https://crbug.com/620679#c34 chromium-issue-628581.patch: See https://crbug.com/628581#c18 - chromium-issue-683629.patch: See https://crbug.com/683629#c9 libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch: See https://crbug.com/708433 libxml2-2.9.4-security-xpath-nodetab-uaf.patch: See https://crbug.com/705445 - libxml2-2.9.4-xmlDumpElementContent-null-deref.patch: - See https://crbug.com/700750 chromium-issue-708434.patch: Guard against input counter overflow. - Delete various unused files, see chromium/roll.py
diff --git a/third_party/libxml/chromium/chromium-issue-620679.patch b/third_party/libxml/chromium/chromium-issue-620679.patch deleted file mode 100644 index b2c8db9..0000000 --- a/third_party/libxml/chromium/chromium-issue-620679.patch +++ /dev/null
@@ -1,24 +0,0 @@ -diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c -index e3136123dca6..33786f08354d 100644 ---- a/parser.c -+++ b/parser.c -@@ -3426,8 +3426,15 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) { - xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); - return(NULL); - } -- if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) -+ if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) { -+ if (ctxt->input->base > ctxt->input->cur - (len + 1)) { -+ return(NULL); -+ } - return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); -+ } -+ if (ctxt->input->base > ctxt->input->cur - len) { -+ return(NULL); -+ } - return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); - } - --- -2.12.2.715.g7642488e1d-goog -
diff --git a/third_party/libxml/chromium/chromium-issue-683629.patch b/third_party/libxml/chromium/chromium-issue-683629.patch deleted file mode 100644 index 0d068500..0000000 --- a/third_party/libxml/chromium/chromium-issue-683629.patch +++ /dev/null
@@ -1,16 +0,0 @@ -Fromdiff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c -index 33786f08354d..745c3da1c72e 100644 ---- a/parser.c -+++ b/parser.c -@@ -3426,7 +3426,7 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) { - xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); - return(NULL); - } -- if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) { -+ if (ctxt->input->cur > ctxt->input->base && (*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) { - if (ctxt->input->base > ctxt->input->cur - (len + 1)) { - return(NULL); - } --- -2.12.2.715.g7642488e1d-goog -
diff --git a/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch b/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch index e60fe8fa..d0d877dc 100644 --- a/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch +++ b/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch
@@ -2,14 +2,6 @@ --- src/uri.c +++ src/uri.c -@@ -12,6 +12,7 @@ - #include "third_party/libxml/src/libxml.h" - - #include <string.h> -+#include <limits.h> - - #include "third_party/libxml/src/include/libxml/xmlmemory.h" - #include "third_party/libxml/src/include/libxml/uri.h" @@ -334,7 +335,7 @@ xmlParse3986Port(xmlURIPtr uri, const char **str) cur++; }
diff --git a/third_party/libxml/chromium/libxml2-2.9.4-xmlDumpElementContent-null-deref.patch b/third_party/libxml/chromium/libxml2-2.9.4-xmlDumpElementContent-null-deref.patch deleted file mode 100644 index ec28c85..0000000 --- a/third_party/libxml/chromium/libxml2-2.9.4-xmlDumpElementContent-null-deref.patch +++ /dev/null
@@ -1,34 +0,0 @@ -observed while fuzzing - ---- src/valid.c -+++ src/valid.c -@@ -1172,12 +1172,14 @@ xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) - xmlBufferWriteCHAR(buf, content->name); - break; - case XML_ELEMENT_CONTENT_SEQ: -+ if (content->c1 == NULL) return; - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) - xmlDumpElementContent(buf, content->c1, 1); - else - xmlDumpElementContent(buf, content->c1, 0); - xmlBufferWriteChar(buf, " , "); -+ if (content->c2 == NULL) return; - if ((content->c2->type == XML_ELEMENT_CONTENT_OR) || - ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) -@@ -1186,12 +1188,14 @@ xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob) - xmlDumpElementContent(buf, content->c2, 0); - break; - case XML_ELEMENT_CONTENT_OR: -+ if (content->c1 == NULL) return; - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) - xmlDumpElementContent(buf, content->c1, 1); - else - xmlDumpElementContent(buf, content->c1, 0); - xmlBufferWriteChar(buf, " | "); -+ if (content->c2 == NULL) return; - if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || - ((content->c2->type == XML_ELEMENT_CONTENT_OR) && - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))
diff --git a/third_party/libxml/chromium/libxml_utils.cc b/third_party/libxml/chromium/libxml_utils.cc index 1914cd6..4eed5d6 100644 --- a/third_party/libxml/chromium/libxml_utils.cc +++ b/third_party/libxml/chromium/libxml_utils.cc
@@ -24,8 +24,7 @@ bool XmlReader::Load(const std::string& input) { const int kParseOptions = XML_PARSE_RECOVER | // recover on errors - XML_PARSE_NONET | // forbid network access - XML_PARSE_NOXXE; // no external entities + XML_PARSE_NONET; // forbid network access // TODO(evanm): Verify it's OK to pass NULL for the URL and encoding. // The libxml code allows for these, but it's unclear what effect is has. reader_ = xmlReaderForMemory(input.data(), static_cast<int>(input.size()), @@ -35,8 +34,7 @@ bool XmlReader::LoadFile(const std::string& file_path) { const int kParseOptions = XML_PARSE_RECOVER | // recover on errors - XML_PARSE_NONET | // forbid network access - XML_PARSE_NOXXE; // no external entities + XML_PARSE_NONET; // forbid network access reader_ = xmlReaderForFile(file_path.c_str(), NULL, kParseOptions); return reader_ != NULL; }
diff --git a/third_party/libxml/chromium/roll.py b/third_party/libxml/chromium/roll.py index 44cac5de..fa837c8 100755 --- a/third_party/libxml/chromium/roll.py +++ b/third_party/libxml/chromium/roll.py
@@ -72,12 +72,9 @@ PATCHES = [ 'chromium-issue-599427.patch', - 'chromium-issue-620679.patch', 'chromium-issue-628581.patch', - 'chromium-issue-683629.patch', 'libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch', 'libxml2-2.9.4-security-xpath-nodetab-uaf.patch', - 'libxml2-2.9.4-xmlDumpElementContent-null-deref.patch', 'chromium-issue-708434.patch', ] @@ -343,6 +340,7 @@ 's/Version: .*$/Version: %s/' % commit) for patch in PATCHES: + print(patch) subprocess.check_call( 'cat ../chromium/%s | patch -p1 --fuzz=0' % patch, shell=True)
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c index d1395fa50..22ec576 100644 --- a/third_party/libxml/src/HTMLparser.c +++ b/third_party/libxml/src/HTMLparser.c
@@ -2528,8 +2528,12 @@ } } - if (ctxt->input->base > ctxt->input->cur - len) - return(NULL); + if (ctxt->input->cur - ctxt->input->base < len) { + /* Sanity check */ + htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, + "unexpected change of input buffer", NULL, NULL); + return (NULL); + } return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); } @@ -4444,7 +4448,7 @@ htmlParseElementInternal(htmlParserCtxtPtr ctxt) { const xmlChar *name; const htmlElemDesc * info; - htmlParserNodeInfo node_info = { 0, }; + htmlParserNodeInfo node_info = { NULL, 0, 0, 0, 0 }; int failed; if ((ctxt == NULL) || (ctxt->input == NULL)) { @@ -4941,6 +4945,7 @@ ctxt->wellFormed = 1; ctxt->replaceEntities = 0; ctxt->linenumbers = xmlLineNumbersDefaultValue; + ctxt->keepBlanks = xmlKeepBlanksDefaultValue; ctxt->html = 1; ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0; ctxt->vctxt.userData = ctxt;
diff --git a/third_party/libxml/src/Makefile.am b/third_party/libxml/src/Makefile.am index 9f988b0..51b253e 100644 --- a/third_party/libxml/src/Makefile.am +++ b/third_party/libxml/src/Makefile.am
@@ -205,7 +205,12 @@ runtests: [ -d test ] || $(LN_S) $(srcdir)/test . [ -d result ] || $(LN_S) $(srcdir)/result . - $(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) ./testapi$(EXEEXT) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT) + $(CHECKER) ./runtest$(EXEEXT) && \ + $(CHECKER) ./testrecurse$(EXEEXT) && \ + ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) ./testapi$(EXEEXT) && \ + $(CHECKER) ./testchar$(EXEEXT) && \ + $(CHECKER) ./testdict$(EXEEXT) && \ + $(CHECKER) ./runxmlconf$(EXEEXT) @(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \ $(MAKE) tests ; fi) @@ -224,12 +229,12 @@ tests: XMLtests XMLenttests NStests IDtests Errtests APItests $(READER_TEST) $(TEST_SAX) $(TEST_PUSH) $(TEST_HTML) $(TEST_PHTML) $(TEST_VALID) URItests $(TEST_PATTERN) $(TEST_XPATH) $(TEST_XPTR) $(TEST_XINCLUDE) $(TEST_C14N) $(TEST_DEBUG) $(TEST_CATALOG) $(TEST_REGEXPS) $(TEST_SCHEMAS) $(TEST_SCHEMATRON) $(TEST_THREADS) Timingtests $(TEST_VTIME) $(PYTHON_TESTS) $(TEST_MODULES) @(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \ - $(MAKE) tests ; fi) - @(cd doc/examples ; $(MAKE) tests) + $(MAKE) -s tests ; fi) + @(cd doc/examples ; $(MAKE) -s tests) APItests: testapi$(EXEEXT) @echo "## Running the API regression tests this may take a little while" - -@($(CHECKER) $(top_builddir)/testapi -q) + -@(ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) $(top_builddir)/testapi -q) HTMLtests : testHTML$(EXEEXT) @(echo > .memdump) @@ -247,7 +252,7 @@ diff -b $(srcdir)/result/HTML/$$name.err error.$$name ; \ $(CHECKER) $(top_builddir)/testHTML result.$$name > result2.$$name 2>error.$$name ; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name error.$$name ; \ fi ; fi ; done) @@ -268,7 +273,7 @@ diff -b errorcut.$$name errorcut2.$$name ; \ $(CHECKER) $(top_builddir)/testHTML --push result.$$name > result2.$$name 2>error.$$name ; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name error.$$name errorcut.$$name errorcut2.$$name ; \ fi ; fi ; done) @echo "## HTML SAX regression tests" @@ -282,7 +287,7 @@ log=`$(CHECKER) $(top_builddir)/testHTML --sax $$i > result.$$name.sax ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name.sax ; \ fi ; fi ; done) @echo "## Push HTML SAX regression tests" @@ -296,7 +301,7 @@ log=`$(CHECKER) $(top_builddir)/testHTML --push --sax $$i 2>&1 > result.$$name.sax ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name.sax ; \ fi ; fi ; done) @@ -317,7 +322,7 @@ $(CHECKER) $(top_builddir)/xmllint result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff result.$$name result2.$$name` ;\ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @echo "## XML regression tests on memory" @@ -334,7 +339,7 @@ diff $(srcdir)/result/$$name result.$$name ; \ $(CHECKER) $(top_builddir)/xmllint --memory result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"`; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ diff result.$$name result2.$$name ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @@ -356,7 +361,7 @@ $(CHECKER) $(top_builddir)/xmllint --push result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @@ -377,7 +382,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/namespaces/$$name result.$$name ; \ diff $(srcdir)/result/namespaces/$$name.err error.$$name`; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -398,7 +403,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/xmlid/$$name result.$$name ; \ diff $(srcdir)/result/xmlid/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -419,7 +424,25 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/errors/$$name result.$$name ; \ diff $(srcdir)/result/errors/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ + rm result.$$name error.$$name ; \ + fi ; fi ; done) + @echo "## Error cases regression tests (old 1.0)" + -@(for i in $(srcdir)/test/errors10/*.xml ; do \ + name=`basename $$i`; \ + if [ ! -d $$i ] ; then \ + if [ ! -f $(srcdir)/result/errors10/$$name ] ; then \ + echo New test file $$name ; \ + $(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i \ + 2> $(srcdir)/result/errors10/$$name.err \ + > $(srcdir)/result/errors10/$$name ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ + else \ + log=`$(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i 2> error.$$name > result.$$name ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ + diff $(srcdir)/result/errors10/$$name result.$$name ; \ + diff $(srcdir)/result/errors10/$$name.err error.$$name` ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @echo "## Error cases stream regression tests" @@ -436,7 +459,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --stream $$i 2> error.$$name > /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/errors/$$name.str error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm error.$$name ; \ fi ; fi ; done) @@ -459,7 +482,7 @@ $(CHECKER) $(top_builddir)/xmllint --noent result.$$name 2>&1 > result2.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @@ -477,7 +500,7 @@ log=`$(CHECKER) $(top_builddir)/testURI -base 'http://foo.com/path/to/index.html?orig#help' < $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/URI/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/URI/*.uri ; do \ @@ -491,7 +514,7 @@ log=`$(CHECKER) $(top_builddir)/testURI < $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/URI/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -505,13 +528,13 @@ if [ ! -d $$i ] ; then \ if [ ! -f $(srcdir)/result/XPath/expr/$$name ] ; then \ echo New test file $$name ; \ - $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name ; \ + $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ else \ - log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i 2>&1 > result.$$name ; \ + log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XPath/expr/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ; \ for i in $(srcdir)/test/XPath/docs/* ; do \ @@ -526,10 +549,10 @@ $(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > $(srcdir)/result/XPath/tests/$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ else \ - log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j 2>&1 > result.$$name ; \ + log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XPath/tests/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ; fi ; done) @@ -547,13 +570,13 @@ if [ ! -d $$j ] ; then \ if [ ! -f $(srcdir)/result/XPath/xptr/$$name ] ; then \ echo New test file $$name ; \ - $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name ; \ + $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ else \ - log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j 2>&1 > result.$$name ; \ + log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XPath/xptr/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ; fi ; done) @@ -572,7 +595,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name result.$$name ; \ diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/XInclude/docs/* ; do \ @@ -587,7 +610,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name result.$$name ; \ diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @(echo > .memdump) @@ -604,7 +627,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \ diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/XInclude/docs/* ; do \ @@ -619,7 +642,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \ diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -640,7 +663,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/scripts/$$name result.$$name ; \ diff $(srcdir)/result/scripts/$$name.err result.$$name.err` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result.$$name.err ; \ fi ; fi ; done) @@ -659,7 +682,7 @@ log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$xml < $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/catalogs/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/catalogs/*.script ; do \ @@ -674,7 +697,7 @@ log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$sgml < $$i > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/catalogs/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Add and del operations on XML Catalogs" @@ -738,7 +761,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Reader on memory regression tests" @@ -753,7 +776,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --memory --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @(echo > .memdump) @@ -769,7 +792,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --walker $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Reader entities substitution regression tests" @@ -784,7 +807,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --noent --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rde result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -802,7 +825,7 @@ log=`$(CHECKER) $(top_builddir)/testSAX $$i > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.sax result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## SAX2 callbacks regression tests" @@ -817,7 +840,7 @@ log=`$(CHECKER) $(top_builddir)/testSAX --sax2 $$i > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.sax2 result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -829,7 +852,7 @@ if [ ! -d $$i ] ; then \ log=`$(CHECKER) $(top_builddir)/xmllint --valid --noout --nowarning $$i ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"`;\ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ fi ; done ; exit 0) @echo "## Validity checking regression tests" -@(for i in $(srcdir)/test/VC/* ; do \ @@ -843,7 +866,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --noout --valid $$i 2> result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/VC/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## General documents valid regression tests" @@ -859,7 +882,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/valid/$$name result.$$name ; \ diff $(srcdir)/result/valid/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -877,7 +900,7 @@ log=`$(CHECKER) $(top_builddir)/testRegexp -i $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/regexp/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Formal expresssions regression tests" @@ -892,7 +915,7 @@ log=`$(CHECKER) $(top_builddir)/testRegexp --expr -i $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/expr/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -910,7 +933,7 @@ log=`$(CHECKER) $(top_builddir)/testAutomata $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/automata/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -961,7 +984,7 @@ cmdline="$$cmdline '`cat $(srcdir)/test/c14n/$$m/$$name.ns`'"; \ fi; \ fi; \ - $$cmdline > $(srcdir)/test/c14n/test.tmp; \ + $$cmdline > $(srcdir)/test/c14n/test.tmp 2> /dev/null; \ if [ $$? -eq 0 ]; then \ diff $(srcdir)/result/c14n/$$m/$$name $(srcdir)/test/c14n/test.tmp; \ if [ $$? -ne 0 ]; then \ @@ -1002,7 +1025,7 @@ diff $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno".err \ err.$$name;\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ;\ done; done) @@ -1027,7 +1050,7 @@ diff $(srcdir)/result/relaxng/"$$name"_err \ err.$$name | grep -v "error detected at";\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo schemas $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo schemas $$name result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi; \ for j in $(srcdir)/test/relaxng/"$$name"_*.xml ; do \ @@ -1049,7 +1072,7 @@ diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \ err.$$name | grep -v "error detected at";\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ; \ done; done) @@ -1075,7 +1098,7 @@ diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \ err.$$name | grep -v "error detected at";\ fi ; grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ; \ done; done) @@ -1104,7 +1127,7 @@ diff $(srcdir)/result/schematron/"$$name"_"$$xno".err \ err.$$name | grep -v "error detected at";\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ; \ done; done) @@ -1153,7 +1176,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ done ;\ diff $(srcdir)/result/pattern/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ;)
diff --git a/third_party/libxml/src/Makefile.in b/third_party/libxml/src/Makefile.in index b406cce64..b9e3056 100644 --- a/third_party/libxml/src/Makefile.in +++ b/third_party/libxml/src/Makefile.in
@@ -1907,7 +1907,12 @@ runtests: [ -d test ] || $(LN_S) $(srcdir)/test . [ -d result ] || $(LN_S) $(srcdir)/result . - $(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) ./testapi$(EXEEXT) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT) + $(CHECKER) ./runtest$(EXEEXT) && \ + $(CHECKER) ./testrecurse$(EXEEXT) && \ + ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) ./testapi$(EXEEXT) && \ + $(CHECKER) ./testchar$(EXEEXT) && \ + $(CHECKER) ./testdict$(EXEEXT) && \ + $(CHECKER) ./runxmlconf$(EXEEXT) @(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \ $(MAKE) tests ; fi) @@ -1926,12 +1931,12 @@ tests: XMLtests XMLenttests NStests IDtests Errtests APItests $(READER_TEST) $(TEST_SAX) $(TEST_PUSH) $(TEST_HTML) $(TEST_PHTML) $(TEST_VALID) URItests $(TEST_PATTERN) $(TEST_XPATH) $(TEST_XPTR) $(TEST_XINCLUDE) $(TEST_C14N) $(TEST_DEBUG) $(TEST_CATALOG) $(TEST_REGEXPS) $(TEST_SCHEMAS) $(TEST_SCHEMATRON) $(TEST_THREADS) Timingtests $(TEST_VTIME) $(PYTHON_TESTS) $(TEST_MODULES) @(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \ - $(MAKE) tests ; fi) - @(cd doc/examples ; $(MAKE) tests) + $(MAKE) -s tests ; fi) + @(cd doc/examples ; $(MAKE) -s tests) APItests: testapi$(EXEEXT) @echo "## Running the API regression tests this may take a little while" - -@($(CHECKER) $(top_builddir)/testapi -q) + -@(ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) $(top_builddir)/testapi -q) HTMLtests : testHTML$(EXEEXT) @(echo > .memdump) @@ -1949,7 +1954,7 @@ diff -b $(srcdir)/result/HTML/$$name.err error.$$name ; \ $(CHECKER) $(top_builddir)/testHTML result.$$name > result2.$$name 2>error.$$name ; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name error.$$name ; \ fi ; fi ; done) @@ -1970,7 +1975,7 @@ diff -b errorcut.$$name errorcut2.$$name ; \ $(CHECKER) $(top_builddir)/testHTML --push result.$$name > result2.$$name 2>error.$$name ; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name error.$$name errorcut.$$name errorcut2.$$name ; \ fi ; fi ; done) @echo "## HTML SAX regression tests" @@ -1984,7 +1989,7 @@ log=`$(CHECKER) $(top_builddir)/testHTML --sax $$i > result.$$name.sax ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name.sax ; \ fi ; fi ; done) @echo "## Push HTML SAX regression tests" @@ -1998,7 +2003,7 @@ log=`$(CHECKER) $(top_builddir)/testHTML --push --sax $$i 2>&1 > result.$$name.sax ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name.sax ; \ fi ; fi ; done) @@ -2019,7 +2024,7 @@ $(CHECKER) $(top_builddir)/xmllint result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff result.$$name result2.$$name` ;\ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @echo "## XML regression tests on memory" @@ -2036,7 +2041,7 @@ diff $(srcdir)/result/$$name result.$$name ; \ $(CHECKER) $(top_builddir)/xmllint --memory result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"`; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ diff result.$$name result2.$$name ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @@ -2058,7 +2063,7 @@ $(CHECKER) $(top_builddir)/xmllint --push result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @@ -2079,7 +2084,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/namespaces/$$name result.$$name ; \ diff $(srcdir)/result/namespaces/$$name.err error.$$name`; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -2100,7 +2105,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/xmlid/$$name result.$$name ; \ diff $(srcdir)/result/xmlid/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -2121,7 +2126,25 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/errors/$$name result.$$name ; \ diff $(srcdir)/result/errors/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ + rm result.$$name error.$$name ; \ + fi ; fi ; done) + @echo "## Error cases regression tests (old 1.0)" + -@(for i in $(srcdir)/test/errors10/*.xml ; do \ + name=`basename $$i`; \ + if [ ! -d $$i ] ; then \ + if [ ! -f $(srcdir)/result/errors10/$$name ] ; then \ + echo New test file $$name ; \ + $(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i \ + 2> $(srcdir)/result/errors10/$$name.err \ + > $(srcdir)/result/errors10/$$name ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ + else \ + log=`$(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i 2> error.$$name > result.$$name ; \ + grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ + diff $(srcdir)/result/errors10/$$name result.$$name ; \ + diff $(srcdir)/result/errors10/$$name.err error.$$name` ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @echo "## Error cases stream regression tests" @@ -2138,7 +2161,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --stream $$i 2> error.$$name > /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff $(srcdir)/result/errors/$$name.str error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm error.$$name ; \ fi ; fi ; done) @@ -2161,7 +2184,7 @@ $(CHECKER) $(top_builddir)/xmllint --noent result.$$name 2>&1 > result2.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ diff result.$$name result2.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result2.$$name ; \ fi ; fi ; done) @@ -2179,7 +2202,7 @@ log=`$(CHECKER) $(top_builddir)/testURI -base 'http://foo.com/path/to/index.html?orig#help' < $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/URI/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/URI/*.uri ; do \ @@ -2193,7 +2216,7 @@ log=`$(CHECKER) $(top_builddir)/testURI < $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/URI/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -2207,13 +2230,13 @@ if [ ! -d $$i ] ; then \ if [ ! -f $(srcdir)/result/XPath/expr/$$name ] ; then \ echo New test file $$name ; \ - $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name ; \ + $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ else \ - log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i 2>&1 > result.$$name ; \ + log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XPath/expr/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ; \ for i in $(srcdir)/test/XPath/docs/* ; do \ @@ -2228,10 +2251,10 @@ $(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > $(srcdir)/result/XPath/tests/$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ else \ - log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j 2>&1 > result.$$name ; \ + log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XPath/tests/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ; fi ; done) @@ -2249,13 +2272,13 @@ if [ ! -d $$j ] ; then \ if [ ! -f $(srcdir)/result/XPath/xptr/$$name ] ; then \ echo New test file $$name ; \ - $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name ; \ + $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"; \ else \ - log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j 2>&1 > result.$$name ; \ + log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XPath/xptr/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ; fi ; done) @@ -2274,7 +2297,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name result.$$name ; \ diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/XInclude/docs/* ; do \ @@ -2289,7 +2312,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name result.$$name ; \ diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @(echo > .memdump) @@ -2306,7 +2329,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \ diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/XInclude/docs/* ; do \ @@ -2321,7 +2344,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \ diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -2342,7 +2365,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/scripts/$$name result.$$name ; \ diff $(srcdir)/result/scripts/$$name.err result.$$name.err` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name result.$$name.err ; \ fi ; fi ; done) @@ -2361,7 +2384,7 @@ log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$xml < $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/catalogs/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) -@(for i in $(srcdir)/test/catalogs/*.script ; do \ @@ -2376,7 +2399,7 @@ log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$sgml < $$i > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/catalogs/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Add and del operations on XML Catalogs" @@ -2440,7 +2463,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Reader on memory regression tests" @@ -2455,7 +2478,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --memory --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @(echo > .memdump) @@ -2471,7 +2494,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --walker $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rdr result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Reader entities substitution regression tests" @@ -2486,7 +2509,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --noent --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.rde result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -2504,7 +2527,7 @@ log=`$(CHECKER) $(top_builddir)/testSAX $$i > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.sax result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## SAX2 callbacks regression tests" @@ -2519,7 +2542,7 @@ log=`$(CHECKER) $(top_builddir)/testSAX --sax2 $$i > result.$$name 2> /dev/null ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/$$name.sax2 result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -2531,7 +2554,7 @@ if [ ! -d $$i ] ; then \ log=`$(CHECKER) $(top_builddir)/xmllint --valid --noout --nowarning $$i ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0"`;\ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ fi ; done ; exit 0) @echo "## Validity checking regression tests" -@(for i in $(srcdir)/test/VC/* ; do \ @@ -2545,7 +2568,7 @@ log=`$(CHECKER) $(top_builddir)/xmllint --noout --valid $$i 2> result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/VC/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## General documents valid regression tests" @@ -2561,7 +2584,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/valid/$$name result.$$name ; \ diff $(srcdir)/result/valid/$$name.err error.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name error.$$name ; \ fi ; fi ; done) @@ -2579,7 +2602,7 @@ log=`$(CHECKER) $(top_builddir)/testRegexp -i $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/regexp/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @echo "## Formal expresssions regression tests" @@ -2594,7 +2617,7 @@ log=`$(CHECKER) $(top_builddir)/testRegexp --expr -i $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/expr/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -2612,7 +2635,7 @@ log=`$(CHECKER) $(top_builddir)/testAutomata $$i 2>&1 > result.$$name ; \ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ diff $(srcdir)/result/automata/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done) @@ -2663,7 +2686,7 @@ cmdline="$$cmdline '`cat $(srcdir)/test/c14n/$$m/$$name.ns`'"; \ fi; \ fi; \ - $$cmdline > $(srcdir)/test/c14n/test.tmp; \ + $$cmdline > $(srcdir)/test/c14n/test.tmp 2> /dev/null; \ if [ $$? -eq 0 ]; then \ diff $(srcdir)/result/c14n/$$m/$$name $(srcdir)/test/c14n/test.tmp; \ if [ $$? -ne 0 ]; then \ @@ -2704,7 +2727,7 @@ diff $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno".err \ err.$$name;\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ;\ done; done) @@ -2729,7 +2752,7 @@ diff $(srcdir)/result/relaxng/"$$name"_err \ err.$$name | grep -v "error detected at";\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo schemas $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo schemas $$name result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi; \ for j in $(srcdir)/test/relaxng/"$$name"_*.xml ; do \ @@ -2751,7 +2774,7 @@ diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \ err.$$name | grep -v "error detected at";\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ; \ done; done) @@ -2777,7 +2800,7 @@ diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \ err.$$name | grep -v "error detected at";\ fi ; grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ; \ done; done) @@ -2806,7 +2829,7 @@ diff $(srcdir)/result/schematron/"$$name"_"$$xno".err \ err.$$name | grep -v "error detected at";\ grep Unimplemented err.$$name`; \ - if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \ rm res.$$name err.$$name ; \ fi ; fi ; \ done; done) @@ -2855,7 +2878,7 @@ grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0";\ done ;\ diff $(srcdir)/result/pattern/$$name result.$$name` ; \ - if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \ + if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \ rm result.$$name ; \ fi ; fi ; done ;)
diff --git a/third_party/libxml/src/buf.c b/third_party/libxml/src/buf.c index 07922ff..3b7601855 100644 --- a/third_party/libxml/src/buf.c +++ b/third_party/libxml/src/buf.c
@@ -231,7 +231,7 @@ xmlBufCreateStatic(void *mem, size_t size) { xmlBufPtr ret; - if ((mem == NULL) || (size == 0)) + if (mem == NULL) return(NULL); ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf));
diff --git a/third_party/libxml/src/elfgcchack.h b/third_party/libxml/src/elfgcchack.h index 1b81dcde..8c52884 100644 --- a/third_party/libxml/src/elfgcchack.h +++ b/third_party/libxml/src/elfgcchack.h
@@ -6547,16 +6547,6 @@ #endif #endif -#ifdef bottom_xmlIO -#undef xmlNoXxeExternalEntityLoader -extern __typeof (xmlNoXxeExternalEntityLoader) xmlNoXxeExternalEntityLoader __attribute((alias("xmlNoXxeExternalEntityLoader__internal_alias"))); -#else -#ifndef xmlNoXxeExternalEntityLoader -extern __typeof (xmlNoXxeExternalEntityLoader) xmlNoXxeExternalEntityLoader__internal_alias __attribute((visibility("hidden"))); -#define xmlNoXxeExternalEntityLoader xmlNoXxeExternalEntityLoader__internal_alias -#endif -#endif - #ifdef bottom_tree #undef xmlNodeAddContent extern __typeof (xmlNodeAddContent) xmlNodeAddContent __attribute((alias("xmlNodeAddContent__internal_alias")));
diff --git a/third_party/libxml/src/gentest.py b/third_party/libxml/src/gentest.py index f1786205..e4a8932 100755 --- a/third_party/libxml/src/gentest.py +++ b/third_party/libxml/src/gentest.py
@@ -782,6 +782,24 @@ test.write(" %s = gen_%s(n_%s, %d);\n" % (nam, type, nam, i)) i = i + 1; + # add checks to avoid out-of-bounds array access + i = 0; + for arg in t_args: + (nam, type, rtype, crtype, info) = arg; + # assume that "size", "len", and "start" parameters apply to either + # the nearest preceding or following char pointer + if type == "int" and (nam == "size" or nam == "len" or nam == "start"): + for j in range(i - 1, -1, -1) + range(i + 1, len(t_args)): + (bnam, btype) = t_args[j][:2] + if btype == "const_char_ptr" or btype == "const_xmlChar_ptr": + test.write( + " if ((%s != NULL) &&\n" + " (%s > (int) strlen((const char *) %s) + 1))\n" + " continue;\n" + % (bnam, nam, bnam)) + break + i = i + 1; + # do the call, and clanup the result if extra_pre_call.has_key(name): test.write(" %s\n"% (extra_pre_call[name]))
diff --git a/third_party/libxml/src/include/libxml/parser.h b/third_party/libxml/src/include/libxml/parser.h index 63ca1b9..47fbec0 100644 --- a/third_party/libxml/src/include/libxml/parser.h +++ b/third_party/libxml/src/include/libxml/parser.h
@@ -1111,8 +1111,7 @@ XML_PARSE_HUGE = 1<<19,/* relax any hardcoded limit from the parser */ XML_PARSE_OLDSAX = 1<<20,/* parse using SAX2 interface before 2.7.0 */ XML_PARSE_IGNORE_ENC= 1<<21,/* ignore internal document encoding hint */ - XML_PARSE_BIG_LINES = 1<<22,/* Store big lines numbers in text PSVI field */ - XML_PARSE_NOXXE = 1<<23 /* Forbid any external entity loading */ + XML_PARSE_BIG_LINES = 1<<22 /* Store big lines numbers in text PSVI field */ } xmlParserOption; XMLPUBFUN void XMLCALL
diff --git a/third_party/libxml/src/include/libxml/xmlIO.h b/third_party/libxml/src/include/libxml/xmlIO.h index 8d3fdef5..3e41744d 100644 --- a/third_party/libxml/src/include/libxml/xmlIO.h +++ b/third_party/libxml/src/include/libxml/xmlIO.h
@@ -300,14 +300,6 @@ xmlParserCtxtPtr ctxt); /* - * A predefined entity loader external entity expansion - */ -XMLPUBFUN xmlParserInputPtr XMLCALL - xmlNoXxeExternalEntityLoader (const char *URL, - const char *ID, - xmlParserCtxtPtr ctxt); - -/* * xmlNormalizeWindowsPath is obsolete, don't use it. * Check xmlCanonicPath in uri.h for a better alternative. */
diff --git a/third_party/libxml/src/include/libxml/xmlerror.h b/third_party/libxml/src/include/libxml/xmlerror.h index 3036062..037c16d5 100644 --- a/third_party/libxml/src/include/libxml/xmlerror.h +++ b/third_party/libxml/src/include/libxml/xmlerror.h
@@ -470,7 +470,6 @@ XML_IO_EADDRINUSE, /* 1554 */ XML_IO_EALREADY, /* 1555 */ XML_IO_EAFNOSUPPORT, /* 1556 */ - XML_IO_ILLEGAL_XXE, /* 1557 */ XML_XINCLUDE_RECURSION=1600, XML_XINCLUDE_PARSE_VALUE, /* 1601 */ XML_XINCLUDE_ENTITY_DEF_MISMATCH, /* 1602 */
diff --git a/third_party/libxml/src/libxml2.spec b/third_party/libxml/src/libxml2.spec index 5d45692..404a758 100644 --- a/third_party/libxml/src/libxml2.spec +++ b/third_party/libxml/src/libxml2.spec
@@ -194,6 +194,6 @@ %endif # with_python3 %changelog -* Mon Apr 10 2017 Daniel Veillard <veillard@redhat.com> +* Wed Jun 14 2017 Daniel Veillard <veillard@redhat.com> - upstream release 2.9.4 see http://xmlsoft.org/news.html
diff --git a/third_party/libxml/src/macos/src/XMLTestPrefix.h b/third_party/libxml/src/macos/src/XMLTestPrefix.h index 594c9b76..3e84255 100644 --- a/third_party/libxml/src/macos/src/XMLTestPrefix.h +++ b/third_party/libxml/src/macos/src/XMLTestPrefix.h Binary files differ
diff --git a/third_party/libxml/src/macos/src/XMLTestPrefix2.h b/third_party/libxml/src/macos/src/XMLTestPrefix2.h index 0431ed4..55df51e 100644 --- a/third_party/libxml/src/macos/src/XMLTestPrefix2.h +++ b/third_party/libxml/src/macos/src/XMLTestPrefix2.h Binary files differ
diff --git a/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp b/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp index b5d1feb..77d0c93 100644 --- a/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp +++ b/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp Binary files differ
diff --git a/third_party/libxml/src/macos/src/macos_main.c b/third_party/libxml/src/macos/src/macos_main.c index 4187dfc..2625000 100644 --- a/third_party/libxml/src/macos/src/macos_main.c +++ b/third_party/libxml/src/macos/src/macos_main.c Binary files differ
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c index e3f3fbd7..ac50643 100644 --- a/third_party/libxml/src/parser.c +++ b/third_party/libxml/src/parser.c
@@ -43,6 +43,7 @@ #include <limits.h> #include <string.h> #include <stdarg.h> +#include <stddef.h> #include <libxml/xmlmemory.h> #include <libxml/threads.h> #include <libxml/globals.h> @@ -1093,7 +1094,12 @@ struct _xmlDefAttrs { int nbAttrs; /* number of defaulted attributes on that element */ int maxAttrs; /* the size of the array */ - const xmlChar *values[5]; /* array of localname/prefix/values/external */ +#if __STDC_VERSION__ >= 199901L + /* Using a C99 flexible array member avoids UBSan errors. */ + const xmlChar *values[]; /* array of localname/prefix/values/external */ +#else + const xmlChar *values[5]; +#endif }; /** @@ -2121,7 +2127,6 @@ ctxt->input->line++; ctxt->input->col = 1; \ } else ctxt->input->col++; \ ctxt->input->cur += l; \ - if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt); \ } while (0) #define CUR_CHAR(l) xmlCurrentChar(ctxt, &l) @@ -3412,13 +3417,6 @@ len += l; NEXTL(l); c = CUR_CHAR(l); - if (c == 0) { - count = 0; - GROW; - if (ctxt->instate == XML_PARSER_EOF) - return(NULL); - c = CUR_CHAR(l); - } } } if ((len > XML_MAX_NAME_LENGTH) && @@ -3426,15 +3424,18 @@ xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name"); return(NULL); } - if (ctxt->input->cur > ctxt->input->base && (*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) { - if (ctxt->input->base > ctxt->input->cur - (len + 1)) { - return(NULL); - } + if (ctxt->input->cur - ctxt->input->base < len) { + /* + * There were a couple of bugs where PERefs lead to to a change + * of the buffer. Check the buffer size to avoid passing an invalid + * pointer to xmlDictLookup. + */ + xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, + "unexpected change of input buffer"); + return (NULL); + } + if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len)); - } - if (ctxt->input->base > ctxt->input->cur - len) { - return(NULL); - } return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len)); } @@ -5718,7 +5719,7 @@ } } if (ctxt->instate == XML_PARSER_EOF) - return; + goto done; SKIP_BLANKS; if (RAW != '>') { xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED, @@ -5749,17 +5750,17 @@ cur = xmlSAX2GetEntity(ctxt, name); } } - if (cur != NULL) { - if (cur->orig != NULL) - xmlFree(orig); - else - cur->orig = orig; - } else - xmlFree(orig); + if ((cur != NULL) && (cur->orig == NULL)) { + cur->orig = orig; + orig = NULL; + } } + +done: if (value != NULL) xmlFree(value); if (URI != NULL) xmlFree(URI); if (literal != NULL) xmlFree(literal); + if (orig != NULL) xmlFree(orig); } } @@ -6112,7 +6113,6 @@ SKIP_BLANKS; GROW; while ((RAW != '>') && (ctxt->instate != XML_PARSER_EOF)) { - const xmlChar *check = CUR_PTR; int type; int def; xmlChar *defaultValue = NULL; @@ -6172,15 +6172,6 @@ } SKIP_BLANKS; } - if (check == CUR_PTR) { - xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, - "in xmlParseAttributeListDecl\n"); - if (defaultValue != NULL) - xmlFree(defaultValue); - if (tree != NULL) - xmlFreeEnumeration(tree); - break; - } if ((ctxt->sax != NULL) && (!ctxt->disableSAX) && (ctxt->sax->attributeDecl != NULL)) ctxt->sax->attributeDecl(ctxt->userData, elemName, attrName, @@ -6285,7 +6276,7 @@ if (elem == NULL) { xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED, "xmlParseElementMixedContentDecl : Name expected\n"); - xmlFreeDocElementContent(ctxt->myDoc, cur); + xmlFreeDocElementContent(ctxt->myDoc, ret); return(NULL); } SKIP_BLANKS; @@ -8353,6 +8344,7 @@ entity = ctxt->sax->getParameterEntity(ctxt->userData, name); if (ctxt->instate == XML_PARSER_EOF) { xmlFree(name); + *str = ptr; return(NULL); } if (entity == NULL) { @@ -9410,8 +9402,7 @@ const xmlChar **atts = ctxt->atts; int maxatts = ctxt->maxatts; int nratts, nbatts, nbdef; - int i, j, nbNs, attval, oldline, oldcol, inputNr; - const xmlChar *base; + int i, j, nbNs, attval; unsigned long cur; int nsNr = ctxt->nsNr; @@ -9425,13 +9416,8 @@ * The Shrinking is only possible once the full set of attribute * callbacks have been done. */ -reparse: SHRINK; - base = ctxt->input->base; cur = ctxt->input->cur - ctxt->input->base; - inputNr = ctxt->inputNr; - oldline = ctxt->input->line; - oldcol = ctxt->input->col; nbatts = 0; nratts = 0; nbdef = 0; @@ -9455,8 +9441,6 @@ */ SKIP_BLANKS; GROW; - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) - goto base_changed; while (((RAW != '>') && ((RAW != '/') || (NXT(1) != '>')) && @@ -9467,203 +9451,174 @@ attname = xmlParseAttribute2(ctxt, prefix, localname, &aprefix, &attvalue, &len, &alloc); - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) { - if ((attvalue != NULL) && (alloc != 0)) - xmlFree(attvalue); - attvalue = NULL; - goto base_changed; - } - if ((attname != NULL) && (attvalue != NULL)) { - if (len < 0) len = xmlStrlen(attvalue); - if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { - const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); - xmlURIPtr uri; + if ((attname == NULL) || (attvalue == NULL)) + goto next_attr; + if (len < 0) len = xmlStrlen(attvalue); - if (URL == NULL) { - xmlErrMemory(ctxt, "dictionary allocation failure"); - if ((attvalue != NULL) && (alloc != 0)) - xmlFree(attvalue); - return(NULL); - } - if (*URL != 0) { - uri = xmlParseURI((const char *) URL); - if (uri == NULL) { - xmlNsErr(ctxt, XML_WAR_NS_URI, - "xmlns: '%s' is not a valid URI\n", - URL, NULL, NULL); - } else { - if (uri->scheme == NULL) { - xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, - "xmlns: URI %s is not absolute\n", - URL, NULL, NULL); - } - xmlFreeURI(uri); - } - if (URL == ctxt->str_xml_ns) { - if (attname != ctxt->str_xml) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "xml namespace URI cannot be the default namespace\n", - NULL, NULL, NULL); - } - goto skip_default_ns; - } - if ((len == 29) && - (xmlStrEqual(URL, - BAD_CAST "http://www.w3.org/2000/xmlns/"))) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "reuse of the xmlns namespace name is forbidden\n", - NULL, NULL, NULL); - goto skip_default_ns; - } - } - /* - * check that it's not a defined namespace - */ - for (j = 1;j <= nbNs;j++) - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) - break; - if (j <= nbNs) - xmlErrAttributeDup(ctxt, NULL, attname); - else - if (nsPush(ctxt, NULL, URL) > 0) nbNs++; -skip_default_ns: - if ((attvalue != NULL) && (alloc != 0)) { - xmlFree(attvalue); - attvalue = NULL; - } - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) - break; - if (!IS_BLANK_CH(RAW)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "attributes construct error\n"); - break; - } - SKIP_BLANKS; - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) - goto base_changed; - continue; - } - if (aprefix == ctxt->str_xmlns) { - const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); - xmlURIPtr uri; + if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) { + const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); + xmlURIPtr uri; - if (attname == ctxt->str_xml) { - if (URL != ctxt->str_xml_ns) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "xml namespace prefix mapped to wrong URI\n", - NULL, NULL, NULL); - } - /* - * Do not keep a namespace definition node - */ - goto skip_ns; - } + if (URL == NULL) { + xmlErrMemory(ctxt, "dictionary allocation failure"); + if ((attvalue != NULL) && (alloc != 0)) + xmlFree(attvalue); + return(NULL); + } + if (*URL != 0) { + uri = xmlParseURI((const char *) URL); + if (uri == NULL) { + xmlNsErr(ctxt, XML_WAR_NS_URI, + "xmlns: '%s' is not a valid URI\n", + URL, NULL, NULL); + } else { + if (uri->scheme == NULL) { + xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, + "xmlns: URI %s is not absolute\n", + URL, NULL, NULL); + } + xmlFreeURI(uri); + } if (URL == ctxt->str_xml_ns) { - if (attname != ctxt->str_xml) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "xml namespace URI mapped to wrong prefix\n", - NULL, NULL, NULL); - } - goto skip_ns; - } - if (attname == ctxt->str_xmlns) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "redefinition of the xmlns prefix is forbidden\n", - NULL, NULL, NULL); - goto skip_ns; - } - if ((len == 29) && - (xmlStrEqual(URL, - BAD_CAST "http://www.w3.org/2000/xmlns/"))) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "reuse of the xmlns namespace name is forbidden\n", - NULL, NULL, NULL); - goto skip_ns; - } - if ((URL == NULL) || (URL[0] == 0)) { - xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, - "xmlns:%s: Empty XML namespace is not allowed\n", - attname, NULL, NULL); - goto skip_ns; - } else { - uri = xmlParseURI((const char *) URL); - if (uri == NULL) { - xmlNsErr(ctxt, XML_WAR_NS_URI, - "xmlns:%s: '%s' is not a valid URI\n", - attname, URL, NULL); - } else { - if ((ctxt->pedantic) && (uri->scheme == NULL)) { - xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, - "xmlns:%s: URI %s is not absolute\n", - attname, URL, NULL); - } - xmlFreeURI(uri); - } - } + if (attname != ctxt->str_xml) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "xml namespace URI cannot be the default namespace\n", + NULL, NULL, NULL); + } + goto next_attr; + } + if ((len == 29) && + (xmlStrEqual(URL, + BAD_CAST "http://www.w3.org/2000/xmlns/"))) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "reuse of the xmlns namespace name is forbidden\n", + NULL, NULL, NULL); + goto next_attr; + } + } + /* + * check that it's not a defined namespace + */ + for (j = 1;j <= nbNs;j++) + if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL) + break; + if (j <= nbNs) + xmlErrAttributeDup(ctxt, NULL, attname); + else + if (nsPush(ctxt, NULL, URL) > 0) nbNs++; - /* - * check that it's not a defined namespace - */ - for (j = 1;j <= nbNs;j++) - if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) - break; - if (j <= nbNs) - xmlErrAttributeDup(ctxt, aprefix, attname); - else - if (nsPush(ctxt, attname, URL) > 0) nbNs++; -skip_ns: - if ((attvalue != NULL) && (alloc != 0)) { - xmlFree(attvalue); - attvalue = NULL; - } - if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) - break; - if (!IS_BLANK_CH(RAW)) { - xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, - "attributes construct error\n"); - break; - } - SKIP_BLANKS; - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) - goto base_changed; - continue; - } + } else if (aprefix == ctxt->str_xmlns) { + const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len); + xmlURIPtr uri; - /* - * Add the pair to atts - */ - if ((atts == NULL) || (nbatts + 5 > maxatts)) { - if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { - if (attvalue[len] == 0) - xmlFree(attvalue); - goto failed; - } - maxatts = ctxt->maxatts; - atts = ctxt->atts; - } - ctxt->attallocs[nratts++] = alloc; - atts[nbatts++] = attname; - atts[nbatts++] = aprefix; - atts[nbatts++] = NULL; /* the URI will be fetched later */ - atts[nbatts++] = attvalue; - attvalue += len; - atts[nbatts++] = attvalue; - /* - * tag if some deallocation is needed - */ - if (alloc != 0) attval = 1; - } else { - if ((attvalue != NULL) && (attvalue[len] == 0)) - xmlFree(attvalue); - } + if (attname == ctxt->str_xml) { + if (URL != ctxt->str_xml_ns) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "xml namespace prefix mapped to wrong URI\n", + NULL, NULL, NULL); + } + /* + * Do not keep a namespace definition node + */ + goto next_attr; + } + if (URL == ctxt->str_xml_ns) { + if (attname != ctxt->str_xml) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "xml namespace URI mapped to wrong prefix\n", + NULL, NULL, NULL); + } + goto next_attr; + } + if (attname == ctxt->str_xmlns) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "redefinition of the xmlns prefix is forbidden\n", + NULL, NULL, NULL); + goto next_attr; + } + if ((len == 29) && + (xmlStrEqual(URL, + BAD_CAST "http://www.w3.org/2000/xmlns/"))) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "reuse of the xmlns namespace name is forbidden\n", + NULL, NULL, NULL); + goto next_attr; + } + if ((URL == NULL) || (URL[0] == 0)) { + xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE, + "xmlns:%s: Empty XML namespace is not allowed\n", + attname, NULL, NULL); + goto next_attr; + } else { + uri = xmlParseURI((const char *) URL); + if (uri == NULL) { + xmlNsErr(ctxt, XML_WAR_NS_URI, + "xmlns:%s: '%s' is not a valid URI\n", + attname, URL, NULL); + } else { + if ((ctxt->pedantic) && (uri->scheme == NULL)) { + xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE, + "xmlns:%s: URI %s is not absolute\n", + attname, URL, NULL); + } + xmlFreeURI(uri); + } + } -failed: + /* + * check that it's not a defined namespace + */ + for (j = 1;j <= nbNs;j++) + if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname) + break; + if (j <= nbNs) + xmlErrAttributeDup(ctxt, aprefix, attname); + else + if (nsPush(ctxt, attname, URL) > 0) nbNs++; + + } else { + /* + * Add the pair to atts + */ + if ((atts == NULL) || (nbatts + 5 > maxatts)) { + if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) { + goto next_attr; + } + maxatts = ctxt->maxatts; + atts = ctxt->atts; + } + ctxt->attallocs[nratts++] = alloc; + atts[nbatts++] = attname; + atts[nbatts++] = aprefix; + /* + * The namespace URI field is used temporarily to point at the + * base of the current input buffer for non-alloced attributes. + * When the input buffer is reallocated, all the pointers become + * invalid, but they can be reconstructed later. + */ + if (alloc) + atts[nbatts++] = NULL; + else + atts[nbatts++] = ctxt->input->base; + atts[nbatts++] = attvalue; + attvalue += len; + atts[nbatts++] = attvalue; + /* + * tag if some deallocation is needed + */ + if (alloc != 0) attval = 1; + attvalue = NULL; /* moved into atts */ + } + +next_attr: + if ((attvalue != NULL) && (alloc != 0)) { + xmlFree(attvalue); + attvalue = NULL; + } GROW if (ctxt->instate == XML_PARSER_EOF) break; - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) - goto base_changed; if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>')))) break; if (!IS_BLANK_CH(RAW)) { @@ -9679,8 +9634,20 @@ break; } GROW; - if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) - goto base_changed; + } + + /* Reconstruct attribute value pointers. */ + for (i = 0, j = 0; j < nratts; i += 5, j++) { + if (atts[i+2] != NULL) { + /* + * Arithmetic on dangling pointers is technically undefined + * behavior, but well... + */ + ptrdiff_t offset = ctxt->input->base - atts[i+2]; + atts[i+2] = NULL; /* Reset repurposed namespace URI */ + atts[i+3] += offset; /* value */ + atts[i+4] += offset; /* valuend */ + } } /* @@ -9837,34 +9804,6 @@ } return(localname); - -base_changed: - /* - * the attribute strings are valid iif the base didn't changed - */ - if (attval != 0) { - for (i = 3,j = 0; j < nratts;i += 5,j++) - if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL)) - xmlFree((xmlChar *) atts[i]); - } - - /* - * We can't switch from one entity to another in the middle - * of a start tag - */ - if (inputNr != ctxt->inputNr) { - xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY, - "Start tag doesn't start and stop in the same entity\n"); - return(NULL); - } - - ctxt->input->cur = ctxt->input->base + cur; - ctxt->input->line = oldline; - ctxt->input->col = oldcol; - if (ctxt->wellFormed == 1) { - goto reparse; - } - return(NULL); } /** @@ -15383,10 +15322,6 @@ ctxt->options |= XML_PARSE_NONET; options -= XML_PARSE_NONET; } - if (options & XML_PARSE_NOXXE) { - ctxt->options |= XML_PARSE_NOXXE; - options -= XML_PARSE_NOXXE; - } if (options & XML_PARSE_COMPACT) { ctxt->options |= XML_PARSE_COMPACT; options -= XML_PARSE_COMPACT;
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c index 286fdce..475d35b 100644 --- a/third_party/libxml/src/parserInternals.c +++ b/third_party/libxml/src/parserInternals.c
@@ -710,16 +710,6 @@ return((int) *ctxt->input->cur); encoding_error: /* - * An encoding problem may arise from a truncated input buffer - * splitting a character in the middle. In that case do not raise - * an error but return 0 to endicate an end of stream problem - */ - if (ctxt->input->end - ctxt->input->cur < 4) { - *len = 0; - return(0); - } - - /* * If we detect an UTF8 error that probably mean that the * input encoding didn't get properly advertised in the * declaration header. Report the error and switch the encoding @@ -729,9 +719,21 @@ { char buffer[150]; - snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); + if (ctxt->input->cur[1] == 0) { + snprintf(&buffer[0], 149, "Bytes: 0x%02X EOF\n", + ctxt->input->cur[0]); + } else if (ctxt->input->cur[2] == 0) { + snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X EOF\n", + ctxt->input->cur[0], ctxt->input->cur[1]); + } else if (ctxt->input->cur[3] == 0) { + snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X EOF\n", + ctxt->input->cur[0], ctxt->input->cur[1], + ctxt->input->cur[2]); + } else { + snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + ctxt->input->cur[0], ctxt->input->cur[1], + ctxt->input->cur[2], ctxt->input->cur[3]); + } __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, "Input is not proper UTF-8, indicate encoding !\n%s", BAD_CAST buffer, NULL); @@ -821,17 +823,6 @@ *len = 1; return ((int) *cur); encoding_error: - - /* - * An encoding problem may arise from a truncated input buffer - * splitting a character in the middle. In that case do not raise - * an error but return 0 to endicate an end of stream problem - */ - if ((ctxt == NULL) || (ctxt->input == NULL) || - (ctxt->input->end - ctxt->input->cur < 4)) { - *len = 0; - return(0); - } /* * If we detect an UTF8 error that probably mean that the * input encoding didn't get properly advertised in the @@ -842,9 +833,19 @@ { char buffer[150]; - snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", - ctxt->input->cur[0], ctxt->input->cur[1], - ctxt->input->cur[2], ctxt->input->cur[3]); + if (cur[1] == 0) { + snprintf(&buffer[0], 149, "Bytes: 0x%02X EOF\n", + cur[0]); + } else if (cur[2] == 0) { + snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X EOF\n", + cur[0], cur[1]); + } else if (cur[3] == 0) { + snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X EOF\n", + cur[0], cur[1], cur[2]); + } else { + snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n", + cur[0], cur[1], cur[2], cur[3]); + } __xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR, "Input is not proper UTF-8, indicate encoding !\n%s", BAD_CAST buffer, NULL); @@ -1101,8 +1102,15 @@ break; } } - if (handler == NULL) + /* + * TODO: We could recover from errors in external entites if we + * didn't stop the parser. But most callers of this function don't + * check the return value. + */ + if (handler == NULL) { + xmlStopParser(ctxt); return(-1); + } ctxt->charset = XML_CHAR_ENCODING_UTF8; ret = xmlSwitchToEncodingInt(ctxt, handler, len); if ((ret < 0) || (ctxt->errNo == XML_I18N_CONV_FAILED)) { @@ -1226,6 +1234,7 @@ */ nbchars = xmlCharEncFirstLineInput(input->buf, len); } + xmlBufResetInput(input->buf->buffer, input); if (nbchars < 0) { xmlErrInternal(ctxt, "switching encoding: encoder error\n", @@ -1233,7 +1242,6 @@ return (-1); } input->buf->rawconsumed += use - xmlBufUse(input->buf->raw); - xmlBufResetInput(input->buf->buffer, input); } return (0); } else if (input->length == 0) {
diff --git a/third_party/libxml/src/pattern.c b/third_party/libxml/src/pattern.c index 33dee3aa..0eb8d81 100644 --- a/third_party/libxml/src/pattern.c +++ b/third_party/libxml/src/pattern.c
@@ -969,6 +969,7 @@ ERROR5(NULL, NULL, NULL, "xmlCompileAttributeTest : no namespace bound to prefix %s\n", prefix); + XML_PAT_FREE_STRING(ctxt, prefix); ctxt->error = 1; goto error; }
diff --git a/third_party/libxml/src/runtest.c b/third_party/libxml/src/runtest.c index b2ce693..dcf1405d 100644 --- a/third_party/libxml/src/runtest.c +++ b/third_party/libxml/src/runtest.c
@@ -1854,6 +1854,7 @@ const char *base; int size, res; int cur = 0; + int chunkSize = 4; nb_tests++; /* @@ -1864,17 +1865,21 @@ return(-1); } + if (chunkSize > size) + chunkSize = size; + #ifdef LIBXML_HTML_ENABLED if (options & XML_PARSE_HTML) - ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename, + ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, chunkSize, filename, XML_CHAR_ENCODING_NONE); else #endif - ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename); + ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, chunkSize, filename); xmlCtxtUseOptions(ctxt, options); - cur += 4; + cur += chunkSize; + chunkSize = 1024; do { - if (cur + 1024 >= size) { + if (cur + chunkSize >= size) { #ifdef LIBXML_HTML_ENABLED if (options & XML_PARSE_HTML) htmlParseChunk(ctxt, base + cur, size - cur, 1); @@ -1885,11 +1890,11 @@ } else { #ifdef LIBXML_HTML_ENABLED if (options & XML_PARSE_HTML) - htmlParseChunk(ctxt, base + cur, 1024, 0); + htmlParseChunk(ctxt, base + cur, chunkSize, 0); else #endif - xmlParseChunk(ctxt, base + cur, 1024, 0); - cur += 1024; + xmlParseChunk(ctxt, base + cur, chunkSize, 0); + cur += chunkSize; } } while (cur < size); doc = ctxt->myDoc; @@ -4214,6 +4219,9 @@ { "Error cases regression tests", errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err", 0 }, + { "Error cases regression tests (old 1.0)", + errParseTest, "./test/errors10/*.xml", "result/errors10/", "", ".err", + XML_PARSE_OLD10 }, #ifdef LIBXML_READER_ENABLED { "Error cases stream regression tests", streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str",
diff --git a/third_party/libxml/src/testapi.c b/third_party/libxml/src/testapi.c index 60f4bdd..b2f6e46b 100644 --- a/third_party/libxml/src/testapi.c +++ b/third_party/libxml/src/testapi.c
@@ -1480,6 +1480,9 @@ mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = htmlCreateMemoryParserCtxt((const char *)buffer, size); desret_htmlParserCtxtPtr(ret_val); @@ -1547,6 +1550,9 @@ size = gen_int(n_size, 3); filename = gen_fileoutput(n_filename, 4); enc = gen_xmlCharEncoding(n_enc, 5); + if ((chunk != NULL) && + (size > (int) strlen((const char *) chunk) + 1)) + continue; ret_val = htmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename, enc); desret_htmlParserCtxtPtr(ret_val); @@ -1721,6 +1727,9 @@ URL = gen_filepath(n_URL, 3); encoding = gen_const_char_ptr(n_encoding, 4); options = gen_int(n_options, 5); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = htmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options); desret_htmlDocPtr(ret_val); @@ -2278,6 +2287,9 @@ chunk = gen_const_char_ptr(n_chunk, 1); size = gen_int(n_size, 2); terminate = gen_int(n_terminate, 3); + if ((chunk != NULL) && + (size > (int) strlen((const char *) chunk) + 1)) + continue; ret_val = htmlParseChunk(ctxt, (const char *)chunk, size, terminate); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} @@ -2621,6 +2633,9 @@ URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_int(n_options, 4); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = htmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options); desret_htmlDocPtr(ret_val); @@ -3870,6 +3885,9 @@ ctx = gen_void_ptr(n_ctx, 0); value = gen_const_xmlChar_ptr(n_value, 1); len = gen_int(n_len, 2); + if ((value != NULL) && + (len > (int) strlen((const char *) value) + 1)) + continue; xmlSAX2CDataBlock(ctx, (const xmlChar *)value, len); call_tests++; @@ -3914,6 +3932,9 @@ ctx = gen_void_ptr(n_ctx, 0); ch = gen_const_xmlChar_ptr(n_ch, 1); len = gen_int(n_len, 2); + if ((ch != NULL) && + (len > (int) strlen((const char *) ch) + 1)) + continue; xmlSAX2Characters(ctx, (const xmlChar *)ch, len); call_tests++; @@ -4554,6 +4575,9 @@ ctx = gen_void_ptr(n_ctx, 0); ch = gen_const_xmlChar_ptr(n_ch, 1); len = gen_int(n_len, 2); + if ((ch != NULL) && + (len > (int) strlen((const char *) ch) + 1)) + continue; xmlSAX2IgnorableWhitespace(ctx, (const xmlChar *)ch, len); call_tests++; @@ -8221,6 +8245,9 @@ dict = gen_xmlDictPtr(n_dict, 0); name = gen_const_xmlChar_ptr(n_name, 1); len = gen_int(n_len, 2); + if ((name != NULL) && + (len > (int) strlen((const char *) name) + 1)) + continue; ret_val = xmlDictExists(dict, (const xmlChar *)name, len); desret_const_xmlChar_ptr(ret_val); @@ -8277,6 +8304,9 @@ dict = gen_xmlDictPtr(n_dict, 0); name = gen_const_xmlChar_ptr(n_name, 1); len = gen_int(n_len, 2); + if ((name != NULL) && + (len > (int) strlen((const char *) name) + 1)) + continue; ret_val = xmlDictLookup(dict, (const xmlChar *)name, len); desret_const_xmlChar_ptr(ret_val); @@ -12727,6 +12757,9 @@ chunk = gen_const_char_ptr(n_chunk, 2); size = gen_int(n_size, 3); filename = gen_fileoutput(n_filename, 4); + if ((chunk != NULL) && + (size > (int) strlen((const char *) chunk) + 1)) + continue; ret_val = xmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename); desret_xmlParserCtxtPtr(ret_val); @@ -12905,6 +12938,9 @@ URL = gen_filepath(n_URL, 3); encoding = gen_const_char_ptr(n_encoding, 4); options = gen_parseroptions(n_options, 5); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options); desret_xmlDocPtr(ret_val); @@ -12998,6 +13034,9 @@ size = gen_int(n_size, 2); filename = gen_filepath(n_filename, 3); encoding = gen_const_char_ptr(n_encoding, 4); + if ((chunk != NULL) && + (size > (int) strlen((const char *) chunk) + 1)) + continue; ret_val = xmlCtxtResetPush(ctxt, (const char *)chunk, size, filename, (const char *)encoding); desret_int(ret_val); @@ -13709,6 +13748,9 @@ chunk = gen_const_char_ptr(n_chunk, 1); size = gen_int(n_size, 2); terminate = gen_int(n_terminate, 3); + if ((chunk != NULL) && + (size > (int) strlen((const char *) chunk) + 1)) + continue; ret_val = xmlParseChunk(ctxt, (const char *)chunk, size, terminate); if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} @@ -14166,6 +14208,9 @@ mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlParseMemory((const char *)buffer, size); desret_xmlDocPtr(ret_val); @@ -14578,6 +14623,9 @@ URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options); desret_xmlDocPtr(ret_val); @@ -14700,6 +14748,9 @@ mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlRecoverMemory((const char *)buffer, size); desret_xmlDocPtr(ret_val); @@ -15001,6 +15052,9 @@ buffer = gen_const_char_ptr(n_buffer, 1); size = gen_int(n_size, 2); recovery = gen_int(n_recovery, 3); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlSAXParseMemory(sax, (const char *)buffer, size, recovery); desret_xmlDocPtr(ret_val); @@ -15062,6 +15116,9 @@ size = gen_int(n_size, 2); recovery = gen_int(n_recovery, 3); data = gen_userdata(n_data, 4); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlSAXParseMemoryWithData(sax, (const char *)buffer, size, recovery, data); desret_xmlDocPtr(ret_val); @@ -15177,6 +15234,9 @@ user_data = gen_userdata(n_user_data, 1); buffer = gen_const_char_ptr(n_buffer, 2); size = gen_int(n_size, 3); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; #ifdef LIBXML_SAX1_ENABLED if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL; @@ -15948,6 +16008,9 @@ mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlCreateMemoryParserCtxt((const char *)buffer, size); desret_xmlParserCtxtPtr(ret_val); @@ -16603,6 +16666,9 @@ end = gen_xmlChar(n_end, 4); end2 = gen_xmlChar(n_end2, 5); end3 = gen_xmlChar(n_end3, 6); + if ((str != NULL) && + (len > (int) strlen((const char *) str) + 1)) + continue; ret_val = xmlStringLenDecodeEntities(ctxt, (const xmlChar *)str, len, what, end, end2, end3); desret_xmlChar_ptr(ret_val); @@ -17573,6 +17639,9 @@ mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlRelaxNGNewMemParserCtxt((const char *)buffer, size); desret_xmlRelaxNGParserCtxtPtr(ret_val); @@ -17849,6 +17918,9 @@ ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0); data = gen_const_xmlChar_ptr(n_data, 1); len = gen_int(n_len, 2); + if ((data != NULL) && + (len > (int) strlen((const char *) data) + 1)) + continue; ret_val = xmlRelaxNGValidatePushCData(ctxt, (const xmlChar *)data, len); desret_int(ret_val); @@ -18591,6 +18663,9 @@ buf = gen_xmlBufferPtr(n_buf, 0); str = gen_const_xmlChar_ptr(n_str, 1); len = gen_int(n_len, 2); + if ((str != NULL) && + (len > (int) strlen((const char *) str) + 1)) + continue; ret_val = xmlBufferAdd(buf, (const xmlChar *)str, len); desret_int(ret_val); @@ -18637,6 +18712,9 @@ buf = gen_xmlBufferPtr(n_buf, 0); str = gen_const_xmlChar_ptr(n_str, 1); len = gen_int(n_len, 2); + if ((str != NULL) && + (len > (int) strlen((const char *) str) + 1)) + continue; ret_val = xmlBufferAddHead(buf, (const xmlChar *)str, len); desret_int(ret_val); @@ -19209,6 +19287,9 @@ prefix = gen_const_xmlChar_ptr(n_prefix, 1); memory = gen_xmlChar_ptr(n_memory, 2); len = gen_int(n_len, 3); + if ((prefix != NULL) && + (len > (int) strlen((const char *) prefix) + 1)) + continue; ret_val = xmlBuildQName((const xmlChar *)ncname, (const xmlChar *)prefix, memory, len); if ((ret_val != NULL) && (ret_val != ncname) && @@ -20980,6 +21061,9 @@ doc = gen_xmlDocPtr(n_doc, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; ret_val = xmlNewCDataBlock(doc, (const xmlChar *)content, len); desret_xmlNodePtr(ret_val); @@ -21553,6 +21637,9 @@ doc = gen_xmlDocPtr(n_doc, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; ret_val = xmlNewDocTextLen(doc, (const xmlChar *)content, len); desret_xmlNodePtr(ret_val); @@ -22096,6 +22183,9 @@ mem_base = xmlMemBlocks(); content = gen_const_xmlChar_ptr(n_content, 0); len = gen_int(n_len, 1); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; ret_val = xmlNewTextLen((const xmlChar *)content, len); desret_xmlNodePtr(ret_val); @@ -22209,6 +22299,9 @@ cur = gen_xmlNodePtr(n_cur, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; xmlNodeAddContentLen(cur, (const xmlChar *)content, len); call_tests++; @@ -22759,6 +22852,9 @@ cur = gen_xmlNodePtr(n_cur, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; xmlNodeSetContentLen(cur, (const xmlChar *)content, len); call_tests++; @@ -23823,6 +23919,9 @@ doc = gen_const_xmlDoc_ptr(n_doc, 0); value = gen_const_xmlChar_ptr(n_value, 1); len = gen_int(n_len, 2); + if ((value != NULL) && + (len > (int) strlen((const char *) value) + 1)) + continue; ret_val = xmlStringLenGetNodeList((const xmlDoc *)doc, (const xmlChar *)value, len); desret_xmlNodePtr(ret_val); @@ -23869,6 +23968,9 @@ node = gen_xmlNodePtr(n_node, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; ret_val = xmlTextConcat(node, (const xmlChar *)content, len); desret_int(ret_val); @@ -27125,6 +27227,9 @@ ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0); data = gen_const_xmlChar_ptr(n_data, 1); len = gen_int(n_len, 2); + if ((data != NULL) && + (len > (int) strlen((const char *) data) + 1)) + continue; ret_val = xmlValidatePushCData(ctxt, (const xmlChar *)data, len); desret_int(ret_val); @@ -28661,6 +28766,9 @@ out = gen_xmlOutputBufferPtr(n_out, 0); len = gen_int(n_len, 1); buf = gen_const_char_ptr(n_buf, 2); + if ((buf != NULL) && + (len > (int) strlen((const char *) buf) + 1)) + continue; ret_val = xmlOutputBufferWrite(out, len, (const char *)buf); desret_int(ret_val); @@ -28887,6 +28995,9 @@ mem = gen_const_char_ptr(n_mem, 0); size = gen_int(n_size, 1); enc = gen_xmlCharEncoding(n_enc, 2); + if ((mem != NULL) && + (size > (int) strlen((const char *) mem) + 1)) + continue; ret_val = xmlParserInputBufferCreateMem((const char *)mem, size, enc); desret_xmlParserInputBufferPtr(ret_val); @@ -28933,6 +29044,9 @@ mem = gen_const_char_ptr(n_mem, 0); size = gen_int(n_size, 1); enc = gen_xmlCharEncoding(n_enc, 2); + if ((mem != NULL) && + (size > (int) strlen((const char *) mem) + 1)) + continue; ret_val = xmlParserInputBufferCreateStatic((const char *)mem, size, enc); desret_xmlParserInputBufferPtr(ret_val); @@ -29018,6 +29132,9 @@ in = gen_xmlParserInputBufferPtr(n_in, 0); len = gen_int(n_len, 1); buf = gen_const_char_ptr(n_buf, 2); + if ((buf != NULL) && + (len > (int) strlen((const char *) buf) + 1)) + continue; ret_val = xmlParserInputBufferPush(in, len, (const char *)buf); desret_int(ret_val); @@ -30200,6 +30317,9 @@ URL = gen_filepath(n_URL, 2); encoding = gen_const_char_ptr(n_encoding, 3); options = gen_parseroptions(n_options, 4); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlReaderForMemory((const char *)buffer, size, URL, (const char *)encoding, options); desret_xmlTextReaderPtr(ret_val); @@ -30383,6 +30503,9 @@ URL = gen_filepath(n_URL, 3); encoding = gen_const_char_ptr(n_encoding, 4); options = gen_parseroptions(n_options, 5); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlReaderNewMemory(reader, (const char *)buffer, size, URL, (const char *)encoding, options); desret_int(ret_val); @@ -34420,6 +34543,9 @@ mem_base = xmlMemBlocks(); buffer = gen_const_char_ptr(n_buffer, 0); size = gen_int(n_size, 1); + if ((buffer != NULL) && + (size > (int) strlen((const char *) buffer) + 1)) + continue; ret_val = xmlSchemaNewMemParserCtxt((const char *)buffer, size); desret_xmlSchemaParserCtxtPtr(ret_val); @@ -36304,6 +36430,9 @@ mem_base = xmlMemBlocks(); cur = gen_const_char_ptr(n_cur, 0); len = gen_int(n_len, 1); + if ((cur != NULL) && + (len > (int) strlen((const char *) cur) + 1)) + continue; ret_val = xmlCharStrndup((const char *)cur, len); desret_xmlChar_ptr(ret_val); @@ -36743,6 +36872,9 @@ str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); len = gen_int(n_len, 2); + if ((str2 != NULL) && + (len > (int) strlen((const char *) str2) + 1)) + continue; ret_val = xmlStrncasecmp((const xmlChar *)str1, (const xmlChar *)str2, len); desret_int(ret_val); @@ -36789,6 +36921,9 @@ str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); len = gen_int(n_len, 2); + if ((str2 != NULL) && + (len > (int) strlen((const char *) str2) + 1)) + continue; ret_val = xmlStrncatNew((const xmlChar *)str1, (const xmlChar *)str2, len); desret_xmlChar_ptr(ret_val); @@ -36835,6 +36970,9 @@ str1 = gen_const_xmlChar_ptr(n_str1, 0); str2 = gen_const_xmlChar_ptr(n_str2, 1); len = gen_int(n_len, 2); + if ((str2 != NULL) && + (len > (int) strlen((const char *) str2) + 1)) + continue; ret_val = xmlStrncmp((const xmlChar *)str1, (const xmlChar *)str2, len); desret_int(ret_val); @@ -36877,6 +37015,9 @@ mem_base = xmlMemBlocks(); cur = gen_const_xmlChar_ptr(n_cur, 0); len = gen_int(n_len, 1); + if ((cur != NULL) && + (len > (int) strlen((const char *) cur) + 1)) + continue; ret_val = xmlStrndup((const xmlChar *)cur, len); desret_xmlChar_ptr(ret_val); @@ -36959,6 +37100,12 @@ str = gen_const_xmlChar_ptr(n_str, 0); start = gen_int(n_start, 1); len = gen_int(n_len, 2); + if ((str != NULL) && + (start > (int) strlen((const char *) str) + 1)) + continue; + if ((str != NULL) && + (len > (int) strlen((const char *) str) + 1)) + continue; ret_val = xmlStrsub((const xmlChar *)str, start, len); desret_xmlChar_ptr(ret_val); @@ -37143,6 +37290,9 @@ mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); len = gen_int(n_len, 1); + if ((utf != NULL) && + (len > (int) strlen((const char *) utf) + 1)) + continue; ret_val = xmlUTF8Strndup((const xmlChar *)utf, len); desret_xmlChar_ptr(ret_val); @@ -37221,6 +37371,9 @@ mem_base = xmlMemBlocks(); utf = gen_const_xmlChar_ptr(n_utf, 0); len = gen_int(n_len, 1); + if ((utf != NULL) && + (len > (int) strlen((const char *) utf) + 1)) + continue; ret_val = xmlUTF8Strsize((const xmlChar *)utf, len); desret_int(ret_val); @@ -37264,6 +37417,12 @@ utf = gen_const_xmlChar_ptr(n_utf, 0); start = gen_int(n_start, 1); len = gen_int(n_len, 2); + if ((utf != NULL) && + (start > (int) strlen((const char *) utf) + 1)) + continue; + if ((utf != NULL) && + (len > (int) strlen((const char *) utf) + 1)) + continue; ret_val = xmlUTF8Strsub((const xmlChar *)utf, start, len); desret_xmlChar_ptr(ret_val); @@ -44576,6 +44735,12 @@ data = gen_const_char_ptr(n_data, 1); start = gen_int(n_start, 2); len = gen_int(n_len, 3); + if ((data != NULL) && + (start > (int) strlen((const char *) data) + 1)) + continue; + if ((data != NULL) && + (len > (int) strlen((const char *) data) + 1)) + continue; ret_val = xmlTextWriterWriteBase64(writer, (const char *)data, start, len); desret_int(ret_val); @@ -44631,6 +44796,12 @@ data = gen_const_char_ptr(n_data, 1); start = gen_int(n_start, 2); len = gen_int(n_len, 3); + if ((data != NULL) && + (start > (int) strlen((const char *) data) + 1)) + continue; + if ((data != NULL) && + (len > (int) strlen((const char *) data) + 1)) + continue; ret_val = xmlTextWriterWriteBinHex(writer, (const char *)data, start, len); desret_int(ret_val); @@ -45561,6 +45732,9 @@ writer = gen_xmlTextWriterPtr(n_writer, 0); content = gen_const_xmlChar_ptr(n_content, 1); len = gen_int(n_len, 2); + if ((content != NULL) && + (len > (int) strlen((const char *) content) + 1)) + continue; ret_val = xmlTextWriterWriteRawLen(writer, (const xmlChar *)content, len); desret_int(ret_val);
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c index 9d330b8..e154ec0 100644 --- a/third_party/libxml/src/tree.c +++ b/third_party/libxml/src/tree.c
@@ -1401,6 +1401,8 @@ else if ((ent != NULL) && (ent->children == NULL)) { xmlNodePtr temp; + /* Set to non-NULL value to avoid recursion. */ + ent->children = (xmlNodePtr) -1; ent->children = xmlStringGetNodeList(doc, (const xmlChar*)node->content); ent->owner = 1; @@ -1593,6 +1595,7 @@ else if ((ent != NULL) && (ent->children == NULL)) { xmlNodePtr temp; + /* Set to non-NULL value to avoid recursion. */ ent->children = (xmlNodePtr) -1; ent->children = xmlStringGetNodeList(doc, (const xmlChar*)node->content); @@ -1600,6 +1603,7 @@ temp = ent->children; while (temp) { temp->parent = (xmlNodePtr)ent; + ent->last = temp; temp = temp->next; } }
diff --git a/third_party/libxml/src/uri.c b/third_party/libxml/src/uri.c index 4b24b13..a56c2c7f 100644 --- a/third_party/libxml/src/uri.c +++ b/third_party/libxml/src/uri.c
@@ -12,7 +12,6 @@ #include "libxml.h" #include <string.h> -#include <limits.h> #include <libxml/xmlmemory.h> #include <libxml/uri.h> @@ -2164,7 +2163,6 @@ xmlChar *val = NULL; int ret; int ix; - int pos = 0; int nbslash = 0; int len; xmlURIPtr ref = NULL; @@ -2255,19 +2253,22 @@ uptr = NULL; len = 1; /* this is for a string terminator only */ } else { - /* - * Next we compare the two strings and find where they first differ - */ - if ((ref->path[pos] == '.') && (ref->path[pos+1] == '/')) - pos += 2; + xmlChar *rptr = (xmlChar *) ref->path; + int pos = 0; + + /* + * Next we compare the two strings and find where they first differ + */ + if ((*rptr == '.') && (rptr[1] == '/')) + rptr += 2; if ((*bptr == '.') && (bptr[1] == '/')) bptr += 2; - else if ((*bptr == '/') && (ref->path[pos] != '/')) + else if ((*bptr == '/') && (*rptr != '/')) bptr++; - while ((bptr[pos] == ref->path[pos]) && (bptr[pos] != 0)) + while ((bptr[pos] == rptr[pos]) && (bptr[pos] != 0)) pos++; - if (bptr[pos] == ref->path[pos]) { + if (bptr[pos] == rptr[pos]) { val = xmlStrdup(BAD_CAST ""); goto done; /* (I can't imagine why anyone would do this) */ } @@ -2277,25 +2278,25 @@ * beginning of the "unique" suffix of URI */ ix = pos; - if ((ref->path[ix] == '/') && (ix > 0)) + if ((rptr[ix] == '/') && (ix > 0)) ix--; - else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/')) + else if ((rptr[ix] == 0) && (ix > 1) && (rptr[ix - 1] == '/')) ix -= 2; for (; ix > 0; ix--) { - if (ref->path[ix] == '/') + if (rptr[ix] == '/') break; } if (ix == 0) { - uptr = (xmlChar *)ref->path; + uptr = (xmlChar *)rptr; } else { ix++; - uptr = (xmlChar *)&ref->path[ix]; + uptr = (xmlChar *)&rptr[ix]; } /* * In base, count the number of '/' from the differing point */ - if (bptr[pos] != ref->path[pos]) {/* check for trivial URI == base */ + if (bptr[pos] != rptr[pos]) {/* check for trivial URI == base */ for (; bptr[ix] != 0; ix++) { if (bptr[ix] == '/') nbslash++; @@ -2456,6 +2457,7 @@ xmlFreeURI(uri); return escURI; } + xmlFree(escURI); } }
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c index 26d7221..c51ea29 100644 --- a/third_party/libxml/src/valid.c +++ b/third_party/libxml/src/valid.c
@@ -1172,33 +1172,33 @@ xmlBufferWriteCHAR(buf, content->name); break; case XML_ELEMENT_CONTENT_SEQ: - if (content->c1 == NULL) return; - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) + if ((content->c1 != NULL) && + ((content->c1->type == XML_ELEMENT_CONTENT_OR) || + (content->c1->type == XML_ELEMENT_CONTENT_SEQ))) xmlDumpElementContent(buf, content->c1, 1); else xmlDumpElementContent(buf, content->c1, 0); xmlBufferWriteChar(buf, " , "); - if (content->c2 == NULL) return; - if ((content->c2->type == XML_ELEMENT_CONTENT_OR) || - ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) + if ((content->c2 != NULL) && + ((content->c2->type == XML_ELEMENT_CONTENT_OR) || + ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) && + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))) xmlDumpElementContent(buf, content->c2, 1); else xmlDumpElementContent(buf, content->c2, 0); break; case XML_ELEMENT_CONTENT_OR: - if (content->c1 == NULL) return; - if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || - (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) + if ((content->c1 != NULL) && + ((content->c1->type == XML_ELEMENT_CONTENT_OR) || + (content->c1->type == XML_ELEMENT_CONTENT_SEQ))) xmlDumpElementContent(buf, content->c1, 1); else xmlDumpElementContent(buf, content->c1, 0); xmlBufferWriteChar(buf, " | "); - if (content->c2 == NULL) return; - if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || - ((content->c2->type == XML_ELEMENT_CONTENT_OR) && - (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))) + if ((content->c2 != NULL) && + ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) || + ((content->c2->type == XML_ELEMENT_CONTENT_OR) && + (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))) xmlDumpElementContent(buf, content->c2, 1); else xmlDumpElementContent(buf, content->c2, 0); @@ -1266,22 +1266,23 @@ case XML_ELEMENT_CONTENT_PCDATA: strcat(buf, "#PCDATA"); break; - case XML_ELEMENT_CONTENT_ELEMENT: - if (content->prefix != NULL) { - if (size - len < xmlStrlen(content->prefix) + 10) { - strcat(buf, " ..."); - return; - } - strcat(buf, (char *) content->prefix); - strcat(buf, ":"); - } - if (size - len < xmlStrlen(content->name) + 10) { + case XML_ELEMENT_CONTENT_ELEMENT: { + int qnameLen = xmlStrlen(content->name); + + if (content->prefix != NULL) + qnameLen += xmlStrlen(content->prefix) + 1; + if (size - len < qnameLen + 10) { strcat(buf, " ..."); return; } + if (content->prefix != NULL) { + strcat(buf, (char *) content->prefix); + strcat(buf, ":"); + } if (content->name != NULL) strcat(buf, (char *) content->name); break; + } case XML_ELEMENT_CONTENT_SEQ: if ((content->c1->type == XML_ELEMENT_CONTENT_OR) || (content->c1->type == XML_ELEMENT_CONTENT_SEQ)) @@ -1323,6 +1324,7 @@ xmlSnprintfElementContent(buf, size, content->c2, 0); break; } + if (size - strlen(buf) <= 2) return; if (englob) strcat(buf, ")"); switch (content->ocur) { @@ -4625,6 +4627,12 @@ } } + /* + * Casting ns to xmlAttrPtr is wrong. We'd need separate functions + * xmlAddID and xmlAddRef for namespace declarations, but it makes + * no practical sense to use ID types anyway. + */ +#if 0 /* Validity Constraint: ID uniqueness */ if (attrDecl->atype == XML_ATTRIBUTE_ID) { if (xmlAddID(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) @@ -4636,6 +4644,7 @@ if (xmlAddRef(ctxt, doc, value, (xmlAttrPtr) ns) == NULL) ret = 0; } +#endif /* Validity Constraint: Notation Attributes */ if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) {
diff --git a/third_party/libxml/src/win32/VC10/README.vc10 b/third_party/libxml/src/win32/VC10/README.vc10 index f7826b0..4805bdc8 100644 --- a/third_party/libxml/src/win32/VC10/README.vc10 +++ b/third_party/libxml/src/win32/VC10/README.vc10
@@ -1,27 +1,27 @@ - -README file for VC10 project files for libxml2 ----------------------------------------------- - -to clarify: This is not the readme file for the whole libxml2 project. -Rather, it's a readme for the VC10 project files, attached to the libxml2 proejct. - -Quick Start ------------ - -1) To use, load the libxml2.sln solution file into visual studio -2) check and correct paths for dependent "iconv" project which most certaily -are wrong on your environment. -3) Compile all projects - - -Background Info ---------------- - -Running of "configure.sh" won't make sense since VS doesn't support -this kind of build system and the environment is pretty much known already -if you're using Visual Studio. Instead, a preconfigured "config.h" file -is provided in the "win32\VC10" directory and referenced by the project -files already. - -The compile process is not completely warning-free: Some warnings will -appear during compile which can be ignored. + +README file for VC10 project files for libxml2 +---------------------------------------------- + +to clarify: This is not the readme file for the whole libxml2 project. +Rather, it's a readme for the VC10 project files, attached to the libxml2 proejct. + +Quick Start +----------- + +1) To use, load the libxml2.sln solution file into visual studio +2) check and correct paths for dependent "iconv" project which most certaily +are wrong on your environment. +3) Compile all projects + + +Background Info +--------------- + +Running of "configure.sh" won't make sense since VS doesn't support +this kind of build system and the environment is pretty much known already +if you're using Visual Studio. Instead, a preconfigured "config.h" file +is provided in the "win32\VC10" directory and referenced by the project +files already. + +The compile process is not completely warning-free: Some warnings will +appear during compile which can be ignored.
diff --git a/third_party/libxml/src/win32/VC10/RuleSet1.ruleset b/third_party/libxml/src/win32/VC10/RuleSet1.ruleset index 84f383f..9985a6c6 100644 --- a/third_party/libxml/src/win32/VC10/RuleSet1.ruleset +++ b/third_party/libxml/src/win32/VC10/RuleSet1.ruleset
@@ -1,3 +1,3 @@ -<?xml version="1.0" encoding="utf-8"?> -<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0"> +<?xml version="1.0" encoding="utf-8"?> +<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0"> </RuleSet> \ No newline at end of file
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c index e6256128..8c6509dd 100644 --- a/third_party/libxml/src/xmlIO.c +++ b/third_party/libxml/src/xmlIO.c
@@ -210,7 +210,6 @@ "adddress in use", /* EADDRINUSE */ "already in use", /* EALREADY */ "unknown address familly", /* EAFNOSUPPORT */ - "Attempt to load external entity %s", /* XML_IO_ILLEGAL_XXE */ }; #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) @@ -3028,7 +3027,7 @@ xmlParserInputBufferPtr ret; int errcode; - if (size <= 0) return(NULL); + if (size < 0) return(NULL); if (mem == NULL) return(NULL); ret = xmlAllocParserInputBuffer(enc); @@ -3064,7 +3063,7 @@ xmlCharEncoding enc) { xmlParserInputBufferPtr ret; - if (size <= 0) return(NULL); + if (size < 0) return(NULL); if (mem == NULL) return(NULL); ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); @@ -4054,22 +4053,13 @@ xmlGenericError(xmlGenericErrorContext, "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL); #endif - if (ctxt != NULL) { + if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) { int options = ctxt->options; - if (options & XML_PARSE_NOXXE) { - ctxt->options -= XML_PARSE_NOXXE; - ret = xmlNoXxeExternalEntityLoader(URL, ID, ctxt); - ctxt->options = options; - return(ret); - } - - if (options & XML_PARSE_NONET) { - ctxt->options -= XML_PARSE_NONET; - ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); - ctxt->options = options; - return(ret); - } + ctxt->options -= XML_PARSE_NONET; + ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); + ctxt->options = options; + return(ret); } #ifdef LIBXML_CATALOG_ENABLED resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); @@ -4170,13 +4160,6 @@ xmlParserInputPtr input = NULL; xmlChar *resource = NULL; - if (ctxt == NULL) { - return(NULL); - } - if (ctxt->input_id == 1) { - return xmlDefaultExternalEntityLoader((const char *) URL, ID, ctxt); - } - #ifdef LIBXML_CATALOG_ENABLED resource = xmlResolveResourceFromCatalog(URL, ID, ctxt); #endif @@ -4199,18 +4182,5 @@ return(input); } -xmlParserInputPtr -xmlNoXxeExternalEntityLoader(const char *URL, const char *ID, - xmlParserCtxtPtr ctxt) { - if (ctxt == NULL) { - return(NULL); - } - if (ctxt->input_id == 1) { - return xmlDefaultExternalEntityLoader((const char *) URL, ID, ctxt); - } - xmlIOErr(XML_IO_ILLEGAL_XXE, (const char *) URL); - return(NULL); -} - #define bottom_xmlIO #include "elfgcchack.h"
diff --git a/third_party/libxml/src/xmlmemory.c b/third_party/libxml/src/xmlmemory.c index f08c8c3..58de2eda 100644 --- a/third_party/libxml/src/xmlmemory.c +++ b/third_party/libxml/src/xmlmemory.c
@@ -172,6 +172,13 @@ TEST_POINT + if (size > (MAX_SIZE_T - RESERVE_SIZE)) { + xmlGenericError(xmlGenericErrorContext, + "xmlMallocLoc : Unsigned overflow\n"); + xmlMemoryDump(); + return(NULL); + } + p = (MEMHDR *) malloc(RESERVE_SIZE+size); if (!p) { @@ -243,7 +250,7 @@ if (size > (MAX_SIZE_T - RESERVE_SIZE)) { xmlGenericError(xmlGenericErrorContext, - "xmlMallocAtomicLoc : Unsigned overflow prevented\n"); + "xmlMallocAtomicLoc : Unsigned overflow\n"); xmlMemoryDump(); return(NULL); } @@ -352,6 +359,13 @@ #endif xmlMutexUnlock(xmlMemMutex); + if (size > (MAX_SIZE_T - RESERVE_SIZE)) { + xmlGenericError(xmlGenericErrorContext, + "xmlReallocLoc : Unsigned overflow\n"); + xmlMemoryDump(); + return(NULL); + } + tmp = (MEMHDR *) realloc(p,RESERVE_SIZE+size); if (!tmp) { free(p); @@ -499,6 +513,13 @@ if (!xmlMemInitialized) xmlInitMemory(); TEST_POINT + if (size > (MAX_SIZE_T - RESERVE_SIZE)) { + xmlGenericError(xmlGenericErrorContext, + "xmlMemStrdupLoc : Unsigned overflow\n"); + xmlMemoryDump(); + return(NULL); + } + p = (MEMHDR *) malloc(RESERVE_SIZE+size); if (!p) { goto error;
diff --git a/third_party/libxml/src/xmlsave.c b/third_party/libxml/src/xmlsave.c index 4a8e3f3..fea135ff 100644 --- a/third_party/libxml/src/xmlsave.c +++ b/third_party/libxml/src/xmlsave.c
@@ -2109,8 +2109,6 @@ xmlBufAdd(buf, base, cur - base); if (*cur < 0xC0) { xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL); - if (doc != NULL) - doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); xmlSerializeHexCharRef(tmp, *cur); xmlBufAdd(buf, (xmlChar *) tmp, -1); cur++; @@ -2140,9 +2138,6 @@ } if ((l == 1) || (!IS_CHAR(val))) { xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL); - if (doc != NULL) - doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1"); - xmlSerializeHexCharRef(tmp, *cur); xmlBufAdd(buf, (xmlChar *) tmp, -1); cur++;
diff --git a/third_party/libxml/src/xpath.c b/third_party/libxml/src/xpath.c index 38f4bd1..92dbb97 100644 --- a/third_party/libxml/src/xpath.c +++ b/third_party/libxml/src/xpath.c
@@ -17,6 +17,7 @@ #define IN_LIBXML #include "libxml.h" +#include <limits.h> #include <string.h> #ifdef HAVE_SYS_TYPES_H @@ -3105,7 +3106,8 @@ snprintf(buffer, buffersize, "NaN"); } else if (number == 0 && xmlXPathGetSign(number) != 0) { snprintf(buffer, buffersize, "0"); - } else if (number == ((int) number)) { + } else if ((number > INT_MIN) && (number < INT_MAX) && + (number == (int) number)) { char work[30]; char *ptr, *cur; int value = (int) number; @@ -4021,13 +4023,7 @@ set1->nodeTab = temp; set1->nodeMax *= 2; } - if (n2->type == XML_NAMESPACE_DECL) { - xmlNsPtr ns = (xmlNsPtr) n2; - - set1->nodeTab[set1->nodeNr++] = - xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns); - } else - set1->nodeTab[set1->nodeNr++] = n2; + set1->nodeTab[set1->nodeNr++] = n2; skip_node: {} } @@ -4196,33 +4192,6 @@ } /** - * xmlXPathNodeSetClear: - * @set: the node set to clear - * - * Clears the list from all temporary XPath objects (e.g. namespace nodes - * are feed), but does *not* free the list itself. Sets the length of the - * list to 0. - */ -static void -xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) -{ - if ((set == NULL) || (set->nodeNr <= 0)) - return; - else if (hasNsNodes) { - int i; - xmlNodePtr node; - - for (i = 0; i < set->nodeNr; i++) { - node = set->nodeTab[i]; - if ((node != NULL) && - (node->type == XML_NAMESPACE_DECL)) - xmlXPathNodeSetFreeNs((xmlNsPtr) node); - } - } - set->nodeNr = 0; -} - -/** * xmlXPathNodeSetClearFromPos: * @set: the node set to be cleared * @pos: the start position to clear from @@ -4234,7 +4203,7 @@ static void xmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes) { - if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr)) + if ((set == NULL) || (pos >= set->nodeNr)) return; else if ((hasNsNodes)) { int i; @@ -4251,6 +4220,46 @@ } /** + * xmlXPathNodeSetClear: + * @set: the node set to clear + * + * Clears the list from all temporary XPath objects (e.g. namespace nodes + * are feed), but does *not* free the list itself. Sets the length of the + * list to 0. + */ +static void +xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes) +{ + xmlXPathNodeSetClearFromPos(set, 0, hasNsNodes); +} + +/** + * xmlXPathNodeSetKeepLast: + * @set: the node set to be cleared + * + * Move the last node to the first position and clear temporary XPath objects + * (e.g. namespace nodes) from all other nodes. Sets the length of the list + * to 1. + */ +static void +xmlXPathNodeSetKeepLast(xmlNodeSetPtr set) +{ + int i; + xmlNodePtr node; + + if ((set == NULL) || (set->nodeNr <= 1)) + return; + for (i = 0; i < set->nodeNr - 1; i++) { + node = set->nodeTab[i]; + if ((node != NULL) && + (node->type == XML_NAMESPACE_DECL)) + xmlXPathNodeSetFreeNs((xmlNsPtr) node); + } + set->nodeTab[0] = set->nodeTab[set->nodeNr-1]; + set->nodeNr = 1; +} + +/** * xmlXPathFreeValueTree: * @obj: the xmlNodeSetPtr to free * @@ -6289,7 +6298,15 @@ */ void xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) { + int i; + if (ctxt->valueTab != NULL) { + for (i = 0; i < ctxt->valueNr; i++) { + if (ctxt->context) + xmlXPathReleaseObject(ctxt->context, ctxt->valueTab[i]); + else + xmlXPathFreeObject(ctxt->valueTab[i]); + } xmlFree(ctxt->valueTab); } if (ctxt->comp != NULL) { @@ -6702,7 +6719,13 @@ valuePush(ctxt, val); return(xmlXPathCompareValues(ctxt, inf, strict)); default: - TODO + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompareNodeSetValue: Can't compare node set " + "and object of type %d\n", + val->type); + xmlXPathReleaseObject(ctxt->context, arg); + xmlXPathReleaseObject(ctxt->context, val); + XP_ERROR0(XPATH_INVALID_TYPE); } return(0); } @@ -8114,12 +8137,12 @@ return(NULL); return(cur->parent); case XML_ATTRIBUTE_NODE: { - xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node; + xmlAttrPtr att = (xmlAttrPtr) cur; return(att->parent); } case XML_NAMESPACE_DECL: { - xmlNsPtr ns = (xmlNsPtr) ctxt->context->node; + xmlNsPtr ns = (xmlNsPtr) cur; if ((ns->next != NULL) && (ns->next->type != XML_NAMESPACE_DECL)) @@ -8236,10 +8259,16 @@ if (cur == NULL) { cur = ctxt->context->node; - if (cur->type == XML_NAMESPACE_DECL) - return(NULL); - if (cur->type == XML_ATTRIBUTE_NODE) + if (cur->type == XML_ATTRIBUTE_NODE) { cur = cur->parent; + } else if (cur->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) cur; + + if ((ns->next == NULL) || + (ns->next->type == XML_NAMESPACE_DECL)) + return (NULL); + cur = (xmlNodePtr) ns->next; + } } if (cur == NULL) return(NULL) ; /* ERROR */ if (cur->next != NULL) return(cur->next) ; @@ -8300,10 +8329,16 @@ if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL); if (cur == NULL) { cur = ctxt->context->node; - if (cur->type == XML_NAMESPACE_DECL) - return(NULL); - if (cur->type == XML_ATTRIBUTE_NODE) - return(cur->parent); + if (cur->type == XML_ATTRIBUTE_NODE) { + cur = cur->parent; + } else if (cur->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) cur; + + if ((ns->next == NULL) || + (ns->next->type == XML_NAMESPACE_DECL)) + return (NULL); + cur = (xmlNodePtr) ns->next; + } } if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL)) return (NULL); @@ -8348,8 +8383,16 @@ cur = ctxt->context->node; if (cur == NULL) return (NULL); - if (cur->type == XML_NAMESPACE_DECL) - return (NULL); + if (cur->type == XML_ATTRIBUTE_NODE) { + cur = cur->parent; + } else if (cur->type == XML_NAMESPACE_DECL) { + xmlNsPtr ns = (xmlNsPtr) cur; + + if ((ns->next == NULL) || + (ns->next->type == XML_NAMESPACE_DECL)) + return (NULL); + cur = (xmlNodePtr) ns->next; + } ctxt->ancestor = cur->parent; } if (cur->type == XML_NAMESPACE_DECL) @@ -9634,18 +9677,6 @@ xmlXPathReleaseObject(ctxt->context, cur); } -/* - * To assure working code on multiple platforms, we want to only depend - * upon the characteristic truncation of converting a floating point value - * to an integer. Unfortunately, because of the different storage sizes - * of our internal floating point value (double) and integer (int), we - * can't directly convert (see bug 301162). This macro is a messy - * 'workaround' - */ -#define XTRUNC(f, v) \ - f = fmod((v), INT_MAX); \ - f = (v) - (f) + (double)((int)(f)); - /** * xmlXPathFloorFunction: * @ctxt: the XPath Parser context @@ -9658,19 +9689,11 @@ */ void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) { - double f; - CHECK_ARITY(1); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); - XTRUNC(f, ctxt->value->floatval); - if (f != ctxt->value->floatval) { - if (ctxt->value->floatval > 0) - ctxt->value->floatval = f; - else - ctxt->value->floatval = f - 1; - } + ctxt->value->floatval = floor(ctxt->value->floatval); } /** @@ -9685,28 +9708,11 @@ */ void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) { - double f; - CHECK_ARITY(1); CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); -#if 0 ctxt->value->floatval = ceil(ctxt->value->floatval); -#else - XTRUNC(f, ctxt->value->floatval); - if (f != ctxt->value->floatval) { - if (ctxt->value->floatval > 0) - ctxt->value->floatval = f + 1; - else { - if (ctxt->value->floatval < 0 && f == 0) - ctxt->value->floatval = xmlXPathNZERO; - else - ctxt->value->floatval = f; - } - - } -#endif } /** @@ -9718,7 +9724,7 @@ * number round(number) * The round function returns the number that is closest to the * argument and that is an integer. If there are two such numbers, - * then the one that is even is returned. + * then the one that is closest to positive infinity is returned. */ void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) { @@ -9728,25 +9734,21 @@ CAST_TO_NUMBER; CHECK_TYPE(XPATH_NUMBER); - if ((xmlXPathIsNaN(ctxt->value->floatval)) || - (xmlXPathIsInf(ctxt->value->floatval) == 1) || - (xmlXPathIsInf(ctxt->value->floatval) == -1) || - (ctxt->value->floatval == 0.0)) + f = ctxt->value->floatval; + + /* Test for zero to keep negative zero unchanged. */ + if ((xmlXPathIsNaN(f)) || (f == 0.0)) return; - XTRUNC(f, ctxt->value->floatval); - if (ctxt->value->floatval < 0) { - if (ctxt->value->floatval < f - 0.5) - ctxt->value->floatval = f - 1; - else - ctxt->value->floatval = f; - if (ctxt->value->floatval == 0) - ctxt->value->floatval = xmlXPathNZERO; - } else { - if (ctxt->value->floatval < f + 0.5) - ctxt->value->floatval = f; - else - ctxt->value->floatval = f + 1; + if ((f >= -0.5) && (f < 0.0)) { + /* Negative zero. */ + ctxt->value->floatval = xmlXPathNZERO; + } + else { + double rounded = floor(f); + if (f - rounded >= 0.5) + rounded += 1.0; + ctxt->value->floatval = rounded; } } @@ -10056,20 +10058,6 @@ #define MAX_FRAC 20 -/* - * These are used as divisors for the fractional part of a number. - * Since the table includes 1.0 (representing '0' fractional digits), - * it must be dimensioned at MAX_FRAC+1 (bug 133921) - */ -static double my_pow10[MAX_FRAC+1] = { - 1.0, 10.0, 100.0, 1000.0, 10000.0, - 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, - 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, - 100000000000000.0, - 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, - 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0 -}; - /** * xmlXPathStringEvalNumber: * @str: A string to scan @@ -10132,20 +10120,25 @@ #endif if (*cur == '.') { - int v, frac = 0; + int v, frac = 0, max; double fraction = 0; cur++; if (((*cur < '0') || (*cur > '9')) && (!ok)) { return(xmlXPathNAN); } - while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) { + while (*cur == '0') { + frac = frac + 1; + cur++; + } + max = frac + MAX_FRAC; + while (((*cur >= '0') && (*cur <= '9')) && (frac < max)) { v = (*cur - '0'); fraction = fraction * 10 + v; frac = frac + 1; cur++; } - fraction /= my_pow10[frac]; + fraction /= pow(10.0, frac); ret = ret + fraction; while ((*cur >= '0') && (*cur <= '9')) cur++; @@ -10159,7 +10152,8 @@ cur++; } while ((*cur >= '0') && (*cur <= '9')) { - exponent = exponent * 10 + (*cur - '0'); + if (exponent < 1000000) + exponent = exponent * 10 + (*cur - '0'); cur++; } } @@ -10221,20 +10215,25 @@ } #endif if (CUR == '.') { - int v, frac = 0; + int v, frac = 0, max; double fraction = 0; NEXT; if (((CUR < '0') || (CUR > '9')) && (!ok)) { XP_ERROR(XPATH_NUMBER_ERROR); } - while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) { + while (CUR == '0') { + frac = frac + 1; + NEXT; + } + max = frac + MAX_FRAC; + while ((CUR >= '0') && (CUR <= '9') && (frac < max)) { v = (CUR - '0'); fraction = fraction * 10 + v; frac = frac + 1; NEXT; } - fraction /= my_pow10[frac]; + fraction /= pow(10.0, frac); ret = ret + fraction; while ((CUR >= '0') && (CUR <= '9')) NEXT; @@ -10248,7 +10247,8 @@ NEXT; } while ((CUR >= '0') && (CUR <= '9')) { - exponent = exponent * 10 + (CUR - '0'); + if (exponent < 1000000) + exponent = exponent * 10 + (CUR - '0'); NEXT; } if (is_exponent_negative) @@ -10379,6 +10379,7 @@ NEXT; name = xmlXPathParseQName(ctxt, &prefix); if (name == NULL) { + xmlFree(prefix); XP_ERROR(XPATH_VARIABLE_REF_ERROR); } ctxt->comp->last = -1; @@ -10452,6 +10453,8 @@ #endif if (CUR != '(') { + xmlFree(name); + xmlFree(prefix); XP_ERROR(XPATH_EXPR_ERROR); } NEXT; @@ -10480,6 +10483,8 @@ nbargs++; if (CUR == ')') break; if (CUR != ',') { + xmlFree(name); + xmlFree(prefix); XP_ERROR(XPATH_EXPR_ERROR); } NEXT; @@ -12054,6 +12059,8 @@ (exprOp->value4 != NULL) && (((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER)) { + double floatval = ((xmlXPathObjectPtr) exprOp->value4)->floatval; + /* * We have a "[n]" predicate here. * TODO: Unfortunately this simplistic test here is not @@ -12064,13 +12071,12 @@ * like it "[position() < 5]", is also not detected. * Maybe we could rewrite the AST to ease the optimization. */ - *maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval; - if (((xmlXPathObjectPtr) exprOp->value4)->floatval == - (float) *maxPos) - { - return(1); - } + if ((floatval > INT_MIN) && (floatval < INT_MAX)) { + *maxPos = (int) floatval; + if (floatval == (double) *maxPos) + return(1); + } } return(0); } @@ -12772,11 +12778,15 @@ xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2], first); CHECK_ERROR0; - CHECK_TYPE0(XPATH_NODESET); - arg2 = valuePop(ctxt); - CHECK_TYPE0(XPATH_NODESET); + arg2 = valuePop(ctxt); arg1 = valuePop(ctxt); + if ((arg1 == NULL) || (arg1->type != XPATH_NODESET) || + (arg2 == NULL) || (arg2->type != XPATH_NODESET)) { + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_TYPE); + } arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, arg2->nodesetval); @@ -12907,11 +12917,15 @@ && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */ } - CHECK_TYPE0(XPATH_NODESET); - arg2 = valuePop(ctxt); - CHECK_TYPE0(XPATH_NODESET); + arg2 = valuePop(ctxt); arg1 = valuePop(ctxt); + if ((arg1 == NULL) || (arg1->type != XPATH_NODESET) || + (arg2 == NULL) || (arg2->type != XPATH_NODESET)) { + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_TYPE); + } arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval, arg2->nodesetval); @@ -13022,13 +13036,7 @@ (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeTab != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) { - ctxt->value->nodesetval->nodeTab[0] = - ctxt->value->nodesetval->nodeTab[ctxt-> - value-> - nodesetval-> - nodeNr - - 1]; - ctxt->value->nodesetval->nodeNr = 1; + xmlXPathNodeSetKeepLast(ctxt->value->nodesetval); *first = *(ctxt->value->nodesetval->nodeTab); } return (total); @@ -13445,11 +13453,15 @@ ctxt->context->contextSize = cs; total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]); CHECK_ERROR0; - CHECK_TYPE0(XPATH_NODESET); - arg2 = valuePop(ctxt); - CHECK_TYPE0(XPATH_NODESET); + arg2 = valuePop(ctxt); arg1 = valuePop(ctxt); + if ((arg1 == NULL) || (arg1->type != XPATH_NODESET) || + (arg2 == NULL) || (arg2->type != XPATH_NODESET)) { + xmlXPathReleaseObject(ctxt->context, arg1); + xmlXPathReleaseObject(ctxt->context, arg2); + XP_ERROR0(XPATH_INVALID_TYPE); + } if ((arg1->nodesetval == NULL) || ((arg2->nodesetval != NULL) && @@ -13677,7 +13689,8 @@ (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeNr > 1)) - ctxt->value->nodesetval->nodeNr = 1; + xmlXPathNodeSetClearFromPos(ctxt->value->nodesetval, + 1, 1); return (total); } } @@ -13711,15 +13724,8 @@ (ctxt->value->type == XPATH_NODESET) && (ctxt->value->nodesetval != NULL) && (ctxt->value->nodesetval->nodeTab != NULL) && - (ctxt->value->nodesetval->nodeNr > 1)) { - ctxt->value->nodesetval->nodeTab[0] = - ctxt->value->nodesetval->nodeTab[ctxt-> - value-> - nodesetval-> - nodeNr - - 1]; - ctxt->value->nodesetval->nodeNr = 1; - } + (ctxt->value->nodesetval->nodeNr > 1)) + xmlXPathNodeSetKeepLast(ctxt->value->nodesetval); return (total); } } @@ -14908,10 +14914,11 @@ static int xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp, xmlXPathContextPtr ctxt, - xmlXPathObjectPtr *resObj, + xmlXPathObjectPtr *resObjPtr, int toBool) { xmlXPathParserContextPtr pctxt; + xmlXPathObjectPtr resObj; #ifndef LIBXML_THREAD_ENABLED static int reentance = 0; #endif @@ -14939,43 +14946,26 @@ pctxt = xmlXPathCompParserContext(comp, ctxt); res = xmlXPathRunEval(pctxt, toBool); - if (resObj) { - if (pctxt->value == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompiledEval: evaluation failed\n"); - *resObj = NULL; - } else { - *resObj = valuePop(pctxt); - } + if (pctxt->error != XPATH_EXPRESSION_OK) { + resObj = NULL; + } else { + resObj = valuePop(pctxt); + if (resObj == NULL) { + if (!toBool) + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompiledEval: No result on the stack.\n"); + } else if (pctxt->valueNr > 0) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompiledEval: %d object(s) left on the stack.\n", + pctxt->valueNr); + } } - /* - * Pop all remaining objects from the stack. - */ - if (pctxt->valueNr > 0) { - xmlXPathObjectPtr tmp; - int stack = 0; + if (resObjPtr) + *resObjPtr = resObj; + else + xmlXPathReleaseObject(ctxt, resObj); - do { - tmp = valuePop(pctxt); - if (tmp != NULL) { - stack++; - xmlXPathReleaseObject(ctxt, tmp); - } - } while (tmp != NULL); - if ((stack != 0) && - ((toBool) || ((resObj) && (*resObj)))) - { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathCompiledEval: %d objects left on the stack.\n", - stack); - } - } - - if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) { - xmlXPathFreeObject(*resObj); - *resObj = NULL; - } pctxt->comp = NULL; xmlXPathFreeParserContext(pctxt); #ifndef LIBXML_THREAD_ENABLED @@ -15043,22 +15033,21 @@ if (ctxt->comp != NULL) xmlXPathFreeCompExpr(ctxt->comp); ctxt->comp = comp; - if (ctxt->cur != NULL) - while (*ctxt->cur != 0) ctxt->cur++; } else #endif { xmlXPathCompileExpr(ctxt, 1); - if ((ctxt->error == XPATH_EXPRESSION_OK) && - (ctxt->comp != NULL) && - (ctxt->comp->nbStep > 1) && - (ctxt->comp->last >= 0)) - { + CHECK_ERROR; + + /* Check for trailing characters. */ + if (*ctxt->cur != 0) + XP_ERROR(XPATH_EXPR_ERROR); + + if ((ctxt->comp->nbStep > 1) && (ctxt->comp->last >= 0)) xmlXPathOptimizeExpression(ctxt->comp, &ctxt->comp->steps[ctxt->comp->last]); - } } - CHECK_ERROR; + xmlXPathRunEval(ctxt, 0); } @@ -15075,8 +15064,7 @@ xmlXPathObjectPtr xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) { xmlXPathParserContextPtr ctxt; - xmlXPathObjectPtr res, tmp, init = NULL; - int stack = 0; + xmlXPathObjectPtr res; CHECK_CTXT(ctx) @@ -15087,37 +15075,18 @@ return NULL; xmlXPathEvalExpr(ctxt); - if (ctxt->value == NULL) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathEval: evaluation failed\n"); - res = NULL; - } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL) -#ifdef XPATH_STREAMING - && (ctxt->comp->stream == NULL) -#endif - ) { - xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); + if (ctxt->error != XPATH_EXPRESSION_OK) { res = NULL; } else { res = valuePop(ctxt); - } - - do { - tmp = valuePop(ctxt); - if (tmp != NULL) { - if (tmp != init) - stack++; - xmlXPathReleaseObject(ctx, tmp); + if (res == NULL) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompiledEval: No result on the stack.\n"); + } else if (ctxt->valueNr > 0) { + xmlGenericError(xmlGenericErrorContext, + "xmlXPathCompiledEval: %d object(s) left on the stack.\n", + ctxt->valueNr); } - } while (tmp != NULL); - if ((stack != 0) && (res != NULL)) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathEval: %d object left on the stack\n", - stack); - } - if (ctxt->error != XPATH_EXPRESSION_OK) { - xmlXPathFreeObject(res); - res = NULL; } xmlXPathFreeParserContext(ctxt); @@ -15172,46 +15141,11 @@ * @str: the XPath expression * @ctxt: the XPath context * - * Evaluate the XPath expression in the given context. - * - * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL. - * the caller has to free the object. + * Alias for xmlXPathEval. */ xmlXPathObjectPtr xmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) { - xmlXPathParserContextPtr pctxt; - xmlXPathObjectPtr res, tmp; - int stack = 0; - - CHECK_CTXT(ctxt) - - xmlXPathInit(); - - pctxt = xmlXPathNewParserContext(str, ctxt); - if (pctxt == NULL) - return NULL; - xmlXPathEvalExpr(pctxt); - - if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) { - xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR); - res = NULL; - } else { - res = valuePop(pctxt); - } - do { - tmp = valuePop(pctxt); - if (tmp != NULL) { - xmlXPathReleaseObject(ctxt, tmp); - stack++; - } - } while (tmp != NULL); - if ((stack != 0) && (res != NULL)) { - xmlGenericError(xmlGenericErrorContext, - "xmlXPathEvalExpression: %d object left on the stack\n", - stack); - } - xmlXPathFreeParserContext(pctxt); - return(res); + return(xmlXPathEval(str, ctxt)); } /************************************************************************
diff --git a/third_party/libxml/win32/include/libxml/xmlversion.h b/third_party/libxml/win32/include/libxml/xmlversion.h index ef885be..b2436d7 100644 --- a/third_party/libxml/win32/include/libxml/xmlversion.h +++ b/third_party/libxml/win32/include/libxml/xmlversion.h
@@ -1,489 +1,489 @@ -/* - * Summary: compile-time version informations - * Description: compile-time version informations for the XML library - * - * Copy: See Copyright for the status of this software. - * - * Author: Daniel Veillard - */ - -#ifndef __XML_VERSION_H__ -#define __XML_VERSION_H__ - -#include <libxml/xmlexports.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * use those to be sure nothing nasty will happen if - * your library and includes mismatch - */ -#ifndef LIBXML2_COMPILING_MSCCDEF -XMLPUBFUN void XMLCALL xmlCheckVersion(int version); -#endif /* LIBXML2_COMPILING_MSCCDEF */ - -/** - * LIBXML_DOTTED_VERSION: - * - * the version string like "1.2.3" - */ -#define LIBXML_DOTTED_VERSION "2.9.4" - -/** - * LIBXML_VERSION: - * - * the version number: 1.2.3 value is 10203 - */ -#define LIBXML_VERSION 20904 - -/** - * LIBXML_VERSION_STRING: - * - * the version number string, 1.2.3 value is "10203" - */ -#define LIBXML_VERSION_STRING "20904" - -/** - * LIBXML_VERSION_EXTRA: - * - * extra version information, used to show a CVS compilation - */ -#define LIBXML_VERSION_EXTRA "" - -/** - * LIBXML_TEST_VERSION: - * - * Macro to check that the libxml version in use is compatible with - * the version the software has been compiled against - */ -#define LIBXML_TEST_VERSION xmlCheckVersion(20904); - -#ifndef VMS -#if 0 -/** - * WITH_TRIO: - * - * defined if the trio support need to be configured in - */ -#define WITH_TRIO -#else -/** - * WITHOUT_TRIO: - * - * defined if the trio support should not be configured in - */ -#define WITHOUT_TRIO -#endif -#else /* VMS */ -/** - * WITH_TRIO: - * - * defined if the trio support need to be configured in - */ -#define WITH_TRIO 1 -#endif /* VMS */ - -/** - * LIBXML_THREAD_ENABLED: - * - * Whether the thread support is configured in - */ -#if 1 -#if defined(_REENTRANT) || defined(__MT__) || \ - (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) -#define LIBXML_THREAD_ENABLED -#endif -#endif - -/** - * LIBXML_THREAD_ALLOC_ENABLED: - * - * Whether the allocation hooks are per-thread - */ -#if 0 -#define LIBXML_THREAD_ALLOC_ENABLED -#endif - -/** - * LIBXML_TREE_ENABLED: - * - * Whether the DOM like tree manipulation API support is configured in - */ -#if 1 -#define LIBXML_TREE_ENABLED -#endif - -/** - * LIBXML_OUTPUT_ENABLED: - * - * Whether the serialization/saving support is configured in - */ -#if 1 -#define LIBXML_OUTPUT_ENABLED -#endif - -/** - * LIBXML_PUSH_ENABLED: - * - * Whether the push parsing interfaces are configured in - */ -#if 1 -#define LIBXML_PUSH_ENABLED -#endif - -/** - * LIBXML_READER_ENABLED: - * - * Whether the xmlReader parsing interface is configured in - */ -#if 1 -#define LIBXML_READER_ENABLED -#endif - -/** - * LIBXML_PATTERN_ENABLED: - * - * Whether the xmlPattern node selection interface is configured in - */ -#if 1 -#define LIBXML_PATTERN_ENABLED -#endif - -/** - * LIBXML_WRITER_ENABLED: - * - * Whether the xmlWriter saving interface is configured in - */ -#if 1 -#define LIBXML_WRITER_ENABLED -#endif - -/** - * LIBXML_SAX1_ENABLED: - * - * Whether the older SAX1 interface is configured in - */ -#if 1 -#define LIBXML_SAX1_ENABLED -#endif - -/** - * LIBXML_FTP_ENABLED: - * - * Whether the FTP support is configured in - */ -#if 0 -#define LIBXML_FTP_ENABLED -#endif - -/** - * LIBXML_HTTP_ENABLED: - * - * Whether the HTTP support is configured in - */ -#if 0 -#define LIBXML_HTTP_ENABLED -#endif - -/** - * LIBXML_VALID_ENABLED: - * - * Whether the DTD validation support is configured in - */ -#if 0 -#define LIBXML_VALID_ENABLED -#endif - -/** - * LIBXML_HTML_ENABLED: - * - * Whether the HTML support is configured in - */ -#if 1 -#define LIBXML_HTML_ENABLED -#endif - -/** - * LIBXML_LEGACY_ENABLED: - * - * Whether the deprecated APIs are compiled in for compatibility - */ -#if 0 -#define LIBXML_LEGACY_ENABLED -#endif - -/** - * LIBXML_C14N_ENABLED: - * - * Whether the Canonicalization support is configured in - */ -#if 0 -#define LIBXML_C14N_ENABLED -#endif - -/** - * LIBXML_CATALOG_ENABLED: - * - * Whether the Catalog support is configured in - */ -#if 0 -#define LIBXML_CATALOG_ENABLED -#endif - -/** - * LIBXML_DOCB_ENABLED: - * - * Whether the SGML Docbook support is configured in - */ -#if 0 -#define LIBXML_DOCB_ENABLED -#endif - -/** - * LIBXML_XPATH_ENABLED: - * - * Whether XPath is configured in - */ -#if 1 -#define LIBXML_XPATH_ENABLED -#endif - -/** - * LIBXML_XPTR_ENABLED: - * - * Whether XPointer is configured in - */ -#if 0 -#define LIBXML_XPTR_ENABLED -#endif - -/** - * LIBXML_XINCLUDE_ENABLED: - * - * Whether XInclude is configured in - */ -#if 0 -#define LIBXML_XINCLUDE_ENABLED -#endif - -/** - * LIBXML_ICONV_ENABLED: - * - * Whether iconv support is available - */ -#if 0 -#define LIBXML_ICONV_ENABLED -#endif - -/** - * LIBXML_ICU_ENABLED: - * - * Whether icu support is available - */ -#if 1 -#define LIBXML_ICU_ENABLED -#endif - -/** - * LIBXML_ISO8859X_ENABLED: - * - * Whether ISO-8859-* support is made available in case iconv is not - */ -#if 0 -#define LIBXML_ISO8859X_ENABLED -#endif - -/** - * LIBXML_DEBUG_ENABLED: - * - * Whether Debugging module is configured in - */ -#if 0 -#define LIBXML_DEBUG_ENABLED -#endif - -/** - * DEBUG_MEMORY_LOCATION: - * - * Whether the memory debugging is configured in - */ -#if 0 -#define DEBUG_MEMORY_LOCATION -#endif - -/** - * LIBXML_DEBUG_RUNTIME: - * - * Whether the runtime debugging is configured in - */ -#if 0 -#define LIBXML_DEBUG_RUNTIME -#endif - -/** - * LIBXML_UNICODE_ENABLED: - * - * Whether the Unicode related interfaces are compiled in - */ -#if 0 -#define LIBXML_UNICODE_ENABLED -#endif - -/** - * LIBXML_REGEXP_ENABLED: - * - * Whether the regular expressions interfaces are compiled in - */ -#if 0 -#define LIBXML_REGEXP_ENABLED -#endif - -/** - * LIBXML_AUTOMATA_ENABLED: - * - * Whether the automata interfaces are compiled in - */ -#if 0 -#define LIBXML_AUTOMATA_ENABLED -#endif - -/** - * LIBXML_EXPR_ENABLED: - * - * Whether the formal expressions interfaces are compiled in - */ -#if 0 -#define LIBXML_EXPR_ENABLED -#endif - -/** - * LIBXML_SCHEMAS_ENABLED: - * - * Whether the Schemas validation interfaces are compiled in - */ -#if 0 -#define LIBXML_SCHEMAS_ENABLED -#endif - -/** - * LIBXML_SCHEMATRON_ENABLED: - * - * Whether the Schematron validation interfaces are compiled in - */ -#if 0 -#define LIBXML_SCHEMATRON_ENABLED -#endif - -/** - * LIBXML_MODULES_ENABLED: - * - * Whether the module interfaces are compiled in - */ -#if 0 -#define LIBXML_MODULES_ENABLED -/** - * LIBXML_MODULE_EXTENSION: - * - * the string suffix used by dynamic modules (usually shared libraries) - */ -#define LIBXML_MODULE_EXTENSION ".dll" -#endif - -/** - * LIBXML_ZLIB_ENABLED: - * - * Whether the Zlib support is compiled in - */ -#if 0 -#define LIBXML_ZLIB_ENABLED -#endif - -/** - * LIBXML_LZMA_ENABLED: - * - * Whether the Lzma support is compiled in - */ -#if 0 -#define LIBXML_LZMA_ENABLED -#endif - -#ifdef __GNUC__ -#ifdef HAVE_ANSIDECL_H -#include <ansidecl.h> -#endif - -/** - * ATTRIBUTE_UNUSED: - * - * Macro used to signal to GCC unused function parameters - */ - -#ifndef ATTRIBUTE_UNUSED -# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) -# define ATTRIBUTE_UNUSED __attribute__((unused)) -# else -# define ATTRIBUTE_UNUSED -# endif -#endif - -/** - * LIBXML_ATTR_ALLOC_SIZE: - * - * Macro used to indicate to GCC this is an allocator function - */ - -#ifndef LIBXML_ATTR_ALLOC_SIZE -# if (!defined(__clang__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))) -# define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) -# else -# define LIBXML_ATTR_ALLOC_SIZE(x) -# endif -#else -# define LIBXML_ATTR_ALLOC_SIZE(x) -#endif - -/** - * LIBXML_ATTR_FORMAT: - * - * Macro used to indicate to GCC the parameter are printf like - */ - -#ifndef LIBXML_ATTR_FORMAT -# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) -# define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) -# else -# define LIBXML_ATTR_FORMAT(fmt,args) -# endif -#else -# define LIBXML_ATTR_FORMAT(fmt,args) -#endif - -#else /* ! __GNUC__ */ -/** - * ATTRIBUTE_UNUSED: - * - * Macro used to signal to GCC unused function parameters - */ -#define ATTRIBUTE_UNUSED -/** - * LIBXML_ATTR_ALLOC_SIZE: - * - * Macro used to indicate to GCC this is an allocator function - */ -#define LIBXML_ATTR_ALLOC_SIZE(x) -/** - * LIBXML_ATTR_FORMAT: - * - * Macro used to indicate to GCC the parameter are printf like - */ -#define LIBXML_ATTR_FORMAT(fmt,args) -#endif /* __GNUC__ */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif - - +/* + * Summary: compile-time version informations + * Description: compile-time version informations for the XML library + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_VERSION_H__ +#define __XML_VERSION_H__ + +#include <libxml/xmlexports.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * use those to be sure nothing nasty will happen if + * your library and includes mismatch + */ +#ifndef LIBXML2_COMPILING_MSCCDEF +XMLPUBFUN void XMLCALL xmlCheckVersion(int version); +#endif /* LIBXML2_COMPILING_MSCCDEF */ + +/** + * LIBXML_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBXML_DOTTED_VERSION "2.9.4" + +/** + * LIBXML_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBXML_VERSION 20904 + +/** + * LIBXML_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBXML_VERSION_STRING "20904" + +/** + * LIBXML_VERSION_EXTRA: + * + * extra version information, used to show a CVS compilation + */ +#define LIBXML_VERSION_EXTRA "" + +/** + * LIBXML_TEST_VERSION: + * + * Macro to check that the libxml version in use is compatible with + * the version the software has been compiled against + */ +#define LIBXML_TEST_VERSION xmlCheckVersion(20904); + +#ifndef VMS +#if 0 +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO +#else +/** + * WITHOUT_TRIO: + * + * defined if the trio support should not be configured in + */ +#define WITHOUT_TRIO +#endif +#else /* VMS */ +/** + * WITH_TRIO: + * + * defined if the trio support need to be configured in + */ +#define WITH_TRIO 1 +#endif /* VMS */ + +/** + * LIBXML_THREAD_ENABLED: + * + * Whether the thread support is configured in + */ +#if 1 +#if defined(_REENTRANT) || defined(__MT__) || \ + (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L)) +#define LIBXML_THREAD_ENABLED +#endif +#endif + +/** + * LIBXML_THREAD_ALLOC_ENABLED: + * + * Whether the allocation hooks are per-thread + */ +#if 0 +#define LIBXML_THREAD_ALLOC_ENABLED +#endif + +/** + * LIBXML_TREE_ENABLED: + * + * Whether the DOM like tree manipulation API support is configured in + */ +#if 1 +#define LIBXML_TREE_ENABLED +#endif + +/** + * LIBXML_OUTPUT_ENABLED: + * + * Whether the serialization/saving support is configured in + */ +#if 1 +#define LIBXML_OUTPUT_ENABLED +#endif + +/** + * LIBXML_PUSH_ENABLED: + * + * Whether the push parsing interfaces are configured in + */ +#if 1 +#define LIBXML_PUSH_ENABLED +#endif + +/** + * LIBXML_READER_ENABLED: + * + * Whether the xmlReader parsing interface is configured in + */ +#if 1 +#define LIBXML_READER_ENABLED +#endif + +/** + * LIBXML_PATTERN_ENABLED: + * + * Whether the xmlPattern node selection interface is configured in + */ +#if 1 +#define LIBXML_PATTERN_ENABLED +#endif + +/** + * LIBXML_WRITER_ENABLED: + * + * Whether the xmlWriter saving interface is configured in + */ +#if 1 +#define LIBXML_WRITER_ENABLED +#endif + +/** + * LIBXML_SAX1_ENABLED: + * + * Whether the older SAX1 interface is configured in + */ +#if 1 +#define LIBXML_SAX1_ENABLED +#endif + +/** + * LIBXML_FTP_ENABLED: + * + * Whether the FTP support is configured in + */ +#if 0 +#define LIBXML_FTP_ENABLED +#endif + +/** + * LIBXML_HTTP_ENABLED: + * + * Whether the HTTP support is configured in + */ +#if 0 +#define LIBXML_HTTP_ENABLED +#endif + +/** + * LIBXML_VALID_ENABLED: + * + * Whether the DTD validation support is configured in + */ +#if 0 +#define LIBXML_VALID_ENABLED +#endif + +/** + * LIBXML_HTML_ENABLED: + * + * Whether the HTML support is configured in + */ +#if 1 +#define LIBXML_HTML_ENABLED +#endif + +/** + * LIBXML_LEGACY_ENABLED: + * + * Whether the deprecated APIs are compiled in for compatibility + */ +#if 0 +#define LIBXML_LEGACY_ENABLED +#endif + +/** + * LIBXML_C14N_ENABLED: + * + * Whether the Canonicalization support is configured in + */ +#if 0 +#define LIBXML_C14N_ENABLED +#endif + +/** + * LIBXML_CATALOG_ENABLED: + * + * Whether the Catalog support is configured in + */ +#if 0 +#define LIBXML_CATALOG_ENABLED +#endif + +/** + * LIBXML_DOCB_ENABLED: + * + * Whether the SGML Docbook support is configured in + */ +#if 0 +#define LIBXML_DOCB_ENABLED +#endif + +/** + * LIBXML_XPATH_ENABLED: + * + * Whether XPath is configured in + */ +#if 1 +#define LIBXML_XPATH_ENABLED +#endif + +/** + * LIBXML_XPTR_ENABLED: + * + * Whether XPointer is configured in + */ +#if 0 +#define LIBXML_XPTR_ENABLED +#endif + +/** + * LIBXML_XINCLUDE_ENABLED: + * + * Whether XInclude is configured in + */ +#if 0 +#define LIBXML_XINCLUDE_ENABLED +#endif + +/** + * LIBXML_ICONV_ENABLED: + * + * Whether iconv support is available + */ +#if 0 +#define LIBXML_ICONV_ENABLED +#endif + +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if 1 +#define LIBXML_ICU_ENABLED +#endif + +/** + * LIBXML_ISO8859X_ENABLED: + * + * Whether ISO-8859-* support is made available in case iconv is not + */ +#if 0 +#define LIBXML_ISO8859X_ENABLED +#endif + +/** + * LIBXML_DEBUG_ENABLED: + * + * Whether Debugging module is configured in + */ +#if 0 +#define LIBXML_DEBUG_ENABLED +#endif + +/** + * DEBUG_MEMORY_LOCATION: + * + * Whether the memory debugging is configured in + */ +#if 0 +#define DEBUG_MEMORY_LOCATION +#endif + +/** + * LIBXML_DEBUG_RUNTIME: + * + * Whether the runtime debugging is configured in + */ +#if 0 +#define LIBXML_DEBUG_RUNTIME +#endif + +/** + * LIBXML_UNICODE_ENABLED: + * + * Whether the Unicode related interfaces are compiled in + */ +#if 0 +#define LIBXML_UNICODE_ENABLED +#endif + +/** + * LIBXML_REGEXP_ENABLED: + * + * Whether the regular expressions interfaces are compiled in + */ +#if 0 +#define LIBXML_REGEXP_ENABLED +#endif + +/** + * LIBXML_AUTOMATA_ENABLED: + * + * Whether the automata interfaces are compiled in + */ +#if 0 +#define LIBXML_AUTOMATA_ENABLED +#endif + +/** + * LIBXML_EXPR_ENABLED: + * + * Whether the formal expressions interfaces are compiled in + */ +#if 0 +#define LIBXML_EXPR_ENABLED +#endif + +/** + * LIBXML_SCHEMAS_ENABLED: + * + * Whether the Schemas validation interfaces are compiled in + */ +#if 0 +#define LIBXML_SCHEMAS_ENABLED +#endif + +/** + * LIBXML_SCHEMATRON_ENABLED: + * + * Whether the Schematron validation interfaces are compiled in + */ +#if 0 +#define LIBXML_SCHEMATRON_ENABLED +#endif + +/** + * LIBXML_MODULES_ENABLED: + * + * Whether the module interfaces are compiled in + */ +#if 0 +#define LIBXML_MODULES_ENABLED +/** + * LIBXML_MODULE_EXTENSION: + * + * the string suffix used by dynamic modules (usually shared libraries) + */ +#define LIBXML_MODULE_EXTENSION ".dll" +#endif + +/** + * LIBXML_ZLIB_ENABLED: + * + * Whether the Zlib support is compiled in + */ +#if 0 +#define LIBXML_ZLIB_ENABLED +#endif + +/** + * LIBXML_LZMA_ENABLED: + * + * Whether the Lzma support is compiled in + */ +#if 0 +#define LIBXML_LZMA_ENABLED +#endif + +#ifdef __GNUC__ +#ifdef HAVE_ANSIDECL_H +#include <ansidecl.h> +#endif + +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ + +#ifndef ATTRIBUTE_UNUSED +# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) +# define ATTRIBUTE_UNUSED __attribute__((unused)) +# else +# define ATTRIBUTE_UNUSED +# endif +#endif + +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ + +#ifndef LIBXML_ATTR_ALLOC_SIZE +# if (!defined(__clang__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))) +# define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x))) +# else +# define LIBXML_ATTR_ALLOC_SIZE(x) +# endif +#else +# define LIBXML_ATTR_ALLOC_SIZE(x) +#endif + +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ + +#ifndef LIBXML_ATTR_FORMAT +# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3))) +# define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args))) +# else +# define LIBXML_ATTR_FORMAT(fmt,args) +# endif +#else +# define LIBXML_ATTR_FORMAT(fmt,args) +#endif + +#else /* ! __GNUC__ */ +/** + * ATTRIBUTE_UNUSED: + * + * Macro used to signal to GCC unused function parameters + */ +#define ATTRIBUTE_UNUSED +/** + * LIBXML_ATTR_ALLOC_SIZE: + * + * Macro used to indicate to GCC this is an allocator function + */ +#define LIBXML_ATTR_ALLOC_SIZE(x) +/** + * LIBXML_ATTR_FORMAT: + * + * Macro used to indicate to GCC the parameter are printf like + */ +#define LIBXML_ATTR_FORMAT(fmt,args) +#endif /* __GNUC__ */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif + +
diff --git a/tools/luci-go/linux64/isolate.sha1 b/tools/luci-go/linux64/isolate.sha1 index b8593a7..f14d0ea 100644 --- a/tools/luci-go/linux64/isolate.sha1 +++ b/tools/luci-go/linux64/isolate.sha1
@@ -1 +1 @@ -3c0fbcab83730c86bbd5a09e760388dcb7053bc4 +bcc0e73f051cc01452c24babbb4be9d5f4556c55
diff --git a/tools/luci-go/mac64/isolate.sha1 b/tools/luci-go/mac64/isolate.sha1 index bf7e1c1dd..7506974 100644 --- a/tools/luci-go/mac64/isolate.sha1 +++ b/tools/luci-go/mac64/isolate.sha1
@@ -1 +1 @@ -d37a2f34eff58e1fb04038bd52381001479d4aa1 +47ffac85c87dd0a2cfd6c4ded9c29c5bbcc8245d
diff --git a/tools/luci-go/win64/isolate.exe.sha1 b/tools/luci-go/win64/isolate.exe.sha1 index c575f970..9dccf31 100644 --- a/tools/luci-go/win64/isolate.exe.sha1 +++ b/tools/luci-go/win64/isolate.exe.sha1
@@ -1 +1 @@ -d4b894493b1ee5c04ec5bc88e6ea286426540770 +1ed79378fe41640a963f1aa6d1674e8456993d10
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 2de1cc0d..ab2f840 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -956,6 +956,8 @@ <int value="27" label="Url is not eligible for WebAPKs"/> <int value="28" label="Site loaded in incognito window (not reported)"/> <int value="29" label="Service worker not offline capable"/> + <int value="30" label="Waiting for manifest to be fetched"/> + <int value="31" label="Waiting for installability check"/> </enum> <enum name="AppBannersInstallEvent"> @@ -35924,6 +35926,15 @@ <int value="3" label="Infobar dismissed"/> </enum> +<enum name="ThumbnailTopSitesEvent" type="int"> + <int value="0" label="Not added: Failure"/> + <int value="1" label="Not added: TopSites is full"/> + <int value="2" label="Not added: Existing thumbnail is better"/> + <int value="3" label="Added temp thumbnail"/> + <int value="4" label="Added regular thumbnail"/> + <int value="5" label="Promoted temp thumbnail to regular"/> +</enum> + <enum name="TileMemoryBudget"> <int value="0" label="Within memory budget"/> <int value="1" label="Exceeded memory budget"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index fb871b71..7fe5a56 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -64233,18 +64233,6 @@ </summary> </histogram> -<histogram - name="SBClientDownload.DownloadFileWithoutDiskImageExtensionHasKolySignature" - enum="Boolean"> - <owner>jialiul@chromium.org</owner> - <summary> - Records whether download files without an Apple disk image file extension - have a 'koly' signature. This can be used to identify distribution of disk - image files to Mac users without simply relying on file extension. This - metric is logged before Chrome sends SafeBrowsing download pings. - </summary> -</histogram> - <histogram name="SBClientDownload.DownloadRequestDuration" units="ms"> <owner>mattm@chromium.org</owner> <summary> @@ -68074,6 +68062,30 @@ </summary> </histogram> +<histogram name="ServiceWorker.NavPreload.WorkerPreparationType" + enum="ServiceWorkerPreparationType"> + <owner>falken@chromium.org</owner> + <summary> + The type of preparation needed for the browser to find and possibly start an + active worker to dispatch a FetchEvent for a main frame resource request, + when navigation preload also occurred. + + This histogram is recorded when a navigation preload response is succesfully + forwarded to the service worker's fetch event (for the case mentioned + above), with the same restrictions numbered 1) through 3) as for + ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time. The sample is + only recorded to the appropriate suffixed histograms. + + This is similar to + ServiceWorker.ActivatedWorkerPreparationForMainFrame.Type_NavigationPreloadEnabled. + The difference is ServiceWorker.NavPreload.WorkerPreparationType gets logged + if the navigation preload successfully occurred, at the same time as the + other ServiceWorker.NavPreload.* metrics so is more safely comparable to + them. We could deprecate the Type_NavigationPreloadEnabled histogram if it + turns out there is no significant difference. + </summary> +</histogram> + <histogram name="ServiceWorker.NavPreload.WorkerWaitTime" units="ms"> <owner>falken@chromium.org</owner> <summary> @@ -77824,6 +77836,13 @@ </summary> </histogram> +<histogram name="Thumbnails.AddedToTopSites" enum="ThumbnailTopSitesEvent"> + <owner>treib@chromium.org</owner> + <summary> + A page thumbnail (for use on the New Tab page) was added to TopSites. + </summary> +</histogram> + <histogram name="Thumbnails.CopyFromSurfaceTime" units="ms"> <owner>treib@chromium.org</owner> <summary> @@ -89938,6 +89957,7 @@ <affected-histogram name="ServiceWorker.NavPreload.ConcurrentTime"/> <affected-histogram name="ServiceWorker.NavPreload.FinishedFirst"/> <affected-histogram name="ServiceWorker.NavPreload.ResponseTime"/> + <affected-histogram name="ServiceWorker.NavPreload.WorkerPreparationType"/> <affected-histogram name="ServiceWorker.NavPreload.WorkerWaitTime"/> </histogram_suffixes>
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css index bc8483a..aeecf06 100644 --- a/ui/file_manager/file_manager/foreground/css/file_manager.css +++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -202,6 +202,7 @@ background: -webkit-image-set( url(../images/files/ui/eject.png) 1x, url(../images/files/ui/2x/eject.png) 2x) no-repeat center; + border-style: none; cursor: pointer; flex: none; height: 40px;
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js index 7c599645..7e84b12f 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js +++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -656,7 +656,7 @@ * @private */ VolumeItem.prototype.setupEjectButton_ = function(rowElement) { - var ejectButton = cr.doc.createElement('div'); + var ejectButton = cr.doc.createElement('button'); // Block other mouse handlers. ejectButton.addEventListener( 'mouseup', function(event) { event.stopPropagation() }); @@ -664,6 +664,7 @@ 'mousedown', function(event) { event.stopPropagation() }); ejectButton.className = 'root-eject'; ejectButton.setAttribute('aria-label', str('UNMOUNT_DEVICE_BUTTON_LABEL')); + ejectButton.setAttribute('tabindex', '0'); ejectButton.addEventListener('click', function(event) { event.stopPropagation(); var unmountCommand = cr.doc.querySelector('command#unmount');