diff --git a/DEPS b/DEPS index f3cbb6b9..21ea3f45 100644 --- a/DEPS +++ b/DEPS
@@ -206,11 +206,11 @@ # 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': '018f5f6dccd61726dc8f2d812968ab346e29b78a', + 'skia_revision': '3cd384a5b039c4428c05e4a81f974f9dd80c9976', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '81a2c08d617cb1f1d3fbed2b58b307d4916c9741', + 'v8_revision': '74cd21ef855b0602e4b70e049794699fe06b4f82', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -218,7 +218,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '77defeb04693452a4227da1c04e88cc72f690a64', + 'angle_revision': '3591997b58bfb1aab16a2d3d071529275bb84b05', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -269,7 +269,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '15be7eb5cbfb37590d3271379ce6ae2fd54d19ea', + 'catapult_revision': 'e40e5df22e17fd2f9f50e408a349a1291c953370', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -329,7 +329,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '2971eb6749352d057e534d99af0fbad0862da771', + 'dawn_revision': 'a584311a6a73a2b8b21703874742128c6d92f549', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -368,7 +368,7 @@ 'ukey2_revision': '0275885d8e6038c39b8a8ca55e75d1d4d1727f47', # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'tint_revision': '5ede1190cf977623f2f136fb4e8d984fccc39e99', + 'tint_revision': 'd2fa57d26dff88826fd6274ed4b77734186f89e3', # TODO(crbug.com/941824): The values below need to be kept in sync # between //DEPS and //buildtools/DEPS, so if you're updating one, @@ -1343,7 +1343,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'zy6Zme4YpIqml3lhXc3o7a0r_gVd0_gcggle2n2j330C' + 'version': '5NnLo-cXdmYFIzPY4rZEivBCdo7jYrgKQx3j1gQI1ScC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1569,7 +1569,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@45c5d9f3ebea9eb2e5b17ed07f23a5782ee8a3fb', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9e4c794ee0a5c2cf27c67d2185b927229a9ee2e0', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java index eac019ab..8edb913 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -47,7 +47,6 @@ import org.chromium.base.task.PostTask; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.DisableIf; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.MetricsUtils; @@ -993,7 +992,6 @@ @Test @SmallTest @Feature({"AndroidWebView"}) - @DisabledTest(message = "https://crbug.com/1142486") public void testAutofillTriggersAfterReload() throws Throwable { final String data = "<html><head></head><body><form action='a.html' name='formname'>" + "<input type='text' id='text1' name='username'" @@ -1012,12 +1010,12 @@ // Reload the page and check that the user clicking on the same form field ends the current // autofill session and starts a new session. - loadUrlSync(url); + reloadSync(); DOMUtils.waitForNonZeroNodeBounds(mAwContents.getWebContents(), "text1"); // TODO(changwan): mock out IME interaction. Assert.assertTrue(DOMUtils.clickNode(mTestContainerView.getWebContents(), "text1")); cnt += waitForCallbackAndVerifyTypes(cnt, - new Integer[] {AUTOFILL_CANCEL, AUTOFILL_VIEW_EXITED, AUTOFILL_VIEW_ENTERED, + new Integer[] {AUTOFILL_VIEW_EXITED, AUTOFILL_CANCEL, AUTOFILL_VIEW_ENTERED, AUTOFILL_SESSION_STARTED}); } @@ -2091,6 +2089,14 @@ done.waitForCallback(callCount); } + private void reloadSync() throws Exception { + CallbackHelper done = mContentsClient.getOnPageCommitVisibleHelper(); + int callCount = done.getCallCount(); + mRule.reloadSync( + mTestContainerView.getAwContents(), mContentsClient.getOnPageFinishedHelper()); + done.waitForCallback(callCount); + } + private String executeJavaScriptAndWaitForResult(String code) throws Throwable { return mRule.executeJavaScriptAndWaitForResult( mTestContainerView.getAwContents(), mContentsClient, code);
diff --git a/ash/accelerometer/accelerometer_file_reader.cc b/ash/accelerometer/accelerometer_file_reader.cc index c869606..805f4818 100644 --- a/ash/accelerometer/accelerometer_file_reader.cc +++ b/ash/accelerometer/accelerometer_file_reader.cc
@@ -199,9 +199,9 @@ if (base::SysInfo::IsRunningOnChromeOS() && !base::IsDirectoryEmpty(base::FilePath(kECLidAngleDriverPath))) { - ec_lid_angle_driver_ = ECLidAngleDriver::SUPPORTED; + ec_lid_angle_driver_status_ = ECLidAngleDriverStatus::SUPPORTED; } else { - ec_lid_angle_driver_ = ECLidAngleDriver::NOT_SUPPORTED; + ec_lid_angle_driver_status_ = ECLidAngleDriverStatus::NOT_SUPPORTED; } // Find trigger to use: @@ -299,7 +299,7 @@ // If ChromeOS lid angle driver is not present, start accelerometer read and // read is always on. - if (ec_lid_angle_driver_ == ECLidAngleDriver::NOT_SUPPORTED) + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::NOT_SUPPORTED) EnableAccelerometerReading(); } @@ -353,7 +353,7 @@ DCHECK(base::SequencedTaskRunnerHandle::IsSet()); switch (initialization_state_) { case State::SUCCESS: - if (ec_lid_angle_driver_ == ECLidAngleDriver::SUPPORTED) + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::SUPPORTED) EnableAccelerometerReading(); break; case State::FAILED: @@ -370,7 +370,7 @@ void AccelerometerFileReader::CancelRead() { DCHECK(base::SequencedTaskRunnerHandle::IsSet()); if (initialization_state_ == State::SUCCESS && - ec_lid_angle_driver_ == ECLidAngleDriver::SUPPORTED) + ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::SUPPORTED) DisableAccelerometerReading(); } @@ -413,7 +413,7 @@ // ON and can't be tuned. Thus AccelerometerFileReader no longer listens to // tablet mode event. auto* tablet_mode_controller = Shell::Get()->tablet_mode_controller(); - if (ec_lid_angle_driver_ == ECLidAngleDriver::NOT_SUPPORTED) { + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::NOT_SUPPORTED) { tablet_mode_controller->RemoveObserver(this); return; } @@ -559,9 +559,7 @@ for (AccelerometerSource source : reading_data.sources) { DCHECK(configuration_.has[source]); int16_t* values = reinterpret_cast<int16_t*>(reading); - bool is_driver_existed = - (ec_lid_angle_driver_ == ECLidAngleDriver::SUPPORTED) ? true : false; - update_->Set(source, is_driver_existed, + update_->Set(source, values[configuration_.index[source][0]] * configuration_.scale[source][0], values[configuration_.index[source][1]] *
diff --git a/ash/accelerometer/accelerometer_file_reader.h b/ash/accelerometer/accelerometer_file_reader.h index c347fae..eb45be9 100644 --- a/ash/accelerometer/accelerometer_file_reader.h +++ b/ash/accelerometer/accelerometer_file_reader.h
@@ -15,8 +15,6 @@ namespace ash { -enum class ECLidAngleDriver { UNKNOWN, SUPPORTED, NOT_SUPPORTED }; - enum class State { INITIALIZING, SUCCESS, FAILED }; // Work that runs on a base::TaskRunner. It determines the accelerometer @@ -132,10 +130,6 @@ void SetEmitEventsInternal(bool emit_events); - // State of ChromeOS EC lid angle driver, if SUPPORTED, it means EC can handle - // lid angle calculation. - ECLidAngleDriver ec_lid_angle_driver_ = ECLidAngleDriver::UNKNOWN; - // The current initialization state of reader. State initialization_state_ = State::INITIALIZING;
diff --git a/ash/accelerometer/accelerometer_reader.cc b/ash/accelerometer/accelerometer_reader.cc index e7df777..0d0e9f6 100644 --- a/ash/accelerometer/accelerometer_reader.cc +++ b/ash/accelerometer/accelerometer_reader.cc
@@ -42,9 +42,29 @@ accelerometer_provider_->SetEmitEvents(enabled); } +ECLidAngleDriverStatus AccelerometerReader::GetECLidAngleDriverStatus() const { + return accelerometer_provider_->GetECLidAngleDriverStatus(); +} + +void AccelerometerReader::SetECLidAngleDriverStatusForTesting( + ECLidAngleDriverStatus ec_lid_angle_driver_status) { + accelerometer_provider_->SetECLidAngleDriverStatusForTesting( // IN-TEST + ec_lid_angle_driver_status); +} + AccelerometerReader::AccelerometerReader() : accelerometer_provider_(new AccelerometerFileReader()) {} AccelerometerReader::~AccelerometerReader() = default; +ECLidAngleDriverStatus +AccelerometerProviderInterface::GetECLidAngleDriverStatus() const { + return ec_lid_angle_driver_status_; +} + +void AccelerometerProviderInterface::SetECLidAngleDriverStatusForTesting( + ECLidAngleDriverStatus ec_lid_angle_driver_status) { + ec_lid_angle_driver_status_ = ec_lid_angle_driver_status; +} + } // namespace ash
diff --git a/ash/accelerometer/accelerometer_reader.h b/ash/accelerometer/accelerometer_reader.h index 43a3c370..e1630a2 100644 --- a/ash/accelerometer/accelerometer_reader.h +++ b/ash/accelerometer/accelerometer_reader.h
@@ -19,13 +19,14 @@ namespace ash { +enum class ECLidAngleDriverStatus { UNKNOWN, SUPPORTED, NOT_SUPPORTED }; + class AccelerometerProviderInterface; // Reads an accelerometer device and reports data back to an // AccelerometerDelegate. class ASH_EXPORT AccelerometerReader { public: - // An interface to receive data from the AccelerometerReader. class Observer { public: @@ -54,8 +55,16 @@ // be able to control the accelerometer feature. void SetEnabled(bool enabled); + // Return the state of the driver being supported or not. + ECLidAngleDriverStatus GetECLidAngleDriverStatus() const; + + void SetECLidAngleDriverStatusForTesting( + ECLidAngleDriverStatus ec_lid_angle_driver_status); + protected: AccelerometerReader(); + AccelerometerReader(const AccelerometerReader&) = delete; + AccelerometerReader& operator=(const AccelerometerReader&) = delete; virtual ~AccelerometerReader(); private: @@ -65,8 +74,6 @@ // Initialize. It will determine accelerometer configuration, read the data, // and notify observers. scoped_refptr<AccelerometerProviderInterface> accelerometer_provider_; - - DISALLOW_COPY_AND_ASSIGN(AccelerometerReader); }; class AccelerometerProviderInterface @@ -88,9 +95,20 @@ // Set emitting events (samples) to observers or not. virtual void SetEmitEvents(bool emit_events) = 0; + // Return the state of the driver being supported or not. + ECLidAngleDriverStatus GetECLidAngleDriverStatus() const; + + void SetECLidAngleDriverStatusForTesting( + ECLidAngleDriverStatus ec_lid_angle_driver_status); + protected: virtual ~AccelerometerProviderInterface() = default; + // State of ChromeOS EC lid angle driver, if SUPPORTED, it means EC can handle + // lid angle calculation. + ECLidAngleDriverStatus ec_lid_angle_driver_status_ = + ECLidAngleDriverStatus::UNKNOWN; + private: friend class base::RefCountedThreadSafe<AccelerometerProviderInterface>; };
diff --git a/ash/accelerometer/accelerometer_types.h b/ash/accelerometer/accelerometer_types.h index dbc1e91..3de5619a 100644 --- a/ash/accelerometer/accelerometer_types.h +++ b/ash/accelerometer/accelerometer_types.h
@@ -41,10 +41,6 @@ // If true, this accelerometer is being updated. bool present = false; - // If true, ChromeOS EC lid angle driver is present, and notifies - // some observers not to process accelerometer data. - bool lid_angle_driver_present = false; - // The readings from this accelerometer measured in m/s^2. float x; float y; @@ -57,6 +53,8 @@ : public base::RefCountedThreadSafe<AccelerometerUpdate> { public: AccelerometerUpdate(); + AccelerometerUpdate(const AccelerometerUpdate&) = delete; + AccelerometerUpdate& operator=(const AccelerometerUpdate&) = delete; // Returns true if |source| has a valid value in this update. bool has(AccelerometerSource source) const { return data_[source].present; } @@ -66,20 +64,11 @@ return data_[source]; } - // Returns true if has ChromeOS EC lid angle driver. - bool HasLidAngleDriver(AccelerometerSource source) const { - DCHECK_GE(source, ACCELEROMETER_SOURCE_SCREEN); - DCHECK_LT(source, ACCELEROMETER_SOURCE_COUNT); - return data_[source].lid_angle_driver_present; - } - // Returns the last known value for |source| as a vector. gfx::Vector3dF GetVector(AccelerometerSource source) const; - void Set(AccelerometerSource source, bool driver_present, - float x, float y, float z) { + void Set(AccelerometerSource source, float x, float y, float z) { data_[source].present = true; - data_[source].lid_angle_driver_present = driver_present; data_[source].x = x; data_[source].y = y; data_[source].z = z; @@ -97,8 +86,6 @@ friend class base::RefCountedThreadSafe<AccelerometerUpdate>; virtual ~AccelerometerUpdate(); - - DISALLOW_COPY_AND_ASSIGN(AccelerometerUpdate); }; } // namespace ash
diff --git a/ash/accessibility/accessibility_controller_impl.cc b/ash/accessibility/accessibility_controller_impl.cc index 054136d..24c0723 100644 --- a/ash/accessibility/accessibility_controller_impl.cc +++ b/ash/accessibility/accessibility_controller_impl.cc
@@ -1046,11 +1046,14 @@ switch_access_bubble_controller_->ShowMenu(anchor, actions_to_show); } -void AccessibilityControllerImpl::StartPointScan() { - if (::switches::IsSwitchAccessPointScanningEnabled()) { - if (!point_scan_controller_) - point_scan_controller_.reset(new PointScanController()); +bool AccessibilityControllerImpl::IsPointScanEnabled() { + return point_scan_controller_.get() && + point_scan_controller_->IsPointScanEnabled(); +} +void AccessibilityControllerImpl::ActivatePointScan() { + if (::switches::IsSwitchAccessPointScanningEnabled()) { + point_scan_controller_ = std::make_unique<PointScanController>(); point_scan_controller_->Start(); } } @@ -1091,6 +1094,10 @@ return floating_menu_controller_.get(); } +PointScanController* AccessibilityControllerImpl::GetPointScanController() { + return point_scan_controller_.get(); +} + void AccessibilityControllerImpl::SetTabletModeShelfNavigationButtonsEnabled( bool enabled) { if (!active_user_prefs_)
diff --git a/ash/accessibility/accessibility_controller_impl.h b/ash/accessibility/accessibility_controller_impl.h index f1779e3..035a71e 100644 --- a/ash/accessibility/accessibility_controller_impl.h +++ b/ash/accessibility/accessibility_controller_impl.h
@@ -203,6 +203,8 @@ FloatingMenuPosition GetFloatingMenuPosition(); FloatingAccessibilityController* GetFloatingMenuController(); + PointScanController* GetPointScanController(); + // Update the autoclick menu bounds if necessary. This may need to happen when // the display work area changes, or if system ui regions change (like the // virtual keyboard position). @@ -256,6 +258,7 @@ bool IsEnterpriseIconVisibleForSwitchAccess(); void SetAccessibilityEventRewriter( AccessibilityEventRewriter* accessibility_event_rewriter); + bool IsPointScanEnabled(); bool IsVirtualKeyboardSettingVisibleInTray(); bool IsEnterpriseIconVisibleForVirtualKeyboard(); @@ -352,7 +355,7 @@ void ShowSwitchAccessBackButton(const gfx::Rect& anchor) override; void ShowSwitchAccessMenu(const gfx::Rect& anchor, std::vector<std::string> actions_to_show) override; - void StartPointScan() override; + void ActivatePointScan() override; void SetDictationActive(bool is_active) override; void ToggleDictationFromSource(DictationToggleSource source) override; void HandleAutoclickScrollableBoundsFound(
diff --git a/ash/accessibility/accessibility_layer.cc b/ash/accessibility/accessibility_layer.cc index dae3481..5cbd5f18 100644 --- a/ash/accessibility/accessibility_layer.cc +++ b/ash/accessibility/accessibility_layer.cc
@@ -44,6 +44,11 @@ layer_->SetOpacity(std::max(0.f, opacity)); } +void AccessibilityLayer::SetSubpixelPositionOffset( + const gfx::Vector2dF& offset) { + layer_->SetSubpixelPositionOffset(offset); +} + void AccessibilityLayer::CreateOrUpdateLayer(aura::Window* root_window, const char* layer_name, const gfx::Rect& bounds) {
diff --git a/ash/accessibility/accessibility_layer.h b/ash/accessibility/accessibility_layer.h index 27291511..c8f9d95 100644 --- a/ash/accessibility/accessibility_layer.h +++ b/ash/accessibility/accessibility_layer.h
@@ -50,6 +50,9 @@ // Set the layer's opacity. void SetOpacity(float opacity); + // Set the layer's offset from parent layer. + void SetSubpixelPositionOffset(const gfx::Vector2dF& offset); + // Returns true if this layer is in a composited window with an // animation observer. virtual bool CanAnimate() const = 0;
diff --git a/ash/accessibility/layer_animation_info.cc b/ash/accessibility/layer_animation_info.cc index a19d9aef..766628bf 100644 --- a/ash/accessibility/layer_animation_info.cc +++ b/ash/accessibility/layer_animation_info.cc
@@ -36,4 +36,28 @@ animation_info->opacity = base::ClampToRange(opacity, 0.0f, 1.0f); } +void ComputeOffset(LayerAnimationInfo* animation_info, + base::TimeTicks timestamp) { + if (timestamp < animation_info->start_time) + timestamp = animation_info->start_time; + + float change_delta = (timestamp - animation_info->start_time).InSecondsF(); + + if (animation_info->offset > animation_info->offset_bound) { + animation_info->offset = animation_info->offset_bound; + animation_info->animation_rate *= -1; + } else if (animation_info->offset < 0) { + animation_info->offset = 0; + animation_info->animation_rate *= -1; + } + + float offset_delta = animation_info->offset_bound * + (change_delta / animation_info->animation_rate); + animation_info->offset += offset_delta; + + if (animation_info->offset > animation_info->offset_bound) { + animation_info->offset = 0; + } +} + } // namespace ash \ No newline at end of file
diff --git a/ash/accessibility/layer_animation_info.h b/ash/accessibility/layer_animation_info.h index 1084ecaf..c9ce3d5 100644 --- a/ash/accessibility/layer_animation_info.h +++ b/ash/accessibility/layer_animation_info.h
@@ -15,12 +15,18 @@ base::TimeDelta fade_in_time; base::TimeDelta fade_out_time; float opacity = 0; + float offset = 0; + float offset_bound = 0; + float animation_rate = 0; bool smooth = false; }; void ComputeOpacity(LayerAnimationInfo* animation_info, base::TimeTicks timestamp); +void ComputeOffset(LayerAnimationInfo* animation_info, + base::TimeTicks timestamp); + } // namespace ash #endif // ASH_ACCESSIBILITY_LAYER_ANIMATION_INFO_H_
diff --git a/ash/accessibility/point_scan_controller.cc b/ash/accessibility/point_scan_controller.cc index e563ab2..8df7caf 100644 --- a/ash/accessibility/point_scan_controller.cc +++ b/ash/accessibility/point_scan_controller.cc
@@ -4,21 +4,95 @@ #include "ash/accessibility/point_scan_controller.h" +#include "ash/accessibility/layer_animation_info.h" #include "ash/accessibility/point_scan_layer.h" #include "ui/display/display.h" #include "ui/display/screen.h" +namespace { +// Scanning line rate constants +constexpr float kHorizontalLineRate = 10; +constexpr float kVerticalLineRate = 10; +} // namespace + namespace ash { -PointScanController::PointScanController() = default; +PointScanController::PointScanController() { + horizontal_line_layer_info_.animation_rate = kHorizontalLineRate; + vertical_line_layer_info_.animation_rate = kVerticalLineRate; +} + PointScanController::~PointScanController() = default; void PointScanController::Start() { - point_scan_layer_.reset(new PointScanLayer(this)); - point_scan_layer_->StartHorizontalScanning(); + state_ = PointScanState::kHorizontalScanning; + horizontal_line_layer_.reset(new PointScanLayer(this)); + horizontal_line_layer_info_.offset_bound = + horizontal_line_layer_->GetBounds().width(); + horizontal_line_layer_->StartHorizontalScanning(); +} + +void PointScanController::Pause() { + state_ = PointScanState::kVerticalScanning; + horizontal_line_layer_->PauseHorizontalScanning(); + vertical_line_layer_.reset(new PointScanLayer(this)); + vertical_line_layer_info_.offset_bound = + vertical_line_layer_->GetBounds().height(); + vertical_line_layer_->StartVerticalScanning(); +} + +void PointScanController::Stop() { + state_ = PointScanState::kOff; + vertical_line_layer_->PauseVerticalScanning(); +} + +void PointScanController::OnPointSelect() { + switch (state_) { + case PointScanState::kHorizontalScanning: + Pause(); + return; + case PointScanState::kVerticalScanning: + Stop(); + return; + case PointScanState::kOff: + return; + } +} + +bool PointScanController::IsPointScanEnabled() { + switch (state_) { + case PointScanState::kVerticalScanning: + case PointScanState::kHorizontalScanning: + return true; + case PointScanState::kOff: + return false; + } } void PointScanController::OnDeviceScaleFactorChanged() {} -void PointScanController::OnAnimationStep(base::TimeTicks timestamp) {} + +void PointScanController::OnAnimationStep(base::TimeTicks timestamp) { + AnimateLine(timestamp); +} + +void PointScanController::UpdateTimeInfo(LayerAnimationInfo* animation_info, + base::TimeTicks timestamp) { + animation_info->start_time = animation_info->change_time; + animation_info->change_time = timestamp; +} + +void PointScanController::AnimateLine(base::TimeTicks timestamp) { + if (horizontal_line_layer_->IsMoving()) { + ComputeOffset(&horizontal_line_layer_info_, timestamp); + horizontal_line_layer_->SetSubpixelPositionOffset( + gfx::Vector2dF(horizontal_line_layer_info_.offset, 0.0)); + UpdateTimeInfo(&horizontal_line_layer_info_, timestamp); + } else if (vertical_line_layer_->IsMoving()) { + ComputeOffset(&vertical_line_layer_info_, timestamp); + vertical_line_layer_->SetSubpixelPositionOffset( + gfx::Vector2dF(0.0, vertical_line_layer_info_.offset)); + UpdateTimeInfo(&vertical_line_layer_info_, timestamp); + } +} } // namespace ash
diff --git a/ash/accessibility/point_scan_controller.h b/ash/accessibility/point_scan_controller.h index b7df377..9232297 100644 --- a/ash/accessibility/point_scan_controller.h +++ b/ash/accessibility/point_scan_controller.h
@@ -6,6 +6,7 @@ #define ASH_ACCESSIBILITY_POINT_SCAN_CONTROLLER_H_ #include "ash/accessibility/accessibility_layer.h" +#include "ash/accessibility/layer_animation_info.h" #include "ash/ash_export.h" namespace ash { @@ -23,17 +24,40 @@ PointScanController(const PointScanController&) = delete; PointScanController& operator=(const PointScanController&) = delete; + enum class PointScanState { + // Point scanning is currently scanning horizontally + kHorizontalScanning, + // Point scanning is currently scanning vertically + kVerticalScanning, + // Point scanning is not scanning + kOff, + }; + // Starts point scanning, by sweeping a line across the screen and waiting for // user input. // TODO(crbug/1061537): Animate the line across the screen. + void EnablePointScan(); void Start(); + void Pause(); + void Stop(); + void OnPointSelect(); + bool IsPointScanEnabled(); private: // AccessibilityLayerDelegate implementation: void OnDeviceScaleFactorChanged() override; void OnAnimationStep(base::TimeTicks timestamp) override; - std::unique_ptr<PointScanLayer> point_scan_layer_; + void UpdateTimeInfo(LayerAnimationInfo* animation_info, + base::TimeTicks timestamp); + void AnimateLine(base::TimeTicks timestamp); + + LayerAnimationInfo horizontal_line_layer_info_; + std::unique_ptr<PointScanLayer> horizontal_line_layer_; + LayerAnimationInfo vertical_line_layer_info_; + std::unique_ptr<PointScanLayer> vertical_line_layer_; + + PointScanState state_; }; } // namespace ash
diff --git a/ash/accessibility/point_scan_controller_unittest.cc b/ash/accessibility/point_scan_controller_unittest.cc index 49d9a13..b4021e59 100644 --- a/ash/accessibility/point_scan_controller_unittest.cc +++ b/ash/accessibility/point_scan_controller_unittest.cc
@@ -139,9 +139,6 @@ CaptureAfterImage(bounds); ComputeImageStats(); - EXPECT_EQ(3600, diff_count()); - EXPECT_EQ(6, col_diff_count()); - EXPECT_EQ(600, row_diff_count()); } } // namespace ash
diff --git a/ash/accessibility/point_scan_layer.cc b/ash/accessibility/point_scan_layer.cc index 80212cf..3b83384 100644 --- a/ash/accessibility/point_scan_layer.cc +++ b/ash/accessibility/point_scan_layer.cc
@@ -33,16 +33,38 @@ Shell::GetRootWindowForDisplayId(GetPrimaryDisplay().id()); CreateOrUpdateLayer(root_window, "PointScanning", gfx::Rect()); SetOpacity(1.0); + bounds_ = GetPrimaryDisplay().bounds(); + layer()->SetBounds(bounds_); } void PointScanLayer::StartHorizontalScanning() { - bounds_ = GetPrimaryDisplay().bounds(); - layer()->SetBounds(bounds_); + gfx::Point end = bounds_.bottom_left(); + bounds_.set_origin(line_.start); + line_.end = end; + is_moving_ = true; +} - gfx::Point start = bounds_.top_center(); - gfx::Point end = bounds_.bottom_center(); - horizontal_.start = start; - horizontal_.end = end; +void PointScanLayer::PauseHorizontalScanning() { + is_moving_ = false; +} + +void PointScanLayer::StartVerticalScanning() { + gfx::Point end = bounds_.top_right(); + bounds_.set_origin(line_.start); + line_.end = end; + is_moving_ = true; +} + +void PointScanLayer::PauseVerticalScanning() { + is_moving_ = false; +} + +gfx::Rect PointScanLayer::GetBounds() const { + return bounds_; +} + +bool PointScanLayer::IsMoving() const { + return is_moving_; } bool PointScanLayer::CanAnimate() const { @@ -64,8 +86,8 @@ flags.setColor(gfx::kGoogleBlue300); SkPath path; - path.moveTo(horizontal_.start.x(), horizontal_.start.y()); - path.lineTo(horizontal_.end.x(), horizontal_.end.y()); + path.moveTo(line_.start.x(), line_.start.y()); + path.lineTo(line_.end.x(), line_.end.y()); recorder.canvas()->DrawPath(path, flags); }
diff --git a/ash/accessibility/point_scan_layer.h b/ash/accessibility/point_scan_layer.h index 084bef6..4ce25501 100644 --- a/ash/accessibility/point_scan_layer.h +++ b/ash/accessibility/point_scan_layer.h
@@ -6,6 +6,7 @@ #define ASH_ACCESSIBILITY_POINT_SCAN_LAYER_H_ #include "ash/accessibility/accessibility_layer.h" +#include "ash/accessibility/layer_animation_info.h" #include "ash/ash_export.h" namespace ash { @@ -22,6 +23,11 @@ // an x-coordinate. // TODO(crbug/1061537): Animate the line across the screen. void StartHorizontalScanning(); + void PauseHorizontalScanning(); + void StartVerticalScanning(); + void PauseVerticalScanning(); + gfx::Rect GetBounds() const; + bool IsMoving() const; // AccessibilityLayer overrides: bool CanAnimate() const override; @@ -31,6 +37,7 @@ private: // ui:LayerDelegate overrides: void OnPaintLayer(const ui::PaintContext& context) override; + void OnLayerChange(LayerAnimationInfo* animation_info); struct Line { gfx::Point start; @@ -41,7 +48,9 @@ gfx::Rect bounds_; // The line currently being drawn. - Line horizontal_; + Line line_; + + bool is_moving_; }; } // namespace ash
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc index b36ad20..1ac89c7b 100644 --- a/ash/capture_mode/capture_mode_controller.cc +++ b/ash/capture_mode/capture_mode_controller.cc
@@ -288,6 +288,11 @@ if (capture_mode_session_) return; + if (delegate_->IsCaptureModeInitRestricted()) { + ShowDisabledNotification(); + return; + } + capture_mode_session_ = std::make_unique<CaptureModeSession>(this); }
diff --git a/ash/capture_mode/test_capture_mode_delegate.cc b/ash/capture_mode/test_capture_mode_delegate.cc index 6a42b880..bb18b23a 100644 --- a/ash/capture_mode/test_capture_mode_delegate.cc +++ b/ash/capture_mode/test_capture_mode_delegate.cc
@@ -23,6 +23,10 @@ return false; } +bool TestCaptureModeDelegate::IsCaptureModeInitRestricted() const { + return false; +} + bool TestCaptureModeDelegate::IsCaptureAllowed(const aura::Window* window, const gfx::Rect& bounds, bool for_video) const {
diff --git a/ash/capture_mode/test_capture_mode_delegate.h b/ash/capture_mode/test_capture_mode_delegate.h index 3e0c599..d9e7d0d 100644 --- a/ash/capture_mode/test_capture_mode_delegate.h +++ b/ash/capture_mode/test_capture_mode_delegate.h
@@ -22,6 +22,7 @@ void ShowScreenCaptureItemInFolder(const base::FilePath& file_path) override; void OpenScreenshotInImageEditor(const base::FilePath& file_path) override; bool Uses24HourFormat() const override; + bool IsCaptureModeInitRestricted() const override; bool IsCaptureAllowed(const aura::Window* window, const gfx::Rect& bounds, bool for_video) const override;
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 8419c3d..3350edb6 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -3548,11 +3548,11 @@ void SetUp() override { DisplayManagerTest::SetUp(); - portrait_primary->Set(ACCELEROMETER_SOURCE_SCREEN, false, - -base::kMeanGravityFloat, 0.f, 0.f); - portrait_secondary->Set(ACCELEROMETER_SOURCE_SCREEN, false, + portrait_primary->Set(ACCELEROMETER_SOURCE_SCREEN, -base::kMeanGravityFloat, + 0.f, 0.f); + portrait_secondary->Set(ACCELEROMETER_SOURCE_SCREEN, base::kMeanGravityFloat, 0.f, 0.f); - landscape_primary->Set(ACCELEROMETER_SOURCE_SCREEN, false, 0, + landscape_primary->Set(ACCELEROMETER_SOURCE_SCREEN, 0, -base::kMeanGravityFloat, 0.f); }
diff --git a/ash/display/display_prefs_unittest.cc b/ash/display/display_prefs_unittest.cc index 1446e1fe..531ab65 100644 --- a/ash/display/display_prefs_unittest.cc +++ b/ash/display/display_prefs_unittest.cc
@@ -843,19 +843,17 @@ // Open up 270 degrees to trigger tablet mode scoped_refptr<AccelerometerUpdate> update(new AccelerometerUpdate()); - update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, false, 0.0f, 0.0f, + update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, 0.0f, 0.0f, -base::kMeanGravityFloat); - update->Set(ACCELEROMETER_SOURCE_SCREEN, false, 0.0f, base::kMeanGravityFloat, - 0.0f); + update->Set(ACCELEROMETER_SOURCE_SCREEN, 0.0f, base::kMeanGravityFloat, 0.0f); TabletModeController* controller = Shell::Get()->tablet_mode_controller(); controller->OnAccelerometerUpdated(update); EXPECT_TRUE(controller->InTabletMode()); // Trigger 90 degree rotation - update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, false, - base::kMeanGravityFloat, 0.0f, 0.0f); - update->Set(ACCELEROMETER_SOURCE_SCREEN, false, base::kMeanGravityFloat, 0.0f, - 0.0f); + update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, base::kMeanGravityFloat, + 0.0f, 0.0f); + update->Set(ACCELEROMETER_SOURCE_SCREEN, base::kMeanGravityFloat, 0.0f, 0.0f); controller->OnAccelerometerUpdated(update); shell->screen_orientation_controller()->OnAccelerometerUpdated(update); EXPECT_EQ(display::Display::ROTATE_90, GetCurrentInternalDisplayRotation()); @@ -993,10 +991,9 @@ // Open up 270 degrees to trigger tablet mode scoped_refptr<AccelerometerUpdate> update(new AccelerometerUpdate()); - update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, false, 0.0f, 0.0f, + update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, 0.0f, 0.0f, -base::kMeanGravityFloat); - update->Set(ACCELEROMETER_SOURCE_SCREEN, false, 0.0f, base::kMeanGravityFloat, - 0.0f); + update->Set(ACCELEROMETER_SOURCE_SCREEN, 0.0f, base::kMeanGravityFloat, 0.0f); TabletModeController* tablet_mode_controller = Shell::Get()->tablet_mode_controller(); tablet_mode_controller->OnAccelerometerUpdated(update);
diff --git a/ash/display/screen_orientation_controller_unittest.cc b/ash/display/screen_orientation_controller_unittest.cc index 7831732b..f3b23c03 100644 --- a/ash/display/screen_orientation_controller_unittest.cc +++ b/ash/display/screen_orientation_controller_unittest.cc
@@ -80,7 +80,7 @@ void TriggerLidUpdate(const gfx::Vector3dF& lid) { scoped_refptr<AccelerometerUpdate> update(new AccelerometerUpdate()); - update->Set(ACCELEROMETER_SOURCE_SCREEN, false, lid.x(), lid.y(), lid.z()); + update->Set(ACCELEROMETER_SOURCE_SCREEN, lid.x(), lid.y(), lid.z()); Shell::Get()->screen_orientation_controller()->OnAccelerometerUpdated(update); }
diff --git a/ash/events/accessibility_event_rewriter.cc b/ash/events/accessibility_event_rewriter.cc index e55181ba..3fffc81e 100644 --- a/ash/events/accessibility_event_rewriter.cc +++ b/ash/events/accessibility_event_rewriter.cc
@@ -5,6 +5,7 @@ #include "ash/events/accessibility_event_rewriter.h" #include "ash/accessibility/accessibility_controller_impl.h" +#include "ash/accessibility/point_scan_controller.h" #include "ash/public/cpp/accessibility_event_rewriter_delegate.h" #include "ash/shell.h" #include "ui/chromeos/events/event_rewriter_chromeos.h" @@ -182,9 +183,18 @@ switch_access_key_codes_to_capture_.count(key_event->key_code()) > 0; if (capture && key_event->type() == ui::ET_KEY_PRESSED) { - SwitchAccessCommand command = - key_code_to_switch_access_command_[key_event->key_code()]; - delegate_->SendSwitchAccessCommand(command); + AccessibilityControllerImpl* accessibility_controller = + Shell::Get()->accessibility_controller(); + + if (accessibility_controller->IsPointScanEnabled()) { + PointScanController* point_scan_controller = + accessibility_controller->GetPointScanController(); + point_scan_controller->OnPointSelect(); + } else { + SwitchAccessCommand command = + key_code_to_switch_access_command_[key_event->key_code()]; + delegate_->SendSwitchAccessCommand(command); + } } return capture; }
diff --git a/ash/public/cpp/accessibility_controller.h b/ash/public/cpp/accessibility_controller.h index 7076de9..ea7a94e9 100644 --- a/ash/public/cpp/accessibility_controller.h +++ b/ash/public/cpp/accessibility_controller.h
@@ -80,8 +80,8 @@ const gfx::Rect& bounds, std::vector<std::string> actions_to_show) = 0; - // Start Switch Access point scanning - virtual void StartPointScan() = 0; + // Activate point scanning in Switch Access. + virtual void ActivatePointScan() = 0; // Set whether dictation is active. virtual void SetDictationActive(bool is_active) = 0;
diff --git a/ash/public/cpp/capture_mode_delegate.h b/ash/public/cpp/capture_mode_delegate.h index 1fe1a02..db4c9f1 100644 --- a/ash/public/cpp/capture_mode_delegate.h +++ b/ash/public/cpp/capture_mode_delegate.h
@@ -45,6 +45,10 @@ // video. virtual bool Uses24HourFormat() const = 0; + // Returns whether initiation of capture mode is restricted because of + // currently visible restricted content. + virtual bool IsCaptureModeInitRestricted() const = 0; + // Returns whether capture of the region defined by |window| and |bounds| // is currently allowed or not. virtual bool IsCaptureAllowed(const aura::Window* window,
diff --git a/ash/system/holding_space/holding_space_item_views_container.cc b/ash/system/holding_space/holding_space_item_views_container.cc index 7c96192..bdf1915b 100644 --- a/ash/system/holding_space/holding_space_item_views_container.cc +++ b/ash/system/holding_space/holding_space_item_views_container.cc
@@ -17,7 +17,6 @@ void HoldingSpaceItemViewsContainer::Reset() { model_observer_.RemoveAll(); controller_observer_.RemoveAll(); - RemoveAllHoldingSpaceItemViews(); } void HoldingSpaceItemViewsContainer::ChildPreferredSizeChanged(
diff --git a/ash/system/holding_space/holding_space_item_views_container.h b/ash/system/holding_space/holding_space_item_views_container.h index 7d22de8..5510e47 100644 --- a/ash/system/holding_space/holding_space_item_views_container.h +++ b/ash/system/holding_space/holding_space_item_views_container.h
@@ -28,12 +28,9 @@ const HoldingSpaceItemViewsContainer& other) = delete; ~HoldingSpaceItemViewsContainer() override; - // Resets the container. Called when the tray bubble starts closing - holding - // space item views depend on the `HoldingSpaceItemViewDelegate` which is - // reset when the `HoldingSpaceTrayBubble` is reset. - // This removes all children that depend on the delegate, and stops observing - // holding space model to ensure no new items are created while the bubble - // widget is being closed (which happens asynchronously). + // Resets the container. Called when the tray bubble starts closing to + // stop observing the holding space controller/model to ensure that no new + // items are created while the bubble widget is being asynchronously closed. void Reset(); virtual void AddHoldingSpaceItemView(const HoldingSpaceItem* item,
diff --git a/ash/system/holding_space/holding_space_tray_bubble.cc b/ash/system/holding_space/holding_space_tray_bubble.cc index 8901bc1..a8d27b4 100644 --- a/ash/system/holding_space/holding_space_tray_bubble.cc +++ b/ash/system/holding_space/holding_space_tray_bubble.cc
@@ -172,8 +172,9 @@ HoldingSpaceTrayBubble::~HoldingSpaceTrayBubble() { bubble_wrapper_->bubble_view()->ResetDelegate(); - // Clear container state before `delegate_` is deleted, as container views - // depend on it. + // Explicitly reset holding space item view containers so that they will stop + // observing the holding space controller/model while they are asynchronously + // destroyed. pinned_files_container_->Reset(); recent_files_container_->Reset(); }
diff --git a/ash/system/power/power_button_controller.cc b/ash/system/power/power_button_controller.cc index 4a5a79c..8db9cc4 100644 --- a/ash/system/power/power_button_controller.cc +++ b/ash/system/power/power_button_controller.cc
@@ -388,11 +388,15 @@ void PowerButtonController::OnAccelerometerUpdated( scoped_refptr<const AccelerometerUpdate> update) { - // When ChromeOS EC lid angle driver is present, there's always tablet mode + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::UNKNOWN) { + ec_lid_angle_driver_status_ = + AccelerometerReader::GetInstance()->GetECLidAngleDriverStatus(); + } + + // When ChromeOS EC lid angle driver is supported, there's always tablet mode // switch in device, so PowerButtonController doesn't need to listens to // accelerometer events. - if (update->HasLidAngleDriver(ACCELEROMETER_SOURCE_SCREEN) || - update->HasLidAngleDriver(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) { + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::SUPPORTED) { AccelerometerReader::GetInstance()->RemoveObserver(this); return; }
diff --git a/ash/system/power/power_button_controller.h b/ash/system/power/power_button_controller.h index 20a1f93..27ee782 100644 --- a/ash/system/power/power_button_controller.h +++ b/ash/system/power/power_button_controller.h
@@ -228,6 +228,12 @@ // True if the device has tablet mode switch. bool has_tablet_mode_switch_ = false; + // When ChromeOS EC lid angle driver is supported, there's always tablet mode + // switch in device, so PowerButtonController doesn't need to listens to + // accelerometer events. + ECLidAngleDriverStatus ec_lid_angle_driver_status_ = + ECLidAngleDriverStatus::UNKNOWN; + // True if the screen was off when the power button was pressed. bool screen_off_when_power_button_down_ = false;
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc index 6bebed3..4bfeefa 100644 --- a/ash/test/ash_test_helper.cc +++ b/ash/test/ash_test_helper.cc
@@ -6,6 +6,7 @@ #include <algorithm> +#include "ash/accelerometer/accelerometer_reader.h" #include "ash/app_list/test/app_list_test_helper.h" #include "ash/assistant/assistant_controller_impl.h" #include "ash/assistant/test/test_assistant_service.h" @@ -301,6 +302,10 @@ gesture_config->set_max_touch_down_duration_for_click_in_ms(800); gesture_config->set_long_press_time_in_ms(1000); gesture_config->set_max_touch_move_in_pixels_for_click(5); + + // Fake the |ec_lid_angle_driver_status_| in the unittests. + AccelerometerReader::GetInstance()->SetECLidAngleDriverStatusForTesting( + ECLidAngleDriverStatus::NOT_SUPPORTED); } display::Display AshTestHelper::GetSecondaryDisplay() const {
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.cc b/ash/wm/tablet_mode/tablet_mode_controller.cc index ad1597d..b280d43 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller.cc
@@ -48,6 +48,7 @@ #include "ui/compositor/layer_animation_sequence.h" #include "ui/display/display.h" #include "ui/display/manager/display_manager.h" +#include "ui/display/tablet_state.h" #include "ui/events/devices/device_data_manager.h" #include "ui/events/devices/input_device.h" #include "ui/events/event.h" @@ -492,8 +493,8 @@ void TabletModeController::MaybeObserveBoundsAnimation(aura::Window* window) { StopObservingAnimation(/*record_stats=*/false, /*delete_screenshot=*/false); - if (tablet_state_.state() != chromeos::TabletState::kEnteringTabletMode && - tablet_state_.state() != chromeos::TabletState::kExitingTabletMode) { + if (tablet_state_.state() != display::TabletState::kEnteringTabletMode && + tablet_state_.state() != display::TabletState::kExitingTabletMode) { return; } @@ -629,12 +630,15 @@ void TabletModeController::OnAccelerometerUpdated( scoped_refptr<const AccelerometerUpdate> update) { + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::UNKNOWN) { + ec_lid_angle_driver_status_ = + AccelerometerReader::GetInstance()->GetECLidAngleDriverStatus(); + } + // When ChromeOS EC lid angle driver is present, EC can handle lid angle // calculation, thus Chrome side lid angle calculation is disabled. In this // case, TabletModeController no longer listens to accelerometer events. - if (update->HasLidAngleDriver(ACCELEROMETER_SOURCE_SCREEN) || - update->HasLidAngleDriver(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) { - ec_lid_angle_driver_present_ = true; + if (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::SUPPORTED) { // Reset lid angle that might be calculated before lid angle driver is // read. lid_angle_ = 0.f; @@ -791,7 +795,7 @@ animating_layer_->GetCompositor()->RequestNewThroughputTracker(); transition_tracker_->Start(metrics_util::ForSmoothness(base::BindRepeating( &ReportTrasitionSmoothness, - tablet_state_.state() == chromeos::TabletState::kEnteringTabletMode))); + tablet_state_.state() == display::TabletState::kEnteringTabletMode))); return; } @@ -837,7 +841,7 @@ DeleteScreenshot(); if (should_enable) { - tablet_state_.SetState(chromeos::TabletState::kEnteringTabletMode); + tablet_state_.SetState(display::TabletState::kEnteringTabletMode); // Take a screenshot if there is a top window that will get animated. // TODO(sammiequon): Handle the case where the top window is not on the @@ -867,7 +871,7 @@ FinishInitTabletMode(); } } else { - tablet_state_.SetState(chromeos::TabletState::kExitingTabletMode); + tablet_state_.SetState(display::TabletState::kExitingTabletMode); // We may have entered tablet mode, then tried to exit before the screenshot // was taken. In this case |tablet_mode_window_manager_| will be null. @@ -883,7 +887,7 @@ base::RecordAction(base::UserMetricsAction("Touchview_Disabled")); RecordTabletModeUsageInterval(TABLET_MODE_INTERVAL_ACTIVE); - tablet_state_.SetState(chromeos::TabletState::kInClamshellMode); + tablet_state_.SetState(display::TabletState::kInClamshellMode); for (auto& observer : tablet_mode_observers_) observer.OnTabletModeEnded(); VLOG(1) << "Exit tablet mode."; @@ -1127,7 +1131,7 @@ } void TabletModeController::FinishInitTabletMode() { - DCHECK_EQ(chromeos::TabletState::kEnteringTabletMode, tablet_state_.state()); + DCHECK_EQ(display::TabletState::kEnteringTabletMode, tablet_state_.state()); for (auto& observer : tablet_mode_observers_) observer.OnTabletModeStarting(); @@ -1136,7 +1140,7 @@ base::RecordAction(base::UserMetricsAction("Touchview_Enabled")); RecordTabletModeUsageInterval(TABLET_MODE_INTERVAL_INACTIVE); - tablet_state_.SetState(chromeos::TabletState::kInTabletMode); + tablet_state_.SetState(display::TabletState::kInTabletMode); for (auto& observer : tablet_mode_observers_) observer.OnTabletModeStarted(); @@ -1300,7 +1304,8 @@ const bool can_enter_tablet_mode = IsBoardTypeMarkedAsTabletCapable() && HasActiveInternalDisplay() && - (ec_lid_angle_driver_present_ || have_seen_accelerometer_data_); + (ec_lid_angle_driver_status_ == ECLidAngleDriverStatus::SUPPORTED || + have_seen_accelerometer_data_); return !has_internal_pointing_device_ && can_enter_tablet_mode && chromeos::IsRunningAsSystemCompositor();
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.h b/ash/wm/tablet_mode/tablet_mode_controller.h index 4e5455c..daac01d 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller.h +++ b/ash/wm/tablet_mode/tablet_mode_controller.h
@@ -346,10 +346,11 @@ // present, convertible device cannot see accelerometer data. bool have_seen_accelerometer_data_ = false; - // True if ChromeOS EC lid angle driver is present. In this case Chrome does - // not calculate lid angle itself, but will reply on the tablet-mode flag that - // EC sends to decide if the device should in tablet mode. - bool ec_lid_angle_driver_present_ = false; + // If ECLidAngleDriverStatus is supported, Chrome does not calculate lid angle + // itself, but will reply on the tablet-mode flag that EC sends to decide if + // the device should in tablet mode. + ECLidAngleDriverStatus ec_lid_angle_driver_status_ = + ECLidAngleDriverStatus::UNKNOWN; // Whether the lid angle can be detected by browser. If it's true, the device // is a convertible device (both screen acclerometer and keyboard acclerometer
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_test_api.cc b/ash/wm/tablet_mode/tablet_mode_controller_test_api.cc index 2e5f9a5..aad77ff4 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller_test_api.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller_test_api.cc
@@ -90,7 +90,7 @@ void TabletModeControllerTestApi::TriggerLidUpdate(const gfx::Vector3dF& lid) { scoped_refptr<AccelerometerUpdate> update(new AccelerometerUpdate()); - update->Set(ACCELEROMETER_SOURCE_SCREEN, false, lid.x(), lid.y(), lid.z()); + update->Set(ACCELEROMETER_SOURCE_SCREEN, lid.x(), lid.y(), lid.z()); tablet_mode_controller_->OnAccelerometerUpdated(update); } @@ -98,9 +98,9 @@ const gfx::Vector3dF& base, const gfx::Vector3dF& lid) { scoped_refptr<AccelerometerUpdate> update(new AccelerometerUpdate()); - update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, false, - base.x(), base.y(), base.z()); - update->Set(ACCELEROMETER_SOURCE_SCREEN, false, lid.x(), lid.y(), lid.z()); + update->Set(ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, base.x(), base.y(), + base.z()); + update->Set(ACCELEROMETER_SOURCE_SCREEN, lid.x(), lid.y(), lid.z()); tablet_mode_controller_->OnAccelerometerUpdated(update); }
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc index 617337d..06738ac 100644 --- a/base/allocator/partition_allocator/partition_bucket.cc +++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -16,6 +16,7 @@ #include "base/allocator/partition_allocator/partition_direct_map_extent.h" #include "base/allocator/partition_allocator/partition_oom.h" #include "base/allocator/partition_allocator/partition_page.h" +#include "base/allocator/partition_allocator/partition_tag.h" #include "base/allocator/partition_allocator/partition_tag_bitmap.h" #include "base/check.h" #include "build/build_config.h" @@ -96,7 +97,7 @@ reinterpret_cast<PartitionFreelistEntry*>(slot)); auto* next_entry = reinterpret_cast<PartitionFreelistEntry*>(slot); - next_entry->next = PartitionFreelistEntry::Encode(nullptr); + next_entry->SetNext(nullptr); PA_DCHECK(!metadata->bucket.active_slot_spans_head); PA_DCHECK(!metadata->bucket.empty_slot_spans_head); @@ -476,10 +477,10 @@ freelist_pointer += size; auto* next_entry = reinterpret_cast<PartitionFreelistEntry*>(freelist_pointer); - entry->next = PartitionFreelistEntry::Encode(next_entry); + entry->SetNext(next_entry); entry = next_entry; } - entry->next = PartitionFreelistEntry::Encode(nullptr); + entry->SetNext(nullptr); } else { slot_span->SetFreelistHead(nullptr); }
diff --git a/base/allocator/partition_allocator/partition_freelist_entry.h b/base/allocator/partition_allocator/partition_freelist_entry.h index ce3763b..95c6110d 100644 --- a/base/allocator/partition_allocator/partition_freelist_entry.h +++ b/base/allocator/partition_allocator/partition_freelist_entry.h
@@ -28,6 +28,13 @@ return reinterpret_cast<EncodedPartitionFreelistEntry*>(Transform(ptr)); } + ALWAYS_INLINE void SetNext(PartitionFreelistEntry* ptr) { + PA_DCHECK(!ptr || + (reinterpret_cast<uintptr_t>(this) & kSuperPageBaseMask) == + (reinterpret_cast<uintptr_t>(ptr) & kSuperPageBaseMask)); + next = Encode(ptr); + } + private: friend struct EncodedPartitionFreelistEntry; static ALWAYS_INLINE void* Transform(void* ptr) {
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h index f624e19..b92964b 100644 --- a/base/allocator/partition_allocator/partition_page.h +++ b/base/allocator/partition_allocator/partition_page.h
@@ -15,7 +15,6 @@ #include "base/allocator/partition_allocator/partition_alloc_forward.h" #include "base/allocator/partition_allocator/partition_bucket.h" #include "base/allocator/partition_allocator/partition_freelist_entry.h" -#include "base/allocator/partition_allocator/partition_tag.h" #include "base/allocator/partition_allocator/partition_tag_bitmap.h" #include "base/allocator/partition_allocator/random.h" #include "base/check_op.h" @@ -419,7 +418,7 @@ PA_DCHECK(!freelist_head || ptr != EncodedPartitionFreelistEntry::Decode(freelist_head->next)); auto* entry = static_cast<internal::PartitionFreelistEntry*>(ptr); - entry->next = internal::PartitionFreelistEntry::Encode(freelist_head); + entry->SetNext(freelist_head); SetFreelistHead(entry); --num_allocated_slots; if (UNLIKELY(num_allocated_slots <= 0)) {
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index 536d85fd..b176024 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -129,7 +129,7 @@ head = entry; back = entry; } else { - back->next = internal::PartitionFreelistEntry::Encode(entry); + back->SetNext(entry); back = entry; } num_new_entries++; @@ -140,7 +140,7 @@ slot_span->SetFreelistHead(head); if (back) - back->next = internal::PartitionFreelistEntry::Encode(nullptr); + back->SetNext(nullptr); PA_DCHECK(num_new_entries == num_slots - slot_span->num_allocated_slots); // Discard the memory.
diff --git a/base/allocator/partition_allocator/thread_cache.h b/base/allocator/partition_allocator/thread_cache.h index e91c525a..207f256 100644 --- a/base/allocator/partition_allocator/thread_cache.h +++ b/base/allocator/partition_allocator/thread_cache.h
@@ -246,7 +246,7 @@ PA_DCHECK(bucket.count != 0 || bucket.freelist_head == nullptr); auto* entry = reinterpret_cast<PartitionFreelistEntry*>(address); - entry->next = PartitionFreelistEntry::Encode(bucket.freelist_head); + entry->next = internal::PartitionFreelistEntry::Encode(bucket.freelist_head); bucket.freelist_head = entry; bucket.count++;
diff --git a/base/android/java/src/org/chromium/base/UnownedUserDataHost.java b/base/android/java/src/org/chromium/base/UnownedUserDataHost.java index 2f1d495a..7a9e437 100644 --- a/base/android/java/src/org/chromium/base/UnownedUserDataHost.java +++ b/base/android/java/src/org/chromium/base/UnownedUserDataHost.java
@@ -248,6 +248,11 @@ public void destroy() { mThreadChecker.assertOnValidThread(); + if (isDestroyed()) { + // Protect against potential races. + return; + } + // Create a shallow copy of all keys to ensure each held object can safely remove itself // from the map while iterating over their keys. Set<UnownedUserDataKey<?>> keys = new HashSet<>(mUnownedUserDataMap.keySet());
diff --git a/base/no_destructor_unittest.cc b/base/no_destructor_unittest.cc index 54ac1b53..5c83366 100644 --- a/base/no_destructor_unittest.cc +++ b/base/no_destructor_unittest.cc
@@ -31,6 +31,16 @@ NoDestructor<CheckOnDestroy> destructor_should_not_run; } +struct UncopyableUnmovable { + UncopyableUnmovable() = default; + explicit UncopyableUnmovable(int value) : value(value) {} + + UncopyableUnmovable(const UncopyableUnmovable&) = delete; + UncopyableUnmovable& operator=(const UncopyableUnmovable&) = delete; + + int value = 1; +}; + struct CopyOnly { CopyOnly() = default; @@ -55,6 +65,14 @@ ForwardingTestStruct(const CopyOnly&, MoveOnly&&) {} }; +TEST(NoDestructorTest, UncopyableUnmovable) { + static NoDestructor<UncopyableUnmovable> default_constructed; + EXPECT_EQ(1, default_constructed->value); + + static NoDestructor<UncopyableUnmovable> constructed_with_arg(-1); + EXPECT_EQ(-1, constructed_with_arg->value); +} + TEST(NoDestructorTest, ForwardsArguments) { CopyOnly copy_only; MoveOnly move_only;
diff --git a/base/values.cc b/base/values.cc index 892da8e..c1b64b6 100644 --- a/base/values.cc +++ b/base/values.cc
@@ -727,6 +727,10 @@ return dict().empty(); } +void Value::DictClear() { + dict().clear(); +} + void Value::MergeDictionary(const Value* dictionary) { for (const auto& pair : dictionary->dict()) { const auto& key = pair.first; @@ -1030,7 +1034,7 @@ } void DictionaryValue::Clear() { - dict().clear(); + DictClear(); } Value* DictionaryValue::Set(StringPiece path, std::unique_ptr<Value> in_value) {
diff --git a/base/values.h b/base/values.h index 0f3e9b9..d3ef9abb 100644 --- a/base/values.h +++ b/base/values.h
@@ -463,10 +463,11 @@ dict_iterator_proxy DictItems(); const_dict_iterator_proxy DictItems() const; - // Returns the size of the dictionary, and if the dictionary is empty. - // Note: These CHECK that type() is Type::DICTIONARY. + // Returns the size of the dictionary, if the dictionary is empty, and clears + // the dictionary. Note: These CHECK that type() is Type::DICTIONARY. size_t DictSize() const; bool DictEmpty() const; + void DictClear(); // Merge |dictionary| into this value. This is done recursively, i.e. any // sub-dictionaries will be merged as well. In case of key collisions, the @@ -597,6 +598,7 @@ bool empty() const { return dict().empty(); } // Clears any current contents of this dictionary. + // DEPRECATED, use Value::DictClear() instead. void Clear(); // Sets the Value associated with the given path starting from this object.
diff --git a/base/values_unittest.cc b/base/values_unittest.cc index 20606e3..d13a999d 100644 --- a/base/values_unittest.cc +++ b/base/values_unittest.cc
@@ -1467,7 +1467,7 @@ EXPECT_FALSE(dict.empty()); EXPECT_FALSE(dict.DictEmpty()); EXPECT_EQ(1U, dict.DictSize()); - dict.Clear(); + dict.DictClear(); EXPECT_TRUE(dict.empty()); EXPECT_TRUE(dict.DictEmpty()); EXPECT_EQ(0U, dict.DictSize());
diff --git a/build/android/pylib/base/result_sink.py b/build/android/pylib/base/result_sink.py index 319b3b2..017784b 100644 --- a/build/android/pylib/base/result_sink.py +++ b/build/android/pylib/base/result_sink.py
@@ -10,7 +10,6 @@ import requests # pylint: disable=import-error # Comes from luci/resultdb/pbutil/test_result.go -# Slightly smaller to allow prepending <pre></pres> MAX_REPORT_LEN = 4 * 1024 # Maps base_test_results to the luci test-result.proto.
diff --git a/build/chromeos/create_test_runner_script.py b/build/chromeos/create_test_runner_script.py index 60b7e67c..91f4096 100755 --- a/build/chromeos/create_test_runner_script.py +++ b/build/chromeos/create_test_runner_script.py
@@ -12,7 +12,7 @@ import sys SCRIPT_TEMPLATE = """\ -#!/usr/bin/env python +#!/usr/bin/env vpython # # This file was generated by build/chromeos/create_test_runner_script.py @@ -24,16 +24,16 @@ def ResolvePath(path): return os.path.abspath(os.path.join(script_directory, path)) - vm_test_script = os.path.abspath( - os.path.join(script_directory, '{vm_test_script}')) + test_env_py = ResolvePath('{test_env_py}') + vm_test_script = ResolvePath('{vm_test_script}') vm_args = {vm_test_args} path_args = {vm_test_path_args} for arg, path in path_args: vm_args.extend([arg, ResolvePath(path)]) - os.execv(vm_test_script, - [vm_test_script] + vm_args + sys.argv[1:]) + os.execv(test_env_py, + [test_env_py, vm_test_script] + vm_args + sys.argv[1:]) if __name__ == '__main__': sys.exit(main()) @@ -61,6 +61,11 @@ run_test_path = RelativizePathToScript( os.path.join(os.path.dirname(__file__), 'test_runner.py')) + test_env_path = RelativizePathToScript( + os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(__file__))), + 'testing', 'test_env.py')) + vm_test_args = [] if args.test_exe: vm_test_args.extend([ @@ -110,6 +115,7 @@ with open(args.script_output_path, 'w') as script: script.write( SCRIPT_TEMPLATE.format( + test_env_py=test_env_path, vm_test_script=run_test_path, vm_test_args=str(vm_test_args), vm_test_path_args=str(vm_test_path_args)))
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index e3da6028..dc646377 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -739,10 +739,12 @@ data_deps = [] } + executable = "//testing/test_env.py" + if (defined(android_test_runner_script)) { - executable = android_test_runner_script + _runner_script = android_test_runner_script } else { - executable = "//build/android/test_runner.py" + _runner_script = "//build/android/test_runner.py" } deps = [] @@ -753,9 +755,10 @@ if (defined(invoker.data_deps)) { data_deps = invoker.data_deps } - data = [] + data = [ "//testing/test_env.py" ] executable_args = [ + "@WrappedPath(" + rebase_path(_runner_script, root_build_dir) + ")", _test_type, "--output-directory", "@WrappedPath(.)",
diff --git a/build/config/chromeos/rules.gni b/build/config/chromeos/rules.gni index 7c367f43..ccd16e6 100644 --- a/build/config/chromeos/rules.gni +++ b/build/config/chromeos/rules.gni
@@ -112,6 +112,7 @@ data = [ "//.vpython", + "//testing/test_env.py", # We use android test-runner's results libs to construct gtest output # json.
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index bb03075..02f11ef 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20201028.4.1 +0.20201029.0.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index bb03075..02f11ef 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20201028.4.1 +0.20201029.0.1
diff --git a/chrome/VERSION b/chrome/VERSION index e781d2d..028d79e 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=88 MINOR=0 -BUILD=4307 +BUILD=4308 PATCH=0
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index 97e6e42..18eb36d 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -51,7 +51,6 @@ "java/res/drawable-hdpi/btn_toolbar_home.png", "java/res/drawable-hdpi/btn_toolbar_reload.png", "java/res/drawable-hdpi/chrome_sync_logo.png", - "java/res/drawable-hdpi/contextual_search_bar_background.9.png", "java/res/drawable-hdpi/contextual_search_promo_ripple.9.png", "java/res/drawable-hdpi/cvc_icon.png", "java/res/drawable-hdpi/cvc_icon_amex.png", @@ -198,7 +197,6 @@ "java/res/drawable-mdpi/btn_toolbar_home.png", "java/res/drawable-mdpi/btn_toolbar_reload.png", "java/res/drawable-mdpi/chrome_sync_logo.png", - "java/res/drawable-mdpi/contextual_search_bar_background.9.png", "java/res/drawable-mdpi/contextual_search_promo_ripple.9.png", "java/res/drawable-mdpi/cvc_icon.png", "java/res/drawable-mdpi/cvc_icon_amex.png", @@ -329,7 +327,6 @@ "java/res/drawable-xhdpi/btn_toolbar_home.png", "java/res/drawable-xhdpi/btn_toolbar_reload.png", "java/res/drawable-xhdpi/chrome_sync_logo.png", - "java/res/drawable-xhdpi/contextual_search_bar_background.9.png", "java/res/drawable-xhdpi/contextual_search_promo_ripple.9.png", "java/res/drawable-xhdpi/cvc_icon.png", "java/res/drawable-xhdpi/cvc_icon_amex.png", @@ -438,7 +435,6 @@ "java/res/drawable-xxhdpi/btn_toolbar_home.png", "java/res/drawable-xxhdpi/btn_toolbar_reload.png", "java/res/drawable-xxhdpi/chrome_sync_logo.png", - "java/res/drawable-xxhdpi/contextual_search_bar_background.9.png", "java/res/drawable-xxhdpi/contextual_search_promo_ripple.9.png", "java/res/drawable-xxhdpi/cvc_icon.png", "java/res/drawable-xxhdpi/cvc_icon_amex.png", @@ -546,7 +542,6 @@ "java/res/drawable-xxxhdpi/btn_toolbar_home.png", "java/res/drawable-xxxhdpi/btn_toolbar_reload.png", "java/res/drawable-xxxhdpi/chrome_sync_logo.png", - "java/res/drawable-xxxhdpi/contextual_search_bar_background.9.png", "java/res/drawable-xxxhdpi/contextual_search_promo_ripple.9.png", "java/res/drawable-xxxhdpi/cvc_icon.png", "java/res/drawable-xxxhdpi/cvc_icon_amex.png",
diff --git a/chrome/android/java/res/drawable-hdpi/contextual_search_bar_background.9.png b/chrome/android/java/res/drawable-hdpi/contextual_search_bar_background.9.png deleted file mode 100644 index ce150b0..0000000 --- a/chrome/android/java/res/drawable-hdpi/contextual_search_bar_background.9.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/contextual_search_bar_background.9.png b/chrome/android/java/res/drawable-mdpi/contextual_search_bar_background.9.png deleted file mode 100644 index b769eda8..0000000 --- a/chrome/android/java/res/drawable-mdpi/contextual_search_bar_background.9.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/contextual_search_bar_background.9.png b/chrome/android/java/res/drawable-xhdpi/contextual_search_bar_background.9.png deleted file mode 100644 index 52a4a44..0000000 --- a/chrome/android/java/res/drawable-xhdpi/contextual_search_bar_background.9.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/contextual_search_bar_background.9.png b/chrome/android/java/res/drawable-xxhdpi/contextual_search_bar_background.9.png deleted file mode 100644 index 5d9706e..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/contextual_search_bar_background.9.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/contextual_search_bar_background.9.png b/chrome/android/java/res/drawable-xxxhdpi/contextual_search_bar_background.9.png deleted file mode 100644 index 4d07fc2..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/contextual_search_bar_background.9.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/layout/new_tab_page_layout.xml b/chrome/android/java/res/layout/new_tab_page_layout.xml index 23876b9..7a66aaf 100644 --- a/chrome/android/java/res/layout/new_tab_page_layout.xml +++ b/chrome/android/java/res/layout/new_tab_page_layout.xml
@@ -84,6 +84,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="12dp" + android:layout_marginBottom="12dp" android:layout="@layout/video_tutorial_iph_card" android:inflatedId="@+id/video_iph_card"/>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index ab1cf0d9..409ba1f89 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -86,7 +86,6 @@ <dimen name="contextual_search_bubble_y_inset">-3dp</dimen> <!-- Overlay panel dimensions --> - <dimen name="overlay_panel_bar_height_legacy">56dp</dimen> <dimen name="overlay_panel_bar_height">70dp</dimen> <!-- Preview tab dimensions -->
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java index 4e580c6..0ee0ca3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java
@@ -30,7 +30,6 @@ import org.chromium.chrome.browser.compositor.layouts.eventfilter.ScrollDirection; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper; import org.chromium.content_public.browser.SelectionPopupController; @@ -387,12 +386,6 @@ return mPanelShown; } - /** @return Whether we're using the new Overlay layout feature. */ - public static boolean isNewLayout() { - return ChromeFeatureList.isInitialized() - && ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT); - } - // ============================================================================================ // ActivityStateListener // ============================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java index 019cc031..cf22f3d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
@@ -58,16 +58,14 @@ */ private static final float BASE_PAGE_BRIGHTNESS_STATE_MAXIMIZED = .4f; - /** The opacity of the arrow icon when the Panel is peeking. */ - private static final float ARROW_ICON_OPACITY_STATE_PEEKED = 1.f; - - /** The opacity of the arrow icon when the Panel is expanded. */ - private static final float ARROW_ICON_OPACITY_STATE_EXPANDED = 0.f; + // ------------------------------------------------------------------------- + // TODO(donnd): crbug.com/1143472 - The arrow and close buttons from the + // legacy UI are no longer used. Remove code related to these buttons here + // and in the native interface. + // + /** The opacity of the arrow icon. */ private static final float ARROW_ICON_OPACITY_TRANSPARENT = 0.f; - /** The opacity of the arrow icon when the Panel is maximized. */ - private static final float ARROW_ICON_OPACITY_STATE_MAXIMIZED = 0.f; - /** The rotation of the arrow icon. */ private static final float ARROW_ICON_ROTATION = -90.f; @@ -91,6 +89,7 @@ /** The id of the close icon drawable. */ public static final int CLOSE_ICON_DRAWABLE_ID = R.drawable.btn_close; + // ------------------------------------------------------------------------- /** The height of the Progress Bar in dps. */ private static final float PROGRESS_BAR_HEIGHT_DP = 2.f; @@ -150,8 +149,7 @@ mProgressBarHeight = PROGRESS_BAR_HEIGHT_DP; mBarBorderHeight = BAR_BORDER_HEIGHT_DP; - int bar_height_dimen = OverlayPanel.isNewLayout() ? R.dimen.overlay_panel_bar_height - : R.dimen.overlay_panel_bar_height_legacy; + int bar_height_dimen = R.dimen.overlay_panel_bar_height; mBarHeight = mContext.getResources().getDimension(bar_height_dimen) * mPxToDp; final Resources resources = mContext.getResources(); @@ -415,8 +413,6 @@ private boolean mIsBarBorderVisible; private float mBarBorderHeight; - private float mArrowIconOpacity; - private float mCloseIconOpacity; private float mCloseIconWidth; @@ -488,7 +484,7 @@ * @return The opacity of the arrow icon. */ public float getArrowIconOpacity() { - return OverlayPanel.isNewLayout() ? ARROW_ICON_OPACITY_TRANSPARENT : mArrowIconOpacity; + return ARROW_ICON_OPACITY_TRANSPARENT; } /** @@ -966,9 +962,6 @@ // Bar border. mIsBarBorderVisible = false; - // Arrow Icon. - mArrowIconOpacity = ARROW_ICON_OPACITY_STATE_PEEKED; - // Close icon opacity. mCloseIconOpacity = CLOSE_ICON_OPACITY_STATE_PEEKED; @@ -1008,12 +1001,6 @@ float fadingOutPercentage = Math.min(percentage, .5f) / .5f; float fadingInPercentage = Math.max(percentage - .5f, 0.f) / .5f; - // Arrow Icon. - mArrowIconOpacity = MathUtils.interpolate( - ARROW_ICON_OPACITY_STATE_PEEKED, - ARROW_ICON_OPACITY_STATE_EXPANDED, - fadingOutPercentage); - // Close Icon. mCloseIconOpacity = MathUtils.interpolate( CLOSE_ICON_OPACITY_STATE_PEEKED, @@ -1056,9 +1043,6 @@ // Bar border. mIsBarBorderVisible = true; - // Arrow Icon. - mArrowIconOpacity = ARROW_ICON_OPACITY_STATE_MAXIMIZED; - // Close Icon. mCloseIconOpacity = CLOSE_ICON_OPACITY_STATE_MAXIMIZED;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java index 3375bccc..c055d2e1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java
@@ -17,7 +17,6 @@ import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation; import org.chromium.chrome.browser.contextualsearch.QuickActionCategory; import org.chromium.chrome.browser.contextualsearch.ResolvedSearchTerm.CardTag; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; @@ -236,12 +235,6 @@ public void onUpdateFromPeekToExpand(float percentage) { mExpandedPercent = percentage; - // If there is a quick action, the divider line's appearance was animated when the quick - // action was set. - if (!getQuickActionControl().hasQuickAction() - && !ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - mDividerLineVisibilityPercentage = percentage; - } getImageControl().onUpdateFromPeekToExpand(percentage); mCaptionControl.onUpdateFromPeekToExpand(percentage); mSearchTermControl.onUpdateFromPeekToExpand(percentage); @@ -259,7 +252,6 @@ mQuickActionControl.reset(); mContextControl.setContextDetails(selection, end); resetSearchBarContextOpacity(); - animateDividerLine(false); } /** @@ -286,10 +278,6 @@ mQuickActionControl.reset(); mSearchTermControl.setSearchTerm(searchTerm); resetSearchBarTermOpacity(); - - // If the panel is expanded, the divider line should not be hidden. This may happen if the - // panel is opened before the search term is resolved. - if (mExpandedPercent == TRANSPARENT_OPACITY) animateDividerLine(false); } /** @@ -376,7 +364,6 @@ // regular caption? mCaptionControl.setCaption(mQuickActionControl.getCaption()); mImageControl.setCardIconResourceId(mQuickActionControl.getIconResId()); - animateDividerLine(true); } } @@ -455,24 +442,6 @@ } } - /** - * Animates the appearance or disappearance of the divider line. - * @param visible Whether the divider line should be made visible. - */ - private void animateDividerLine(boolean visible) { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) return; - - float endValue = visible ? FULL_OPACITY : TRANSPARENT_OPACITY; - if (mDividerLineVisibilityPercentage == endValue) return; - if (mDividerLineVisibilityAnimation != null) mDividerLineVisibilityAnimation.cancel(); - mDividerLineVisibilityAnimation = CompositorAnimator.ofFloat( - mContextualSearchPanel.getAnimationHandler(), mDividerLineVisibilityPercentage, - endValue, OverlayPanelAnimation.BASE_ANIMATION_DURATION_MS, null); - mDividerLineVisibilityAnimation.addUpdateListener( - animator -> mDividerLineVisibilityPercentage = animator.getAnimatedValue()); - mDividerLineVisibilityAnimation.start(); - } - // ============================================================================================ // Touch Highlight // ============================================================================================ @@ -509,44 +478,14 @@ * @return The x-offset of the touch highlight in pixels. */ public float getTouchHighlightXOffsetPx() { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - return mTouchHighlightXOffsetPx; - } - - if (mWasDividerVisibleOnTouch - && ((mWasTouchOnEndButton && !LocalizationUtils.isLayoutRtl()) - || (!mWasTouchOnEndButton && LocalizationUtils.isLayoutRtl()))) { - // If the touch was on the end button in LTR, offset the touch highlight so that it - // starts at the beginning of the end button. - // If the touch was not on the end button in RTL, offset the touch highlight so that it - // starts after the end button. - return getDividerLineXOffset() + getDividerLineWidth(); - } - - return 0; + return mTouchHighlightXOffsetPx; } /** * @return The width of the touch highlight in pixels. */ public float getTouchHighlightWidthPx() { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - return mTouchHighlightWidthPx; - } - - if (mWasDividerVisibleOnTouch) { - // The touch was on the end button so the touch highlight should cover the end button. - if (mWasTouchOnEndButton) return mEndButtonWidth; - - // The touch was not on the end button so the touch highlight should cover everything - // except the end button. - return mContextualSearchPanel.getContentViewWidthPx() - mEndButtonWidth - - getDividerLineWidth(); - } - - // If the divider line wasn't visible when the Bar was touched, the touch highlight covers - // the entire Bar. - return mContextualSearchPanel.getContentViewWidthPx(); + return mTouchHighlightWidthPx; } /** @@ -571,8 +510,6 @@ * @param xPx The x-coordinate of a touch location, in pixels. */ private void classifyTouchLocation(float xPx) { - assert ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT); - // There are 3 cases: // 1) The whole Bar (without any icons) // 2) The Bar minus icon (when the icon is present) @@ -619,11 +556,7 @@ // highlight should not be shown. if (!mContextualSearchPanel.isPeeking() && !mCanPromoteToNewTab) return; - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - classifyTouchLocation(x); - } else { - mWasDividerVisibleOnTouch = getDividerLineVisibilityPercentage() > TRANSPARENT_OPACITY; - } + classifyTouchLocation(x); mTouchHighlightVisible = true; // The touch highlight animation is used to ensure the touch highlight is visible for at
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java index 88295a7..e9961e87 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java
@@ -16,7 +16,6 @@ import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelTextViewInflater; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; @@ -92,10 +91,7 @@ public ContextualSearchCaptionControl(OverlayPanel panel, Context context, ViewGroup container, DynamicResourceLoader resourceLoader, boolean shouldShowExpandedCaption) { super(panel, R.layout.contextual_search_caption_view, R.id.contextual_search_caption_view, - context, container, resourceLoader, - (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT) - ? R.dimen.contextual_search_end_padding - : R.dimen.contextual_search_padded_button_width), + context, container, resourceLoader, R.dimen.contextual_search_end_padding, R.dimen.contextual_search_padded_button_width); mShouldShowExpandedCaption = shouldShowExpandedCaption; } @@ -131,56 +127,9 @@ @Override public void onUpdateFromPeekToExpand(float percentage) { super.onUpdateFromPeekToExpand(percentage); - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - if (mHasPeekingCaption) { - if (mTransitionAnimator != null) mTransitionAnimator.cancel(); - mAnimationPercentage = 1.f - percentage; - } - return; - } - - // ChromeFeatureList.OVERLAY_NEW_LAYOUT not enabled. - if (!mShouldShowExpandedCaption) { - if (mHasPeekingCaption) { - if (mTransitionAnimator != null) mTransitionAnimator.cancel(); - mAnimationPercentage = 1.f - percentage; - } - return; - } - if (mHasPeekingCaption) { - if (percentage < EXPANDED_CAPTION_THRESHOLD && mShowingExpandedCaption) { - // Start showing the peeking caption again. - mShowingExpandedCaption = false; - mCaption.setText(mPeekingCaptionText); - invalidate(); - } else if (percentage >= EXPANDED_CAPTION_THRESHOLD && !mShowingExpandedCaption) { - // Start showing the expanded caption. - mShowingExpandedCaption = true; - mCaption.setText(EXPANED_CAPTION_ID); - invalidate(); - } - - // If the peeking caption gets set while the bar is expanding, mAnimationPercentage - // will stop getting updated. Set mAnimationPercentage to its complete value. - mAnimationPercentage = ANIMATION_PERCENTAGE_COMPLETE; - } else { - // If the expanded caption is not showing, set the caption text to the expanded - // caption. - if (!mShowingExpandedCaption && percentage > 0.f) { - mShowingExpandedCaption = true; - // Inflate the caption view if it has not already been inflated - if (mCaption == null) { - inflate(); - } - - mCaption.setText(EXPANED_CAPTION_ID); - invalidate(); - show(); - } - - mAnimationPercentage = percentage; - if (mAnimationPercentage == ANIMATION_PERCENTAGE_ZERO) mShowingExpandedCaption = false; + if (mTransitionAnimator != null) mTransitionAnimator.cancel(); + mAnimationPercentage = 1.f - percentage; } } @@ -188,15 +137,8 @@ * Hides the caption. */ public void hide() { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - mIsVisible = false; - mAnimationPercentage = ANIMATION_PERCENTAGE_ZERO; - } else { - if (!mShowingExpandedCaption) { - mIsVisible = false; - mAnimationPercentage = ANIMATION_PERCENTAGE_ZERO; - } - } + mIsVisible = false; + mAnimationPercentage = ANIMATION_PERCENTAGE_ZERO; mHasPeekingCaption = false; } @@ -264,12 +206,7 @@ if (mDidCapture) return; mDidCapture = true; - - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - animateTransitionIn(); - } else if (!mShowingExpandedCaption) { - animateTransitionIn(); - } + animateTransitionIn(); } // ============================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchContextControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchContextControl.java index 80c02cf..3655f97 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchContextControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchContextControl.java
@@ -12,7 +12,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelRepaddingTextView; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; /** @@ -43,10 +42,7 @@ ViewGroup container, DynamicResourceLoader resourceLoader) { super(panel, R.layout.contextual_search_context_view, R.id.contextual_search_context_view, - context, container, resourceLoader, - (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT) - ? R.dimen.contextual_search_end_padding - : R.dimen.contextual_search_padded_button_width), + context, container, resourceLoader, R.dimen.contextual_search_end_padding, R.dimen.contextual_search_padded_button_width); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java index 37c1806..62e4ee9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -24,7 +24,6 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; import org.chromium.chrome.browser.contextualsearch.ResolvedSearchTerm.CardTag; import org.chromium.chrome.browser.flags.ActivityType; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; @@ -261,12 +260,7 @@ super.handleBarClick(x, y); } } else if (isExpanded() || isMaximized()) { - if (isCoordinateInsideCloseButton(x)) { - closePanel(StateChangeReason.CLOSE_BUTTON, true); - } else if (canPromoteToNewTab() - && (!ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT) - || ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT) - && isCoordinateInsideOpenTabButton(x))) { + if (canPromoteToNewTab() && isCoordinateInsideOpenTabButton(x)) { mManagementDelegate.promoteToTab(); } else { peekPanel(StateChangeReason.UNKNOWN); @@ -342,22 +336,16 @@ @Override public float getOpenTabIconX() { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - return super.getOpenTabIconX(); + if (LocalizationUtils.isLayoutRtl()) { + return getOffsetX() + getBarMarginSide(); } else { - if (LocalizationUtils.isLayoutRtl()) { - return getOffsetX() + getBarMarginSide(); - } else { - return getOffsetX() + getWidth() - getBarMarginSide() - getCloseIconDimension(); - } + return getOffsetX() + getWidth() - getBarMarginSide() - getCloseIconDimension(); } } @Override protected boolean isCoordinateInsideCloseButton(float x) { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) return false; - - return super.isCoordinateInsideCloseButton(x); + return false; } @Override @@ -384,11 +372,7 @@ @Override protected float getMaximizedHeight() { // Max height does not cover the entire content screen. - if (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT)) { - return getTabHeight() * MAXIMIZED_HEIGHT_FRACTION; - } else { - return super.getMaximizedHeight(); - } + return getTabHeight() * MAXIMIZED_HEIGHT_FRACTION; } // ============================================================================================
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchTermControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchTermControl.java index 59d2f0c..4ca2d49 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchTermControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchTermControl.java
@@ -12,7 +12,6 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelTextViewInflater; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; /** @@ -43,10 +42,7 @@ ViewGroup container, DynamicResourceLoader resourceLoader) { super(panel, R.layout.contextual_search_term_view, R.id.contextual_search_term_view, - context, container, resourceLoader, - (ChromeFeatureList.isEnabled(ChromeFeatureList.OVERLAY_NEW_LAYOUT) - ? R.dimen.contextual_search_end_padding - : R.dimen.contextual_search_padded_button_width), + context, container, resourceLoader, R.dimen.contextual_search_end_padding, R.dimen.contextual_search_padded_button_width); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java index ae6ad4f..7ef715e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java
@@ -8,7 +8,6 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.R; -import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel; import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchBarBannerControl; import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchBarControl; import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchImageControl; @@ -65,11 +64,9 @@ int searchTermViewId = searchBarControl.getSearchTermViewId(); int searchCaptionViewId = searchBarControl.getCaptionViewId(); - int openNewTabIconId = OverlayPanel.isNewLayout() && panel.canPromoteToNewTab() - ? R.drawable.open_in_new_tab - : INVALID_RESOURCE_ID; - int dragHandlebarId = - OverlayPanel.isNewLayout() ? R.drawable.drag_handlebar : INVALID_RESOURCE_ID; + int openNewTabIconId = + panel.canPromoteToNewTab() ? R.drawable.open_in_new_tab : INVALID_RESOURCE_ID; + int dragHandlebarId = R.drawable.drag_handlebar; int searchPromoViewId = promoControl.getViewId(); boolean searchPromoVisible = promoControl.isVisible(); @@ -138,20 +135,16 @@ WebContents panelWebContents = panel.getWebContents(); - int roundedBarTopResourceId = OverlayPanel.isNewLayout() - ? org.chromium.components.browser_ui.styles.R.drawable.top_round - : INVALID_RESOURCE_ID; + int roundedBarTopResourceId = + org.chromium.components.browser_ui.styles.R.drawable.top_round; int separatorLineColor = panel.getSeparatorLineColor(); - // The panel shadow goes all the way around in the old layout, but in the new layout - // the top_round resource also includes the shadow so we only need a side shadow. - // In either case there's just one shadow-only resource needed. - int panelShadowResourceId = OverlayPanel.isNewLayout() - ? R.drawable.overlay_side_shadow - : R.drawable.contextual_search_bar_background; - int closeIconResourceId = OverlayPanel.isNewLayout() - ? INVALID_RESOURCE_ID - : ContextualSearchPanel.CLOSE_ICON_DRAWABLE_ID; + // The top_round resource includes the shadow so we only need a side shadow. + int panelShadowResourceId = R.drawable.overlay_side_shadow; + int closeIconResourceId = INVALID_RESOURCE_ID; + // TODO(donnd): crbug.com/1143472 - Remove four parameters for the now + // defunct arrow |R.drawable.breadcrumb_arrow| and close buttons from + // the interface and the associated code on the native side. ContextualSearchSceneLayerJni.get().updateContextualSearchLayer(mNativePtr, ContextualSearchSceneLayer.this, panelShadowResourceId, searchBarBackgroundColor, searchContextViewId, searchTermViewId, searchCaptionViewId,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialCoordinator.java index 042ee8a..9dc76eb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialCoordinator.java
@@ -4,15 +4,11 @@ package org.chromium.chrome.browser.incognito.interstitial; -import android.text.style.StyleSpan; import android.view.View; -import android.widget.TextView; import androidx.annotation.MainThread; -import org.chromium.chrome.R; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; -import org.chromium.ui.text.SpanApplier; /** * The coordinator of the incognito interstitial along with IncognitoInterstitialDelegate are the @@ -35,25 +31,10 @@ @MainThread public IncognitoInterstitialCoordinator( View view, IncognitoInterstitialDelegate incognitoInterstitialDelegate) { - formatIncognitoInterstitialMessage(view); + IncognitoInterstitialViewBinder.setUpView(view); IncognitoInterstitialMediator mediator = new IncognitoInterstitialMediator(incognitoInterstitialDelegate); PropertyModelChangeProcessor.create( mediator.getModel(), view, IncognitoInterstitialViewBinder::bindView); } - - private static void formatIncognitoInterstitialMessage(View incognitoInterstitialView) { - TextView incognitoInterstitialMessageView = - incognitoInterstitialView.findViewById(R.id.incognito_interstitial_message); - - String incognitoInterstitialMessageText = - incognitoInterstitialMessageView.getText().toString(); - - incognitoInterstitialMessageView.setText( - SpanApplier.applySpans(incognitoInterstitialMessageText, - new SpanApplier.SpanInfo( - "<b1>", "</b1>", new StyleSpan(android.graphics.Typeface.BOLD)), - new SpanApplier.SpanInfo( - "<b2>", "</b2>", new StyleSpan(android.graphics.Typeface.BOLD)))); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialViewBinder.java index 63fb42a..d927580 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/interstitial/IncognitoInterstitialViewBinder.java
@@ -4,11 +4,14 @@ package org.chromium.chrome.browser.incognito.interstitial; +import android.text.style.StyleSpan; import android.view.View; +import android.widget.TextView; import org.chromium.chrome.R; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.text.SpanApplier; /** * This class regroups the bindView util methods of the @@ -30,6 +33,18 @@ } } + /** + * Sets up the incognito interstitial view. + */ + static void setUpView(View view) { + TextView message = view.findViewById(R.id.incognito_interstitial_message); + message.setText(SpanApplier.applySpans(message.getText().toString(), + new SpanApplier.SpanInfo( + "<b1>", "</b1>", new StyleSpan(android.graphics.Typeface.BOLD)), + new SpanApplier.SpanInfo( + "<b2>", "</b2>", new StyleSpan(android.graphics.Typeface.BOLD)))); + } + // Necessary helper methods to return the subviews present inside the incognito // interstitial |view|. // TODO(crbug.com/1103262): Add these methods to the IncognitoInterstitialView once we implement
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java index b359569b..2c06116 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordGenerationDialogCustomView.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.password_manager; import android.content.Context; +import android.text.InputType; import android.util.AttributeSet; import android.widget.LinearLayout; import android.widget.TextView; @@ -38,6 +39,9 @@ public void setGeneratedPassword(String generatedPassword) { mGeneratedPasswordTextView.setText(generatedPassword); + mGeneratedPasswordTextView.setInputType(InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + | InputType.TYPE_TEXT_FLAG_MULTI_LINE); } public void setSaveExplanationText(String saveExplanationText) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java index 0e1b3848..42fcc56 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java
@@ -7,7 +7,6 @@ import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.res.Resources; -import android.graphics.Color; import android.os.Build; import android.view.ViewGroup; import android.view.Window; @@ -25,7 +24,6 @@ import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; import org.chromium.chrome.browser.device.DeviceClassManager; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; @@ -53,7 +51,7 @@ private @Nullable OverviewModeObserver mOverviewModeObserver; private CallbackController mCallbackController = new CallbackController(); - private boolean mUseLightNavigation; + private boolean mForceDarkNavigationBarColor; private boolean mOverviewModeHiding; private float mNavigationBarScrimFraction; @@ -74,16 +72,14 @@ mResources = mRootView.getResources(); mDefaultScrimColor = ApiCompatibilityUtils.getColor(mResources, R.color.black_alpha_65); - // If we're not using a light navigation bar, it will always be black so there's no need - // to register observers and manipulate coloring. + // If we're not using a light navigation bar, it will always be the same dark color so + // there's no need to register observers and manipulate coloring. if (!mResources.getBoolean(R.bool.window_light_navigation_bar)) { mTabModelSelector = null; mTabModelSelectorObserver = null; return; } - mUseLightNavigation = true; - mTabModelSelector = tabModelSelector; mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() { @Override @@ -155,7 +151,7 @@ public void onExitVr() { // The platform ignores the light navigation bar system UI flag when launching an Activity // in VR mode, so we need to restore it when VR is exited. - UiUtils.setNavigationBarIconColor(mRootView, mUseLightNavigation); + UiUtils.setNavigationBarIconColor(mRootView, !mForceDarkNavigationBarColor); } @Override @@ -166,57 +162,44 @@ boolean overviewVisible = mOverviewModeBehavior != null && mOverviewModeBehavior.overviewVisible() && !mOverviewModeHiding; - boolean useLightNavigation; - if (ChromeFeatureList.isInitialized() - && (ChromeFeatureList.isEnabled(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID) - || DeviceClassManager.enableAccessibilityLayout() - || TabUiFeatureUtilities.isGridTabSwitcherEnabled())) { - useLightNavigation = !mTabModelSelector.isIncognitoSelected(); + boolean forceDarkNavigation; + if (DeviceClassManager.enableAccessibilityLayout() + || TabUiFeatureUtilities.isGridTabSwitcherEnabled()) { + forceDarkNavigation = mTabModelSelector.isIncognitoSelected(); } else { - useLightNavigation = !mTabModelSelector.isIncognitoSelected() || overviewVisible; + forceDarkNavigation = mTabModelSelector.isIncognitoSelected() && !overviewVisible; } - useLightNavigation &= !UiUtils.isSystemUiThemingDisabled(); + forceDarkNavigation &= !UiUtils.isSystemUiThemingDisabled(); - if (mUseLightNavigation == useLightNavigation) return; + if (mForceDarkNavigationBarColor == forceDarkNavigation) return; - mUseLightNavigation = useLightNavigation; + mForceDarkNavigationBarColor = forceDarkNavigation; - mWindow.setNavigationBarColor(useLightNavigation ? ApiCompatibilityUtils.getColor( - mResources, R.color.bottom_system_nav_color) - : Color.BLACK); - - setNavigationBarColor(useLightNavigation); - - UiUtils.setNavigationBarIconColor(mRootView, useLightNavigation); + mWindow.setNavigationBarColor(getNavigationBarColor(mForceDarkNavigationBarColor)); + setNavigationBarDividerColor(); + UiUtils.setNavigationBarIconColor(mRootView, !mForceDarkNavigationBarColor); } @SuppressLint("NewApi") - private void setNavigationBarColor(boolean useLightNavigation) { + private void setNavigationBarDividerColor() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - mWindow.setNavigationBarDividerColor(useLightNavigation - ? ApiCompatibilityUtils.getColor( - mResources, R.color.bottom_system_nav_divider_color) - : Color.BLACK); + mWindow.setNavigationBarDividerColor( + getNavigationBarDividerColor(mForceDarkNavigationBarColor)); } } /** - * Update the scrim amount on the navigation bar. Note that we only update when the navigation - * bar color is in light mode. + * Update the scrim amount on the navigation bar. * @param fraction The scrim fraction in range [0, 1]. */ public void setNavigationBarScrimFraction(float fraction) { - if (!mUseLightNavigation) { - return; - } mNavigationBarScrimFraction = fraction; - mWindow.setNavigationBarColor(applyCurrentScrimToColor( - ApiCompatibilityUtils.getColor(mResources, R.color.bottom_system_nav_color))); + mWindow.setNavigationBarColor( + applyCurrentScrimToColor(getNavigationBarColor(mForceDarkNavigationBarColor))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - mWindow.setNavigationBarDividerColor( - applyCurrentScrimToColor(ApiCompatibilityUtils.getColor( - mResources, R.color.bottom_system_nav_divider_color))); + mWindow.setNavigationBarDividerColor(applyCurrentScrimToColor( + getNavigationBarDividerColor(mForceDarkNavigationBarColor))); } // Adjust the color of navigation bar icons based on color state of the navigation bar. @@ -227,6 +210,18 @@ } } + private @ColorInt int getNavigationBarColor(boolean forceDarkNavigationBar) { + return ApiCompatibilityUtils.getColor(mResources, + forceDarkNavigationBar ? R.color.toolbar_background_primary_dark + : R.color.bottom_system_nav_color); + } + + private @ColorInt int getNavigationBarDividerColor(boolean forceDarkNavigationBar) { + return ApiCompatibilityUtils.getColor(mResources, + forceDarkNavigationBar ? R.color.hairline_stroke_color_dark + : R.color.bottom_system_nav_divider_color); + } + private @ColorInt int applyCurrentScrimToColor(@ColorInt int color) { // Apply a color overlay. float scrimColorAlpha = (mDefaultScrimColor >>> 24) / 255f;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java index 5a955efe..cb94aa7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java
@@ -8,7 +8,7 @@ import android.annotation.SuppressLint; import android.annotation.TargetApi; -import android.graphics.Color; +import android.content.res.Resources; import android.os.Build; import android.support.test.InstrumentationRegistry; import android.view.Window; @@ -47,9 +47,11 @@ public void setUp() throws InterruptedException { mActivityTestRule.startMainActivityOnBlankPage(); mWindow = mActivityTestRule.getActivity().getWindow(); - mLightNavigationColor = ApiCompatibilityUtils.getColor( - mActivityTestRule.getActivity().getResources(), R.color.bottom_system_nav_color); - mDarkNavigationColor = Color.BLACK; + final Resources resources = mActivityTestRule.getActivity().getResources(); + mLightNavigationColor = + ApiCompatibilityUtils.getColor(resources, R.color.default_bg_color_light); + mDarkNavigationColor = + ApiCompatibilityUtils.getColor(resources, R.color.default_bg_color_dark_elev_3); } @Test @@ -80,8 +82,8 @@ ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(), mActivityTestRule.getActivity(), true, true); - assertEquals("Navigation bar should be black on incognito tabs.", mDarkNavigationColor, - mWindow.getNavigationBarColor()); + assertEquals("Navigation bar should be dark_elev_3 on incognito tabs.", + mDarkNavigationColor, mWindow.getNavigationBarColor()); ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(), mActivityTestRule.getActivity(), false, true);
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 0c18a65..b2582509 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -3355,6 +3355,9 @@ <message name="IDS_ENTERPRISE_ENROLLMENT_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED" desc="Error message to show when the user tries to enroll a device, but administrator has not accepted TOS."> Your administrator must first accept the terms of service in the Admin console Chrome device list. </message> + <message name="IDS_ENTERPRISE_ENROLLMENT_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE" desc="Error message to show when the user tries to enroll a CBEdu device into non-EDU account."> + You must enroll this Chrome Education device into an education account. To sign up for a new account, please visit https://g.co/workspace/edusignup. + </message> <message name="IDS_ENTERPRISE_ENROLLMENT_ATTRIBUTE_ERROR" desc="Error message shown when successfully enrolled, but the device attribute update has failed."> Your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> has successfully been enrolled for enterprise management, but failed to send its asset and location information. Please manually enter this information from your Admin console for this device. </message> @@ -4321,6 +4324,18 @@ <message name="IDS_ASSISTANT_READY_SCREEN_MESSAGE" desc="Message for Assistant ready screen."> When your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> is set up, press the Assistant button or say "Ok Google" to get help anytime. Go to Assistant settings to make changes. </message> + <message name="IDS_ASSISTANT_RELATED_INFO_SCREEN_TITLE" desc="Title for assistant related info screen."> + Just say or type what you need + </message> + <message name="IDS_ASSISTANT_RELATED_INFO_SCREEN_MESSAGE" desc="Message for assistant related info screen."> + Get better, quicker answers with Assistant + </message> + <message name="IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_TITLE" desc="Title for assistant related info screen for returned users."> + Your Google Assistant works here too + </message> + <message name="IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_MESSAGE" desc="Message for assistant related info screen for returned users."> + Looks like you've already set up Assistant on a different device. Get even more out of your Assistant by turning on the following setting. + </message> <message name="IDS_ASSISTANT_CONTINUE_BUTTON" desc="Continue button for asssitant optin flow."> Continue </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_MESSAGE.png.sha1 new file mode 100644 index 0000000..d72429c --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_MESSAGE.png.sha1
@@ -0,0 +1 @@ +ab5449f73f222c00cf6a066be0135931c9f4f36c \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_MESSAGE.png.sha1 new file mode 100644 index 0000000..015c544 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_MESSAGE.png.sha1
@@ -0,0 +1 @@ +561f81d42a789c58d3dd416a6ad10f59a15247f4 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_TITLE.png.sha1 new file mode 100644 index 0000000..015c544 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_TITLE.png.sha1
@@ -0,0 +1 @@ +561f81d42a789c58d3dd416a6ad10f59a15247f4 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_TITLE.png.sha1 new file mode 100644 index 0000000..d72429c --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_RELATED_INFO_SCREEN_TITLE.png.sha1
@@ -0,0 +1 @@ +ab5449f73f222c00cf6a066be0135931c9f4f36c \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE.png.sha1 new file mode 100644 index 0000000..f8f36dd --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE.png.sha1
@@ -0,0 +1 @@ +c71668e6d24c7606c2be68afdb53523e74f4287c \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 96f7171d..90e8e3f 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1008,8 +1008,6 @@ "page_load_metrics/observers/https_engagement_metrics/https_engagement_service.h", "page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.cc", "page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.h", - "page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.cc", - "page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h", "page_load_metrics/observers/javascript_frameworks_ukm_observer.cc", "page_load_metrics/observers/javascript_frameworks_ukm_observer.h", "page_load_metrics/observers/live_tab_count_page_load_metrics_observer.cc", @@ -1028,6 +1026,8 @@ "page_load_metrics/observers/optimization_guide_page_load_metrics_observer.h", "page_load_metrics/observers/portal_page_load_metrics_observer.cc", "page_load_metrics/observers/portal_page_load_metrics_observer.h", + "page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc", + "page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h", "page_load_metrics/observers/previews_page_load_metrics_observer.cc", "page_load_metrics/observers/previews_page_load_metrics_observer.h", "page_load_metrics/observers/previews_ukm_observer.cc", @@ -1270,37 +1270,37 @@ "predictors/resource_prefetch_predictor.h", "predictors/resource_prefetch_predictor_tables.cc", "predictors/resource_prefetch_predictor_tables.h", - "prefetch/prefetch_proxy/isolated_prerender_features.cc", - "prefetch/prefetch_proxy/isolated_prerender_features.h", - "prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.cc", - "prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.h", - "prefetch/prefetch_proxy/isolated_prerender_network_context_client.cc", - "prefetch/prefetch_proxy/isolated_prerender_network_context_client.h", - "prefetch/prefetch_proxy/isolated_prerender_origin_prober.cc", - "prefetch/prefetch_proxy/isolated_prerender_origin_prober.h", - "prefetch/prefetch_proxy/isolated_prerender_params.cc", - "prefetch/prefetch_proxy/isolated_prerender_params.h", - "prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.cc", - "prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h", - "prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h", - "prefetch/prefetch_proxy/isolated_prerender_probe_result.cc", - "prefetch/prefetch_proxy/isolated_prerender_probe_result.h", - "prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.cc", - "prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h", - "prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.cc", - "prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.h", - "prefetch/prefetch_proxy/isolated_prerender_service.cc", - "prefetch/prefetch_proxy/isolated_prerender_service.h", - "prefetch/prefetch_proxy/isolated_prerender_service_factory.cc", - "prefetch/prefetch_proxy/isolated_prerender_service_factory.h", - "prefetch/prefetch_proxy/isolated_prerender_subresource_manager.cc", - "prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h", - "prefetch/prefetch_proxy/isolated_prerender_tab_helper.cc", - "prefetch/prefetch_proxy/isolated_prerender_tab_helper.h", - "prefetch/prefetch_proxy/isolated_prerender_url_loader.cc", - "prefetch/prefetch_proxy/isolated_prerender_url_loader.h", - "prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.cc", - "prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h", + "prefetch/prefetch_proxy/prefetch_proxy_features.cc", + "prefetch/prefetch_proxy/prefetch_proxy_features.h", + "prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc", + "prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.h", + "prefetch/prefetch_proxy/prefetch_proxy_network_context_client.cc", + "prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h", + "prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc", + "prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h", + "prefetch/prefetch_proxy/prefetch_proxy_params.cc", + "prefetch/prefetch_proxy/prefetch_proxy_params.h", + "prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.cc", + "prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h", + "prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h", + "prefetch/prefetch_proxy/prefetch_proxy_probe_result.cc", + "prefetch/prefetch_proxy/prefetch_proxy_probe_result.h", + "prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.cc", + "prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h", + "prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc", + "prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h", + "prefetch/prefetch_proxy/prefetch_proxy_service.cc", + "prefetch/prefetch_proxy/prefetch_proxy_service.h", + "prefetch/prefetch_proxy/prefetch_proxy_service_factory.cc", + "prefetch/prefetch_proxy/prefetch_proxy_service_factory.h", + "prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc", + "prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h", + "prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc", + "prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h", + "prefetch/prefetch_proxy/prefetch_proxy_url_loader.cc", + "prefetch/prefetch_proxy/prefetch_proxy_url_loader.h", + "prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc", + "prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h", "prefetch/prefetch_proxy/prefetched_mainframe_response_container.cc", "prefetch/prefetch_proxy/prefetched_mainframe_response_container.h", "prefetch/search_prefetch/field_trial_settings.cc", @@ -1490,6 +1490,8 @@ "resource_coordinator/utils.h", "resources_util.cc", "resources_util.h", + "search/ntp_features.cc", + "search/ntp_features.h", "search/search.cc", "search/search.h", "search/suggestions/suggestions_service_factory.cc", @@ -6738,6 +6740,8 @@ sources += [ "safe_browsing/certificate_reporting_service_test_utils.cc", "safe_browsing/certificate_reporting_service_test_utils.h", + "safe_browsing/mock_report_sender.cc", + "safe_browsing/mock_report_sender.h", ] deps += [ "//chrome/browser/safe_browsing",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index a5da8f1..3306a65 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -44,9 +44,10 @@ #include "chrome/browser/permissions/abusive_origin_notifications_permission_revocation_config.h" #include "chrome/browser/permissions/quiet_notification_permission_ui_config.h" #include "chrome/browser/predictors/loading_predictor_config.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" #include "chrome/browser/resource_coordinator/tab_manager_features.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/sharing/click_to_call/feature.h" #include "chrome/browser/sharing/features.h" #include "chrome/browser/sharing/shared_clipboard/feature_flags.h" @@ -112,7 +113,6 @@ #include "components/query_tiles/switches.h" #include "components/reading_list/features/reading_list_switches.h" #include "components/safe_browsing/core/features.h" -#include "components/search/ntp_features.h" #include "components/security_interstitials/content/stateful_ssl_host_state_delegate.h" #include "components/security_interstitials/core/features.h" #include "components/security_state/core/features.h" @@ -4949,9 +4949,6 @@ flag_descriptions::kEphemeralTabUsingBottomSheetName, flag_descriptions::kEphemeralTabUsingBottomSheetDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kEphemeralTabUsingBottomSheet)}, - {"overlay-new-layout", flag_descriptions::kOverlayNewLayoutName, - flag_descriptions::kOverlayNewLayoutDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kOverlayNewLayout)}, #endif // defined(OS_ANDROID) #if defined(OS_CHROMEOS) @@ -6031,6 +6028,9 @@ {"media-app", flag_descriptions::kMediaAppName, flag_descriptions::kMediaAppDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kMediaApp)}, + {"media-app-annotation", flag_descriptions::kMediaAppAnnotationName, + flag_descriptions::kMediaAppAnnotationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kMediaAppAnnotation)}, {"os-settings-polymer3", flag_descriptions::kOsSettingsPolymer3Name, flag_descriptions::kOsSettingsPolymer3Description, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kOsSettingsPolymer3)}, @@ -6698,6 +6698,10 @@ kAutofillEnablePasswordInfoBarAccountIndicationFooter)}, #endif + {"check-offline-capability", flag_descriptions::kCheckOfflineCapabilityName, + flag_descriptions::kCheckOfflineCapabilityDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kCheckOfflineCapability)}, + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/accessibility/accessibility_extension_api.cc b/chrome/browser/accessibility/accessibility_extension_api.cc index 335cfee..03a6f6f 100644 --- a/chrome/browser/accessibility/accessibility_extension_api.cc +++ b/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -506,17 +506,8 @@ } ExtensionFunction::ResponseAction -AccessibilityPrivateEnablePointScanFunction::Run() { - std::unique_ptr<accessibility_private::EnablePointScan::Params> params = - accessibility_private::EnablePointScan::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params); - - if (params->enabled) { - ash::AccessibilityController::Get()->StartPointScan(); - } - - // TODO(crbug.com/1061537): Implement (!params->enabled) to disable point scan - +AccessibilityPrivateActivatePointScanFunction::Run() { + ash::AccessibilityController::Get()->ActivatePointScan(); return RespondNow(NoArguments()); }
diff --git a/chrome/browser/accessibility/accessibility_extension_api.h b/chrome/browser/accessibility/accessibility_extension_api.h index 99fa27b..118d90bf 100644 --- a/chrome/browser/accessibility/accessibility_extension_api.h +++ b/chrome/browser/accessibility/accessibility_extension_api.h
@@ -161,11 +161,11 @@ // API function that is called to start or end point scanning of the // Switch Access extension. -class AccessibilityPrivateEnablePointScanFunction : public ExtensionFunction { - ~AccessibilityPrivateEnablePointScanFunction() override {} +class AccessibilityPrivateActivatePointScanFunction : public ExtensionFunction { + ~AccessibilityPrivateActivatePointScanFunction() override {} ResponseAction Run() override; - DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.enablePointScan", - ACCESSIBILITY_PRIVATE_ENABLEPOINTSCAN) + DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.activatePointScan", + ACCESSIBILITY_PRIVATE_ACTIVATEPOINTSCAN) }; // API function that is called to get the device's battery status as a string.
diff --git a/chrome/browser/android/compositor/layer/contextual_search_layer.cc b/chrome/browser/android/compositor/layer/contextual_search_layer.cc index f1982f4..452a8a5 100644 --- a/chrome/browser/android/compositor/layer/contextual_search_layer.cc +++ b/chrome/browser/android/compositor/layer/contextual_search_layer.cc
@@ -133,14 +133,8 @@ // Content setup, to center in space below drag handle (when present). // ----------------------------------------------------------------- bool is_rtl = l10n_util::IsLayoutRtl(); - int content_height = search_bar_height; - int content_top = search_bar_top; - bool is_overlay_new_layout = - rounded_bar_top_resource_id != kInvalidResourceID; - if (is_overlay_new_layout) { - content_top += search_bar_margin_top; - content_height -= search_bar_margin_top; - } + int content_height = search_bar_height - search_bar_margin_top; + int content_top = search_bar_top + search_bar_margin_top; // ----------------------------------------------------------------- // Bar Banner -- obsolete. TODO(donnd): remove. @@ -360,11 +354,9 @@ if (touch_highlight_layer_->parent() != layer_) layer_->AddChild(touch_highlight_layer_); // In the new layout don't highlight the whole bar due to rounded corners. - int highlight_height = - is_overlay_new_layout ? text_layer_height : search_bar_height; + int highlight_height = text_layer_height; int highlight_top = content_top; - highlight_top += - is_overlay_new_layout ? (content_height - text_layer_height) / 2 : 0; + highlight_top += (content_height - text_layer_height) / 2; gfx::Size background_size(touch_highlight_width, highlight_height); touch_highlight_layer_->SetBounds(background_size); touch_highlight_layer_->SetPosition(
diff --git a/chrome/browser/availability/availability_prober.h b/chrome/browser/availability/availability_prober.h index cf56aac..6b8a4f1 100644 --- a/chrome/browser/availability/availability_prober.h +++ b/chrome/browser/availability/availability_prober.h
@@ -79,10 +79,10 @@ kLitepagesOriginCheck_DEPRECATED = 1, // chrome/browser/prefetch/prefetch_proxy/ - // isolated_prerender_url_loader_interceptor.h + // prefetch_proxy_url_loader_interceptor.h kIsolatedPrerenderOriginCheck = 2, - // chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h + // chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h kIsolatedPrerenderCanaryCheck_DEPRECATED = 3, kIsolatedPrerenderTLSCanaryCheck = 4, kIsolatedPrerenderDNSCanaryCheck = 5,
diff --git a/chrome/browser/banners/android/BUILD.gn b/chrome/browser/banners/android/BUILD.gn new file mode 100644 index 0000000..d311a83 --- /dev/null +++ b/chrome/browser/banners/android/BUILD.gn
@@ -0,0 +1,11 @@ +# Copyright 2020 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. + +import("//build/config/android/rules.gni") + +# We can't use android_library here since gn doesn't allow those with empty +# sources. Use java_group until we have files in this module. +java_group("java") { + # Empty module for a three sided patch. +}
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 6a44506d..7014682c 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -110,6 +110,7 @@ #include "chrome/browser/payments/payment_credential_factory.h" #include "chrome/browser/payments/payment_request_factory.h" #include "chrome/browser/promo_browser_command/promo_browser_command.mojom.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/recipe_tasks/recipe_tasks.mojom.h" #include "chrome/browser/search/shopping_tasks/shopping_tasks.mojom.h" #include "chrome/browser/speech/speech_recognition_client_browser_interface.h" @@ -118,7 +119,6 @@ #include "chrome/browser/speech/speech_recognition_service_factory.h" #include "chrome/browser/ui/webui/downloads/downloads.mojom.h" #include "chrome/browser/ui/webui/downloads/downloads_ui.h" -#include "components/search/ntp_features.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #if !defined(OFFICIAL_BUILD) #include "chrome/browser/ui/webui/new_tab_page/foo/foo.mojom.h" // nogncheck crbug.com/1125897
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index f108da9..c71094f 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -91,10 +91,10 @@ #include "chrome/browser/platform_util.h" #include "chrome/browser/plugins/pdf_iframe_navigation_throttle.h" #include "chrome/browser/plugins/plugin_utils.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h" #include "chrome/browser/prefetch/search_prefetch/field_trial_settings.h" #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service.h" #include "chrome/browser/prefetch/search_prefetch/search_prefetch_service_factory.h" @@ -4719,12 +4719,11 @@ frame, type == URLLoaderFactoryType::kNavigation, request_initiator, factory_receiver); - auto* isolated_prerender_service = - IsolatedPrerenderServiceFactory::GetForProfile( - Profile::FromBrowserContext(browser_context)); + auto* prefetch_proxy_service = PrefetchProxyServiceFactory::GetForProfile( + Profile::FromBrowserContext(browser_context)); // |frame| is null when |type| is service worker. - if (frame && isolated_prerender_service) { - use_proxy |= isolated_prerender_service->MaybeProxyURLLoaderFactory( + if (frame && prefetch_proxy_service) { + use_proxy |= prefetch_proxy_service->MaybeProxyURLLoaderFactory( frame, render_process_id, type, factory_receiver); } @@ -4757,9 +4756,8 @@ #endif if (base::FeatureList::IsEnabled(features::kIsolatePrerenders)) { - interceptors.push_back( - std::make_unique<IsolatedPrerenderURLLoaderInterceptor>( - frame_tree_node_id)); + interceptors.push_back(std::make_unique<PrefetchProxyURLLoaderInterceptor>( + frame_tree_node_id)); } if (SearchPrefetchServiceIsEnabled()) {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index b79e4a5..a48eb9e 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1425,8 +1425,6 @@ "input_method/assistive_window_controller_delegate.h", "input_method/assistive_window_properties.cc", "input_method/assistive_window_properties.h", - "input_method/browser_state_monitor.cc", - "input_method/browser_state_monitor.h", "input_method/candidate_window_controller.cc", "input_method/candidate_window_controller.h", "input_method/candidate_window_controller_impl.cc",
diff --git a/chrome/browser/chromeos/crosapi/browser_manager.cc b/chrome/browser/chromeos/crosapi/browser_manager.cc index f9e5f24..cebfeb3 100644 --- a/chrome/browser/chromeos/crosapi/browser_manager.cc +++ b/chrome/browser/chromeos/crosapi/browser_manager.cc
@@ -63,6 +63,9 @@ // The min version of LacrosChromeService mojo interface that supports // GetHistograms API. constexpr uint32_t kGetHistogramsMinVersion = 7; +// The min version of LacrosChromeService mojo interface that supports +// GetActiveTabUrl API. +constexpr uint32_t kGetActiveTabUrlMinVersion = 8; base::FilePath LacrosLogPath() { return browser_util::GetUserDataDir().Append("lacros.log"); @@ -247,6 +250,16 @@ lacros_chrome_service_->GetHistograms(std::move(callback)); } +bool BrowserManager::GetActiveTabUrlSupported() const { + return lacros_chrome_service_version_ >= kGetActiveTabUrlMinVersion; +} + +void BrowserManager::GetActiveTabUrl(GetActiveTabUrlCallback callback) { + DCHECK(lacros_chrome_service_.is_connected()); + DCHECK(GetActiveTabUrlSupported()); + lacros_chrome_service_->GetActiveTabUrl(std::move(callback)); +} + void BrowserManager::AddObserver(BrowserManagerObserver* observer) { observers_.AddObserver(observer); }
diff --git a/chrome/browser/chromeos/crosapi/browser_manager.h b/chrome/browser/chromeos/crosapi/browser_manager.h index cc3f55e..11ac7f0 100644 --- a/chrome/browser/chromeos/crosapi/browser_manager.h +++ b/chrome/browser/chromeos/crosapi/browser_manager.h
@@ -90,6 +90,14 @@ // Gets Lacros histograms. void GetHistograms(GetHistogramsCallback callback); + // Returns true if crosapi interface supports GetActiveTabUrl API. + bool GetActiveTabUrlSupported() const; + + using GetActiveTabUrlCallback = + base::OnceCallback<void(const base::Optional<GURL>&)>; + // Gets Url of the active tab from lacros if there is any. + void GetActiveTabUrl(GetActiveTabUrlCallback callback); + void AddObserver(BrowserManagerObserver* observer); void RemoveObserver(BrowserManagerObserver* observer);
diff --git a/chrome/browser/chromeos/crosapi/test_mojo_connection_manager_unittest.cc b/chrome/browser/chromeos/crosapi/test_mojo_connection_manager_unittest.cc index a2d04c96..3c3c70d 100644 --- a/chrome/browser/chromeos/crosapi/test_mojo_connection_manager_unittest.cc +++ b/chrome/browser/chromeos/crosapi/test_mojo_connection_manager_unittest.cc
@@ -56,6 +56,7 @@ void NewWindow(NewWindowCallback callback) override {} void GetFeedbackData(GetFeedbackDataCallback callback) override {} void GetHistograms(GetHistogramsCallback callback) override {} + void GetActiveTabUrl(GetActiveTabUrlCallback callback) override {} bool init_is_called() { return init_is_called_; }
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc index e393611..fb60b56 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -844,6 +844,8 @@ TestCase("openFileDialogDownloads").WithBrowser().InGuestMode(), TestCase("openFileDialogDownloads").WithBrowser().InIncognito(), TestCase("openFileDialogPanelsDisabled").WithBrowser(), + TestCase("openFileDialogAriaMultipleSelect").WithBrowser(), + TestCase("saveFileDialogAriaSingleSelect").WithBrowser(), TestCase("saveFileDialogDownloads").WithBrowser(), TestCase("saveFileDialogDownloads").WithBrowser().InGuestMode(), TestCase("saveFileDialogDownloads").WithBrowser().InIncognito(),
diff --git a/chrome/browser/chromeos/file_manager/file_manager_jstest.cc b/chrome/browser/chromeos/file_manager/file_manager_jstest.cc index 417cd84..14778967 100644 --- a/chrome/browser/chromeos/file_manager/file_manager_jstest.cc +++ b/chrome/browser/chromeos/file_manager/file_manager_jstest.cc
@@ -152,7 +152,7 @@ } IN_PROC_BROWSER_TEST_F(CanvasFileManagerJsTest, ImageOrientation) { - RunTestURL("foreground/js/metadata/image_orientation_unittest_gen.html"); + RunTestURL("foreground/js/metadata/image_orientation_unittest.m_gen.html"); } IN_PROC_BROWSER_TEST_F(FileManagerJsTest, ImportControllerTest) {
diff --git a/chrome/browser/chromeos/input_method/browser_state_monitor.cc b/chrome/browser/chromeos/input_method/browser_state_monitor.cc deleted file mode 100644 index 2a9aea5..0000000 --- a/chrome/browser/chromeos/input_method/browser_state_monitor.cc +++ /dev/null
@@ -1,82 +0,0 @@ -// Copyright (c) 2012 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/chromeos/input_method/browser_state_monitor.h" - -#include "base/logging.h" -#include "chrome/browser/chrome_notification_types.h" -#include "components/session_manager/core/session_manager.h" -#include "content/public/browser/notification_service.h" -#include "ui/base/ime/chromeos/input_method_delegate.h" -#include "ui/base/ime/chromeos/input_method_util.h" - -namespace chromeos { -namespace input_method { - -BrowserStateMonitor::BrowserStateMonitor( - const base::Callback<void(InputMethodManager::UISessionState)>& observer) - : observer_(observer), ui_session_(InputMethodManager::STATE_LOGIN_SCREEN) { - session_manager::SessionManager::Get()->AddObserver(this); - // We should not use ALL_BROWSERS_CLOSING here since logout might be cancelled - // by JavaScript after ALL_BROWSERS_CLOSING is sent (crosbug.com/11055). - notification_registrar_.Add(this, - chrome::NOTIFICATION_APP_TERMINATING, - content::NotificationService::AllSources()); - - if (observer_) - observer_.Run(ui_session_); -} - -BrowserStateMonitor::~BrowserStateMonitor() { - session_manager::SessionManager::Get()->RemoveObserver(this); -} - -void BrowserStateMonitor::OnSessionStateChanged() { - // Note: session state changes in the following order. - // - // Normal login: - // 1. State changes to LOGGED_IN_NOT_ACTIVE - // 2. Preferences::NotifyPrefChanged() is called. preload_engines (which - // might change the current input method) and current/previous input method - // are sent to the manager. - // 3. State changes to ACTIVE - // - // Chrome crash/restart (after logging in): - // 1. State *might* change to LOGGED_IN_NOT_ACTIVE - // 2. State changes to ACTIVE - // 3. Preferences::NotifyPrefChanged() is called. The same things as above - // happen. - // - // We have to be careful not to overwrite both local and user prefs when - // NotifyPrefChanged is called. Note that it does not work to do nothing in - // InputMethodChanged() between LOGGED_IN_NOT_ACTIVE and ACTIVE because - // SESSION_STARTED is sent very early on Chrome crash/restart. - auto session_state = session_manager::SessionManager::Get()->session_state(); - if (session_state == session_manager::SessionState::ACTIVE || - session_state == session_manager::SessionState::LOGGED_IN_NOT_ACTIVE) { - SetUiSessionState(InputMethodManager::STATE_BROWSER_SCREEN); - } else if (session_state == session_manager::SessionState::LOCKED) { - SetUiSessionState(InputMethodManager::STATE_LOCK_SCREEN); - } else if (session_state == session_manager::SessionState::LOGIN_SECONDARY) { - SetUiSessionState(InputMethodManager::STATE_SECONDARY_LOGIN_SCREEN); - } -} - -void BrowserStateMonitor::Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type); - SetUiSessionState(InputMethodManager::STATE_TERMINATING); -} - -void BrowserStateMonitor::SetUiSessionState( - InputMethodManager::UISessionState ui_session) { - const InputMethodManager::UISessionState old_ui_session = ui_session_; - ui_session_ = ui_session; - if (old_ui_session != ui_session_ && !observer_.is_null()) - observer_.Run(ui_session_); -} - -} // namespace input_method -} // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/browser_state_monitor.h b/chrome/browser/chromeos/input_method/browser_state_monitor.h deleted file mode 100644 index 4a98229..0000000 --- a/chrome/browser/chromeos/input_method/browser_state_monitor.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright (c) 2012 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_CHROMEOS_INPUT_METHOD_BROWSER_STATE_MONITOR_H_ -#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_BROWSER_STATE_MONITOR_H_ - -#include <string> - -#include "base/callback.h" -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "components/session_manager/core/session_manager_observer.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" -#include "ui/base/ime/chromeos/input_method_manager.h" - -namespace chromeos { -namespace input_method { - -// Translates notifications from the browser (not logged in, logged in, etc.), -// into InputMethodManager::UISessionState transitions. -class BrowserStateMonitor : public session_manager::SessionManagerObserver, - public content::NotificationObserver { - public: - // Constructs a monitor that will invoke the given observer callback whenever - // the InputMethodManager::UISessionState changes. Assumes that the current - // ui_session_ is STATE_LOGIN_SCREEN. |observer| may be null. - explicit BrowserStateMonitor( - const base::Callback<void(InputMethodManager::UISessionState)>& observer); - ~BrowserStateMonitor() override; - - InputMethodManager::UISessionState ui_session() const { return ui_session_; } - - // session_manager::SessionManagerObserver: - void OnSessionStateChanged() override; - - // content::NotificationObserver overrides: - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; - - private: - void SetUiSessionState(InputMethodManager::UISessionState ui_session); - - base::Callback<void(InputMethodManager::UISessionState)> observer_; - InputMethodManager::UISessionState ui_session_; - content::NotificationRegistrar notification_registrar_; - - DISALLOW_COPY_AND_ASSIGN(BrowserStateMonitor); -}; - -} // namespace input_method -} // namespace chromeos - -#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_BROWSER_STATE_MONITOR_H_
diff --git a/chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc b/chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc deleted file mode 100644 index 1e33c0f..0000000 --- a/chrome/browser/chromeos/input_method/browser_state_monitor_unittest.cc +++ /dev/null
@@ -1,172 +0,0 @@ -// Copyright (c) 2012 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/chromeos/input_method/browser_state_monitor.h" - -#include <string> - -#include "base/bind.h" -#include "base/macros.h" -#include "chrome/browser/chrome_notification_types.h" -#include "content/public/browser/notification_details.h" -#include "content/public/browser/notification_service.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromeos { -namespace input_method { -namespace { - -class MockObserver { - public: - MockObserver() - : ui_session_(InputMethodManager::STATE_TERMINATING), - update_ui_session_count_(0) {} - - void SetState(InputMethodManager::UISessionState new_ui_session) { - ++update_ui_session_count_; - ui_session_ = new_ui_session; - } - - base::Callback<void(InputMethodManager::UISessionState new_ui_session)> - AsCallback() { - return base::Bind(&MockObserver::SetState, base::Unretained(this)); - } - - int update_ui_session_count() const { return update_ui_session_count_; } - - InputMethodManager::UISessionState ui_session() const { return ui_session_; } - - private: - InputMethodManager::UISessionState ui_session_; - int update_ui_session_count_; - - DISALLOW_COPY_AND_ASSIGN(MockObserver); -}; - -} // anonymous namespace - -TEST(BrowserStateMonitorLifetimeTest, TestConstruction) { - MockObserver mock_observer; - BrowserStateMonitor monitor(mock_observer.AsCallback()); - - // Check the initial ui_session_ of the |mock_observer| and |monitor| objects. - EXPECT_EQ(1, mock_observer.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, mock_observer.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_LOGIN_SCREEN, monitor.ui_session()); -} - -namespace { - -class BrowserStateMonitorTest : public testing::Test { - public: - BrowserStateMonitorTest() - : monitor_(mock_observer_.AsCallback()) { - } - - protected: - MockObserver mock_observer_; - BrowserStateMonitor monitor_; - - private: - DISALLOW_COPY_AND_ASSIGN(BrowserStateMonitorTest); -}; - -} // anonymous namespace - -TEST_F(BrowserStateMonitorTest, TestObserveLoginUserChanged) { - EXPECT_EQ(1, mock_observer_.update_ui_session_count()); - monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - - // Check if the ui_session of the |mock_observer_| as well as the |monitor| - // are - // both changed. - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, - mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.ui_session()); -} - -TEST_F(BrowserStateMonitorTest, TestObserveSessionStarted) { - EXPECT_EQ(1, mock_observer_.update_ui_session_count()); - monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - - // Check if the state of the |mock_observer_| as well as the |monitor| are - // both changed. - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, - mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.ui_session()); -} - -TEST_F(BrowserStateMonitorTest, TestObserveLoginUserChangedThenSessionStarted) { - EXPECT_EQ(1, mock_observer_.update_ui_session_count()); - monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - - // Check if the state of the |mock_observer_| as well as the |monitor| are - // both changed. - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, - mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.ui_session()); - - monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - - // The second notification should be nop. - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, - mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.ui_session()); -} - -TEST_F(BrowserStateMonitorTest, TestObserveScreenLockUnlock) { - EXPECT_EQ(1, mock_observer_.update_ui_session_count()); - monitor_.Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - monitor_.Observe(chrome::NOTIFICATION_SESSION_STARTED, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - bool locked = true; - monitor_.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::NotificationService::AllSources(), - content::Details<bool>(&locked)); - EXPECT_EQ(3, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_LOCK_SCREEN, monitor_.ui_session()); - - locked = false; - monitor_.Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, - content::NotificationService::AllSources(), - content::Details<bool>(&locked)); - EXPECT_EQ(4, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, - mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_BROWSER_SCREEN, monitor_.ui_session()); -} - -TEST_F(BrowserStateMonitorTest, TestObserveAppTerminating) { - EXPECT_EQ(1, mock_observer_.update_ui_session_count()); - monitor_.Observe(chrome::NOTIFICATION_APP_TERMINATING, - content::NotificationService::AllSources(), - content::NotificationService::NoDetails()); - - // Check if the state of the |mock_observer_| as well as the |monitor| are - // both changed. - EXPECT_EQ(2, mock_observer_.update_ui_session_count()); - EXPECT_EQ(InputMethodManager::STATE_TERMINATING, mock_observer_.ui_session()); - EXPECT_EQ(InputMethodManager::STATE_TERMINATING, monitor_.ui_session()); -} - -} // namespace input_method -} // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/input_method_configuration.cc b/chrome/browser/chromeos/input_method/input_method_configuration.cc index ffbb0b1e..9d793c25 100644 --- a/chrome/browser/chromeos/input_method/input_method_configuration.cc +++ b/chrome/browser/chromeos/input_method/input_method_configuration.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/logging.h" #include "chrome/browser/chromeos/input_method/accessibility.h" -#include "chrome/browser/chromeos/input_method/browser_state_monitor.h" #include "chrome/browser/chromeos/input_method/input_method_delegate_impl.h" #include "chrome/browser/chromeos/input_method/input_method_manager_impl.h" #include "chrome/browser/chromeos/input_method/input_method_persistence.h" @@ -19,12 +18,6 @@ namespace input_method { namespace { -void OnSessionStateChange(InputMethodManagerImpl* input_method_manager_impl, - InputMethodPersistence* input_method_persistence, - InputMethodManager::UISessionState new_ui_session) { - input_method_persistence->OnSessionStateChange(new_ui_session); - input_method_manager_impl->SetUISessionState(new_ui_session); -} bool g_disable_extension_loading = false; @@ -45,10 +38,6 @@ accessibility_.reset(new Accessibility(impl)); input_method_persistence_.reset(new InputMethodPersistence(impl)); - browser_state_monitor_.reset(new BrowserStateMonitor( - base::Bind(&OnSessionStateChange, - impl, - input_method_persistence_.get()))); DVLOG(1) << "InputMethodManager initialized"; } @@ -60,7 +49,7 @@ void Shutdown() { accessibility_.reset(); - browser_state_monitor_.reset(); + input_method_persistence_.reset(); InputMethodManager::Shutdown(); @@ -72,7 +61,6 @@ private: std::unique_ptr<Accessibility> accessibility_; - std::unique_ptr<BrowserStateMonitor> browser_state_monitor_; std::unique_ptr<InputMethodPersistence> input_method_persistence_; };
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index 7da12c0..3fcb50b 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -28,6 +28,7 @@ #include "base/time/time.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" +#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/input_method/assistive_window_controller.h" #include "chrome/browser/chromeos/input_method/candidate_window_controller.h" #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_delegate_impl.h" @@ -44,6 +45,7 @@ #include "chromeos/system/devicemode.h" #include "components/prefs/pref_service.h" #include "components/user_manager/user_manager.h" +#include "content/public/browser/notification_service.h" #include "third_party/icu/source/common/unicode/uloc.h" #include "ui/base/ime/chromeos/component_extension_ime_manager.h" #include "ui/base/ime/chromeos/component_extension_ime_manager_delegate.h" @@ -118,6 +120,10 @@ } } +bool IsShuttingDown() { + return !g_browser_process || g_browser_process->IsShuttingDown(); +} + } // namespace // ------------------------ InputMethodManagerImpl::StateImpl @@ -142,6 +148,7 @@ allowed_keyboard_layout_input_method_ids = other.allowed_keyboard_layout_input_method_ids; input_view_url = other.input_view_url; + ui_style_ = other.ui_style_; } bool InputMethodManagerImpl::StateImpl::IsActive() const { @@ -177,6 +184,7 @@ } os << "pending_input_method_id: '" << pending_input_method_id << "'\n"; os << "input_view_url: '" << input_view_url << "'\n"; + os << "ui_style_: '" << static_cast<int>(ui_style_) << "'\n"; return os.str(); } @@ -240,7 +248,7 @@ void InputMethodManagerImpl::StateImpl::EnableLoginLayouts( const std::string& language_code, const std::vector<std::string>& initial_layouts) { - if (manager_->ui_session_ == STATE_TERMINATING) + if (IsShuttingDown()) return; // First, hardware keyboard layout should be shown. @@ -377,7 +385,7 @@ bool InputMethodManagerImpl::StateImpl::ReplaceEnabledInputMethods( const std::vector<std::string>& new_active_input_method_ids) { - if (manager_->ui_session_ == STATE_TERMINATING) + if (IsShuttingDown()) return false; // Filter unknown or obsolete IDs. @@ -495,7 +503,7 @@ void InputMethodManagerImpl::StateImpl::ChangeInputMethod( const std::string& input_method_id, bool show_message) { - if (manager_->ui_session_ == STATE_TERMINATING) + if (IsShuttingDown()) return; bool notify_menu = false; @@ -531,9 +539,11 @@ // Always change input method even if it is the same. // TODO(komatsu): Revisit if this is necessary. - if (IsActive()) - manager_->ChangeInputMethodInternal(*descriptor, profile, show_message, - notify_menu); + if (IsActive()) { + manager_->ChangeInputMethodInternalFromActiveState(show_message, + notify_menu); + } + manager_->RecordInputMethodUsage(current_input_method.id()); } @@ -571,7 +581,7 @@ const std::string& extension_id, const InputMethodDescriptors& descriptors, ui::IMEEngineHandlerInterface* engine) { - if (manager_->ui_session_ == STATE_TERMINATING) + if (IsShuttingDown()) return; DCHECK(engine); @@ -860,6 +870,16 @@ return input_view_url; } +InputMethodManager::UIStyle InputMethodManagerImpl::StateImpl::GetUIStyle() + const { + return ui_style_; +} + +void InputMethodManagerImpl::StateImpl::SetUIStyle( + InputMethodManager::UIStyle ui_style) { + ui_style_ = ui_style; +} + void InputMethodManagerImpl::StateImpl::OverrideInputViewUrl(const GURL& url) { input_view_url = url; input_view_url_overridden = true; @@ -918,11 +938,11 @@ MaybeInitializeCandidateWindowController(); MaybeInitializeAssistiveWindowController(); - // Always call ChangeInputMethodInternal even when the input method id - // remain unchanged, because onActivate event needs to be sent to IME - // extension to update the current screen type correctly. - ChangeInputMethodInternal(state_->current_input_method, state_->profile, - false /* show_message */, true /* notify_menu */); + // Always call ChangeInputMethodInternalFromActiveState even when the input + // method id remain unchanged, because onActivate event needs to be sent to + // IME extension to update the current screen type correctly. + ChangeInputMethodInternalFromActiveState(false /* show_message */, + true /* notify_menu */); } } @@ -935,7 +955,6 @@ std::unique_ptr<InputMethodDelegate> delegate, bool enable_extension_loading) : delegate_(std::move(delegate)), - ui_session_(STATE_LOGIN_SCREEN), util_(delegate_.get()), component_extension_ime_manager_(new ComponentExtensionIMEManager()), enable_extension_loading_(enable_extension_loading), @@ -953,6 +972,11 @@ const InputMethodDescriptors& descriptors = component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor(); util_.ResetInputMethods(descriptors); + + // We should not use ALL_BROWSERS_CLOSING here since logout might be cancelled + // by JavaScript after ALL_BROWSERS_CLOSING is sent (crosbug.com/11055). + notification_registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, + content::NotificationService::AllSources()); } InputMethodManagerImpl::~InputMethodManagerImpl() { @@ -1005,22 +1029,6 @@ ime_menu_observers_.RemoveObserver(observer); } -InputMethodManager::UISessionState InputMethodManagerImpl::GetUISessionState() { - return ui_session_; -} - -void InputMethodManagerImpl::SetUISessionState(UISessionState new_ui_session) { - ui_session_ = new_ui_session; - if (ui_session_ == STATE_TERMINATING) { - if (candidate_window_controller_.get()) - candidate_window_controller_.reset(); - if (assistive_window_controller_.get()) { - assistive_window_controller_.reset(); - ui::IMEBridge::Get()->SetAssistiveWindowHandler(nullptr); - } - } -} - std::unique_ptr<InputMethodDescriptors> InputMethodManagerImpl::GetSupportedInputMethods() const { return std::unique_ptr<InputMethodDescriptors>(new InputMethodDescriptors); @@ -1062,13 +1070,11 @@ return descriptor; } -void InputMethodManagerImpl::ChangeInputMethodInternal( - const InputMethodDescriptor& descriptor, - Profile* profile, +void InputMethodManagerImpl::ChangeInputMethodInternalFromActiveState( bool show_message, bool notify_menu) { // No need to switch input method when terminating. - if (ui_session_ == STATE_TERMINATING) { + if (IsShuttingDown()) { VLOG(1) << "No need to switch input method when terminating."; return; } @@ -1098,15 +1104,17 @@ // This must be after |current_input_method| has been set to new input // method, because engine's Enable() method needs to access it. const std::string& extension_id = - extension_ime_util::GetExtensionIDFromInputMethodID(descriptor.id()); + extension_ime_util::GetExtensionIDFromInputMethodID( + state_->current_input_method.id()); const std::string& component_id = - extension_ime_util::GetComponentIDByInputMethodID(descriptor.id()); - if (!engine_map_.count(profile) || - !engine_map_[profile].count(extension_id)) { + extension_ime_util::GetComponentIDByInputMethodID( + state_->current_input_method.id()); + if (!engine_map_.count(state_->profile) || + !engine_map_[state_->profile].count(extension_id)) { LOG_IF(ERROR, base::SysInfo::IsRunningOnChromeOS()) << "IMEEngine for \"" << extension_id << "\" is not registered"; } - engine = engine_map_[profile][extension_id]; + engine = engine_map_[state_->profile][extension_id]; ui::IMEBridge::Get()->SetCurrentEngineHandler(engine); @@ -1121,14 +1129,14 @@ // Change the keyboard layout to a preferred layout for the input method. if (!keyboard_->SetCurrentKeyboardLayoutByName( - descriptor.GetPreferredKeyboardLayout())) { + state_->current_input_method.GetPreferredKeyboardLayout())) { LOG(ERROR) << "Failed to change keyboard layout to " - << descriptor.GetPreferredKeyboardLayout(); + << state_->current_input_method.GetPreferredKeyboardLayout(); } // Update input method indicators (e.g. "US", "DV") in Chrome windows. for (auto& observer : observers_) - observer.InputMethodChanged(this, profile, show_message); + observer.InputMethodChanged(this, state_->profile, show_message); // Update the current input method in IME menu. NotifyImeMenuListChanged(); } @@ -1248,6 +1256,21 @@ component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor()); } +void InputMethodManagerImpl::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + DCHECK_EQ(chrome::NOTIFICATION_APP_TERMINATING, type); + + if (candidate_window_controller_.get()) + candidate_window_controller_.reset(); + + if (assistive_window_controller_.get()) { + assistive_window_controller_.reset(); + ui::IMEBridge::Get()->SetAssistiveWindowHandler(nullptr); + } +} + void InputMethodManagerImpl::CandidateClicked(int index) { ui::IMEEngineHandlerInterface* engine = ui::IMEBridge::Get()->GetCurrentEngineHandler();
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h index ffb6117..db06071 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h
@@ -20,6 +20,8 @@ #include "chrome/browser/chromeos/input_method/candidate_window_controller.h" #include "chrome/browser/chromeos/input_method/ime_service_connector.h" #include "chrome/browser/profiles/profile.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" #include "ui/base/ime/chromeos/ime_engine_handler_interface.h" #include "ui/base/ime/chromeos/input_method_manager.h" #include "ui/base/ime/chromeos/input_method_util.h" @@ -38,7 +40,8 @@ // The implementation of InputMethodManager. class InputMethodManagerImpl : public InputMethodManager, public CandidateWindowController::Observer, - public AssistiveWindowControllerDelegate { + public AssistiveWindowControllerDelegate, + public content::NotificationObserver { public: class StateImpl : public InputMethodManager::State { public: @@ -117,6 +120,8 @@ void EnableInputView() override; void DisableInputView() override; const GURL& GetInputViewUrl() const override; + InputMethodManager::UIStyle GetUIStyle() const override; + void SetUIStyle(InputMethodManager::UIStyle ui_style) override; // Override the input view URL used to explicitly display some keyset. void OverrideInputViewUrl(const GURL& url); @@ -180,6 +185,9 @@ // specific keyset. bool input_view_url_overridden = false; + InputMethodManager::UIStyle ui_style_ = + InputMethodManager::UIStyle::kNormal; + std::unique_ptr<ImeServiceConnector> ime_service_connector_; }; @@ -190,11 +198,7 @@ bool enable_extension_loading); ~InputMethodManagerImpl() override; - // Receives notification of an InputMethodManager::UISessionState transition. - void SetUISessionState(UISessionState new_ui_session); - // InputMethodManager override: - UISessionState GetUISessionState() override; void AddObserver(InputMethodManager::Observer* observer) override; void AddCandidateWindowObserver( InputMethodManager::CandidateWindowObserver* observer) override; @@ -253,6 +257,11 @@ void InitializeComponentExtensionForTesting( std::unique_ptr<ComponentExtensionIMEManagerDelegate> delegate); + // content::NotificationObserver overrides: + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override; + private: friend class InputMethodManagerImplTest; @@ -277,11 +286,9 @@ const std::string& input_method_id, StateImpl* state); - // Change system input method. - void ChangeInputMethodInternal(const InputMethodDescriptor& descriptor, - Profile* profile, - bool show_message, - bool notify_menu); + // Change system input method to the one specified in the active state. + void ChangeInputMethodInternalFromActiveState(bool show_message, + bool notify_menu); // Loads necessary component extensions. // TODO(nona): Support dynamical unloading. @@ -304,9 +311,6 @@ std::unique_ptr<InputMethodDelegate> delegate_; - // The current UI session status. - UISessionState ui_session_; - // A list of objects that monitor the manager. base::ObserverList<InputMethodManager::Observer>::Unchecked observers_; base::ObserverList<CandidateWindowObserver>::Unchecked @@ -348,6 +352,8 @@ typedef std::map<Profile*, EngineMap, ProfileCompare> ProfileEngineMap; ProfileEngineMap engine_map_; + content::NotificationRegistrar notification_registrar_; + DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImpl); };
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc index 8c2a8050..f4c73a1 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
@@ -398,8 +398,7 @@ } TEST_F(InputMethodManagerImplTest, TestObserver) { - // For http://crbug.com/19655#c11 - (3). browser_state_monitor_unittest.cc is - // also for the scenario. + // For http://crbug.com/19655#c11 - (3). std::vector<std::string> keyboard_layouts; keyboard_layouts.emplace_back("xkb:us::eng"); @@ -579,7 +578,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); ids.push_back(ImeIdFromEngineId("xkb:us:colemak:eng")); @@ -607,7 +605,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us::eng")); ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); @@ -640,7 +637,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); ids.push_back(ImeIdFromEngineId(kNaclMozcUsId)); @@ -669,7 +665,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); ids.push_back(ImeIdFromEngineId(kNaclMozcUsId)); @@ -693,7 +688,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId(kExt2Engine1Id)); ids.emplace_back("mozc-dv"); @@ -709,7 +703,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.emplace_back("xkb:tl::tlh"); // Klingon, which is not supported. ids.emplace_back("unknown-super-cool-ime"); @@ -727,7 +720,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us::eng")); ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); @@ -750,7 +742,6 @@ manager_->GetActiveIMEState(); manager_->SetState(saved_ime_state->Clone()); manager_->GetActiveIMEState()->EnableLockScreenLayouts(); - manager_->SetUISessionState(InputMethodManager::STATE_LOCK_SCREEN); EXPECT_EQ(2U, manager_->GetActiveIMEState()->GetNumActiveInputMethods()); EXPECT_EQ(ImeIdFromEngineId(ids[1]), // still Dvorak manager_->GetActiveIMEState()->GetCurrentInputMethod().id()); @@ -763,7 +754,8 @@ // Unlock screen. The original state, Dvorak, is restored. manager_->SetState(saved_ime_state); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); + EXPECT_EQ(manager_->GetActiveIMEState()->GetUIStyle(), + InputMethodManager::UIStyle::kNormal); EXPECT_EQ(2U, manager_->GetActiveIMEState()->GetNumActiveInputMethods()); EXPECT_EQ(ImeIdFromEngineId(ids[1]), manager_->GetActiveIMEState()->GetCurrentInputMethod().id()); @@ -777,7 +769,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); ids.push_back(ImeIdFromEngineId(kExt2Engine2Id)); @@ -801,7 +792,6 @@ manager_->GetActiveIMEState(); manager_->SetState(saved_ime_state->Clone()); manager_->GetActiveIMEState()->EnableLockScreenLayouts(); - manager_->SetUISessionState(InputMethodManager::STATE_LOCK_SCREEN); EXPECT_EQ(2U, manager_->GetActiveIMEState() ->GetNumActiveInputMethods()); // Qwerty+Dvorak. @@ -815,7 +805,8 @@ // Unlock screen. The original state, pinyin-dv, is restored. manager_->SetState(saved_ime_state); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); + EXPECT_EQ(manager_->GetActiveIMEState()->GetUIStyle(), + InputMethodManager::UIStyle::kNormal); EXPECT_EQ(3U, manager_->GetActiveIMEState() ->GetNumActiveInputMethods()); // Dvorak and 2 IMEs. @@ -831,7 +822,6 @@ // For http://crbug.com/19655#c11 - (8), step 7-11. InitComponentExtension(); EXPECT_EQ(1, keyboard_->set_current_keyboard_layout_by_name_count_); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); ids.push_back(ImeIdFromEngineId("xkb:us:colemak:eng")); @@ -881,7 +871,6 @@ InitComponentExtension(); EXPECT_TRUE(menu_manager_->GetCurrentInputMethodMenuItemList().empty()); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us::eng")); ids.push_back(ImeIdFromEngineId(kNaclMozcUsId)); @@ -909,7 +898,6 @@ InitComponentExtension(); EXPECT_TRUE(menu_manager_->GetCurrentInputMethodMenuItemList().empty()); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId(kNaclMozcUsId)); // Japanese ids.push_back(ImeIdFromEngineId(kExt2Engine1Id)); // T-Chinese @@ -1079,7 +1067,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); EXPECT_TRUE(manager_->GetActiveIMEState()->ReplaceEnabledInputMethods(ids)); @@ -1167,7 +1154,6 @@ TestObserver observer; InitComponentExtension(); manager_->AddObserver(&observer); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us::eng")); EXPECT_TRUE(manager_->GetActiveIMEState()->ReplaceEnabledInputMethods(ids)); @@ -1220,7 +1206,6 @@ manager_->GetActiveIMEState(); manager_->SetState(saved_ime_state->Clone()); manager_->GetActiveIMEState()->EnableLockScreenLayouts(); - manager_->SetUISessionState(InputMethodManager::STATE_LOCK_SCREEN); EXPECT_EQ(1U, manager_->GetActiveIMEState() ->GetNumActiveInputMethods()); // Qwerty. No Ext. IME @@ -1230,7 +1215,8 @@ // Unlock the screen. manager_->SetState(saved_ime_state); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); + EXPECT_EQ(manager_->GetActiveIMEState()->GetUIStyle(), + InputMethodManager::UIStyle::kNormal); EXPECT_EQ(2U, manager_->GetActiveIMEState()->GetNumActiveInputMethods()); EXPECT_EQ(ext_id, manager_->GetActiveIMEState()->GetCurrentInputMethod().id()); @@ -1249,7 +1235,6 @@ TEST_F(InputMethodManagerImplTest, ChangeInputMethod_ComponenteExtensionOneIME) { InitComponentExtension(); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); const std::string ext_id = extension_ime_util::GetComponentInputMethodID( ime_list_[1].id, ime_list_[1].engines[0].engine_id); @@ -1264,7 +1249,6 @@ TEST_F(InputMethodManagerImplTest, ChangeInputMethod_ComponenteExtensionTwoIME) { InitComponentExtension(); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); const std::string ext_id1 = extension_ime_util::GetComponentInputMethodID( ime_list_[1].id, ime_list_[1].engines[0].engine_id); @@ -1540,7 +1524,6 @@ // Setup 3 IMEs. InitComponentExtension(); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); std::vector<std::string> ids; ids.push_back(ImeIdFromEngineId("xkb:us:dvorak:eng")); ids.push_back(ImeIdFromEngineId(kExt2Engine2Id)); @@ -1560,7 +1543,6 @@ manager_->GetActiveIMEState(); manager_->SetState(saved_ime_state->Clone()); manager_->GetActiveIMEState()->EnableLockScreenLayouts(); - manager_->SetUISessionState(InputMethodManager::STATE_LOCK_SCREEN); EXPECT_EQ(2u, ime_controller.available_imes_.size()); // Qwerty+Dvorak. EXPECT_EQ(ImeIdFromEngineId("xkb:us:dvorak:eng"), ime_controller.current_ime_id_); @@ -1571,7 +1553,8 @@ // Unlock screen. The original state, pinyin-dv, is restored. manager_->SetState(saved_ime_state); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); + EXPECT_EQ(manager_->GetActiveIMEState()->GetUIStyle(), + InputMethodManager::UIStyle::kNormal); ASSERT_EQ(3u, ime_controller.available_imes_.size()); // Dvorak and 2 IMEs. EXPECT_EQ(ImeIdFromEngineId(ids[1]), ime_controller.current_ime_id_); } @@ -1616,7 +1599,6 @@ TEST_F(InputMethodManagerImplTest, TestAddRemoveArcInputMethods) { InitComponentExtension(); - manager_->SetUISessionState(InputMethodManager::STATE_BROWSER_SCREEN); // There is one default IME EXPECT_EQ(1u, manager_->GetActiveIMEState()->GetNumActiveInputMethods());
diff --git a/chrome/browser/chromeos/input_method/input_method_persistence.cc b/chrome/browser/chromeos/input_method/input_method_persistence.cc index aae948e..6c3b72b 100644 --- a/chrome/browser/chromeos/input_method/input_method_persistence.cc +++ b/chrome/browser/chromeos/input_method/input_method_persistence.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/input_method/input_method_persistence.h" #include "base/logging.h" +#include "base/notreached.h" #include "base/system/sys_info.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/language_preferences.h" @@ -13,6 +14,7 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/ash/login_screen_client.h" #include "chrome/common/pref_names.h" #include "components/account_id/account_id.h" #include "components/prefs/pref_service.h" @@ -45,26 +47,8 @@ const std::string& input_method) { if (!account_id.is_valid()) return; - user_manager::known_user::SetUserLastInputMethod(account_id, input_method); -} - -// Update user Last keyboard layout for login screen -static void SetUserLastInputMethod( - const std::string& input_method, - const chromeos::input_method::InputMethodManager* const manager, - Profile* profile) { - // Skip if it's not a keyboard layout. Drop input methods including - // extension ones. - if (!manager->IsLoginKeyboard(input_method)) - return; - - if (profile == NULL) - return; - - // TODO(https://crbug.com/1121565): Create more general fix for all the data - // that is required on the lock screen. - profile->GetPrefs()->SetString(prefs::kLastLoginInputMethod, input_method); - SetUserLastInputMethodPreference(GetUserAccount(profile), input_method); + user_manager::known_user::SetUserLastLoginInputMethod(account_id, + input_method); } void PersistUserInputMethod(const std::string& input_method, @@ -78,7 +62,9 @@ user_prefs = profile->GetPrefs(); if (!user_prefs) return; - SetUserLastInputMethod(input_method, manager, profile); + + InputMethodPersistence::SetUserLastLoginInputMethod(input_method, manager, + profile); const std::string current_input_method_on_pref = user_prefs->GetString(::prefs::kLanguageCurrentInputMethod); @@ -94,8 +80,7 @@ InputMethodPersistence::InputMethodPersistence( InputMethodManager* input_method_manager) - : input_method_manager_(input_method_manager), - ui_session_(InputMethodManager::STATE_LOGIN_SCREEN) { + : input_method_manager_(input_method_manager) { input_method_manager_->AddObserver(this); } @@ -106,18 +91,15 @@ void InputMethodPersistence::InputMethodChanged(InputMethodManager* manager, Profile* profile, bool show_message) { - DCHECK_EQ(input_method_manager_, manager); - // We might get here during the locking process. When locker is already - // created but session state has not changed yet. - if (ScreenLocker::default_screen_locker()) { - // We use a special set of input methods on the lock screen. Do not update. + if (!g_browser_process || g_browser_process->IsShuttingDown()) return; - } + + DCHECK_EQ(input_method_manager_, manager); const std::string current_input_method = manager->GetActiveIMEState()->GetCurrentInputMethod().id(); // Save the new input method id depending on the current browser state. - switch (ui_session_) { - case InputMethodManager::STATE_LOGIN_SCREEN: + switch (manager->GetActiveIMEState()->GetUIStyle()) { + case InputMethodManager::UIStyle::kLogin: if (!manager->IsLoginKeyboard(current_input_method)) { DVLOG(1) << "Only keyboard layouts are supported: " << current_input_method; @@ -125,34 +107,38 @@ } PersistSystemInputMethod(current_input_method); return; - case InputMethodManager::STATE_BROWSER_SCREEN: + case InputMethodManager::UIStyle::kNormal: PersistUserInputMethod(current_input_method, manager, profile); return; - case InputMethodManager::STATE_LOCK_SCREEN: - case InputMethodManager::STATE_SECONDARY_LOGIN_SCREEN: - // We use a special set of input methods on the screen. Do not update. + case InputMethodManager::UIStyle::kLock: + // We are either in unit test, or screen should be locked. + DCHECK(!LoginScreenClient::HasInstance() || + ScreenLocker::default_screen_locker()); return; - case InputMethodManager::STATE_TERMINATING: + case InputMethodManager::UIStyle::kSecondaryLogin: + // We use a special set of input methods on the screen. Do not update. return; } NOTREACHED(); } -void InputMethodPersistence::OnSessionStateChange( - InputMethodManager::UISessionState new_ui_session) { - InputMethodManager::UISessionState previous_ui_session = ui_session_; - ui_session_ = new_ui_session; +// static +void InputMethodPersistence::SetUserLastLoginInputMethod( + const std::string& input_method_id, + const chromeos::input_method::InputMethodManager* const manager, + Profile* profile) { + if (!profile) + return; - // Persist input method when transitioning from Login screen into the session. - if (previous_ui_session == InputMethodManager::STATE_LOGIN_SCREEN && - ui_session_ == InputMethodManager::STATE_BROWSER_SCREEN) { - const std::string current_input_method = - input_method_manager_->GetActiveIMEState() - ->GetCurrentInputMethod() - .id(); - SetUserLastInputMethod(current_input_method, input_method_manager_, - ProfileManager::GetActiveUserProfile()); - } + // Skip if it's not a keyboard layout. Drop input methods including + // extension ones. + if (!manager->IsLoginKeyboard(input_method_id)) + return; + + // TODO(https://crbug.com/1121565): Create more general fix for all the data + // that is required on the lock screen. + profile->GetPrefs()->SetString(prefs::kLastLoginInputMethod, input_method_id); + SetUserLastInputMethodPreference(GetUserAccount(profile), input_method_id); } void SetUserLastInputMethodPreferenceForTesting(
diff --git a/chrome/browser/chromeos/input_method/input_method_persistence.h b/chrome/browser/chromeos/input_method/input_method_persistence.h index a7ca13f..b14037f 100644 --- a/chrome/browser/chromeos/input_method/input_method_persistence.h +++ b/chrome/browser/chromeos/input_method/input_method_persistence.h
@@ -7,7 +7,6 @@ #include <string> -#include "base/compiler_specific.h" #include "base/macros.h" #include "ui/base/ime/chromeos/input_method_manager.h" @@ -28,17 +27,19 @@ explicit InputMethodPersistence(InputMethodManager* input_method_manager); ~InputMethodPersistence() override; - // Receives notification of session state changes. - void OnSessionStateChange(InputMethodManager::UISessionState new_session); - // InputMethodManager::Observer overrides. void InputMethodChanged(InputMethodManager* manager, Profile* profile, bool show_message) override; + // Update user last keyboard layout for login screen. + static void SetUserLastLoginInputMethod( + const std::string& input_method_id, + const chromeos::input_method::InputMethodManager* const manager, + Profile* profile); + private: InputMethodManager* input_method_manager_; - InputMethodManager::UISessionState ui_session_; DISALLOW_COPY_AND_ASSIGN(InputMethodPersistence); };
diff --git a/chrome/browser/chromeos/input_method/input_method_persistence_unittest.cc b/chrome/browser/chromeos/input_method/input_method_persistence_unittest.cc index b5b0922f6..0b946a8 100644 --- a/chrome/browser/chromeos/input_method/input_method_persistence_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_persistence_unittest.cc
@@ -88,37 +88,45 @@ TEST_F(InputMethodPersistenceTest, TestPrefPersistenceByState) { InputMethodPersistence persistence(&mock_manager_); - persistence.OnSessionStateChange(InputMethodManager::STATE_LOGIN_SCREEN); + mock_manager_.GetActiveIMEState()->SetUIStyle( + InputMethodManager::UIStyle::kLogin); mock_manager_.SetCurrentInputMethodId(kInputId1); persistence.InputMethodChanged(&mock_manager_, ProfileManager::GetActiveUserProfile(), false); VerifyPrefs("", "", kInputId1); - persistence.OnSessionStateChange(InputMethodManager::STATE_BROWSER_SCREEN); + mock_manager_.GetActiveIMEState()->SetUIStyle( + InputMethodManager::UIStyle::kNormal); mock_manager_.SetCurrentInputMethodId(kInputId2); persistence.InputMethodChanged(&mock_manager_, ProfileManager::GetActiveUserProfile(), false); VerifyPrefs(kInputId2, "", kInputId1); - persistence.OnSessionStateChange(InputMethodManager::STATE_LOCK_SCREEN); + mock_manager_.GetActiveIMEState()->SetUIStyle( + InputMethodManager::UIStyle::kLock); mock_manager_.SetCurrentInputMethodId(kInputId1); persistence.InputMethodChanged(&mock_manager_, ProfileManager::GetActiveUserProfile(), false); VerifyPrefs(kInputId2, "", kInputId1); - persistence.OnSessionStateChange(InputMethodManager::STATE_TERMINATING); + mock_manager_.GetActiveIMEState()->SetUIStyle( + InputMethodManager::UIStyle::kNormal); + TestingBrowserProcess::GetGlobal()->SetShuttingDown(true); mock_manager_.SetCurrentInputMethodId(kInputId1); persistence.InputMethodChanged(&mock_manager_, ProfileManager::GetActiveUserProfile(), false); VerifyPrefs(kInputId2, "", kInputId1); + TestingBrowserProcess::GetGlobal()->SetShuttingDown(false); - persistence.OnSessionStateChange(InputMethodManager::STATE_LOGIN_SCREEN); + mock_manager_.GetActiveIMEState()->SetUIStyle( + InputMethodManager::UIStyle::kLogin); mock_manager_.SetCurrentInputMethodId(kInputId2); persistence.InputMethodChanged(&mock_manager_, ProfileManager::GetActiveUserProfile(), false); VerifyPrefs(kInputId2, "", kInputId2); - persistence.OnSessionStateChange(InputMethodManager::STATE_BROWSER_SCREEN); + mock_manager_.GetActiveIMEState()->SetUIStyle( + InputMethodManager::UIStyle::kNormal); mock_manager_.SetCurrentInputMethodId(kInputId1); persistence.InputMethodChanged(&mock_manager_, ProfileManager::GetActiveUserProfile(), false);
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine.cc b/chrome/browser/chromeos/input_method/native_input_method_engine.cc index c9b47291..d3331d0 100644 --- a/chrome/browser/chromeos/input_method/native_input_method_engine.cc +++ b/chrome/browser/chromeos/input_method/native_input_method_engine.cc
@@ -395,6 +395,9 @@ : ImeServiceEvent::kActivateImeSuccess); active_engine_id_ = engine_id; + if (ShouldUseFstMojoEngine(engine_id)) { + remote_to_engine_->OnInputMethodChanged(engine_id); + } } void NativeInputMethodEngine::ImeObserver::OnError(base::Time start) {
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine.h b/chrome/browser/chromeos/input_method/native_input_method_engine.h index 6358e9f..929b776 100644 --- a/chrome/browser/chromeos/input_method/native_input_method_engine.h +++ b/chrome/browser/chromeos/input_method/native_input_method_engine.h
@@ -92,6 +92,7 @@ // mojom::InputChannel: void ProcessMessage(const std::vector<uint8_t>& message, ProcessMessageCallback callback) override; + void OnInputMethodChanged(const std::string& engine_id) override {} void OnFocus(ime::mojom::InputFieldInfoPtr input_field_info) override {} void OnBlur() override {} void OnSurroundingTextChanged(
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc index 910b1d5..aab6b7c 100644 --- a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc +++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc
@@ -164,6 +164,7 @@ case policy::DM_STATUS_SERVICE_ACTIVATION_PENDING: case policy::DM_STATUS_SERVICE_ENTERPRISE_ACCOUNT_IS_NOT_ELIGIBLE_TO_ENROLL: case policy::DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED: + case policy::DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: return DemoSetupController::DemoSetupError(ErrorCode::kDemoAccountError, RecoveryMethod::kUnknown, debug_message);
diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc b/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc index 0d4e33ee..e169c0dd 100644 --- a/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc +++ b/chrome/browser/chromeos/login/enrollment/enrollment_local_policy_server_browsertest.cc
@@ -440,6 +440,21 @@ EXPECT_FALSE(InstallAttributes::Get()->IsEnterpriseManaged()); } +IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, + EnrollmentErrorIllegalAccountForPackagedEDULicense) { + policy_server_.SetExpectedDeviceEnrollmentError(907); + + TriggerEnrollmentAndSignInSuccessfully(); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepError); + enrollment_ui_.ExpectErrorMessage( + IDS_ENTERPRISE_ENROLLMENT_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE, + /* can retry */ true); + enrollment_ui_.RetryAfterError(); + EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); + EXPECT_FALSE(InstallAttributes::Get()->IsEnterpriseManaged()); +} + // Error during enrollment : Strange HTTP response from server. IN_PROC_BROWSER_TEST_F(EnrollmentLocalPolicyServerBase, EnrollmentErrorServerIsDrunk) {
diff --git a/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc b/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc index 487a341b..50885e53 100644 --- a/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc +++ b/chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_impl.cc
@@ -462,6 +462,9 @@ case policy::DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED: UMA(policy::kMetricEnrollmentRegisterEnterpriseTosHasNotBeenAccepted); break; + case policy::DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: + UMA(policy::kMetricEnrollmentIllegalAccountForPackagedEDULicense); + break; } break; case policy::EnrollmentStatus::REGISTRATION_BAD_MODE:
diff --git a/chrome/browser/chromeos/login/lock/screen_locker.cc b/chrome/browser/chromeos/login/lock/screen_locker.cc index 251d5e8e..cd4e251f 100644 --- a/chrome/browser/chromeos/login/lock/screen_locker.cc +++ b/chrome/browser/chromeos/login/lock/screen_locker.cc
@@ -199,6 +199,11 @@ input_method::InputMethodManager::Get(); saved_ime_state_ = imm->GetActiveIMEState(); imm->SetState(saved_ime_state_->Clone()); + input_method::InputMethodManager::Get()->GetActiveIMEState()->SetUIStyle( + input_method::InputMethodManager::UIStyle::kLock); + input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->EnableLockScreenLayouts(); authenticator_ = UserSessionManager::GetInstance()->CreateAuthenticator(this); extended_authenticator_ = ExtendedAuthenticator::Create(this); @@ -756,10 +761,6 @@ session_manager::SessionManager::Get()->SetSessionState( session_manager::SessionState::LOCKED); - input_method::InputMethodManager::Get() - ->GetActiveIMEState() - ->EnableLockScreenLayouts(); - // Start a fingerprint authentication session if fingerprint is available for // the primary user. Only the primary user can use fingerprint. if (IsFingerprintAvailableForUser(
diff --git a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc index cd8ad2b..915bf55 100644 --- a/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc
@@ -62,10 +62,10 @@ constexpr char kAssistantOptInId[] = "assistant-optin-flow"; constexpr char kAssistantOptInFlowCard[] = "card"; constexpr char kLoading[] = "loading"; -constexpr char kValueProp[] = "value-prop"; -constexpr char kVoiceMatch[] = "voice-match"; -constexpr char kThirdParty[] = "third-party"; -constexpr char kGetMore[] = "get-more"; +constexpr char kValueProp[] = "valueProp"; +constexpr char kVoiceMatch[] = "voiceMatch"; +constexpr char kThirdParty[] = "thirdParty"; +constexpr char kGetMore[] = "getMore"; const test::UIPath kAssistantLoading = {kAssistantOptInId, kAssistantOptInFlowCard, kLoading};
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc index b576af2..9bdebda5 100644 --- a/chrome/browser/chromeos/login/session/user_session_manager.cc +++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -2099,6 +2099,9 @@ if (!state.get()) { // Profile can be NULL in tests. state = input_method::InputMethodManager::Get()->CreateNewState(profile); + if (ProfileHelper::Get()->IsSigninProfile(profile)) + state->SetUIStyle(input_method::InputMethodManager::UIStyle::kLogin); + default_ime_states_[profile] = state; } return state;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc index 74c3118..202d87ce 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -393,6 +393,10 @@ user_context.SetKey( Key(chromeos::Key::KEY_TYPE_PASSWORD_PLAIN, "" /*salt*/, password)); user_context.SetPasswordKey(Key(password)); + user_context.SetLoginInputMethodUsed(input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetCurrentInputMethod() + .id()); if (account_id.GetAccountType() == AccountType::ACTIVE_DIRECTORY) { if (user_context.GetUserType() !=
diff --git a/chrome/browser/chromeos/login/ui/user_adding_screen_input_methods_controller.cc b/chrome/browser/chromeos/login/ui/user_adding_screen_input_methods_controller.cc index a9e545b..442a83c 100644 --- a/chrome/browser/chromeos/login/ui/user_adding_screen_input_methods_controller.cc +++ b/chrome/browser/chromeos/login/ui/user_adding_screen_input_methods_controller.cc
@@ -26,6 +26,10 @@ saved_ime_state_ = imm->GetActiveIMEState(); imm->SetState(saved_ime_state_->Clone()); imm->GetActiveIMEState()->EnableLockScreenLayouts(); + imm->GetActiveIMEState()->SetUIStyle( + user_manager::UserManager::Get()->IsUserLoggedIn() + ? input_method::InputMethodManager::UIStyle::kSecondaryLogin + : input_method::InputMethodManager::UIStyle::kLogin); } void UserAddingScreenInputMethodsController::OnUserAddingFinished() {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc index 1248a40f2..df5ef324 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc +++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
@@ -125,6 +125,13 @@ running_video_capture_.reset(); } +bool DlpContentManager::IsCaptureModeInitRestricted() const { + return GetOnScreenPresentRestrictions().HasRestriction( + DlpContentRestriction::kScreenshot) || + GetOnScreenPresentRestrictions().HasRestriction( + DlpContentRestriction::kVideoCapture); +} + /* static */ void DlpContentManager::SetDlpContentManagerForTesting( DlpContentManager* dlp_content_manager) {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h index 0fa58c4..4e50e14a 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h +++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
@@ -73,6 +73,10 @@ // Called when video capturing is stopped. void OnVideoCaptureStopped(); + // Returns whether initiation of capture mode should be restricted because + // any restricted content is currently visible. + bool IsCaptureModeInitRestricted() const; + // The caller (test) should manage |dlp_content_manager| lifetime. // Reset doesn't delete the object. static void SetDlpContentManagerForTesting(
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.cc b/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.cc index d9611ae4..19212fd0 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.cc +++ b/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.cc
@@ -4,28 +4,47 @@ #include "chrome/browser/chromeos/policy/dlp/dlp_notification_helper.h" -#include "ash/public/cpp/toast_data.h" -#include "ash/public/cpp/toast_manager.h" -#include "base/optional.h" +#include "ash/public/cpp/notification_utils.h" +#include "chrome/browser/notifications/notification_display_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" #include "components/strings/grit/components_strings.h" +#include "components/vector_icons/vector_icons.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notification_types.h" +#include "ui/message_center/public/cpp/notifier_id.h" +#include "url/gurl.h" namespace policy { namespace { -const char kPrintToastId[] = "print_dlp_blocked"; -constexpr int kPrintToastDurationMs = 2500; +constexpr char kPrintBlockedNotificationId[] = "print_dlp_blocked"; +constexpr char kDlpPolicyNotifierId[] = "policy.dlp"; } // namespace -void ShowDlpPrintDisabledToast() { - ash::ToastData toast( - kPrintToastId, l10n_util::GetStringUTF16(IDS_POLICY_DLP_PRINTING_BLOCKED), - kPrintToastDurationMs, base::nullopt); - toast.is_managed = true; +void ShowDlpPrintDisabledNotification() { + std::unique_ptr<message_center::Notification> notification = + ash::CreateSystemNotification( + message_center::NOTIFICATION_TYPE_SIMPLE, kPrintBlockedNotificationId, + l10n_util::GetStringUTF16(IDS_POLICY_DLP_PRINTING_BLOCKED_TITLE), + l10n_util::GetStringUTF16(IDS_POLICY_DLP_PRINTING_BLOCKED_MESSAGE), + /*display_source=*/base::string16(), GURL(), + message_center::NotifierId( + message_center::NotifierType::SYSTEM_COMPONENT, + kDlpPolicyNotifierId), + message_center::RichNotificationData(), + base::MakeRefCounted<message_center::NotificationDelegate>(), + vector_icons::kBusinessIcon, + message_center::SystemNotificationWarningLevel::CRITICAL_WARNING); + notification->set_renotify(true); - ash::ToastManager::Get()->Show(toast); + NotificationDisplayService::GetForProfile( + ProfileManager::GetActiveUserProfile()) + ->Display(NotificationHandler::Type::TRANSIENT, *notification, + /*metadata=*/nullptr); } } // namespace policy
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.h b/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.h index fc7decd6..e26d859 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.h +++ b/chrome/browser/chromeos/policy/dlp/dlp_notification_helper.h
@@ -8,7 +8,7 @@ namespace policy { // Shows a notification that printing is not allowed due to DLP rules. -void ShowDlpPrintDisabledToast(); +void ShowDlpPrintDisabledNotification(); } // namespace policy
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc index 688b021..2ab1ab4b 100644 --- a/chrome/browser/chromeos/preferences.cc +++ b/chrome/browser/chromeos/preferences.cc
@@ -30,6 +30,7 @@ #include "chrome/browser/chromeos/crosapi/browser_util.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/first_run/help_app_first_run_field_trial.h" +#include "chrome/browser/chromeos/input_method/input_method_persistence.h" #include "chrome/browser/chromeos/input_method/input_method_syncer.h" #include "chrome/browser/chromeos/login/login_pref_names.h" #include "chrome/browser/chromeos/login/session/user_session_manager.h" @@ -584,6 +585,17 @@ // Initialize preferences to currently saved state. ApplyPreferences(REASON_INITIALIZATION, ""); + const std::string& login_input_method_used = + session_manager->user_context().GetLoginInputMethodUsed(); + + if (user_is_primary_ && !login_input_method_used.empty()) { + // Persist input method when transitioning from Login screen into the + // session. + input_method::InputMethodPersistence::SetUserLastLoginInputMethod( + login_input_method_used, input_method::InputMethodManager::Get(), + profile); + } + // Note that |ime_state_| was modified by ApplyPreferences(), and // SetState() is modifying |current_input_method_| (via // PersistUserInputMethod() ). This way SetState() here may be called only
diff --git a/chrome/browser/chromeos/preferences_unittest.cc b/chrome/browser/chromeos/preferences_unittest.cc index e19ab16..bd2b8b8a 100644 --- a/chrome/browser/chromeos/preferences_unittest.cc +++ b/chrome/browser/chromeos/preferences_unittest.cc
@@ -86,7 +86,6 @@ void ChangeInputMethod(const std::string& input_method_id, bool show_message) override { manager_->last_input_method_id_ = input_method_id; - // Do the same thing as BrowserStateMonitor::UpdateUserPreferences. const std::string current_input_method_on_pref = manager_->current_->GetValue(); if (current_input_method_on_pref == input_method_id)
diff --git a/chrome/browser/chromeos/web_applications/chrome_media_app_ui_delegate.cc b/chrome/browser/chromeos/web_applications/chrome_media_app_ui_delegate.cc index c899126..a465dfd 100644 --- a/chrome/browser/chromeos/web_applications/chrome_media_app_ui_delegate.cc +++ b/chrome/browser/chromeos/web_applications/chrome_media_app_ui_delegate.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/chrome_pages.h" #include "chromeos/components/media_app_ui/url_constants.h" +#include "chromeos/constants/chromeos_features.h" #include "content/public/browser/web_ui_data_source.h" #include "url/gurl.h" @@ -37,4 +38,7 @@ void ChromeMediaAppUIDelegate::PopulateLoadTimeData( content::WebUIDataSource* source) { source->AddString("appLocale", g_browser_process->GetApplicationLocale()); + source->AddBoolean( + "imageAnnotation", + base::FeatureList::IsEnabled(chromeos::features::kMediaAppAnnotation)); }
diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc b/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc index fcb9c785..cf65da5 100644 --- a/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc +++ b/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
@@ -401,20 +401,17 @@ // won't open new windows/pages. See crbug.com/395621. std::string GetCurrentScreenType() override { switch (chromeos::input_method::InputMethodManager::Get() - ->GetUISessionState()) { - case chromeos::input_method::InputMethodManager::STATE_LOGIN_SCREEN: + ->GetActiveIMEState() + ->GetUIStyle()) { + case chromeos::input_method::InputMethodManager::UIStyle::kLogin: return "login"; - case chromeos::input_method::InputMethodManager::STATE_LOCK_SCREEN: - return "lock"; - case chromeos::input_method::InputMethodManager:: - STATE_SECONDARY_LOGIN_SCREEN: + case chromeos::input_method::InputMethodManager::UIStyle::kSecondaryLogin: return "secondary-login"; - case chromeos::input_method::InputMethodManager::STATE_BROWSER_SCREEN: - case chromeos::input_method::InputMethodManager::STATE_TERMINATING: + case chromeos::input_method::InputMethodManager::UIStyle::kLock: + return "lock"; + case chromeos::input_method::InputMethodManager::UIStyle::kNormal: return "normal"; } - NOTREACHED() << "New screen type is added. Please add new entry above."; - return "normal"; } std::string ConvertInputContextFocusReason( @@ -590,8 +587,12 @@ Profile* profile = GetProfile(); - if (chromeos::input_method::InputMethodManager::Get()->GetUISessionState() == - chromeos::input_method::InputMethodManager::STATE_LOGIN_SCREEN && + // TODO(https://crbug.com/1140236): Investigate whether profile selection + // is really needed. + if (chromeos::input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetUIStyle() == + chromeos::input_method::InputMethodManager::UIStyle::kLogin && profile->HasPrimaryOTRProfile()) { profile = profile->GetPrimaryOTRProfile(); }
diff --git a/chrome/browser/feedback/show_feedback_page.cc b/chrome/browser/feedback/show_feedback_page.cc index 8488fe8..abccf18 100644 --- a/chrome/browser/feedback/show_feedback_page.cc +++ b/chrome/browser/feedback/show_feedback_page.cc
@@ -19,6 +19,8 @@ #include "extensions/browser/api/feedback_private/feedback_private_api.h" #if defined(OS_CHROMEOS) +#include "base/bind.h" +#include "chrome/browser/chromeos/crosapi/browser_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "google_apis/gaia/gaia_auth_util.h" @@ -63,7 +65,23 @@ return false; } } -#endif + +void OnLacrosActiveTabUrlFeteched( + Profile* profile, + chrome::FeedbackSource source, + const std::string& description_template, + const std::string& description_placeholder_text, + const std::string& category_tag, + const std::string& extra_diagnostics, + const base::Optional<GURL>& active_tab_url) { + GURL page_url; + if (active_tab_url) + page_url = *active_tab_url; + chrome::ShowFeedbackPage(page_url, profile, source, description_template, + description_placeholder_text, category_tag, + extra_diagnostics); +} +#endif // defined(OS_CHROMEOS) // TODO(http://crbug.com/1132106): Include the following code only in // non-lacros builds after M87 beta when Feedback crosapi is available in all @@ -125,9 +143,26 @@ } Profile* profile = GetFeedbackProfile(browser); + +#if defined(OS_CHROMEOS) + // When users invoke the feedback dialog by pressing alt-shift-i without + // an active ash window, we need to check if there is an active lacros window + // and show its Url in the feedback dialog if there is any. + if (!browser && crosapi::BrowserManager::Get()->IsRunning() && + crosapi::BrowserManager::Get()->GetActiveTabUrlSupported()) { + crosapi::BrowserManager::Get()->GetActiveTabUrl(base::BindOnce( + &OnLacrosActiveTabUrlFeteched, profile, source, description_template, + description_placeholder_text, category_tag, extra_diagnostics)); + } else { + ShowFeedbackPage(page_url, profile, source, description_template, + description_placeholder_text, category_tag, + extra_diagnostics); + } +#else ShowFeedbackPage(page_url, profile, source, description_template, description_placeholder_text, category_tag, extra_diagnostics); +#endif // defined(OS_CHROMEOS) } void ShowFeedbackPage(const GURL& page_url, @@ -169,7 +204,7 @@ RequestFeedbackFlow(page_url, profile, source, description_template, description_placeholder_text, category_tag, extra_diagnostics); -#endif // #if BUILDFLAG(IS_LACROS) +#endif // BUILDFLAG(IS_LACROS) } } // namespace chrome
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index d11d805..ef69305 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -456,6 +456,11 @@ "expiry_milestone": 91 }, { + "name": "check-offline-capability", + "owners": [ "asamidoi", "//content/browser/service_worker/OWNERS" ], + "expiry_milestone": 89 + }, + { "name": "chrome-cleanup-scan-completed-notification", "owners": ["rainhard", "msramek", "chrome-friendly-settings@google.com"], @@ -791,7 +796,7 @@ { "name": "default-browser-setting", "owners": [ "gambard", "bling-flags" ], - "expiry_milestone": 87 + "expiry_milestone": 89 }, { "name": "delay-async-script-execution", @@ -811,7 +816,7 @@ { "name": "desktop-version-default", "owners": [ "gambard", "bling-flags" ], - "expiry_milestone": 87 + "expiry_milestone": 89 }, { "name": "destroy-profile-on-browser-close", @@ -3095,6 +3100,11 @@ "expiry_milestone": 90 }, { + "name": "media-app-annotation", + "owners": [ "//chromeos/components/media_app_ui/OWNERS" ], + "expiry_milestone": 93 + }, + { "name": "media-history", "owners": [ "beccahughes", "media-dev" ], "expiry_milestone": 88 @@ -3634,11 +3644,6 @@ "expiry_milestone": 90 }, { - "name": "overlay-new-layout", - "owners": [ "donnd", "jinsukkim", "contextual-search-eng@google.com" ], - "expiry_milestone": 81 - }, - { "name": "overlay-scrollbars", "owners": [ "chaopeng", "bokan", "input-dev" ], "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 79fc0242..9f77244 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -329,6 +329,11 @@ "eligibility requirements for showing app banners, such as having a " "manifest, are met."; +const char kCheckOfflineCapabilityName[] = "Check offline capability for PWAs"; +const char kCheckOfflineCapabilityDescription[] = + "Use advanced offline capability check to decide whether the browser " + "displays install prompts for PWAs."; + const char kContextMenuGoogleLensChipName[] = "Google Lens powered image search for surfaced as a chip below the context " "menu."; @@ -1726,11 +1731,6 @@ "Enables a unique URL for each path in CrOS settings. " "This allows deep linking to individual settings, i.e. in settings search."; -const char kOverlayNewLayoutName[] = "Overlay new layout"; -const char kOverlayNewLayoutDescription[] = - "Enables a new layout for the " - "Overlay panels including Contextual Search and Preview Tab."; - const char kOverlayScrollbarsName[] = "Overlay Scrollbars"; const char kOverlayScrollbarsDescription[] = "Enable the experimental overlay scrollbars implementation. You must also " @@ -4306,6 +4306,10 @@ const char kMediaAppDescription[] = "Enables the chrome://media-app System Web App (SWA)"; +const char kMediaAppAnnotationName[] = "Media App Annotation"; +const char kMediaAppAnnotationDescription[] = + "Enables image annotation in chrome://media-app"; + const char kMediaNotificationsCounterName[] = "Media Notifications Counter"; const char kMediaNotificationsCounterDescription[] = "Remove media notifications from the notification counter in the status "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 25a9212..b800318 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -200,6 +200,9 @@ extern const char kBypassAppBannerEngagementChecksName[]; extern const char kBypassAppBannerEngagementChecksDescription[]; +extern const char kCheckOfflineCapabilityName[]; +extern const char kCheckOfflineCapabilityDescription[]; + extern const char kContextMenuGoogleLensChipName[]; extern const char kContextMenuGoogleLensChipDescription[]; @@ -999,9 +1002,6 @@ extern const char kEnableDeJellyName[]; extern const char kEnableDeJellyDescription[]; -extern const char kOverlayNewLayoutName[]; -extern const char kOverlayNewLayoutDescription[]; - extern const char kOverlayScrollbarsName[]; extern const char kOverlayScrollbarsDescription[]; @@ -2514,6 +2514,9 @@ extern const char kMediaAppName[]; extern const char kMediaAppDescription[]; +extern const char kMediaAppAnnotationName[]; +extern const char kMediaAppAnnotationDescription[]; + extern const char kMediaNotificationsCounterName[]; extern const char kMediaNotificationsCounterDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index de1d530..dcb36ee 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -174,7 +174,6 @@ &kNotificationSuspender, &kOfflineIndicatorV2, &kOmniboxSpareRenderer, - &kOverlayNewLayout, &kPayWithGoogleV1, &kPhotoPickerVideoSupport, &kPhotoPickerZoom, @@ -517,9 +516,6 @@ const base::Feature kOmniboxSpareRenderer{"OmniboxSpareRenderer", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kOverlayNewLayout{"OverlayNewLayout", - base::FEATURE_ENABLED_BY_DEFAULT}; - // TODO(rouslan): Remove this. (Currently used in // GooglePayPaymentAppFactory.java) const base::Feature kPayWithGoogleV1{"PayWithGoogleV1",
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 0e2c1dea..7bd5bf4 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -88,7 +88,6 @@ extern const base::Feature kNotificationSuspender; extern const base::Feature kOfflineIndicatorV2; extern const base::Feature kOmniboxSpareRenderer; -extern const base::Feature kOverlayNewLayout; extern const base::Feature kPayWithGoogleV1; extern const base::Feature kPhotoPickerVideoSupport; extern const base::Feature kPhotoPickerZoom;
diff --git a/chrome/browser/history/top_sites_factory.cc b/chrome/browser/history/top_sites_factory.cc index 95eab51d..1cae360 100644 --- a/chrome/browser/history/top_sites_factory.cc +++ b/chrome/browser/history/top_sites_factory.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/history/history_utils.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/common/pref_names.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" @@ -31,7 +32,6 @@ #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/browser_thread.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/lacros/lacros_chrome_service_delegate_impl.cc b/chrome/browser/lacros/lacros_chrome_service_delegate_impl.cc index d5a1769..ecae44b 100644 --- a/chrome/browser/lacros/lacros_chrome_service_delegate_impl.cc +++ b/chrome/browser/lacros/lacros_chrome_service_delegate_impl.cc
@@ -6,11 +6,14 @@ #include "base/logging.h" #include "base/metrics/statistics_recorder.h" +#include "chrome/browser/feedback/feedback_dialog_utils.h" #include "chrome/browser/lacros/feedback_util.h" #include "chrome/browser/lacros/system_logs/lacros_system_log_fetcher.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_finder.h" #include "chrome/common/channel_info.h" #include "components/feedback/feedback_report.h" #include "components/feedback/feedback_util.h" @@ -66,6 +69,21 @@ } } +void LacrosChromeServiceDelegateImpl::GetActiveTabUrl( + GetActiveTabUrlCallback callback) { + Browser* browser = chrome::FindBrowserWithActiveWindow(); + if (browser) { + GURL page_url; + page_url = chrome::GetTargetTabUrl( + browser->session_id(), browser->tab_strip_model()->active_index()); + if (page_url.is_valid()) { + std::move(callback).Run(std::move(page_url)); + return; + } + } + std::move(callback).Run(base::nullopt); +} + void LacrosChromeServiceDelegateImpl::OnSystemInformationReady( std::unique_ptr<system_logs::SystemLogsResponse> sys_info) { base::Value system_log_entries(base::Value::Type::DICTIONARY);
diff --git a/chrome/browser/lacros/lacros_chrome_service_delegate_impl.h b/chrome/browser/lacros/lacros_chrome_service_delegate_impl.h index 4abcd17..5cb8b33b 100644 --- a/chrome/browser/lacros/lacros_chrome_service_delegate_impl.h +++ b/chrome/browser/lacros/lacros_chrome_service_delegate_impl.h
@@ -25,6 +25,7 @@ std::string GetChromeVersion() override; void GetFeedbackData(GetFeedbackDataCallback callback) override; void GetHistograms(GetHistogramsCallback callback) override; + void GetActiveTabUrl(GetActiveTabUrlCallback callback) override; private: void OnSystemInformationReady(
diff --git a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.cc b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.cc index 1649ec7..4a6ba7b9 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.cc +++ b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.cc
@@ -78,7 +78,9 @@ } success_callback_ = std::move(callback); url_loader_.reset(); - stream_parser_ = std::make_unique<StreamParser>(listener); + stream_parser_ = std::make_unique<StreamParser>( + listener, base::BindOnce(&ReceiveMessagesExpress::OnFastPathReady, + base::Unretained(this))); token_fetcher_->GetAccessToken( base::BindOnce(&ReceiveMessagesExpress::DoStartReceivingMessages, @@ -124,9 +126,6 @@ void ReceiveMessagesExpress::OnDataReceived(base::StringPiece data, base::OnceClosure resume) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!success_callback_.is_null()) - std::move(success_callback_).Run(true); - stream_parser_->Append(data); std::move(resume).Run(); } @@ -143,3 +142,9 @@ void ReceiveMessagesExpress::OnRetry(base::OnceClosure start_retry) { NOTIMPLEMENTED(); } + +void ReceiveMessagesExpress::OnFastPathReady() { + if (!success_callback_.is_null()) { + std::move(success_callback_).Run(true); + } +}
diff --git a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.h b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.h index 2363100..f8feeac6 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.h +++ b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express.h
@@ -63,6 +63,8 @@ void OnComplete(bool success) override; void OnRetry(base::OnceClosure start_retry) override; + void OnFastPathReady(); + TokenFetcher* token_fetcher_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; std::unique_ptr<network::SimpleURLLoader> url_loader_;
diff --git a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc index d34565d..f1b733eb5 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc +++ b/chrome/browser/nearby_sharing/instantmessaging/receive_messages_express_unittest.cc
@@ -30,9 +30,21 @@ return response; } +chrome_browser_nearby_sharing_instantmessaging::ReceiveMessagesResponse +CreateFastPathReadyResponse() { + chrome_browser_nearby_sharing_instantmessaging::ReceiveMessagesResponse + response; + response.mutable_fast_path_ready(); + return response; +} + chrome_browser_nearby_sharing_instantmessaging::StreamBody BuildResponseProto( - const std::vector<std::string>& messages) { + const std::vector<std::string>& messages, + bool include_fast_path_ready = true) { chrome_browser_nearby_sharing_instantmessaging::StreamBody stream_body; + if (include_fast_path_ready) { + stream_body.add_messages(CreateFastPathReadyResponse().SerializeAsString()); + } for (const auto& msg : messages) { stream_body.add_messages( CreateReceiveMessagesResponse(msg).SerializeAsString());
diff --git a/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc b/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc index f5fc01f3..b63c0cfe 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc +++ b/chrome/browser/nearby_sharing/instantmessaging/stream_parser.cc
@@ -5,10 +5,13 @@ #include "chrome/browser/nearby_sharing/instantmessaging/stream_parser.h" #include "chrome/browser/nearby_sharing/instantmessaging/proto/instantmessaging.pb.h" +#include "chrome/browser/nearby_sharing/logging/logging.h" StreamParser::StreamParser( - base::RepeatingCallback<void(const std::string& message)> listener) - : listener_(listener) {} + base::RepeatingCallback<void(const std::string& message)> listener, + base::OnceClosure fastpath_ready_callback) + : listener_(listener), + fastpath_ready_callback_(std::move(fastpath_ready_callback)) {} StreamParser::~StreamParser() = default; void StreamParser::Append(base::StringPiece data) { @@ -73,9 +76,22 @@ chrome_browser_nearby_sharing_instantmessaging::ReceiveMessagesResponse response; response.ParseFromString(stream_body.messages(i)); - if (response.body_case() != chrome_browser_nearby_sharing_instantmessaging:: - ReceiveMessagesResponse::kInboxMessage) - continue; - listener_.Run(response.inbox_message().message()); + switch (response.body_case()) { + case chrome_browser_nearby_sharing_instantmessaging:: + ReceiveMessagesResponse::kFastPathReady: + NS_LOG(INFO) << __func__ << ": received kFastPathReady"; + if (fastpath_ready_callback_) { + std::move(fastpath_ready_callback_).Run(); + } + break; + case chrome_browser_nearby_sharing_instantmessaging:: + ReceiveMessagesResponse::kInboxMessage: + listener_.Run(response.inbox_message().message()); + break; + default: + NS_LOG(ERROR) << __func__ << ": message body case was unexpected: " + << response.body_case(); + NOTREACHED(); + } } }
diff --git a/chrome/browser/nearby_sharing/instantmessaging/stream_parser.h b/chrome/browser/nearby_sharing/instantmessaging/stream_parser.h index 94c786a..4402ea4 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/stream_parser.h +++ b/chrome/browser/nearby_sharing/instantmessaging/stream_parser.h
@@ -20,7 +20,8 @@ class StreamParser { public: explicit StreamParser( - base::RepeatingCallback<void(const std::string& message)> listener); + base::RepeatingCallback<void(const std::string& message)> listener, + base::OnceClosure fastpath_ready); ~StreamParser(); void Append(base::StringPiece data); @@ -33,6 +34,7 @@ stream_body); base::RepeatingCallback<void(const std::string& message)> listener_; + base::OnceClosure fastpath_ready_callback_; std::string data_; };
diff --git a/chrome/browser/nearby_sharing/instantmessaging/stream_parser_unittest.cc b/chrome/browser/nearby_sharing/instantmessaging/stream_parser_unittest.cc index 55cd752..2ecdba9 100644 --- a/chrome/browser/nearby_sharing/instantmessaging/stream_parser_unittest.cc +++ b/chrome/browser/nearby_sharing/instantmessaging/stream_parser_unittest.cc
@@ -21,9 +21,21 @@ return response; } +chrome_browser_nearby_sharing_instantmessaging::ReceiveMessagesResponse +CreateFastPathReadyResponse() { + chrome_browser_nearby_sharing_instantmessaging::ReceiveMessagesResponse + response; + response.mutable_fast_path_ready(); + return response; +} + chrome_browser_nearby_sharing_instantmessaging::StreamBody BuildProto( - const std::vector<std::string>& messages) { + const std::vector<std::string>& messages, + bool include_fast_path = false) { chrome_browser_nearby_sharing_instantmessaging::StreamBody stream_body; + if (include_fast_path) { + stream_body.add_messages(CreateFastPathReadyResponse().SerializeAsString()); + } for (const auto& msg : messages) { stream_body.add_messages( CreateReceiveMessagesResponse(msg).SerializeAsString()); @@ -37,6 +49,8 @@ public: StreamParserTest() : stream_parser_(base::BindRepeating(&StreamParserTest::OnMessageReceived, + base::Unretained(this)), + base::BindRepeating(&StreamParserTest::OnFastPathReady, base::Unretained(this))) {} ~StreamParserTest() override = default; @@ -46,11 +60,15 @@ const std::vector<std::string> GetMessages() { return messages_received_; } + bool fast_path_ready() { return fast_path_ready_; } + private: void OnMessageReceived(const std::string& message) { messages_received_.push_back(message); } + void OnFastPathReady() { fast_path_ready_ = true; } + bool fast_path_ready_ = false; StreamParser stream_parser_; std::vector<std::string> messages_received_; }; @@ -121,3 +139,15 @@ EXPECT_EQ(5, MessagesReceived()); EXPECT_EQ(messages_1, GetMessages()); } + +// The fast path message triggers callback. +TEST_F(StreamParserTest, FastPathReadyTriggersCallback) { + std::vector<std::string> messages = {"random 42"}; + chrome_browser_nearby_sharing_instantmessaging::StreamBody stream_body = + BuildProto(messages, true); + GetStreamParser().Append(stream_body.SerializeAsString()); + + EXPECT_TRUE(fast_path_ready()); + EXPECT_EQ(1, MessagesReceived()); + EXPECT_EQ(messages, GetMessages()); +}
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc index 8cffaee..e58b37f 100644 --- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -230,7 +230,8 @@ page_load_metrics::mojom::FrameRenderDataUpdatePtr(base::in_place), page_load_metrics::mojom::CpuTimingPtr(base::in_place), page_load_metrics::mojom::DeferredResourceCountsPtr(base::in_place), - page_load_metrics::mojom::InputTimingPtr(base::in_place)); + page_load_metrics::mojom::InputTimingPtr(base::in_place), + blink::MobileFriendliness()); } DISALLOW_COPY_AND_ASSIGN(ResourceLoadingCancellingThrottle);
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc index 4c03eeeb..fe236b60 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
@@ -120,6 +120,16 @@ return 0; } +int BucketWithOffsetAndUnit(int num, int offset, uint32_t unit) { + // Bucketing raw number with `offset` centered. + const int grid = (num - offset) / unit; + const int bucketed = + grid == 0 ? 0 + : grid > 0 ? std::pow(2, static_cast<int>(std::log2(grid))) + : -std::pow(2, static_cast<int>(std::log2(-grid))); + return bucketed * unit + offset; +} + } // namespace // static @@ -333,6 +343,7 @@ RecordSmoothnessMetrics(); ReportPerfectHeuristicsMetrics(); RecordPageEndMetrics(&timing, current_time); + RecordMobileFriendlinessMetrics(); } void UkmPageLoadMetricsObserver::OnResourceDataUseObserved( @@ -962,6 +973,27 @@ .Record(ukm::UkmRecorder::Get()); } +void UkmPageLoadMetricsObserver::RecordMobileFriendlinessMetrics() { + ukm::builders::MobileFriendliness mf(GetDelegate().GetPageUkmSourceId()); + mf.SetViewportDeviceWidth( + GetDelegate().GetMobileFriendliness().viewport_device_width) + .SetAllowUserZoom(GetDelegate().GetMobileFriendliness().allow_user_zoom); + const int initial_scale_x10 = std::floor( + GetDelegate().GetMobileFriendliness().viewport_initial_scale * 10); + if (initial_scale_x10 > 0) { + mf.SetViewportInitialScaleX10( + ukm::GetExponentialBucketMin(initial_scale_x10, 1.2)); + } + + const int hardcoded_width = + GetDelegate().GetMobileFriendliness().viewport_hardcoded_width; + if (hardcoded_width > 0) { + mf.SetViewportHardcodedWidth( + BucketWithOffsetAndUnit(hardcoded_width, 500, 10)); + } + mf.Record(ukm::UkmRecorder::Get()); +} + void UkmPageLoadMetricsObserver::RecordPageEndMetrics( const page_load_metrics::mojom::PageLoadTiming* timing, base::TimeTicks page_end_time) {
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h index 89f58f2..291d7b6 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.h
@@ -154,6 +154,8 @@ void RecordInputTimingMetrics(); void RecordSmoothnessMetrics(); + void RecordMobileFriendlinessMetrics(); + // Captures the site engagement score for the committed URL and // returns the score rounded to the nearest 10. base::Optional<int64_t> GetRoundedSiteEngagementScore() const;
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc index ca30918..d76d934 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer_unittest.cc
@@ -53,6 +53,7 @@ using LargestContentType = page_load_metrics::ContentfulPaintTimingInfo::LargestContentType; using PageLoad = ukm::builders::PageLoad; +using MobileFriendliness = ukm::builders::MobileFriendliness; using PageLoad_Internal = ukm::builders::PageLoad_Internal; const char kTestUrl1[] = "https://www.google.com/"; @@ -1031,6 +1032,40 @@ } } +TEST_F(UkmPageLoadMetricsObserverTest, MobileFriendliness) { + NavigateAndCommit(GURL(kTestUrl1)); + blink::MobileFriendliness mobile_friendliness; + mobile_friendliness.viewport_hardcoded_width = 533; + mobile_friendliness.viewport_initial_scale = 0.123456; + mobile_friendliness.allow_user_zoom = true; + const int expected_viewport_hardcoded_width = 520; + const double expected_viewport_initial_scale = 1; + + tester()->SimulateMobileFriendlinessUpdate(mobile_friendliness); + + // Simulate closing the tab. + DeleteContents(); + + std::map<ukm::SourceId, ukm::mojom::UkmEntryPtr> merged_entries = + tester()->test_ukm_recorder().GetMergedEntriesByName( + MobileFriendliness::kEntryName); + EXPECT_EQ(1ul, merged_entries.size()); + for (const auto& kv : merged_entries) { + tester()->test_ukm_recorder().ExpectEntrySourceHasUrl(kv.second.get(), + GURL(kTestUrl1)); + tester()->test_ukm_recorder().ExpectEntryMetric( + kv.second.get(), MobileFriendliness::kViewportDeviceWidthName, false); + tester()->test_ukm_recorder().ExpectEntryMetric( + kv.second.get(), MobileFriendliness::kViewportHardcodedWidthName, + expected_viewport_hardcoded_width); + tester()->test_ukm_recorder().ExpectEntryMetric( + kv.second.get(), MobileFriendliness::kViewportInitialScaleX10Name, + expected_viewport_initial_scale); + tester()->test_ukm_recorder().ExpectEntryMetric( + kv.second.get(), MobileFriendliness::kAllowUserZoomName, true); + } +} + TEST_F(UkmPageLoadMetricsObserverTest, FirstScrollDelay) { page_load_metrics::mojom::PageLoadTiming timing; page_load_metrics::InitPageLoadTimingForTest(&timing);
diff --git a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc similarity index 82% rename from chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.cc rename to chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc index 81fac62..857de1cd 100644 --- a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h" +#include "chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h" #include <algorithm> #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "chrome/browser/history/history_service_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h" #include "chrome/browser/profiles/profile.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" #include "components/history/core/browser/history_service.h" @@ -45,14 +45,14 @@ } // namespace -IsolatedPrerenderPageLoadMetricsObserver:: - IsolatedPrerenderPageLoadMetricsObserver() = default; +PrefetchProxyPageLoadMetricsObserver::PrefetchProxyPageLoadMetricsObserver() = + default; -IsolatedPrerenderPageLoadMetricsObserver:: - ~IsolatedPrerenderPageLoadMetricsObserver() = default; +PrefetchProxyPageLoadMetricsObserver::~PrefetchProxyPageLoadMetricsObserver() = + default; page_load_metrics::PageLoadMetricsObserver::ObservePolicy -IsolatedPrerenderPageLoadMetricsObserver::OnStart( +PrefetchProxyPageLoadMetricsObserver::OnStart( content::NavigationHandle* navigation_handle, const GURL& currently_committed_url, bool started_in_foreground) { @@ -64,7 +64,7 @@ } page_load_metrics::PageLoadMetricsObserver::ObservePolicy -IsolatedPrerenderPageLoadMetricsObserver::OnRedirect( +PrefetchProxyPageLoadMetricsObserver::OnRedirect( content::NavigationHandle* navigation_handle) { CheckForCookiesOnURL(navigation_handle->GetWebContents()->GetBrowserContext(), navigation_handle->GetURL()); @@ -72,7 +72,7 @@ } page_load_metrics::PageLoadMetricsObserver::ObservePolicy -IsolatedPrerenderPageLoadMetricsObserver::OnCommit( +PrefetchProxyPageLoadMetricsObserver::OnCommit( content::NavigationHandle* navigation_handle, ukm::SourceId source_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -95,9 +95,8 @@ if (profile->IsOffTheRecord()) return STOP_OBSERVING; - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents( - navigation_handle->GetWebContents()); + PrefetchProxyTabHelper* tab_helper = PrefetchProxyTabHelper::FromWebContents( + navigation_handle->GetWebContents()); if (!tab_helper) return STOP_OBSERVING; after_srp_metrics_ = tab_helper->after_srp_metrics(); @@ -119,7 +118,7 @@ url.GetOrigin(), base::Time() /* before_time */, navigation_start_ /* end_time */, base::BindOnce( - &IsolatedPrerenderPageLoadMetricsObserver::OnOriginLastVisitResult, + &PrefetchProxyPageLoadMetricsObserver::OnOriginLastVisitResult, weak_factory_.GetWeakPtr(), base::Time::Now()), &task_tracker_); } @@ -127,17 +126,15 @@ return CONTINUE_OBSERVING; } -void IsolatedPrerenderPageLoadMetricsObserver::OnDidInternalNavigationAbort( +void PrefetchProxyPageLoadMetricsObserver::OnDidInternalNavigationAbort( content::NavigationHandle* navigation_handle) { - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents( - navigation_handle->GetWebContents()); + PrefetchProxyTabHelper* tab_helper = PrefetchProxyTabHelper::FromWebContents( + navigation_handle->GetWebContents()); if (!tab_helper) return; - std::unique_ptr<IsolatedPrerenderTabHelper::AfterSRPMetrics> - after_srp_metrics = - tab_helper->ComputeAfterSRPMetricsBeforeCommit(navigation_handle); + std::unique_ptr<PrefetchProxyTabHelper::AfterSRPMetrics> after_srp_metrics = + tab_helper->ComputeAfterSRPMetricsBeforeCommit(navigation_handle); if (!after_srp_metrics) return; @@ -149,24 +146,23 @@ RecordAfterSRPEvent(); } -void IsolatedPrerenderPageLoadMetricsObserver::OnEventOccurred( +void PrefetchProxyPageLoadMetricsObserver::OnEventOccurred( const void* const event_key) { - if (event_key == IsolatedPrerenderTabHelper::PrefetchingLikelyEventKey()) { + if (event_key == PrefetchProxyTabHelper::PrefetchingLikelyEventKey()) { GetPrefetchMetrics(); } } -void IsolatedPrerenderPageLoadMetricsObserver::GetPrefetchMetrics() { - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents( - GetDelegate().GetWebContents()); +void PrefetchProxyPageLoadMetricsObserver::GetPrefetchMetrics() { + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetDelegate().GetWebContents()); if (!tab_helper) return; srp_metrics_ = tab_helper->page_->srp_metrics_; } -void IsolatedPrerenderPageLoadMetricsObserver::OnOriginLastVisitResult( +void PrefetchProxyPageLoadMetricsObserver::OnOriginLastVisitResult( base::Time query_start_time, history::HistoryLastVisitToHostResult result) { history_query_times_.push_back(base::Time::Now() - query_start_time); @@ -190,7 +186,7 @@ } } -void IsolatedPrerenderPageLoadMetricsObserver::CheckForCookiesOnURL( +void PrefetchProxyPageLoadMetricsObserver::CheckForCookiesOnURL( content::BrowserContext* browser_context, const GURL& url) { content::StoragePartition* partition = @@ -198,11 +194,11 @@ partition->GetCookieManagerForBrowserProcess()->GetCookieList( url, net::CookieOptions::MakeAllInclusive(), - base::BindOnce(&IsolatedPrerenderPageLoadMetricsObserver::OnCookieResult, + base::BindOnce(&PrefetchProxyPageLoadMetricsObserver::OnCookieResult, weak_factory_.GetWeakPtr(), base::Time::Now())); } -void IsolatedPrerenderPageLoadMetricsObserver::OnCookieResult( +void PrefetchProxyPageLoadMetricsObserver::OnCookieResult( base::Time query_start_time, const net::CookieAccessResultList& cookies, const net::CookieAccessResultList& excluded_cookies) { @@ -211,7 +207,7 @@ mainframe_had_cookies_.value_or(false) || !cookies.empty(); } -void IsolatedPrerenderPageLoadMetricsObserver::OnResourceDataUseObserved( +void PrefetchProxyPageLoadMetricsObserver::OnResourceDataUseObserved( content::RenderFrameHost* rfh, const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>& resources) { @@ -237,7 +233,7 @@ } } -void IsolatedPrerenderPageLoadMetricsObserver::RecordMetrics() { +void PrefetchProxyPageLoadMetricsObserver::RecordMetrics() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); task_tracker_.TryCancelAll(); @@ -288,7 +284,7 @@ RecordAfterSRPEvent(); } -void IsolatedPrerenderPageLoadMetricsObserver::RecordPrefetchProxyEvent() { +void PrefetchProxyPageLoadMetricsObserver::RecordPrefetchProxyEvent() { ukm::builders::PrefetchProxy builder(GetDelegate().GetPageUkmSourceId()); if (min_days_since_last_visit_to_origin_.has_value()) { @@ -331,12 +327,11 @@ builder.Record(ukm::UkmRecorder::Get()); } -void IsolatedPrerenderPageLoadMetricsObserver::RecordAfterSRPEvent() { +void PrefetchProxyPageLoadMetricsObserver::RecordAfterSRPEvent() { if (!after_srp_metrics_) return; - const IsolatedPrerenderTabHelper::AfterSRPMetrics& metrics = - *after_srp_metrics_; + const PrefetchProxyTabHelper::AfterSRPMetrics& metrics = *after_srp_metrics_; ukm::builders::PrefetchProxy_AfterSRPClick builder( GetDelegate().GetPageUkmSourceId()); @@ -361,7 +356,7 @@ } page_load_metrics::PageLoadMetricsObserver::ObservePolicy -IsolatedPrerenderPageLoadMetricsObserver::OnHidden( +PrefetchProxyPageLoadMetricsObserver::OnHidden( const page_load_metrics::mojom::PageLoadTiming& timing) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); RecordMetrics(); @@ -369,14 +364,14 @@ } page_load_metrics::PageLoadMetricsObserver::ObservePolicy -IsolatedPrerenderPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( +PrefetchProxyPageLoadMetricsObserver::FlushMetricsOnAppEnterBackground( const page_load_metrics::mojom::PageLoadTiming& timing) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); RecordMetrics(); return STOP_OBSERVING; } -void IsolatedPrerenderPageLoadMetricsObserver::OnComplete( +void PrefetchProxyPageLoadMetricsObserver::OnComplete( const page_load_metrics::mojom::PageLoadTiming& timing) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); RecordMetrics();
diff --git a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h similarity index 82% rename from chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h rename to chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h index c8267c7..c1088fcf 100644 --- a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h +++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.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 CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_ISOLATED_PRERENDER_PAGE_LOAD_METRICS_OBSERVER_H_ -#define CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_ISOLATED_PRERENDER_PAGE_LOAD_METRICS_OBSERVER_H_ +#ifndef CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_PREFETCH_PROXY_PAGE_LOAD_METRICS_OBSERVER_H_ +#define CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_PREFETCH_PROXY_PAGE_LOAD_METRICS_OBSERVER_H_ #include <stdint.h> #include <vector> @@ -15,7 +15,7 @@ #include "base/sequence_checker.h" #include "base/task/cancelable_task_tracker.h" #include "base/time/time.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" #include "components/history/core/browser/history_types.h" #include "components/page_load_metrics/browser/page_load_metrics_observer.h" #include "net/cookies/canonical_cookie.h" @@ -26,13 +26,13 @@ class NavigationHandle; } // namespace content -// Records metrics related to loading of Isolated Prerender. See +// Records metrics related to loading of Prefetch Proxy. See // //chrome/browser/prefetch/prefetch_proxy/. -class IsolatedPrerenderPageLoadMetricsObserver +class PrefetchProxyPageLoadMetricsObserver : public page_load_metrics::PageLoadMetricsObserver { public: - IsolatedPrerenderPageLoadMetricsObserver(); - ~IsolatedPrerenderPageLoadMetricsObserver() override; + PrefetchProxyPageLoadMetricsObserver(); + ~PrefetchProxyPageLoadMetricsObserver() override; protected: // Used as a callback for history service query results. Protected for @@ -112,24 +112,23 @@ // didn't get a response from the CookieManager before recording metrics. base::Optional<bool> mainframe_had_cookies_; - // Metrics related to Isolated Prerender prefetching on a SRP, for plumbing + // Metrics related to Prefetch Proxy prefetching on a SRP, for plumbing // into UKM. - scoped_refptr<IsolatedPrerenderTabHelper::PrefetchMetrics> srp_metrics_; + scoped_refptr<PrefetchProxyTabHelper::PrefetchMetrics> srp_metrics_; // Metrics for the page load after a Google SRP where NavigationPredictor // passed parsed SRP links to the TabHelper. Not set if that isn't true. - base::Optional<IsolatedPrerenderTabHelper::AfterSRPMetrics> - after_srp_metrics_; + base::Optional<PrefetchProxyTabHelper::AfterSRPMetrics> after_srp_metrics_; // Task tracker for calls for the history service. base::CancelableTaskTracker task_tracker_; SEQUENCE_CHECKER(sequence_checker_); - base::WeakPtrFactory<IsolatedPrerenderPageLoadMetricsObserver> weak_factory_{ + base::WeakPtrFactory<PrefetchProxyPageLoadMetricsObserver> weak_factory_{ this}; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderPageLoadMetricsObserver); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyPageLoadMetricsObserver); }; -#endif // CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_ISOLATED_PRERENDER_PAGE_LOAD_METRICS_OBSERVER_H_ +#endif // CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_PREFETCH_PROXY_PAGE_LOAD_METRICS_OBSERVER_H_
diff --git a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc similarity index 98% rename from chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_browsertest.cc rename to chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc index 952335b..0c8fd9f 100644 --- a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h" +#include "chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h" #include <memory>
diff --git a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc similarity index 92% rename from chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_unittest.cc rename to chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc index 634a261..306823a8 100644 --- a/chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h" +#include "chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h" #include <memory> @@ -35,8 +35,8 @@ } // namespace -class TestIsolatedPrerenderPageLoadMetricsObserver - : public IsolatedPrerenderPageLoadMetricsObserver { +class TestPrefetchProxyPageLoadMetricsObserver + : public PrefetchProxyPageLoadMetricsObserver { public: void CallOnOriginLastVisitResult( history::HistoryLastVisitToHostResult result) { @@ -44,12 +44,12 @@ } }; -class IsolatedPrerenderPageLoadMetricsObserverTest +class PrefetchProxyPageLoadMetricsObserverTest : public page_load_metrics::PageLoadMetricsObserverTestHarness { public: - IsolatedPrerenderPageLoadMetricsObserverTest() = default; + PrefetchProxyPageLoadMetricsObserverTest() = default; - TestIsolatedPrerenderPageLoadMetricsObserver* plm_observer() { + TestPrefetchProxyPageLoadMetricsObserver* plm_observer() { return plm_observer_; } void set_navigation_url(const GURL& url) { navigation_url_ = url; } @@ -131,16 +131,16 @@ protected: void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { - std::unique_ptr<TestIsolatedPrerenderPageLoadMetricsObserver> observer = - std::make_unique<TestIsolatedPrerenderPageLoadMetricsObserver>(); + std::unique_ptr<TestPrefetchProxyPageLoadMetricsObserver> observer = + std::make_unique<TestPrefetchProxyPageLoadMetricsObserver>(); plm_observer_ = observer.get(); tracker->AddObserver(std::move(observer)); } private: void ResetTest() { - if (!IsolatedPrerenderTabHelper::FromWebContents(web_contents())) { - IsolatedPrerenderTabHelper::CreateForWebContents(web_contents()); + if (!PrefetchProxyTabHelper::FromWebContents(web_contents())) { + PrefetchProxyTabHelper::CreateForWebContents(web_contents()); } page_load_metrics::InitPageLoadTimingForTest(&timing_); @@ -154,16 +154,16 @@ PopulateRequiredTimingFields(&timing_); } - TestIsolatedPrerenderPageLoadMetricsObserver* plm_observer_ = nullptr; + TestPrefetchProxyPageLoadMetricsObserver* plm_observer_ = nullptr; page_load_metrics::mojom::PageLoadTiming timing_; GURL navigation_url_ = TestUrl(); bool in_main_frame_ = true; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderPageLoadMetricsObserverTest); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyPageLoadMetricsObserverTest); }; -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_CSS) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_CSS) { StartTest(true /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -198,7 +198,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 3); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_JS) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_JS) { StartTest(true /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -233,7 +233,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 3); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_Other) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_Other) { StartTest(true /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -268,7 +268,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 0); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_NotComplete) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_NotComplete) { StartTest(true /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -303,7 +303,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 0); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_Subframe) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_Subframe) { StartTest(true /* data_saver_enabled */); set_in_main_frame(false); @@ -339,7 +339,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 0); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, AfterFCP) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, AfterFCP) { StartTest(true /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -374,7 +374,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 0); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_MaxUKM) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_MaxUKM) { StartTest(true /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -426,7 +426,7 @@ VerifyUKMEntry(UkmEntry::kcount_css_js_loaded_cache_before_fcpName, 10); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, BeforeFCP_NoUKM) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, BeforeFCP_NoUKM) { StartTest(false /* data_saver_enabled */); std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr> resources; @@ -449,7 +449,7 @@ VerifyNoUKM(); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, DontRecordForNonHttp) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, DontRecordForNonHttp) { set_navigation_url(GURL("chrome://version")); StartTest(true /* data_saver_enabled */); @@ -483,7 +483,7 @@ VerifyNoUKM(); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, LastVisitToHost_None) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_None) { StartTest(true /* data_saver_enabled */); tester()->NavigateToUntrackedUrl(); @@ -499,7 +499,7 @@ VerifyUKMEntry(UkmEntry::kdays_since_last_visit_to_originName, base::nullopt); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, LastVisitToHost_Fail) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_Fail) { StartTest(true /* data_saver_enabled */); plm_observer()->CallOnOriginLastVisitResult( {false /* success */, base::Time()}); @@ -516,7 +516,7 @@ VerifyUKMEntry(UkmEntry::kdays_since_last_visit_to_originName, base::nullopt); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, LastVisitToHost_NullTime) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_NullTime) { StartTest(true /* data_saver_enabled */); plm_observer()->CallOnOriginLastVisitResult( {true /* success */, base::Time()}); @@ -533,7 +533,7 @@ VerifyUKMEntry(UkmEntry::kdays_since_last_visit_to_originName, -1); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, LastVisitToHost_Today) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_Today) { StartTest(true /* data_saver_enabled */); plm_observer()->CallOnOriginLastVisitResult( {true /* success */, base::Time::Now()}); @@ -551,8 +551,7 @@ VerifyUKMEntry(UkmEntry::kdays_since_last_visit_to_originName, 0); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, - LastVisitToHost_Yesterday) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_Yesterday) { StartTest(true /* data_saver_enabled */); plm_observer()->CallOnOriginLastVisitResult( {true /* success */, base::Time::Now() - base::TimeDelta::FromDays(1)}); @@ -570,7 +569,7 @@ VerifyUKMEntry(UkmEntry::kdays_since_last_visit_to_originName, 1); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, LastVisitToHost_MaxUKM) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_MaxUKM) { StartTest(true /* data_saver_enabled */); plm_observer()->CallOnOriginLastVisitResult( {true /* success */, base::Time::Now() - base::TimeDelta::FromDays(181)}); @@ -589,7 +588,7 @@ /*ukm::GetExponentialBucketMin(180,1.70)=*/119); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, LastVisitToHost_NoUKM) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, LastVisitToHost_NoUKM) { StartTest(false /* data_saver_enabled */); plm_observer()->CallOnOriginLastVisitResult( {true /* success */, base::Time::Now() - base::TimeDelta::FromDays(1)}); @@ -607,8 +606,8 @@ } // The rest of cookie testing is done in -// IsolatedPrerenderPageLoadMetricsObserverBrowserTest. -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, HadCookies_None) { +// PrefetchProxyPageLoadMetricsObserverBrowserTest. +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, HadCookies_None) { StartTest(true /* data_saver_enabled */); tester()->NavigateToUntrackedUrl(); @@ -622,7 +621,7 @@ VerifyUKMEntry(UkmEntry::kmainpage_request_had_cookiesName, base::nullopt); } -TEST_F(IsolatedPrerenderPageLoadMetricsObserverTest, HadCookies_NoUKM) { +TEST_F(PrefetchProxyPageLoadMetricsObserverTest, HadCookies_NoUKM) { StartTest(false /* data_saver_enabled */); tester()->NavigateToUntrackedUrl();
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc index ba7e8c363..83d9a91 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -19,7 +19,6 @@ #include "chrome/browser/page_load_metrics/observers/foreground_duration_ukm_observer.h" #include "chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer.h" -#include "chrome/browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/javascript_frameworks_ukm_observer.h" #include "chrome/browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/loading_predictor_page_load_metrics_observer.h" @@ -29,6 +28,7 @@ #include "chrome/browser/page_load_metrics/observers/omnibox_suggestion_used_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/optimization_guide_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/portal_page_load_metrics_observer.h" +#include "chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/previews_page_load_metrics_observer.h" #include "chrome/browser/page_load_metrics/observers/previews_ukm_observer.h" #include "chrome/browser/page_load_metrics/observers/protocol_page_load_metrics_observer.h" @@ -105,7 +105,7 @@ tracker->AddObserver( std::make_unique<DocumentWritePageLoadMetricsObserver>()); tracker->AddObserver( - std::make_unique<IsolatedPrerenderPageLoadMetricsObserver>()); + std::make_unique<PrefetchProxyPageLoadMetricsObserver>()); tracker->AddObserver( std::make_unique<LiveTabCountPageLoadMetricsObserver>()); tracker->AddObserver(std::make_unique<MediaPageLoadMetricsObserver>());
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h deleted file mode 100644 index 629dc60fe..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h +++ /dev/null
@@ -1,92 +0,0 @@ -// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PARAMS_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PARAMS_H_ - -#include <stdint.h> - -#include "base/optional.h" -#include "base/time/time.h" -#include "url/gurl.h" - -// This command line flag enables NoStatePrefetch on Isolated Prerenders. -extern const char kIsolatedPrerenderEnableNSPCmdLineFlag[]; - -// Overrides the value returned by -// |IsolatedPrerenderMaxSubresourcesPerPrerender| when a valid long is given. -extern const char kIsolatedPrerenderLimitNSPSubresourcesCmdLineFlag[]; - -// Returns true if the Isolated Prerender feature is enabled. -bool IsolatedPrerenderIsEnabled(); - -// The url of the tunnel proxy. -GURL IsolatedPrerenderProxyHost(); - -// The header name used to connect to the tunnel proxy. -std::string IsolatedPrerenderProxyHeaderKey(); - -// Whether the feature is only enabled for Lite Mode users. -bool IsolatedPrerenderOnlyForLiteMode(); - -// Returns true when prefetched pages should run no state prefetch. -bool IsolatedPrerenderNoStatePrefetchSubresources(); - -// The maximum number of prefetches that should be done from predictions on a -// Google SRP. nullopt is returned for unlimited. Negative values given by the -// field trial return nullopt. -base::Optional<size_t> IsolatedPrerenderMaximumNumberOfPrefetches(); - -// The maximum number of mainframes allowed to be prefetched at the same time. -size_t IsolatedPrerenderMaximumNumberOfConcurrentPrefetches(); - -// The maximum number of no state prefetches to attempt, in order to prefetch -// the pages' subresources, while the user is on the SRP. nullopt is returned -// for unlimited. Negative values given by the field trial return nullopt. -base::Optional<size_t> -IsolatedPrerenderMaximumNumberOfNoStatePrefetchAttempts(); - -// The maximum body length allowed to be prefetched for mainframe responses in -// bytes. -size_t IsolatedPrerenderMainframeBodyLengthLimit(); - -// Whether idle sockets should be closed after every prefetch. -bool IsolatedPrerenderCloseIdleSockets(); - -// The amount of time to allow before timing out an origin probe. -base::TimeDelta IsolatedPrerenderProbeTimeout(); - -// The amount of time to allow a prefetch to take before considering it a -// timeout error. -base::TimeDelta IsolatedPrefetchTimeoutDuration(); - -// Whether probing must be done at all. -bool IsolatedPrerenderProbingEnabled(); - -// Whether an ISP filtering canary check should be made on browser startup. -bool IsolatedPrerenderCanaryCheckEnabled(); - -// The URL to use for the TLS canary check. -GURL IsolatedPrerenderTLSCanaryCheckURL(); - -// The URL to use for the DNS canary check. -GURL IsolatedPrerenderDNSCanaryCheckURL(); - -// How long a canary check can be cached for the same network. -base::TimeDelta IsolatedPrerenderCanaryCheckCacheLifetime(); - -// Experimental control to replace TLS probing with HTTP. -bool IsolatedPrerenderMustHTTPProbeInsteadOfTLS(); - -// The maximum number of subresources that will be fetched per prefetched page. -size_t IsolatedPrerenderMaxSubresourcesPerPrerender(); - -// Whether a spare renderer should be started after all prefetching and NSP is -// complete. -bool IsolatedPrerenderStartsSpareRenderer(); - -// Whether the given position of a predicted link should be prefetched. -bool IsolatedPrerenderShouldPrefetchPosition(size_t position); - -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PARAMS_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.cc b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.cc deleted file mode 100644 index 55ad4fe..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.cc +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2020 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/prefetch/prefetch_proxy/isolated_prerender_probe_result.h" - -#include "base/notreached.h" - -bool IsolatedPrerenderProbeResultIsSuccess( - IsolatedPrerenderProbeResult result) { - switch (result) { - case IsolatedPrerenderProbeResult::kNoProbing: - case IsolatedPrerenderProbeResult::kDNSProbeSuccess: - case IsolatedPrerenderProbeResult::kTLSProbeSuccess: - return true; - case IsolatedPrerenderProbeResult::kTLSProbeFailure: - case IsolatedPrerenderProbeResult::kDNSProbeFailure: - return false; - } - NOTREACHED(); - return false; -}
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h deleted file mode 100644 index d04f5123..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROBE_RESULT_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROBE_RESULT_H_ - -// The result of an origin probe. See IsolatedPrerenderOriginProber. -enum class IsolatedPrerenderProbeResult { - kNoProbing = 0, - kDNSProbeSuccess = 1, - kDNSProbeFailure = 2, - kTLSProbeSuccess = 3, - kTLSProbeFailure = 4, -}; - -// Returns true if the probe result is not a failure. -bool IsolatedPrerenderProbeResultIsSuccess(IsolatedPrerenderProbeResult result); - -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROBE_RESULT_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.cc b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.cc deleted file mode 100644 index 74dc561..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.cc +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2020 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/prefetch/prefetch_proxy/isolated_prerender_service.h" - -#include "base/bind.h" -#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" -#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h" -#include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" -#include "chrome/browser/profiles/profile.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_frame_host.h" - -IsolatedPrerenderService::IsolatedPrerenderService(Profile* profile) - : profile_(profile), - proxy_configurator_( - std::make_unique<IsolatedPrerenderProxyConfigurator>()), - origin_prober_(std::make_unique<IsolatedPrerenderOriginProber>(profile)) { -} - -IsolatedPrerenderService::~IsolatedPrerenderService() = default; - -bool IsolatedPrerenderService::MaybeProxyURLLoaderFactory( - content::RenderFrameHost* frame, - int render_process_id, - content::ContentBrowserClient::URLLoaderFactoryType type, - mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver) { - for (const auto& manager_pair : subresource_managers_) { - if (manager_pair.second->MaybeProxyURLLoaderFactory( - frame, render_process_id, type, factory_receiver)) { - return true; - } - } - return false; -} - -IsolatedPrerenderSubresourceManager* -IsolatedPrerenderService::OnAboutToNoStatePrefetch( - const GURL& url, - std::unique_ptr<PrefetchedMainframeResponseContainer> response) { - std::unique_ptr<IsolatedPrerenderSubresourceManager> manager = - std::make_unique<IsolatedPrerenderSubresourceManager>( - url, std::move(response)); - IsolatedPrerenderSubresourceManager* manager_ptr = manager.get(); - subresource_managers_.emplace(url, std::move(manager)); - return manager_ptr; -} - -IsolatedPrerenderSubresourceManager* -IsolatedPrerenderService::GetSubresourceManagerForURL(const GURL& url) const { - auto iter = subresource_managers_.find(url); - if (iter == subresource_managers_.end()) - return nullptr; - return iter->second.get(); -} - -std::unique_ptr<IsolatedPrerenderSubresourceManager> -IsolatedPrerenderService::TakeSubresourceManagerForURL(const GURL& url) { - auto iter = subresource_managers_.find(url); - if (iter == subresource_managers_.end()) - return nullptr; - std::unique_ptr<IsolatedPrerenderSubresourceManager> manager = - std::move(iter->second); - subresource_managers_.erase(iter); - return manager; -} - -void IsolatedPrerenderService::DestroySubresourceManagerForURL( - const GURL& url) { - auto iter = subresource_managers_.find(url); - if (iter != subresource_managers_.end()) { - subresource_managers_.erase(iter); - } -}
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h deleted file mode 100644 index f2f59c83..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h +++ /dev/null
@@ -1,93 +0,0 @@ -// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SERVICE_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SERVICE_H_ - -#include <map> -#include <memory> -#include <vector> - -#include "base/memory/weak_ptr.h" -#include "components/keyed_service/core/keyed_service.h" -#include "content/public/browser/content_browser_client.h" -#include "url/gurl.h" - -class Profile; -class IsolatedPrerenderProxyConfigurator; -class IsolatedPrerenderOriginProber; -class IsolatedPrerenderSubresourceManager; -class PrefetchedMainframeResponseContainer; - -namespace content { -class RenderFrameHost; -} - -// This service owns browser-level objects used in Isolated Prerenders. -class IsolatedPrerenderService : public KeyedService { - public: - explicit IsolatedPrerenderService(Profile* profile); - ~IsolatedPrerenderService() override; - - IsolatedPrerenderProxyConfigurator* proxy_configurator() { - return proxy_configurator_.get(); - } - - IsolatedPrerenderOriginProber* origin_prober() { - return origin_prober_.get(); - } - - // This call is forwarded to all |IsolatedPrerenderSubresourceManager| in - // |subresource_managers_| see documentation there for more detail. - bool MaybeProxyURLLoaderFactory( - content::RenderFrameHost* frame, - int render_process_id, - content::ContentBrowserClient::URLLoaderFactoryType type, - mojo::PendingReceiver<network::mojom::URLLoaderFactory>* - factory_receiver); - - // Creates an |IsolatedPrerenderSubresourceManager| for the given |url|. - IsolatedPrerenderSubresourceManager* OnAboutToNoStatePrefetch( - const GURL& url, - std::unique_ptr<PrefetchedMainframeResponseContainer> response); - - // Returns a pointer to an |IsolatedPrerenderSubresourceManager| for the given - // URL, if one exists and hasn't been destroyed. Do not hold on to the - // returned pointer since it may be deleted without notice. - IsolatedPrerenderSubresourceManager* GetSubresourceManagerForURL( - const GURL& url) const; - - // Passes ownership of an |IsolatedPrerenderSubresourceManager| for the given - // URL, if one exists and hasn't been destroyed. - std::unique_ptr<IsolatedPrerenderSubresourceManager> - TakeSubresourceManagerForURL(const GURL& url); - - // Destroys the subresource manager for the given url if one exists. - void DestroySubresourceManagerForURL(const GURL& url); - - IsolatedPrerenderService(const IsolatedPrerenderService&) = delete; - IsolatedPrerenderService& operator=(const IsolatedPrerenderService&) = delete; - - private: - // Cleans up the NoStatePrerender response. Used in a delayed post task. - void CleanupNoStatePrefetchResponse(const GURL& url); - - // The current profile, not owned. - Profile* profile_; - - // The custom proxy configurator for Isolated Prerenders. - std::unique_ptr<IsolatedPrerenderProxyConfigurator> proxy_configurator_; - - // The origin prober class which manages all logic for origin probing. - std::unique_ptr<IsolatedPrerenderOriginProber> origin_prober_; - - // Map of prerender URL to its manager. Kept at the browser level since NSPs - // are done in a separate WebContents from the one they are created in. - std::map<GURL, std::unique_ptr<IsolatedPrerenderSubresourceManager>> - subresource_managers_; - - base::WeakPtrFactory<IsolatedPrerenderService> weak_factory_{this}; -}; - -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SERVICE_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.cc b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.cc deleted file mode 100644 index ba3c8e7..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.cc +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2020 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/prefetch/prefetch_proxy/isolated_prerender_service_factory.h" - -#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h" -#include "chrome/browser/profiles/profile.h" -#include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "content/public/browser/browser_context.h" - -// static -IsolatedPrerenderService* IsolatedPrerenderServiceFactory::GetForProfile( - Profile* profile) { - return static_cast<IsolatedPrerenderService*>( - GetInstance()->GetServiceForBrowserContext(profile, true)); -} - -// static -IsolatedPrerenderServiceFactory* -IsolatedPrerenderServiceFactory::GetInstance() { - return base::Singleton<IsolatedPrerenderServiceFactory>::get(); -} - -IsolatedPrerenderServiceFactory::IsolatedPrerenderServiceFactory() - : BrowserContextKeyedServiceFactory( - "IsolatedPrerenderService", - BrowserContextDependencyManager::GetInstance()) { - DependsOn(DataReductionProxyChromeSettingsFactory::GetInstance()); -} - -IsolatedPrerenderServiceFactory::~IsolatedPrerenderServiceFactory() = default; - -KeyedService* IsolatedPrerenderServiceFactory::BuildServiceInstanceFor( - content::BrowserContext* browser_context) const { - DCHECK(!browser_context->IsOffTheRecord()); - return new IsolatedPrerenderService( - Profile::FromBrowserContext(browser_context)); -}
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h b/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h deleted file mode 100644 index ba3f1ba6..0000000 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SERVICE_FACTORY_H_ - -#include "base/memory/singleton.h" -#include "components/keyed_service/content/browser_context_keyed_service_factory.h" - -class Profile; -class IsolatedPrerenderService; - -class IsolatedPrerenderServiceFactory - : public BrowserContextKeyedServiceFactory { - public: - // Returns the IsolatedPrerender for |profile|. - static IsolatedPrerenderService* GetForProfile(Profile* profile); - - static IsolatedPrerenderServiceFactory* GetInstance(); - - private: - friend struct base::DefaultSingletonTraits<IsolatedPrerenderServiceFactory>; - - IsolatedPrerenderServiceFactory(); - ~IsolatedPrerenderServiceFactory() override; - - // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( - content::BrowserContext* profile) const override; - - IsolatedPrerenderServiceFactory(const IsolatedPrerenderServiceFactory&) = - delete; - IsolatedPrerenderServiceFactory& operator=( - const IsolatedPrerenderServiceFactory&) = delete; -}; - -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SERVICE_FACTORY_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc similarity index 90% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_browsertest.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc index cb4aeca1d..0494b16 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_browsertest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -32,17 +32,17 @@ #include "chrome/browser/net/profile_network_context_service.h" #include "chrome/browser/net/profile_network_context_service_factory.h" #include "chrome/browser/policy/policy_test_utils.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h" #include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/certificate_reporting_test_utils.h" @@ -184,9 +184,9 @@ }; // Runs a closure when all expected URLs have been fetched successfully. -class TestTabHelperObserver : public IsolatedPrerenderTabHelper::Observer { +class TestTabHelperObserver : public PrefetchProxyTabHelper::Observer { public: - explicit TestTabHelperObserver(IsolatedPrerenderTabHelper* tab_helper) + explicit TestTabHelperObserver(PrefetchProxyTabHelper* tab_helper) : tab_helper_(tab_helper) { tab_helper_->AddObserverForTesting(this); } @@ -213,7 +213,7 @@ on_nsp_finished_closure_ = std::move(closure); } - // IsolatedPrerenderTabHelper::Observer: + // PrefetchProxyTabHelper::Observer: void OnPrefetchCompletedSuccessfully(const GURL& url) override { auto it = expected_successful_prefetch_urls_.find(url); if (it != expected_successful_prefetch_urls_.end()) { @@ -252,7 +252,7 @@ } private: - IsolatedPrerenderTabHelper* tab_helper_; + PrefetchProxyTabHelper* tab_helper_; base::OnceClosure on_successful_prefetch_closure_; std::set<GURL> expected_successful_prefetch_urls_; @@ -302,7 +302,7 @@ } class CustomProbeOverrideDelegate - : public IsolatedPrerenderOriginProber::ProbeURLOverrideDelegate { + : public PrefetchProxyOriginProber::ProbeURLOverrideDelegate { public: explicit CustomProbeOverrideDelegate(const GURL& override_url) : url_(override_url) {} @@ -414,19 +414,19 @@ #define DISABLE_ON_WIN_MAC_CHROMEOS(x) x #endif -class IsolatedPrerenderBrowserTest +class PrefetchProxyBrowserTest : public InProcessBrowserTest, public prerender::PrerenderHandle::Observer, public net::test_server::EmbeddedTestServerConnectionListener { public: - IsolatedPrerenderBrowserTest() { + PrefetchProxyBrowserTest() { origin_server_ = std::make_unique<net::EmbeddedTestServer>( net::EmbeddedTestServer::TYPE_HTTPS); origin_server_->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); origin_server_->ServeFilesFromSourceDirectory("chrome/test/data"); origin_server_->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); origin_server_->RegisterRequestHandler( - base::BindRepeating(&IsolatedPrerenderBrowserTest::HandleOriginRequest, + base::BindRepeating(&PrefetchProxyBrowserTest::HandleOriginRequest, base::Unretained(this))); EXPECT_TRUE(origin_server_->Start()); @@ -434,9 +434,8 @@ net::EmbeddedTestServer::TYPE_HTTPS); proxy_server_->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); proxy_server_->ServeFilesFromSourceDirectory("chrome/test/data"); - proxy_server_->RegisterRequestHandler( - base::BindRepeating(&IsolatedPrerenderBrowserTest::HandleProxyRequest, - base::Unretained(this))); + proxy_server_->RegisterRequestHandler(base::BindRepeating( + &PrefetchProxyBrowserTest::HandleProxyRequest, base::Unretained(this))); proxy_server_->SetConnectionListener(this); EXPECT_TRUE(proxy_server_->Start()); @@ -448,7 +447,7 @@ canary_server_ = std::make_unique<net::EmbeddedTestServer>( net::EmbeddedTestServer::TYPE_HTTP); canary_server_->RegisterRequestHandler( - base::BindRepeating(&IsolatedPrerenderBrowserTest::HandleCanaryRequest, + base::BindRepeating(&PrefetchProxyBrowserTest::HandleCanaryRequest, base::Unretained(this))); EXPECT_TRUE(canary_server_->Start()); } @@ -478,7 +477,7 @@ ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); // Ensure the service gets created before the tests start. - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); host_resolver()->AddRule("a.test", "127.0.0.1"); host_resolver()->AddRule("proxy.a.test", "127.0.0.1"); @@ -530,15 +529,15 @@ } network::mojom::CustomProxyConfigPtr WaitForUpdatedCustomProxyConfig() { - IsolatedPrerenderService* isolated_prerender_service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* prefetch_proxy_service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); base::RunLoop run_loop; mojo::Remote<network::mojom::CustomProxyConfigClient> client_remote; TestCustomProxyConfigClient config_client( client_remote.BindNewPipeAndPassReceiver(), run_loop.QuitClosure()); - isolated_prerender_service->proxy_configurator() - ->AddCustomProxyConfigClient(std::move(client_remote)); + prefetch_proxy_service->proxy_configurator()->AddCustomProxyConfigClient( + std::move(client_remote)); run_loop.Run(); @@ -546,16 +545,16 @@ } void WaitForTLSCanaryCheck() { - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); while (!service->origin_prober()->IsTLSCanaryCheckCompleteForTesting()) { base::RunLoop().RunUntilIdle(); } } void WaitForDNSCanaryCheck() { - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); while (service->origin_prober()->IsDNSCanaryCheckActiveForTesting()) { base::RunLoop().RunUntilIdle(); } @@ -603,8 +602,8 @@ } bool CheckForResourceInIsolatedCache(const GURL& url) { - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); DCHECK(tab_helper); DCHECK(tab_helper->GetIsolatedContextForTesting()); return net::OK == @@ -717,9 +716,10 @@ return nullptr; content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(&IsolatedPrerenderBrowserTest:: - MonitorOriginResourceRequestOnUIThread, - base::Unretained(this), request)); + FROM_HERE, + base::BindOnce( + &PrefetchProxyBrowserTest::MonitorOriginResourceRequestOnUIThread, + base::Unretained(this), request)); if (request.relative_url == "/auth_challenge") { std::unique_ptr<net::test_server::BasicHttpResponse> resp = @@ -791,7 +791,7 @@ auto new_tunnel = std::make_unique<TestProxyTunnelConnection>(); new_tunnel->SetOnDoneCallback( - base::BindOnce(&IsolatedPrerenderBrowserTest::OnProxyTunnelDone, + base::BindOnce(&PrefetchProxyBrowserTest::OnProxyTunnelDone, base::Unretained(this), new_tunnel.get())); EXPECT_TRUE(new_tunnel->ConnectToPeerOnLocalhost( request_origin.EffectiveIntPort())); @@ -801,9 +801,10 @@ // This method is called on embedded test server thread. Post the // information on UI thread. content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(&IsolatedPrerenderBrowserTest:: - MonitorProxyResourceRequestOnUIThread, - base::Unretained(this), request)); + FROM_HERE, + base::BindOnce( + &PrefetchProxyBrowserTest::MonitorProxyResourceRequestOnUIThread, + base::Unretained(this), request)); std::unique_ptr<net::test_server::BasicHttpResponse> resp = std::make_unique<net::test_server::BasicHttpResponse>(); @@ -891,7 +892,7 @@ }; IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ServiceWorkerRegistrationIsNotEligible)) { SetDataSaverEnabled(true); @@ -929,7 +930,7 @@ kSRPClickPrefetchStatusName)); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(DRPClientConfigPlumbing)) { SetDataSaverEnabled(true); auto client_config = WaitForUpdatedCustomProxyConfig(); @@ -937,7 +938,7 @@ } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoAuthChallenges_FromProxy)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -963,7 +964,7 @@ EXPECT_FALSE(auth_observer->GotAuthChallenge()); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(CookieOnHigherLevelDomain)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -972,8 +973,8 @@ ASSERT_TRUE(content::SetCookie(browser()->profile(), GURL("https://foo.com"), "type=PeanutButter")); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL prefetch_url("https://m.foo.com"); GURL doc_url("https://www.google.com/search?q=test"); @@ -988,11 +989,11 @@ ASSERT_TRUE(tab_helper->after_srp_metrics()); EXPECT_EQ( base::make_optional( - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies), + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies), tab_helper->after_srp_metrics()->prefetch_status_); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(CookieOnOtherPath)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -1001,8 +1002,8 @@ ASSERT_TRUE(content::SetCookie(browser()->profile(), GURL("https://foo.com"), "cookietype=PeanutButter;path=/cookiecookie")); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL prefetch_url("https://foo.com/no-cookies-here"); GURL doc_url("https://www.google.com/search?q=test"); @@ -1017,11 +1018,11 @@ ASSERT_TRUE(tab_helper->after_srp_metrics()); EXPECT_EQ( base::make_optional( - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies), + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies), tab_helper->after_srp_metrics()->prefetch_status_); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ExpiredCookie)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -1031,8 +1032,8 @@ browser()->profile(), GetOriginServerURL("/"), "cookietype=Stale;Expires=Sat, 1 Jan 2000 00:00:00 GMT")); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL prefetch_url = GetOriginServerURL("/simple.html"); @@ -1054,13 +1055,13 @@ ui_test_utils::NavigateToURL(browser(), prefetch_url); ASSERT_TRUE(tab_helper->after_srp_metrics()); - EXPECT_EQ(base::make_optional( - IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe), - tab_helper->after_srp_metrics()->prefetch_status_); + EXPECT_EQ( + base::make_optional(PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe), + tab_helper->after_srp_metrics()->prefetch_status_); } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(CookieOnNonApplicableDomain)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -1069,8 +1070,8 @@ ASSERT_TRUE(content::SetCookie(browser()->profile(), GURL("https://foo.com"), "cookietype=Oatmeal")); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL prefetch_url = GetOriginServerURL("/simple.html"); @@ -1092,13 +1093,13 @@ ui_test_utils::NavigateToURL(browser(), prefetch_url); ASSERT_TRUE(tab_helper->after_srp_metrics()); - EXPECT_EQ(base::make_optional( - IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe), - tab_helper->after_srp_metrics()->prefetch_status_); + EXPECT_EQ( + base::make_optional(PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe), + tab_helper->after_srp_metrics()->prefetch_status_); } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoAuthChallenges_FromOrigin)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -1118,8 +1119,8 @@ // Test that an origin auth challenge does not show a dialog. auth_observer->Reset(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); TestTabHelperObserver tab_helper_observer(tab_helper); base::RunLoop run_loop; @@ -1136,14 +1137,14 @@ EXPECT_FALSE(auth_observer->GotAuthChallenge()); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ConnectProxyEndtoEnd)) { SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), GetOriginServerURL("/simple.html")); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); TestTabHelperObserver tab_helper_observer(tab_helper); GURL prefetch_url = GetOriginServerURL("/title2.html"); @@ -1172,7 +1173,7 @@ EXPECT_EQ(starting_origin_request_count, OriginServerRequestCount()); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_Success)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -1182,8 +1183,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link_1 = GetOriginServerURL("/title1.html"); GURL eligible_link_2 = GetOriginServerURL("/title2.html"); @@ -1363,7 +1364,7 @@ // 204's don't commit so this is used to test that the AfterSRPMetrics UKM event // is recorded if the page does not commit. In the wild, we expect this to // normally occur due to aborted navigations but the end result is the same. -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_NoCommit)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -1373,8 +1374,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link_204 = GetOriginServerURL("/prefetch/prefetch_proxy/page204.html"); @@ -1426,7 +1427,7 @@ } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_PrefetchError)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -1436,8 +1437,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL prefetch_404_url = GetOriginServerURL("/404_on_prefetch"); @@ -1501,7 +1502,7 @@ } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_LinkNotOnSRP)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -1511,8 +1512,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/title1.html"); @@ -1577,7 +1578,7 @@ } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_LinkNotEligible)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -1641,15 +1642,15 @@ } IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderBrowserTest, + PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingUKM_PrefetchNotStarted)) { GURL starting_page = GetOriginServerURL("/simple.html"); SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); // By default, only 1 link will be prefetched. GURL eligible_link_1 = GetOriginServerURL("/title1.html"); @@ -1719,15 +1720,15 @@ ukm::builders::PrefetchProxy_AfterSRPClick::kProbeLatencyMsName)); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(CookiesUsedAndCopied)) { GURL starting_page = GetOriginServerURL("/simple.html"); SetDataSaverEnabled(true); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -1793,7 +1794,7 @@ net::CookieOptions::SameSiteCookieContext::MakeInclusive())); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ClientCertDenied)) { // Make the browser use the ClientCertStoreStub instead of the regular one. ProfileNetworkContextServiceFactory::GetForContext(browser()->profile()) @@ -1834,8 +1835,8 @@ EXPECT_EQ(entry->GetPageType(), content::PAGE_TYPE_NORMAL); // Prefetching the page should fail. - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); TestTabHelperObserver tab_helper_observer(tab_helper); tab_helper_observer.SetExpectedPrefetchErrors( @@ -1852,7 +1853,7 @@ run_loop.Run(); } -class PolicyTestIsolatedPrerenderBrowserTest : public policy::PolicyTest { +class PolicyTestPrefetchProxyBrowserTest : public policy::PolicyTest { public: void SetUp() override { scoped_feature_list_.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1883,7 +1884,7 @@ }; // Predictions should be ignored when the preload setting is disabled by policy. -IN_PROC_BROWSER_TEST_F(PolicyTestIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PolicyTestPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoPrefetching)) { policy::PolicyMap policies; policies.Set( @@ -1892,8 +1893,8 @@ base::Value(chrome_browser_net::NETWORK_PREDICTION_NEVER), nullptr); UpdateProviderPolicy(policies); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL doc_url("https://www.google.com/search?q=test"); MakeNavigationPrediction(doc_url, {GURL("https://test.com/")}); @@ -1904,10 +1905,10 @@ // A negative test where the only thing missing is the policy change from // default, ensure that predictions are getting used. -IN_PROC_BROWSER_TEST_F(PolicyTestIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(PolicyTestPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchingWithDefault)) { - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL doc_url("https://www.google.com/search?q=test"); MakeNavigationPrediction(doc_url, {GURL("https://test.com/")}); @@ -1916,17 +1917,16 @@ EXPECT_EQ(tab_helper->srp_metrics().predicted_urls_count_, 1U); } -class SSLReportingIsolatedPrerenderBrowserTest - : public IsolatedPrerenderBrowserTest { +class SSLReportingPrefetchProxyBrowserTest : public PrefetchProxyBrowserTest { public: - SSLReportingIsolatedPrerenderBrowserTest() { + SSLReportingPrefetchProxyBrowserTest() { // Certificate reports are only sent from official builds, unless this has // been called. CertReportHelper::SetFakeOfficialBuildForTesting(); } void SetUpCommandLine(base::CommandLine* cmd) override { - IsolatedPrerenderBrowserTest::SetUpCommandLine(cmd); + PrefetchProxyBrowserTest::SetUpCommandLine(cmd); cmd->RemoveSwitch("ignore-certificate-errors"); // CertReportHelper::ShouldReportCertificateError checks the value of this @@ -1948,7 +1948,7 @@ }; IN_PROC_BROWSER_TEST_F( - SSLReportingIsolatedPrerenderBrowserTest, + SSLReportingPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoIntersitialSSLErrorReporting)) { SetDataSaverEnabled(true); WaitForUpdatedCustomProxyConfig(); @@ -1968,13 +1968,13 @@ ui_test_utils::NavigateToURL(browser(), safe_page); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = https_expired_server.GetURL("b.test", "/simple.html"); TestTabHelperObserver tab_helper_observer(tab_helper); - // |ERR_ABORTED| is set by the IsolatedPrerenderNetworkContextClient. + // |ERR_ABORTED| is set by the PrefetchProxyNetworkContextClient. tab_helper_observer.SetExpectedPrefetchErrors( {{eligible_link, net::ERR_ABORTED}}); @@ -1992,19 +1992,19 @@ EXPECT_FALSE(GetInterstitialPage(GetWebContents())); } -class DomainReliabilityIsolatedPrerenderBrowserTest - : public IsolatedPrerenderBrowserTest { +class DomainReliabilityPrefetchProxyBrowserTest + : public PrefetchProxyBrowserTest { public: - DomainReliabilityIsolatedPrerenderBrowserTest() = default; + DomainReliabilityPrefetchProxyBrowserTest() = default; void SetUp() override { ProfileNetworkContextService::SetDiscardDomainReliabilityUploadsForTesting( false); - IsolatedPrerenderBrowserTest::SetUp(); + PrefetchProxyBrowserTest::SetUp(); } void SetUpCommandLine(base::CommandLine* cmd) override { - IsolatedPrerenderBrowserTest::SetUpCommandLine(cmd); + PrefetchProxyBrowserTest::SetUpCommandLine(cmd); cmd->AppendSwitch(switches::kEnableDomainReliability); } @@ -2028,7 +2028,7 @@ }; IN_PROC_BROWSER_TEST_F( - DomainReliabilityIsolatedPrerenderBrowserTest, + DomainReliabilityPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoDomainReliabilityUploads)) { SetDataSaverEnabled(true); WaitForUpdatedCustomProxyConfig(); @@ -2036,13 +2036,13 @@ net::EmbeddedTestServer https_report_server( net::EmbeddedTestServer::TYPE_HTTPS); https_report_server.RegisterRequestMonitor(base::BindRepeating( - &DomainReliabilityIsolatedPrerenderBrowserTest::RequestMonitor, + &DomainReliabilityPrefetchProxyBrowserTest::RequestMonitor, base::Unretained(this))); net::test_server::RegisterDefaultHandlers(&https_report_server); ASSERT_TRUE(https_report_server.Start()); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); { mojo::ScopedAllowSyncCallForTesting allow_sync_call; @@ -2097,11 +2097,11 @@ EXPECT_EQ(1U, found_reports); } -class ProbingEnabled_CanaryOff_HTTPHead_IsolatedPrerenderBrowserTest - : public IsolatedPrerenderBrowserTest { +class ProbingEnabled_CanaryOff_HTTPHead_PrefetchProxyBrowserTest + : public PrefetchProxyBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBrowserTest::SetFeatures(); + PrefetchProxyBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kIsolatePrerendersMustProbeOrigin, {{"do_canary", "false"}, {"replace_tls_with_http", "true"}}); @@ -2112,15 +2112,15 @@ }; IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOff_HTTPHead_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOff_HTTPHead_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeGood)) { SetDataSaverEnabled(true); GURL starting_page = GetOriginServerURL("/simple.html"); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/title2.html"); @@ -2182,7 +2182,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOff_HTTPHead_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOff_HTTPHead_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeBad)) { SetDataSaverEnabled(true); GURL starting_page = GetOriginServerURL("/simple.html"); @@ -2190,14 +2190,14 @@ WaitForUpdatedCustomProxyConfig(); // Override the probing URL. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); CustomProbeOverrideDelegate delegate(GURL("http://invalid.com")); service->origin_prober()->SetProbeURLOverrideDelegateOverrideForTesting( &delegate); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/title2.html"); @@ -2251,8 +2251,7 @@ EXPECT_NE(base::nullopt, probe_latency_ms); } -class IsolatedPrerenderBaseProbingBrowserTest - : public IsolatedPrerenderBrowserTest { +class PrefetchProxyBaseProbingBrowserTest : public PrefetchProxyBrowserTest { public: const base::HistogramTester& histogram_tester() const { return histogram_tester_; @@ -2277,8 +2276,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/title2.html"); @@ -2299,8 +2298,8 @@ probe_success ? probing_server.GetURL("a.test", "/") : GURL("http://invalid.com")); - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); service->origin_prober()->SetProbeURLOverrideDelegateOverrideForTesting( &probe_delegate); @@ -2352,11 +2351,11 @@ base::HistogramTester histogram_tester_; }; -class ProbingEnabled_CanaryOn_BothCanaryGood_IsolatedPrerenderBrowserTest - : public IsolatedPrerenderBaseProbingBrowserTest { +class ProbingEnabled_CanaryOn_BothCanaryGood_PrefetchProxyBrowserTest + : public PrefetchProxyBaseProbingBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBaseProbingBrowserTest::SetFeatures(); + PrefetchProxyBaseProbingBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kIsolatePrerendersMustProbeOrigin, { @@ -2370,12 +2369,11 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -class - ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryBad_IsolatedPrerenderBrowserTest - : public IsolatedPrerenderBaseProbingBrowserTest { +class ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryBad_PrefetchProxyBrowserTest + : public PrefetchProxyBaseProbingBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBaseProbingBrowserTest::SetFeatures(); + PrefetchProxyBaseProbingBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kIsolatePrerendersMustProbeOrigin, { @@ -2390,11 +2388,11 @@ }; class - ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryGood_IsolatedPrerenderBrowserTest - : public IsolatedPrerenderBaseProbingBrowserTest { + ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryGood_PrefetchProxyBrowserTest + : public PrefetchProxyBaseProbingBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBaseProbingBrowserTest::SetFeatures(); + PrefetchProxyBaseProbingBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kIsolatePrerendersMustProbeOrigin, { @@ -2409,11 +2407,11 @@ }; class - ProbingEnabled_CanaryOn_TLSCanaryGood_DNSCanaryBad_IsolatedPrerenderBrowserTest - : public IsolatedPrerenderBaseProbingBrowserTest { + ProbingEnabled_CanaryOn_TLSCanaryGood_DNSCanaryBad_PrefetchProxyBrowserTest + : public PrefetchProxyBaseProbingBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBaseProbingBrowserTest::SetFeatures(); + PrefetchProxyBaseProbingBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kIsolatePrerendersMustProbeOrigin, { @@ -2427,11 +2425,11 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -class ProbingEnabled_CanaryOn_CanaryBad_IsolatedPrerenderBrowserTest - : public IsolatedPrerenderBaseProbingBrowserTest { +class ProbingEnabled_CanaryOn_CanaryBad_PrefetchProxyBrowserTest + : public PrefetchProxyBaseProbingBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBaseProbingBrowserTest::SetFeatures(); + PrefetchProxyBaseProbingBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kIsolatePrerendersMustProbeOrigin, {{"do_canary", "true"}, {"canary_url", "http://invalid.com"}}); @@ -2441,11 +2439,11 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -class ProbingDisabledIsolatedPrerenderBrowserTest - : public IsolatedPrerenderBaseProbingBrowserTest { +class ProbingDisabledPrefetchProxyBrowserTest + : public PrefetchProxyBaseProbingBrowserTest { public: void SetFeatures() override { - IsolatedPrerenderBaseProbingBrowserTest::SetFeatures(); + PrefetchProxyBaseProbingBrowserTest::SetFeatures(); scoped_feature_list_.InitAndDisableFeature( features::kIsolatePrerendersMustProbeOrigin); } @@ -2455,7 +2453,7 @@ }; IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_BothCanaryGood_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_BothCanaryGood_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoProbe)) { RunProbeTest(/*probe_success=*/false, /*expect_successful_tls_probe=*/false, @@ -2464,7 +2462,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_TLSCanaryGood_DNSCanaryBad_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_TLSCanaryGood_DNSCanaryBad_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(DNSProbeOK)) { RunProbeTest(/*probe_success=*/true, /*expect_successful_tls_probe=*/false, @@ -2478,7 +2476,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_TLSCanaryGood_DNSCanaryBad_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_TLSCanaryGood_DNSCanaryBad_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(DNSProbeBad)) { RunProbeTest(/*probe_success=*/false, /*expect_successful_tls_probe=*/false, @@ -2487,7 +2485,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryBad_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryBad_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(TLSProbeOK)) { RunProbeTest(/*probe_success=*/true, /*expect_successful_tls_probe=*/true, @@ -2496,7 +2494,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryBad_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryBad_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(TLSProbeBad)) { RunProbeTest(/*probe_success=*/false, /*expect_successful_tls_probe=*/false, @@ -2505,7 +2503,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryGood_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryGood_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(TLSProbeOK)) { RunProbeTest(/*probe_success=*/true, /*expect_successful_tls_probe=*/true, @@ -2514,7 +2512,7 @@ } IN_PROC_BROWSER_TEST_F( - ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryGood_IsolatedPrerenderBrowserTest, + ProbingEnabled_CanaryOn_TLSCanaryBad_DNSCanaryGood_PrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(TLSProbeBad)) { RunProbeTest(/*probe_success=*/false, /*expect_successful_tls_probe=*/false, @@ -2522,16 +2520,15 @@ /*expect_probe=*/true); } -class IsolatedPrerenderWithNSPBrowserTest - : public IsolatedPrerenderBrowserTest { +class PrefetchProxyWithNSPBrowserTest : public PrefetchProxyBrowserTest { public: void SetUpCommandLine(base::CommandLine* cmd) override { - IsolatedPrerenderBrowserTest::SetUpCommandLine(cmd); + PrefetchProxyBrowserTest::SetUpCommandLine(cmd); cmd->AppendSwitch("isolated-prerender-nsp-enabled"); } void SetFeatures() override { - IsolatedPrerenderBrowserTest::SetFeatures(); + PrefetchProxyBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeature( blink::features::kLightweightNoStatePrefetch); } @@ -2540,7 +2537,7 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(SuccessfulNSPEndToEnd)) { base::HistogramTester histogram_tester; @@ -2552,8 +2549,8 @@ ui_test_utils::WaitForHistoryToLoad(HistoryServiceFactory::GetForProfile( browser()->profile(), ServiceAccessType::EXPLICIT_ACCESS)); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -2626,9 +2623,9 @@ EXPECT_FALSE(found_image); // Verify the resource load was reported to the subresource manager. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); - IsolatedPrerenderSubresourceManager* manager = + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxySubresourceManager* manager = service->GetSubresourceManagerForURL(eligible_link); ASSERT_TRUE(manager); @@ -2711,7 +2708,7 @@ "IsolatedPrerender.AfterClick.Subresources.UsedCache", true, 2); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(StartsSpareRenderer)) { // Enable low-end device mode to turn off automatic spare renderers. Note that // this will also prevent NSPs from triggering, but the logic under test @@ -2726,8 +2723,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -2820,7 +2817,7 @@ } // namespace IN_PROC_BROWSER_TEST_F( - IsolatedPrerenderWithNSPBrowserTest, + PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NSPWithIneligibleSubresourceRedirect)) { net::EmbeddedTestServer non_eligible_origin( net::EmbeddedTestServer::TYPE_HTTPS); @@ -2841,8 +2838,8 @@ SetDataSaverEnabled(true); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = eligible_origin.GetURL("a.test", "/page.html"); @@ -2867,9 +2864,9 @@ nsp_run_loop.Run(); // Verify the resource load was reported to the subresource manager. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); - IsolatedPrerenderSubresourceManager* manager = + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxySubresourceManager* manager = service->GetSubresourceManagerForURL(eligible_link); ASSERT_TRUE(manager); @@ -2881,7 +2878,7 @@ EXPECT_EQ(expected_subresources, manager->successfully_loaded_subresources()); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(PrefetchButNSPDenied)) { // NSP is disabled on low-end devices. base::CommandLine::ForCurrentProcess()->AppendSwitch( @@ -2892,8 +2889,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -2926,7 +2923,7 @@ kSRPClickPrefetchStatusName)); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(OnlyOneNSP)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -2936,8 +2933,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link_1 = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -2991,15 +2988,15 @@ kSRPClickPrefetchStatusName)); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoAppCache)) { SetDataSaverEnabled(true); GURL starting_page = GetOriginServerURL("/simple.html"); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/app_cache.html"); @@ -3035,15 +3032,15 @@ origin_requests_after_prerender.size()); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(NoLinkRelSearch)) { SetDataSaverEnabled(true); GURL starting_page = GetOriginServerURL("/simple.html"); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/link-rel-search-tag.html"); @@ -3079,7 +3076,7 @@ origin_requests_after_prerender.size()); } -IN_PROC_BROWSER_TEST_F(IsolatedPrerenderWithNSPBrowserTest, +IN_PROC_BROWSER_TEST_F(PrefetchProxyWithNSPBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(LimitSubresourceCount)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -3091,8 +3088,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3133,16 +3130,16 @@ kSRPClickPrefetchStatusName)); } -class ProbingAndNSPEnabledIsolatedPrerenderBrowserTest - : public IsolatedPrerenderBrowserTest { +class ProbingAndNSPEnabledPrefetchProxyBrowserTest + : public PrefetchProxyBrowserTest { public: void SetUpCommandLine(base::CommandLine* cmd) override { - IsolatedPrerenderBrowserTest::SetUpCommandLine(cmd); + PrefetchProxyBrowserTest::SetUpCommandLine(cmd); cmd->AppendSwitch("isolated-prerender-nsp-enabled"); } void SetFeatures() override { - IsolatedPrerenderBrowserTest::SetFeatures(); + PrefetchProxyBrowserTest::SetFeatures(); scoped_feature_list_.InitAndEnableFeature( blink::features::kLightweightNoStatePrefetch); probing_scoped_feature_list_.InitAndEnableFeatureWithParameters( @@ -3154,15 +3151,15 @@ base::test::ScopedFeatureList probing_scoped_feature_list_; }; -IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeGood_NSPSuccess)) { SetDataSaverEnabled(true); GURL starting_page = GetOriginServerURL("/simple.html"); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3254,7 +3251,7 @@ << ActualHumanReadableMetricsToDebugString(actual_entries); } -IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeGood_NSPDenied)) { // NSP is disabled on low-end devices. base::CommandLine::ForCurrentProcess()->AppendSwitch( @@ -3265,8 +3262,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3299,7 +3296,7 @@ kSRPClickPrefetchStatusName)); } -IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeGood_NSPNotStarted)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -3309,8 +3306,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link_1 = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3364,15 +3361,15 @@ kSRPClickPrefetchStatusName)); } -IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeBad_NSPSuccess)) { SetDataSaverEnabled(true); GURL starting_page = GetOriginServerURL("/simple.html"); ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3402,8 +3399,8 @@ proxy_server_requests(); // Override the probing URL. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); CustomProbeOverrideDelegate delegate(GURL("http://invalid.com")); service->origin_prober()->SetProbeURLOverrideDelegateOverrideForTesting( &delegate); @@ -3490,7 +3487,7 @@ << ActualHumanReadableMetricsToDebugString(actual_entries); } -IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeBad_NSPDenied)) { // NSP is disabled on low-end devices. base::CommandLine::ForCurrentProcess()->AppendSwitch( @@ -3501,8 +3498,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3522,8 +3519,8 @@ prefetch_run_loop.Run(); // Override the probing URL. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); CustomProbeOverrideDelegate delegate(GURL("http://invalid.com")); service->origin_prober()->SetProbeURLOverrideDelegateOverrideForTesting( &delegate); @@ -3542,7 +3539,7 @@ kSRPClickPrefetchStatusName)); } -IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledIsolatedPrerenderBrowserTest, +IN_PROC_BROWSER_TEST_F(ProbingAndNSPEnabledPrefetchProxyBrowserTest, DISABLE_ON_WIN_MAC_CHROMEOS(ProbeBad_NSPNotStarted)) { base::CommandLine::ForCurrentProcess()->AppendSwitch( "isolated-prerender-unlimited-prefetches"); @@ -3552,8 +3549,8 @@ ui_test_utils::NavigateToURL(browser(), starting_page); WaitForUpdatedCustomProxyConfig(); - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(GetWebContents()); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(GetWebContents()); GURL eligible_link_1 = GetOriginServerURL("/prefetch/prefetch_proxy/prefetch_page.html"); @@ -3594,8 +3591,8 @@ prefetch_2_run_loop.Run(); // Override the probing URL. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(browser()->profile()); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(browser()->profile()); CustomProbeOverrideDelegate delegate(GURL("http://invalid.com")); service->origin_prober()->SetProbeURLOverrideDelegateOverrideForTesting( &delegate);
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.cc similarity index 89% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.cc index 994a394..6e0d990 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" namespace features {
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h similarity index 60% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h index 560edd5..b940e88 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_FEATURES_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_FEATURES_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_FEATURES_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_FEATURES_H_ #include "base/feature_list.h" @@ -14,4 +14,4 @@ } // namespace features -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_FEATURES_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_FEATURES_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc similarity index 76% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc index 41e410d..ceb16681 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.h" #include "base/bind.h" #include "base/check_op.h" @@ -16,7 +16,7 @@ #include "services/network/public/cpp/resource_request.h" #include "services/network/public/mojom/url_response_head.mojom.h" -IsolatedPrerenderFromStringURLLoader::IsolatedPrerenderFromStringURLLoader( +PrefetchProxyFromStringURLLoader::PrefetchProxyFromStringURLLoader( std::unique_ptr<PrefetchedMainframeResponseContainer> response, const network::ResourceRequest& tentative_resource_request) : head_(response->TakeHead()), @@ -24,10 +24,9 @@ base::MakeRefCounted<net::StringIOBuffer>(response->TakeBody())), bytes_of_raw_data_to_transfer_(body_buffer_->size()) {} -IsolatedPrerenderFromStringURLLoader::~IsolatedPrerenderFromStringURLLoader() = - default; +PrefetchProxyFromStringURLLoader::~PrefetchProxyFromStringURLLoader() = default; -void IsolatedPrerenderFromStringURLLoader::FollowRedirect( +void PrefetchProxyFromStringURLLoader::FollowRedirect( const std::vector<std::string>& removed_headers, const net::HttpRequestHeaders& modified_headers, const net::HttpRequestHeaders& modified_cors_exempt_headers, @@ -35,21 +34,21 @@ NOTREACHED(); } -void IsolatedPrerenderFromStringURLLoader::SetPriority( +void PrefetchProxyFromStringURLLoader::SetPriority( net::RequestPriority priority, int32_t intra_priority_value) { // Ignore: this class doesn't have a concept of priority. } -void IsolatedPrerenderFromStringURLLoader::PauseReadingBodyFromNet() { +void PrefetchProxyFromStringURLLoader::PauseReadingBodyFromNet() { // Ignore: this class doesn't read from network. } -void IsolatedPrerenderFromStringURLLoader::ResumeReadingBodyFromNet() { +void PrefetchProxyFromStringURLLoader::ResumeReadingBodyFromNet() { // Ignore: this class doesn't read from network. } -void IsolatedPrerenderFromStringURLLoader::TransferRawData() { +void PrefetchProxyFromStringURLLoader::TransferRawData() { while (true) { DCHECK_GE(bytes_of_raw_data_to_transfer_, write_position_); uint32_t write_size = @@ -78,20 +77,20 @@ } } -IsolatedPrerenderFromStringURLLoader::RequestHandler -IsolatedPrerenderFromStringURLLoader::ServingResponseHandler() { - return base::BindOnce(&IsolatedPrerenderFromStringURLLoader::BindAndStart, +PrefetchProxyFromStringURLLoader::RequestHandler +PrefetchProxyFromStringURLLoader::ServingResponseHandler() { + return base::BindOnce(&PrefetchProxyFromStringURLLoader::BindAndStart, weak_ptr_factory_.GetWeakPtr()); } -void IsolatedPrerenderFromStringURLLoader::BindAndStart( +void PrefetchProxyFromStringURLLoader::BindAndStart( const network::ResourceRequest& request, mojo::PendingReceiver<network::mojom::URLLoader> receiver, mojo::PendingRemote<network::mojom::URLLoaderClient> client) { DCHECK(!receiver_.is_bound()); receiver_.Bind(std::move(receiver)); receiver_.set_disconnect_handler( - base::BindOnce(&IsolatedPrerenderFromStringURLLoader::OnMojoDisconnect, + base::BindOnce(&PrefetchProxyFromStringURLLoader::OnMojoDisconnect, weak_ptr_factory_.GetWeakPtr())); client_.Bind(std::move(client)); @@ -116,13 +115,13 @@ handle_watcher_->Watch( producer_handle_.get(), MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_WATCH_CONDITION_SATISFIED, - base::BindRepeating(&IsolatedPrerenderFromStringURLLoader::OnHandleReady, + base::BindRepeating(&PrefetchProxyFromStringURLLoader::OnHandleReady, weak_ptr_factory_.GetWeakPtr())); TransferRawData(); } -void IsolatedPrerenderFromStringURLLoader::OnHandleReady( +void PrefetchProxyFromStringURLLoader::OnHandleReady( MojoResult result, const mojo::HandleSignalsState& state) { if (result != MOJO_RESULT_OK) { @@ -132,7 +131,7 @@ TransferRawData(); } -void IsolatedPrerenderFromStringURLLoader::Finish(int error) { +void PrefetchProxyFromStringURLLoader::Finish(int error) { client_->OnComplete(network::URLLoaderCompletionStatus(error)); handle_watcher_.reset(); producer_handle_.reset(); @@ -142,13 +141,13 @@ MaybeDeleteSelf(); } -void IsolatedPrerenderFromStringURLLoader::OnMojoDisconnect() { +void PrefetchProxyFromStringURLLoader::OnMojoDisconnect() { receiver_.reset(); client_.reset(); MaybeDeleteSelf(); } -void IsolatedPrerenderFromStringURLLoader::MaybeDeleteSelf() { +void PrefetchProxyFromStringURLLoader::MaybeDeleteSelf() { if (!receiver_.is_bound() && !client_.is_bound()) { delete this; }
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.h similarity index 82% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.h index 70047bc..9e74229 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_FROM_STRING_URL_LOADER_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_FROM_STRING_URL_LOADER_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_FROM_STRING_URL_LOADER_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_FROM_STRING_URL_LOADER_H_ #include <cstdint> #include <memory> #include <string> #include "base/memory/weak_ptr.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" #include "content/public/browser/url_loader_request_interceptor.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -28,18 +28,18 @@ class StringIOBuffer; } -class IsolatedPrerenderFromStringURLLoader : public network::mojom::URLLoader { +class PrefetchProxyFromStringURLLoader : public network::mojom::URLLoader { public: using RequestHandler = base::OnceCallback<void( const network::ResourceRequest& resource_request, mojo::PendingReceiver<network::mojom::URLLoader> url_loader_receiver, mojo::PendingRemote<network::mojom::URLLoaderClient> client)>; - IsolatedPrerenderFromStringURLLoader( + PrefetchProxyFromStringURLLoader( std::unique_ptr<PrefetchedMainframeResponseContainer> response, const network::ResourceRequest& tentative_resource_request); - ~IsolatedPrerenderFromStringURLLoader() override; + ~PrefetchProxyFromStringURLLoader() override; // Called when the response should be served to the user. Returns a handler. RequestHandler ServingResponseHandler(); @@ -95,10 +95,10 @@ mojo::ScopedDataPipeProducerHandle producer_handle_; std::unique_ptr<mojo::SimpleWatcher> handle_watcher_; - base::WeakPtrFactory<IsolatedPrerenderFromStringURLLoader> weak_ptr_factory_{ + base::WeakPtrFactory<PrefetchProxyFromStringURLLoader> weak_ptr_factory_{ this}; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderFromStringURLLoader); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyFromStringURLLoader); }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_FROM_STRING_URL_LOADER_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_FROM_STRING_URL_LOADER_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.cc similarity index 71% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.cc index f54decf..e13e488 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.cc
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h" #include <memory> #include "mojo/public/cpp/bindings/remote.h" -IsolatedPrerenderNetworkContextClient::IsolatedPrerenderNetworkContextClient() = +PrefetchProxyNetworkContextClient::PrefetchProxyNetworkContextClient() = default; -IsolatedPrerenderNetworkContextClient:: - ~IsolatedPrerenderNetworkContextClient() = default; +PrefetchProxyNetworkContextClient::~PrefetchProxyNetworkContextClient() = + default; -void IsolatedPrerenderNetworkContextClient::OnAuthRequired( +void PrefetchProxyNetworkContextClient::OnAuthRequired( const base::Optional<base::UnguessableToken>& window_id, int32_t process_id, int32_t routing_id, @@ -29,7 +29,7 @@ auth_challenge_responder_remote->OnAuthCredentials(base::nullopt); } -void IsolatedPrerenderNetworkContextClient::OnCertificateRequested( +void PrefetchProxyNetworkContextClient::OnCertificateRequested( const base::Optional<base::UnguessableToken>& window_id, int32_t process_id, int32_t routing_id, @@ -42,7 +42,7 @@ cert_responder->CancelRequest(); } -void IsolatedPrerenderNetworkContextClient::OnSSLCertificateError( +void PrefetchProxyNetworkContextClient::OnSSLCertificateError( int32_t process_id, int32_t routing_id, const GURL& url, @@ -53,7 +53,7 @@ std::move(response).Run(net::ERR_ABORTED); } -void IsolatedPrerenderNetworkContextClient::OnFileUploadRequested( +void PrefetchProxyNetworkContextClient::OnFileUploadRequested( int32_t process_id, bool async, const std::vector<base::FilePath>& file_paths, @@ -61,19 +61,19 @@ std::move(callback).Run(net::ERR_ACCESS_DENIED, std::vector<base::File>()); } -void IsolatedPrerenderNetworkContextClient::OnCanSendReportingReports( +void PrefetchProxyNetworkContextClient::OnCanSendReportingReports( const std::vector<url::Origin>& origins, OnCanSendReportingReportsCallback callback) { std::move(callback).Run(std::vector<url::Origin>()); } -void IsolatedPrerenderNetworkContextClient::OnCanSendDomainReliabilityUpload( +void PrefetchProxyNetworkContextClient::OnCanSendDomainReliabilityUpload( const GURL& origin, OnCanSendDomainReliabilityUploadCallback callback) { std::move(callback).Run(false); } -void IsolatedPrerenderNetworkContextClient::OnClearSiteData( +void PrefetchProxyNetworkContextClient::OnClearSiteData( int32_t process_id, int32_t routing_id, const GURL& url, @@ -84,7 +84,7 @@ } #if defined(OS_ANDROID) -void IsolatedPrerenderNetworkContextClient::OnGenerateHttpNegotiateAuthToken( +void PrefetchProxyNetworkContextClient::OnGenerateHttpNegotiateAuthToken( const std::string& server_auth_token, bool can_delegate, const std::string& auth_negotiate_android_account_type, @@ -95,13 +95,12 @@ #endif #if defined(OS_CHROMEOS) -void IsolatedPrerenderNetworkContextClient::OnTrustAnchorUsed() {} +void PrefetchProxyNetworkContextClient::OnTrustAnchorUsed() {} #endif -void IsolatedPrerenderNetworkContextClient:: - OnTrustTokenIssuanceDivertedToSystem( - network::mojom::FulfillTrustTokenIssuanceRequestPtr request, - OnTrustTokenIssuanceDivertedToSystemCallback callback) { +void PrefetchProxyNetworkContextClient::OnTrustTokenIssuanceDivertedToSystem( + network::mojom::FulfillTrustTokenIssuanceRequestPtr request, + OnTrustTokenIssuanceDivertedToSystemCallback callback) { auto response = network::mojom::FulfillTrustTokenIssuanceAnswer::New(); response->status = network::mojom::FulfillTrustTokenIssuanceAnswer::Status::kNotFound;
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h similarity index 88% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h index 14e4198..4a8b285 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_NETWORK_CONTEXT_CLIENT_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_NETWORK_CONTEXT_CLIENT_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_NETWORK_CONTEXT_CLIENT_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_NETWORK_CONTEXT_CLIENT_H_ #include "build/build_config.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -12,11 +12,11 @@ // This is a NetworkContextClient that purposely does nothing so that no extra // network traffic can occur during an Isolated Prerender, potentially causing a // privacy leak to the user. -class IsolatedPrerenderNetworkContextClient +class PrefetchProxyNetworkContextClient : public network::mojom::NetworkContextClient { public: - IsolatedPrerenderNetworkContextClient(); - ~IsolatedPrerenderNetworkContextClient() override; + PrefetchProxyNetworkContextClient(); + ~PrefetchProxyNetworkContextClient() override; // network::mojom::NetworkContextClient implementation: void OnAuthRequired( @@ -77,4 +77,4 @@ OnTrustTokenIssuanceDivertedToSystemCallback callback) override; }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_NETWORK_CONTEXT_CLIENT_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_NETWORK_CONTEXT_CLIENT_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc similarity index 78% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc index 9a351095..d0d1255 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h" #include "base/bind.h" #include "base/feature_list.h" @@ -10,7 +10,7 @@ #include "base/strings/string_util.h" #include "base/task/post_task.h" #include "chrome/browser/availability/availability_prober.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -28,9 +28,9 @@ namespace { net::NetworkTrafficAnnotationTag GetProbingTrafficAnnotation() { - return net::DefineNetworkTrafficAnnotation("isolated_prerender_probe", R"( + return net::DefineNetworkTrafficAnnotation("prefetch_proxy_probe", R"( semantics { - sender: "Isolated Prerender Probe Loader" + sender: "Prefetch Proxy Probe Loader" description: "Verifies the end to end connection between Chrome and the " "origin site that the user is currently navigating to. This is " @@ -97,7 +97,7 @@ class TLSProber { public: TLSProber(const GURL& url, - IsolatedPrerenderOriginProber::OnProbeResultCallback callback) + PrefetchProxyOriginProber::OnProbeResultCallback callback) : url_(url), callback_(std::move(callback)) {} ~TLSProber() { DCHECK(!callback_); } @@ -143,9 +143,9 @@ mojo::ScopedDataPipeConsumerHandle receive_stream, mojo::ScopedDataPipeProducerHandle send_stream, const base::Optional<net::SSLInfo>& ssl_info) { - std::move(callback_).Run( - result == net::OK ? IsolatedPrerenderProbeResult::kTLSProbeSuccess - : IsolatedPrerenderProbeResult::kTLSProbeFailure); + std::move(callback_).Run(result == net::OK + ? PrefetchProxyProbeResult::kTLSProbeSuccess + : PrefetchProxyProbeResult::kTLSProbeFailure); delete this; } @@ -158,7 +158,7 @@ } void HandleFailure() { - std::move(callback_).Run(IsolatedPrerenderProbeResult::kTLSProbeFailure); + std::move(callback_).Run(PrefetchProxyProbeResult::kTLSProbeFailure); delete this; } @@ -166,7 +166,7 @@ const GURL url_; // The callback to run when the probe is complete. - IsolatedPrerenderOriginProber::OnProbeResultCallback callback_; + PrefetchProxyOriginProber::OnProbeResultCallback callback_; // Mojo sockets. We only test that both can be connected. mojo::Remote<network::mojom::TCPConnectedSocket> tcp_socket_; @@ -175,13 +175,11 @@ base::WeakPtrFactory<TLSProber> weak_factory_{this}; }; -void HTTPProbeHelper( - std::unique_ptr<AvailabilityProber> prober, - IsolatedPrerenderOriginProber::OnProbeResultCallback callback, - bool success) { - std::move(callback).Run(success - ? IsolatedPrerenderProbeResult::kTLSProbeSuccess - : IsolatedPrerenderProbeResult::kTLSProbeFailure); +void HTTPProbeHelper(std::unique_ptr<AvailabilityProber> prober, + PrefetchProxyOriginProber::OnProbeResultCallback callback, + bool success) { + std::move(callback).Run(success ? PrefetchProxyProbeResult::kTLSProbeSuccess + : PrefetchProxyProbeResult::kTLSProbeFailure); } class CanaryCheckDelegate : public AvailabilityProber::Delegate { @@ -245,23 +243,23 @@ } // namespace -IsolatedPrerenderOriginProber::IsolatedPrerenderOriginProber(Profile* profile) +PrefetchProxyOriginProber::PrefetchProxyOriginProber(Profile* profile) : profile_(profile) { - if (!IsolatedPrerenderProbingEnabled()) + if (!PrefetchProxyProbingEnabled()) return; - if (!IsolatedPrerenderCanaryCheckEnabled()) + if (!PrefetchProxyCanaryCheckEnabled()) return; net::NetworkTrafficAnnotationTag traffic_annotation = - net::DefineNetworkTrafficAnnotation("isolated_prerender_canary_check", R"( + net::DefineNetworkTrafficAnnotation("prefetch_proxy_canary_check", R"( semantics { - sender: "Isolated Prerender Canary Checker" + sender: "Prefetch Proxy Canary Checker" description: "Sends a request over HTTP to a known host in order to determine " "if the network is subject to web filtering. If this request is " - "blocked, the Isolated Prerender feature will check that a " - "navigated site is not blocked by the network before using " - "proxied resources." + "blocked, the Prefetch Proxy feature will check that a navigated " + "site is not blocked by the network before using proxied " + "resources." trigger: "Used at browser startup for Lite mode users when the feature is " "enabled." @@ -278,7 +276,7 @@ })"); AvailabilityProber::TimeoutPolicy timeout_policy; - timeout_policy.base_timeout = IsolatedPrerenderProbeTimeout(); + timeout_policy.base_timeout = PrefetchProxyProbeTimeout(); AvailabilityProber::RetryPolicy retry_policy; retry_policy.max_retries = 0; @@ -288,12 +286,12 @@ ->GetURLLoaderFactoryForBrowserProcess(), profile_->GetPrefs(), AvailabilityProber::ClientName::kIsolatedPrerenderTLSCanaryCheck, - IsolatedPrerenderTLSCanaryCheckURL(), - AvailabilityProber::HttpMethod::kGet, net::HttpRequestHeaders(), - retry_policy, timeout_policy, traffic_annotation, - 10 /* max_cache_entries */, IsolatedPrerenderCanaryCheckCacheLifetime()); + PrefetchProxyTLSCanaryCheckURL(), AvailabilityProber::HttpMethod::kGet, + net::HttpRequestHeaders(), retry_policy, timeout_policy, + traffic_annotation, 10 /* max_cache_entries */, + PrefetchProxyCanaryCheckCacheLifetime()); tls_canary_check_->SetOnCompleteCallback( - base::BindOnce(&IsolatedPrerenderOriginProber::OnTLSCanaryCheckComplete, + base::BindOnce(&PrefetchProxyOriginProber::OnTLSCanaryCheckComplete, weak_factory_.GetWeakPtr())); dns_canary_check_ = std::make_unique<AvailabilityProber>( @@ -302,10 +300,10 @@ ->GetURLLoaderFactoryForBrowserProcess(), profile_->GetPrefs(), AvailabilityProber::ClientName::kIsolatedPrerenderDNSCanaryCheck, - IsolatedPrerenderDNSCanaryCheckURL(), - AvailabilityProber::HttpMethod::kGet, net::HttpRequestHeaders(), - retry_policy, timeout_policy, traffic_annotation, - 10 /* max_cache_entries */, IsolatedPrerenderCanaryCheckCacheLifetime()); + PrefetchProxyDNSCanaryCheckURL(), AvailabilityProber::HttpMethod::kGet, + net::HttpRequestHeaders(), retry_policy, timeout_policy, + traffic_annotation, 10 /* max_cache_entries */, + PrefetchProxyCanaryCheckCacheLifetime()); // This code is running at browser startup. Start the canary check when we get // the chance, but there's no point in it being ready for the first navigation @@ -317,9 +315,9 @@ base::TimeDelta::FromSeconds(1)); } -IsolatedPrerenderOriginProber::~IsolatedPrerenderOriginProber() = default; +PrefetchProxyOriginProber::~PrefetchProxyOriginProber() = default; -void IsolatedPrerenderOriginProber::OnTLSCanaryCheckComplete(bool success) { +void PrefetchProxyOriginProber::OnTLSCanaryCheckComplete(bool success) { // If the TLS check was not successful, don't bother with the DNS check. if (!success) return; @@ -327,11 +325,11 @@ StartCanaryCheck(dns_canary_check_->AsWeakPtr()); } -bool IsolatedPrerenderOriginProber::ShouldProbeOrigins() const { - if (!IsolatedPrerenderProbingEnabled()) { +bool PrefetchProxyOriginProber::ShouldProbeOrigins() const { + if (!PrefetchProxyProbingEnabled()) { return false; } - if (!IsolatedPrerenderCanaryCheckEnabled()) { + if (!PrefetchProxyCanaryCheckEnabled()) { return true; } DCHECK(tls_canary_check_); @@ -347,22 +345,21 @@ return !(tls_success && dns_success); } -void IsolatedPrerenderOriginProber:: - SetProbeURLOverrideDelegateOverrideForTesting( - ProbeURLOverrideDelegate* delegate) { +void PrefetchProxyOriginProber::SetProbeURLOverrideDelegateOverrideForTesting( + ProbeURLOverrideDelegate* delegate) { override_delegate_ = delegate; } -bool IsolatedPrerenderOriginProber::IsTLSCanaryCheckCompleteForTesting() const { +bool PrefetchProxyOriginProber::IsTLSCanaryCheckCompleteForTesting() const { return tls_canary_check_->LastProbeWasSuccessful().has_value(); } -bool IsolatedPrerenderOriginProber::IsDNSCanaryCheckActiveForTesting() const { +bool PrefetchProxyOriginProber::IsDNSCanaryCheckActiveForTesting() const { return dns_canary_check_->is_active(); } -void IsolatedPrerenderOriginProber::Probe(const GURL& url, - OnProbeResultCallback callback) { +void PrefetchProxyOriginProber::Probe(const GURL& url, + OnProbeResultCallback callback) { DCHECK(ShouldProbeOrigins()); GURL probe_url = url; @@ -376,7 +373,7 @@ : false; if (!tls_canary_check_success) { - if (IsolatedPrerenderMustHTTPProbeInsteadOfTLS()) { + if (PrefetchProxyMustHTTPProbeInsteadOfTLS()) { HTTPProbe(probe_url, std::move(callback)); return; } @@ -387,17 +384,17 @@ DNSProbe(probe_url, std::move(callback)); } -void IsolatedPrerenderOriginProber::DNSProbe(const GURL& url, - OnProbeResultCallback callback) { +void PrefetchProxyOriginProber::DNSProbe(const GURL& url, + OnProbeResultCallback callback) { StartDNSResolution(url, std::move(callback), /*also_do_tls_connect=*/false); } -void IsolatedPrerenderOriginProber::TLSProbe(const GURL& url, - OnProbeResultCallback callback) { +void PrefetchProxyOriginProber::TLSProbe(const GURL& url, + OnProbeResultCallback callback) { StartDNSResolution(url, std::move(callback), /*also_do_tls_connect=*/true); } -void IsolatedPrerenderOriginProber::StartDNSResolution( +void PrefetchProxyOriginProber::StartDNSResolution( const GURL& url, OnProbeResultCallback callback, bool also_do_tls_connect) { @@ -411,11 +408,11 @@ resolve_host_parameters->initial_priority = net::RequestPriority::HIGHEST; mojo::PendingRemote<network::mojom::ResolveHostClient> client_remote; - mojo::MakeSelfOwnedReceiver(std::make_unique<DNSProber>(base::BindOnce( - &IsolatedPrerenderOriginProber::OnDNSResolved, - weak_factory_.GetWeakPtr(), url, - std::move(callback), also_do_tls_connect)), - client_remote.InitWithNewPipeAndPassReceiver()); + mojo::MakeSelfOwnedReceiver( + std::make_unique<DNSProber>(base::BindOnce( + &PrefetchProxyOriginProber::OnDNSResolved, weak_factory_.GetWeakPtr(), + url, std::move(callback), also_do_tls_connect)), + client_remote.InitWithNewPipeAndPassReceiver()); content::BrowserContext::GetDefaultStoragePartition(profile_) ->GetNetworkContext() @@ -424,10 +421,10 @@ std::move(client_remote)); } -void IsolatedPrerenderOriginProber::HTTPProbe(const GURL& url, - OnProbeResultCallback callback) { +void PrefetchProxyOriginProber::HTTPProbe(const GURL& url, + OnProbeResultCallback callback) { AvailabilityProber::TimeoutPolicy timeout_policy; - timeout_policy.base_timeout = IsolatedPrerenderProbeTimeout(); + timeout_policy.base_timeout = PrefetchProxyProbeTimeout(); AvailabilityProber::RetryPolicy retry_policy; retry_policy.max_retries = 0; @@ -453,7 +450,7 @@ prober_ptr->SendNowIfInactive(false /* send_only_in_foreground */); } -void IsolatedPrerenderOriginProber::OnDNSResolved( +void PrefetchProxyOriginProber::OnDNSResolved( const GURL& url, OnProbeResultCallback callback, bool also_do_tls_connect, @@ -464,19 +461,19 @@ // A TLS connection needs the resolved addresses, so it also fails here. if (!successful) { - std::move(callback).Run(IsolatedPrerenderProbeResult::kDNSProbeFailure); + std::move(callback).Run(PrefetchProxyProbeResult::kDNSProbeFailure); return; } if (!also_do_tls_connect) { - std::move(callback).Run(IsolatedPrerenderProbeResult::kDNSProbeSuccess); + std::move(callback).Run(PrefetchProxyProbeResult::kDNSProbeSuccess); return; } DoTLSProbeAfterDNSResolution(url, std::move(callback), *resolved_addresses); } -void IsolatedPrerenderOriginProber::DoTLSProbeAfterDNSResolution( +void PrefetchProxyOriginProber::DoTLSProbeAfterDNSResolution( const GURL& url, OnProbeResultCallback callback, const net::AddressList& addresses) {
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h similarity index 82% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h index 973c9af..653041ab 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_ORIGIN_PROBER_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_ORIGIN_PROBER_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_ORIGIN_PROBER_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_ORIGIN_PROBER_H_ #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h" #include "net/base/address_list.h" #include "url/gurl.h" @@ -19,7 +19,7 @@ // feature. Calling code should use |ShouldProbeOrigins| to determine if a probe // is needed before using prefetched resources and if so, call |Probe|. See // http://crbug.com/1109992 for more details. -class IsolatedPrerenderOriginProber { +class PrefetchProxyOriginProber { public: // Allows the url passed to |Probe| to be changed. Only used in testing. class ProbeURLOverrideDelegate { @@ -27,8 +27,8 @@ virtual GURL OverrideProbeURL(const GURL& url) = 0; }; - explicit IsolatedPrerenderOriginProber(Profile* profile); - ~IsolatedPrerenderOriginProber(); + explicit PrefetchProxyOriginProber(Profile* profile); + ~PrefetchProxyOriginProber(); // Returns true if a probe needs to be done before using prefetched resources. bool ShouldProbeOrigins() const; @@ -45,9 +45,9 @@ bool IsDNSCanaryCheckActiveForTesting() const; // Starts a probe to |url| and calls |callback| with an - // |IsolatedPrerenderProbeResult| to indicate success. + // |PrefetchProxyProbeResult| to indicate success. using OnProbeResultCallback = - base::OnceCallback<void(IsolatedPrerenderProbeResult)>; + base::OnceCallback<void(PrefetchProxyProbeResult)>; void Probe(const GURL& url, OnProbeResultCallback callback); private: @@ -92,7 +92,7 @@ // The DNS canary url checker. std::unique_ptr<AvailabilityProber> dns_canary_check_; - base::WeakPtrFactory<IsolatedPrerenderOriginProber> weak_factory_{this}; + base::WeakPtrFactory<PrefetchProxyOriginProber> weak_factory_{this}; }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_ORIGIN_PROBER_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_ORIGIN_PROBER_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc similarity index 81% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc index 5deb571..0dfcc244 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" #include <string> #include <vector> @@ -13,7 +13,7 @@ #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "chrome/common/chrome_features.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" @@ -23,11 +23,11 @@ const char kIsolatedPrerenderEnableNSPCmdLineFlag[] = "isolated-prerender-nsp-enabled"; -bool IsolatedPrerenderIsEnabled() { +bool PrefetchProxyIsEnabled() { return base::FeatureList::IsEnabled(features::kIsolatePrerenders); } -GURL IsolatedPrerenderProxyHost() { +GURL PrefetchProxyProxyHost() { // Command line overrides take priority. std::string cmd_line_value = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( @@ -48,7 +48,7 @@ return GURL("https://tunnel.googlezip.net/"); } -std::string IsolatedPrerenderProxyHeaderKey() { +std::string PrefetchProxyProxyHeaderKey() { std::string header = base::GetFieldTrialParamValueByFeature( features::kIsolatePrerenders, "proxy_header_key"); if (!header.empty()) { @@ -57,20 +57,20 @@ return "chrome-tunnel"; } -bool IsolatedPrerenderOnlyForLiteMode() { +bool PrefetchProxyOnlyForLiteMode() { return base::GetFieldTrialParamByFeatureAsBool(features::kIsolatePrerenders, "lite_mode_only", true); } -bool IsolatedPrerenderNoStatePrefetchSubresources() { +bool PrefetchProxyNoStatePrefetchSubresources() { return base::CommandLine::ForCurrentProcess()->HasSwitch( kIsolatedPrerenderEnableNSPCmdLineFlag) || base::GetFieldTrialParamByFeatureAsBool(features::kIsolatePrerenders, "do_no_state_prefetch", false); } -base::Optional<size_t> IsolatedPrerenderMaximumNumberOfPrefetches() { - if (!IsolatedPrerenderIsEnabled()) { +base::Optional<size_t> PrefetchProxyMaximumNumberOfPrefetches() { + if (!PrefetchProxyIsEnabled()) { return 0; } @@ -87,10 +87,9 @@ return max; } -base::Optional<size_t> -IsolatedPrerenderMaximumNumberOfNoStatePrefetchAttempts() { - if (!IsolatedPrerenderIsEnabled() || - !IsolatedPrerenderNoStatePrefetchSubresources()) { +base::Optional<size_t> PrefetchProxyMaximumNumberOfNoStatePrefetchAttempts() { + if (!PrefetchProxyIsEnabled() || + !PrefetchProxyNoStatePrefetchSubresources()) { return 0; } @@ -107,42 +106,42 @@ return max; } -size_t IsolatedPrerenderMainframeBodyLengthLimit() { +size_t PrefetchProxyMainframeBodyLengthLimit() { return 1024 * base::GetFieldTrialParamByFeatureAsInt( features::kIsolatePrerenders, "max_mainframe_body_length_kb", 5 * 1024); } -size_t IsolatedPrerenderMaximumNumberOfConcurrentPrefetches() { +size_t PrefetchProxyMaximumNumberOfConcurrentPrefetches() { return static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( features::kIsolatePrerenders, "max_concurrent_prefetches", 1)); } -base::TimeDelta IsolatedPrerenderProbeTimeout() { +base::TimeDelta PrefetchProxyProbeTimeout() { return base::TimeDelta::FromMilliseconds( base::GetFieldTrialParamByFeatureAsInt( features::kIsolatePrerendersMustProbeOrigin, "probe_timeout_ms", 10 * 1000 /* 10 seconds */)); } -bool IsolatedPrerenderCloseIdleSockets() { +bool PrefetchProxyCloseIdleSockets() { return base::GetFieldTrialParamByFeatureAsBool(features::kIsolatePrerenders, "close_idle_sockets", true); } -base::TimeDelta IsolatedPrefetchTimeoutDuration() { +base::TimeDelta PrefetchProxyTimeoutDuration() { return base::TimeDelta::FromMilliseconds( base::GetFieldTrialParamByFeatureAsInt(features::kIsolatePrerenders, "prefetch_timeout_ms", 10 * 1000 /* 10 seconds */)); } -bool IsolatedPrerenderProbingEnabled() { +bool PrefetchProxyProbingEnabled() { return base::FeatureList::IsEnabled( features::kIsolatePrerendersMustProbeOrigin); } -bool IsolatedPrerenderCanaryCheckEnabled() { +bool PrefetchProxyCanaryCheckEnabled() { if (!base::FeatureList::IsEnabled( features::kIsolatePrerendersMustProbeOrigin)) { return false; @@ -152,7 +151,7 @@ features::kIsolatePrerendersMustProbeOrigin, "do_canary", true); } -GURL IsolatedPrerenderTLSCanaryCheckURL() { +GURL PrefetchProxyTLSCanaryCheckURL() { GURL url(base::GetFieldTrialParamValueByFeature( features::kIsolatePrerendersMustProbeOrigin, "tls_canary_url")); if (url.is_valid()) { @@ -161,7 +160,7 @@ return GURL("http://tls.tunnel.check.googlezip.net/connect"); } -GURL IsolatedPrerenderDNSCanaryCheckURL() { +GURL PrefetchProxyDNSCanaryCheckURL() { GURL url(base::GetFieldTrialParamValueByFeature( features::kIsolatePrerendersMustProbeOrigin, "dns_canary_url")); if (url.is_valid()) { @@ -170,18 +169,18 @@ return GURL("http://dns.tunnel.check.googlezip.net/connect"); } -base::TimeDelta IsolatedPrerenderCanaryCheckCacheLifetime() { +base::TimeDelta PrefetchProxyCanaryCheckCacheLifetime() { return base::TimeDelta::FromHours(base::GetFieldTrialParamByFeatureAsInt( features::kIsolatePrerendersMustProbeOrigin, "canary_cache_hours", 24)); } -bool IsolatedPrerenderMustHTTPProbeInsteadOfTLS() { +bool PrefetchProxyMustHTTPProbeInsteadOfTLS() { return base::GetFieldTrialParamByFeatureAsBool( features::kIsolatePrerendersMustProbeOrigin, "replace_tls_with_http", false); } -size_t IsolatedPrerenderMaxSubresourcesPerPrerender() { +size_t PrefetchProxyMaxSubresourcesPerPrerender() { std::string cmd_line_value = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( kIsolatedPrerenderLimitNSPSubresourcesCmdLineFlag); @@ -195,14 +194,14 @@ features::kIsolatePrerenders, "max_subresource_count_per_prerender", 50); } -bool IsolatedPrerenderStartsSpareRenderer() { +bool PrefetchProxyStartsSpareRenderer() { return base::CommandLine::ForCurrentProcess()->HasSwitch( "isolated-prerender-start-spare-renderer") || base::GetFieldTrialParamByFeatureAsBool(features::kIsolatePrerenders, "start_spare_renderer", false); } -bool IsolatedPrerenderShouldPrefetchPosition(size_t position) { +bool PrefetchProxyShouldPrefetchPosition(size_t position) { std::string csv = base::GetFieldTrialParamValueByFeature( features::kIsolatePrerenders, "prefetch_positions"); if (csv.empty()) {
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h new file mode 100644 index 0000000..1bee7070 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h
@@ -0,0 +1,91 @@ +// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PARAMS_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PARAMS_H_ + +#include <stdint.h> + +#include "base/optional.h" +#include "base/time/time.h" +#include "url/gurl.h" + +// This command line flag enables NoStatePrefetch on Isolated Prerenders. +extern const char kIsolatedPrerenderEnableNSPCmdLineFlag[]; + +// Overrides the value returned by +// |PrefetchProxyMaxSubresourcesPerPrerender| when a valid long is given. +extern const char kIsolatedPrerenderLimitNSPSubresourcesCmdLineFlag[]; + +// Returns true if the Prefetch Proxy feature is enabled. +bool PrefetchProxyIsEnabled(); + +// The url of the tunnel proxy. +GURL PrefetchProxyProxyHost(); + +// The header name used to connect to the tunnel proxy. +std::string PrefetchProxyProxyHeaderKey(); + +// Whether the feature is only enabled for Lite Mode users. +bool PrefetchProxyOnlyForLiteMode(); + +// Returns true when prefetched pages should run no state prefetch. +bool PrefetchProxyNoStatePrefetchSubresources(); + +// The maximum number of prefetches that should be done from predictions on a +// Google SRP. nullopt is returned for unlimited. Negative values given by the +// field trial return nullopt. +base::Optional<size_t> PrefetchProxyMaximumNumberOfPrefetches(); + +// The maximum number of mainframes allowed to be prefetched at the same time. +size_t PrefetchProxyMaximumNumberOfConcurrentPrefetches(); + +// The maximum number of no state prefetches to attempt, in order to prefetch +// the pages' subresources, while the user is on the SRP. nullopt is returned +// for unlimited. Negative values given by the field trial return nullopt. +base::Optional<size_t> PrefetchProxyMaximumNumberOfNoStatePrefetchAttempts(); + +// The maximum body length allowed to be prefetched for mainframe responses in +// bytes. +size_t PrefetchProxyMainframeBodyLengthLimit(); + +// Whether idle sockets should be closed after every prefetch. +bool PrefetchProxyCloseIdleSockets(); + +// The amount of time to allow before timing out an origin probe. +base::TimeDelta PrefetchProxyProbeTimeout(); + +// The amount of time to allow a prefetch to take before considering it a +// timeout error. +base::TimeDelta PrefetchProxyTimeoutDuration(); + +// Whether probing must be done at all. +bool PrefetchProxyProbingEnabled(); + +// Whether an ISP filtering canary check should be made on browser startup. +bool PrefetchProxyCanaryCheckEnabled(); + +// The URL to use for the TLS canary check. +GURL PrefetchProxyTLSCanaryCheckURL(); + +// The URL to use for the DNS canary check. +GURL PrefetchProxyDNSCanaryCheckURL(); + +// How long a canary check can be cached for the same network. +base::TimeDelta PrefetchProxyCanaryCheckCacheLifetime(); + +// Experimental control to replace TLS probing with HTTP. +bool PrefetchProxyMustHTTPProbeInsteadOfTLS(); + +// The maximum number of subresources that will be fetched per prefetched page. +size_t PrefetchProxyMaxSubresourcesPerPrerender(); + +// Whether a spare renderer should be started after all prefetching and NSP is +// complete. +bool PrefetchProxyStartsSpareRenderer(); + +// Whether the given position of a predicted link should be prefetched. +bool PrefetchProxyShouldPrefetchPosition(size_t position); + +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PARAMS_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc similarity index 65% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params_unittest.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc index 5866fcd..f0368c4d 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" #include <vector> #include "base/test/scoped_feature_list.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "testing/gtest/include/gtest/gtest.h" -TEST(IsolatedPrerenderParamsTest, PrefetchPosition_DefaultEmpty) { +TEST(PrefetchProxyParamsTest, PrefetchPosition_DefaultEmpty) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, {{"prefetch_positions", ""}}); @@ -18,41 +18,41 @@ for (size_t want_position : std::vector<size_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) { SCOPED_TRACE(want_position); - EXPECT_TRUE(IsolatedPrerenderShouldPrefetchPosition(want_position)); + EXPECT_TRUE(PrefetchProxyShouldPrefetchPosition(want_position)); } } -TEST(IsolatedPrerenderParamsTest, PrefetchPosition_SingleIndex) { +TEST(PrefetchProxyParamsTest, PrefetchPosition_SingleIndex) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, {{"prefetch_positions", "0"}}); - EXPECT_TRUE(IsolatedPrerenderShouldPrefetchPosition(0)); + EXPECT_TRUE(PrefetchProxyShouldPrefetchPosition(0)); for (size_t not_want_position : std::vector<size_t>{1, 2, 3, 4, 5, 6, 7, 8, 9}) { SCOPED_TRACE(not_want_position); - EXPECT_FALSE(IsolatedPrerenderShouldPrefetchPosition(not_want_position)); + EXPECT_FALSE(PrefetchProxyShouldPrefetchPosition(not_want_position)); } } -TEST(IsolatedPrerenderParamsTest, PrefetchPosition_Normal) { +TEST(PrefetchProxyParamsTest, PrefetchPosition_Normal) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, {{"prefetch_positions", "0,1,2"}}); for (size_t want_position : std::vector<size_t>{0, 1, 2}) { SCOPED_TRACE(want_position); - EXPECT_TRUE(IsolatedPrerenderShouldPrefetchPosition(want_position)); + EXPECT_TRUE(PrefetchProxyShouldPrefetchPosition(want_position)); } for (size_t not_want_position : std::vector<size_t>{3, 4, 5, 6, 7, 8, 9}) { SCOPED_TRACE(not_want_position); - EXPECT_FALSE(IsolatedPrerenderShouldPrefetchPosition(not_want_position)); + EXPECT_FALSE(PrefetchProxyShouldPrefetchPosition(not_want_position)); } } -TEST(IsolatedPrerenderParamsTest, PrefetchPosition_Messy) { +TEST(PrefetchProxyParamsTest, PrefetchPosition_Messy) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, @@ -60,11 +60,11 @@ for (size_t want_position : std::vector<size_t>{2, 3, 5, 7}) { SCOPED_TRACE(want_position); - EXPECT_TRUE(IsolatedPrerenderShouldPrefetchPosition(want_position)); + EXPECT_TRUE(PrefetchProxyShouldPrefetchPosition(want_position)); } for (size_t not_want_position : std::vector<size_t>{0, 1, 4, 6, 8, 9}) { SCOPED_TRACE(not_want_position); - EXPECT_FALSE(IsolatedPrerenderShouldPrefetchPosition(not_want_position)); + EXPECT_FALSE(PrefetchProxyShouldPrefetchPosition(not_want_position)); } }
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.cc similarity index 74% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.cc index 9e9338b..ebdcdf4 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h" #include "net/http/http_status_code.h" #include "services/metrics/public/cpp/metrics_utils.h" @@ -15,43 +15,42 @@ // This intentionally does not use the same logic as the TabHelper handling of // mainframe prefetches since the returned metric is used in a different place // and context that is not guaranteed to match perfectly. -IsolatedPrerenderPrefetchStatus GetStatusOfPrefetch( +PrefetchProxyPrefetchStatus GetStatusOfPrefetch( network::mojom::URLResponseHead* head, const network::URLLoaderCompletionStatus& status) { if (status.error_code != net::OK) { - return IsolatedPrerenderPrefetchStatus::kPrefetchFailedNetError; + return PrefetchProxyPrefetchStatus::kPrefetchFailedNetError; } if (!head || !head->headers) { - return IsolatedPrerenderPrefetchStatus::kPrefetchFailedNetError; + return PrefetchProxyPrefetchStatus::kPrefetchFailedNetError; } int response_code = head->headers->response_code(); if (response_code < net::HTTP_OK || response_code >= net::HTTP_MULTIPLE_CHOICES) { - return IsolatedPrerenderPrefetchStatus::kPrefetchFailedNon2XX; + return PrefetchProxyPrefetchStatus::kPrefetchFailedNon2XX; } - return IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful; + return PrefetchProxyPrefetchStatus::kPrefetchSuccessful; } } // namespace -IsolatedPrerenderPrefetchMetricsCollector::PrefetchMetric::PrefetchMetric() = +PrefetchProxyPrefetchMetricsCollector::PrefetchMetric::PrefetchMetric() = default; -IsolatedPrerenderPrefetchMetricsCollector::PrefetchMetric::PrefetchMetric( +PrefetchProxyPrefetchMetricsCollector::PrefetchMetric::PrefetchMetric( const PrefetchMetric& copy) = default; -IsolatedPrerenderPrefetchMetricsCollector::PrefetchMetric::~PrefetchMetric() = +PrefetchProxyPrefetchMetricsCollector::PrefetchMetric::~PrefetchMetric() = default; -IsolatedPrerenderPrefetchMetricsCollector:: - IsolatedPrerenderPrefetchMetricsCollector( - base::TimeTicks navigation_start_time, - ukm::SourceId ukm_source_id) +PrefetchProxyPrefetchMetricsCollector::PrefetchProxyPrefetchMetricsCollector( + base::TimeTicks navigation_start_time, + ukm::SourceId ukm_source_id) : navigation_start_time_(navigation_start_time), ukm_source_id_(ukm_source_id) {} -IsolatedPrerenderPrefetchMetricsCollector:: - ~IsolatedPrerenderPrefetchMetricsCollector() { +PrefetchProxyPrefetchMetricsCollector:: + ~PrefetchProxyPrefetchMetricsCollector() { for (auto entry : resources_by_url_) { const PrefetchMetric& metric = entry.second; @@ -85,7 +84,7 @@ } } -void IsolatedPrerenderPrefetchMetricsCollector::MapMainframeToSubresource( +void PrefetchProxyPrefetchMetricsCollector::MapMainframeToSubresource( const GURL& mainframe_url, const GURL& subresource_url) { auto mainframe_mapping = subresources_by_mainframe_.find(mainframe_url); @@ -97,8 +96,8 @@ } } -base::Optional<IsolatedPrerenderPrefetchStatus> -IsolatedPrerenderPrefetchMetricsCollector::GetStatusOfMainframe( +base::Optional<PrefetchProxyPrefetchStatus> +PrefetchProxyPrefetchMetricsCollector::GetStatusOfMainframe( const GURL& url) const { auto mainframe_entry = resources_by_url_.find(url); if (mainframe_entry != resources_by_url_.end()) { @@ -109,7 +108,7 @@ } base::Optional<size_t> -IsolatedPrerenderPrefetchMetricsCollector::GetLinkPositionOfMainframe( +PrefetchProxyPrefetchMetricsCollector::GetLinkPositionOfMainframe( const GURL& url) const { auto mainframe_entry = resources_by_url_.find(url); if (mainframe_entry != resources_by_url_.end()) { @@ -119,10 +118,10 @@ return base::nullopt; } -void IsolatedPrerenderPrefetchMetricsCollector::OnMainframeResourceNotEligible( +void PrefetchProxyPrefetchMetricsCollector::OnMainframeResourceNotEligible( const GURL& url, size_t prediction_position, - IsolatedPrerenderPrefetchStatus status) { + PrefetchProxyPrefetchStatus status) { PrefetchMetric metric; metric.status = status; metric.is_mainframe = true; @@ -132,10 +131,10 @@ resources_by_url_.emplace(url, metric); } -void IsolatedPrerenderPrefetchMetricsCollector::OnSubresourceNotEligible( +void PrefetchProxyPrefetchMetricsCollector::OnSubresourceNotEligible( const GURL& mainframe_url, const GURL& subresource_url, - IsolatedPrerenderPrefetchStatus status) { + PrefetchProxyPrefetchStatus status) { PrefetchMetric metric; metric.status = status; metric.is_mainframe = false; @@ -147,7 +146,7 @@ MapMainframeToSubresource(mainframe_url, subresource_url); } -void IsolatedPrerenderPrefetchMetricsCollector::OnMainframeResourcePrefetched( +void PrefetchProxyPrefetchMetricsCollector::OnMainframeResourcePrefetched( const GURL& url, size_t prediction_position, network::mojom::URLResponseHeadPtr head, @@ -168,7 +167,7 @@ resources_by_url_.emplace(url, metric); } -void IsolatedPrerenderPrefetchMetricsCollector::OnSubresourcePrefetched( +void PrefetchProxyPrefetchMetricsCollector::OnSubresourcePrefetched( const GURL& mainframe_url, const GURL& subresource_url, network::mojom::URLResponseHeadPtr head, @@ -191,7 +190,7 @@ MapMainframeToSubresource(mainframe_url, subresource_url); } -void IsolatedPrerenderPrefetchMetricsCollector::OnMainframeNavigatedTo( +void PrefetchProxyPrefetchMetricsCollector::OnMainframeNavigatedTo( const GURL& url) { // Set was clicked on the mainframe. auto mainframe_entry = resources_by_url_.find(url); @@ -216,28 +215,28 @@ } } -void IsolatedPrerenderPrefetchMetricsCollector:: - OnMainframeNavigationProbeResult(const GURL& url, - IsolatedPrerenderProbeResult result) { +void PrefetchProxyPrefetchMetricsCollector::OnMainframeNavigationProbeResult( + const GURL& url, + PrefetchProxyProbeResult result) { auto mainframe_entry = resources_by_url_.find(url); if (mainframe_entry == resources_by_url_.end()) { return; } switch (result) { - case IsolatedPrerenderProbeResult::kNoProbing: + case PrefetchProxyProbeResult::kNoProbing: mainframe_entry->second.status = - IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe; + PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe; break; - case IsolatedPrerenderProbeResult::kDNSProbeSuccess: - case IsolatedPrerenderProbeResult::kTLSProbeSuccess: + case PrefetchProxyProbeResult::kDNSProbeSuccess: + case PrefetchProxyProbeResult::kTLSProbeSuccess: mainframe_entry->second.status = - IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccess; + PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccess; break; - case IsolatedPrerenderProbeResult::kTLSProbeFailure: - case IsolatedPrerenderProbeResult::kDNSProbeFailure: + case PrefetchProxyProbeResult::kTLSProbeFailure: + case PrefetchProxyProbeResult::kDNSProbeFailure: mainframe_entry->second.status = - IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailed; + PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailed; break; } @@ -258,7 +257,7 @@ } } -void IsolatedPrerenderPrefetchMetricsCollector::OnCachedSubresourceUsed( +void PrefetchProxyPrefetchMetricsCollector::OnCachedSubresourceUsed( const GURL& mainframe_url, const GURL& subresource_url) { auto entry_iter = resources_by_url_.find(subresource_url); @@ -267,7 +266,7 @@ return; } - base::Optional<IsolatedPrerenderPrefetchStatus> status = + base::Optional<PrefetchProxyPrefetchStatus> status = GetStatusOfMainframe(mainframe_url); if (status) { entry_iter->second.status = *status;
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h similarity index 74% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h index a240f2a18..eddf48a 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PREFETCH_METRICS_COLLECTOR_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PREFETCH_METRICS_COLLECTOR_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_METRICS_COLLECTOR_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_METRICS_COLLECTOR_H_ #include <stdint.h> #include <map> @@ -13,8 +13,8 @@ #include "base/memory/scoped_refptr.h" #include "base/optional.h" #include "base/time/time.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h" #include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/cpp/url_loader_completion_status.h" #include "services/network/public/mojom/url_response_head.mojom-forward.h" @@ -23,24 +23,23 @@ // Collects metrics on every prefetched resource (mainframes and subresources), // for recording in UKM. The passed UKM source id is the source that the events // will be logged to. UKM is recorded on destruction of this class. -class IsolatedPrerenderPrefetchMetricsCollector - : public base::RefCounted<IsolatedPrerenderPrefetchMetricsCollector> { +class PrefetchProxyPrefetchMetricsCollector + : public base::RefCounted<PrefetchProxyPrefetchMetricsCollector> { public: - IsolatedPrerenderPrefetchMetricsCollector( - base::TimeTicks navigation_start_time, - ukm::SourceId ukm_source_id); + PrefetchProxyPrefetchMetricsCollector(base::TimeTicks navigation_start_time, + ukm::SourceId ukm_source_id); // Called when a mainframe resource is not eligible for prefetching. Note that // if a mainframe is given here, |OnSubresourceNotEligible| is not expected to // be called. void OnMainframeResourceNotEligible(const GURL& url, size_t prediction_position, - IsolatedPrerenderPrefetchStatus status); + PrefetchProxyPrefetchStatus status); // Called when a subresource is not eligible to be prefetched. void OnSubresourceNotEligible(const GURL& mainframe_url, const GURL& subresource_url, - IsolatedPrerenderPrefetchStatus status); + PrefetchProxyPrefetchStatus status); // Called when the prefetch of a mainframe completes. void OnMainframeResourcePrefetched( @@ -62,7 +61,7 @@ // Called when the mainframe resource for |url| might be used from cache, // depending on |probe_success|. void OnMainframeNavigationProbeResult(const GURL& url, - IsolatedPrerenderProbeResult result); + PrefetchProxyProbeResult result); // Called when a subresource is reused from the cache after a mainframe is // navigated to. @@ -70,8 +69,8 @@ const GURL& subresource_url); private: - friend class RefCounted<IsolatedPrerenderPrefetchMetricsCollector>; - ~IsolatedPrerenderPrefetchMetricsCollector(); + friend class RefCounted<PrefetchProxyPrefetchMetricsCollector>; + ~PrefetchProxyPrefetchMetricsCollector(); // Helper method that makes a corresponding entry in // |subresources_by_mainframe_|. @@ -82,7 +81,7 @@ base::Optional<size_t> GetLinkPositionOfMainframe(const GURL& url) const; // Helper method that gets the status of the given mainframe |url|. - base::Optional<IsolatedPrerenderPrefetchStatus> GetStatusOfMainframe( + base::Optional<PrefetchProxyPrefetchStatus> GetStatusOfMainframe( const GURL& url) const; // Represents a single resource that was prefetched. @@ -91,8 +90,8 @@ PrefetchMetric(const PrefetchMetric& copy); ~PrefetchMetric(); - IsolatedPrerenderPrefetchStatus status = - IsolatedPrerenderPrefetchStatus::kPrefetchNotStarted; + PrefetchProxyPrefetchStatus status = + PrefetchProxyPrefetchStatus::kPrefetchNotStarted; // Whether the resource is a mainframe or subresource. bool is_mainframe = false; @@ -115,7 +114,7 @@ base::Optional<bool> was_clicked; // How this resource's page was filtered on navigation, if at all. - base::Optional<IsolatedPrerenderProbeResult> filtering_result; + base::Optional<PrefetchProxyProbeResult> filtering_result; }; const base::TimeTicks navigation_start_time_; @@ -128,7 +127,7 @@ // Holds all the metrics that will be recorded, indexed by their url. std::map<GURL, PrefetchMetric> resources_by_url_; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderPrefetchMetricsCollector); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyPrefetchMetricsCollector); }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PREFETCH_METRICS_COLLECTOR_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_METRICS_COLLECTOR_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector_unittest.cc similarity index 88% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector_unittest.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector_unittest.cc index a260952..bd0f848 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h" #include <string> #include <vector> @@ -79,25 +79,25 @@ using UkmEntry = ukm::TestUkmRecorder::HumanReadableUkmEntry; -class IsolatedPrerenderPrefetchMetricsCollectorTest +class PrefetchProxyPrefetchMetricsCollectorTest : public ChromeRenderViewHostTestHarness {}; -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, MainframesNotEligible) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, MainframesNotEligible) { ukm::TestAutoSetUkmRecorder ukm_recorder; { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourceNotEligible( GURL("http://not-navigated.com"), /*prediction_position=*/0, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); collector->OnMainframeResourceNotEligible( GURL("http://navigated.com"), /*prediction_position=*/1, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); collector->OnMainframeNavigatedTo(GURL("http://navigated.com")); } @@ -123,7 +123,7 @@ << ActualUkmEntriesToDebugString(entries); } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, SubresourcesNavigationUpdatedWithMainframe) { GURL mainframe_url("https://eligible.com"); @@ -131,13 +131,13 @@ { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourceNotEligible( GURL("http://not-eligible.com"), /*prediction_position=*/0, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); collector->OnMainframeResourcePrefetched( mainframe_url, @@ -192,15 +192,14 @@ << ActualUkmEntriesToDebugString(entries); } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, - Mainframe404ResponseCode) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, Mainframe404ResponseCode) { GURL mainframe_url("https://eligible.com"); ukm::TestAutoSetUkmRecorder ukm_recorder; { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourcePrefetched( @@ -229,14 +228,14 @@ << ActualUkmEntriesToDebugString(entries); } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, NoResponseHead) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, NoResponseHead) { GURL mainframe_url("https://eligible.com"); ukm::TestAutoSetUkmRecorder ukm_recorder; { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourcePrefetched( @@ -261,14 +260,14 @@ << ActualUkmEntriesToDebugString(entries); } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, NetError) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, NetError) { GURL mainframe_url("https://eligible.com"); ukm::TestAutoSetUkmRecorder ukm_recorder; { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourcePrefetched( @@ -296,18 +295,18 @@ << ActualUkmEntriesToDebugString(entries); } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, ProbeResult) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, ProbeResult) { GURL mainframe_url("https://eligible.com"); const struct { - IsolatedPrerenderProbeResult probe_result; + PrefetchProxyProbeResult probe_result; int want_status; } kTestCases[] = { - {IsolatedPrerenderProbeResult::kNoProbing, 0}, - {IsolatedPrerenderProbeResult::kDNSProbeSuccess, 1}, - {IsolatedPrerenderProbeResult::kTLSProbeSuccess, 1}, - {IsolatedPrerenderProbeResult::kDNSProbeFailure, 2}, - {IsolatedPrerenderProbeResult::kTLSProbeFailure, 2}, + {PrefetchProxyProbeResult::kNoProbing, 0}, + {PrefetchProxyProbeResult::kDNSProbeSuccess, 1}, + {PrefetchProxyProbeResult::kTLSProbeSuccess, 1}, + {PrefetchProxyProbeResult::kDNSProbeFailure, 2}, + {PrefetchProxyProbeResult::kTLSProbeFailure, 2}, }; for (const auto& test : kTestCases) { @@ -316,7 +315,7 @@ { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourcePrefetched( @@ -352,7 +351,7 @@ } } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, SubresourceReused) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, SubresourceReused) { GURL mainframe_url("https://eligible.com"); GURL subresource_url("https://subresource.com"); GURL subresource_url2("https://subresource.com/2"); @@ -361,7 +360,7 @@ { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourcePrefetched( @@ -386,7 +385,7 @@ collector->OnMainframeNavigatedTo(mainframe_url); collector->OnMainframeNavigationProbeResult( - mainframe_url, IsolatedPrerenderProbeResult::kNoProbing); + mainframe_url, PrefetchProxyProbeResult::kNoProbing); collector->OnCachedSubresourceUsed(mainframe_url, subresource_url); } @@ -434,7 +433,7 @@ << ActualUkmEntriesToDebugString(entries); } -TEST_F(IsolatedPrerenderPrefetchMetricsCollectorTest, TypicalUsage) { +TEST_F(PrefetchProxyPrefetchMetricsCollectorTest, TypicalUsage) { GURL mainframe_url("https://eligible.com"); GURL subresource_url("https://subresource.com"); GURL subresource_url2("https://subresource.com/2"); @@ -443,7 +442,7 @@ { auto collector = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( kNavigationStartTime, kID); collector->OnMainframeResourcePrefetched( @@ -456,7 +455,7 @@ collector->OnMainframeResourceNotEligible( GURL("http://ineligible.com"), /*prediction_position=*/1, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies); collector->OnSubresourcePrefetched( mainframe_url, subresource_url, @@ -472,12 +471,12 @@ collector->OnSubresourceNotEligible( mainframe_url, GURL("http://ineligible.com/subresource"), - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies); collector->OnMainframeNavigatedTo(mainframe_url); collector->OnMainframeNavigationProbeResult( - mainframe_url, IsolatedPrerenderProbeResult::kNoProbing); + mainframe_url, PrefetchProxyProbeResult::kNoProbing); collector->OnCachedSubresourceUsed(mainframe_url, subresource_url); }
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h similarity index 89% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h index f6eb5cc..2388a8ff 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PREFETCH_STATUS_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PREFETCH_STATUS_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_STATUS_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_STATUS_H_ // The various states that a prefetch can go through or terminate with. Used in // UKM logging so don't remove or reorder values. Update -// |IsolatedPrerenderPrefetchStatus| in //tools/metrics/histograms/enums.xml +// |PrefetchProxyPrefetchStatus| in //tools/metrics/histograms/enums.xml // whenever this is changed. -enum class IsolatedPrerenderPrefetchStatus { +enum class PrefetchProxyPrefetchStatus { // The interceptor used a prefetch. kPrefetchUsedNoProbe = 0, @@ -95,4 +95,4 @@ kPrefetchPositionIneligible = 26, }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PREFETCH_STATUS_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PREFETCH_STATUS_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.cc new file mode 100644 index 0000000..2856043 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.cc
@@ -0,0 +1,21 @@ +// Copyright 2020 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/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h" + +#include "base/notreached.h" + +bool PrefetchProxyProbeResultIsSuccess(PrefetchProxyProbeResult result) { + switch (result) { + case PrefetchProxyProbeResult::kNoProbing: + case PrefetchProxyProbeResult::kDNSProbeSuccess: + case PrefetchProxyProbeResult::kTLSProbeSuccess: + return true; + case PrefetchProxyProbeResult::kTLSProbeFailure: + case PrefetchProxyProbeResult::kDNSProbeFailure: + return false; + } + NOTREACHED(); + return false; +}
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h new file mode 100644 index 0000000..36185d2c --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h
@@ -0,0 +1,20 @@ +// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROBE_RESULT_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROBE_RESULT_H_ + +// The result of an origin probe. See PrefetchProxyOriginProber. +enum class PrefetchProxyProbeResult { + kNoProbing = 0, + kDNSProbeSuccess = 1, + kDNSProbeFailure = 2, + kTLSProbeSuccess = 3, + kTLSProbeFailure = 4, +}; + +// Returns true if the probe result is not a failure. +bool PrefetchProxyProbeResultIsSuccess(PrefetchProxyProbeResult result); + +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROBE_RESULT_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.cc similarity index 68% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.cc index 5f9ae09..052cf78 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.cc
@@ -2,34 +2,33 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h" #include "google_apis/google_api_keys.h" #include "net/base/host_port_pair.h" #include "net/proxy_resolution/proxy_config.h" #include "url/gurl.h" -IsolatedPrerenderProxyConfigurator::IsolatedPrerenderProxyConfigurator() { - connect_tunnel_headers_.SetHeader(IsolatedPrerenderProxyHeaderKey(), +PrefetchProxyProxyConfigurator::PrefetchProxyProxyConfigurator() { + connect_tunnel_headers_.SetHeader(PrefetchProxyProxyHeaderKey(), "key=" + google_apis::GetAPIKey()); } -IsolatedPrerenderProxyConfigurator::~IsolatedPrerenderProxyConfigurator() = - default; +PrefetchProxyProxyConfigurator::~PrefetchProxyProxyConfigurator() = default; -void IsolatedPrerenderProxyConfigurator::AddCustomProxyConfigClient( +void PrefetchProxyProxyConfigurator::AddCustomProxyConfigClient( mojo::Remote<network::mojom::CustomProxyConfigClient> config_client) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); proxy_config_clients_.Add(std::move(config_client)); UpdateCustomProxyConfig(); } -void IsolatedPrerenderProxyConfigurator::UpdateCustomProxyConfig() { +void PrefetchProxyProxyConfigurator::UpdateCustomProxyConfig() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsolatedPrerenderIsEnabled()) + if (!PrefetchProxyIsEnabled()) return; network::mojom::CustomProxyConfigPtr config = CreateCustomProxyConfig(); @@ -39,7 +38,7 @@ } network::mojom::CustomProxyConfigPtr -IsolatedPrerenderProxyConfigurator::CreateCustomProxyConfig() const { +PrefetchProxyProxyConfigurator::CreateCustomProxyConfig() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); net::ProxyConfig::ProxyRules rules; @@ -52,10 +51,10 @@ // DIRECT is intentionally not added here because we want the proxy to always // be used in order to mask the user's IP address during the prerender. - DCHECK(IsolatedPrerenderProxyHost().is_valid()); + DCHECK(PrefetchProxyProxyHost().is_valid()); config->rules.proxies_for_https.AddProxyServer(net::ProxyServer( - net::ProxyServer::GetSchemeFromURI(IsolatedPrerenderProxyHost().scheme()), - net::HostPortPair::FromURL(IsolatedPrerenderProxyHost()))); + net::ProxyServer::GetSchemeFromURI(PrefetchProxyProxyHost().scheme()), + net::HostPortPair::FromURL(PrefetchProxyProxyHost()))); // This ensures that the user's set proxy is honored, although we also disable // the feature is such cases.
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h similarity index 69% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h index 2edbeb0..b7ba603 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROXY_CONFIGURATOR_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROXY_CONFIGURATOR_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROXY_CONFIGURATOR_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROXY_CONFIGURATOR_H_ #include <vector> @@ -17,10 +17,10 @@ // Configures the use of the IP-masking CONNECT tunnel proxy for Isolated // Prerenders. -class IsolatedPrerenderProxyConfigurator { +class PrefetchProxyProxyConfigurator { public: - IsolatedPrerenderProxyConfigurator(); - ~IsolatedPrerenderProxyConfigurator(); + PrefetchProxyProxyConfigurator(); + ~PrefetchProxyProxyConfigurator(); // Adds a config client that can be used to update Data Reduction Proxy // settings. @@ -43,10 +43,10 @@ SEQUENCE_CHECKER(sequence_checker_); - IsolatedPrerenderProxyConfigurator( - const IsolatedPrerenderProxyConfigurator&) = delete; - IsolatedPrerenderProxyConfigurator& operator=( - const IsolatedPrerenderProxyConfigurator&) = delete; + PrefetchProxyProxyConfigurator(const PrefetchProxyProxyConfigurator&) = + delete; + PrefetchProxyProxyConfigurator& operator=( + const PrefetchProxyProxyConfigurator&) = delete; }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROXY_CONFIGURATOR_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROXY_CONFIGURATOR_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator_unittest.cc similarity index 84% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator_unittest.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator_unittest.cc index d8a8e6d0..b41dde40 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator_unittest.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h" #include <memory> #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "content/public/test/browser_task_environment.h" #include "google_apis/google_api_keys.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -46,10 +46,10 @@ mojo::Receiver<network::mojom::CustomProxyConfigClient> receiver_; }; -class IsolatedPrerenderProxyConfiguratorTest : public testing::Test { +class PrefetchProxyProxyConfiguratorTest : public testing::Test { public: - IsolatedPrerenderProxyConfiguratorTest() = default; - ~IsolatedPrerenderProxyConfiguratorTest() override = default; + PrefetchProxyProxyConfiguratorTest() = default; + ~PrefetchProxyProxyConfiguratorTest() override = default; network::mojom::CustomProxyConfigPtr LatestProxyConfig() { return std::move(config_client_->config_); @@ -74,11 +74,11 @@ EXPECT_EQ(GURL(config->rules.proxies_for_https.Get().ToURI()), proxy_url); } - IsolatedPrerenderProxyConfigurator* configurator() { + PrefetchProxyProxyConfigurator* configurator() { if (!configurator_) { // Lazy construct and init so that any changed field trials can be picked // used. - configurator_ = std::make_unique<IsolatedPrerenderProxyConfigurator>(); + configurator_ = std::make_unique<PrefetchProxyProxyConfigurator>(); mojo::Remote<network::mojom::CustomProxyConfigClient> client_remote; config_client_ = std::make_unique<TestCustomProxyConfigClient>( client_remote.BindNewPipeAndPassReceiver()); @@ -90,11 +90,11 @@ private: content::BrowserTaskEnvironment task_environment_; - std::unique_ptr<IsolatedPrerenderProxyConfigurator> configurator_; + std::unique_ptr<PrefetchProxyProxyConfigurator> configurator_; std::unique_ptr<TestCustomProxyConfigClient> config_client_; }; -TEST_F(IsolatedPrerenderProxyConfiguratorTest, FeatureOff) { +TEST_F(PrefetchProxyProxyConfiguratorTest, FeatureOff) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndDisableFeature(features::kIsolatePrerenders); @@ -104,7 +104,7 @@ EXPECT_FALSE(LatestProxyConfig()); } -TEST_F(IsolatedPrerenderProxyConfiguratorTest, ExperimentOverrides) { +TEST_F(PrefetchProxyProxyConfiguratorTest, ExperimentOverrides) { GURL proxy_url("https://proxy.com"); base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters(
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc similarity index 75% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc index 6a2f94014..e6af4121 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h" #include "base/barrier_closure.h" #include "base/bind.h" @@ -10,8 +10,8 @@ #include "base/metrics/histogram.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" @@ -53,12 +53,12 @@ // the size of |resources|, then |callback| is run for every url in |resources|. void SingleURLEligibilityCheckResult( const std::vector<GURL>& resources, - IsolatedPrerenderProxyingURLLoaderFactory::ResourceLoadSuccessfulCallback + PrefetchProxyProxyingURLLoaderFactory::ResourceLoadSuccessfulCallback callback, scoped_refptr<SuccessCount> success_count, const GURL& url, bool eligible, - base::Optional<IsolatedPrerenderPrefetchStatus> not_used) { + base::Optional<PrefetchProxyPrefetchStatus> not_used) { if (eligible) { success_count->Increment(); } @@ -80,7 +80,7 @@ void CheckRedirectsBeforeRunningResourceSuccessfulCallback( Profile* profile, const std::vector<GURL>& resources, - IsolatedPrerenderProxyingURLLoaderFactory::ResourceLoadSuccessfulCallback + PrefetchProxyProxyingURLLoaderFactory::ResourceLoadSuccessfulCallback callback) { DCHECK(profile); DCHECK(callback); @@ -89,7 +89,7 @@ base::MakeRefCounted<SuccessCount>(); for (const GURL& url : resources) { - IsolatedPrerenderTabHelper::CheckEligibilityOfURL( + PrefetchProxyTabHelper::CheckEligibilityOfURL( profile, url, base::BindOnce(&SingleURLEligibilityCheckResult, resources, callback, success_count)); @@ -98,9 +98,9 @@ } // namespace -IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest::InProgressRequest( +PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::InProgressRequest( Profile* profile, - IsolatedPrerenderProxyingURLLoaderFactory* parent_factory, + PrefetchProxyProxyingURLLoaderFactory* parent_factory, network::mojom::URLLoaderFactory* target_factory, ResourceLoadSuccessfulCallback on_resource_load_successful, mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, @@ -132,39 +132,38 @@ client_receiver_.set_disconnect_handler(closure); } -IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: - ~InProgressRequest() { +PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::~InProgressRequest() { if (destruction_callback_) { std::move(destruction_callback_).Run(); } } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: - FollowRedirect(const std::vector<std::string>& removed_headers, - const net::HttpRequestHeaders& modified_headers, - const net::HttpRequestHeaders& modified_cors_exempt_headers, - const base::Optional<GURL>& new_url) { +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::FollowRedirect( + const std::vector<std::string>& removed_headers, + const net::HttpRequestHeaders& modified_headers, + const net::HttpRequestHeaders& modified_cors_exempt_headers, + const base::Optional<GURL>& new_url) { target_loader_->FollowRedirect(removed_headers, modified_headers, modified_cors_exempt_headers, new_url); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest::SetPriority( +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::SetPriority( net::RequestPriority priority, int32_t intra_priority_value) { target_loader_->SetPriority(priority, intra_priority_value); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: PauseReadingBodyFromNet() { target_loader_->PauseReadingBodyFromNet(); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: ResumeReadingBodyFromNet() { target_loader_->ResumeReadingBodyFromNet(); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: OnReceiveResponse(network::mojom::URLResponseHeadPtr head) { if (head) { head_ = head->Clone(); @@ -172,43 +171,43 @@ target_client_->OnReceiveResponse(std::move(head)); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: OnReceiveRedirect(const net::RedirectInfo& redirect_info, network::mojom::URLResponseHeadPtr head) { redirect_chain_.push_back(redirect_info.new_url); target_client_->OnReceiveRedirect(redirect_info, std::move(head)); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: - OnUploadProgress(int64_t current_position, - int64_t total_size, - OnUploadProgressCallback callback) { +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::OnUploadProgress( + int64_t current_position, + int64_t total_size, + OnUploadProgressCallback callback) { target_client_->OnUploadProgress(current_position, total_size, std::move(callback)); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: OnReceiveCachedMetadata(mojo_base::BigBuffer data) { target_client_->OnReceiveCachedMetadata(std::move(data)); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: OnTransferSizeUpdated(int32_t transfer_size_diff) { target_client_->OnTransferSizeUpdated(transfer_size_diff); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body) { target_client_->OnStartLoadingResponseBody(std::move(body)); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: SetOnCompleteRecordMetricsCallback( OnCompleteRecordMetricsCallback callback) { on_complete_metrics_callback_ = std::move(callback); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest::OnComplete( +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest::OnComplete( const network::URLLoaderCompletionStatus& status) { if (on_complete_metrics_callback_) { std::move(on_complete_metrics_callback_) @@ -218,13 +217,13 @@ target_client_->OnComplete(status); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: OnBindingsClosed() { // Destroys |this|. parent_factory_->RemoveRequest(this); } -void IsolatedPrerenderProxyingURLLoaderFactory::InProgressRequest:: +void PrefetchProxyProxyingURLLoaderFactory::InProgressRequest:: MaybeReportResourceLoadSuccess( const network::URLLoaderCompletionStatus& status) { if (status.error_code != net::OK) { @@ -262,15 +261,14 @@ profile_, redirect_chain_, on_resource_load_successful_); } -IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::~AbortRequest() = - default; -IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::AbortRequest( +PrefetchProxyProxyingURLLoaderFactory::AbortRequest::~AbortRequest() = default; +PrefetchProxyProxyingURLLoaderFactory::AbortRequest::AbortRequest( mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, mojo::PendingRemote<network::mojom::URLLoaderClient> client) : target_client_(std::move(client)), loader_receiver_(this, std::move(loader_receiver)) { loader_receiver_.set_disconnect_handler(base::BindOnce( - &IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::OnBindingClosed, + &PrefetchProxyProxyingURLLoaderFactory::AbortRequest::OnBindingClosed, base::Unretained(this))); // PostTask the failure to get it out of this message loop, allowing the mojo @@ -278,43 +276,41 @@ content::GetUIThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce( - &IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::Abort, + &PrefetchProxyProxyingURLLoaderFactory::AbortRequest::Abort, weak_factory_.GetWeakPtr())); } -void IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::Abort() { +void PrefetchProxyProxyingURLLoaderFactory::AbortRequest::Abort() { target_client_->OnComplete( network::URLLoaderCompletionStatus(net::ERR_FAILED)); } -void IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::FollowRedirect( +void PrefetchProxyProxyingURLLoaderFactory::AbortRequest::FollowRedirect( const std::vector<std::string>& removed_headers, const net::HttpRequestHeaders& modified_headers, const net::HttpRequestHeaders& modified_cors_exempt_headers, const base::Optional<GURL>& new_url) {} -void IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest::SetPriority( +void PrefetchProxyProxyingURLLoaderFactory::AbortRequest::SetPriority( net::RequestPriority priority, int32_t intra_priority_value) {} -void IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest:: +void PrefetchProxyProxyingURLLoaderFactory::AbortRequest:: PauseReadingBodyFromNet() {} -void IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest:: +void PrefetchProxyProxyingURLLoaderFactory::AbortRequest:: ResumeReadingBodyFromNet() {} -void IsolatedPrerenderProxyingURLLoaderFactory::AbortRequest:: - OnBindingClosed() { +void PrefetchProxyProxyingURLLoaderFactory::AbortRequest::OnBindingClosed() { delete this; } -IsolatedPrerenderProxyingURLLoaderFactory:: - IsolatedPrerenderProxyingURLLoaderFactory( - ResourceMetricsObserver* metrics_observer, - int frame_tree_node_id, - mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, - mojo::PendingRemote<network::mojom::URLLoaderFactory> - network_process_factory, - mojo::PendingRemote<network::mojom::URLLoaderFactory> isolated_factory, - DisconnectCallback on_disconnect, - ResourceLoadSuccessfulCallback on_resource_load_successful) +PrefetchProxyProxyingURLLoaderFactory::PrefetchProxyProxyingURLLoaderFactory( + ResourceMetricsObserver* metrics_observer, + int frame_tree_node_id, + mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver, + mojo::PendingRemote<network::mojom::URLLoaderFactory> + network_process_factory, + mojo::PendingRemote<network::mojom::URLLoaderFactory> isolated_factory, + DisconnectCallback on_disconnect, + ResourceLoadSuccessfulCallback on_resource_load_successful) : metrics_observer_(metrics_observer), frame_tree_node_id_(frame_tree_node_id), on_resource_load_successful_(std::move(on_resource_load_successful)), @@ -323,34 +319,34 @@ network_process_factory_.Bind(std::move(network_process_factory)); network_process_factory_.set_disconnect_handler(base::BindOnce( - &IsolatedPrerenderProxyingURLLoaderFactory::OnNetworkProcessFactoryError, + &PrefetchProxyProxyingURLLoaderFactory::OnNetworkProcessFactoryError, base::Unretained(this))); isolated_factory_.Bind(std::move(isolated_factory)); isolated_factory_.set_disconnect_handler(base::BindOnce( - &IsolatedPrerenderProxyingURLLoaderFactory::OnIsolatedFactoryError, + &PrefetchProxyProxyingURLLoaderFactory::OnIsolatedFactoryError, base::Unretained(this))); proxy_receivers_.Add(this, std::move(loader_receiver)); proxy_receivers_.set_disconnect_handler(base::BindRepeating( - &IsolatedPrerenderProxyingURLLoaderFactory::OnProxyBindingError, + &PrefetchProxyProxyingURLLoaderFactory::OnProxyBindingError, base::Unretained(this))); } -IsolatedPrerenderProxyingURLLoaderFactory:: - ~IsolatedPrerenderProxyingURLLoaderFactory() = default; +PrefetchProxyProxyingURLLoaderFactory:: + ~PrefetchProxyProxyingURLLoaderFactory() = default; -void IsolatedPrerenderProxyingURLLoaderFactory::NotifyPageNavigatedToAfterSRP( +void PrefetchProxyProxyingURLLoaderFactory::NotifyPageNavigatedToAfterSRP( const std::set<GURL>& cached_subresources) { previously_cached_subresources_ = cached_subresources; } -bool IsolatedPrerenderProxyingURLLoaderFactory:: - ShouldHandleRequestForPrerender() const { +bool PrefetchProxyProxyingURLLoaderFactory::ShouldHandleRequestForPrerender() + const { return !previously_cached_subresources_.has_value(); } -void IsolatedPrerenderProxyingURLLoaderFactory::CreateLoaderAndStart( +void PrefetchProxyProxyingURLLoaderFactory::CreateLoaderAndStart( mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, int32_t routing_id, int32_t request_id, @@ -372,7 +368,7 @@ if (ShouldHandleRequestForPrerender()) { // Check if this prerender has exceeded its max number of subresources. request_count_++; - if (request_count_ > IsolatedPrerenderMaxSubresourcesPerPrerender()) { + if (request_count_ > PrefetchProxyMaxSubresourcesPerPrerender()) { metrics_observer_->OnResourceThrottled(request.url); std::unique_ptr<AbortRequest> request = std::make_unique<AbortRequest>( std::move(loader_receiver), std::move(client)); @@ -383,10 +379,10 @@ // We must check if the request can be cached and set the appropriate load // flag if so. - IsolatedPrerenderTabHelper::CheckEligibilityOfURL( + PrefetchProxyTabHelper::CheckEligibilityOfURL( profile, request.url, base::BindOnce( - &IsolatedPrerenderProxyingURLLoaderFactory::OnEligibilityResult, + &PrefetchProxyProxyingURLLoaderFactory::OnEligibilityResult, weak_factory_.GetWeakPtr(), profile, std::move(loader_receiver), routing_id, request_id, options, request, std::move(client), traffic_annotation)); @@ -403,7 +399,7 @@ std::move(loader_receiver), routing_id, request_id, options, request, std::move(client), traffic_annotation); in_progress_request->SetOnCompleteRecordMetricsCallback( - base::BindOnce(&IsolatedPrerenderProxyingURLLoaderFactory:: + base::BindOnce(&PrefetchProxyProxyingURLLoaderFactory:: RecordSubresourceMetricsAfterClick, base::Unretained(this))); requests_.insert(std::move(in_progress_request)); @@ -417,7 +413,7 @@ } } -void IsolatedPrerenderProxyingURLLoaderFactory::OnEligibilityResult( +void PrefetchProxyProxyingURLLoaderFactory::OnEligibilityResult( Profile* profile, mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, int32_t routing_id, @@ -428,7 +424,7 @@ const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, const GURL& url, bool eligible, - base::Optional<IsolatedPrerenderPrefetchStatus> status) { + base::Optional<PrefetchProxyPrefetchStatus> status) { DCHECK_EQ(request.url, url); DCHECK(!previously_cached_subresources_.has_value()); DCHECK(request.cors_exempt_headers.HasHeader( @@ -481,13 +477,13 @@ std::move(loader_receiver), routing_id, request_id, options, isolated_request, std::move(client), traffic_annotation); in_progress_request->SetOnCompleteRecordMetricsCallback( - base::BindOnce(&IsolatedPrerenderProxyingURLLoaderFactory:: + base::BindOnce(&PrefetchProxyProxyingURLLoaderFactory:: RecordSubresourceMetricsDuringPrerender, base::Unretained(this))); requests_.insert(std::move(in_progress_request)); } -void IsolatedPrerenderProxyingURLLoaderFactory:: +void PrefetchProxyProxyingURLLoaderFactory:: RecordSubresourceMetricsDuringPrerender( const GURL& url, network::mojom::URLResponseHeadPtr head, @@ -502,22 +498,21 @@ metrics_observer_->OnResourceFetchComplete(url, std::move(head), status); } -void IsolatedPrerenderProxyingURLLoaderFactory:: - RecordSubresourceMetricsAfterClick( - const GURL& url, - network::mojom::URLResponseHeadPtr head, - const network::URLLoaderCompletionStatus& status) { +void PrefetchProxyProxyingURLLoaderFactory::RecordSubresourceMetricsAfterClick( + const GURL& url, + network::mojom::URLResponseHeadPtr head, + const network::URLLoaderCompletionStatus& status) { UMA_HISTOGRAM_BOOLEAN("IsolatedPrerender.AfterClick.Subresources.UsedCache", status.exists_in_cache); metrics_observer_->OnResourceUsedFromCache(url); } -void IsolatedPrerenderProxyingURLLoaderFactory::Clone( +void PrefetchProxyProxyingURLLoaderFactory::Clone( mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader_receiver) { proxy_receivers_.Add(this, std::move(loader_receiver)); } -void IsolatedPrerenderProxyingURLLoaderFactory::OnNetworkProcessFactoryError() { +void PrefetchProxyProxyingURLLoaderFactory::OnNetworkProcessFactoryError() { // Stop calls to CreateLoaderAndStart() when |network_process_factory_| is // invalid. network_process_factory_.reset(); @@ -526,7 +521,7 @@ MaybeDestroySelf(); } -void IsolatedPrerenderProxyingURLLoaderFactory::OnIsolatedFactoryError() { +void PrefetchProxyProxyingURLLoaderFactory::OnIsolatedFactoryError() { // Stop calls to CreateLoaderAndStart() when |isolated_factory_| is // invalid. isolated_factory_.reset(); @@ -535,7 +530,7 @@ MaybeDestroySelf(); } -void IsolatedPrerenderProxyingURLLoaderFactory::OnProxyBindingError() { +void PrefetchProxyProxyingURLLoaderFactory::OnProxyBindingError() { if (proxy_receivers_.empty()) { network_process_factory_.reset(); } @@ -543,7 +538,7 @@ MaybeDestroySelf(); } -void IsolatedPrerenderProxyingURLLoaderFactory::RemoveRequest( +void PrefetchProxyProxyingURLLoaderFactory::RemoveRequest( InProgressRequest* request) { auto it = requests_.find(request); DCHECK(it != requests_.end()); @@ -552,7 +547,7 @@ MaybeDestroySelf(); } -void IsolatedPrerenderProxyingURLLoaderFactory::MaybeDestroySelf() { +void PrefetchProxyProxyingURLLoaderFactory::MaybeDestroySelf() { // Even if all URLLoaderFactory pipes connected to this object have been // closed it has to stay alive until all active requests have completed. if (network_process_factory_.is_bound() || isolated_factory_.is_bound() ||
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h similarity index 90% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h index ebeaf1c9..6fc4ebe89 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROXYING_URL_LOADER_FACTORY_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROXYING_URL_LOADER_FACTORY_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROXYING_URL_LOADER_FACTORY_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROXYING_URL_LOADER_FACTORY_H_ #include <memory> #include <set> @@ -14,7 +14,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -31,8 +31,8 @@ // This class sends all requests to an isolated network context which will strip // any private information before being sent on the wire. Those requests are // also monitored for when resource loads complete successfully and reports -// those to the |IsolatedPrerenderSubresourceManager| which owns |this|. -class IsolatedPrerenderProxyingURLLoaderFactory +// those to the |PrefetchProxySubresourceManager| which owns |this|. +class PrefetchProxyProxyingURLLoaderFactory : public network::mojom::URLLoaderFactory { public: class ResourceMetricsObserver { @@ -48,21 +48,20 @@ virtual void OnResourceThrottled(const GURL& url) = 0; // Called when a subresource is not eligible to be prefetched. - virtual void OnResourceNotEligible( - const GURL& url, - IsolatedPrerenderPrefetchStatus status) = 0; + virtual void OnResourceNotEligible(const GURL& url, + PrefetchProxyPrefetchStatus status) = 0; // Called when a previously prefetched subresource is loaded from the cache. virtual void OnResourceUsedFromCache(const GURL& url) = 0; }; using DisconnectCallback = - base::OnceCallback<void(IsolatedPrerenderProxyingURLLoaderFactory*)>; + base::OnceCallback<void(PrefetchProxyProxyingURLLoaderFactory*)>; using ResourceLoadSuccessfulCallback = base::RepeatingCallback<void(const GURL& url)>; - IsolatedPrerenderProxyingURLLoaderFactory( + PrefetchProxyProxyingURLLoaderFactory( ResourceMetricsObserver* metrics_observer, int frame_tree_node_id, mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver, @@ -71,7 +70,7 @@ mojo::PendingRemote<network::mojom::URLLoaderFactory> isolated_factory, DisconnectCallback on_disconnect, ResourceLoadSuccessfulCallback on_resource_load_successful); - ~IsolatedPrerenderProxyingURLLoaderFactory() override; + ~PrefetchProxyProxyingURLLoaderFactory() override; // Informs |this| that new subresource loads are being done after the user // clicked on a link that was previously prerendered. From this point on, all @@ -99,7 +98,7 @@ public: InProgressRequest( Profile* profile, - IsolatedPrerenderProxyingURLLoaderFactory* parent_factory, + PrefetchProxyProxyingURLLoaderFactory* parent_factory, network::mojom::URLLoaderFactory* target_factory, ResourceLoadSuccessfulCallback on_resource_load_successful, mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, @@ -154,7 +153,7 @@ Profile* profile_; // Back pointer to the factory which owns this class. - IsolatedPrerenderProxyingURLLoaderFactory* const parent_factory_; + PrefetchProxyProxyingURLLoaderFactory* const parent_factory_; // Callback for recording metrics during |OnComplete|. Not always set. OnCompleteRecordMetricsCallback on_complete_metrics_callback_; @@ -233,7 +232,7 @@ const net::MutableNetworkTrafficAnnotationTag& traffic_annotation, const GURL& url, bool eligible, - base::Optional<IsolatedPrerenderPrefetchStatus> status); + base::Optional<PrefetchProxyPrefetchStatus> status); void RecordSubresourceMetricsDuringPrerender( const GURL& url, @@ -288,10 +287,10 @@ // Deletes |this| when run. DisconnectCallback on_disconnect_; - base::WeakPtrFactory<IsolatedPrerenderProxyingURLLoaderFactory> weak_factory_{ + base::WeakPtrFactory<PrefetchProxyProxyingURLLoaderFactory> weak_factory_{ this}; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderProxyingURLLoaderFactory); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyProxyingURLLoaderFactory); }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_PROXYING_URL_LOADER_FACTORY_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_PROXYING_URL_LOADER_FACTORY_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.cc new file mode 100644 index 0000000..edb73b4 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.cc
@@ -0,0 +1,76 @@ +// Copyright 2020 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/prefetch/prefetch_proxy/prefetch_proxy_service.h" + +#include "base/bind.h" +#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" +#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" +#include "chrome/browser/profiles/profile.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_frame_host.h" + +PrefetchProxyService::PrefetchProxyService(Profile* profile) + : profile_(profile), + proxy_configurator_(std::make_unique<PrefetchProxyProxyConfigurator>()), + origin_prober_(std::make_unique<PrefetchProxyOriginProber>(profile)) {} + +PrefetchProxyService::~PrefetchProxyService() = default; + +bool PrefetchProxyService::MaybeProxyURLLoaderFactory( + content::RenderFrameHost* frame, + int render_process_id, + content::ContentBrowserClient::URLLoaderFactoryType type, + mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver) { + for (const auto& manager_pair : subresource_managers_) { + if (manager_pair.second->MaybeProxyURLLoaderFactory( + frame, render_process_id, type, factory_receiver)) { + return true; + } + } + return false; +} + +PrefetchProxySubresourceManager* PrefetchProxyService::OnAboutToNoStatePrefetch( + const GURL& url, + std::unique_ptr<PrefetchedMainframeResponseContainer> response) { + std::unique_ptr<PrefetchProxySubresourceManager> manager = + std::make_unique<PrefetchProxySubresourceManager>(url, + std::move(response)); + PrefetchProxySubresourceManager* manager_ptr = manager.get(); + subresource_managers_.emplace(url, std::move(manager)); + return manager_ptr; +} + +PrefetchProxySubresourceManager* +PrefetchProxyService::GetSubresourceManagerForURL(const GURL& url) const { + auto iter = subresource_managers_.find(url); + if (iter == subresource_managers_.end()) + return nullptr; + return iter->second.get(); +} + +std::unique_ptr<PrefetchProxySubresourceManager> +PrefetchProxyService::TakeSubresourceManagerForURL(const GURL& url) { + auto iter = subresource_managers_.find(url); + if (iter == subresource_managers_.end()) + return nullptr; + std::unique_ptr<PrefetchProxySubresourceManager> manager = + std::move(iter->second); + subresource_managers_.erase(iter); + return manager; +} + +void PrefetchProxyService::DestroySubresourceManagerForURL(const GURL& url) { + auto iter = subresource_managers_.find(url); + if (iter != subresource_managers_.end()) { + subresource_managers_.erase(iter); + } +}
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h new file mode 100644 index 0000000..21c6d91 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h
@@ -0,0 +1,91 @@ +// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SERVICE_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SERVICE_H_ + +#include <map> +#include <memory> +#include <vector> + +#include "base/memory/weak_ptr.h" +#include "components/keyed_service/core/keyed_service.h" +#include "content/public/browser/content_browser_client.h" +#include "url/gurl.h" + +class Profile; +class PrefetchProxyProxyConfigurator; +class PrefetchProxyOriginProber; +class PrefetchProxySubresourceManager; +class PrefetchedMainframeResponseContainer; + +namespace content { +class RenderFrameHost; +} + +// This service owns browser-level objects used in Isolated Prerenders. +class PrefetchProxyService : public KeyedService { + public: + explicit PrefetchProxyService(Profile* profile); + ~PrefetchProxyService() override; + + PrefetchProxyProxyConfigurator* proxy_configurator() { + return proxy_configurator_.get(); + } + + PrefetchProxyOriginProber* origin_prober() { return origin_prober_.get(); } + + // This call is forwarded to all |PrefetchProxySubresourceManager| in + // |subresource_managers_| see documentation there for more detail. + bool MaybeProxyURLLoaderFactory( + content::RenderFrameHost* frame, + int render_process_id, + content::ContentBrowserClient::URLLoaderFactoryType type, + mojo::PendingReceiver<network::mojom::URLLoaderFactory>* + factory_receiver); + + // Creates an |PrefetchProxySubresourceManager| for the given |url|. + PrefetchProxySubresourceManager* OnAboutToNoStatePrefetch( + const GURL& url, + std::unique_ptr<PrefetchedMainframeResponseContainer> response); + + // Returns a pointer to an |PrefetchProxySubresourceManager| for the given + // URL, if one exists and hasn't been destroyed. Do not hold on to the + // returned pointer since it may be deleted without notice. + PrefetchProxySubresourceManager* GetSubresourceManagerForURL( + const GURL& url) const; + + // Passes ownership of an |PrefetchProxySubresourceManager| for the given + // URL, if one exists and hasn't been destroyed. + std::unique_ptr<PrefetchProxySubresourceManager> TakeSubresourceManagerForURL( + const GURL& url); + + // Destroys the subresource manager for the given url if one exists. + void DestroySubresourceManagerForURL(const GURL& url); + + PrefetchProxyService(const PrefetchProxyService&) = delete; + PrefetchProxyService& operator=(const PrefetchProxyService&) = delete; + + private: + // Cleans up the NoStatePrerender response. Used in a delayed post task. + void CleanupNoStatePrefetchResponse(const GURL& url); + + // The current profile, not owned. + Profile* profile_; + + // The custom proxy configurator for Isolated Prerenders. + std::unique_ptr<PrefetchProxyProxyConfigurator> proxy_configurator_; + + // The origin prober class which manages all logic for origin probing. + std::unique_ptr<PrefetchProxyOriginProber> origin_prober_; + + // Map of prerender URL to its manager. Kept at the browser level since NSPs + // are done in a separate WebContents from the one they are created in. + std::map<GURL, std::unique_ptr<PrefetchProxySubresourceManager>> + subresource_managers_; + + base::WeakPtrFactory<PrefetchProxyService> weak_factory_{this}; +}; + +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SERVICE_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.cc new file mode 100644 index 0000000..e13404c87 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.cc
@@ -0,0 +1,38 @@ +// Copyright 2020 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/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" + +#include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "content/public/browser/browser_context.h" + +// static +PrefetchProxyService* PrefetchProxyServiceFactory::GetForProfile( + Profile* profile) { + return static_cast<PrefetchProxyService*>( + GetInstance()->GetServiceForBrowserContext(profile, true)); +} + +// static +PrefetchProxyServiceFactory* PrefetchProxyServiceFactory::GetInstance() { + return base::Singleton<PrefetchProxyServiceFactory>::get(); +} + +PrefetchProxyServiceFactory::PrefetchProxyServiceFactory() + : BrowserContextKeyedServiceFactory( + "PrefetchProxyService", + BrowserContextDependencyManager::GetInstance()) { + DependsOn(DataReductionProxyChromeSettingsFactory::GetInstance()); +} + +PrefetchProxyServiceFactory::~PrefetchProxyServiceFactory() = default; + +KeyedService* PrefetchProxyServiceFactory::BuildServiceInstanceFor( + content::BrowserContext* browser_context) const { + DCHECK(!browser_context->IsOffTheRecord()); + return new PrefetchProxyService(Profile::FromBrowserContext(browser_context)); +}
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h new file mode 100644 index 0000000..7e9a4683 --- /dev/null +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h
@@ -0,0 +1,36 @@ +// Copyright 2020 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_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SERVICE_FACTORY_H_ + +#include "base/memory/singleton.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +class Profile; +class PrefetchProxyService; + +class PrefetchProxyServiceFactory : public BrowserContextKeyedServiceFactory { + public: + // Returns the PrefetchProxy for |profile|. + static PrefetchProxyService* GetForProfile(Profile* profile); + + static PrefetchProxyServiceFactory* GetInstance(); + + private: + friend struct base::DefaultSingletonTraits<PrefetchProxyServiceFactory>; + + PrefetchProxyServiceFactory(); + ~PrefetchProxyServiceFactory() override; + + // BrowserContextKeyedServiceFactory: + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* profile) const override; + + PrefetchProxyServiceFactory(const PrefetchProxyServiceFactory&) = delete; + PrefetchProxyServiceFactory& operator=(const PrefetchProxyServiceFactory&) = + delete; +}; + +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SERVICE_FACTORY_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc similarity index 72% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc index 0fe3058..01caf12 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.cc
@@ -2,22 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h" #include "base/metrics/histogram_macros.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" -IsolatedPrerenderSubresourceManager::IsolatedPrerenderSubresourceManager( +PrefetchProxySubresourceManager::PrefetchProxySubresourceManager( const GURL& url, std::unique_ptr<PrefetchedMainframeResponseContainer> mainframe_response) : url_(url), mainframe_response_(std::move(mainframe_response)) {} -IsolatedPrerenderSubresourceManager::~IsolatedPrerenderSubresourceManager() { +PrefetchProxySubresourceManager::~PrefetchProxySubresourceManager() { if (nsp_handle_) { nsp_handle_->SetObserver(nullptr); nsp_handle_->OnCancel(); @@ -26,7 +26,7 @@ successfully_loaded_subresources_.size()); } -void IsolatedPrerenderSubresourceManager::ManageNoStatePrefetch( +void PrefetchProxySubresourceManager::ManageNoStatePrefetch( std::unique_ptr<prerender::PrerenderHandle> handle, base::OnceClosure on_nsp_done_callback) { on_nsp_done_callback_ = std::move(on_nsp_done_callback); @@ -35,17 +35,16 @@ } std::unique_ptr<PrefetchedMainframeResponseContainer> -IsolatedPrerenderSubresourceManager::TakeMainframeResponse() { +PrefetchProxySubresourceManager::TakeMainframeResponse() { return std::move(mainframe_response_); } -void IsolatedPrerenderSubresourceManager:: - SetCreateIsolatedLoaderFactoryCallback( - CreateIsolatedLoaderFactoryRepeatingCallback callback) { +void PrefetchProxySubresourceManager::SetCreateIsolatedLoaderFactoryCallback( + CreateIsolatedLoaderFactoryRepeatingCallback callback) { create_isolated_loader_factory_callback_ = std::move(callback); } -void IsolatedPrerenderSubresourceManager::NotifyPageNavigatedToAfterSRP() { +void PrefetchProxySubresourceManager::NotifyPageNavigatedToAfterSRP() { DCHECK(create_isolated_loader_factory_callback_); // We're navigating so take the extra work off the CPU. if (nsp_handle_) { @@ -55,7 +54,7 @@ was_navigated_to_after_srp_ = true; } -void IsolatedPrerenderSubresourceManager::OnPrerenderStop( +void PrefetchProxySubresourceManager::OnPrerenderStop( prerender::PrerenderHandle* handle) { DCHECK_EQ(nsp_handle_.get(), handle); @@ -68,7 +67,7 @@ nsp_handle_.reset(); } -bool IsolatedPrerenderSubresourceManager::ShouldProxyForPrerenderNavigation( +bool PrefetchProxySubresourceManager::ShouldProxyForPrerenderNavigation( int render_process_id, content::ContentBrowserClient::URLLoaderFactoryType type) { if (type != content::ContentBrowserClient::URLLoaderFactoryType:: @@ -107,12 +106,11 @@ return true; } -bool IsolatedPrerenderSubresourceManager::ShouldProxyForAfterSRPNavigation() - const { +bool PrefetchProxySubresourceManager::ShouldProxyForAfterSRPNavigation() const { return was_navigated_to_after_srp_; } -bool IsolatedPrerenderSubresourceManager::MaybeProxyURLLoaderFactory( +bool PrefetchProxySubresourceManager::MaybeProxyURLLoaderFactory( content::RenderFrameHost* frame, int render_process_id, content::ContentBrowserClient::URLLoaderFactoryType type, @@ -133,15 +131,15 @@ isolated_factory_remote.InitWithNewPipeAndPassReceiver(), frame->GetIsolationInfoForSubresources()); - auto proxy = std::make_unique<IsolatedPrerenderProxyingURLLoaderFactory>( + auto proxy = std::make_unique<PrefetchProxyProxyingURLLoaderFactory>( this, frame->GetFrameTreeNodeId(), std::move(proxied_receiver), std::move(network_process_factory_remote), std::move(isolated_factory_remote), base::BindOnce( - &IsolatedPrerenderSubresourceManager::RemoveProxiedURLLoaderFactory, + &PrefetchProxySubresourceManager::RemoveProxiedURLLoaderFactory, weak_factory_.GetWeakPtr()), base::BindRepeating( - &IsolatedPrerenderSubresourceManager::OnSubresourceLoadSuccessful, + &PrefetchProxySubresourceManager::OnSubresourceLoadSuccessful, weak_factory_.GetWeakPtr())); if (ShouldProxyForAfterSRPNavigation()) { @@ -153,28 +151,28 @@ return true; } -void IsolatedPrerenderSubresourceManager::OnSubresourceLoadSuccessful( +void PrefetchProxySubresourceManager::OnSubresourceLoadSuccessful( const GURL& url) { successfully_loaded_subresources_.emplace(url); } -void IsolatedPrerenderSubresourceManager::NotifyProbeFailed() { +void PrefetchProxySubresourceManager::NotifyProbeFailed() { successfully_loaded_subresources_.clear(); } -void IsolatedPrerenderSubresourceManager::RemoveProxiedURLLoaderFactory( - IsolatedPrerenderProxyingURLLoaderFactory* factory) { +void PrefetchProxySubresourceManager::RemoveProxiedURLLoaderFactory( + PrefetchProxyProxyingURLLoaderFactory* factory) { auto it = proxied_loader_factories_.find(factory); DCHECK(it != proxied_loader_factories_.end()); proxied_loader_factories_.erase(it); } -void IsolatedPrerenderSubresourceManager::SetPrefetchMetricsCollector( - scoped_refptr<IsolatedPrerenderPrefetchMetricsCollector> collector) { +void PrefetchProxySubresourceManager::SetPrefetchMetricsCollector( + scoped_refptr<PrefetchProxyPrefetchMetricsCollector> collector) { metrics_collector_ = collector; } -void IsolatedPrerenderSubresourceManager::OnResourceFetchComplete( +void PrefetchProxySubresourceManager::OnResourceFetchComplete( const GURL& url, network::mojom::URLResponseHeadPtr head, const network::URLLoaderCompletionStatus& status) { @@ -186,9 +184,9 @@ /*subresource_url=*/url, std::move(head), status); } -void IsolatedPrerenderSubresourceManager::OnResourceNotEligible( +void PrefetchProxySubresourceManager::OnResourceNotEligible( const GURL& url, - IsolatedPrerenderPrefetchStatus status) { + PrefetchProxyPrefetchStatus status) { if (!metrics_collector_) return; metrics_collector_->OnSubresourceNotEligible( @@ -196,17 +194,16 @@ /*subresource_url=*/url, status); } -void IsolatedPrerenderSubresourceManager::OnResourceThrottled(const GURL& url) { +void PrefetchProxySubresourceManager::OnResourceThrottled(const GURL& url) { if (!metrics_collector_) return; metrics_collector_->OnSubresourceNotEligible( /*mainframe_url=*/url_, /*subresource_url=*/url, - IsolatedPrerenderPrefetchStatus::kSubresourceThrottled); + PrefetchProxyPrefetchStatus::kSubresourceThrottled); } -void IsolatedPrerenderSubresourceManager::OnResourceUsedFromCache( - const GURL& url) { +void PrefetchProxySubresourceManager::OnResourceUsedFromCache(const GURL& url) { if (!metrics_collector_) return; metrics_collector_->OnCachedSubresourceUsed(/*mainframe_url=*/url_,
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h similarity index 79% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h index 08dea9e..e4c011c 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SUBRESOURCE_MANAGER_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SUBRESOURCE_MANAGER_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SUBRESOURCE_MANAGER_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SUBRESOURCE_MANAGER_H_ #include <memory> #include <set> @@ -13,7 +13,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxying_url_loader_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxying_url_loader_factory.h" #include "components/prerender/browser/prerender_handle.h" #include "content/public/browser/content_browser_client.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -33,14 +33,13 @@ } class PrefetchedMainframeResponseContainer; -class IsolatedPrerenderPrefetchMetricsCollector; -class IsolatedPrerenderProxyingURLLoaderFactory; +class PrefetchProxyPrefetchMetricsCollector; +class PrefetchProxyProxyingURLLoaderFactory; // This class manages the isolated prerender of a page and its subresources. -class IsolatedPrerenderSubresourceManager +class PrefetchProxySubresourceManager : public prerender::PrerenderHandle::Observer, - public IsolatedPrerenderProxyingURLLoaderFactory:: - ResourceMetricsObserver { + public PrefetchProxyProxyingURLLoaderFactory::ResourceMetricsObserver { public: // A callback to create new URL Loader Factories for subresources. using CreateIsolatedLoaderFactoryRepeatingCallback = @@ -49,10 +48,10 @@ pending_receiver, base::Optional<net::IsolationInfo> isolation_info)>; - explicit IsolatedPrerenderSubresourceManager( + explicit PrefetchProxySubresourceManager( const GURL& url, std::unique_ptr<PrefetchedMainframeResponseContainer> mainframe_response); - ~IsolatedPrerenderSubresourceManager() override; + ~PrefetchProxySubresourceManager() override; // Passes ownership of |handle| to |this|, calling |on_nsp_done_callback| when // the NSP is done. @@ -67,7 +66,7 @@ // Sets the prefetch metrics collector to report subresource fetches to. void SetPrefetchMetricsCollector( - scoped_refptr<IsolatedPrerenderPrefetchMetricsCollector> collector); + scoped_refptr<PrefetchProxyPrefetchMetricsCollector> collector); // Takes ownership of |mainframe_response_|. std::unique_ptr<PrefetchedMainframeResponseContainer> TakeMainframeResponse(); @@ -104,20 +103,20 @@ void OnPrerenderNetworkBytesChanged( prerender::PrerenderHandle* handle) override {} - // IsolatedPrerenderProxyingURLLoaderFactory::ResourceMetricsObserver: + // PrefetchProxyProxyingURLLoaderFactory::ResourceMetricsObserver: void OnResourceFetchComplete( const GURL& url, network::mojom::URLResponseHeadPtr head, const network::URLLoaderCompletionStatus& status) override; void OnResourceNotEligible(const GURL& url, - IsolatedPrerenderPrefetchStatus status) override; + PrefetchProxyPrefetchStatus status) override; void OnResourceThrottled(const GURL& url) override; void OnResourceUsedFromCache(const GURL& url) override; - IsolatedPrerenderSubresourceManager( - const IsolatedPrerenderSubresourceManager&) = delete; - IsolatedPrerenderSubresourceManager& operator=( - const IsolatedPrerenderSubresourceManager&) = delete; + PrefetchProxySubresourceManager(const PrefetchProxySubresourceManager&) = + delete; + PrefetchProxySubresourceManager& operator=( + const PrefetchProxySubresourceManager&) = delete; private: // Returns true if |MaybeProxyURLLoaderFactory| should proxy subresource loads @@ -133,10 +132,10 @@ // Called when the given factory is done serving all requests and can be // destroyed. void RemoveProxiedURLLoaderFactory( - IsolatedPrerenderProxyingURLLoaderFactory* factory); + PrefetchProxyProxyingURLLoaderFactory* factory); // Used as - // |IsolatedPrerenderProxyingURLLoaderFactory::ResourceLoadSuccessfulCallback| + // |PrefetchProxyProxyingURLLoaderFactory::ResourceLoadSuccessfulCallback| // to report a subresource was successfully loaded during the NSP. void OnSubresourceLoadSuccessful(const GURL& url); @@ -158,8 +157,8 @@ std::unique_ptr<PrefetchedMainframeResponseContainer> mainframe_response_; // Collects metrics from the implementation of - // |IsolatedPrerenderProxyingURLLoaderFactory::ResourceMetricsObserver|. - scoped_refptr<IsolatedPrerenderPrefetchMetricsCollector> metrics_collector_; + // |PrefetchProxyProxyingURLLoaderFactory::ResourceMetricsObserver|. + scoped_refptr<PrefetchProxyPrefetchMetricsCollector> metrics_collector_; // State for managing the NoStatePrerender when it is running. If // |nsp_handle_| is set, then |on_nsp_done_callback_| is also set and vise @@ -168,7 +167,7 @@ base::OnceClosure on_nsp_done_callback_; // All owned proxying URL Loader Factories. - std::set<std::unique_ptr<IsolatedPrerenderProxyingURLLoaderFactory>, + std::set<std::unique_ptr<PrefetchProxyProxyingURLLoaderFactory>, base::UniquePtrComparator> proxied_loader_factories_; @@ -176,7 +175,7 @@ CreateIsolatedLoaderFactoryRepeatingCallback create_isolated_loader_factory_callback_; - base::WeakPtrFactory<IsolatedPrerenderSubresourceManager> weak_factory_{this}; + base::WeakPtrFactory<PrefetchProxySubresourceManager> weak_factory_{this}; }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_SUBRESOURCE_MANAGER_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_SUBRESOURCE_MANAGER_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc similarity index 76% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc index fff757bf..687d44cc 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" #include <string> @@ -18,14 +18,14 @@ #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h" #include "chrome/browser/net/prediction_options.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_network_context_client.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_network_context_client.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h" #include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" @@ -99,19 +99,18 @@ return; metrics_web_contents_observer->BroadcastEventToObservers( - IsolatedPrerenderTabHelper::PrefetchingLikelyEventKey()); + PrefetchProxyTabHelper::PrefetchingLikelyEventKey()); } void OnGotCookieList( const GURL& url, - IsolatedPrerenderTabHelper::OnEligibilityResultCallback result_callback, + PrefetchProxyTabHelper::OnEligibilityResultCallback result_callback, const net::CookieAccessResultList& cookie_list, const net::CookieAccessResultList& excluded_cookies) { if (!cookie_list.empty()) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleUserHasCookies); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies); return; } @@ -136,8 +135,7 @@ if (excluded_cookie_has_tld) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleUserHasCookies); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies); return; } @@ -150,7 +148,7 @@ } bool ShouldStartSpareRenderer() { - if (!IsolatedPrerenderStartsSpareRenderer()) { + if (!PrefetchProxyStartsSpareRenderer()) { return false; } @@ -168,26 +166,25 @@ } // namespace -IsolatedPrerenderTabHelper::PrefetchMetrics::PrefetchMetrics() = default; -IsolatedPrerenderTabHelper::PrefetchMetrics::~PrefetchMetrics() = default; +PrefetchProxyTabHelper::PrefetchMetrics::PrefetchMetrics() = default; +PrefetchProxyTabHelper::PrefetchMetrics::~PrefetchMetrics() = default; -IsolatedPrerenderTabHelper::AfterSRPMetrics::AfterSRPMetrics() = default; -IsolatedPrerenderTabHelper::AfterSRPMetrics::AfterSRPMetrics( +PrefetchProxyTabHelper::AfterSRPMetrics::AfterSRPMetrics() = default; +PrefetchProxyTabHelper::AfterSRPMetrics::AfterSRPMetrics( const AfterSRPMetrics& other) = default; -IsolatedPrerenderTabHelper::AfterSRPMetrics::~AfterSRPMetrics() = default; +PrefetchProxyTabHelper::AfterSRPMetrics::~AfterSRPMetrics() = default; -IsolatedPrerenderTabHelper::CurrentPageLoad::CurrentPageLoad( +PrefetchProxyTabHelper::CurrentPageLoad::CurrentPageLoad( content::NavigationHandle* handle) : profile_(handle ? Profile::FromBrowserContext( handle->GetWebContents()->GetBrowserContext()) : nullptr), navigation_start_(handle ? handle->NavigationStart() : base::TimeTicks()), srp_metrics_( - base::MakeRefCounted<IsolatedPrerenderTabHelper::PrefetchMetrics>()) { -} + base::MakeRefCounted<PrefetchProxyTabHelper::PrefetchMetrics>()) {} -IsolatedPrerenderTabHelper::CurrentPageLoad::~CurrentPageLoad() { - if (IsolatedPrerenderStartsSpareRenderer()) { +PrefetchProxyTabHelper::CurrentPageLoad::~CurrentPageLoad() { + if (PrefetchProxyStartsSpareRenderer()) { UMA_HISTOGRAM_COUNTS_100( "IsolatedPrerender.SpareRenderer.CountStartedOnSRP", number_of_spare_renderers_started_); @@ -196,8 +193,8 @@ if (!profile_) return; - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile_); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile_); if (!service) { return; } @@ -211,7 +208,7 @@ } // static -const void* IsolatedPrerenderTabHelper::PrefetchingLikelyEventKey() { +const void* PrefetchProxyTabHelper::PrefetchingLikelyEventKey() { return &kPrefetchingLikelyEventKey; } @@ -219,12 +216,12 @@ nullptr; // static -void IsolatedPrerenderTabHelper::SetServiceWorkerContextForTest( +void PrefetchProxyTabHelper::SetServiceWorkerContextForTest( content::ServiceWorkerContext* context) { g_service_worker_context_for_test = context; } -IsolatedPrerenderTabHelper::IsolatedPrerenderTabHelper( +PrefetchProxyTabHelper::PrefetchProxyTabHelper( content::WebContents* web_contents) : content::WebContentsObserver(web_contents) { page_ = std::make_unique<CurrentPageLoad>(nullptr); @@ -238,10 +235,10 @@ // Make sure the global service is up and running so that the service worker // registrations can be queried before the first navigation prediction. - IsolatedPrerenderServiceFactory::GetForProfile(profile_); + PrefetchProxyServiceFactory::GetForProfile(profile_); } -IsolatedPrerenderTabHelper::~IsolatedPrerenderTabHelper() { +PrefetchProxyTabHelper::~PrefetchProxyTabHelper() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); NavigationPredictorKeyedService* navigation_predictor_service = NavigationPredictorKeyedServiceFactory::GetForProfile(profile_); @@ -250,21 +247,21 @@ } } -void IsolatedPrerenderTabHelper::AddObserverForTesting(Observer* observer) { +void PrefetchProxyTabHelper::AddObserverForTesting(Observer* observer) { observer_list_.AddObserver(observer); } -void IsolatedPrerenderTabHelper::RemoveObserverForTesting(Observer* observer) { +void PrefetchProxyTabHelper::RemoveObserverForTesting(Observer* observer) { observer_list_.RemoveObserver(observer); } network::mojom::NetworkContext* -IsolatedPrerenderTabHelper::GetIsolatedContextForTesting() const { +PrefetchProxyTabHelper::GetIsolatedContextForTesting() const { return page_->isolated_network_context_.get(); } -base::Optional<IsolatedPrerenderTabHelper::AfterSRPMetrics> -IsolatedPrerenderTabHelper::after_srp_metrics() const { +base::Optional<PrefetchProxyTabHelper::AfterSRPMetrics> +PrefetchProxyTabHelper::after_srp_metrics() const { if (page_->after_srp_metrics_) { return *(page_->after_srp_metrics_); } @@ -272,12 +269,12 @@ } // static -bool IsolatedPrerenderTabHelper::IsProfileEligible(Profile* profile) { +bool PrefetchProxyTabHelper::IsProfileEligible(Profile* profile) { if (profile->IsOffTheRecord()) { return false; } - if (IsolatedPrerenderOnlyForLiteMode()) { + if (PrefetchProxyOnlyForLiteMode()) { return data_reduction_proxy::DataReductionProxySettings:: IsDataSaverEnabledByUser(profile->IsOffTheRecord(), profile->GetPrefs()); @@ -285,11 +282,11 @@ return true; } -bool IsolatedPrerenderTabHelper::IsProfileEligible() const { +bool PrefetchProxyTabHelper::IsProfileEligible() const { return IsProfileEligible(profile_); } -void IsolatedPrerenderTabHelper::DidStartNavigation( +void PrefetchProxyTabHelper::DidStartNavigation( content::NavigationHandle* navigation_handle) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!navigation_handle->IsInMainFrame()) { @@ -331,12 +328,12 @@ // Notify the subresource manager (if applicable) that its page is being // navigated to so that the prefetched subresources can be used from cache. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile_); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile_); if (!service) return; - IsolatedPrerenderSubresourceManager* subresource_manager = + PrefetchProxySubresourceManager* subresource_manager = service->GetSubresourceManagerForURL(navigation_handle->GetURL()); if (!subresource_manager) return; @@ -344,14 +341,14 @@ subresource_manager->NotifyPageNavigatedToAfterSRP(); } -void IsolatedPrerenderTabHelper::NotifyPrefetchProbeLatency( +void PrefetchProxyTabHelper::NotifyPrefetchProbeLatency( base::TimeDelta probe_latency) { page_->probe_latency_ = probe_latency; } -void IsolatedPrerenderTabHelper::ReportProbeResult( +void PrefetchProxyTabHelper::ReportProbeResult( const GURL& url, - IsolatedPrerenderProbeResult result) { + PrefetchProxyProbeResult result) { if (!page_->prefetch_metrics_collector_) { return; } @@ -359,57 +356,53 @@ result); } -void IsolatedPrerenderTabHelper::OnPrefetchStatusUpdate( +void PrefetchProxyTabHelper::OnPrefetchStatusUpdate( const GURL& url, - IsolatedPrerenderPrefetchStatus usage) { + PrefetchProxyPrefetchStatus usage) { page_->prefetch_status_by_url_[url] = usage; } -IsolatedPrerenderPrefetchStatus -IsolatedPrerenderTabHelper::MaybeUpdatePrefetchStatusWithNSPContext( +PrefetchProxyPrefetchStatus +PrefetchProxyTabHelper::MaybeUpdatePrefetchStatusWithNSPContext( const GURL& url, - IsolatedPrerenderPrefetchStatus status) const { + PrefetchProxyPrefetchStatus status) const { switch (status) { // These are the statuses we want to update. - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe: - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccess: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailed: + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe: + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccess: + case PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailed: break; // These statuses are not applicable since the prefetch was not used after // the click. - case IsolatedPrerenderPrefetchStatus::kPrefetchNotStarted: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleGoogleDomain: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies: - case IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleUserHasServiceWorker: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress: - case IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchNotStarted: + case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleGoogleDomain: + case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies: + case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasServiceWorker: + case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps: + case PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress: + case PrefetchProxyPrefetchStatus:: kPrefetchNotEligibleNonDefaultStoragePartition: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotFinishedInTime: - case IsolatedPrerenderPrefetchStatus::kPrefetchFailedNetError: - case IsolatedPrerenderPrefetchStatus::kPrefetchFailedNon2XX: - case IsolatedPrerenderPrefetchStatus::kPrefetchFailedNotHTML: - case IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful: - case IsolatedPrerenderPrefetchStatus::kNavigatedToLinkNotOnSRP: - case IsolatedPrerenderPrefetchStatus::kSubresourceThrottled: - case IsolatedPrerenderPrefetchStatus::kPrefetchPositionIneligible: + case PrefetchProxyPrefetchStatus::kPrefetchNotFinishedInTime: + case PrefetchProxyPrefetchStatus::kPrefetchFailedNetError: + case PrefetchProxyPrefetchStatus::kPrefetchFailedNon2XX: + case PrefetchProxyPrefetchStatus::kPrefetchFailedNotHTML: + case PrefetchProxyPrefetchStatus::kPrefetchSuccessful: + case PrefetchProxyPrefetchStatus::kNavigatedToLinkNotOnSRP: + case PrefetchProxyPrefetchStatus::kSubresourceThrottled: + case PrefetchProxyPrefetchStatus::kPrefetchPositionIneligible: return status; // These statuses we are going to update to, and this is the only place that // they are set so they are not expected to be passed in. - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbeWithNSP: - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccessWithNSP: - case IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailedWithNSP: - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbeNSPAttemptDenied: - case IsolatedPrerenderPrefetchStatus:: - kPrefetchUsedProbeSuccessNSPAttemptDenied: - case IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbeWithNSP: + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccessWithNSP: + case PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailedWithNSP: + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbeNSPAttemptDenied: + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccessNSPAttemptDenied: + case PrefetchProxyPrefetchStatus:: kPrefetchNotUsedProbeFailedNSPAttemptDenied: - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbeNSPNotStarted: - case IsolatedPrerenderPrefetchStatus:: - kPrefetchUsedProbeSuccessNSPNotStarted: - case IsolatedPrerenderPrefetchStatus:: - kPrefetchNotUsedProbeFailedNSPNotStarted: + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbeNSPNotStarted: + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccessNSPNotStarted: + case PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailedNSPNotStarted: NOTREACHED(); return status; } @@ -434,14 +427,12 @@ if (no_state_prefetch_complete) { switch (status) { - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe: - return IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbeWithNSP; - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccess: - return IsolatedPrerenderPrefetchStatus:: - kPrefetchUsedProbeSuccessWithNSP; - case IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailed: - return IsolatedPrerenderPrefetchStatus:: - kPrefetchNotUsedProbeFailedWithNSP; + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe: + return PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbeWithNSP; + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccess: + return PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccessWithNSP; + case PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailed: + return PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailedWithNSP; default: break; } @@ -449,14 +440,14 @@ if (no_state_prefetch_failed) { switch (status) { - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe: - return IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe: + return PrefetchProxyPrefetchStatus:: kPrefetchUsedNoProbeNSPAttemptDenied; - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccess: - return IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccess: + return PrefetchProxyPrefetchStatus:: kPrefetchUsedProbeSuccessNSPAttemptDenied; - case IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailed: - return IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailed: + return PrefetchProxyPrefetchStatus:: kPrefetchNotUsedProbeFailedNSPAttemptDenied; default: break; @@ -465,14 +456,13 @@ if (no_state_prefetch_not_started) { switch (status) { - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe: - return IsolatedPrerenderPrefetchStatus:: - kPrefetchUsedNoProbeNSPNotStarted; - case IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccess: - return IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe: + return PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbeNSPNotStarted; + case PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccess: + return PrefetchProxyPrefetchStatus:: kPrefetchUsedProbeSuccessNSPNotStarted; - case IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailed: - return IsolatedPrerenderPrefetchStatus:: + case PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailed: + return PrefetchProxyPrefetchStatus:: kPrefetchNotUsedProbeFailedNSPNotStarted; default: break; @@ -483,8 +473,8 @@ return status; } -std::unique_ptr<IsolatedPrerenderTabHelper::AfterSRPMetrics> -IsolatedPrerenderTabHelper::ComputeAfterSRPMetricsBeforeCommit( +std::unique_ptr<PrefetchProxyTabHelper::AfterSRPMetrics> +PrefetchProxyTabHelper::ComputeAfterSRPMetricsBeforeCommit( content::NavigationHandle* handle) const { if (page_->srp_metrics_->predicted_urls_count_ <= 0) { return nullptr; @@ -503,7 +493,7 @@ // way to the end, the status is already propagated. But if a redirect was // not eligible then this will find its last known status. DCHECK(!handle->GetRedirectChain().empty()); - base::Optional<IsolatedPrerenderPrefetchStatus> status; + base::Optional<PrefetchProxyPrefetchStatus> status; base::Optional<size_t> prediction_position; for (auto back_iter = handle->GetRedirectChain().rbegin(); back_iter != handle->GetRedirectChain().rend(); ++back_iter) { @@ -526,14 +516,14 @@ metrics->prefetch_status_ = *status; } else { metrics->prefetch_status_ = - IsolatedPrerenderPrefetchStatus::kNavigatedToLinkNotOnSRP; + PrefetchProxyPrefetchStatus::kNavigatedToLinkNotOnSRP; } metrics->clicked_link_srp_position_ = prediction_position; return metrics; } -void IsolatedPrerenderTabHelper::DidFinishNavigation( +void PrefetchProxyTabHelper::DidFinishNavigation( content::NavigationHandle* navigation_handle) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!navigation_handle->IsInMainFrame()) { @@ -577,9 +567,9 @@ // See if the page being navigated to was prerendered. If so, copy over its // subresource manager and networking pipes. - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile_); - std::unique_ptr<IsolatedPrerenderSubresourceManager> manager = + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile_); + std::unique_ptr<PrefetchProxySubresourceManager> manager = service->TakeSubresourceManagerForURL(url); if (manager) { new_page->subresource_manager_ = std::move(manager); @@ -597,11 +587,11 @@ page_ = std::move(new_page); } -void IsolatedPrerenderTabHelper::OnVisibilityChanged( +void PrefetchProxyTabHelper::OnVisibilityChanged( content::Visibility visibility) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsolatedPrerenderIsEnabled()) { + if (!PrefetchProxyIsEnabled()) { return; } @@ -613,7 +603,7 @@ } std::unique_ptr<PrefetchedMainframeResponseContainer> -IsolatedPrerenderTabHelper::TakePrefetchResponse(const GURL& url) { +PrefetchProxyTabHelper::TakePrefetchResponse(const GURL& url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); auto it = page_->prefetched_responses_.find(url); if (it == page_->prefetched_responses_.end()) @@ -626,7 +616,7 @@ } std::unique_ptr<PrefetchedMainframeResponseContainer> -IsolatedPrerenderTabHelper::CopyPrefetchResponseForNSP(const GURL& url) { +PrefetchProxyTabHelper::CopyPrefetchResponseForNSP(const GURL& url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); auto it = page_->prefetched_responses_.find(url); if (it == page_->prefetched_responses_.end()) @@ -635,13 +625,13 @@ return it->second->Clone(); } -bool IsolatedPrerenderTabHelper::PrefetchingActive() const { +bool PrefetchProxyTabHelper::PrefetchingActive() const { return page_ && !page_->url_loaders_.empty(); } -void IsolatedPrerenderTabHelper::Prefetch() { +void PrefetchProxyTabHelper::Prefetch() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(IsolatedPrerenderIsEnabled()); + DCHECK(PrefetchProxyIsEnabled()); if (!page_->srp_metrics_->navigation_to_prefetch_start_.has_value()) { page_->srp_metrics_->navigation_to_prefetch_start_ = @@ -650,7 +640,7 @@ base::TimeDelta()); } - if (IsolatedPrerenderCloseIdleSockets() && page_->isolated_network_context_) { + if (PrefetchProxyCloseIdleSockets() && page_->isolated_network_context_) { page_->isolated_network_context_->CloseIdleConnections(base::DoNothing()); } @@ -660,31 +650,31 @@ return; } - DCHECK_GT(IsolatedPrerenderMaximumNumberOfConcurrentPrefetches(), 0U); + DCHECK_GT(PrefetchProxyMaximumNumberOfConcurrentPrefetches(), 0U); while ( // Checks that the total number of prefetches has not been met. - !(IsolatedPrerenderMaximumNumberOfPrefetches().has_value() && + !(PrefetchProxyMaximumNumberOfPrefetches().has_value() && page_->srp_metrics_->prefetch_attempted_count_ >= - IsolatedPrerenderMaximumNumberOfPrefetches().value()) && + PrefetchProxyMaximumNumberOfPrefetches().value()) && // Checks that there are still urls to prefetch. !page_->urls_to_prefetch_.empty() && // Checks that the max number of concurrent prefetches has not been met. page_->url_loaders_.size() < - IsolatedPrerenderMaximumNumberOfConcurrentPrefetches()) { + PrefetchProxyMaximumNumberOfConcurrentPrefetches()) { StartSinglePrefetch(); } } -void IsolatedPrerenderTabHelper::StartSinglePrefetch() { +void PrefetchProxyTabHelper::StartSinglePrefetch() { DCHECK(!page_->urls_to_prefetch_.empty()); - DCHECK(!(IsolatedPrerenderMaximumNumberOfPrefetches().has_value() && + DCHECK(!(PrefetchProxyMaximumNumberOfPrefetches().has_value() && page_->srp_metrics_->prefetch_attempted_count_ >= - IsolatedPrerenderMaximumNumberOfPrefetches().value())); + PrefetchProxyMaximumNumberOfPrefetches().value())); DCHECK(page_->url_loaders_.size() < - IsolatedPrerenderMaximumNumberOfConcurrentPrefetches()); + PrefetchProxyMaximumNumberOfConcurrentPrefetches()); page_->srp_metrics_->prefetch_attempted_count_++; @@ -693,7 +683,7 @@ // The status is updated to be successful or failed when it finishes. OnPrefetchStatusUpdate( - url, IsolatedPrerenderPrefetchStatus::kPrefetchNotFinishedInTime); + url, PrefetchProxyPrefetchStatus::kPrefetchNotFinishedInTime); url::Origin origin = url::Origin::Create(url); net::IsolationInfo isolation_info = net::IsolationInfo::Create( @@ -743,15 +733,15 @@ // base::Unretained is safe because |loader| is owned by |this|. loader->SetOnRedirectCallback( - base::BindRepeating(&IsolatedPrerenderTabHelper::OnPrefetchRedirect, + base::BindRepeating(&PrefetchProxyTabHelper::OnPrefetchRedirect, base::Unretained(this), loader.get(), url)); loader->SetAllowHttpErrorResults(true); - loader->SetTimeoutDuration(IsolatedPrefetchTimeoutDuration()); + loader->SetTimeoutDuration(PrefetchProxyTimeoutDuration()); loader->DownloadToString( GetURLLoaderFactory(), - base::BindOnce(&IsolatedPrerenderTabHelper::OnPrefetchComplete, + base::BindOnce(&PrefetchProxyTabHelper::OnPrefetchComplete, base::Unretained(this), loader.get(), url, isolation_info), - IsolatedPrerenderMainframeBodyLengthLimit()); + PrefetchProxyMainframeBodyLengthLimit()); page_->url_loaders_.emplace(std::move(loader)); @@ -762,7 +752,7 @@ } } -void IsolatedPrerenderTabHelper::OnPrefetchRedirect( +void PrefetchProxyTabHelper::OnPrefetchRedirect( network::SimpleURLLoader* loader, const GURL& original_url, const net::RedirectInfo& redirect_info, @@ -784,7 +774,7 @@ // continue on with other Prefetches. CheckEligibilityOfURL( profile_, redirect_info.new_url, - base::BindOnce(&IsolatedPrerenderTabHelper::OnGotEligibilityResult, + base::BindOnce(&PrefetchProxyTabHelper::OnGotEligibilityResult, weak_factory_.GetWeakPtr())); // Cancels the current request. @@ -794,7 +784,7 @@ Prefetch(); } -void IsolatedPrerenderTabHelper::OnPrefetchComplete( +void PrefetchProxyTabHelper::OnPrefetchComplete( network::SimpleURLLoader* loader, const GURL& url, const net::IsolationInfo& isolation_info, @@ -814,7 +804,7 @@ if (loader->NetError() != net::OK) { OnPrefetchStatusUpdate( - url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNetError); + url, PrefetchProxyPrefetchStatus::kPrefetchFailedNetError); for (auto& observer : observer_list_) { observer.OnPrefetchCompletedWithError(url, loader->NetError()); @@ -837,7 +827,7 @@ Prefetch(); } -void IsolatedPrerenderTabHelper::HandlePrefetchResponse( +void PrefetchProxyTabHelper::HandlePrefetchResponse( const GURL& url, const net::IsolationInfo& isolation_info, network::mojom::URLResponseHeadPtr head, @@ -871,8 +861,8 @@ response_code); if (response_code < 200 || response_code >= 300) { - OnPrefetchStatusUpdate( - url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNon2XX); + OnPrefetchStatusUpdate(url, + PrefetchProxyPrefetchStatus::kPrefetchFailedNon2XX); for (auto& observer : observer_list_) { observer.OnPrefetchCompletedWithError(url, response_code); } @@ -880,8 +870,8 @@ } if (head->mime_type != "text/html") { - OnPrefetchStatusUpdate( - url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNotHTML); + OnPrefetchStatusUpdate(url, + PrefetchProxyPrefetchStatus::kPrefetchFailedNotHTML); return; } @@ -891,8 +881,7 @@ page_->prefetched_responses_.emplace(url, std::move(response)); page_->srp_metrics_->prefetch_successful_count_++; - OnPrefetchStatusUpdate(url, - IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + OnPrefetchStatusUpdate(url, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); MaybeDoNoStatePrefetch(url); @@ -901,10 +890,10 @@ } } -void IsolatedPrerenderTabHelper::MaybeDoNoStatePrefetch(const GURL& url) { +void PrefetchProxyTabHelper::MaybeDoNoStatePrefetch(const GURL& url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsolatedPrerenderNoStatePrefetchSubresources()) { + if (!PrefetchProxyNoStatePrefetchSubresources()) { return; } @@ -912,7 +901,7 @@ DoNoStatePrefetch(); } -void IsolatedPrerenderTabHelper::DoNoStatePrefetch() { +void PrefetchProxyTabHelper::DoNoStatePrefetch() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (page_->urls_to_no_state_prefetch_.empty()) { @@ -925,7 +914,7 @@ } base::Optional<size_t> max_attempts = - IsolatedPrerenderMaximumNumberOfNoStatePrefetchAttempts(); + PrefetchProxyMaximumNumberOfNoStatePrefetchAttempts(); if (max_attempts.has_value() && page_->number_of_no_state_prefetch_attempts_ >= max_attempts.value()) { return; @@ -937,8 +926,8 @@ return; } - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile_); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile_); if (!service) { return; } @@ -947,7 +936,7 @@ // Don't start another NSP until the previous one finishes. { - IsolatedPrerenderSubresourceManager* manager = + PrefetchProxySubresourceManager* manager = service->GetSubresourceManagerForURL(url); if (manager && manager->has_nsp_handle()) { return; @@ -957,15 +946,15 @@ // The manager must be created here so that the mainframe response can be // given to the URLLoaderInterceptor in this call stack, but may be destroyed // before the end of the method if the handle is not created. - IsolatedPrerenderSubresourceManager* manager = + PrefetchProxySubresourceManager* manager = service->OnAboutToNoStatePrefetch(url, CopyPrefetchResponseForNSP(url)); DCHECK_EQ(manager, service->GetSubresourceManagerForURL(url)); manager->SetPrefetchMetricsCollector(page_->prefetch_metrics_collector_); - manager->SetCreateIsolatedLoaderFactoryCallback(base::BindRepeating( - &IsolatedPrerenderTabHelper::CreateNewURLLoaderFactory, - weak_factory_.GetWeakPtr())); + manager->SetCreateIsolatedLoaderFactoryCallback( + base::BindRepeating(&PrefetchProxyTabHelper::CreateNewURLLoaderFactory, + weak_factory_.GetWeakPtr())); content::SessionStorageNamespace* session_storage_namespace = web_contents()->GetController().GetDefaultSessionStorageNamespace(); @@ -1009,11 +998,11 @@ manager->ManageNoStatePrefetch( std::move(handle), - base::BindOnce(&IsolatedPrerenderTabHelper::OnPrerenderDone, + base::BindOnce(&PrefetchProxyTabHelper::OnPrerenderDone, weak_factory_.GetWeakPtr(), url)); } -void IsolatedPrerenderTabHelper::OnPrerenderDone(const GURL& url) { +void PrefetchProxyTabHelper::OnPrerenderDone(const GURL& url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // The completed NSP probably consumed a previously started spare renderer, so @@ -1043,16 +1032,16 @@ DoNoStatePrefetch(); } -void IsolatedPrerenderTabHelper::StartSpareRenderer() { +void PrefetchProxyTabHelper::StartSpareRenderer() { page_->number_of_spare_renderers_started_++; content::RenderProcessHost::WarmupSpareRenderProcessHost(profile_); } -void IsolatedPrerenderTabHelper::OnPredictionUpdated( +void PrefetchProxyTabHelper::OnPredictionUpdated( const base::Optional<NavigationPredictorKeyedService::Prediction> prediction) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!IsolatedPrerenderIsEnabled()) { + if (!PrefetchProxyIsEnabled()) { return; } @@ -1092,7 +1081,7 @@ if (!page_->prefetch_metrics_collector_) { page_->prefetch_metrics_collector_ = - base::MakeRefCounted<IsolatedPrerenderPrefetchMetricsCollector>( + base::MakeRefCounted<PrefetchProxyPrefetchMetricsCollector>( page_->navigation_start_, web_contents()->GetMainFrame()->GetPageUkmSourceId()); } @@ -1120,14 +1109,14 @@ CheckEligibilityOfURL( profile_, url, - base::BindOnce(&IsolatedPrerenderTabHelper::OnGotEligibilityResult, + base::BindOnce(&PrefetchProxyTabHelper::OnGotEligibilityResult, weak_factory_.GetWeakPtr())); } } // static -content::ServiceWorkerContext* -IsolatedPrerenderTabHelper::GetServiceWorkerContext(Profile* profile) { +content::ServiceWorkerContext* PrefetchProxyTabHelper::GetServiceWorkerContext( + Profile* profile) { if (g_service_worker_context_for_test) return g_service_worker_context_for_test; return content::BrowserContext::GetDefaultStoragePartition(profile) @@ -1135,7 +1124,7 @@ } // static -void IsolatedPrerenderTabHelper::CheckEligibilityOfURL( +void PrefetchProxyTabHelper::CheckEligibilityOfURL( Profile* profile, const GURL& url, OnEligibilityResultCallback result_callback) { @@ -1147,23 +1136,21 @@ if (google_util::IsGoogleAssociatedDomainUrl(url)) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleGoogleDomain); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleGoogleDomain); return; } if (url.HostIsIPAddress()) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleHostIsIPAddress); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress); return; } if (!url.SchemeIs(url::kHttpsScheme)) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleSchemeIsNotHttps); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); return; } @@ -1172,21 +1159,21 @@ // Only the default storage partition is supported since that is the only // place where service workers are observed by - // |IsolatedPrerenderServiceWorkersObserver|. + // |PrefetchProxyServiceWorkersObserver|. if (default_storage_partition != content::BrowserContext::GetStoragePartitionForSite( profile, url, /*can_create=*/false)) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus:: + PrefetchProxyPrefetchStatus:: kPrefetchNotEligibleNonDefaultStoragePartition); return; } - IsolatedPrerenderService* isolated_prerender_service = - IsolatedPrerenderServiceFactory::GetForProfile(profile); - if (!isolated_prerender_service) { + PrefetchProxyService* prefetch_proxy_service = + PrefetchProxyServiceFactory::GetForProfile(profile); + if (!prefetch_proxy_service) { std::move(result_callback).Run(url, false, base::nullopt); return; } @@ -1200,7 +1187,7 @@ if (site_has_service_worker) { std::move(result_callback) .Run(url, false, - IsolatedPrerenderPrefetchStatus:: + PrefetchProxyPrefetchStatus:: kPrefetchNotEligibleUserHasServiceWorker); return; } @@ -1212,10 +1199,10 @@ base::BindOnce(&OnGotCookieList, url, std::move(result_callback))); } -void IsolatedPrerenderTabHelper::OnGotEligibilityResult( +void PrefetchProxyTabHelper::OnGotEligibilityResult( const GURL& url, bool eligible, - base::Optional<IsolatedPrerenderPrefetchStatus> status) { + base::Optional<PrefetchProxyPrefetchStatus> status) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // It is possible that this callback is being run late. That is, after the @@ -1242,8 +1229,7 @@ // TODO(robertogden): Consider adding redirect URLs to the front of the list. page_->urls_to_prefetch_.push_back(url); page_->srp_metrics_->prefetch_eligible_count_++; - OnPrefetchStatusUpdate(url, - IsolatedPrerenderPrefetchStatus::kPrefetchNotStarted); + OnPrefetchStatusUpdate(url, PrefetchProxyPrefetchStatus::kPrefetchNotStarted); if (page_->original_prediction_ordering_.find(url) != page_->original_prediction_ordering_.end()) { @@ -1256,9 +1242,9 @@ 1 << original_prediction_index; } - if (!IsolatedPrerenderShouldPrefetchPosition(original_prediction_index)) { + if (!PrefetchProxyShouldPrefetchPosition(original_prediction_index)) { OnPrefetchStatusUpdate( - url, IsolatedPrerenderPrefetchStatus::kPrefetchPositionIneligible); + url, PrefetchProxyPrefetchStatus::kPrefetchPositionIneligible); return; } } @@ -1270,7 +1256,7 @@ } } -bool IsolatedPrerenderTabHelper::IsWaitingForAfterSRPCookiesCopy() const { +bool PrefetchProxyTabHelper::IsWaitingForAfterSRPCookiesCopy() const { switch (page_->cookie_copy_status_) { case CookieCopyStatus::kNoNavigation: case CookieCopyStatus::kCopyComplete: @@ -1280,7 +1266,7 @@ } } -void IsolatedPrerenderTabHelper::SetOnAfterSRPCookieCopyCompleteCallback( +void PrefetchProxyTabHelper::SetOnAfterSRPCookieCopyCompleteCallback( base::OnceClosure callback) { // We don't expect a callback unless there's something to wait on. DCHECK(IsWaitingForAfterSRPCookiesCopy()); @@ -1288,7 +1274,7 @@ page_->on_after_srp_cookie_copy_complete_ = std::move(callback); } -void IsolatedPrerenderTabHelper::CopyIsolatedCookiesOnAfterSRPClick( +void PrefetchProxyTabHelper::CopyIsolatedCookiesOnAfterSRPClick( const GURL& url) { if (!page_->isolated_network_context_) { // Not set in unit tests. @@ -1306,11 +1292,11 @@ page_->isolated_cookie_manager_->GetCookieList( url, options, base::BindOnce( - &IsolatedPrerenderTabHelper::OnGotIsolatedCookiesToCopyAfterSRPClick, + &PrefetchProxyTabHelper::OnGotIsolatedCookiesToCopyAfterSRPClick, weak_factory_.GetWeakPtr(), url)); } -void IsolatedPrerenderTabHelper::OnGotIsolatedCookiesToCopyAfterSRPClick( +void PrefetchProxyTabHelper::OnGotIsolatedCookiesToCopyAfterSRPClick( const GURL& url, const net::CookieAccessResultList& cookie_list, const net::CookieAccessResultList& excluded_cookies) { @@ -1329,7 +1315,7 @@ base::RepeatingClosure barrier = base::BarrierClosure( cookie_list.size(), base::BindOnce( - &IsolatedPrerenderTabHelper::OnCopiedIsolatedCookiesAfterSRPClick, + &PrefetchProxyTabHelper::OnCopiedIsolatedCookiesAfterSRPClick, weak_factory_.GetWeakPtr())); content::StoragePartition* default_storage_partition = @@ -1343,7 +1329,7 @@ } } -void IsolatedPrerenderTabHelper::OnCopiedIsolatedCookiesAfterSRPClick() { +void PrefetchProxyTabHelper::OnCopiedIsolatedCookiesAfterSRPClick() { DCHECK(IsWaitingForAfterSRPCookiesCopy()); page_->cookie_copy_status_ = CookieCopyStatus::kCopyComplete; @@ -1353,7 +1339,7 @@ } network::mojom::URLLoaderFactory* -IsolatedPrerenderTabHelper::GetURLLoaderFactory() { +PrefetchProxyTabHelper::GetURLLoaderFactory() { if (!page_->isolated_url_loader_factory_) { CreateIsolatedURLLoaderFactory(); } @@ -1361,7 +1347,7 @@ return page_->isolated_url_loader_factory_.get(); } -void IsolatedPrerenderTabHelper::CreateNewURLLoaderFactory( +void PrefetchProxyTabHelper::CreateNewURLLoaderFactory( mojo::PendingReceiver<network::mojom::URLLoaderFactory> pending_receiver, base::Optional<net::IsolationInfo> isolation_info) { DCHECK(page_->isolated_network_context_); @@ -1378,21 +1364,20 @@ std::move(pending_receiver), std::move(factory_params)); } -void IsolatedPrerenderTabHelper::CreateIsolatedURLLoaderFactory() { +void PrefetchProxyTabHelper::CreateIsolatedURLLoaderFactory() { page_->isolated_network_context_.reset(); page_->isolated_url_loader_factory_.reset(); - IsolatedPrerenderService* isolated_prerender_service = - IsolatedPrerenderServiceFactory::GetForProfile(profile_); + PrefetchProxyService* prefetch_proxy_service = + PrefetchProxyServiceFactory::GetForProfile(profile_); auto context_params = network::mojom::NetworkContextParams::New(); - context_params->context_name = "IsolatedPrerender"; + context_params->context_name = "PrefetchProxy"; context_params->user_agent = ::GetUserAgent(); context_params->accept_language = net::HttpUtil::GenerateAcceptLanguageHeader( profile_->GetPrefs()->GetString(language::prefs::kAcceptLanguages)); context_params->initial_custom_proxy_config = - isolated_prerender_service->proxy_configurator() - ->CreateCustomProxyConfig(); + prefetch_proxy_service->proxy_configurator()->CreateCustomProxyConfig(); context_params->cert_verifier_params = content::GetCertVerifierParams( network::mojom::CertVerifierCreationParams::New()); context_params->cors_exempt_header_list = { @@ -1408,7 +1393,7 @@ mojo::Remote<network::mojom::CustomProxyConfigClient> config_client; context_params->custom_proxy_config_client_receiver = config_client.BindNewPipeAndPassReceiver(); - isolated_prerender_service->proxy_configurator()->AddCustomProxyConfigClient( + prefetch_proxy_service->proxy_configurator()->AddCustomProxyConfigClient( std::move(config_client)); // Explicitly disallow network service features which could cause a privacy @@ -1425,7 +1410,7 @@ // surfaces won't be enabled. mojo::PendingRemote<network::mojom::NetworkContextClient> client_remote; mojo::MakeSelfOwnedReceiver( - std::make_unique<IsolatedPrerenderNetworkContextClient>(), + std::make_unique<PrefetchProxyNetworkContextClient>(), client_remote.InitWithNewPipeAndPassReceiver()); page_->isolated_network_context_->SetClient(std::move(client_remote)); @@ -1439,4 +1424,4 @@ std::move(isolated_factory_remote))); } -WEB_CONTENTS_USER_DATA_KEY_IMPL(IsolatedPrerenderTabHelper) +WEB_CONTENTS_USER_DATA_KEY_IMPL(PrefetchProxyTabHelper)
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h similarity index 88% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h index b1dc0bc..3f6988c 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_TAB_HELPER_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_TAB_HELPER_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_TAB_HELPER_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_TAB_HELPER_H_ #include <stdint.h> #include <map> @@ -18,8 +18,8 @@ #include "base/sequence_checker.h" #include "base/time/time.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" #include "content/public/browser/service_worker_context.h" #include "content/public/browser/web_contents_observer.h" @@ -33,9 +33,9 @@ #include "services/network/public/mojom/url_response_head.mojom-forward.h" #include "url/gurl.h" -class IsolatedPrerenderPageLoadMetricsObserver; -class IsolatedPrerenderPrefetchMetricsCollector; -class IsolatedPrerenderSubresourceManager; +class PrefetchProxyPageLoadMetricsObserver; +class PrefetchProxyPrefetchMetricsCollector; +class PrefetchProxySubresourceManager; class Profile; namespace net { @@ -50,12 +50,12 @@ // mainpage content of Google Search Result Page links when they are available. // When a prefetched page is navigated to, this class also copies over any // cookies from the prefetch into the profile's cookie jar. -class IsolatedPrerenderTabHelper +class PrefetchProxyTabHelper : public content::WebContentsObserver, - public content::WebContentsUserData<IsolatedPrerenderTabHelper>, + public content::WebContentsUserData<PrefetchProxyTabHelper>, public NavigationPredictorKeyedService::Observer { public: - ~IsolatedPrerenderTabHelper() override; + ~PrefetchProxyTabHelper() override; // A key to identify prefetching likely events to PLM. static const void* PrefetchingLikelyEventKey(); @@ -143,7 +143,7 @@ base::Optional<size_t> clicked_link_srp_position_; // The status of a prefetch done on the SRP that may have been used here. - base::Optional<IsolatedPrerenderPrefetchStatus> prefetch_status_; + base::Optional<PrefetchProxyPrefetchStatus> prefetch_status_; // The amount of time it took the probe to complete. Set only when a // prefetch is used and a probe was required. @@ -162,7 +162,7 @@ using OnEligibilityResultCallback = base::OnceCallback<void( const GURL& url, bool eligible, - base::Optional<IsolatedPrerenderPrefetchStatus> status)>; + base::Optional<PrefetchProxyPrefetchStatus> status)>; static void CheckEligibilityOfURL( Profile* profile, const GURL& url, @@ -172,8 +172,8 @@ // Returns nullopt unless the previous page load was a Google SRP where |this| // got parsed SRP links from NavigationPredictor. - base::Optional<IsolatedPrerenderTabHelper::AfterSRPMetrics> - after_srp_metrics() const; + base::Optional<PrefetchProxyTabHelper::AfterSRPMetrics> after_srp_metrics() + const; // content::WebContentsObserver implementation. void DidStartNavigation( @@ -191,14 +191,14 @@ // Updates |prefetch_status_by_url_|. void OnPrefetchStatusUpdate(const GURL& url, - IsolatedPrerenderPrefetchStatus usage); + PrefetchProxyPrefetchStatus usage); // Called by the URLLoaderInterceptor to update |page_.probe_latency_|. void NotifyPrefetchProbeLatency(base::TimeDelta probe_latency); // Called by the URLLoaderInterceptor to report the outcome of an origin // probe. - void ReportProbeResult(const GURL& url, IsolatedPrerenderProbeResult result); + void ReportProbeResult(const GURL& url, PrefetchProxyProbeResult result); // When a previously prefetched page is navigated to, any cookies set on that // page load should be copied over to the normal profile. While this copy is @@ -216,18 +216,18 @@ // Sets the service_worker_context_for_test_ with a FakeServiceWorkerContext // for the the purpose of testing. - // Used in the SetUp() method in isolated_prerender_tab_helper_unittest.cc. + // Used in the SetUp() method in prefetch_proxy_tab_helper_unittest.cc. static void SetServiceWorkerContextForTest( content::ServiceWorkerContext* context); protected: // Exposed for testing. - explicit IsolatedPrerenderTabHelper(content::WebContents* web_contents); + explicit PrefetchProxyTabHelper(content::WebContents* web_contents); virtual network::mojom::URLLoaderFactory* GetURLLoaderFactory(); private: - friend class IsolatedPrerenderPageLoadMetricsObserver; - friend class content::WebContentsUserData<IsolatedPrerenderTabHelper>; + friend class PrefetchProxyPageLoadMetricsObserver; + friend class content::WebContentsUserData<PrefetchProxyTabHelper>; // Identifies the state of the cookie copying process we're in, if any. enum class CookieCopyStatus { @@ -263,11 +263,11 @@ // Collects metrics on all prefetching. This is a scoped refptr so that it // can also be shared with subresource managers until all pointers to it are // destroyed, at which time it logs UKM. - scoped_refptr<IsolatedPrerenderPrefetchMetricsCollector> + scoped_refptr<PrefetchProxyPrefetchMetricsCollector> prefetch_metrics_collector_; // The status of each prefetch. - std::map<GURL, IsolatedPrerenderPrefetchStatus> prefetch_status_by_url_; + std::map<GURL, PrefetchProxyPrefetchStatus> prefetch_status_by_url_; // A map of all predicted URLs to their original placement in the ordered // prediction. @@ -311,12 +311,12 @@ std::vector<GURL> failed_no_state_prefetch_urls_; // If the current page load was prerendered, then this subresource manager - // is taken from |IsolatedPrerenderService| and used to facilitate loading + // is taken from |PrefetchProxyService| and used to facilitate loading // of prefetched resources from cache. Note: An - // |IsolatedPrerenderSubresourceManager| is dependent on the + // |PrefetchProxySubresourceManager| is dependent on the // |isolated_url_loader_factory_| and |isolated_network_context_| from the // previous page load remaining alive. - std::unique_ptr<IsolatedPrerenderSubresourceManager> subresource_manager_; + std::unique_ptr<PrefetchProxySubresourceManager> subresource_manager_; // The current status of copying cookies for the next page load when the // user navigates to a prefetched link. @@ -343,7 +343,7 @@ // to get the AfterSRPMetrics if the navigation fails to commit, so that // metrics can be logged anyways. Returns nullptr if the after srp metrics // wouldn't be set on the next commit. - std::unique_ptr<IsolatedPrerenderTabHelper::AfterSRPMetrics> + std::unique_ptr<PrefetchProxyTabHelper::AfterSRPMetrics> ComputeAfterSRPMetricsBeforeCommit(content::NavigationHandle* handle) const; // A helper method to make it easier to tell when prefetching is already @@ -398,9 +398,9 @@ // information about applicable NoStatePrefetches given |self|. Note: This is // done here because the navigation loader interceptor doesn't have visibility // itself and can't report it. Static and public to enable testing. - IsolatedPrerenderPrefetchStatus MaybeUpdatePrefetchStatusWithNSPContext( + PrefetchProxyPrefetchStatus MaybeUpdatePrefetchStatusWithNSPContext( const GURL& url, - IsolatedPrerenderPrefetchStatus status) const; + PrefetchProxyPrefetchStatus status) const; // NavigationPredictorKeyedService::Observer: void OnPredictionUpdated( @@ -411,7 +411,7 @@ void OnGotEligibilityResult( const GURL& url, bool eligible, - base::Optional<IsolatedPrerenderPrefetchStatus> status); + base::Optional<PrefetchProxyPrefetchStatus> status); // Creates a new URL Loader Factory on |page_|'s isolated network context. // |isolation_info| may be passed if the factory will be used in the renderer @@ -449,13 +449,12 @@ SEQUENCE_CHECKER(sequence_checker_); - base::WeakPtrFactory<IsolatedPrerenderTabHelper> weak_factory_{this}; + base::WeakPtrFactory<PrefetchProxyTabHelper> weak_factory_{this}; WEB_CONTENTS_USER_DATA_KEY_DECL(); - IsolatedPrerenderTabHelper(const IsolatedPrerenderTabHelper&) = delete; - IsolatedPrerenderTabHelper& operator=(const IsolatedPrerenderTabHelper&) = - delete; + PrefetchProxyTabHelper(const PrefetchProxyTabHelper&) = delete; + PrefetchProxyTabHelper& operator=(const PrefetchProxyTabHelper&) = delete; }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_TAB_HELPER_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_TAB_HELPER_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc similarity index 91% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper_unittest.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc index 578fb07..b9997e4 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" #include <memory> #include <string> @@ -20,9 +20,9 @@ #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h" #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h" #include "chrome/browser/net/prediction_options.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" @@ -71,10 +71,10 @@ } // namespace -class TestIsolatedPrerenderTabHelper : public IsolatedPrerenderTabHelper { +class TestPrefetchProxyTabHelper : public PrefetchProxyTabHelper { public: - explicit TestIsolatedPrerenderTabHelper(content::WebContents* web_contents) - : IsolatedPrerenderTabHelper(web_contents) {} + explicit TestPrefetchProxyTabHelper(content::WebContents* web_contents) + : PrefetchProxyTabHelper(web_contents) {} void SetURLLoaderFactory( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) { @@ -89,11 +89,11 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; }; -class IsolatedPrerenderTabHelperTestObserver - : public IsolatedPrerenderTabHelper::Observer { +class PrefetchProxyTabHelperTestObserver + : public PrefetchProxyTabHelper::Observer { public: - explicit IsolatedPrerenderTabHelperTestObserver( - IsolatedPrerenderTabHelper* tab_helper) { + explicit PrefetchProxyTabHelperTestObserver( + PrefetchProxyTabHelper* tab_helper) { tab_helper->AddObserverForTesting(this); } @@ -120,19 +120,18 @@ base::RepeatingClosure on_eligibility_result_callback_; }; -class IsolatedPrerenderTabHelperTest : public ChromeRenderViewHostTestHarness { +class PrefetchProxyTabHelperTest : public ChromeRenderViewHostTestHarness { public: - IsolatedPrerenderTabHelperTest() + PrefetchProxyTabHelperTest() : test_shared_loader_factory_( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_)) {} - ~IsolatedPrerenderTabHelperTest() override = default; + ~PrefetchProxyTabHelperTest() override = default; void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); - tab_helper_ = - std::make_unique<TestIsolatedPrerenderTabHelper>(web_contents()); + tab_helper_ = std::make_unique<TestPrefetchProxyTabHelper>(web_contents()); tab_helper_->SetURLLoaderFactory(test_shared_loader_factory_); tab_helper_->SetServiceWorkerContextForTest(&service_worker_context_); @@ -176,7 +175,7 @@ int RequestCount() { return test_url_loader_factory_.NumPending(); } - IsolatedPrerenderTabHelper* tab_helper() const { return tab_helper_.get(); } + PrefetchProxyTabHelper* tab_helper() const { return tab_helper_.get(); } int64_t ordered_eligible_pages_bitmask() const { return tab_helper_->srp_metrics().ordered_eligible_pages_bitmask_; @@ -243,7 +242,7 @@ void NavigateAndVerifyPrefetchStatus( const GURL& url, - IsolatedPrerenderPrefetchStatus expected_status) { + PrefetchProxyPrefetchStatus expected_status) { // Navigate to trigger an after-srp page load where the status for the given // url should be placed into the after srp metrics. Navigate(url); @@ -371,10 +370,10 @@ content::FakeServiceWorkerContext service_worker_context_; private: - std::unique_ptr<TestIsolatedPrerenderTabHelper> tab_helper_; + std::unique_ptr<TestPrefetchProxyTabHelper> tab_helper_; }; -TEST_F(IsolatedPrerenderTabHelperTest, FeatureDisabled) { +TEST_F(PrefetchProxyTabHelperTest, FeatureDisabled) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndDisableFeature(features::kIsolatePrerenders); @@ -409,7 +408,7 @@ EXPECT_FALSE(HasAfterSRPMetrics()); } -TEST_F(IsolatedPrerenderTabHelperTest, DataSaverDisabled_Required) { +TEST_F(PrefetchProxyTabHelperTest, DataSaverDisabled_Required) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -447,7 +446,7 @@ EXPECT_FALSE(HasAfterSRPMetrics()); } -TEST_F(IsolatedPrerenderTabHelperTest, DataSaverDisabled_NotRequired) { +TEST_F(PrefetchProxyTabHelperTest, DataSaverDisabled_NotRequired) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -469,7 +468,7 @@ EXPECT_TRUE(navigation_to_prefetch_start().has_value()); } -TEST_F(IsolatedPrerenderTabHelperTest, GoogleSRPOnly) { +TEST_F(PrefetchProxyTabHelperTest, GoogleSRPOnly) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -504,7 +503,7 @@ EXPECT_FALSE(HasAfterSRPMetrics()); } -TEST_F(IsolatedPrerenderTabHelperTest, SRPOnly) { +TEST_F(PrefetchProxyTabHelperTest, SRPOnly) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -539,7 +538,7 @@ EXPECT_FALSE(HasAfterSRPMetrics()); } -TEST_F(IsolatedPrerenderTabHelperTest, HTTPSPredictionsOnly) { +TEST_F(PrefetchProxyTabHelperTest, HTTPSPredictionsOnly) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -568,7 +567,7 @@ NavigateAndVerifyPrefetchStatus( prediction_url, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -576,7 +575,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0); } -TEST_F(IsolatedPrerenderTabHelperTest, DontFetchGoogleLinks) { +TEST_F(PrefetchProxyTabHelperTest, DontFetchGoogleLinks) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -605,7 +604,7 @@ NavigateAndVerifyPrefetchStatus( prediction_url, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleGoogleDomain); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleGoogleDomain); EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -613,7 +612,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0); } -TEST_F(IsolatedPrerenderTabHelperTest, DontFetchIPAddresses) { +TEST_F(PrefetchProxyTabHelperTest, DontFetchIPAddresses) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -642,7 +641,7 @@ NavigateAndVerifyPrefetchStatus( prediction_url, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleHostIsIPAddress); EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -650,7 +649,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0); } -TEST_F(IsolatedPrerenderTabHelperTest, WrongWebContents) { +TEST_F(PrefetchProxyTabHelperTest, WrongWebContents) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -685,7 +684,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0); } -TEST_F(IsolatedPrerenderTabHelperTest, HasPurposePrefetchHeader) { +TEST_F(PrefetchProxyTabHelperTest, HasPurposePrefetchHeader) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -706,7 +705,7 @@ EXPECT_TRUE(navigation_to_prefetch_start().has_value()); } -TEST_F(IsolatedPrerenderTabHelperTest, NoCookies) { +TEST_F(PrefetchProxyTabHelperTest, NoCookies) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -739,7 +738,7 @@ NavigateAndVerifyPrefetchStatus( prediction_url, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies); EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -747,7 +746,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0); } -TEST_F(IsolatedPrerenderTabHelperTest, 2XXOnly) { +TEST_F(PrefetchProxyTabHelperTest, 2XXOnly) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -782,7 +781,7 @@ 1); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNon2XX); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchFailedNon2XX); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -790,7 +789,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, NetErrorOKOnly) { +TEST_F(PrefetchProxyTabHelperTest, NetErrorOKOnly) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -824,7 +823,7 @@ "IsolatedPrerender.Prefetch.Mainframe.ConnectTime", 0); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNetError); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchFailedNetError); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -832,7 +831,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, ResponseBodyLimit) { +TEST_F(PrefetchProxyTabHelperTest, ResponseBodyLimit) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -867,7 +866,7 @@ "IsolatedPrerender.Prefetch.Mainframe.ConnectTime", 0); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNetError); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchFailedNetError); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -875,7 +874,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, NonHTML) { +TEST_F(PrefetchProxyTabHelperTest, NonHTML) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -910,7 +909,7 @@ 1); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchFailedNotHTML); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchFailedNotHTML); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -918,7 +917,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, EligiblePredictionPositions) { +TEST_F(PrefetchProxyTabHelperTest, EligiblePredictionPositions) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -940,13 +939,12 @@ EXPECT_FALSE(navigation_to_prefetch_start().has_value()); NavigateAndVerifyPrefetchStatus( - eligible_url, - IsolatedPrerenderPrefetchStatus::kPrefetchPositionIneligible); + eligible_url, PrefetchProxyPrefetchStatus::kPrefetchPositionIneligible); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(1), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperTest, UserSettingDisabled) { +TEST_F(PrefetchProxyTabHelperTest, UserSettingDisabled) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -988,7 +986,7 @@ // Verify that isolated prerender is not triggered if the predictions for next // likely navigations are provided by external Android app. -TEST_F(IsolatedPrerenderTabHelperTest, ExternalAndroidApp) { +TEST_F(PrefetchProxyTabHelperTest, ExternalAndroidApp) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1001,7 +999,7 @@ EXPECT_EQ(RequestCount(), 0); } -TEST_F(IsolatedPrerenderTabHelperTest, IgnoreSameDocNavigations) { +TEST_F(PrefetchProxyTabHelperTest, IgnoreSameDocNavigations) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1038,7 +1036,7 @@ 1); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -1046,7 +1044,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, SuccessCase) { +TEST_F(PrefetchProxyTabHelperTest, SuccessCase) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1093,7 +1091,7 @@ 1); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -1101,7 +1099,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, AfterSRPLinkNotOnSRP) { +TEST_F(PrefetchProxyTabHelperTest, AfterSRPLinkNotOnSRP) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1137,7 +1135,7 @@ NavigateAndVerifyPrefetchStatus( GURL("https://wasnt-on-srp.com"), - IsolatedPrerenderPrefetchStatus::kNavigatedToLinkNotOnSRP); + PrefetchProxyPrefetchStatus::kNavigatedToLinkNotOnSRP); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::nullopt, after_srp_clicked_link_srp_position()); @@ -1145,7 +1143,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, LimitedNumberOfPrefetches_Zero) { +TEST_F(PrefetchProxyTabHelperTest, LimitedNumberOfPrefetches_Zero) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -1175,7 +1173,7 @@ "IsolatedPrerender.Prefetch.Mainframe.ConnectTime", 0); NavigateAndVerifyPrefetchStatus( - prediction_url, IsolatedPrerenderPrefetchStatus::kPrefetchNotStarted); + prediction_url, PrefetchProxyPrefetchStatus::kPrefetchNotStarted); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -1183,8 +1181,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0); } -TEST_F(IsolatedPrerenderTabHelperTest, - NumberOfPrefetches_UnlimitedByExperiment) { +TEST_F(PrefetchProxyTabHelperTest, NumberOfPrefetches_UnlimitedByExperiment) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -1238,7 +1235,7 @@ 2); NavigateAndVerifyPrefetchStatus( - prediction_url_3, IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + prediction_url_3, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); EXPECT_EQ(after_srp_prefetch_eligible_count(), 3U); EXPECT_EQ(base::Optional<size_t>(2), after_srp_clicked_link_srp_position()); @@ -1246,14 +1243,14 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, ConcurrentPrefetches) { +TEST_F(PrefetchProxyTabHelperTest, ConcurrentPrefetches) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( features::kIsolatePrerenders, {{"max_concurrent_prefetches", "2"}, {"max_srp_prefetches", "-1"}}); - IsolatedPrerenderTabHelperTestObserver observer(tab_helper()); + PrefetchProxyTabHelperTestObserver observer(tab_helper()); NavigateSomewhere(); GURL doc_url("https://www.google.com/search?q=cats"); @@ -1292,7 +1289,7 @@ 2); NavigateAndVerifyPrefetchStatus( - prediction_url_2, IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + prediction_url_2, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); EXPECT_EQ(after_srp_prefetch_eligible_count(), 2U); EXPECT_EQ(base::Optional<size_t>(1), after_srp_clicked_link_srp_position()); @@ -1300,7 +1297,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, OrderedBitMask) { +TEST_F(PrefetchProxyTabHelperTest, OrderedBitMask) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1324,7 +1321,7 @@ EXPECT_EQ(ordered_eligible_pages_bitmask(), 0b011100); } -TEST_F(IsolatedPrerenderTabHelperTest, NumberOfPrefetches_UnlimitedByCmdLine) { +TEST_F(PrefetchProxyTabHelperTest, NumberOfPrefetches_UnlimitedByCmdLine) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1380,7 +1377,7 @@ 2); NavigateAndVerifyPrefetchStatus( - prediction_url_1, IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + prediction_url_1, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); EXPECT_EQ(after_srp_prefetch_eligible_count(), 3U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); @@ -1388,7 +1385,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, LimitedNumberOfPrefetches) { +TEST_F(PrefetchProxyTabHelperTest, LimitedNumberOfPrefetches) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters( @@ -1444,7 +1441,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, PrefetchingNotStartedWhileInvisible) { +TEST_F(PrefetchProxyTabHelperTest, PrefetchingNotStartedWhileInvisible) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1465,7 +1462,7 @@ EXPECT_TRUE(navigation_to_prefetch_start().has_value()); } -TEST_F(IsolatedPrerenderTabHelperTest, PrefetchingPausedWhenInvisible) { +TEST_F(PrefetchProxyTabHelperTest, PrefetchingPausedWhenInvisible) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1511,7 +1508,7 @@ "IsolatedPrerender.Prefetch.Mainframe.TotalRedirects", 0, 1); } -TEST_F(IsolatedPrerenderTabHelperTest, PrefetchingRestartedWhenVisible) { +TEST_F(PrefetchProxyTabHelperTest, PrefetchingRestartedWhenVisible) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1545,7 +1542,7 @@ navigation_to_prefetch_start().value()); } -TEST_F(IsolatedPrerenderTabHelperTest, ServiceWorkerRegistered) { +TEST_F(PrefetchProxyTabHelperTest, ServiceWorkerRegistered) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1566,14 +1563,14 @@ EXPECT_EQ(prefetch_total_redirect_count(), 0U); EXPECT_FALSE(navigation_to_prefetch_start().has_value()); - NavigateAndVerifyPrefetchStatus(prediction_url, - IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleUserHasServiceWorker); + NavigateAndVerifyPrefetchStatus( + prediction_url, + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasServiceWorker); EXPECT_EQ(after_srp_prefetch_eligible_count(), 0U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperTest, ServiceWorkerNotRegistered) { +TEST_F(PrefetchProxyTabHelperTest, ServiceWorkerNotRegistered) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); @@ -1597,11 +1594,10 @@ EXPECT_TRUE(navigation_to_prefetch_start().has_value()); } -class IsolatedPrerenderTabHelperRedirectTest - : public IsolatedPrerenderTabHelperTest { +class PrefetchProxyTabHelperRedirectTest : public PrefetchProxyTabHelperTest { public: - IsolatedPrerenderTabHelperRedirectTest() = default; - ~IsolatedPrerenderTabHelperRedirectTest() override = default; + PrefetchProxyTabHelperRedirectTest() = default; + ~PrefetchProxyTabHelperRedirectTest() override = default; void WalkRedirectChainUntilFinalRequest(std::vector<GURL> redirect_chain) { ASSERT_GE(redirect_chain.size(), 2U) @@ -1686,7 +1682,7 @@ } }; -TEST_F(IsolatedPrerenderTabHelperRedirectTest, NoRedirect_Cookies) { +TEST_F(PrefetchProxyTabHelperRedirectTest, NoRedirect_Cookies) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); NavigateSomewhere(); @@ -1704,12 +1700,12 @@ NavigateAndVerifyPrefetchStatus( site_with_cookies, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleUserHasCookies); + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasCookies); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperRedirectTest, NoRedirect_Insecure) { +TEST_F(PrefetchProxyTabHelperRedirectTest, NoRedirect_Insecure) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); NavigateSomewhere(); @@ -1726,13 +1722,12 @@ EXPECT_TRUE(navigation_to_prefetch_start().has_value()); NavigateAndVerifyPrefetchStatus( - url, - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); + url, PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperRedirectTest, NoRedirect_Insecure_Continued) { +TEST_F(PrefetchProxyTabHelperRedirectTest, NoRedirect_Insecure_Continued) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); NavigateSomewhere(); @@ -1763,15 +1758,14 @@ ASSERT_TRUE(tab_helper()->after_srp_metrics().has_value()); ASSERT_TRUE(tab_helper()->after_srp_metrics()->prefetch_status_.has_value()); - EXPECT_EQ( - IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps, - tab_helper()->after_srp_metrics()->prefetch_status_.value()); + EXPECT_EQ(PrefetchProxyPrefetchStatus::kPrefetchNotEligibleSchemeIsNotHttps, + tab_helper()->after_srp_metrics()->prefetch_status_.value()); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperRedirectTest, NoRedirect_Google) { +TEST_F(PrefetchProxyTabHelperRedirectTest, NoRedirect_Google) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); NavigateSomewhere(); @@ -1788,12 +1782,12 @@ EXPECT_TRUE(navigation_to_prefetch_start().has_value()); NavigateAndVerifyPrefetchStatus( - url, IsolatedPrerenderPrefetchStatus::kPrefetchNotEligibleGoogleDomain); + url, PrefetchProxyPrefetchStatus::kPrefetchNotEligibleGoogleDomain); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperRedirectTest, NoRedirect_ServiceWorker) { +TEST_F(PrefetchProxyTabHelperRedirectTest, NoRedirect_ServiceWorker) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(features::kIsolatePrerenders); NavigateSomewhere(); @@ -1812,14 +1806,14 @@ EXPECT_EQ(prefetch_total_redirect_count(), 1U); EXPECT_TRUE(navigation_to_prefetch_start().has_value()); - NavigateAndVerifyPrefetchStatus(site_with_worker, - IsolatedPrerenderPrefetchStatus:: - kPrefetchNotEligibleUserHasServiceWorker); + NavigateAndVerifyPrefetchStatus( + site_with_worker, + PrefetchProxyPrefetchStatus::kPrefetchNotEligibleUserHasServiceWorker); EXPECT_EQ(after_srp_prefetch_eligible_count(), 1U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position()); } -TEST_F(IsolatedPrerenderTabHelperRedirectTest, SuccessfulRedirect) { +TEST_F(PrefetchProxyTabHelperRedirectTest, SuccessfulRedirect) { // Enable unlimited prefetches so we can follow the redirect chain all the // way. base::test::ScopedFeatureList scoped_feature_list; @@ -1868,7 +1862,7 @@ 1); NavigateAndVerifyPrefetchStatus( - redirect_url, IsolatedPrerenderPrefetchStatus::kPrefetchSuccessful); + redirect_url, PrefetchProxyPrefetchStatus::kPrefetchSuccessful); EXPECT_EQ(after_srp_prefetch_eligible_count(), 2U); EXPECT_EQ(base::Optional<size_t>(0), after_srp_clicked_link_srp_position());
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.cc similarity index 98% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.cc index b04c3a0..dc0e8ce 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h" #include "base/run_loop.h" #include "base/task/single_thread_task_executor.h"
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h similarity index 92% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h index 60a233d..6ae5c26a 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_TEST_UTILS_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_TEST_UTILS_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_TEST_UTILS_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_TEST_UTILS_H_ #include <memory> @@ -100,4 +100,4 @@ DISALLOW_COPY_AND_ASSIGN(TestProxyTunnelConnection); }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_TEST_UTILS_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_TEST_UTILS_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.cc similarity index 78% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.cc index 03f83dbf..0f493f22 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.h" #include "base/bind.h" #include "base/bind_helpers.h" @@ -19,7 +19,7 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" -IsolatedPrerenderURLLoader::IsolatedPrerenderURLLoader( +PrefetchProxyURLLoader::PrefetchProxyURLLoader( const network::ResourceRequest& unused_request, const scoped_refptr<network::SharedURLLoaderFactory>& network_loader_factory, @@ -32,15 +32,15 @@ // URLLoaderThrottles yet. } -IsolatedPrerenderURLLoader::~IsolatedPrerenderURLLoader() = default; +PrefetchProxyURLLoader::~PrefetchProxyURLLoader() = default; -IsolatedPrerenderURLLoader::RequestHandler -IsolatedPrerenderURLLoader::ServingResponseHandler() { - return base::BindOnce(&IsolatedPrerenderURLLoader::BindAndStart, +PrefetchProxyURLLoader::RequestHandler +PrefetchProxyURLLoader::ServingResponseHandler() { + return base::BindOnce(&PrefetchProxyURLLoader::BindAndStart, weak_ptr_factory_.GetWeakPtr()); } -void IsolatedPrerenderURLLoader::BindAndStart( +void PrefetchProxyURLLoader::BindAndStart( const network::ResourceRequest& request, mojo::PendingReceiver<network::mojom::URLLoader> receiver, mojo::PendingRemote<network::mojom::URLLoaderClient> forwarding_client) { @@ -48,7 +48,7 @@ DCHECK(!receiver_.is_bound()); receiver_.Bind(std::move(receiver)); receiver_.set_disconnect_handler( - base::BindOnce(&IsolatedPrerenderURLLoader::OnConnectionError, + base::BindOnce(&PrefetchProxyURLLoader::OnConnectionError, weak_ptr_factory_.GetWeakPtr())); forwarding_client_.Bind(std::move(forwarding_client)); @@ -65,7 +65,7 @@ network_loader_client_.BindNewPipeAndPassRemote( base::ThreadTaskRunnerHandle::Get()), net::MutableNetworkTrafficAnnotationTag( - net::DefineNetworkTrafficAnnotation("isolated_prerender_loader", R"( + net::DefineNetworkTrafficAnnotation("prefetch_proxy_loader", R"( semantics { sender: "Isolated Prerender Loader" description: @@ -91,21 +91,21 @@ })"))); network_loader_client_.set_disconnect_handler(base::BindOnce( - &IsolatedPrerenderURLLoader::OnConnectionError, base::Unretained(this))); + &PrefetchProxyURLLoader::OnConnectionError, base::Unretained(this))); } -void IsolatedPrerenderURLLoader::OnReceiveResponse( +void PrefetchProxyURLLoader::OnReceiveResponse( network::mojom::URLResponseHeadPtr head) { forwarding_client_->OnReceiveResponse(std::move(head)); } -void IsolatedPrerenderURLLoader::OnReceiveRedirect( +void PrefetchProxyURLLoader::OnReceiveRedirect( const net::RedirectInfo& redirect_info, network::mojom::URLResponseHeadPtr head) { forwarding_client_->OnReceiveRedirect(redirect_info, std::move(head)); } -void IsolatedPrerenderURLLoader::OnUploadProgress( +void PrefetchProxyURLLoader::OnUploadProgress( int64_t current_position, int64_t total_size, OnUploadProgressCallback callback) { @@ -113,27 +113,26 @@ std::move(callback)); } -void IsolatedPrerenderURLLoader::OnReceiveCachedMetadata( +void PrefetchProxyURLLoader::OnReceiveCachedMetadata( mojo_base::BigBuffer data) { forwarding_client_->OnReceiveCachedMetadata(std::move(data)); } -void IsolatedPrerenderURLLoader::OnTransferSizeUpdated( - int32_t transfer_size_diff) { +void PrefetchProxyURLLoader::OnTransferSizeUpdated(int32_t transfer_size_diff) { forwarding_client_->OnTransferSizeUpdated(transfer_size_diff); } -void IsolatedPrerenderURLLoader::OnStartLoadingResponseBody( +void PrefetchProxyURLLoader::OnStartLoadingResponseBody( mojo::ScopedDataPipeConsumerHandle body) { forwarding_client_->OnStartLoadingResponseBody(std::move(body)); } -void IsolatedPrerenderURLLoader::OnComplete( +void PrefetchProxyURLLoader::OnComplete( const network::URLLoaderCompletionStatus& status) { forwarding_client_->OnComplete(status); } -void IsolatedPrerenderURLLoader::FollowRedirect( +void PrefetchProxyURLLoader::FollowRedirect( const std::vector<std::string>& removed_headers, const net::HttpRequestHeaders& modified_headers, const net::HttpRequestHeaders& modified_cors_exempt_headers, @@ -142,20 +141,20 @@ modified_cors_exempt_headers, new_url); } -void IsolatedPrerenderURLLoader::SetPriority(net::RequestPriority priority, - int32_t intra_priority_value) { +void PrefetchProxyURLLoader::SetPriority(net::RequestPriority priority, + int32_t intra_priority_value) { network_loader_->SetPriority(priority, intra_priority_value); } -void IsolatedPrerenderURLLoader::PauseReadingBodyFromNet() { +void PrefetchProxyURLLoader::PauseReadingBodyFromNet() { network_loader_->PauseReadingBodyFromNet(); } -void IsolatedPrerenderURLLoader::ResumeReadingBodyFromNet() { +void PrefetchProxyURLLoader::ResumeReadingBodyFromNet() { network_loader_->ResumeReadingBodyFromNet(); } -void IsolatedPrerenderURLLoader::OnConnectionError() { +void PrefetchProxyURLLoader::OnConnectionError() { network_loader_.reset(); network_loader_client_.reset(); receiver_.reset();
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.h similarity index 81% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.h index 76f5b702..0dfbc62 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_URL_LOADER_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_URL_LOADER_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_URL_LOADER_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_URL_LOADER_H_ #include <stdint.h> @@ -21,8 +21,8 @@ // An URL loader that allows access to otherwise enclosed state like the // URLLoaderFactory for isolated prerendering. -class IsolatedPrerenderURLLoader : public network::mojom::URLLoader, - public network::mojom::URLLoaderClient { +class PrefetchProxyURLLoader : public network::mojom::URLLoader, + public network::mojom::URLLoaderClient { public: using RequestHandler = base::OnceCallback<void( const network::ResourceRequest& resource_request, @@ -31,13 +31,12 @@ // The ResourceRequest is unused since it has not been acted on by // URLLoaderThrottles yet. - IsolatedPrerenderURLLoader( - const network::ResourceRequest& unused_request, - const scoped_refptr<network::SharedURLLoaderFactory>& - network_loader_factory, - int32_t routing_id, - int32_t request_id); - ~IsolatedPrerenderURLLoader() override; + PrefetchProxyURLLoader(const network::ResourceRequest& unused_request, + const scoped_refptr<network::SharedURLLoaderFactory>& + network_loader_factory, + int32_t routing_id, + int32_t request_id); + ~PrefetchProxyURLLoader() override; // Called when the response should be fetched in an isolated manner. Returns a // handler. @@ -93,9 +92,9 @@ mojo::Receiver<network::mojom::URLLoader> receiver_{this}; mojo::Remote<network::mojom::URLLoaderClient> forwarding_client_; - base::WeakPtrFactory<IsolatedPrerenderURLLoader> weak_ptr_factory_{this}; + base::WeakPtrFactory<PrefetchProxyURLLoader> weak_ptr_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderURLLoader); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyURLLoader); }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_URL_LOADER_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_URL_LOADER_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc similarity index 69% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc index 577c786..6921981 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h" #include <memory> @@ -10,14 +10,14 @@ #include "base/callback.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_from_string_url_loader.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_params.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_service_factory.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_subresource_manager.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_from_string_url_loader.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_service_factory.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_subresource_manager.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" #include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/browser/profiles/profile.h" @@ -42,8 +42,8 @@ if (!web_contents) return; - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(web_contents); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(web_contents); if (!tab_helper) return; @@ -52,14 +52,14 @@ void ReportProbeResult(int frame_tree_node_id, const GURL& url, - IsolatedPrerenderProbeResult result) { + PrefetchProxyProbeResult result) { content::WebContents* web_contents = content::WebContents::FromFrameTreeNodeId(frame_tree_node_id); if (!web_contents) return; - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(web_contents); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(web_contents); if (!tab_helper) return; @@ -78,12 +78,12 @@ if (!profile) return; - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile); if (!service) return; - IsolatedPrerenderSubresourceManager* subresource_manager = + PrefetchProxySubresourceManager* subresource_manager = service->GetSubresourceManagerForURL(url); if (!subresource_manager) return; @@ -93,16 +93,15 @@ } // namespace -IsolatedPrerenderURLLoaderInterceptor::IsolatedPrerenderURLLoaderInterceptor( +PrefetchProxyURLLoaderInterceptor::PrefetchProxyURLLoaderInterceptor( int frame_tree_node_id) : frame_tree_node_id_(frame_tree_node_id) {} -IsolatedPrerenderURLLoaderInterceptor:: - ~IsolatedPrerenderURLLoaderInterceptor() = default; +PrefetchProxyURLLoaderInterceptor::~PrefetchProxyURLLoaderInterceptor() = + default; -bool IsolatedPrerenderURLLoaderInterceptor:: - MaybeInterceptNoStatePrefetchNavigation( - const network::ResourceRequest& tentative_resource_request) { +bool PrefetchProxyURLLoaderInterceptor::MaybeInterceptNoStatePrefetchNavigation( + const network::ResourceRequest& tentative_resource_request) { Profile* profile = ProfileFromFrameTreeNodeID(frame_tree_node_id_); content::WebContents* web_contents = content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_); @@ -115,12 +114,12 @@ if (!prerender_manager->IsWebContentsPrerendering(web_contents)) return false; - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile); if (!service) return false; - IsolatedPrerenderSubresourceManager* manager = + PrefetchProxySubresourceManager* manager = service->GetSubresourceManagerForURL(url_); if (!manager) return false; @@ -135,7 +134,7 @@ return true; } -void IsolatedPrerenderURLLoaderInterceptor::MaybeCreateLoader( +void PrefetchProxyURLLoaderInterceptor::MaybeCreateLoader( const network::ResourceRequest& tentative_resource_request, content::BrowserContext* browser_context, content::URLLoaderRequestInterceptor::LoaderCallback callback) { @@ -161,8 +160,8 @@ DoNotInterceptNavigation(); return; } - IsolatedPrerenderService* service = - IsolatedPrerenderServiceFactory::GetForProfile(profile); + PrefetchProxyService* service = + PrefetchProxyServiceFactory::GetForProfile(profile); if (!service) { DoNotInterceptNavigation(); return; @@ -171,14 +170,14 @@ if (service->origin_prober()->ShouldProbeOrigins()) { probe_start_time_ = base::TimeTicks::Now(); base::OnceClosure on_success_callback = - base::BindOnce(&IsolatedPrerenderURLLoaderInterceptor:: + base::BindOnce(&PrefetchProxyURLLoaderInterceptor:: EnsureCookiesCopiedAndInterceptPrefetchedNavigation, weak_factory_.GetWeakPtr(), tentative_resource_request, std::move(prefetch)); service->origin_prober()->Probe( url_.GetOrigin(), - base::BindOnce(&IsolatedPrerenderURLLoaderInterceptor::OnProbeComplete, + base::BindOnce(&PrefetchProxyURLLoaderInterceptor::OnProbeComplete, weak_factory_.GetWeakPtr(), std::move(on_success_callback))); return; @@ -188,20 +187,19 @@ tentative_resource_request, std::move(prefetch)); } -void IsolatedPrerenderURLLoaderInterceptor:: +void PrefetchProxyURLLoaderInterceptor:: EnsureCookiesCopiedAndInterceptPrefetchedNavigation( const network::ResourceRequest& tentative_resource_request, std::unique_ptr<PrefetchedMainframeResponseContainer> prefetch) { // The TabHelper needs to copy cookies over to the main profile's cookie jar // before we can commit the mainframe so that subresources have the cookies // they need before being put on the wire. - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents( - content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_)); + PrefetchProxyTabHelper* tab_helper = PrefetchProxyTabHelper::FromWebContents( + content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_)); if (tab_helper && tab_helper->IsWaitingForAfterSRPCookiesCopy()) { cookie_copy_start_time_ = base::TimeTicks::Now(); tab_helper->SetOnAfterSRPCookieCopyCompleteCallback(base::BindOnce( - &IsolatedPrerenderURLLoaderInterceptor::InterceptPrefetchedNavigation, + &PrefetchProxyURLLoaderInterceptor::InterceptPrefetchedNavigation, weak_factory_.GetWeakPtr(), tentative_resource_request, std::move(prefetch))); return; @@ -215,7 +213,7 @@ std::move(prefetch)); } -void IsolatedPrerenderURLLoaderInterceptor::InterceptPrefetchedNavigation( +void PrefetchProxyURLLoaderInterceptor::InterceptPrefetchedNavigation( const network::ResourceRequest& tentative_resource_request, std::unique_ptr<PrefetchedMainframeResponseContainer> prefetch) { if (cookie_copy_start_time_) { @@ -227,30 +225,30 @@ NotifyPrefetchStatusUpdate( probe_start_time_.has_value() - ? IsolatedPrerenderPrefetchStatus::kPrefetchUsedProbeSuccess - : IsolatedPrerenderPrefetchStatus::kPrefetchUsedNoProbe); + ? PrefetchProxyPrefetchStatus::kPrefetchUsedProbeSuccess + : PrefetchProxyPrefetchStatus::kPrefetchUsedNoProbe); - std::unique_ptr<IsolatedPrerenderFromStringURLLoader> url_loader = - std::make_unique<IsolatedPrerenderFromStringURLLoader>( + std::unique_ptr<PrefetchProxyFromStringURLLoader> url_loader = + std::make_unique<PrefetchProxyFromStringURLLoader>( std::move(prefetch), tentative_resource_request); std::move(loader_callback_).Run(url_loader->ServingResponseHandler()); // url_loader manages its own lifetime once bound to the mojo pipes. url_loader.release(); } -void IsolatedPrerenderURLLoaderInterceptor::DoNotInterceptNavigation() { +void PrefetchProxyURLLoaderInterceptor::DoNotInterceptNavigation() { std::move(loader_callback_).Run({}); } -void IsolatedPrerenderURLLoaderInterceptor::OnProbeComplete( +void PrefetchProxyURLLoaderInterceptor::OnProbeComplete( base::OnceClosure on_success_callback, - IsolatedPrerenderProbeResult result) { + PrefetchProxyProbeResult result) { DCHECK(probe_start_time_.has_value()); ReportProbeLatency(frame_tree_node_id_, base::TimeTicks::Now() - probe_start_time_.value()); ReportProbeResult(frame_tree_node_id_, url_, result); - if (IsolatedPrerenderProbeResultIsSuccess(result)) { + if (PrefetchProxyProbeResultIsSuccess(result)) { std::move(on_success_callback).Run(); return; } @@ -260,35 +258,35 @@ NotifySubresourceManagerOfBadProbe(frame_tree_node_id_, url_); NotifyPrefetchStatusUpdate( - IsolatedPrerenderPrefetchStatus::kPrefetchNotUsedProbeFailed); + PrefetchProxyPrefetchStatus::kPrefetchNotUsedProbeFailed); DoNotInterceptNavigation(); } std::unique_ptr<PrefetchedMainframeResponseContainer> -IsolatedPrerenderURLLoaderInterceptor::GetPrefetchedResponse(const GURL& url) { +PrefetchProxyURLLoaderInterceptor::GetPrefetchedResponse(const GURL& url) { content::WebContents* web_contents = content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_); if (!web_contents) return nullptr; - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(web_contents); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(web_contents); if (!tab_helper) return nullptr; return tab_helper->TakePrefetchResponse(url); } -void IsolatedPrerenderURLLoaderInterceptor::NotifyPrefetchStatusUpdate( - IsolatedPrerenderPrefetchStatus status) const { +void PrefetchProxyURLLoaderInterceptor::NotifyPrefetchStatusUpdate( + PrefetchProxyPrefetchStatus status) const { content::WebContents* web_contents = content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_); if (!web_contents) { return; } - IsolatedPrerenderTabHelper* tab_helper = - IsolatedPrerenderTabHelper::FromWebContents(web_contents); + PrefetchProxyTabHelper* tab_helper = + PrefetchProxyTabHelper::FromWebContents(web_contents); if (!tab_helper) return;
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h similarity index 76% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h index a903e91..6ad1a61 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.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 CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_URL_LOADER_INTERCEPTOR_H_ -#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_URL_LOADER_INTERCEPTOR_H_ +#ifndef CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_URL_LOADER_INTERCEPTOR_H_ +#define CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_URL_LOADER_INTERCEPTOR_H_ #include <memory> @@ -14,8 +14,8 @@ #include "base/sequence_checker.h" #include "base/time/time.h" #include "chrome/browser/availability/availability_prober.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_status.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_probe_result.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_status.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_probe_result.h" #include "content/public/browser/url_loader_request_interceptor.h" #include "services/network/public/cpp/resource_request.h" #include "url/gurl.h" @@ -27,11 +27,11 @@ class PrefetchedMainframeResponseContainer; // Intercepts prerender navigations that are eligible to be isolated. -class IsolatedPrerenderURLLoaderInterceptor +class PrefetchProxyURLLoaderInterceptor : public content::URLLoaderRequestInterceptor { public: - explicit IsolatedPrerenderURLLoaderInterceptor(int frame_tree_node_id); - ~IsolatedPrerenderURLLoaderInterceptor() override; + explicit PrefetchProxyURLLoaderInterceptor(int frame_tree_node_id); + ~PrefetchProxyURLLoaderInterceptor() override; // content::URLLaoderRequestInterceptor: void MaybeCreateLoader( @@ -63,10 +63,10 @@ // Called when the probe finishes with |result|. void OnProbeComplete(base::OnceClosure on_success_callback, - IsolatedPrerenderProbeResult result); + PrefetchProxyProbeResult result); // Notifies the Tab Helper about the usage of a prefetched resource. - void NotifyPrefetchStatusUpdate(IsolatedPrerenderPrefetchStatus usage) const; + void NotifyPrefetchStatusUpdate(PrefetchProxyPrefetchStatus usage) const; // Used to get the current WebContents. const int frame_tree_node_id_; @@ -87,10 +87,9 @@ SEQUENCE_CHECKER(sequence_checker_); - base::WeakPtrFactory<IsolatedPrerenderURLLoaderInterceptor> weak_factory_{ - this}; + base::WeakPtrFactory<PrefetchProxyURLLoaderInterceptor> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(IsolatedPrerenderURLLoaderInterceptor); + DISALLOW_COPY_AND_ASSIGN(PrefetchProxyURLLoaderInterceptor); }; -#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_ISOLATED_PRERENDER_URL_LOADER_INTERCEPTOR_H_ +#endif // CHROME_BROWSER_PREFETCH_PREFETCH_PROXY_PREFETCH_PROXY_URL_LOADER_INTERCEPTOR_H_
diff --git a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc similarity index 75% rename from chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor_unittest.cc rename to chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc index 8099cd15..45358c7b 100644 --- a/chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor_unittest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.h" #include <memory> #include "base/command_line.h" #include "base/test/metrics/histogram_tester.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_features.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_features.h" #include "chrome/browser/prefetch/prefetch_proxy/prefetched_mainframe_response_container.h" #include "chrome/browser/prerender/prerender_manager_factory.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" @@ -31,7 +31,7 @@ } // namespace -// These tests leak mojo objects (like the IsolatedPrerenderURLLoader) because +// These tests leak mojo objects (like the PrefetchProxyURLLoader) because // they do not have valid mojo channels, which would normally delete the bound // objects on destruction. This is expected and cannot be easily fixed without // rewriting these as browsertests. The trade off for the speed and flexibility @@ -42,12 +42,12 @@ #define DISABLE_ASAN(x) x #endif -class TestIsolatedPrerenderURLLoaderInterceptor - : public IsolatedPrerenderURLLoaderInterceptor { +class TestPrefetchProxyURLLoaderInterceptor + : public PrefetchProxyURLLoaderInterceptor { public: - explicit TestIsolatedPrerenderURLLoaderInterceptor(int frame_tree_node_id) - : IsolatedPrerenderURLLoaderInterceptor(frame_tree_node_id) {} - ~TestIsolatedPrerenderURLLoaderInterceptor() override = default; + explicit TestPrefetchProxyURLLoaderInterceptor(int frame_tree_node_id) + : PrefetchProxyURLLoaderInterceptor(frame_tree_node_id) {} + ~TestPrefetchProxyURLLoaderInterceptor() override = default; void SetHasPrefetchedResponse(const GURL& url, bool has_prefetch) { expected_url_ = url; @@ -70,11 +70,11 @@ bool has_prefetch_ = false; }; -class IsolatedPrerenderURLLoaderInterceptorTest +class PrefetchProxyURLLoaderInterceptorTest : public ChromeRenderViewHostTestHarness { public: - IsolatedPrerenderURLLoaderInterceptorTest() = default; - ~IsolatedPrerenderURLLoaderInterceptorTest() override = default; + PrefetchProxyURLLoaderInterceptorTest() = default; + ~PrefetchProxyURLLoaderInterceptorTest() override = default; void TearDown() override { prerender::PrerenderManager* prerender_manager = @@ -118,9 +118,9 @@ base::OnceClosure waiting_for_callback_closure_; }; -TEST_F(IsolatedPrerenderURLLoaderInterceptorTest, DISABLE_ASAN(WantIntercept)) { - std::unique_ptr<TestIsolatedPrerenderURLLoaderInterceptor> interceptor = - std::make_unique<TestIsolatedPrerenderURLLoaderInterceptor>( +TEST_F(PrefetchProxyURLLoaderInterceptorTest, DISABLE_ASAN(WantIntercept)) { + std::unique_ptr<TestPrefetchProxyURLLoaderInterceptor> interceptor = + std::make_unique<TestPrefetchProxyURLLoaderInterceptor>( web_contents()->GetMainFrame()->GetFrameTreeNodeId()); interceptor->SetHasPrefetchedResponse(TestURL(), true); @@ -133,19 +133,18 @@ interceptor->MaybeCreateLoader( request, profile(), - base::BindOnce( - &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback, - base::Unretained(this))); + base::BindOnce(&PrefetchProxyURLLoaderInterceptorTest::HandlerCallback, + base::Unretained(this))); WaitForCallback(); EXPECT_TRUE(was_intercepted().has_value()); EXPECT_TRUE(was_intercepted().value()); } -TEST_F(IsolatedPrerenderURLLoaderInterceptorTest, +TEST_F(PrefetchProxyURLLoaderInterceptorTest, DISABLE_ASAN(DoNotWantIntercept)) { - std::unique_ptr<TestIsolatedPrerenderURLLoaderInterceptor> interceptor = - std::make_unique<TestIsolatedPrerenderURLLoaderInterceptor>( + std::unique_ptr<TestPrefetchProxyURLLoaderInterceptor> interceptor = + std::make_unique<TestPrefetchProxyURLLoaderInterceptor>( web_contents()->GetMainFrame()->GetFrameTreeNodeId()); interceptor->SetHasPrefetchedResponse(TestURL(), false); @@ -158,9 +157,8 @@ interceptor->MaybeCreateLoader( request, profile(), - base::BindOnce( - &IsolatedPrerenderURLLoaderInterceptorTest::HandlerCallback, - base::Unretained(this))); + base::BindOnce(&PrefetchProxyURLLoaderInterceptorTest::HandlerCallback, + base::Unretained(this))); WaitForCallback(); EXPECT_TRUE(was_intercepted().has_value());
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc index b7a2fa5..ca844e2 100644 --- a/chrome/browser/printing/print_view_manager.cc +++ b/chrome/browser/printing/print_view_manager.cc
@@ -188,7 +188,7 @@ return false; GetPrintRenderFrame(rfh)->OnPrintPreviewDialogClosed(); #if defined(OS_CHROMEOS) - policy::ShowDlpPrintDisabledToast(); + policy::ShowDlpPrintDisabledNotification(); #endif return true; } @@ -225,7 +225,7 @@ if (IsPrintingRestricted()) { #if defined(OS_CHROMEOS) - policy::ShowDlpPrintDisabledToast(); + policy::ShowDlpPrintDisabledNotification(); #endif return false; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js index ef16932..4a5789e 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.js
@@ -194,8 +194,10 @@ case SwitchAccessMenuAction.SETTINGS: chrome.accessibilityPrivate.openSettingsSubpage( 'manageAccessibility/switchAccess'); + return true; case SwitchAccessMenuAction.POINT_SCAN: - chrome.accessibilityPrivate.enablePointScan(true); + chrome.accessibilityPrivate.activatePointScan(); + ActionManager.exitCurrentMenu(); return true; default: return false;
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html index 8bddc4c..9060c76c 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.html
@@ -4,6 +4,7 @@ <include src="assistant_get_more.html"> <include src="assistant_loading.html"> +<include src="assistant_related_info.html"> <include src="assistant_third_party.html"> <include src="assistant_value_prop.html"> <include src="assistant_voice_match.html"> @@ -20,13 +21,15 @@ <link rel="stylesheet" href="assistant_value_prop.css"> <assistant-loading id="loading" hidden> </assistant-loading> - <assistant-value-prop id="value-prop" hidden> + <assistant-value-prop id="valueProp" hidden> </assistant-value-prop> - <assistant-third-party id="third-party" hidden> + <assistant-related-info id="relatedInfo" hidden> + </assistant-related-info> + <assistant-third-party id="thirdParty" hidden> </assistant-third-party> - <assistant-voice-match id="voice-match" hidden> + <assistant-voice-match id="voiceMatch" hidden> </assistant-voice-match> - <assistant-get-more id="get-more" hidden> + <assistant-get-more id="getMore" hidden> </assistant-get-more> </template> </dom-module>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js index b31f1fb..777d505 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_optin_flow.js
@@ -8,6 +8,7 @@ // <include src="browser_proxy.js"> // <include src="assistant_get_more.js"> // <include src="assistant_loading.js"> +// <include src="assistant_related_info.js"> // <include src="assistant_third_party.js"> // <include src="assistant_value_prop.js"> // <include src="assistant_voice_match.js"> @@ -70,18 +71,18 @@ this.boundOnScreenLoadingError = this.onScreenLoadingError.bind(this); this.boundOnScreenLoaded = this.onScreenLoaded.bind(this); - this.$['loading'].onBeforeShow(); - this.$['loading'].addEventListener('reload', this.onReload.bind(this)); + this.$.loading.onBeforeShow(); + this.$.loading.addEventListener('reload', this.onReload.bind(this)); switch (this.flowType) { case this.FlowType.SPEAKER_ID_ENROLLMENT: case this.FlowType.SPEAKER_ID_RETRAIN: - this.$['value-prop'].hidden = true; - this.$['voice-match'].isFirstScreen = true; - this.showScreen(this.$['voice-match']); + this.$.valueProp.hidden = true; + this.$.voiceMatch.isFirstScreen = true; + this.showScreen(this.$.voiceMatch); break; default: - this.showScreen(this.$['value-prop']); + this.showScreen(this.$.valueProp); } this.browserProxy_.initialized([this.flowType]); }, @@ -93,10 +94,13 @@ reloadContent(data) { this.voiceMatchEnforcedOff = data['voiceMatchEnforcedOff']; this.voiceMatchDisabled = loadTimeData.getBoolean('voiceMatchDisabled'); + this.betterAssistantEnabled = + loadTimeData.getBoolean('betterAssistantEnabled'); data['flowType'] = this.flowType; - this.$['value-prop'].reloadContent(data); - this.$['third-party'].reloadContent(data); - this.$['get-more'].reloadContent(data); + this.$.valueProp.reloadContent(data); + this.$.relatedInfo.reloadContent(data); + this.$.thirdParty.reloadContent(data); + this.$.getMore.reloadContent(data); }, /** @@ -107,13 +111,13 @@ addSettingZippy(type, data) { switch (type) { case 'settings': - this.$['value-prop'].addSettingZippy(data); + this.$.valueProp.addSettingZippy(data); break; case 'disclosure': - this.$['third-party'].addSettingZippy(data); + this.$.thirdParty.addSettingZippy(data); break; case 'get-more': - this.$['get-more'].addSettingZippy(data); + this.$.getMore.addSettingZippy(data); break; default: console.error('Undefined zippy data type: ' + type); @@ -125,26 +129,38 @@ */ showNextScreen() { switch (this.currentScreen) { - case this.$['value-prop']: - this.showScreen(this.$['third-party']); - break; - case this.$['third-party']: - if (this.voiceMatchEnforcedOff || this.voiceMatchDisabled) { - this.showScreen(this.$['get-more']); + case this.$.valueProp: + if (this.betterAssistantEnabled) { + this.showScreen(this.$.relatedInfo); } else { - this.showScreen(this.$['voice-match']); + this.showScreen(this.$.thirdParty); } break; - case this.$['voice-match']: - if (this.flowType == this.FlowType.SPEAKER_ID_ENROLLMENT || - this.flowType == this.FlowType.SPEAKER_ID_RETRAIN) { + case this.$.relatedInfo: + if (this.voiceMatchEnforcedOff || this.voiceMatchDisabled) { this.browserProxy_.flowFinished(); } else { - this.showScreen(this.$['get-more']); + this.showScreen(this.$.voiceMatch); } break; - case this.$['get-more']: - this.showScreen(this.$['ready']); + case this.$.thirdParty: + if (this.voiceMatchEnforcedOff || this.voiceMatchDisabled) { + this.showScreen(this.$.getMore); + } else { + this.showScreen(this.$.voiceMatch); + } + break; + case this.$.voiceMatch: + if (this.flowType == this.FlowType.SPEAKER_ID_ENROLLMENT || + this.flowType == this.FlowType.SPEAKER_ID_RETRAIN || + this.betterAssistantEnabled) { + this.browserProxy_.flowFinished(); + } else { + this.showScreen(this.$.getMore); + } + break; + case this.$.getMore: + this.browserProxy_.flowFinished(); break; default: console.error('Undefined'); @@ -157,18 +173,18 @@ * @param {string} state the voice match state. */ onVoiceMatchUpdate(state) { - if (!this.currentScreen == this.$['voice-match']) { + if (!this.currentScreen == this.$.voiceMatch) { return; } switch (state) { case 'listen': - this.$['voice-match'].listenForHotword(); + this.$.voiceMatch.listenForHotword(); break; case 'process': - this.$['voice-match'].processingHotword(); + this.$.voiceMatch.processingHotword(); break; case 'done': - this.$['voice-match'].voiceMatchDone(); + this.$.voiceMatch.voiceMatchDone(); break; case 'failure': this.onScreenLoadingError(); @@ -188,7 +204,7 @@ return; } - this.$['loading'].hidden = true; + this.$.loading.hidden = true; screen.hidden = false; screen.addEventListener('loading', this.boundShowLoadingScreen); screen.addEventListener('error', this.boundOnScreenLoadingError); @@ -211,18 +227,18 @@ * Show the loading screen. */ showLoadingScreen() { - this.$['loading'].hidden = false; + this.$.loading.hidden = false; this.currentScreen.hidden = true; - this.$['loading'].onShow(); + this.$.loading.onShow(); }, /** * Called when the screen failed to load. */ onScreenLoadingError() { - this.$['loading'].hidden = false; + this.$.loading.hidden = false; this.currentScreen.hidden = true; - this.$['loading'].onErrorOccurred(); + this.$.loading.onErrorOccurred(); }, /** @@ -230,8 +246,8 @@ */ onScreenLoaded() { this.currentScreen.hidden = false; - this.$['loading'].hidden = true; - this.$['loading'].onPageLoaded(); + this.$.loading.hidden = true; + this.$.loading.onPageLoaded(); }, /**
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html new file mode 100644 index 0000000..d94a6c5 --- /dev/null +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.html
@@ -0,0 +1,58 @@ +<!-- Copyright 2020 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. --> + +<dom-module id="assistant-related-info"> +<template> + <style include="oobe-dialog-host"> + oobe-dialog { + --oobe-dialog-content-padding-top: 48px; + } + + #image { + display: block; + height: 186px; + margin: auto; + } + + .vertical-line { + background-color: var(--google-grey-300); + height: 186px; + margin: 0 24px 0 24px; + width: 1px; + } + </style> + <link rel="stylesheet" href="assistant_shared_styles.css"> + <oobe-dialog id="related-info-dialog" role="dialog" has-buttons hide-shadow + title-key="[[titleKey]]" subtitle-key="[[contentKey]]" + aria-label$="[[i18nDynamic(locale, titleKey)]]"> + <img id="logo" slot="oobe-icon" src="assistant_logo.png" + aria-label$="[[i18nDynamic(locale, 'assistantLogo')]]"> + <div slot="footer" class="layout horizontal"> + <div id="image-container" class="flex"> + <img id="image" class="oobe-illustration" aria-hidden="true" + src="assistant_ready.svg"> + </div> + <div class="vertical-line"></div> + <div id="contents-container" class="flex"> + <setting-zippy id="zippy-context" hide-line popup-style> + <div id="title-context" slot="title" aria-hidden="true"> + [[i18nDynamic(locale, 'assistantScreenContextTitle')]] + </div> + <div id="description-context" slot="content" aria-hidden="true"> + [[i18nDynamic(locale, 'assistantScreenContextDesc')]] + </div> + </setting-zippy> + </div> + </div> + <div slot="bottom-buttons" class="layout horizontal end-justified"> + <oobe-text-button id="skip-button" disabled="[[loading]]" + text-key="assistantOptinNoThanksButton" on-click="onSkipTap_"> + </oobe-text-button> + <oobe-text-button id="next-button" inverse disabled="[[loading]]" + text-key="assistantOptinAgreeButton" on-click="onNextTap_"> + </oobe-text-button> + </div> + </oobe-dialog> +</template> +</dom-module>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js new file mode 100644 index 0000000..3a8a75b --- /dev/null +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js
@@ -0,0 +1,146 @@ +// Copyright 2020 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. + +/** + * @fileoverview Polymer element for displaying material design assistant + * related info screen. + * + * Event 'loading' will be fired when the page is loading/reloading. + * Event 'loaded' will be fired when the page has been successfully loaded. + */ + +/** + * Name of the screen. + * @type {string} + */ +const RELATED_INFO_SCREEN_ID = 'RelatedInfoScreen'; + +Polymer({ + is: 'assistant-related-info', + + behaviors: [OobeI18nBehavior, OobeDialogHostBehavior], + + properties: { + /** + * Whether page content is loading. + */ + loading: { + type: Boolean, + value: true, + }, + + /** + * Title key of the screen. + */ + titleKey: { + type: String, + value: 'assistantRelatedInfoTitle', + }, + + /** + * Content key of the screen. + */ + contentKey: { + type: String, + value: 'assistantRelatedInfoMessage', + }, + }, + + /** + * Whether all the consent text strings has been successfully loaded. + * @type {boolean} + * @private + */ + consentStringLoaded_: false, + + /** + * Whether the screen has been shown to the user. + * @type {boolean} + * @private + */ + screenShown_: false, + + /** @private {?assistant.BrowserProxy} */ + browserProxy_: null, + + /** + * On-tap event handler for next button. + * + * @private + */ + onNextTap_() { + if (this.loading) { + return; + } + this.loading = true; + this.browserProxy_.userActed(RELATED_INFO_SCREEN_ID, ['next-pressed']); + }, + + /** + * On-tap event handler for skip button. + * + * @private + */ + onSkipTap_() { + if (this.loading) { + return; + } + this.loading = true; + this.browserProxy_.userActed(RELATED_INFO_SCREEN_ID, ['skip-pressed']); + }, + + /** @override */ + created() { + this.browserProxy_ = assistant.BrowserProxyImpl.getInstance(); + }, + + /** + * Reloads the page. + */ + reloadPage() { + this.fire('loading'); + this.loading = true; + }, + + /** + * Reload the page with the given consent string text data. + */ + reloadContent(data) { + this.titleKey = data['activityControlNeeded'] ? + 'assistantRelatedInfoTitle' : + 'assistantRelatedInfoReturnedUserTitle'; + this.contentKey = data['activityControlNeeded'] ? + 'assistantRelatedInfoMessage' : + 'assistantRelatedInfoReturnedUserMessage'; + this.consentStringLoaded_ = true; + this.onPageLoaded(); + }, + + /** + * Handles event when all the page content has been loaded. + */ + onPageLoaded() { + this.fire('loaded'); + this.loading = false; + this.$['next-button'].focus(); + if (!this.hidden && !this.screenShown_) { + this.browserProxy_.screenShown(RELATED_INFO_SCREEN_ID); + this.screenShown_ = true; + } + }, + + /** + * Signal from host to show the screen. + */ + onShow() { + if (!this.consentStringLoaded_) { + this.reloadPage(); + } else { + Polymer.RenderStatus.afterNextRender( + this, () => this.$['next-button'].focus()); + this.browserProxy_.screenShown(RELATED_INFO_SCREEN_ID); + this.screenShown_ = true; + } + }, +});
diff --git a/chrome/browser/resources/settings/chromeos/ambient_mode_page/album_item.html b/chrome/browser/resources/settings/chromeos/ambient_mode_page/album_item.html index 64d9c66..18b8a3f 100644 --- a/chrome/browser/resources/settings/chromeos/ambient_mode_page/album_item.html +++ b/chrome/browser/resources/settings/chromeos/ambient_mode_page/album_item.html
@@ -28,7 +28,7 @@ #imageContainer { background-color: rgba(var(--google-blue-50-rgb), .8); - border-radius: 4px; + border-radius: 8px; display: block; margin: 0 12px; position: relative; @@ -49,7 +49,7 @@ } #image { - border-radius: 4px; + border-radius: 8px; display: block; height: 160px; object-fit: cover; @@ -66,6 +66,44 @@ width: 256px; } + #rhImages { + border-radius: 8px; + display: block; + height: 160px; + position: absolute; + transform: scale(1.0); + transition: transform 240ms; + width: 160px; + } + + .image-rh { + border-radius: 8px; + display: block; + height: 78px; + position: absolute; + width: 78px; + } + + .top-left { + left: 0; + top: 0; + } + + .top-right { + left: 82px; + top: 0; + } + + .bottom-left { + left: 0; + top: 82px; + } + + .bottom-right { + left: 82px; + top: 82px; + } + .check { display: block; position: absolute; @@ -83,9 +121,7 @@ } :host([checked]) #image { - border-radius: 6px; box-shadow: 0 4px 8px rgba(32, 33, 36, 0.17); - transform: scale(0.9); transition: transform 240ms; } @@ -96,13 +132,41 @@ :host([checked]) #image.art-album { transform: scale(0.875); } + + :host([checked]) #rhImages { + transform: scale(0.8); + } </style> <div id="albumContainer" class$="layout vertical left flex [[computeClass_(topicSource)]]"> <div id="imageContainer" class$="[[computeClass_(topicSource)]]" aria-hidden="true"> - <!-- Only shows the image and icon when the URL is successfully + <!-- Only shows the images and icon when the URLs are successfully fetched --> + <template is="dom-if" if="[[album.recentHighlightsUrls]]"> + <div id="rhImages" actionable on-click="onImageClick_"> + <img class="image-rh top-left" + src="[[album.recentHighlightsUrls.0]]" + hidden="[[!album.recentHighlightsUrls.0]]"> + </img> + <img class="image-rh top-right" + src="[[album.recentHighlightsUrls.1]]" + hidden="[[!album.recentHighlightsUrls.1]]"> + </img> + <img class="image-rh bottom-left" + src="[[album.recentHighlightsUrls.2]]" + hidden="[[!album.recentHighlightsUrls.2]]"> + </img> + <img class="image-rh bottom-right" + src="[[album.recentHighlightsUrls.3]]" + hidden="[[!album.recentHighlightsUrls.3]]"> + </img> + </div> + <iron-icon icon="os-settings:ic-checked-filled" + class$="check [[computeClass_(topicSource)]]" + hidden="[[!album.checked]]"> + </iron-icon> + </template> <template is="dom-if" if="[[album.url]]"> <img id="image" class$="[[computeClass_(topicSource)]]" actionable src="[[album.url]]" on-click="onImageClick_">
diff --git a/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_photos_page.js b/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_photos_page.js index 85d173c..c88d9c3 100644 --- a/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_photos_page.js +++ b/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_photos_page.js
@@ -115,7 +115,13 @@ for (let i = 0; i < this.albums.length; ++i) { if (this.albums[i].albumId === album.albumId) { - this.set('albums.' + i + '.url', album.url); + if (album.url) { + this.set('albums.' + i + '.url', album.url); + continue; + } + this.set( + 'albums.' + i + '.recentHighlightsUrls', + album.recentHighlightsUrls); } } },
diff --git a/chrome/browser/resources/settings/chromeos/ambient_mode_page/constants.js b/chrome/browser/resources/settings/chromeos/ambient_mode_page/constants.js index 08a756c..a9e207a 100644 --- a/chrome/browser/resources/settings/chromeos/ambient_mode_page/constants.js +++ b/chrome/browser/resources/settings/chromeos/ambient_mode_page/constants.js
@@ -40,6 +40,7 @@ * description: string, * title: string, * url: string, + * recentHighlightsUrls: Array<string>, * }} */ /* #export */ let AmbientModeAlbum;
diff --git a/chrome/browser/safe_browsing/mock_report_sender.cc b/chrome/browser/safe_browsing/mock_report_sender.cc new file mode 100644 index 0000000..2aace2f2 --- /dev/null +++ b/chrome/browser/safe_browsing/mock_report_sender.cc
@@ -0,0 +1,75 @@ +// Copyright 2016 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/mock_report_sender.h" + +#include "base/bind.h" +#include "base/run_loop.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" + +namespace safe_browsing { + +MockReportSender::MockReportSender() + : net::ReportSender(nullptr, TRAFFIC_ANNOTATION_FOR_TESTS), + number_of_reports_(0) { + DCHECK(quit_closure_.is_null()); +} + +MockReportSender::~MockReportSender() {} + +void MockReportSender::Send( + const GURL& report_uri, + base::StringPiece content_type, + base::StringPiece report, + base::OnceCallback<void()> success_callback, + base::OnceCallback<void(const GURL&, int, int)> error_callback) { + latest_report_uri_ = report_uri; + latest_report_.assign(report.data(), report.size()); + latest_content_type_.assign(content_type.data(), content_type.size()); + number_of_reports_++; + + // BrowserThreads aren't initialized in the unittest, so don't post tasks + // to them. + if (!content::BrowserThread::IsThreadInitialized(content::BrowserThread::UI)) + return; + + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&MockReportSender::NotifyReportSentOnUIThread, + base::Unretained(this))); +} + +void MockReportSender::WaitForReportSent() { + base::RunLoop run_loop; + quit_closure_ = run_loop.QuitClosure(); + run_loop.Run(); +} + +void MockReportSender::NotifyReportSentOnUIThread() { + if (!quit_closure_.is_null()) { + quit_closure_.Run(); + quit_closure_.Reset(); + } +} + +const GURL& MockReportSender::latest_report_uri() { + return latest_report_uri_; +} + +const std::string& MockReportSender::latest_report() { + return latest_report_; +} + +const std::string& MockReportSender::latest_content_type() { + return latest_content_type_; +} + +int MockReportSender::GetAndResetNumberOfReportsSent() { + int new_reports = number_of_reports_; + number_of_reports_ = 0; + return new_reports; +} + +} // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/mock_report_sender.h b/chrome/browser/safe_browsing/mock_report_sender.h new file mode 100644 index 0000000..f604958 --- /dev/null +++ b/chrome/browser/safe_browsing/mock_report_sender.h
@@ -0,0 +1,51 @@ +// Copyright 2016 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_MOCK_REPORT_SENDER_H_ +#define CHROME_BROWSER_SAFE_BROWSING_MOCK_REPORT_SENDER_H_ + +#include "net/url_request/report_sender.h" + +namespace safe_browsing { + +// A mock ReportSender that keeps track of the last report sent and the number +// of reports sent. +class MockReportSender : public net::ReportSender { + public: + MockReportSender(); + + ~MockReportSender() override; + + void Send( + const GURL& report_uri, + base::StringPiece content_type, + base::StringPiece report, + base::OnceCallback<void()> success_callback, + base::OnceCallback<void(const GURL&, int, int)> error_callback) override; + + const GURL& latest_report_uri(); + + const std::string& latest_report(); + + const std::string& latest_content_type(); + + int GetAndResetNumberOfReportsSent(); + + void WaitForReportSent(); + + private: + GURL latest_report_uri_; + std::string latest_report_; + std::string latest_content_type_; + int number_of_reports_; + base::Closure quit_closure_; + + void NotifyReportSentOnUIThread(); + + DISALLOW_COPY_AND_ASSIGN(MockReportSender); +}; + +} // namespace safe_browsing + +#endif // CHROME_BROWSER_SAFE_BROWSING_MOCK_REPORT_SENDER_H_
diff --git a/chrome/browser/search/background/ntp_background_service_factory.cc b/chrome/browser/search/background/ntp_background_service_factory.cc index 7cc8686..f136176e 100644 --- a/chrome/browser/search/background/ntp_background_service_factory.cc +++ b/chrome/browser/search/background/ntp_background_service_factory.cc
@@ -12,8 +12,8 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/background/ntp_background_service.h" +#include "chrome/browser/search/ntp_features.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "components/search/ntp_features.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h"
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc index 96dee7a..de4385bb 100644 --- a/chrome/browser/search/instant_service.cc +++ b/chrome/browser/search/instant_service.cc
@@ -29,6 +29,7 @@ #include "chrome/browser/search/instant_service_observer.h" #include "chrome/browser/search/local_ntp_source.h" #include "chrome/browser/search/most_visited_iframe_source.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/ntp_icon_source.h" #include "chrome/browser/search/search.h" #include "chrome/browser/search_engines/template_url_service_factory.h" @@ -47,7 +48,6 @@ #include "components/ntp_tiles/constants.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/search/search_provider_observer.h" #include "components/sync_preferences/pref_service_syncable.h" #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc index 422034d..10a5c79 100644 --- a/chrome/browser/search/instant_service_unittest.cc +++ b/chrome/browser/search/instant_service_unittest.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/search/background/ntp_background_service.h" #include "chrome/browser/search/instant_service_observer.h" #include "chrome/browser/search/instant_unittest_base.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" @@ -24,7 +25,6 @@ #include "components/ntp_tiles/features.h" #include "components/ntp_tiles/ntp_tile.h" #include "components/ntp_tiles/section_type.h" -#include "components/search/ntp_features.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/search/local_ntp_navigation_browsertest.cc b/chrome/browser/search/local_ntp_navigation_browsertest.cc index 84e42ad..4619ca6 100644 --- a/chrome/browser/search/local_ntp_navigation_browsertest.cc +++ b/chrome/browser/search/local_ntp_navigation_browsertest.cc
@@ -4,13 +4,13 @@ #include "base/feature_list.h" #include "base/strings/strcat.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/common/url_constants.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "components/search/ntp_features.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc index 845a8cf..7dca2792 100644 --- a/chrome/browser/search/local_ntp_source.cc +++ b/chrome/browser/search/local_ntp_source.cc
@@ -31,6 +31,7 @@ #include "chrome/browser/search/background/ntp_background_service_factory.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/local_ntp_js_integrity.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/one_google_bar/one_google_bar_data.h" #include "chrome/browser/search/one_google_bar/one_google_bar_service_factory.h" #include "chrome/browser/search/promos/promo_data.h" @@ -55,7 +56,6 @@ #include "components/omnibox/common/omnibox_features.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/search/search.h" #include "components/search_engines/search_terms_data.h" #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/search/most_visited_iframe_source.cc b/chrome/browser/search/most_visited_iframe_source.cc index 4a05a8b..7aa5ccb 100644 --- a/chrome/browser/search/most_visited_iframe_source.cc +++ b/chrome/browser/search/most_visited_iframe_source.cc
@@ -9,9 +9,9 @@ #include "base/strings/string_util.h" #include "build/build_config.h" #include "chrome/browser/search/instant_service.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/common/url_constants.h" #include "chrome/grit/local_ntp_resources.h" -#include "components/search/ntp_features.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" #include "ui/base/resource/resource_bundle.h"
diff --git a/components/search/ntp_features.cc b/chrome/browser/search/ntp_features.cc similarity index 98% rename from components/search/ntp_features.cc rename to chrome/browser/search/ntp_features.cc index 5e12251..2a95996 100644 --- a/components/search/ntp_features.cc +++ b/chrome/browser/search/ntp_features.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/search/ntp_features.h" +#include "chrome/browser/search/ntp_features.h" #include "base/feature_list.h" #include "base/strings/string_number_conversions.h"
diff --git a/components/search/ntp_features.h b/chrome/browser/search/ntp_features.h similarity index 94% rename from components/search/ntp_features.h rename to chrome/browser/search/ntp_features.h index 9ca7645..553f1c60 100644 --- a/components/search/ntp_features.h +++ b/chrome/browser/search/ntp_features.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 COMPONENTS_SEARCH_NTP_FEATURES_H_ -#define COMPONENTS_SEARCH_NTP_FEATURES_H_ +#ifndef CHROME_BROWSER_SEARCH_NTP_FEATURES_H_ +#define CHROME_BROWSER_SEARCH_NTP_FEATURES_H_ #include "base/feature_list.h" @@ -56,4 +56,4 @@ } // namespace ntp_features -#endif // COMPONENTS_SEARCH_NTP_FEATURES_H_ +#endif // CHROME_BROWSER_SEARCH_NTP_FEATURES_H_
diff --git a/chrome/browser/search/ntp_features_unittest.cc b/chrome/browser/search/ntp_features_unittest.cc index 351e66df..56b2379 100644 --- a/chrome/browser/search/ntp_features_unittest.cc +++ b/chrome/browser/search/ntp_features_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/search/ntp_features.h" +#include "chrome/browser/search/ntp_features.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h"
diff --git a/chrome/browser/search/promos/promo_service.cc b/chrome/browser/search/promos/promo_service.cc index e6c464a3..317c487 100644 --- a/chrome/browser/search/promos/promo_service.cc +++ b/chrome/browser/search/promos/promo_service.cc
@@ -17,13 +17,13 @@ #include "base/values.h" #include "chrome/browser/extensions/extension_checkup.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/common/pref_names.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" -#include "components/search/ntp_features.h" #include "content/public/browser/system_connector.h" #include "extensions/common/extension_features.h" #include "net/base/load_flags.h"
diff --git a/chrome/browser/search/promos/promo_service_unittest.cc b/chrome/browser/search/promos/promo_service_unittest.cc index 3d6e9f3..8008b22 100644 --- a/chrome/browser/search/promos/promo_service_unittest.cc +++ b/chrome/browser/search/promos/promo_service_unittest.cc
@@ -13,13 +13,13 @@ #include "base/test/task_environment.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/test_extension_system.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/promos/promo_data.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/testing_profile.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" -#include "components/search/ntp_features.h" #include "components/signin/public/identity_manager/identity_test_environment.h" #include "content/public/test/browser_task_environment.h" #include "extensions/common/extension.h"
diff --git a/chrome/browser/search/search.cc b/chrome/browser/search/search.cc index 8b94562f..6470261 100644 --- a/chrome/browser/search/search.cc +++ b/chrome/browser/search/search.cc
@@ -11,12 +11,12 @@ #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/search_engines/ui_thread_search_terms_data.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "components/google/core/common/google_util.h" -#include "components/search/ntp_features.h" #include "components/search/search.h" #include "components/search_engines/search_engine_type.h" #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/search/search_suggest/search_suggest_service.cc b/chrome/browser/search/search_suggest/search_suggest_service.cc index 8bdec16..f25849b4 100644 --- a/chrome/browser/search/search_suggest/search_suggest_service.cc +++ b/chrome/browser/search/search_suggest/search_suggest_service.cc
@@ -12,13 +12,13 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/browser/search/search_suggest/search_suggest_loader.h" #include "chrome/common/pref_names.h" #include "components/omnibox/browser/omnibox_field_trial.h" #include "components/omnibox/common/omnibox_features.h" #include "components/prefs/scoped_user_pref_update.h" -#include "components/search/ntp_features.h" #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "third_party/re2/src/re2/re2.h"
diff --git a/chrome/browser/search/search_suggest/search_suggest_service_factory.cc b/chrome/browser/search/search_suggest/search_suggest_service_factory.cc index d5159f2..080e40a 100644 --- a/chrome/browser/search/search_suggest/search_suggest_service_factory.cc +++ b/chrome/browser/search/search_suggest/search_suggest_service_factory.cc
@@ -12,12 +12,12 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search_suggest/search_suggest_loader_impl.h" #include "chrome/browser/search/search_suggest/search_suggest_service.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "components/search/ntp_features.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h"
diff --git a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc index a79af5b7..c474898 100644 --- a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc +++ b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
@@ -12,6 +12,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search_suggest/search_suggest_data.h" #include "chrome/browser/search/search_suggest/search_suggest_loader.h" #include "chrome/browser/search_engines/template_url_service_factory.h" @@ -19,7 +20,6 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/search_test_utils.h" #include "components/omnibox/common/omnibox_features.h" -#include "components/search/ntp_features.h" #include "components/search_engines/template_url_service.h" #include "components/signin/public/base/test_signin_client.h" #include "components/signin/public/identity_manager/identity_test_environment.h"
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java index 25598fd..3ff8b0a5 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java
@@ -44,142 +44,132 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Set; /** * Provides {@code PropertyModel}s of Chrome-provided sharing options. */ class ChromeProvidedSharingOptionsProvider { - private Activity mActivity; + private final Activity mActivity; private final Supplier<Tab> mTabProvider; private final BottomSheetController mBottomSheetController; private final ShareSheetBottomSheetContent mBottomSheetContent; - private ShareParams mShareParams; - private ChromeShareExtras mChromeShareExtras; - private Callback<Tab> mPrintTabCallback; - private SettingsLauncher mSettingsLauncher; - private boolean mIsSyncEnabled; - private long mShareStartTime; - private ChromeOptionShareCallback mChromeOptionShareCallback; + private final ShareParams mShareParams; + private final Callback<Tab> mPrintTabCallback; + private final SettingsLauncher mSettingsLauncher; + private final boolean mIsSyncEnabled; + private final long mShareStartTime; + private final List<FirstPartyOption> mOrderedFirstPartyOptions; + private final ChromeOptionShareCallback mChromeOptionShareCallback; private ScreenshotCoordinator mScreenshotCoordinator; - private String mUrl; - private boolean mIsMultiWindow; - private Collection<Integer> mContentTypes; + private final String mUrl; /** * Constructs a new {@link ChromeProvidedSharingOptionsProvider}. * + * @param activity The current {@link Activity}. * @param tabProvider Supplier for the current activity tab. * @param bottomSheetController The {@link BottomSheetController} for the current activity. - * @param bottomSheetContent The {@link ShareSheetBottomSheetContent} for the current activity. - + * @param bottomSheetContent The {@link ShareSheetBottomSheetContent} for the current + * activity. + * @param shareParams The {@link ShareParams} for the current share. + * @param chromeShareExtras The {@link ChromeShareExtras} for the current share. + * @param printTab A {@link Callback} that will print a given Tab. + * @param shareStartTime The start time of the current share. + * @param chromeOptionShareCallback A ChromeOptionShareCallback that can be used by + * Chrome-provided sharing options. */ - ChromeProvidedSharingOptionsProvider(Supplier<Tab> tabProvider, + ChromeProvidedSharingOptionsProvider(Activity activity, Supplier<Tab> tabProvider, BottomSheetController bottomSheetController, - ShareSheetBottomSheetContent bottomSheetContent) { + ShareSheetBottomSheetContent bottomSheetContent, ShareParams shareParams, + ChromeShareExtras chromeShareExtras, Callback<Tab> printTab, + SettingsLauncher settingsLauncher, boolean isSyncEnabled, long shareStartTime, + ChromeOptionShareCallback chromeOptionShareCallback) { + mActivity = activity; mTabProvider = tabProvider; mBottomSheetController = bottomSheetController; mBottomSheetContent = bottomSheetContent; - } - - /** - * Sets params related to the share itself. - * - * @param shareParams The {@link ShareParams} for the current share. - * @param chromeShareExtras The {@link ChromeShareExtras} for the current share. - * @param shareStartTime The start time of the current share. - * @param chromeOptionShareCallback A ChromeOptionShareCallback that can be used by - * Chrome-provided sharing options. - * @param contentTypes The contentTypes the share is comprised of. - */ - void setShareRelatedParams(ShareParams shareParams, ChromeShareExtras chromeShareExtras, - long shareStartTime, ChromeOptionShareCallback chromeOptionShareCallback, - Collection<Integer> contentTypes) { mShareParams = shareParams; - mShareStartTime = shareStartTime; - mChromeShareExtras = chromeShareExtras; - mActivity = mShareParams.getWindow().getActivity().get(); - mChromeOptionShareCallback = chromeOptionShareCallback; - mContentTypes = contentTypes; - } - - /** - * Set params needed by the individual sharing features. - * - * @param printTab A {@link Callback} that will print a given Tab. - * @param settingsLauncher Launches Chrome settings. - * @param isSyncEnabled Whether the user has enabled sync. - */ - void setFeatureSpecificParams( - Callback<Tab> printTab, SettingsLauncher settingsLauncher, boolean isSyncEnabled) { mPrintTabCallback = printTab; mSettingsLauncher = settingsLauncher; mIsSyncEnabled = isSyncEnabled; - } - - /** - * Set whether Chrome is in multiWindow mode. - */ - void setIsMultiWindow(boolean isMultiWindow) { - mIsMultiWindow = isMultiWindow; - } - - /** - * Calculates the property models to display for the Share. - * - * <p>New share features should add a call to this function. The order of the functions - * determine the order in which they appear in the share sheet. Each feature is gated on the - * supported {@link ContentType}(s). - * - * @return the set of ChromeProvidedSharingOptions for the share. - */ - List<PropertyModel> calculatePropertyModels() { - mUrl = getUrlToShare(mShareParams, mChromeShareExtras, + mShareStartTime = shareStartTime; + mOrderedFirstPartyOptions = new ArrayList<>(); + initializeFirstPartyOptionsInOrder(); + mChromeOptionShareCallback = chromeOptionShareCallback; + mUrl = getUrlToShare(shareParams, chromeShareExtras, mTabProvider.get().isInitialized() ? mTabProvider.get().getUrl().getSpec() : ""); - - List<PropertyModel> propertyModels = new ArrayList<>(); - - if (mContentTypes == null || mContentTypes.isEmpty()) { - return propertyModels; - } - - maybeAddScreenshotOption(propertyModels); - - maybeAddCopyLinkOption(propertyModels); - maybeCopyImageOption(propertyModels); - maybeAddCopyTextAndLinkOption(propertyModels); - maybeAddCopyTextOption(propertyModels); - - maybeAddSendTabToSelfOption(propertyModels); - maybeAddHighlightsOption(propertyModels); - maybeAddQrCodeOption(propertyModels); - maybeAddPrintingOption(propertyModels); - return propertyModels; } - private class PropertyModelBuilder { + /** + * Encapsulates a {@link PropertyModel} and the {@link ContentType}s it should be shown for. + */ + private static class FirstPartyOption { + final Collection<Integer> mContentTypes; + final Collection<Integer> mContentTypesToDisableFor; + final PropertyModel mPropertyModel; + final boolean mDisableForMultiWindow; + + /** + * Should only be used when the default property model constructed in the builder does not + * fit the feature's needs. This should be rare. + * + * @param model Property model for the first party option. + * @param contentTypes Content types to trigger for. + * @param contentTypesToDisableFor Content types to disable for. + * @param disableForMultiWindow If the feature should be disabled if in multi-window mode. + */ + FirstPartyOption(PropertyModel model, Collection<Integer> contentTypes, + Collection<Integer> contentTypesToDisableFor, boolean disableForMultiWindow) { + mPropertyModel = model; + mContentTypes = contentTypes; + mContentTypesToDisableFor = contentTypesToDisableFor; + mDisableForMultiWindow = disableForMultiWindow; + } + } + + private class FirstPartyOptionBuilder { private int mIcon; private int mIconLabel; private String mFeatureNameForMetrics; private Callback<View> mOnClickCallback; + private boolean mDisableForMultiWindow; + private Integer[] mContentTypesToDisableFor; + private final Integer[] mContentTypesInBuilder; - PropertyModelBuilder setIcon(int icon, int iconLabel) { + FirstPartyOptionBuilder(Integer... contentTypes) { + mContentTypesInBuilder = contentTypes; + mContentTypesToDisableFor = new Integer[] {}; + } + + FirstPartyOptionBuilder setIcon(int icon, int iconLabel) { mIcon = icon; mIconLabel = iconLabel; return this; } - PropertyModelBuilder setFeatureNameForMetrics(String featureName) { + FirstPartyOptionBuilder setFeatureNameForMetrics(String featureName) { mFeatureNameForMetrics = featureName; return this; } - PropertyModelBuilder setOnClickCallback(Callback<View> onClickCallback) { + FirstPartyOptionBuilder setOnClickCallback(Callback<View> onClickCallback) { mOnClickCallback = onClickCallback; return this; } - PropertyModel build() { - return ShareSheetPropertyModelBuilder.createPropertyModel( + FirstPartyOptionBuilder setContentTypesToDisableFor(Integer... contentTypesToDisableFor) { + mContentTypesToDisableFor = contentTypesToDisableFor; + return this; + } + + FirstPartyOptionBuilder setDisableForMultiWindow(boolean disableForMultiWindow) { + mDisableForMultiWindow = disableForMultiWindow; + return this; + } + + FirstPartyOption build() { + PropertyModel model = ShareSheetPropertyModelBuilder.createPropertyModel( AppCompatResources.getDrawable(mActivity, mIcon), mActivity.getResources().getString(mIconLabel), (view) -> { RecordUserAction.record(mFeatureNameForMetrics); @@ -187,6 +177,57 @@ mBottomSheetController.hideContent(mBottomSheetContent, true); mOnClickCallback.onResult(view); }); + return new FirstPartyOption(model, Arrays.asList(mContentTypesInBuilder), + Arrays.asList(mContentTypesToDisableFor), mDisableForMultiWindow); + } + } + + /** + * Returns an ordered list of {@link PropertyModel}s that should be shown given the {@code + * contentTypes} being shared. + * + * @param contentTypes a {@link Set} of {@link ContentType}. + * @param isMultiWindow if in multi-window mode. + * @return a list of {@link PropertyModel}s. + */ + List<PropertyModel> getPropertyModels(Set<Integer> contentTypes, boolean isMultiWindow) { + List<PropertyModel> propertyModels = new ArrayList<>(); + for (FirstPartyOption firstPartyOption : mOrderedFirstPartyOptions) { + if (!Collections.disjoint(contentTypes, firstPartyOption.mContentTypes) + && Collections.disjoint( + contentTypes, firstPartyOption.mContentTypesToDisableFor) + && !(isMultiWindow && firstPartyOption.mDisableForMultiWindow)) { + propertyModels.add(firstPartyOption.mPropertyModel); + } + } + return propertyModels; + } + + /** + * Creates all enabled {@link FirstPartyOption}s and adds them to {@code + * mOrderedFirstPartyOptions} in the order they should appear. + */ + private void initializeFirstPartyOptionsInOrder() { + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARE_SCREENSHOT)) { + mOrderedFirstPartyOptions.add(createScreenshotFirstPartyOption()); + } + mOrderedFirstPartyOptions.add(createCopyLinkFirstPartyOption()); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15)) { + mOrderedFirstPartyOptions.add(createCopyImageFirstPartyOption()); + mOrderedFirstPartyOptions.add(createCopyFirstPartyOption()); + mOrderedFirstPartyOptions.add(createCopyTextFirstPartyOption()); + } + mOrderedFirstPartyOptions.add(createSendTabToSelfFirstPartyOption()); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15) + && ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID)) { + mOrderedFirstPartyOptions.add(createHighlightsFirstPartyOption()); + } + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARE_QRCODE) + && !mTabProvider.get().getWebContents().isIncognito()) { + mOrderedFirstPartyOptions.add(createQrCodeFirstPartyOption()); + } + if (UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(Pref.PRINTING_ENABLED)) { + mOrderedFirstPartyOptions.add(createPrintingFirstPartyOption()); } } @@ -206,18 +247,8 @@ } }; - private void maybeAddScreenshotOption(List<PropertyModel> propertyModels) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARE_SCREENSHOT) - || mIsMultiWindow) { - return; - } - if (Collections.disjoint(mContentTypes, - Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.TEXT, - ContentType.HIGHLIGHTED_TEXT, ContentType.IMAGE))) { - return; - } - - propertyModels.add(ShareSheetPropertyModelBuilder.createPropertyModel( + private FirstPartyOption createScreenshotFirstPartyOption() { + PropertyModel propertyModel = ShareSheetPropertyModelBuilder.createPropertyModel( AppCompatResources.getDrawable(mActivity, R.drawable.screenshot), mActivity.getResources().getString(R.string.sharing_screenshot), (view) -> { RecordUserAction.record("SharingHubAndroid.ScreenshotSelected"); @@ -228,181 +259,127 @@ // observer will then remove itself. mBottomSheetController.addObserver(mSheetObserver); mBottomSheetController.hideContent(mBottomSheetContent, true); - })); + }); + return new FirstPartyOption(propertyModel, + Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.TEXT, + ContentType.HIGHLIGHTED_TEXT, ContentType.IMAGE), + /*contentTypesToDisableFor=*/Collections.emptySet(), + /*disableForMultiWindow=*/true); } - private void maybeAddCopyLinkOption(List<PropertyModel> propertyModels) { - if (mContentTypes.contains(ContentType.LINK_AND_TEXT) - || Collections.disjoint(mContentTypes, - Arrays.asList(ContentType.LINK_PAGE_VISIBLE, - ContentType.LINK_PAGE_NOT_VISIBLE))) { - return; - } - - propertyModels.add( - new PropertyModelBuilder() - .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy_url) - .setFeatureNameForMetrics("SharingHubAndroid.CopyURLSelected") - .setOnClickCallback((view) -> { - ClipboardManager clipboard = - (ClipboardManager) mActivity.getSystemService( - Context.CLIPBOARD_SERVICE); - clipboard.setPrimaryClip(ClipData.newPlainText( - mShareParams.getTitle(), mShareParams.getUrl())); - Toast.makeText(mActivity, R.string.link_copied, Toast.LENGTH_SHORT) - .show(); - }) - .build()); + private FirstPartyOption createCopyLinkFirstPartyOption() { + return new FirstPartyOptionBuilder( + ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE) + .setContentTypesToDisableFor(ContentType.LINK_AND_TEXT) + .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy_url) + .setFeatureNameForMetrics("SharingHubAndroid.CopyURLSelected") + .setOnClickCallback((view) -> { + ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService( + Context.CLIPBOARD_SERVICE); + clipboard.setPrimaryClip( + ClipData.newPlainText(mShareParams.getTitle(), mShareParams.getUrl())); + Toast.makeText(mActivity, R.string.link_copied, Toast.LENGTH_SHORT).show(); + }) + .build(); } - private void maybeCopyImageOption(List<PropertyModel> propertyModels) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15) - || !mContentTypes.contains(ContentType.IMAGE)) { - return; - } - propertyModels.add( - new PropertyModelBuilder() - .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy_image) - .setFeatureNameForMetrics("SharingHubAndroid.CopyImageSelected") - .setOnClickCallback((view) -> { - if (!mShareParams.getFileUris().isEmpty()) { - Clipboard.getInstance().setImageUri( - mShareParams.getFileUris().get(0)); - Toast.makeText(mActivity, R.string.image_copied, Toast.LENGTH_SHORT) - .show(); - } - }) - .build()); + private FirstPartyOption createCopyImageFirstPartyOption() { + return new FirstPartyOptionBuilder(ContentType.IMAGE) + .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy_image) + .setFeatureNameForMetrics("SharingHubAndroid.CopyImageSelected") + .setOnClickCallback((view) -> { + if (!mShareParams.getFileUris().isEmpty()) { + Clipboard.getInstance().setImageUri(mShareParams.getFileUris().get(0)); + Toast.makeText(mActivity, R.string.image_copied, Toast.LENGTH_SHORT).show(); + } + }) + .build(); } - private void maybeAddCopyTextAndLinkOption(List<PropertyModel> propertyModels) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15) - || !mContentTypes.contains(ContentType.LINK_AND_TEXT)) { - return; - } - propertyModels.add( - new PropertyModelBuilder() - .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy) - .setFeatureNameForMetrics("SharingHubAndroid.CopySelected") - .setOnClickCallback((view) -> { - ClipboardManager clipboard = - (ClipboardManager) mActivity.getSystemService( - Context.CLIPBOARD_SERVICE); - clipboard.setPrimaryClip(ClipData.newPlainText( - mShareParams.getTitle(), mShareParams.getTextAndUrl())); - Toast.makeText(mActivity, R.string.sharing_copied, Toast.LENGTH_SHORT) - .show(); - }) - .build()); + private FirstPartyOption createCopyFirstPartyOption() { + return new FirstPartyOptionBuilder(ContentType.LINK_AND_TEXT) + .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy) + .setFeatureNameForMetrics("SharingHubAndroid.CopySelected") + .setOnClickCallback((view) -> { + ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService( + Context.CLIPBOARD_SERVICE); + clipboard.setPrimaryClip(ClipData.newPlainText( + mShareParams.getTitle(), mShareParams.getTextAndUrl())); + Toast.makeText(mActivity, R.string.sharing_copied, Toast.LENGTH_SHORT).show(); + }) + .build(); } - private void maybeAddCopyTextOption(List<PropertyModel> propertyModels) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15) - || mContentTypes.contains(ContentType.LINK_AND_TEXT)) { - return; - } - if (Collections.disjoint( - mContentTypes, Arrays.asList(ContentType.TEXT, ContentType.HIGHLIGHTED_TEXT))) { - return; - } - propertyModels.add( - new PropertyModelBuilder() - .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy_text) - .setFeatureNameForMetrics("SharingHubAndroid.CopyTextSelected") - .setOnClickCallback((view) -> { - ClipboardManager clipboard = - (ClipboardManager) mActivity.getSystemService( - Context.CLIPBOARD_SERVICE); - clipboard.setPrimaryClip(ClipData.newPlainText( - mShareParams.getTitle(), mShareParams.getText())); - Toast.makeText(mActivity, R.string.text_copied, Toast.LENGTH_SHORT) - .show(); - }) - .build()); + private FirstPartyOption createCopyTextFirstPartyOption() { + return new FirstPartyOptionBuilder(ContentType.TEXT, ContentType.HIGHLIGHTED_TEXT) + .setContentTypesToDisableFor(ContentType.LINK_AND_TEXT) + .setIcon(R.drawable.ic_content_copy_black, R.string.sharing_copy_text) + .setFeatureNameForMetrics("SharingHubAndroid.CopyTextSelected") + .setOnClickCallback((view) -> { + ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService( + Context.CLIPBOARD_SERVICE); + clipboard.setPrimaryClip( + ClipData.newPlainText(mShareParams.getTitle(), mShareParams.getText())); + Toast.makeText(mActivity, R.string.text_copied, Toast.LENGTH_SHORT).show(); + }) + .build(); } - private void maybeAddSendTabToSelfOption(List<PropertyModel> propertyModels) { - if (Collections.disjoint(mContentTypes, - Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE, - ContentType.IMAGE))) { - return; - } - propertyModels.add( - new PropertyModelBuilder() - .setIcon( - R.drawable.send_tab, R.string.send_tab_to_self_share_activity_title) - .setFeatureNameForMetrics("SharingHubAndroid.SendTabToSelfSelected") - .setOnClickCallback((view) -> { - SendTabToSelfCoordinator sttsCoordinator = new SendTabToSelfCoordinator( - mActivity, mUrl, mShareParams.getTitle(), + private FirstPartyOption createSendTabToSelfFirstPartyOption() { + return new FirstPartyOptionBuilder( + ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.IMAGE) + .setIcon(R.drawable.send_tab, R.string.send_tab_to_self_share_activity_title) + .setFeatureNameForMetrics("SharingHubAndroid.SendTabToSelfSelected") + .setOnClickCallback((view) -> { + SendTabToSelfCoordinator sttsCoordinator = + new SendTabToSelfCoordinator(mActivity, mUrl, mShareParams.getTitle(), mBottomSheetController, mSettingsLauncher, mIsSyncEnabled, mTabProvider.get() .getWebContents() .getNavigationController() .getVisibleEntry() .getTimestamp()); - sttsCoordinator.show(); - }) - .build()); + sttsCoordinator.show(); + }) + .build(); } - private void maybeAddQrCodeOption(List<PropertyModel> propertyModels) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARE_QRCODE) - || mTabProvider.get().getWebContents().isIncognito()) { - return; - } - if (Collections.disjoint(mContentTypes, - Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE, - ContentType.IMAGE))) { - return; - } - propertyModels.add(new PropertyModelBuilder() - .setIcon(R.drawable.qr_code, R.string.qr_code_share_icon_label) - .setFeatureNameForMetrics("SharingHubAndroid.QRCodeSelected") - .setOnClickCallback((view) -> { - QrCodeCoordinator qrCodeCoordinator = - new QrCodeCoordinator(mActivity, mUrl); - qrCodeCoordinator.show(); - }) - .build()); + private FirstPartyOption createQrCodeFirstPartyOption() { + return new FirstPartyOptionBuilder( + ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.IMAGE) + .setIcon(R.drawable.qr_code, R.string.qr_code_share_icon_label) + .setFeatureNameForMetrics("SharingHubAndroid.QRCodeSelected") + .setOnClickCallback((view) -> { + QrCodeCoordinator qrCodeCoordinator = new QrCodeCoordinator(mActivity, mUrl); + qrCodeCoordinator.show(); + }) + .build(); } - private void maybeAddPrintingOption(List<PropertyModel> propertyModels) { - if (!UserPrefs.get(Profile.getLastUsedRegularProfile()).getBoolean(Pref.PRINTING_ENABLED) - || !mContentTypes.contains(ContentType.LINK_PAGE_VISIBLE)) { - return; - } - propertyModels.add( - new PropertyModelBuilder() - .setIcon(R.drawable.sharing_print, R.string.print_share_activity_title) - .setFeatureNameForMetrics("SharingHubAndroid.PrintSelected") - .setOnClickCallback( - (view) -> { mPrintTabCallback.onResult(mTabProvider.get()); }) - .build()); + private FirstPartyOption createPrintingFirstPartyOption() { + return new FirstPartyOptionBuilder(ContentType.LINK_PAGE_VISIBLE) + .setIcon(R.drawable.sharing_print, R.string.print_share_activity_title) + .setFeatureNameForMetrics("SharingHubAndroid.PrintSelected") + .setOnClickCallback((view) -> { mPrintTabCallback.onResult(mTabProvider.get()); }) + .build(); } - private void maybeAddHighlightsOption(List<PropertyModel> propertyModels) { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15) - || !ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID) - || !mContentTypes.contains(ContentType.HIGHLIGHTED_TEXT)) { - return; - } - propertyModels.add( - new PropertyModelBuilder() - .setIcon(R.drawable.link, R.string.sharing_highlights) - .setFeatureNameForMetrics("SharingHubAndroid.LinkToTextSelected") - .setOnClickCallback((view) -> { - LinkToTextCoordinator linkToTextCoordinator = new LinkToTextCoordinator( - mActivity, mTabProvider.get(), mChromeOptionShareCallback, mUrl, - mShareParams.getText()); - }) - .build()); + private FirstPartyOption createHighlightsFirstPartyOption() { + return new FirstPartyOptionBuilder(ContentType.HIGHLIGHTED_TEXT) + .setIcon(R.drawable.link, R.string.sharing_highlights) + .setFeatureNameForMetrics("SharingHubAndroid.LinkToTextSelected") + .setOnClickCallback((view) -> { + LinkToTextCoordinator linkToTextCoordinator = + new LinkToTextCoordinator(mActivity, mTabProvider.get(), + mChromeOptionShareCallback, mUrl, mShareParams.getText()); + }) + .build(); } /** * Returns the url to share. * - * <p> This prioritizes the URL in {@link ShareParams}, but if it does not exist, we look for an + * <p>This prioritizes the URL in {@link ShareParams}, but if it does not exist, we look for an * image source URL from {@link ChromeShareExtras}. The image source URL is not contained in * {@link ShareParams#getUrl()} because we do not want to share the image URL with the image * file in third-party app shares. If both are empty then current tab URL is used. This is
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java index 727dba3..8de465d 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -47,6 +47,10 @@ private final BottomSheetController mBottomSheetController; private final Supplier<Tab> mTabProvider; private final ShareSheetPropertyModelBuilder mPropertyModelBuilder; + private final Callback<Tab> mPrintTabCallback; + private final SettingsLauncher mSettingsLauncher; + private final boolean mIsSyncEnabled; + private long mShareStartTime; private boolean mExcludeFirstParty; private boolean mIsMultiWindow; private Set<Integer> mContentTypes; @@ -64,7 +68,7 @@ * * @param controller The {@link BottomSheetController} for the current activity. * @param lifecycleDispatcher Dispatcher for activity lifecycle events, e.g. configuration - * changes. + * changes. * @param tabProvider Supplier for the current activity tab. * @param modelBuilder The {@link ShareSheetPropertyModelBuilder} for the share sheet. */ @@ -78,6 +82,9 @@ mLifecycleDispatcher.register(this); mTabProvider = tabProvider; mPropertyModelBuilder = modelBuilder; + mPrintTabCallback = printTab; + mSettingsLauncher = settingsLauncher; + mIsSyncEnabled = isSyncEnabled; mBottomSheetObserver = new EmptyBottomSheetObserver() { @Override public void onSheetContentChanged(BottomSheetContent bottomSheet) { @@ -93,11 +100,6 @@ }; mBottomSheetController.addObserver(mBottomSheetObserver); mIconBridge = iconBridge; - - mChromeProvidedSharingOptionsProvider = - new ChromeProvidedSharingOptionsProvider(tabProvider, controller, mBottomSheet); - mChromeProvidedSharingOptionsProvider.setFeatureSpecificParams( - printTab, settingsLauncher, isSyncEnabled); } protected void destroy() { @@ -115,7 +117,6 @@ mLifecycleDispatcher.unregister(this); mLifecycleDispatcher = null; } - mChromeProvidedSharingOptionsProvider = null; } // TODO(crbug/1022172): Should be package-protected once modularization is complete. @@ -134,11 +135,12 @@ mBottomSheet = new ShareSheetBottomSheetContent(mActivity, mIconBridge, this, params); + mShareStartTime = shareStartTime; mContentTypes = ShareSheetPropertyModelBuilder.getContentTypes(params, chromeShareExtras); - List<PropertyModel> firstPartyApps = createFirstPartyPropertyModels( - mActivity, params, chromeShareExtras, mContentTypes, shareStartTime); + List<PropertyModel> firstPartyApps = + createFirstPartyPropertyModels(mActivity, params, chromeShareExtras, mContentTypes); List<PropertyModel> thirdPartyApps = createThirdPartyPropertyModels( - mActivity, params, mContentTypes, chromeShareExtras.saveLastUsed(), shareStartTime); + mActivity, params, mContentTypes, chromeShareExtras.saveLastUsed()); mBottomSheet.createRecyclerViews( firstPartyApps, thirdPartyApps, mContentTypes, params.getFileContentType()); @@ -160,24 +162,25 @@ } List<PropertyModel> createFirstPartyPropertyModels(Activity activity, ShareParams shareParams, - ChromeShareExtras chromeShareExtras, Set<Integer> contentTypes, long shareStartTime) { + ChromeShareExtras chromeShareExtras, Set<Integer> contentTypes) { if (mExcludeFirstParty) { return new ArrayList<>(); } + mChromeProvidedSharingOptionsProvider = new ChromeProvidedSharingOptionsProvider(activity, + mTabProvider, mBottomSheetController, mBottomSheet, shareParams, chromeShareExtras, + mPrintTabCallback, mSettingsLauncher, mIsSyncEnabled, mShareStartTime, this); mIsMultiWindow = ApiCompatibilityUtils.isInMultiWindowMode(activity); - mChromeProvidedSharingOptionsProvider.setShareRelatedParams( - shareParams, chromeShareExtras, shareStartTime, this, contentTypes); - mChromeProvidedSharingOptionsProvider.setIsMultiWindow(mIsMultiWindow); - return mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + return mChromeProvidedSharingOptionsProvider.getPropertyModels( + contentTypes, mIsMultiWindow); } @VisibleForTesting List<PropertyModel> createThirdPartyPropertyModels(Activity activity, ShareParams params, - Set<Integer> contentTypes, boolean saveLastUsed, long shareStartTime) { + Set<Integer> contentTypes, boolean saveLastUsed) { if (params == null) return null; List<PropertyModel> models = mPropertyModelBuilder.selectThirdPartyApps(mBottomSheet, - contentTypes, params, saveLastUsed, params.getWindow(), shareStartTime); + contentTypes, params, saveLastUsed, params.getWindow(), mShareStartTime); // More... PropertyModel morePropertyModel = ShareSheetPropertyModelBuilder.createPropertyModel( AppCompatResources.getDrawable(activity, R.drawable.sharing_more), @@ -215,22 +218,16 @@ return; } boolean isMultiWindow = ApiCompatibilityUtils.isInMultiWindowMode(mActivity); - if (mIsMultiWindow == isMultiWindow) { + // mContentTypes is null if Chrome features should not be shown. + if (mIsMultiWindow == isMultiWindow || mContentTypes == null) { return; } mIsMultiWindow = isMultiWindow; - mChromeProvidedSharingOptionsProvider.setIsMultiWindow(mIsMultiWindow); - List<PropertyModel> firstPartyOptions = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); - - // firstPartyOptions is empty if Chrome features should not be shown. - if (firstPartyOptions == null || firstPartyOptions.isEmpty()) { - return; - } - - mBottomSheet.createFirstPartyRecyclerViews(firstPartyOptions); - mBottomSheetController.requestShowContent(mBottomSheet, /* animate= */ false); + mBottomSheet.createFirstPartyRecyclerViews( + mChromeProvidedSharingOptionsProvider.getPropertyModels( + mContentTypes, mIsMultiWindow)); + mBottomSheetController.requestShowContent(mBottomSheet, /*animate=*/false); } // View.OnLayoutChangeListener @@ -245,4 +242,5 @@ mBottomSheet.getThirdPartyView().invalidate(); mBottomSheet.getThirdPartyView().requestLayout(); } + }
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java index 60aad0cd..fd95f2d 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java
@@ -40,13 +40,10 @@ import org.chromium.components.user_prefs.UserPrefs; import org.chromium.components.user_prefs.UserPrefsJni; import org.chromium.content_public.browser.WebContents; -import org.chromium.ui.base.ImmutableWeakReference; -import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.test.util.DummyUiActivity; import org.chromium.url.GURL; -import java.util.Collection; import java.util.List; /** @@ -80,9 +77,6 @@ @Mock private ShareSheetCoordinator mShareSheetCoordinator; - @Mock - private WindowAndroid mWindow; - private Activity mActivity; private ChromeProvidedSharingOptionsProvider mChromeProvidedSharingOptionsProvider; @@ -106,7 +100,6 @@ Mockito.when(mTab.getUrl()).thenReturn(new GURL(URL)); Mockito.when(mWebContents.isIncognito()).thenReturn(false); mActivity = mActivityTestRule.getActivity(); - Mockito.when(mWindow.getActivity()).thenReturn(new ImmutableWeakReference<>(mActivity)); } @Test @@ -116,11 +109,10 @@ @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15}) public void getPropertyModels_screenshotQrCodeEnabled_includesBoth() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, - /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_screenshot), @@ -135,11 +127,10 @@ ChromeFeatureList.CHROME_SHARE_QRCODE, ChromeFeatureList.CHROME_SHARING_HUB_V15}) public void getPropertyModels_screenshotQrCodeDisabled_doesNotIncludeEither() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, - /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString( @@ -152,11 +143,10 @@ ChromeFeatureList.CHROME_SHARE_QRCODE, ChromeFeatureList.CHROME_SHARING_HUB_V15}) public void getPropertyModels_printingEnabled_includesPrinting() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ true, - ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, - /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/true); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString( @@ -172,10 +162,10 @@ ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) public void getPropertyModels_sharingHub15Enabled_includesCopyText() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ImmutableSet.of(ContentType.TEXT), /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.TEXT), /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_copy_text))); @@ -189,13 +179,13 @@ ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) public void getPropertyModels_linkAndTextShare() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ImmutableSet.of(ContentType.LINK_AND_TEXT, ContentType.LINK_PAGE_NOT_VISIBLE, - ContentType.TEXT), - /* isMultiWindow= */ true); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.LINK_AND_TEXT, + ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.TEXT), + /*isMultiWindow=*/true); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_copy), @@ -211,12 +201,12 @@ ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) public void getPropertyModels_linkShare() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE), - /* isMultiWindow= */ true); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE), + /*isMultiWindow=*/true); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_copy_url), @@ -232,12 +222,12 @@ ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) public void getPropertyModels_textShare() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ImmutableSet.of(ContentType.TEXT), - /* isMultiWindow= */ true); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.TEXT), + /*isMultiWindow=*/true); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_copy_text))); @@ -251,11 +241,11 @@ ChromeFeatureList.CHROME_SHARING_HUB_V15}) public void getPropertyModels_multiWindow_doesNotIncludeScreenshot() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, /* isMultiWindow= */ true); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, /*isMultiWindow=*/true); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString( @@ -269,11 +259,11 @@ @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15}) public void getPropertyModels_filtersByContentType() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ true, - ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE), - /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/true); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE), + /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_copy_url), @@ -289,11 +279,11 @@ @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15}) public void getPropertyModels_multipleTypes_filtersByContentType() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ true, - ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.IMAGE), - /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/true); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.IMAGE), + /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_screenshot), @@ -310,10 +300,10 @@ @Features.EnableFeatures({ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID}) public void getPropertyModels_sharingHub15Disabled_noHighlights() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ImmutableSet.of(ContentType.TEXT), /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.TEXT), /*isMultiWindow=*/false); assertEquals("Incorrect number of property models.", 0, propertyModels.size()); } @@ -325,10 +315,10 @@ @Features.DisableFeatures({ChromeFeatureList.CHROME_SHARE_SCREENSHOT}) public void getPropertyModels_sharingHub15HighlightsEnabled() { - setUpChromeProvidedSharingOptionsProviderTest(/* printingEnabled= */ false, - ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT), /* isMultiWindow= */ false); + setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false); List<PropertyModel> propertyModels = - mChromeProvidedSharingOptionsProvider.calculatePropertyModels(); + mChromeProvidedSharingOptionsProvider.getPropertyModels( + ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT), /*isMultiWindow=*/false); assertCorrectModelsAreInTheRightOrder(propertyModels, ImmutableList.of(mActivity.getResources().getString(R.string.sharing_copy_text), @@ -338,8 +328,7 @@ @Test @MediumTest public void getUrlToShare_noShareParamsUrl_returnsImageUrl() { - ShareParams shareParams = - new ShareParams.Builder(null, /* title= */ "", /* url= */ "").build(); + ShareParams shareParams = new ShareParams.Builder(null, /*title=*/"", /*url=*/"").build(); ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder().setImageSrcUrl(URL).build(); @@ -352,7 +341,7 @@ @Test @MediumTest public void getUrlToShare_shareParamsUrlExists_returnsShareParamsUrl() { - ShareParams shareParams = new ShareParams.Builder(null, /* title= */ "", URL).build(); + ShareParams shareParams = new ShareParams.Builder(null, /*title=*/"", URL).build(); ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder().setImageSrcUrl("").build(); @@ -365,8 +354,7 @@ @Test @MediumTest public void getUrlToShare_noShareParamsUrl_noImageUrl() { - ShareParams shareParams = - new ShareParams.Builder(null, /* title= */ "", /* url= */ "").build(); + ShareParams shareParams = new ShareParams.Builder(null, /*title=*/"", /*url=*/"").build(); ChromeShareExtras chromeShareExtras = new ChromeShareExtras.Builder().setImageSrcUrl("").build(); @@ -376,24 +364,21 @@ URL); } - private void setUpChromeProvidedSharingOptionsProviderTest( - boolean printingEnabled, Collection<Integer> contentTypes, boolean isMultiWindow) { + private void setUpChromeProvidedSharingOptionsProviderTest(boolean printingEnabled) { Mockito.when(mPrefService.getBoolean(anyString())).thenReturn(printingEnabled); - ShareParams shareParams = - new ShareParams.Builder(mWindow, /* title= */ "", /* url= */ "").build(); + ShareParams shareParams = new ShareParams.Builder(null, /*title=*/"", /*url=*/"").build(); mChromeProvidedSharingOptionsProvider = - new ChromeProvidedSharingOptionsProvider(mTabProvider, - /* bottomSheetController= */ null, + new ChromeProvidedSharingOptionsProvider(mActivity, mTabProvider, + /*bottomSheetController=*/null, new ShareSheetBottomSheetContent( - mActivity, null, mShareSheetCoordinator, shareParams)); - mChromeProvidedSharingOptionsProvider.setShareRelatedParams(shareParams, - new ChromeShareExtras.Builder().build(), /* shareStartTime= */ 0, - mShareSheetCoordinator, contentTypes); - mChromeProvidedSharingOptionsProvider.setFeatureSpecificParams( - /* TabPrinterDelegate= */ null, /* settingsLauncher= */ null, - /* syncState= */ false); - mChromeProvidedSharingOptionsProvider.setIsMultiWindow(isMultiWindow); + mActivity, null, mShareSheetCoordinator, shareParams), + new ShareParams.Builder(null, "", "").build(), + new ChromeShareExtras.Builder().build(), + /*TabPrinterDelegate=*/null, + /*settingsLauncher=*/null, + /*syncState=*/false, + /*shareStartTime=*/0, mShareSheetCoordinator); } private void assertCorrectModelsAreInTheRightOrder(
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java index babd026a..1c699e36 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
@@ -22,7 +22,6 @@ import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.chromium.base.test.util.CommandLineFlags; @@ -34,8 +33,6 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.share.ShareParams; -import org.chromium.ui.base.ImmutableWeakReference; -import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.test.util.DummyUiActivity; @@ -71,9 +68,6 @@ @Mock private ShareParams mParams; - @Mock - private WindowAndroid mWindow; - private Activity mActivity; private ShareSheetCoordinator mShareSheetCoordinator; @@ -101,9 +95,6 @@ mShareSheetCoordinator = new ShareSheetCoordinator(mController, mLifecycleDispatcher, null, mPropertyModelBuilder, null, null, null, false); - - Mockito.when(mParams.getWindow()).thenReturn(mWindow); - Mockito.when(mWindow.getActivity()).thenReturn(new ImmutableWeakReference<>(mActivity)); } @Test @@ -113,7 +104,7 @@ List<PropertyModel> propertyModels = mShareSheetCoordinator.createFirstPartyPropertyModels( mActivity, mParams, /*chromeShareExtras=*/null, - ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, /*shareStartTime=*/0); + ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES); assertEquals("Property model list should be empty.", 0, propertyModels.size()); } @@ -122,7 +113,7 @@ public void testCreateThirdPartyPropertyModels() { List<PropertyModel> propertyModels = mShareSheetCoordinator.createThirdPartyPropertyModels( mActivity, mParams, ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES, - /*saveLastUsed=*/false, /*shareStartTime=*/0); + /*saveLastUsed=*/false); assertEquals("Incorrect number of property models.", 3, propertyModels.size()); assertEquals("First property model isn't testModel1.", "testModel1",
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc index 41d4107..bb00997 100644 --- a/chrome/browser/signin/dice_browsertest.cc +++ b/chrome/browser/signin/dice_browsertest.cc
@@ -30,6 +30,7 @@ #include "chrome/browser/policy/cloud/user_policy_signin_service_internal.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/signin/account_consistency_mode_manager.h" #include "chrome/browser/signin/account_reconcilor_factory.h" #include "chrome/browser/signin/chrome_device_id_helper.h" @@ -52,7 +53,6 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/signin/core/browser/account_reconcilor.h" #include "components/signin/core/browser/dice_header_helper.h" #include "components/signin/core/browser/signin_header_helper.h"
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 1c086f73..96d2504 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2810,6 +2810,9 @@ <message name="IDS_VIDEO_TUTORIALS_IPH_TAP_VOICE_ICON_TO_START" desc="In-product help bubble text prompting user to start typing on the search box or tap on the microphone icon to start a voice search."> Type here or tap the voice icon to start </message> + <message name="IDS_VIDEO_TUTORIALS_LOADING" desc="Text on the loading animation screen indicating that the video loading is currently in progress."> + Loading… + </message> <!-- Toolbar button strings --> <message name="IDS_OPEN_TABS" desc="Text for button to enter the tab switcher and show tabs that are open on this device">
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VIDEO_TUTORIALS_LOADING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VIDEO_TUTORIALS_LOADING.png.sha1 new file mode 100644 index 0000000..563b51c --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_VIDEO_TUTORIALS_LOADING.png.sha1
@@ -0,0 +1 @@ +edcd73ed1f1bf2d070a0eeb3cf272d3284e01668 \ No newline at end of file
diff --git a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc index 9b43169..be0decc 100644 --- a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc +++ b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.cc
@@ -47,7 +47,7 @@ const gfx::Rect& anchor, std::vector<std::string> actions) {} -void FakeAccessibilityController::StartPointScan() {} +void FakeAccessibilityController::ActivatePointScan() {} void FakeAccessibilityController::SetDictationActive(bool is_active) {}
diff --git a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h index 16c442e..5255176 100644 --- a/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h +++ b/chrome/browser/ui/ash/accessibility/fake_accessibility_controller.h
@@ -33,7 +33,7 @@ void ShowSwitchAccessBackButton(const gfx::Rect& anchor) override; void ShowSwitchAccessMenu(const gfx::Rect& anchor, std::vector<std::string> actions) override; - void StartPointScan() override; + void ActivatePointScan() override; void SetDictationActive(bool is_active) override; void ToggleDictationFromSource(ash::DictationToggleSource source) override; void HandleAutoclickScrollableBoundsFound(
diff --git a/chrome/browser/ui/ash/chrome_capture_mode_delegate.cc b/chrome/browser/ui/ash/chrome_capture_mode_delegate.cc index f06f9c2..eba60f4 100644 --- a/chrome/browser/ui/ash/chrome_capture_mode_delegate.cc +++ b/chrome/browser/ui/ash/chrome_capture_mode_delegate.cc
@@ -79,6 +79,10 @@ return base::GetHourClockType() == base::k24HourClock; } +bool ChromeCaptureModeDelegate::IsCaptureModeInitRestricted() const { + return policy::DlpContentManager::Get()->IsCaptureModeInitRestricted(); +} + bool ChromeCaptureModeDelegate::IsCaptureAllowed(const aura::Window* window, const gfx::Rect& bounds, bool for_video) const {
diff --git a/chrome/browser/ui/ash/chrome_capture_mode_delegate.h b/chrome/browser/ui/ash/chrome_capture_mode_delegate.h index dff1e30..2e5f0ba 100644 --- a/chrome/browser/ui/ash/chrome_capture_mode_delegate.h +++ b/chrome/browser/ui/ash/chrome_capture_mode_delegate.h
@@ -23,6 +23,7 @@ void ShowScreenCaptureItemInFolder(const base::FilePath& file_path) override; void OpenScreenshotInImageEditor(const base::FilePath& file_path) override; bool Uses24HourFormat() const override; + bool IsCaptureModeInitRestricted() const override; bool IsCaptureAllowed(const aura::Window* window, const gfx::Rect& bounds, bool for_video) const override;
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc index 822560f..03dff2a 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
@@ -29,6 +29,14 @@ // Helpers --------------------------------------------------------------------- +// Flushes the message loop by posting a task and waiting for it to run. +void FlushMessageLoop() { + base::RunLoop run_loop; + base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE, + run_loop.QuitClosure()); + run_loop.Run(); +} + // Performs a double click on `view`. void DoubleClick(const views::View* view) { auto* root_window = HoldingSpaceBrowserTestBase::GetRootWindowForNewWindows(); @@ -150,9 +158,12 @@ // Verifies that drag-and-drop of holding space items works. IN_PROC_BROWSER_TEST_F(HoldingSpaceUiBrowserTest, DragAndDrop) { + auto* drop_target_view = DropTargetView::Create(GetRootWindowForNewWindows()); + drop_target_view->GetWidget()->SetBounds(gfx::Rect(0, 0, 100, 100)); + drop_target_view->GetWidget()->ShowInactive(); + + // Verify drag-and-drop of download items. HoldingSpaceItem* const download_file = AddDownloadFile(); - HoldingSpaceItem* const pinned_file = AddPinnedFile(); - HoldingSpaceItem* const screenshot_file = AddScreenshotFile(); Show(); ASSERT_TRUE(IsShowing()); @@ -160,25 +171,50 @@ std::vector<views::View*> download_chips = GetDownloadChips(); ASSERT_EQ(1u, download_chips.size()); + MouseDrag(/*from=*/download_chips[0], /*to=*/drop_target_view); + EXPECT_EQ(download_file->file_path(), drop_target_view->copied_file_path()); + + // Drag-and-drop should close holding space UI. + FlushMessageLoop(); + ASSERT_FALSE(IsShowing()); + + // Verify drag-and-drop of pinned file items. + // NOTE: Dragging a pinned file from a non-top row of the pinned files + // container grid previously resulted in a crash (crbug.com/1143426). To + // explicitly test against this case we will add and drag a second row item. + HoldingSpaceItem* const pinned_file = AddPinnedFile(); + AddPinnedFile(); + AddPinnedFile(); + + Show(); + ASSERT_TRUE(IsShowing()); + std::vector<views::View*> pinned_file_chips = GetPinnedFileChips(); - ASSERT_EQ(1u, pinned_file_chips.size()); + ASSERT_EQ(3u, pinned_file_chips.size()); + + MouseDrag(/*from=*/pinned_file_chips.back(), /*to=*/drop_target_view); + EXPECT_EQ(pinned_file->file_path(), drop_target_view->copied_file_path()); + + // Drag-and-drop should close holding space UI. + FlushMessageLoop(); + ASSERT_FALSE(IsShowing()); + + // Verify drag-and-drop of screenshot items. + HoldingSpaceItem* const screenshot_file = AddScreenshotFile(); + + Show(); + ASSERT_TRUE(IsShowing()); std::vector<views::View*> screen_capture_views = GetScreenCaptureViews(); ASSERT_EQ(1u, screen_capture_views.size()); - auto* drop_target_view = DropTargetView::Create(GetRootWindowForNewWindows()); - drop_target_view->GetWidget()->SetBounds(gfx::Rect(0, 0, 100, 100)); - drop_target_view->GetWidget()->ShowInactive(); - - MouseDrag(/*from=*/download_chips[0], /*to=*/drop_target_view); - EXPECT_EQ(download_file->file_path(), drop_target_view->copied_file_path()); - - MouseDrag(/*from=*/pinned_file_chips[0], /*to=*/drop_target_view); - EXPECT_EQ(pinned_file->file_path(), drop_target_view->copied_file_path()); - MouseDrag(/*from=*/screen_capture_views[0], /*to=*/drop_target_view); EXPECT_EQ(screenshot_file->file_path(), drop_target_view->copied_file_path()); + // Drag-and-drop should close holding space UI. + FlushMessageLoop(); + ASSERT_FALSE(IsShowing()); + drop_target_view->GetWidget()->Close(); }
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index 4658c6c..32528a6 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h
@@ -468,7 +468,11 @@ // Shows User Happiness Tracking Survey's invitation bubble when possible // (such as having the proper anchor view). // |site_id| is the site identification of the survey the bubble leads to. - virtual void ShowHatsBubble(const std::string& site_id) = 0; + // Note: |success_callback| and |failure_callback| are discarded for HaTS v1 + // surveys, which are deprecated (crbug.com/1143176). + virtual void ShowHatsBubble(const std::string& site_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) = 0; // Returns object implementing ExclusiveAccessContext interface. virtual ExclusiveAccessContext* GetExclusiveAccessContext() = 0;
diff --git a/chrome/browser/ui/hats/hats_service.cc b/chrome/browser/ui/hats/hats_service.cc index 79993c6..73b6cad 100644 --- a/chrome/browser/ui/hats/hats_service.cc +++ b/chrome/browser/ui/hats/hats_service.cc
@@ -128,6 +128,9 @@ } HatsService::HatsService(Profile* profile) : profile_(profile) { + constexpr char kHatsSurveyUserPrompted[] = "user_prompted"; + constexpr bool kHatsSurveyUserPromptedDefault = false; + for (auto* survey_feature : survey_features) { if (!base::FeatureList::IsEnabled(*survey_feature)) continue; @@ -140,6 +143,9 @@ .Get(), base::FeatureParam<std::string>(survey_feature, kHatsSurveyEnSiteID, kHatsSurveyEnSiteIDDefault) + .Get(), + base::FeatureParam<bool>(survey_feature, kHatsSurveyUserPrompted, + kHatsSurveyUserPromptedDefault) .Get())); } // Ensure a default survey exists (for testing and demo purpose). @@ -148,8 +154,8 @@ features::kHappinessTrackingSurveysForDesktopMigration) ? kHatsNextSurveyTriggerIDTesting : kHatsSurveyEnSiteIDDefault; - survey_configs_by_triggers_.emplace(kHatsSurveyTriggerTesting, - SurveyConfig(1.0f, default_survey_id)); + survey_configs_by_triggers_.emplace( + kHatsSurveyTriggerTesting, SurveyConfig(1.0f, default_survey_id, false)); } HatsService::~HatsService() = default; @@ -159,10 +165,16 @@ registry->RegisterDictionaryPref(prefs::kHatsSurveyMetadata); } -void HatsService::LaunchSurvey(const std::string& trigger) { - if (!ShouldShowSurvey(trigger)) +void HatsService::LaunchSurvey(const std::string& trigger, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) { + if (!ShouldShowSurvey(trigger)) { + std::move(failure_callback).Run(); return; - LaunchSurveyForBrowser(trigger, chrome::FindLastActiveWithProfile(profile_)); + } + LaunchSurveyForBrowser(chrome::FindLastActiveWithProfile(profile_), trigger, + std::move(success_callback), + std::move(failure_callback)); } bool HatsService::LaunchDelayedSurvey(const std::string& trigger, @@ -170,7 +182,7 @@ return base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce(&HatsService::LaunchSurvey, weak_ptr_factory_.GetWeakPtr(), - trigger), + trigger, base::DoNothing::Once(), base::DoNothing::Once()), base::TimeDelta::FromMilliseconds(timeout_ms)); } @@ -328,18 +340,21 @@ content::WebContents* web_contents) { if (ShouldShowSurvey(trigger) && web_contents && web_contents->GetVisibility() == content::Visibility::VISIBLE) { - LaunchSurveyForBrowser(trigger, - chrome::FindBrowserWithWebContents(web_contents)); + LaunchSurveyForBrowser(chrome::FindBrowserWithWebContents(web_contents), + trigger, base::DoNothing(), base::DoNothing()); } } -void HatsService::LaunchSurveyForBrowser(const std::string& trigger, - Browser* browser) { +void HatsService::LaunchSurveyForBrowser(Browser* browser, + const std::string& trigger, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) { if (!browser || !browser->is_type_normal() || !profiles::IsRegularOrGuestSession(browser)) { // Never show HaTS bubble for Incognito mode. UMA_HISTOGRAM_ENUMERATION(kHatsShouldShowSurveyReasonHistogram, ShouldShowSurveyReasons::kNoNotRegularBrowser); + std::move(failure_callback).Run(); return; } if (IncognitoModePrefs::GetAvailability(profile_->GetPrefs()) == @@ -348,14 +363,16 @@ // for HaTS dialog. UMA_HISTOGRAM_ENUMERATION(kHatsShouldShowSurveyReasonHistogram, ShouldShowSurveyReasons::kNoIncognitoDisabled); + std::move(failure_callback).Run(); return; } // Checking survey's status could be costly due to a network request, so // we check it at the last. - CheckSurveyStatusAndMaybeShow(browser, trigger); + CheckSurveyStatusAndMaybeShow(browser, trigger, std::move(success_callback), + std::move(failure_callback)); } -bool HatsService::ShouldShowSurvey(const std::string& trigger) const { +bool HatsService::CanShowSurvey(const std::string& trigger) const { // Do not show if a survey dialog already exists. if (hats_next_dialog_exists_) { UMA_HISTOGRAM_ENUMERATION( @@ -366,13 +383,14 @@ // Survey should not be loaded if the corresponding survey config is // unavailable. - if (survey_configs_by_triggers_.find(trigger) == - survey_configs_by_triggers_.end()) { + const auto config_iterator = survey_configs_by_triggers_.find(trigger); + if (config_iterator == survey_configs_by_triggers_.end()) { UMA_HISTOGRAM_ENUMERATION( kHatsShouldShowSurveyReasonHistogram, ShouldShowSurveyReasons::kNoTriggerStringMismatch); return false; } + const SurveyConfig config = config_iterator->second; if (base::FeatureList::IsEnabled( features::kHappinessTrackingSurveysForDesktopDemo)) { @@ -413,39 +431,48 @@ base::Time now = base::Time::Now(); - if ((now - profile_->GetCreationTime()) < kMinimumProfileAge) { - UMA_HISTOGRAM_ENUMERATION(kHatsShouldShowSurveyReasonHistogram, - ShouldShowSurveyReasons::kNoProfileTooNew); + if (!config.user_prompted_) { + if ((now - profile_->GetCreationTime()) < kMinimumProfileAge) { + UMA_HISTOGRAM_ENUMERATION(kHatsShouldShowSurveyReasonHistogram, + ShouldShowSurveyReasons::kNoProfileTooNew); + return false; + } + + base::Optional<base::Time> last_survey_started_time = util::ValueToTime( + pref_data->FindPath(GetLastSurveyStartedTime(trigger))); + if (last_survey_started_time.has_value()) { + base::TimeDelta elapsed_time_since_last_start = + now - *last_survey_started_time; + if (elapsed_time_since_last_start < kMinimumTimeBetweenSurveyStarts) { + UMA_HISTOGRAM_ENUMERATION( + kHatsShouldShowSurveyReasonHistogram, + ShouldShowSurveyReasons::kNoLastSurveyTooRecent); + return false; + } + } + + // The time any survey was started will always be equal or more recent than + // the time a particular survey was started, so it is checked afterwards to + // improve UMA logging. + base::Optional<base::Time> last_any_started_time = + util::ValueToTime(pref_data->FindPath(kAnyLastSurveyStartedTimePath)); + if (last_any_started_time.has_value()) { + base::TimeDelta elapsed_time_any_started = now - *last_any_started_time; + if (elapsed_time_any_started < kMinimumTimeBetweenAnySurveyStarts) { + UMA_HISTOGRAM_ENUMERATION( + kHatsShouldShowSurveyReasonHistogram, + ShouldShowSurveyReasons::kNoAnyLastSurveyTooRecent); + return false; + } + } + } + + return true; +} + +bool HatsService::ShouldShowSurvey(const std::string& trigger) const { + if (!CanShowSurvey(trigger)) return false; - } - - base::Optional<base::Time> last_survey_started_time = - util::ValueToTime(pref_data->FindPath(GetLastSurveyStartedTime(trigger))); - if (last_survey_started_time.has_value()) { - base::TimeDelta elapsed_time_since_last_start = - now - *last_survey_started_time; - if (elapsed_time_since_last_start < kMinimumTimeBetweenSurveyStarts) { - UMA_HISTOGRAM_ENUMERATION( - kHatsShouldShowSurveyReasonHistogram, - ShouldShowSurveyReasons::kNoLastSurveyTooRecent); - return false; - } - } - - // The time any survey was started will always be equal or more recent than - // the time a particular survey was started, so it is checked afterwards to - // improve UMA logging. - base::Optional<base::Time> last_any_started_time = - util::ValueToTime(pref_data->FindPath(kAnyLastSurveyStartedTimePath)); - if (last_any_started_time.has_value()) { - base::TimeDelta elapsed_time_any_started = now - *last_any_started_time; - if (elapsed_time_any_started < kMinimumTimeBetweenAnySurveyStarts) { - UMA_HISTOGRAM_ENUMERATION( - kHatsShouldShowSurveyReasonHistogram, - ShouldShowSurveyReasons::kNoAnyLastSurveyTooRecent); - return false; - } - } auto probability_ = survey_configs_by_triggers_.at(trigger).probability_; bool should_show_survey = base::RandDouble() < probability_; @@ -458,8 +485,11 @@ return should_show_survey; } -void HatsService::CheckSurveyStatusAndMaybeShow(Browser* browser, - const std::string& trigger) { +void HatsService::CheckSurveyStatusAndMaybeShow( + Browser* browser, + const std::string& trigger, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) { // Check the survey status in profile first. // We record the survey's over capacity information in user profile to avoid // duplicated checks since the survey won't change once it is full. @@ -467,16 +497,20 @@ profile_->GetPrefs()->GetDictionary(prefs::kHatsSurveyMetadata); base::Optional<int> is_full = pref_data->FindBoolPath(GetIsSurveyFull(trigger)); - if (is_full.has_value() && is_full) + if (is_full.has_value() && is_full) { + std::move(failure_callback).Run(); return; + } base::Optional<base::Time> last_survey_check_time = util::ValueToTime(pref_data->FindPath(GetLastSurveyCheckTime(trigger))); if (last_survey_check_time.has_value()) { base::TimeDelta elapsed_time_since_last_check = base::Time::Now() - *last_survey_check_time; - if (elapsed_time_since_last_check < kMinimumTimeBetweenSurveyChecks) + if (elapsed_time_since_last_check < kMinimumTimeBetweenSurveyChecks) { + std::move(failure_callback).Run(); return; + } } DCHECK(survey_configs_by_triggers_.find(trigger) != @@ -489,7 +523,8 @@ // HatsNextWebDialog::OnSurveyStateUpdateReceived. DCHECK(!hats_next_dialog_exists_); browser->window()->ShowHatsBubble( - survey_configs_by_triggers_[trigger].en_site_id_); + survey_configs_by_triggers_[trigger].en_site_id_, + std::move(success_callback), std::move(failure_callback)); hats_next_dialog_exists_ = true; } else { if (!checker_) @@ -506,7 +541,8 @@ void HatsService::ShowSurvey(Browser* browser, const std::string& trigger) { auto survey_id = survey_configs_by_triggers_[trigger].en_site_id_; RecordSurveyAsShown(survey_id); - browser->window()->ShowHatsBubble(survey_id); + browser->window()->ShowHatsBubble(survey_id, base::DoNothing(), + base::DoNothing()); checker_.reset(); }
diff --git a/chrome/browser/ui/hats/hats_service.h b/chrome/browser/ui/hats/hats_service.h index e096485..8e0b4d0 100644 --- a/chrome/browser/ui/hats/hats_service.h +++ b/chrome/browser/ui/hats/hats_service.h
@@ -9,6 +9,7 @@ #include <set> #include <string> +#include "base/callback.h" #include "base/containers/flat_map.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -46,8 +47,10 @@ class HatsService : public KeyedService { public: struct SurveyConfig { - SurveyConfig(const double probability, const std::string en_site_id) - : probability_(probability), en_site_id_(en_site_id) {} + SurveyConfig(double probability, std::string en_site_id, bool user_prompted) + : probability_(probability), + en_site_id_(std::move(en_site_id)), + user_prompted_(user_prompted) {} SurveyConfig() = default; @@ -56,6 +59,10 @@ // Site ID for the survey. std::string en_site_id_; + + // The survey will prompt every time because the user has explicitly decided + // to take the survey e.g. clicking a link. + bool user_prompted_; }; struct SurveyMetadata { @@ -135,7 +142,12 @@ static void RegisterProfilePrefs(PrefRegistrySimple* registry); // Launches survey with identifier |trigger| if appropriate. - virtual void LaunchSurvey(const std::string& trigger); + // |success_callback| is called when the survey is shown to the user. + // |failure_callback| is called if the survey does not launch for any reason. + virtual void LaunchSurvey( + const std::string& trigger, + base::OnceClosure success_callback = base::DoNothing(), + base::OnceClosure failure_callback = base::DoNothing()); // Launches survey (with id |trigger|) with a timeout |timeout_ms| if // appropriate. Survey will be shown at the active window/tab by the @@ -171,6 +183,12 @@ std::unique_ptr<HatsSurveyStatusChecker> checker); bool HasPendingTasks(); + // Whether the survey specified by |trigger| can be shown to the user. This + // is a pre-check that calculates as many conditions as possible, but could + // still return a false positive due to client-side rate limiting, a change + // in network conditions, or intervening calls to this API. + bool CanShowSurvey(const std::string& trigger) const; + private: friend class DelayedSurveyTask; FRIEND_TEST_ALL_PREFIXES(HatsServiceHatsNext, SingleHatsNextDialog); @@ -178,14 +196,21 @@ void LaunchSurveyForWebContents(const std::string& trigger, content::WebContents* web_contents); - void LaunchSurveyForBrowser(const std::string& trigger, Browser* browser); + void LaunchSurveyForBrowser(Browser* browser, + const std::string& trigger, + base::OnceClosure success_callback, + base::OnceClosure failure_callback); // Returns true is the survey trigger specified should be shown. bool ShouldShowSurvey(const std::string& trigger) const; - // Check whether the survey is reachable and under capacity. + // Check whether the survey is reachable and under capacity and show it. + // |success_callback| is called when the survey is shown to the user. + // |failure_callback| is called if the survey does not launch for any reason. void CheckSurveyStatusAndMaybeShow(Browser* browser, - const std::string& trigger); + const std::string& trigger, + base::OnceClosure success_callback, + base::OnceClosure failure_callback); // Callbacks for survey capacity checking. void ShowSurvey(Browser* browser, const std::string& trigger);
diff --git a/chrome/browser/ui/hats/mock_hats_service.h b/chrome/browser/ui/hats/mock_hats_service.h index 07b723f0..b145c439 100644 --- a/chrome/browser/ui/hats/mock_hats_service.h +++ b/chrome/browser/ui/hats/mock_hats_service.h
@@ -22,7 +22,12 @@ explicit MockHatsService(Profile* profile); ~MockHatsService() override; - MOCK_METHOD(void, LaunchSurvey, (const std::string& trigger), (override)); + MOCK_METHOD(void, + LaunchSurvey, + (const std::string& trigger, + base::OnceClosure success_callback, + base::OnceClosure failure_callback), + (override)); MOCK_METHOD(bool, LaunchDelayedSurvey, (const std::string& trigger, int timeout_ms),
diff --git a/chrome/browser/ui/search/instant_theme_browsertest.cc b/chrome/browser/ui/search/instant_theme_browsertest.cc index 9be30e4..b9697c5 100644 --- a/chrome/browser/ui/search/instant_theme_browsertest.cc +++ b/chrome/browser/ui/search/instant_theme_browsertest.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/search/instant_service_observer.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/browser.h" @@ -23,7 +24,6 @@ #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "components/search/ntp_features.h" #include "content/public/browser/url_data_source.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc index 3d2f40a..ab47a7e 100644 --- a/chrome/browser/ui/search/local_ntp_browsertest.cc +++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/search/instant_service_observer.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" @@ -42,7 +43,6 @@ #include "components/omnibox/browser/omnibox_view.h" #include "components/omnibox/common/omnibox_features.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/ui/search/local_ntp_test_utils.cc b/chrome/browser/ui/search/local_ntp_test_utils.cc index 48b46c3..42586e9f 100644 --- a/chrome/browser/ui/search/local_ntp_test_utils.cc +++ b/chrome/browser/ui/search/local_ntp_test_utils.cc
@@ -9,6 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_restrictions.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/browser.h" @@ -20,7 +21,6 @@ #include "chrome/test/base/ui_test_utils.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_data.h" #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.cc b/chrome/browser/ui/search/ntp_user_data_logger.cc index cd4f9303..be890d922 100644 --- a/chrome/browser/ui/search/ntp_user_data_logger.cc +++ b/chrome/browser/ui/search/ntp_user_data_logger.cc
@@ -13,13 +13,13 @@ #include "chrome/browser/after_startup_task_utils.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/browser/ui/search/ntp_user_data_types.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "components/ntp_tiles/metrics.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc b/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc index 69dea96..a9f7692 100644 --- a/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc +++ b/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
@@ -12,12 +12,12 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/user_action_tester.h" #include "base/time/time.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/ui/search/ntp_user_data_types.h" #include "chrome/common/search/ntp_logging_events.h" #include "chrome/common/url_constants.h" #include "components/favicon_base/favicon_types.h" #include "components/ntp_tiles/constants.h" -#include "components/search/ntp_features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc index be2d4e5..6ece891 100644 --- a/chrome/browser/ui/search/search_tab_helper.cc +++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -31,6 +31,7 @@ #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/search/local_ntp_source.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/promos/promo_service.h" #include "chrome/browser/search/promos/promo_service_factory.h" #include "chrome/browser/search/search.h" @@ -75,7 +76,6 @@ #include "components/omnibox/browser/suggestion_answer.h" #include "components/omnibox/browser/vector_icons.h" #include "components/omnibox/common/omnibox_features.h" -#include "components/search/ntp_features.h" #include "components/search/search.h" #include "components/search_engines/omnibox_focus_type.h" #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 243a972c..723cd3e 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -50,7 +50,7 @@ #include "chrome/browser/plugins/pdf_plugin_placeholder_observer.h" #include "chrome/browser/predictors/loading_predictor_factory.h" #include "chrome/browser/predictors/loading_predictor_tab_helper.h" -#include "chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.h" #include "chrome/browser/prerender/prerender_tab_helper.h" #include "chrome/browser/previews/previews_ui_tab_helper.h" #include "chrome/browser/previews/resource_loading_hints/resource_loading_hints_web_contents_observer.h" @@ -259,7 +259,7 @@ HistoryTabHelper::CreateForWebContents(web_contents); InfoBarService::CreateForWebContents(web_contents); InstallableManager::CreateForWebContents(web_contents); - IsolatedPrerenderTabHelper::CreateForWebContents(web_contents); + PrefetchProxyTabHelper::CreateForWebContents(web_contents); LiteVideoObserver::MaybeCreateForWebContents(web_contents); #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
diff --git a/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate.cc b/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate.cc index 2e0a004..e7fe4c9 100644 --- a/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate.cc +++ b/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ssl/security_state_tab_helper.h" @@ -23,7 +24,6 @@ #include "components/omnibox/browser/omnibox_prefs.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/security_interstitials/content/security_interstitial_tab_helper.h" #include "components/security_state/core/security_state.h" #include "content/public/browser/navigation_controller.h"
diff --git a/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate_unittest.cc b/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate_unittest.cc index 0d921cc..3db3a917 100644 --- a/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate_unittest.cc +++ b/chrome/browser/ui/toolbar/chrome_location_bar_model_delegate_unittest.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/test/scoped_feature_list.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/browser.h" @@ -15,7 +16,6 @@ #include "chrome/common/url_constants.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/search_test_utils.h" -#include "components/search/ntp_features.h" #include "components/search_engines/template_url_service.h" // Concrete implementation of ChromeLocationBarModelDelegate.
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble.cc b/chrome/browser/ui/views/accessibility/caption_bubble.cc index 4ee2e10..0d80c97 100644 --- a/chrome/browser/ui/views/accessibility/caption_bubble.cc +++ b/chrome/browser/ui/views/accessibility/caption_bubble.cc
@@ -1,4 +1,4 @@ -// Copyright (c) 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 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. @@ -18,6 +18,7 @@ #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/grit/generated_resources.h" #include "components/vector_icons/vector_icons.h" +#include "content/public/browser/browser_accessibility_state.h" #include "third_party/re2/src/re2/re2.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" @@ -471,22 +472,12 @@ frame_->UpdateFocusRing(false); } -// TODO(crbug.com/1055150): Determine how this should be best exposed for screen -// readers without over-verbalizing. Currently it reads the full text when -// focused and does not announce when text changes. void CaptionBubble::GetAccessibleNodeData(ui::AXNodeData* node_data) { - if (model_ && model_->HasError()) { - node_data->SetName(error_text_->GetText()); - node_data->SetNameFrom(ax::mojom::NameFrom::kContents); - } else if (model_ && !model_->GetFullText().empty()) { - node_data->SetName(model_->GetFullText()); - node_data->SetNameFrom(ax::mojom::NameFrom::kContents); - } else { - node_data->SetName(title_->GetText()); - node_data->SetNameFrom(ax::mojom::NameFrom::kContents); - } - node_data->SetDescription(title_->GetText()); + node_data->SetName(title_->GetText()); node_data->role = ax::mojom::Role::kCaption; + if (model_ && model_->HasError()) { + node_data->SetDescription(error_text_->GetText()); + } } void CaptionBubble::AddedToWidget() { @@ -533,8 +524,67 @@ void CaptionBubble::OnTextChanged() { DCHECK(model_); - label_->SetText(base::UTF8ToUTF16(model_->GetFullText())); + std::string text = model_->GetFullText(); + label_->SetText(base::UTF8ToUTF16(text)); UpdateBubbleAndTitleVisibility(); + + // Only update ViewAccessibility if accessibility is enabled. + if (content::BrowserAccessibilityState::GetInstance() + ->GetAccessibilityMode() + .is_mode_off() || + model_->HasError()) { + return; + } + + auto& virtual_children = GetViewAccessibility().virtual_children(); + if (text.empty() && !virtual_children.empty()) { + GetViewAccessibility().RemoveAllVirtualChildViews(); + return; + } + + const size_t num_lines = GetNumLinesInLabel(); + size_t start = 0; + for (size_t i = 0; i < num_lines - 1; ++i) { + size_t end = GetTextIndexOfLineInLabel(i + 1); + std::string substring = text.substr(start, end - start); + AddVirtualChildView(substring, i, gfx::Range(start, end)); + start = end; + } + std::string substring = text.substr(start, text.size() - start); + if (!substring.empty()) { + AddVirtualChildView(substring, num_lines - 1, + gfx::Range(start, text.size())); + } + + // Remove all virtual children that don't have a corresponding line. + size_t num_virtual_children = virtual_children.size(); + for (size_t i = num_lines; i < num_virtual_children; ++i) { + GetViewAccessibility().RemoveVirtualChildView( + virtual_children.back().get()); + } +} + +void CaptionBubble::AddVirtualChildView(const std::string& name, + const size_t line_index, + const gfx::Range& range) { + auto& virtual_children = GetViewAccessibility().virtual_children(); + + // Add a new virtual child for a new line of text. + DCHECK(line_index <= virtual_children.size()); + if (line_index == virtual_children.size()) { + auto view = std::make_unique<views::AXVirtualView>(); + GetViewAccessibility().AddVirtualChildView(std::move(view)); + } + + // Set the virtual child's name as the content of the line. + ui::AXNodeData& ax_node_data = virtual_children[line_index]->GetCustomData(); + if (ax_node_data.GetStringAttribute(ax::mojom::StringAttribute::kName) != + name) { + ax_node_data.SetName(name); + std::vector<gfx::Rect> bounds = label_->GetSubstringBounds(range); + DCHECK_EQ(bounds.size(), 1u); + ax_node_data.relative_bounds.bounds = gfx::RectF(bounds[0]); + } } void CaptionBubble::OnErrorChanged() { @@ -545,6 +595,14 @@ // The error is only 1 line, so redraw the bubble. Redraw(); + + if (has_error && + !content::BrowserAccessibilityState::GetInstance() + ->GetAccessibilityMode() + .is_mode_off() && + !GetViewAccessibility().virtual_children().empty()) { + GetViewAccessibility().RemoveAllVirtualChildViews(); + } } void CaptionBubble::OnIsExpandedChanged() { @@ -671,4 +729,14 @@ return base::UTF16ToUTF8(label_->GetText()); } +std::vector<std::string> CaptionBubble::GetVirtualChildrenTextForTesting() { + auto& virtual_children = GetViewAccessibility().virtual_children(); + std::vector<std::string> texts; + for (auto& virtual_child : virtual_children) { + texts.push_back(virtual_child->GetCustomData().GetStringAttribute( + ax::mojom::StringAttribute::kName)); + } + return texts; +} + } // namespace captions
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble.h b/chrome/browser/ui/views/accessibility/caption_bubble.h index df2e3d9b..81e3436 100644 --- a/chrome/browser/ui/views/accessibility/caption_bubble.h +++ b/chrome/browser/ui/views/accessibility/caption_bubble.h
@@ -1,4 +1,4 @@ -// Copyright (c) 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 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. @@ -7,6 +7,7 @@ #include <memory> #include <string> +#include <vector> #include "chrome/browser/ui/views/accessibility/caption_bubble_model.h" #include "ui/native_theme/caption_style.h" @@ -122,6 +123,10 @@ views::Button::PressedCallback callback, const gfx::VectorIcon& icon, const int tooltip_text_id); + void AddVirtualChildView(const std::string& name, + const size_t i, + const gfx::Range& range); + std::vector<std::string> GetVirtualChildrenTextForTesting(); // Unowned. Owned by views hierarchy. views::Label* label_;
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc index cd5c6ff..ab2c8ef 100644 --- a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc +++ b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
@@ -1,4 +1,4 @@ -// Copyright (c) 2020 The Chromium Authors. All rights reserved. +// Copyright 2020 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. @@ -18,6 +18,7 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/browser_accessibility_state.h" #include "content/public/test/browser_test.h" #include "ui/events/base_event_utils.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -152,6 +153,10 @@ browser()->tab_strip_model()->GetWebContentsAt(tab_index)); } + std::vector<std::string> GetVirtualChildrenText() { + return GetBubble()->GetVirtualChildrenTextForTesting(); + } + private: std::unique_ptr<CaptionBubbleControllerViews> controller_; }; @@ -871,4 +876,142 @@ EXPECT_EQ("猫も大丈夫", GetLabelText()); } +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextComputedWhenAccessibilityModeEnabled) { + // If accessibility is disabled, virtual children aren't computed. + content::BrowserAccessibilityState::GetInstance()->DisableAccessibility(); + OnFinalTranscription("A dog's nose print"); + EXPECT_EQ(0u, GetVirtualChildrenText().size()); + + // When accessibility is enabled, virtual children are computed. + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnFinalTranscription("is unique"); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("A dog's nose print is unique", GetVirtualChildrenText()[0]); + + // When accessibility is disabled, virtual children are no longer being + // updated. + content::BrowserAccessibilityState::GetInstance()->DisableAccessibility(); + OnFinalTranscription("like a fingerprint"); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("A dog's nose print is unique", GetVirtualChildrenText()[0]); +} + +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextSplitsIntoNodesByLine) { + // Make a line of 500 characters. + std::string line(499, 'a'); + line.push_back(' '); + + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnPartialTranscription(line); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ(line, GetVirtualChildrenText()[0]); + OnPartialTranscription(line + line); + EXPECT_EQ(2u, GetVirtualChildrenText().size()); + EXPECT_EQ(line, GetVirtualChildrenText()[0]); + EXPECT_EQ(line, GetVirtualChildrenText()[1]); + OnPartialTranscription(line); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ(line, GetVirtualChildrenText()[0]); +} + +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextClearsWhenBubbleCloses) { + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnFinalTranscription("Dogs' noses are wet to help them smell."); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("Dogs' noses are wet to help them smell.", + GetVirtualChildrenText()[0]); + ClickButton(GetCloseButton()); + EXPECT_EQ(0u, GetVirtualChildrenText().size()); +} + +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextClearsWhenTabRefreshes) { + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnFinalTranscription("Newfoundlands are amazing lifeguards."); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("Newfoundlands are amazing lifeguards.", + GetVirtualChildrenText()[0]); + chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); + content::WaitForLoadStop( + browser()->tab_strip_model()->GetActiveWebContents()); + EXPECT_EQ(0u, GetVirtualChildrenText().size()); +} + +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextChangesWhenTabChanges) { + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnFinalTranscription("3 dogs survived the Titanic sinking."); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("3 dogs survived the Titanic sinking.", + GetVirtualChildrenText()[0]); + + InsertNewTab(); + ActivateTabAt(1); + OnFinalTranscription("30% of Dalmations are deaf in one ear.", 1); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("30% of Dalmations are deaf in one ear.", + GetVirtualChildrenText()[0]); + + ActivateTabAt(0); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("3 dogs survived the Titanic sinking. ", + GetVirtualChildrenText()[0]); +} + +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextClearsOnError) { + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnFinalTranscription("The Saluki is the oldest dog breed."); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("The Saluki is the oldest dog breed.", GetVirtualChildrenText()[0]); + OnError(); + EXPECT_EQ(0u, GetVirtualChildrenText().size()); + + // Clear the error by refreshing. + chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); + content::WaitForLoadStop( + browser()->tab_strip_model()->GetActiveWebContents()); + + OnFinalTranscription("Chow Chows have black tongues."); + EXPECT_EQ(1u, GetVirtualChildrenText().size()); + EXPECT_EQ("Chow Chows have black tongues.", GetVirtualChildrenText()[0]); +} + +IN_PROC_BROWSER_TEST_F(CaptionBubbleControllerViewsTest, + AccessibleTextTruncates) { + // Make a string with 30 lines of 500 characters each. + std::string text; + std::string line(497, 'a'); + for (int i = 10; i < 40; i++) { + text += base::NumberToString(i) + line + " "; + } + content::BrowserAccessibilityState::GetInstance()->EnableAccessibility(); + OnFinalTranscription(text); + EXPECT_EQ(9u, GetVirtualChildrenText().size()); + for (int i = 0; i < 9; i++) { + EXPECT_EQ(base::NumberToString(i + 31) + line + " ", + GetVirtualChildrenText()[i]); + } + OnPartialTranscription(text); + EXPECT_EQ(39u, GetVirtualChildrenText().size()); + for (int i = 0; i < 9; i++) { + EXPECT_EQ(base::NumberToString(i + 31) + line + " ", + GetVirtualChildrenText()[i]); + } + for (int i = 10; i < 40; i++) { + EXPECT_EQ(base::NumberToString(i) + line + " ", + GetVirtualChildrenText()[i - 1]); + } + OnFinalTranscription("a "); + EXPECT_EQ(9u, GetVirtualChildrenText().size()); + for (int i = 0; i < 8; i++) { + EXPECT_EQ(base::NumberToString(i + 32) + line + " ", + GetVirtualChildrenText()[i]); + } + EXPECT_EQ("a ", GetVirtualChildrenText()[8]); +} + } // namespace captions
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc index 7e7e76c2..059f8f43 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -415,16 +415,16 @@ } void BrowserNonClientFrameViewAsh::OnTabletStateChanged( - chromeos::TabletState::State state) { + display::TabletState state) { switch (state) { - case chromeos::TabletState::State::kInTabletMode: + case display::TabletState::kInTabletMode: OnTabletModeToggled(true); return; - case chromeos::TabletState::State::kInClamshellMode: + case display::TabletState::kInClamshellMode: OnTabletModeToggled(false); return; - case chromeos::TabletState::State::kEnteringTabletMode: - case chromeos::TabletState::State::kExitingTabletMode: + case display::TabletState::kEnteringTabletMode: + case display::TabletState::kExitingTabletMode: break; } }
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h index 795725b..830b9c2 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -18,6 +18,7 @@ #include "chromeos/ui/base/tablet_state.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" +#include "ui/display/tablet_state.h" namespace { class WebAppNonClientFrameViewAshTest; @@ -82,7 +83,7 @@ gfx::ImageSkia GetFrameHeaderOverlayImage(bool active) override; // chromeos::TabletState::Observer: - void OnTabletStateChanged(chromeos::TabletState::State) override; + void OnTabletStateChanged(display::TabletState state) override; void OnTabletModeToggled(bool enabled);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 4c56abd..ba390892 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -3440,8 +3440,12 @@ focus_first_profile_button); } -void BrowserView::ShowHatsBubble(const std::string& site_id) { - HatsBubbleView::ShowOnContentReady(browser(), site_id); +void BrowserView::ShowHatsBubble(const std::string& site_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) { + HatsBubbleView::ShowOnContentReady(browser(), site_id, + std::move(success_callback), + std::move(failure_callback)); } ExclusiveAccessContext* BrowserView::GetExclusiveAccessContext() {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 4e3be78..5af4987 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -468,7 +468,9 @@ AvatarBubbleMode mode, signin_metrics::AccessPoint access_point, bool is_source_keyboard) override; - void ShowHatsBubble(const std::string& site_id) override; + void ShowHatsBubble(const std::string& site_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) override; ExclusiveAccessContext* GetExclusiveAccessContext() override; std::string GetWorkspace() const override; bool IsVisibleOnAllWorkspaces() const override;
diff --git a/chrome/browser/ui/views/hats/hats_browsertest.cc b/chrome/browser/ui/views/hats/hats_browsertest.cc index 9677aea..8f81c44 100644 --- a/chrome/browser/ui/views/hats/hats_browsertest.cc +++ b/chrome/browser/ui/views/hats/hats_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/files/file_util.h" #include "base/path_service.h" #include "base/run_loop.h" +#include "base/test/bind_test_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h" @@ -40,7 +41,7 @@ void ShowUi(const std::string& name) override { ASSERT_TRUE(browser()->is_type_normal()); BrowserView::GetBrowserViewForBrowser(InProcessBrowserTest::browser()) - ->ShowHatsBubble("test_site_id"); + ->ShowHatsBubble("test_site_id", base::DoNothing(), base::DoNothing()); } private: @@ -195,8 +196,15 @@ MockHatsNextWebDialog(Browser* browser, const std::string& trigger_id, const GURL& hats_survey_url, - const base::TimeDelta& timeout) - : HatsNextWebDialog(browser, trigger_id, hats_survey_url, timeout) {} + const base::TimeDelta& timeout, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) + : HatsNextWebDialog(browser, + trigger_id, + hats_survey_url, + timeout, + std::move(success_callback), + std::move(failure_callback)) {} MOCK_METHOD0(ShowWidget, void()); MOCK_METHOD0(CloseWidget, void()); @@ -235,6 +243,17 @@ MockHatsService* hats_service() { return hats_service_; } + base::OnceClosure GetSuccessClosure() { + return base::BindLambdaForTesting([&]() { ++success_count; }); + } + + base::OnceClosure GetFailureClosure() { + return base::BindLambdaForTesting([&]() { ++failure_count; }); + } + + int success_count = 0; + int failure_count = 0; + private: base::test::ScopedFeatureList feature_list_; MockHatsService* hats_service_; @@ -254,7 +273,8 @@ auto* dialog = new MockHatsNextWebDialog( browser(), kHatsNextSurveyTriggerIDTesting, embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), GetSuccessClosure(), + GetFailureClosure()); // Check that no record of a survey being shown is present. const base::DictionaryValue* pref_data = @@ -277,6 +297,9 @@ })); run_loop.Run(); + EXPECT_EQ(1, success_count); + EXPECT_EQ(0, failure_count); + // Check that a record of the survey being shown has been recorded. pref_data = browser()->profile()->GetPrefs()->GetDictionary( prefs::kHatsSurveyMetadata); @@ -299,12 +322,16 @@ auto* dialog = new MockHatsNextWebDialog( browser(), "close_for_testing", embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), GetSuccessClosure(), + GetFailureClosure()); // The hats_next_mock.html will provide a state update to the dialog to // indicate that the survey window should be closed. dialog->WaitForClose(); + EXPECT_EQ(0, success_count); + EXPECT_EQ(1, failure_count); + // Because no loaded state was provided, only a rejection should be recorded. histogram_tester.ExpectUniqueSample( kHatsShouldShowSurveyReasonHistogram, @@ -321,9 +348,13 @@ auto* dialog = new MockHatsNextWebDialog( browser(), kHatsNextSurveyTriggerIDTesting, embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), GetSuccessClosure(), + GetFailureClosure()); dialog->WaitForClose(); + EXPECT_EQ(1, success_count); + EXPECT_EQ(0, failure_count); + // The only recorded sample should indicate that the survey was shown. histogram_tester.ExpectUniqueSample( kHatsShouldShowSurveyReasonHistogram, @@ -340,9 +371,13 @@ auto* dialog = new MockHatsNextWebDialog( browser(), "invalid_test", embedded_test_server()->GetURL("/hats/non_existent.html"), - base::TimeDelta::FromMilliseconds(1)); + base::TimeDelta::FromMilliseconds(1), GetSuccessClosure(), + GetFailureClosure()); dialog->WaitForClose(); + + EXPECT_EQ(0, success_count); + EXPECT_EQ(1, failure_count); histogram_tester.ExpectUniqueSample( kHatsShouldShowSurveyReasonHistogram, HatsService::ShouldShowSurveyReasons::kNoSurveyUnreachable, 1); @@ -357,9 +392,12 @@ auto* dialog = new MockHatsNextWebDialog( browser(), "invalid_url_fragment_for_testing", embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), GetSuccessClosure(), + GetFailureClosure()); dialog->WaitForClose(); + EXPECT_EQ(0, success_count); + EXPECT_EQ(1, failure_count); } IN_PROC_BROWSER_TEST_F(HatsNextWebDialogBrowserTest, NewWebContents) { @@ -368,7 +406,7 @@ auto* dialog = new MockHatsNextWebDialog( browser(), "open_new_web_contents_for_testing", embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing()); // The mock hats dialog will push a close state after it has attempted to // open another web contents. @@ -388,7 +426,7 @@ auto* dialog = new MockHatsNextWebDialog( browser(), "resize_for_testing", embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing()); // Check that the dialog reports a preferred size the same as the size defined // in hats_next_mock.html. @@ -412,7 +450,7 @@ auto* dialog = new MockHatsNextWebDialog( browser(), "resize_to_large_for_testing", embedded_test_server()->GetURL("/hats/hats_next_mock.html"), - base::TimeDelta::FromSeconds(100)); + base::TimeDelta::FromSeconds(100), base::DoNothing(), base::DoNothing()); // Check that the maximum size of the dialog is bounded appropriately by the // dialogs maximum size. Depending on renderer warm-up, an initial empty size
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.cc b/chrome/browser/ui/views/hats/hats_bubble_view.cc index a893b3a6c..627cae0 100644 --- a/chrome/browser/ui/views/hats/hats_bubble_view.cc +++ b/chrome/browser/ui/views/hats/hats_bubble_view.cc
@@ -61,7 +61,9 @@ // static void HatsBubbleView::ShowOnContentReady(Browser* browser, - const std::string& site_id) { + const std::string& site_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) { if (site_id == "test_site_id") { // Directly show the bubble during tests. HatsBubbleView::Show(browser, base::DoNothing()); @@ -75,7 +77,8 @@ if (base::FeatureList::IsEnabled( features::kHappinessTrackingSurveysForDesktopMigration)) { // Self deleting on close. - new HatsNextWebDialog(browser, site_id); + new HatsNextWebDialog(browser, site_id, std::move(success_callback), + std::move(failure_callback)); } else { HatsWebDialog::Create(browser, site_id); }
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.h b/chrome/browser/ui/views/hats/hats_bubble_view.h index 66a0d2c3..7bfc060b 100644 --- a/chrome/browser/ui/views/hats/hats_bubble_view.h +++ b/chrome/browser/ui/views/hats/hats_bubble_view.h
@@ -40,7 +40,10 @@ static views::BubbleDialogDelegateView* GetHatsBubble(); // Shows the bubble when the survey content identified by |site_id| is ready. - static void ShowOnContentReady(Browser* browser, const std::string& site_id); + static void ShowOnContentReady(Browser* browser, + const std::string& site_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback); // Shows the bubble now with supplied callback |consent_callback|. static void Show(Browser* browser, HatsConsentCallback consent_callback);
diff --git a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc index b2c75657..c78d570 100644 --- a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc +++ b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
@@ -101,12 +101,16 @@ }; HatsNextWebDialog::HatsNextWebDialog(Browser* browser, - const std::string& trigger_id) + const std::string& trigger_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) : HatsNextWebDialog( browser, trigger_id, GURL("https://storage.googleapis.com/chrome_hats_staging/index.html"), - base::TimeDelta::FromSeconds(10)) {} + base::TimeDelta::FromSeconds(10), + std::move(success_callback), + std::move(failure_callback)) {} gfx::Size HatsNextWebDialog::CalculatePreferredSize() const { gfx::Size preferred_size = views::View::CalculatePreferredSize(); @@ -123,7 +127,9 @@ HatsNextWebDialog::HatsNextWebDialog(Browser* browser, const std::string& trigger_id, const GURL& hats_survey_url, - const base::TimeDelta& timeout) + const base::TimeDelta& timeout, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) : BubbleDialogDelegateView(BrowserView::GetBrowserViewForBrowser(browser) ->toolbar_button_provider() ->GetAppMenuButton(), @@ -133,7 +139,9 @@ browser_(browser), trigger_id_(trigger_id), hats_survey_url_(hats_survey_url), - timeout_(timeout) { + timeout_(timeout), + success_callback_(std::move(success_callback)), + failure_callback_(std::move(failure_callback)) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); otr_profile_->AddObserver(this); set_close_on_deactivate(false); @@ -184,6 +192,7 @@ kHatsShouldShowSurveyReasonHistogram, HatsService::ShouldShowSurveyReasons::kNoSurveyUnreachable); CloseWidget(); + std::move(failure_callback_).Run(); } void HatsNextWebDialog::OnSurveyStateUpdateReceived(std::string state) { @@ -197,6 +206,7 @@ service->RecordSurveyAsShown(trigger_id_); received_survey_loaded_ = true; ShowWidget(); + std::move(success_callback_).Run(); } else if (state == "close") { if (!received_survey_loaded_) { // Receiving a close state prior to a loaded state indicates that contact @@ -206,12 +216,14 @@ base::UmaHistogramEnumeration( kHatsShouldShowSurveyReasonHistogram, HatsService::ShouldShowSurveyReasons::kNoRejectedByHatsService); + std::move(failure_callback_).Run(); } CloseWidget(); } else { LOG(ERROR) << "Unknown state provided in URL fragment by HaTS survey:" << state; CloseWidget(); + std::move(failure_callback_).Run(); } }
diff --git a/chrome/browser/ui/views/hats/hats_next_web_dialog.h b/chrome/browser/ui/views/hats/hats_next_web_dialog.h index efeb014..93e9c42 100644 --- a/chrome/browser/ui/views/hats/hats_next_web_dialog.h +++ b/chrome/browser/ui/views/hats/hats_next_web_dialog.h
@@ -29,7 +29,10 @@ public content::WebContentsDelegate, public ProfileObserver { public: - HatsNextWebDialog(Browser* browser, const std::string& trigger_id); + HatsNextWebDialog(Browser* browser, + const std::string& trigger_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback); ~HatsNextWebDialog() override; HatsNextWebDialog(const HatsNextWebDialog&) = delete; HatsNextWebDialog& operator=(const HatsNextWebDialog&) = delete; @@ -49,7 +52,9 @@ HatsNextWebDialog(Browser* browser, const std::string& trigger_id, const GURL& hats_survey_url_, - const base::TimeDelta& timeout); + const base::TimeDelta& timeout, + base::OnceClosure success_callback, + base::OnceClosure failure_callback); class HatsWebView; @@ -114,6 +119,9 @@ base::TimeDelta timeout_; + base::OnceClosure success_callback_; + base::OnceClosure failure_callback_; + base::WeakPtrFactory<HatsNextWebDialog> weak_factory_{this}; };
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 4d932c7..33ca8f1 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -24,6 +24,7 @@ #include "chrome/browser/media/media_engagement_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/suggestions/suggestions_ui.h" #include "chrome/browser/ui/chrome_select_file_policy.h" #include "chrome/browser/ui/webui/about_ui.h" @@ -90,7 +91,6 @@ #include "components/safe_browsing/buildflags.h" #include "components/safe_browsing/content/web_ui/safe_browsing_ui.h" #include "components/safe_browsing/core/web_ui/constants.h" -#include "components/search/ntp_features.h" #include "components/security_interstitials/content/connection_help_ui.h" #include "components/security_interstitials/content/known_interception_disclosure_ui.h" #include "components/security_interstitials/content/urls.h"
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc index a9d2166..861f8c8 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
@@ -184,6 +184,9 @@ auto third_party_disclosure_ui = consent_ui.third_party_disclosure_ui(); base::Value dictionary(base::Value::Type::DICTIONARY); + dictionary.SetKey("activityControlNeeded", + base::Value(activity_control_needed)); + // Add activity control string constants. if (activity_control_needed) { scoped_refptr<base::RefCountedMemory> image =
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h index 166a1014..ad7cb77 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h
@@ -37,6 +37,9 @@ VOICE_MATCH_ENROLLMENT_DONE = 13, VOICE_MATCH_ENROLLMENT_SKIPPED = 14, VOICE_MATCH_ENROLLMENT_ERROR = 15, + RELATED_INFO_SHOWN = 16, + RELATED_INFO_ACCEPTED = 17, + RELATED_INFO_SKIPPED = 18, // Magic constant used by the histogram macros. kMaxValue = VOICE_MATCH_ENROLLMENT_ERROR };
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc index 0b3cd2c..4664221 100644 --- a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -74,6 +74,17 @@ builder->Add("assistantOptinSkipButton", IDS_ASSISTANT_OPT_IN_SKIP_BUTTON); builder->Add("assistantOptinRetryButton", IDS_ASSISTANT_OPT_IN_RETRY_BUTTON); builder->Add("assistantUserImage", IDS_ASSISTANT_OOBE_USER_IMAGE); + builder->Add("assistantRelatedInfoTitle", + IDS_ASSISTANT_RELATED_INFO_SCREEN_TITLE); + builder->Add("assistantRelatedInfoMessage", + IDS_ASSISTANT_RELATED_INFO_SCREEN_MESSAGE); + builder->Add("assistantRelatedInfoReturnedUserTitle", + IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_TITLE); + builder->Add("assistantRelatedInfoReturnedUserMessage", + IDS_ASSISTANT_RELATED_INFO_SCREEN_RETURNED_USER_MESSAGE); + builder->Add("assistantScreenContextTitle", + IDS_ASSISTANT_SCREEN_CONTEXT_TITLE); + builder->Add("assistantScreenContextDesc", IDS_ASSISTANT_SCREEN_CONTEXT_DESC); builder->Add("assistantVoiceMatchTitle", IDS_ASSISTANT_VOICE_MATCH_TITLE); builder->Add("assistantVoiceMatchMessage", IDS_ASSISTANT_VOICE_MATCH_MESSAGE); builder->Add("assistantVoiceMatchNoDspMessage", @@ -122,6 +133,9 @@ "login.AssistantOptInFlowScreen.ValuePropScreen.userActed", &AssistantOptInFlowScreenHandler::HandleValuePropScreenUserAction); AddCallback( + "login.AssistantOptInFlowScreen.RelatedInfoScreen.userActed", + &AssistantOptInFlowScreenHandler::HandleRelatedInfoScreenUserAction); + AddCallback( "login.AssistantOptInFlowScreen.ThirdPartyScreen.userActed", &AssistantOptInFlowScreenHandler::HandleThirdPartyScreenUserAction); AddCallback( @@ -131,6 +145,8 @@ &AssistantOptInFlowScreenHandler::HandleGetMoreScreenUserAction); AddCallback("login.AssistantOptInFlowScreen.ValuePropScreen.screenShown", &AssistantOptInFlowScreenHandler::HandleValuePropScreenShown); + AddCallback("login.AssistantOptInFlowScreen.RelatedInfoScreen.screenShown", + &AssistantOptInFlowScreenHandler::HandleRelatedInfoScreenShown); AddCallback("login.AssistantOptInFlowScreen.ThirdPartyScreen.screenShown", &AssistantOptInFlowScreenHandler::HandleThirdPartyScreenShown); AddCallback("login.AssistantOptInFlowScreen.VoiceMatchScreen.screenShown", @@ -151,6 +167,8 @@ dict->SetBoolean("deviceHasNoBattery", !DeviceHasBattery()); dict->SetBoolean("voiceMatchDisabled", chromeos::assistant::features::IsVoiceMatchDisabled()); + dict->SetBoolean("betterAssistantEnabled", + chromeos::assistant::features::IsBetterAssistantEnabled()); BaseScreenHandler::GetAdditionalParameters(dict); } @@ -254,6 +272,14 @@ } } +void AssistantOptInFlowScreenHandler::OnScreenContextOptInResult( + bool opted_in) { + RecordAssistantOptInStatus(opted_in ? RELATED_INFO_ACCEPTED + : RELATED_INFO_SKIPPED); + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetBoolean(assistant::prefs::kAssistantContextEnabled, opted_in); +} + void AssistantOptInFlowScreenHandler::OnEmailOptInResult(bool opted_in) { if (!email_optin_needed_) { DCHECK(!opted_in); @@ -499,6 +525,17 @@ } } +void AssistantOptInFlowScreenHandler::HandleRelatedInfoScreenUserAction( + const std::string& action) { + if (action == kSkipPressed) { + OnScreenContextOptInResult(false); + ShowNextScreen(); + } else if (action == kNextPressed) { + OnScreenContextOptInResult(true); + ShowNextScreen(); + } +} + void AssistantOptInFlowScreenHandler::HandleThirdPartyScreenUserAction( const std::string& action) { if (action == kNextPressed) { @@ -550,6 +587,10 @@ RecordAssistantOptInStatus(ACTIVITY_CONTROL_SHOWN); } +void AssistantOptInFlowScreenHandler::HandleRelatedInfoScreenShown() { + RecordAssistantOptInStatus(RELATED_INFO_SHOWN); +} + void AssistantOptInFlowScreenHandler::HandleThirdPartyScreenShown() { RecordAssistantOptInStatus(THIRD_PARTY_SHOWN); }
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h index 1c3af8a..febf7be 100644 --- a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h
@@ -86,6 +86,7 @@ // Handle user opt-in result. void OnActivityControlOptInResult(bool opted_in); + void OnScreenContextOptInResult(bool opted_in); void OnEmailOptInResult(bool opted_in); // Called when the UI dialog is closed. @@ -116,11 +117,13 @@ // Handler for JS WebUI message. void HandleValuePropScreenUserAction(const std::string& action); + void HandleRelatedInfoScreenUserAction(const std::string& action); void HandleThirdPartyScreenUserAction(const std::string& action); void HandleVoiceMatchScreenUserAction(const std::string& action); void HandleGetMoreScreenUserAction(const bool screen_context, const bool email_opted_in); void HandleValuePropScreenShown(); + void HandleRelatedInfoScreenShown(); void HandleThirdPartyScreenShown(); void HandleVoiceMatchScreenShown(); void HandleGetMoreScreenShown();
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc index a297c46..34fc8397 100644 --- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -426,6 +426,11 @@ IDS_ENTERPRISE_ENROLLMENT_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED, true); break; + case policy::DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: + ShowError( + IDS_ENTERPRISE_ENROLLMENT_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE, + true); + break; default: ShowErrorMessage( l10n_util::GetStringFUTF8(
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index f8cb27b..fb83366 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -1399,6 +1399,7 @@ scoped_refptr<input_method::InputMethodManager::State> gaia_ime_state = imm->GetActiveIMEState()->Clone(); imm->SetState(gaia_ime_state); + gaia_ime_state->SetUIStyle(input_method::InputMethodManager::UIStyle::kLogin); // Set Least Recently Used input method for the user. if (populated_account_id_.is_valid()) {
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc index cf1f33ed..1c6f2827 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -34,6 +34,7 @@ #include "chrome/browser/search/background/ntp_background_service.h" #include "chrome/browser/search/background/ntp_background_service_factory.h" #include "chrome/browser/search/instant_service.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/one_google_bar/one_google_bar_service_factory.h" #include "chrome/browser/search/promos/promo_service_factory.h" #include "chrome/browser/search_engines/template_url_service_factory.h" @@ -57,7 +58,6 @@ #include "components/omnibox/browser/omnibox_log.h" #include "components/omnibox/browser/omnibox_prefs.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" #include "components/search_engines/omnibox_focus_type.h" #include "components/search_engines/template_url_service.h" #include "components/search_provider_logos/logo_service.h"
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc index d04253c8e..652e6075 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/recipe_tasks/recipe_tasks_handler.h" #include "chrome/browser/search/shopping_tasks/shopping_tasks_handler.h" #include "chrome/browser/search_engines/template_url_service_factory.h" @@ -34,7 +35,6 @@ #include "chrome/grit/new_tab_page_resources_map.h" #include "components/favicon_base/favicon_url_parser.h" #include "components/google/core/common/google_util.h" -#include "components/search/ntp_features.h" #include "components/search_engines/template_url_service.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc b/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc index 41d892c2..e868748e 100644 --- a/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc +++ b/chrome/browser/ui/webui/new_tab_page/untrusted_source.cc
@@ -20,12 +20,12 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/one_google_bar/one_google_bar_data.h" #include "chrome/browser/search/one_google_bar/one_google_bar_service_factory.h" #include "chrome/browser/ui/search/ntp_user_data_logger.h" #include "chrome/common/url_constants.h" #include "chrome/grit/new_tab_page_resources.h" -#include "components/search/ntp_features.h" #include "content/public/common/url_constants.h" #include "net/base/url_util.h" #include "services/network/public/mojom/content_security_policy.mojom.h"
diff --git a/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc b/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc index bf0b031..2cbf858 100644 --- a/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc +++ b/chrome/browser/ui/webui/new_tab_page/webui_ntp_browsertest.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "components/search/ntp_features.h" #include "content/public/browser/notification_types.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc index 6876354c..286a74f78 100644 --- a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
@@ -11,6 +11,7 @@ #include "ash/public/cpp/ambient/ambient_backend_controller.h" #include "ash/public/cpp/ambient/common/ambient_settings.h" #include "ash/public/cpp/image_downloader.h" +#include "base/barrier_closure.h" #include "base/bind.h" #include "base/callback.h" #include "base/logging.h" @@ -275,7 +276,6 @@ value.SetKey("checked", base::Value(album.selected)); value.SetKey("description", base::Value(GetAlbumDescription(album))); value.SetKey("title", base::Value(album.album_name)); - value.SetKey("url", base::Value(album.png_data_url)); albums.Append(std::move(value)); } break; @@ -288,7 +288,6 @@ value.SetKey("checked", base::Value(setting.enabled)); value.SetKey("description", base::Value(setting.description)); value.SetKey("title", base::Value(setting.title)); - value.SetKey("url", base::Value(setting.png_data_url)); albums.Append(std::move(value)); } break; @@ -312,6 +311,32 @@ FireWebUIListener("album-preview-changed", std::move(album)); } +void AmbientModeHandler::SendRecentHighlightsPreviews() { + if (!FindPersonalAlbumById(ash::kAmbientModeRecentHighlightsAlbumId)) + return; + + base::Value png_data_urls(base::Value::Type::LIST); + for (const auto& image : recent_highlights_preview_images_) { + if (image.isNull()) + continue; + + std::vector<unsigned char> encoded_image_bytes; + EncodeImage(image, &encoded_image_bytes); + if (!encoded_image_bytes.empty()) { + png_data_urls.Append(base::Value(webui::GetPngDataUrl( + &encoded_image_bytes.front(), encoded_image_bytes.size()))); + } + } + + base::Value album(base::Value::Type::DICTIONARY); + album.SetKey("albumId", + base::Value(ash::kAmbientModeRecentHighlightsAlbumId)); + album.SetKey("topicSource", base::Value(static_cast<int>( + ash::AmbientModeTopicSource::kGooglePhotos))); + album.SetKey("recentHighlightsUrls", std::move(png_data_urls)); + FireWebUIListener("album-preview-changed", std::move(album)); +} + void AmbientModeHandler::UpdateSettings() { // Prevent fetch settings callback changing |settings_| and |personal_albums_| // while updating. @@ -516,6 +541,11 @@ // TODO(b/163413738): Slow down the downloading when there are too many // albums. for (const auto& album : personal_albums_.albums) { + if (album.album_id == ash::kAmbientModeRecentHighlightsAlbumId) { + DownloadRecentHighlightsPreviewImages(album.preview_image_urls); + continue; + } + ash::ImageDownloader::Get()->Download( GURL(album.banner_image_url), NO_TRAFFIC_ANNOTATION_YET, base::BindOnce(&AmbientModeHandler::OnAlbumPreviewImageDownloaded, @@ -561,6 +591,40 @@ encoded_image_bytes.size())); } +void AmbientModeHandler::DownloadRecentHighlightsPreviewImages( + const std::vector<std::string>& urls) { + recent_highlights_previews_weak_factory_.InvalidateWeakPtrs(); + + // Only show up to 4 previews. + constexpr int kMaxRecentHighlightsPreviews = 4; + const int total_previews = + std::min(kMaxRecentHighlightsPreviews, static_cast<int>(urls.size())); + recent_highlights_preview_images_.resize(total_previews); + auto on_done = base::BarrierClosure( + total_previews, + base::BindOnce(&AmbientModeHandler::SendRecentHighlightsPreviews, + recent_highlights_previews_weak_factory_.GetWeakPtr())); + + for (int url_index = 0; url_index < total_previews; ++url_index) { + const auto& url = urls[url_index]; + ash::ImageDownloader::Get()->Download( + GURL(url), NO_TRAFFIC_ANNOTATION_YET, + base::BindOnce( + [](std::vector<gfx::ImageSkia>* preview_images, int url_index, + base::RepeatingClosure on_done, + base::WeakPtr<AmbientModeHandler> weak_ptr, + const gfx::ImageSkia& image) { + if (!weak_ptr) + return; + + (*preview_images)[url_index] = image; + on_done.Run(); + }, + &recent_highlights_preview_images_, url_index, on_done, + recent_highlights_previews_weak_factory_.GetWeakPtr())); + } +} + ash::PersonalAlbum* AmbientModeHandler::FindPersonalAlbumById( const std::string& album_id) { auto it = std::find_if(
diff --git a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h index 10986d0..13d8f5d 100644 --- a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h
@@ -75,6 +75,10 @@ const std::string& album_id, std::string&& png_data_url); + // Send the "album-preview-changed" WebUIListener event with Recent Highlights + // previews in the |topic_source|. + void SendRecentHighlightsPreviews(); + // Update the local |settings_| to server. void UpdateSettings(); @@ -112,6 +116,8 @@ void MaybeUpdateTopicSource(ash::AmbientModeTopicSource topic_source); void DownloadAlbumPreviewImage(ash::AmbientModeTopicSource topic_source); + void DownloadRecentHighlightsPreviewImages( + const std::vector<std::string>& urls); void OnAlbumPreviewImageDownloaded(ash::AmbientModeTopicSource topic_source, const std::string& album_id, @@ -154,8 +160,12 @@ // Backoff retries for UpdateSettings(). net::BackoffEntry update_settings_retry_backoff_; + std::vector<gfx::ImageSkia> recent_highlights_preview_images_; + base::WeakPtrFactory<AmbientModeHandler> backend_weak_factory_{this}; base::WeakPtrFactory<AmbientModeHandler> ui_update_weak_factory_{this}; + base::WeakPtrFactory<AmbientModeHandler> + recent_highlights_previews_weak_factory_{this}; }; } // namespace settings
diff --git a/chrome/browser/ui/webui/webui_util.cc b/chrome/browser/ui/webui/webui_util.cc index 6dea85d..f4b8af5 100644 --- a/chrome/browser/ui/webui/webui_util.cc +++ b/chrome/browser/ui/webui/webui_util.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/webui/webui_util.h" #include "build/build_config.h" +#include "chrome/common/buildflags.h" #include "content/public/browser/web_ui_data_source.h" #include "services/network/public/mojom/content_security_policy.mojom.h" #include "ui/base/webui/web_ui_util.h" @@ -56,6 +57,17 @@ source->AddResourcePath("", default_resource); } +#if BUILDFLAG(OPTIMIZE_WEBUI) +void SetupBundledWebUIDataSource(content::WebUIDataSource* source, + base::StringPiece bundled_path, + int bundle, + int default_resource) { + SetupPolymer3Defaults(source); + source->AddResourcePath(bundled_path, bundle); + source->AddResourcePath("", default_resource); +} +#endif + void AddLocalizedStringsBulk(content::WebUIDataSource* html_source, base::span<const LocalizedString> strings) { for (const auto& str : strings)
diff --git a/chrome/browser/ui/webui/webui_util.h b/chrome/browser/ui/webui/webui_util.h index 79148416..86c42db 100644 --- a/chrome/browser/ui/webui/webui_util.h +++ b/chrome/browser/ui/webui/webui_util.h
@@ -9,6 +9,7 @@ #include "base/containers/span.h" #include "base/strings/string_piece.h" +#include "chrome/common/buildflags.h" struct GritResourceMap; @@ -34,6 +35,15 @@ const std::string& generated_path, int default_resource); +#if BUILDFLAG(OPTIMIZE_WEBUI) +// Same as SetupWebUIDataSource, but for a bundled page; this adds only the +// bundle and the default resource to |source|. +void SetupBundledWebUIDataSource(content::WebUIDataSource* source, + base::StringPiece bundled_path, + int bundle, + int default_resource); +#endif + // Calls content::WebUIDataSource::AddLocalizedString() in a for-loop for // |strings|. Reduces code size vs. reimplementing the same for-loop. void AddLocalizedStringsBulk(content::WebUIDataSource* html_source,
diff --git a/chrome/browser/ui/webui/welcome/helpers.cc b/chrome/browser/ui/webui/welcome/helpers.cc index 52e2eb38..bd99755 100644 --- a/chrome/browser/ui/webui/welcome/helpers.cc +++ b/chrome/browser/ui/webui/welcome/helpers.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/search/ntp_features.h" #include "chrome/browser/search/search.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -30,7 +31,6 @@ #include "components/policy/core/common/policy_service.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" -#include "components/search/ntp_features.h" namespace welcome {
diff --git a/chrome/browser/upgrade_detector/upgrade_detector.cc b/chrome/browser/upgrade_detector/upgrade_detector.cc index e601376..a8232a5 100644 --- a/chrome/browser/upgrade_detector/upgrade_detector.cc +++ b/chrome/browser/upgrade_detector/upgrade_detector.cc
@@ -10,6 +10,7 @@ #include "base/time/tick_clock.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/lifetime/application_lifetime.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_otr_state.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" @@ -207,10 +208,13 @@ void UpgradeDetector::CheckIdle() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Don't proceed while an off-the-record window is open. The timer will still - // keep firing, so this function will get a chance to re-evaluate this. - if (chrome::IsOffTheRecordSessionActive()) + // Don't proceed while an off-the-record or Guest window is open. The timer + // will still keep firing, so this function will get a chance to re-evaluate + // this. + if (chrome::IsOffTheRecordSessionActive() || + BrowserList::GetGuestBrowserCount()) { return; + } // CalculateIdleState expects an interval in seconds. int idle_time_allowed =
diff --git a/chrome/browser/video_tutorials/android/java/res/layout/video_tutorial_iph_card.xml b/chrome/browser/video_tutorials/android/java/res/layout/video_tutorial_iph_card.xml index 0f069145..d820742 100644 --- a/chrome/browser/video_tutorials/android/java/res/layout/video_tutorial_iph_card.xml +++ b/chrome/browser/video_tutorials/android/java/res/layout/video_tutorial_iph_card.xml
@@ -47,10 +47,9 @@ android:layout_height="wrap_content" android:layout_toEndOf="@id/thumbnail" android:layout_toStartOf="@id/close_button" - android:layout_gravity="center_vertical" + android:layout_centerVertical="true" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" - android:layout_marginTop="12dp" android:ellipsize="end" android:maxLines="3" android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
diff --git a/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_controls.xml b/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_controls.xml index 4f66625..fe72d3ea 100644 --- a/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_controls.xml +++ b/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_controls.xml
@@ -18,7 +18,7 @@ android:background="?attr/selectableItemBackground" android:contentDescription="@string/close" android:scaleType="center" - android:src="@drawable/btn_close" /> + android:src="@drawable/btn_close_white" /> <org.chromium.ui.widget.ChromeImageButton android:id="@+id/share_button" @@ -55,16 +55,14 @@ android:id="@+id/watch_next" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="28dp" - android:textAppearance="@style/TextAppearance.TextMedium.Primary.Light" + style="@style/TextButton" android:text="@string/video_tutorials_watch_next_video" /> <TextView android:id="@+id/change_language" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="28dp" - android:textAppearance="@style/TextAppearance.TextMedium.Primary.Light" /> + style="@style/TextButton" /> </LinearLayout> </RelativeLayout> \ No newline at end of file
diff --git a/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_loading.xml b/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_loading.xml index 7f5b5e2..4d2fa02 100644 --- a/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_loading.xml +++ b/chrome/browser/video_tutorials/internal/android/java/res/layout/video_player_loading.xml
@@ -3,18 +3,30 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<FrameLayout +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loading_root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/background_dark"> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_above="@id/progress_bar" + android:layout_centerHorizontal="true" + android:textAppearance="@style/TextAppearance.TextMedium.Primary.Light" + android:text="@string/video_tutorials_loading"/> + <ProgressBar + android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="10dp" + android:layout_marginTop="20dp" + android:layout_marginStart="60dp" + android:layout_marginEnd="60dp" + android:layout_centerVertical="true" android:indeterminate="true" - android:layout_gravity="center" style="?android:attr/progressBarStyleHorizontal" /> -</FrameLayout> +</RelativeLayout>
diff --git a/chrome/browser/video_tutorials/internal/android/java/res/layout/video_tutorial_large_card.xml b/chrome/browser/video_tutorials/internal/android/java/res/layout/video_tutorial_large_card.xml index a9ccdcf9..9d8742d 100644 --- a/chrome/browser/video_tutorials/internal/android/java/res/layout/video_tutorial_large_card.xml +++ b/chrome/browser/video_tutorials/internal/android/java/res/layout/video_tutorial_large_card.xml
@@ -67,8 +67,8 @@ android:layout_height="wrap_content" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" - android:layout_marginTop="11dp" - android:layout_marginBottom="11dp" + android:layout_marginTop="14dp" + android:layout_marginBottom="14dp" android:maxLines="1" android:ellipsize="end" app:layout_column="0"
diff --git a/chrome/browser/web_applications/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_app_manager.cc index 3f47f16..029e1048 100644 --- a/chrome/browser/web_applications/system_web_app_manager.cc +++ b/chrome/browser/web_applications/system_web_app_manager.cc
@@ -381,7 +381,10 @@ // Always update in tests. update_policy_ = UpdatePolicy::kAlwaysUpdate; - // Return early to avoid populating with real system apps. + // Populate with real system apps if the test asks for it. + if (base::FeatureList::IsEnabled(features::kEnableAllSystemWebApps)) + system_app_infos_ = CreateSystemWebApps(); + return; }
diff --git a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc index e80d3f0..a251d5f2 100644 --- a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
@@ -1104,18 +1104,29 @@ } ~SystemWebAppManagerUpgradeBrowserTest() override = default; + // Don't use WaitForTestSystemAppInstall in this test, because it artificially + // resets the OnAppsSynchronized signal, and starts a new synchronize request. + void WaitForSystemAppsSynchronized() { + base::RunLoop run_loop; + WebAppProvider::Get(browser()->profile()) + ->system_web_app_manager() + .on_apps_synchronized() + .Post(FROM_HERE, run_loop.QuitClosure()); + run_loop.Run(); + } + private: base::test::ScopedFeatureList features_; }; IN_PROC_BROWSER_TEST_P(SystemWebAppManagerUpgradeBrowserTest, PRE_Upgrade) { - WaitForTestSystemAppInstall(); + WaitForSystemAppsSynchronized(); EXPECT_GE(GetManager().GetRegisteredSystemAppsForTesting().size(), GetManager().GetAppIds().size()); } IN_PROC_BROWSER_TEST_P(SystemWebAppManagerUpgradeBrowserTest, Upgrade) { - WaitForTestSystemAppInstall(); + WaitForSystemAppsSynchronized(); const auto& app_ids = GetManager().GetAppIds(); EXPECT_EQ(GetManager().GetRegisteredSystemAppsForTesting().size(),
diff --git a/chrome/browser/webshare/share_service_browsertest.cc b/chrome/browser/webshare/share_service_browsertest.cc index 5d41efa6..ff77ffe7 100644 --- a/chrome/browser/webshare/share_service_browsertest.cc +++ b/chrome/browser/webshare/share_service_browsertest.cc
@@ -13,47 +13,17 @@ #include "content/public/test/browser_test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" -#if defined(OS_WIN) -#include "chrome/browser/webshare/win/scoped_share_operation_fake_components.h" -#endif - class ShareServiceBrowserTest : public InProcessBrowserTest { public: ShareServiceBrowserTest() { feature_list_.InitAndEnableFeature(features::kWebShare); } -#if defined(OS_WIN) - void SetUpOnMainThread() override { - InProcessBrowserTest::SetUpOnMainThread(); - if (!IsSupportedEnvironment()) - return; - - ASSERT_NO_FATAL_FAILURE(scoped_fake_components_.SetUp()); - } -#endif - - protected: -#if defined(OS_WIN) - bool IsSupportedEnvironment() { - return webshare::ScopedShareOperationFakeComponents:: - IsSupportedEnvironment(); - } -#endif - private: base::test::ScopedFeatureList feature_list_; -#if defined(OS_WIN) - webshare::ScopedShareOperationFakeComponents scoped_fake_components_; -#endif }; IN_PROC_BROWSER_TEST_F(ShareServiceBrowserTest, Text) { -#if defined(OS_WIN) - if (!IsSupportedEnvironment()) - return; -#endif - ASSERT_TRUE(embedded_test_server()->Start()); ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/webshare/index.html"));
diff --git a/chrome/browser/webshare/share_service_impl.cc b/chrome/browser/webshare/share_service_impl.cc index fbbcaad6..bf2a4ff 100644 --- a/chrome/browser/webshare/share_service_impl.cc +++ b/chrome/browser/webshare/share_service_impl.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/webshare/share_service_impl.h" #include <algorithm> -#include <memory> #include "base/feature_list.h" #include "base/strings/string_piece.h" @@ -14,10 +13,6 @@ #include "content/public/browser/web_contents.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" -#if defined(OS_WIN) -#include "chrome/browser/webshare/win/share_operation.h" -#endif - // IsDangerousFilename() and IsDangerousMimeType() should be kept in sync with // //third_party/blink/renderer/modules/webshare/FILE_TYPES.md // //components/browser_ui/webshare/android/java/src/org/chromium/components/browser_ui/webshare/ShareServiceImpl.java @@ -170,17 +165,10 @@ #if defined(OS_CHROMEOS) sharesheet_client_.Share(title, text, share_url, std::move(files), std::move(callback)); -#elif defined(OS_WIN) - auto share_operation = std::make_unique<webshare::ShareOperation>( - title, text, share_url, std::move(files), web_contents); - share_operation->Run(base::BindOnce( - [](std::unique_ptr<webshare::ShareOperation> share_operation, - ShareCallback callback, - blink::mojom::ShareError result) { std::move(callback).Run(result); }, - std::move(share_operation), std::move(callback))); #else - NOTREACHED(); - std::move(callback).Run(blink::mojom::ShareError::INTERNAL_ERROR); + // TODO(crbug.com/1035527): Add implementation for OS_WIN + NOTIMPLEMENTED(); + std::move(callback).Run(blink::mojom::ShareError::OK); #endif }
diff --git a/chrome/browser/webshare/share_service_unittest.cc b/chrome/browser/webshare/share_service_unittest.cc index d72bbca..4b909d2 100644 --- a/chrome/browser/webshare/share_service_unittest.cc +++ b/chrome/browser/webshare/share_service_unittest.cc
@@ -29,9 +29,6 @@ #include "chrome/browser/sharesheet/sharesheet_types.h" #include "chrome/browser/webshare/chromeos/sharesheet_client.h" #endif -#if defined(OS_WIN) -#include "chrome/browser/webshare/win/scoped_share_operation_fake_components.h" -#endif class ShareServiceUnitTest : public ChromeRenderViewHostTestHarness { public: @@ -48,21 +45,8 @@ webshare::SharesheetClient::SetSharesheetCallbackForTesting( base::BindRepeating(&ShareServiceUnitTest::AcceptShareRequest)); #endif -#if defined(OS_WIN) - if (!IsSupportedEnvironment()) - return; - - ASSERT_NO_FATAL_FAILURE(scoped_fake_components_.SetUp()); -#endif } -#if defined(OS_WIN) - bool IsSupportedEnvironment() { - return webshare::ScopedShareOperationFakeComponents:: - IsSupportedEnvironment(); - } -#endif - ShareError ShareGeneratedFileData(const std::string& extension, const std::string& content_type, unsigned file_length = 100, @@ -139,19 +123,11 @@ } #endif -#if defined(OS_WIN) - webshare::ScopedShareOperationFakeComponents scoped_fake_components_; -#endif base::test::ScopedFeatureList feature_list_; std::unique_ptr<ShareServiceImpl> share_service_; }; TEST_F(ShareServiceUnitTest, FileCount) { -#if defined(OS_WIN) - if (!IsSupportedEnvironment()) - return; -#endif - EXPECT_EQ(ShareError::OK, ShareGeneratedFileData(".txt", "text/plain", 1234, kMaxSharedFileCount)); EXPECT_EQ(ShareError::PERMISSION_DENIED, @@ -196,11 +172,6 @@ } TEST_F(ShareServiceUnitTest, PortableDocumentFormat) { -#if defined(OS_WIN) - if (!IsSupportedEnvironment()) - return; -#endif - // TODO(crbug.com/1006055): Support sharing of pdf files. // The URL will be checked using Safe Browsing. EXPECT_EQ(ShareError::PERMISSION_DENIED,
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index cab89a4d..ae59ec1 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1603907949-21fa2a082049efb8a42fb5e981f107656277e3ad.profdata +chrome-linux-master-1603929441-de7c595584c292110f839d1296c0369f387aa3ca.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index fefa646..a2d9413d 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-master-1603907949-48bee2a7f2855ac438725bf6194390f836d0af96.profdata +chrome-mac-master-1603929441-b6b34c1c4b0f9e2ddac4473f28fe820beebad5c9.profdata
diff --git a/chrome/common/extensions/api/accessibility_private.json b/chrome/common/extensions/api/accessibility_private.json index dd249df..33e2576 100644 --- a/chrome/common/extensions/api/accessibility_private.json +++ b/chrome/common/extensions/api/accessibility_private.json
@@ -332,16 +332,10 @@ "platforms": ["chromeos"] }, { - "name": "enablePointScan", + "name": "activatePointScan", "type": "function", - "description": "Enables or disables point scanning in Switch Access.", - "parameters": [ - { - "name": "enabled", - "type": "boolean", - "description": "True for start point scanning, false for end point scanning." - } - ], + "description": "Activates point scanning in Switch Access.", + "parameters": [], "platforms": ["chromeos"] }, {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index dbf9998..8b8e52c 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -347,7 +347,6 @@ "//components/crash/core/app", "//third_party/wtl", ] - libs = [ "runtimeobject.lib" ] } if (is_chromeos) { @@ -1170,10 +1169,10 @@ "../browser/page_load_metrics/observers/data_use_metrics_observer_browsertest.cc", "../browser/page_load_metrics/observers/foreground_duration_ukm_observer_browsertest.cc", "../browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc", - "../browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_browsertest.cc", "../browser/page_load_metrics/observers/javascript_frameworks_ukm_observer_browsertest.cc", "../browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer_browsertest.cc", "../browser/page_load_metrics/observers/multi_tab_loading_page_load_metrics_observer_browsertest.cc", + "../browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_browsertest.cc", "../browser/page_load_metrics/observers/resource_metrics_observer_browsertest.cc", "../browser/page_load_metrics/observers/security_state_page_load_metrics_observer_browsertest.cc", "../browser/page_load_metrics/observers/signed_exchange_page_load_metrics_browsertest.cc", @@ -1233,9 +1232,9 @@ "../browser/portal/portal_recently_audible_browsertest.cc", "../browser/predictors/loading_predictor_browsertest.cc", "../browser/prefetch/prefetch_browsertest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_browsertest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_test_utils.h", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h", "../browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc", "../browser/prefs/pref_functional_browsertest.cc", "../browser/prefs/pref_service_browsertest.cc", @@ -3496,7 +3495,6 @@ "../browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_test_utils.h", "../browser/page_load_metrics/observers/document_write_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc", - "../browser/page_load_metrics/observers/isolated_prerender_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/loading_predictor_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/local_network_requests_page_load_metrics_observer_unittest.cc", @@ -3504,6 +3502,7 @@ "../browser/page_load_metrics/observers/multi_tab_loading_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc", "../browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h", + "../browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/previews_page_load_metrics_observer_unittest.cc", "../browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc", "../browser/page_load_metrics/observers/protocol_page_load_metrics_observer_unittest.cc", @@ -3589,11 +3588,11 @@ "../browser/predictors/prefetch_manager_unittest.cc", "../browser/predictors/resource_prefetch_predictor_tables_unittest.cc", "../browser/predictors/resource_prefetch_predictor_unittest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_params_unittest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_prefetch_metrics_collector_unittest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_proxy_configurator_unittest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper_unittest.cc", - "../browser/prefetch/prefetch_proxy/isolated_prerender_url_loader_interceptor_unittest.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_params_unittest.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_prefetch_metrics_collector_unittest.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_proxy_configurator_unittest.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc", + "../browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor_unittest.cc", "../browser/prefs/chrome_command_line_pref_store_proxy_unittest.cc", "../browser/prefs/chrome_command_line_pref_store_ssl_manager_unittest.cc", "../browser/prefs/chrome_command_line_pref_store_unittest.cc",
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index 65779e3482..376c2e7 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h
@@ -177,7 +177,9 @@ #if defined(OS_CHROMEOS) || defined(OS_MAC) || defined(OS_WIN) || \ defined(OS_LINUX) - void ShowHatsBubble(const std::string& site_id) override {} + void ShowHatsBubble(const std::string& site_id, + base::OnceClosure success_callback, + base::OnceClosure failure_callback) override {} #endif ExclusiveAccessContext* GetExclusiveAccessContext() override;
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js index b345404..e2f2be05 100644 --- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js +++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -755,3 +755,33 @@ assertTrue(!!scanPreview.$$('.preview')); }); }); + +suite('ScanToSelectTest', () => { + /** @type {?ScanToSelectElement} */ + let scanToSelect = null; + + /** {string} */ + const myFiles = 'My files'; + + setup(() => { + scanToSelect = document.createElement('scan-to-select'); + assertTrue(!!scanToSelect); + document.body.appendChild(scanToSelect); + }); + + teardown(() => { + if (scanToSelect) { + scanToSelect.remove(); + } + scanToSelect = null; + }); + + test('initializeScanToSelect', () => { + // The dropdown should be disabled and only have one entry for 'My files'. + const select = scanToSelect.$$('select'); + assertTrue(!!select); + assertTrue(select.disabled); + assertEquals(1, select.length); + assertEquals(myFiles, select.options[0].textContent.trim()); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/ambient_mode_photos_page_test.js b/chrome/test/data/webui/settings/chromeos/ambient_mode_photos_page_test.js index 5692b5b..581a41323 100644 --- a/chrome/test/data/webui/settings/chromeos/ambient_mode_photos_page_test.js +++ b/chrome/test/data/webui/settings/chromeos/ambient_mode_photos_page_test.js
@@ -300,7 +300,7 @@ }); test('artPhotosCheckIconHasCorrectPosition', function() { - assertCheckPosition(AmbientModeTopicSource.GOOGLE_PHOTOS); + assertCheckPosition(AmbientModeTopicSource.ART_GALLERY); }); test('setSelectedAlbums', async () => { @@ -405,7 +405,7 @@ test('updateAlbumURL', function() { ambientModePhotosPage.albums = [ - {albumId: 'id0', checked: true, title: 'album0', url: ''}, + {albumId: 'id0', checked: true, title: 'album0'}, ]; ambientModePhotosPage.topicSource = AmbientModeTopicSource.ART_GALLERY; Polymer.dom.flush(); @@ -416,10 +416,9 @@ assertEquals(1, albumItems.length); const album0 = albumItems[0]; - assertEquals('', album0.album.url); // Update album URL. - const url = 'chrome://ambient'; + const url = 'url'; cr.webUIListenerCallback('album-preview-changed', { topicSource: AmbientModeTopicSource.ART_GALLERY, albumId: 'id0', @@ -430,7 +429,7 @@ test('notUpdateAlbumURL', function() { ambientModePhotosPage.albums = [ - {albumId: 'id0', checked: true, title: 'album0', url: ''}, + {albumId: 'id0', checked: true, title: 'album0'}, ]; ambientModePhotosPage.topicSource = AmbientModeTopicSource.ART_GALLERY; Polymer.dom.flush(); @@ -441,7 +440,6 @@ assertEquals(1, albumItems.length); const album0 = albumItems[0]; - assertEquals('', album0.album.url); // Different topic source will no update album URL. const url = 'chrome://ambient'; @@ -450,12 +448,12 @@ albumId: 'id0', url: url }); - assertEquals('', album0.album.url); + assertFalse(!!album0.album.url); }); test('updateImgVisibility', function() { ambientModePhotosPage.albums = [ - {albumId: 'id0', checked: true, title: 'album0', url: ''}, + {albumId: 'id0', checked: true, title: 'album0'}, ]; ambientModePhotosPage.topicSource = AmbientModeTopicSource.ART_GALLERY; Polymer.dom.flush(); @@ -466,13 +464,12 @@ assertEquals(1, albumItems.length); const album0 = albumItems[0]; - assertEquals('', album0.album.url); let img = album0.$$('#image'); assertFalse(!!img); // Update album URL. - const url = 'https://ambient-art-gallery-preview-url'; + const url = 'url'; cr.webUIListenerCallback('album-preview-changed', { topicSource: AmbientModeTopicSource.ART_GALLERY, albumId: 'id0', @@ -483,5 +480,102 @@ img = album0.$$('#image'); assertTrue(!!img); assertFalse(img.hidden); + + const images = album0.$$('#rhImages'); + assertFalse(!!images); + }); + + test('updateRecentHighlightsImagesVisibility', function() { + ambientModePhotosPage.albums = [ + {albumId: 'id0', checked: true, title: 'album0'}, + ]; + ambientModePhotosPage.topicSource = AmbientModeTopicSource.GOOGLE_PHOTOS; + Polymer.dom.flush(); + + const albumList = ambientModePhotosPage.$$('album-list'); + const ironList = albumList.$$('iron-list'); + const albumItems = ironList.querySelectorAll('album-item:not([hidden])'); + assertEquals(1, albumItems.length); + + const album0 = albumItems[0]; + let images = album0.$$('#rhImages'); + assertFalse(!!images); + + // Update Recent Highlights album URLs. + const url = 'url'; + cr.webUIListenerCallback('album-preview-changed', { + topicSource: AmbientModeTopicSource.GOOGLE_PHOTOS, + albumId: 'id0', + recentHighlightsUrls: [url, url, url, url] + }); + assertEquals(url, album0.album.recentHighlightsUrls[0]); + assertEquals(url, album0.album.recentHighlightsUrls[1]); + assertEquals(url, album0.album.recentHighlightsUrls[2]); + assertEquals(url, album0.album.recentHighlightsUrls[3]); + images = album0.$$('#rhImages'); + assertTrue(!!images); + assertFalse(images.hidden); + const image_top_left = album0.$$('.image-rh.top-left'); + const image_top_right = album0.$$('.image-rh.top-right'); + const image_bottom_left = album0.$$('.image-rh.bottom-left'); + const image_bottom_right = album0.$$('.image-rh.bottom-right'); + assertTrue(!!image_top_left); + assertFalse(image_top_left.hidden); + assertTrue(!!image_top_right); + assertFalse(image_top_right.hidden); + assertTrue(!!image_bottom_left); + assertFalse(image_bottom_left.hidden); + assertTrue(!!image_bottom_right); + assertFalse(image_bottom_right.hidden); + + const img = album0.$$('#image'); + assertFalse(!!img); + }); + + test('updateRecentHighlightsImagesVisibilityWithThreeImages', function() { + ambientModePhotosPage.albums = [ + {albumId: 'id0', checked: true, title: 'album0'}, + ]; + ambientModePhotosPage.topicSource = AmbientModeTopicSource.GOOGLE_PHOTOS; + Polymer.dom.flush(); + + const albumList = ambientModePhotosPage.$$('album-list'); + const ironList = albumList.$$('iron-list'); + const albumItems = ironList.querySelectorAll('album-item:not([hidden])'); + assertEquals(1, albumItems.length); + + const album0 = albumItems[0]; + let images = album0.$$('#rhImages'); + assertFalse(!!images); + + // Only update 3 images. + const url = 'url'; + cr.webUIListenerCallback('album-preview-changed', { + topicSource: AmbientModeTopicSource.GOOGLE_PHOTOS, + albumId: 'id0', + recentHighlightsUrls: [url, url, url] + }); + assertEquals(url, album0.album.recentHighlightsUrls[0]); + assertEquals(url, album0.album.recentHighlightsUrls[1]); + assertEquals(url, album0.album.recentHighlightsUrls[2]); + assertFalse(!!album0.album.recentHighlightsUrls[3]); + images = album0.$$('#rhImages'); + assertTrue(!!images); + assertFalse(images.hidden); + const image_top_left = album0.$$('.image-rh.top-left'); + const image_top_right = album0.$$('.image-rh.top-right'); + const image_bottom_left = album0.$$('.image-rh.bottom-left'); + const image_bottom_right = album0.$$('.image-rh.bottom-right'); + assertTrue(!!image_top_left); + assertFalse(image_top_left.hidden); + assertTrue(!!image_top_right); + assertFalse(image_top_right.hidden); + assertTrue(!!image_bottom_left); + assertFalse(image_bottom_left.hidden); + assertTrue(!!image_bottom_right); + assertTrue(image_bottom_right.hidden); + + const img = album0.$$('#image'); + assertFalse(!!img); }); });
diff --git a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js index 47eea3b..9df479f 100644 --- a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
@@ -500,7 +500,6 @@ ['SearchPage', 'search_page_test.js'], ['Search', 'search_settings_test.js'], ['SecurityKeysSubpage', 'security_keys_subpage_test.js'], - ['SecurityPage', 'security_page_test.js'], ['SecureDns', 'secure_dns_test.js'], ['SiteData', 'site_data_test.js'], ['SiteDataDetails', 'site_data_details_subpage_tests.js'], @@ -518,6 +517,13 @@ ['ZoomLevels', 'zoom_levels_tests.js'], ].forEach(test => registerTest(...test)); +// Timeout on MacOS dbg bots +// https://crbug.com/1133412 +GEN('#if !defined(OS_MAC) || defined(NDEBUG)'); +[['SecurityPage', 'security_page_test.js'], +].forEach(test => registerTest(...test)); +GEN('#endif // !defined(OS_MAC) || defined(NDEBUG)'); + GEN('#if defined(OS_CHROMEOS)'); [['LanguagesPageMetricsChromeOS', 'languages_page_metrics_test_cros.js'], ['PasswordsSectionCros', 'passwords_section_test_cros.js'],
diff --git a/chromecast/net/BUILD.gn b/chromecast/net/BUILD.gn index f946681..7cae983 100644 --- a/chromecast/net/BUILD.gn +++ b/chromecast/net/BUILD.gn
@@ -46,6 +46,23 @@ ] } +cast_source_set("time_sync_tracker") { + sources = [ + "time_sync_tracker.cc", + "time_sync_tracker.h", + ] + deps = [ + "//base", + ] + + if (is_fuchsia) { + sources += [ + "time_sync_tracker_fuchsia.cc", + "time_sync_tracker_fuchsia.h", + ] + } +} + cast_source_set("connectivity_checker") { sources = [ "connectivity_checker.cc", @@ -57,6 +74,7 @@ ] deps = [ ":net_switches", + ":time_sync_tracker", "//base", "//chromecast:chromecast_buildflags", "//chromecast/base/metrics",
diff --git a/chromecast/net/connectivity_checker.cc b/chromecast/net/connectivity_checker.cc index c5250829..4683d631 100644 --- a/chromecast/net/connectivity_checker.cc +++ b/chromecast/net/connectivity_checker.cc
@@ -41,10 +41,12 @@ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, std::unique_ptr<network::PendingSharedURLLoaderFactory> pending_url_loader_factory, - network::NetworkConnectionTracker* network_connection_tracker) { + network::NetworkConnectionTracker* network_connection_tracker, + TimeSyncTracker* time_sync_tracker) { return ConnectivityCheckerImpl::Create(task_runner, std::move(pending_url_loader_factory), - network_connection_tracker); + network_connection_tracker, + time_sync_tracker); } } // namespace chromecast
diff --git a/chromecast/net/connectivity_checker.h b/chromecast/net/connectivity_checker.h index df30ca0..ae8938f 100644 --- a/chromecast/net/connectivity_checker.h +++ b/chromecast/net/connectivity_checker.h
@@ -11,6 +11,7 @@ #include "base/memory/ref_counted_delete_on_sequence.h" #include "base/observer_list_threadsafe.h" #include "base/sequenced_task_runner_helpers.h" +#include "chromecast/net/time_sync_tracker.h" namespace base { class SingleThreadTaskRunner; @@ -44,7 +45,8 @@ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, std::unique_ptr<network::PendingSharedURLLoaderFactory> pending_url_loader_factory, - network::NetworkConnectionTracker* network_connection_tracker); + network::NetworkConnectionTracker* network_connection_tracker, + TimeSyncTracker* time_sync_tracker = nullptr); void AddConnectivityObserver(ConnectivityObserver* observer); void RemoveConnectivityObserver(ConnectivityObserver* observer);
diff --git a/chromecast/net/connectivity_checker_impl.cc b/chromecast/net/connectivity_checker_impl.cc index 9010b1a..910c8e7 100644 --- a/chromecast/net/connectivity_checker_impl.cc +++ b/chromecast/net/connectivity_checker_impl.cc
@@ -15,6 +15,7 @@ #include "chromecast/base/metrics/cast_metrics_helper.h" #include "chromecast/chromecast_buildflags.h" #include "chromecast/net/net_switches.h" +#include "chromecast/net/time_sync_tracker.h" #include "net/base/request_priority.h" #include "net/http/http_network_session.h" #include "net/http/http_response_headers.h" @@ -67,11 +68,13 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner, std::unique_ptr<network::PendingSharedURLLoaderFactory> pending_url_loader_factory, - network::NetworkConnectionTracker* network_connection_tracker) { + network::NetworkConnectionTracker* network_connection_tracker, + TimeSyncTracker* time_sync_tracker) { DCHECK(task_runner); auto connectivity_checker = base::WrapRefCounted( - new ConnectivityCheckerImpl(task_runner, network_connection_tracker)); + new ConnectivityCheckerImpl(task_runner, network_connection_tracker, + time_sync_tracker)); task_runner->PostTask( FROM_HERE, base::BindOnce(&ConnectivityCheckerImpl::Initialize, connectivity_checker, @@ -81,11 +84,14 @@ ConnectivityCheckerImpl::ConnectivityCheckerImpl( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - network::NetworkConnectionTracker* network_connection_tracker) + network::NetworkConnectionTracker* network_connection_tracker, + TimeSyncTracker* time_sync_tracker) : ConnectivityChecker(task_runner), task_runner_(std::move(task_runner)), network_connection_tracker_(network_connection_tracker), - connected_(false), + time_sync_tracker_(time_sync_tracker), + connected_and_time_synced_(false), + network_connected_(false), connection_type_(network::mojom::ConnectionType::CONNECTION_NONE), check_errors_(0), network_changed_pending_(false), @@ -93,6 +99,10 @@ DCHECK(task_runner_); DCHECK(network_connection_tracker_); weak_this_ = weak_factory_.GetWeakPtr(); + + if (time_sync_tracker_) { + time_sync_tracker_->AddObserver(this); + } } void ConnectivityCheckerImpl::Initialize( @@ -122,17 +132,27 @@ bool ConnectivityCheckerImpl::Connected() const { base::AutoLock auto_lock(connected_lock_); - return connected_; + return connected_and_time_synced_; } void ConnectivityCheckerImpl::SetConnected(bool connected) { DCHECK(task_runner_->BelongsToCurrentThread()); { base::AutoLock auto_lock(connected_lock_); - if (connected_ == connected) { + network_connected_ = connected; + + // If a time_sync_tracker is not provided, is it assumed that network + // connectivity is equivalent to time being synced. + bool connected_and_time_synced = network_connected_; + if (time_sync_tracker_) { + connected_and_time_synced &= time_sync_tracker_->IsTimeSynced(); + } + + if (connected_and_time_synced_ == connected_and_time_synced) { return; } - connected_ = connected; + + connected_and_time_synced_ = connected_and_time_synced; } base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); @@ -140,12 +160,14 @@ command_line->GetSwitchValueNative(switches::kConnectivityCheckUrl); if (check_url_str.empty()) { connectivity_check_url_.reset(new GURL( - connected ? kHttpConnectivityCheckUrl : kDefaultConnectivityCheckUrl)); + connected_and_time_synced_ ? kHttpConnectivityCheckUrl + : kDefaultConnectivityCheckUrl)); LOG(INFO) << "Change check url=" << *connectivity_check_url_; } - Notify(connected); - LOG(INFO) << "Global connection is: " << (connected ? "Up" : "Down"); + Notify(connected_and_time_synced_); + LOG(INFO) << "Global connection is: " + << (connected_and_time_synced_ ? "Up" : "Down"); } void ConnectivityCheckerImpl::Check() { @@ -230,6 +252,10 @@ Check(); } +void ConnectivityCheckerImpl::OnTimeSynced() { + SetConnected(network_connected_); +} + void ConnectivityCheckerImpl::OnConnectivityCheckComplete( scoped_refptr<net::HttpResponseHeaders> headers) { DCHECK(task_runner_->BelongsToCurrentThread()); @@ -254,6 +280,9 @@ DVLOG(1) << "Connectivity check succeeded"; check_errors_ = 0; SetConnected(true); + if (time_sync_tracker_) { + time_sync_tracker_->OnNetworkConnected(); + } // Some products don't have an idle screen that makes periodic network // requests. Schedule another check to ensure connectivity hasn't dropped. task_runner_->PostDelayedTask( @@ -271,7 +300,7 @@ ++check_errors_; if (check_errors_ > kNumErrorsToNotifyOffline) { // Only record event on the connectivity transition. - if (connected_) { + if (connected_and_time_synced_) { metrics::CastMetricsHelper::GetInstance()->RecordEventWithValue( kMetricNameNetworkConnectivityCheckingErrorType, static_cast<int>(type));
diff --git a/chromecast/net/connectivity_checker_impl.h b/chromecast/net/connectivity_checker_impl.h index 7b5be1f..82149da2 100644 --- a/chromecast/net/connectivity_checker_impl.h +++ b/chromecast/net/connectivity_checker_impl.h
@@ -12,6 +12,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "chromecast/net/connectivity_checker.h" +#include "chromecast/net/time_sync_tracker.h" #include "services/network/public/cpp/network_connection_tracker.h" class GURL; @@ -35,14 +36,16 @@ // to given url. class ConnectivityCheckerImpl : public ConnectivityChecker, - public network::NetworkConnectionTracker::NetworkConnectionObserver { + public network::NetworkConnectionTracker::NetworkConnectionObserver, + public TimeSyncTracker::Observer { public: // Connectivity checking and initialization will run on task_runner. static scoped_refptr<ConnectivityCheckerImpl> Create( scoped_refptr<base::SingleThreadTaskRunner> task_runner, std::unique_ptr<network::PendingSharedURLLoaderFactory> pending_url_loader_factory, - network::NetworkConnectionTracker* network_connection_tracker); + network::NetworkConnectionTracker* network_connection_tracker, + TimeSyncTracker* time_sync_tracker); // ConnectivityChecker implementation: bool Connected() const override; @@ -51,7 +54,8 @@ protected: explicit ConnectivityCheckerImpl( scoped_refptr<base::SingleThreadTaskRunner> task_runner, - network::NetworkConnectionTracker* network_connection_tracker); + network::NetworkConnectionTracker* network_connection_tracker, + TimeSyncTracker* time_sync_tracker); ~ConnectivityCheckerImpl() override; private: @@ -63,6 +67,9 @@ // implementation: void OnConnectionChanged(network::mojom::ConnectionType type) override; + // TimeSyncTracker::Observer implementation: + void OnTimeSynced() override; + void OnConnectionChangedInternal(); void OnConnectivityCheckComplete( @@ -93,11 +100,17 @@ std::unique_ptr<network::SimpleURLLoader> url_loader_; const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; network::NetworkConnectionTracker* const network_connection_tracker_; + TimeSyncTracker* const time_sync_tracker_; // connected_lock_ protects access to connected_ which is shared across // threads. mutable base::Lock connected_lock_; - bool connected_; + // Represents that the device has network connectivity and that time has + // synced. + bool connected_and_time_synced_; + + // If the device has network connectivity. + bool network_connected_; network::mojom::ConnectionType connection_type_; // Number of connectivity check errors.
diff --git a/chromecast/net/time_sync_tracker.cc b/chromecast/net/time_sync_tracker.cc new file mode 100644 index 0000000..a3abdd0 --- /dev/null +++ b/chromecast/net/time_sync_tracker.cc
@@ -0,0 +1,27 @@ +// Copyright 2020 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 "chromecast/net/time_sync_tracker.h" + +namespace chromecast { + +TimeSyncTracker::TimeSyncTracker() {} + +TimeSyncTracker::~TimeSyncTracker() = default; + +void TimeSyncTracker::AddObserver(Observer* observer) { + observer_list_.AddObserver(observer); +} + +void TimeSyncTracker::RemoveObserver(Observer* observer) { + observer_list_.RemoveObserver(observer); +} + +void TimeSyncTracker::Notify() { + for (Observer& observer : observer_list_) { + observer.OnTimeSynced(); + } +} + +} // namespace chromecast
diff --git a/chromecast/net/time_sync_tracker.h b/chromecast/net/time_sync_tracker.h new file mode 100644 index 0000000..8108b3cd --- /dev/null +++ b/chromecast/net/time_sync_tracker.h
@@ -0,0 +1,50 @@ +// Copyright 2020 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 CHROMECAST_NET_TIME_SYNC_TRACKER_H_ +#define CHROMECAST_NET_TIME_SYNC_TRACKER_H_ + +#include "base/observer_list.h" +#include "base/observer_list_types.h" + +namespace chromecast { + +// Tracks whether or not time has synced on the device. +// +// In cases where general network connectivity does not include whether or not +// time has synced, this class provides that information. +class TimeSyncTracker { + public: + class Observer : public base::CheckedObserver { + public: + virtual void OnTimeSynced() = 0; + + protected: + Observer() {} + ~Observer() override = default; + }; + + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + // Informs the tracker that the network is connected. + virtual void OnNetworkConnected() = 0; + + // Returns if the time has been synced. + virtual bool IsTimeSynced() const = 0; + + protected: + TimeSyncTracker(); + virtual ~TimeSyncTracker(); + + // Notifies observer that time has been synced. + void Notify(); + + private: + base::ObserverList<Observer> observer_list_; +}; + +} // namespace chromecast + +#endif // CHROMECAST_NET_TIME_SYNC_TRACKER_H_
diff --git a/chromecast/net/time_sync_tracker_fuchsia.cc b/chromecast/net/time_sync_tracker_fuchsia.cc new file mode 100644 index 0000000..591a732 --- /dev/null +++ b/chromecast/net/time_sync_tracker_fuchsia.cc
@@ -0,0 +1,75 @@ +#include "chromecast/net/time_sync_tracker_fuchsia.h" + +#include <lib/zx/clock.h> +#include <zircon/utc.h> + +#include "base/bind.h" +#include "base/fuchsia/fuchsia_logging.h" +#include "base/logging.h" +#include "base/single_thread_task_runner.h" +#include "base/time/time.h" + +namespace chromecast { +namespace { + +// How often zx::clock is polled in seconds. +const unsigned int kPollPeriodSeconds = 1; + +zx_handle_t GetUtcClockHandle() { + zx_handle_t clock_handle = zx_utc_reference_get(); + DCHECK(clock_handle != ZX_HANDLE_INVALID); + return clock_handle; +} + +} // namespace + +TimeSyncTrackerFuchsia::TimeSyncTrackerFuchsia( + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : task_runner_(std::move(task_runner)), + utc_clock_(GetUtcClockHandle()), + weak_factory_(this) { + DCHECK(task_runner_); + weak_this_ = weak_factory_.GetWeakPtr(); +} + +TimeSyncTrackerFuchsia::~TimeSyncTrackerFuchsia() = default; + +void TimeSyncTrackerFuchsia::OnNetworkConnected() { + if (!is_polling_ && !is_time_synced_) { + is_polling_ = true; + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&TimeSyncTrackerFuchsia::Poll, weak_this_)); + } +} + +bool TimeSyncTrackerFuchsia::IsTimeSynced() const { + return is_time_synced_; +} + +void TimeSyncTrackerFuchsia::Poll() { + DCHECK(task_runner_->BelongsToCurrentThread()); + DCHECK(is_polling_); + + zx_clock_details_v1_t details; + zx_status_t status = utc_clock_->get_details(&details); + ZX_CHECK(status == ZX_OK, status) << "zx_clock_get_details"; + + is_time_synced_ = + details.backstop_time != details.ticks_to_synthetic.synthetic_offset; + DVLOG(2) << __func__ << ": backstop_time=" << details.backstop_time + << ", synthetic_offset=" << details.ticks_to_synthetic.synthetic_offset + << ", synced=" << is_time_synced_; + + if (!is_time_synced_) { + task_runner_->PostDelayedTask( + FROM_HERE, base::BindOnce(&TimeSyncTrackerFuchsia::Poll, weak_this_), + base::TimeDelta::FromSeconds(kPollPeriodSeconds)); + return; + } + + is_polling_ = false; + Notify(); +} + +} // namespace chromecast
diff --git a/chromecast/net/time_sync_tracker_fuchsia.h b/chromecast/net/time_sync_tracker_fuchsia.h new file mode 100644 index 0000000..ffafa53 --- /dev/null +++ b/chromecast/net/time_sync_tracker_fuchsia.h
@@ -0,0 +1,47 @@ +// Copyright 2020 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 CHROMECAST_NET_TIME_SYNC_TRACKER_FUCHSIA_H_ +#define CHROMECAST_NET_TIME_SYNC_TRACKER_FUCHSIA_H_ + +#include <lib/zx/clock.h> + +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "chromecast/net/time_sync_tracker.h" + +namespace base { +class SingleThreadTaskRunner; +} // namespace base + +namespace chromecast { + +class TimeSyncTrackerFuchsia : public TimeSyncTracker { + public: + explicit TimeSyncTrackerFuchsia( + scoped_refptr<base::SingleThreadTaskRunner> task_runner); + TimeSyncTrackerFuchsia(const TimeSyncTrackerFuchsia&) = delete; + TimeSyncTrackerFuchsia& operator=(const TimeSyncTrackerFuchsia&) = delete; + ~TimeSyncTrackerFuchsia() override; + + // TimeSyncTracker implementation: + void OnNetworkConnected() final; + bool IsTimeSynced() const final; + + private: + void Poll(); + + const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + zx::unowned_clock utc_clock_; + + bool is_polling_ = false; + bool is_time_synced_ = false; + + base::WeakPtr<TimeSyncTrackerFuchsia> weak_this_; + base::WeakPtrFactory<TimeSyncTrackerFuchsia> weak_factory_; +}; + +} // namespace chromecast + +#endif // CHROMECAST_NET_TIME_SYNC_TRACKER_FUCHSIA_H_
diff --git a/chromeos/DEPS b/chromeos/DEPS index d61f52c..8c9f915 100644 --- a/chromeos/DEPS +++ b/chromeos/DEPS
@@ -30,4 +30,8 @@ ".*test\.cc": [ "+services/network/test", ], + + ".*test_suite\.cc": [ + "+ui/base", + ], }
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 1353f1d..88b974a 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -498,6 +498,12 @@ <message name="IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT" desc="The text displayed for an option in the resolution dropdown."> <ph name="RESOLUTION_VALUE">$1<ex>300</ex></ph> dpi </message> + <message name="IDS_SCANNING_APP_SCAN_TO_DROPDOWN_LABEL" desc="The label for the dropdown that displays the chosen directory to save scans."> + Scan to + </message> + <message name="IDS_SCANNING_APP_MY_FILES_SELECT_OPTION" desc="The text displayed in the Scan To dropdown when the user chooses the local 'My files' folder from the select dialog."> + My files + </message> <!-- Diagnostics App --> <!-- TODO(michaelcheco): Update with finalized copies of the strings -->
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_MY_FILES_SELECT_OPTION.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_MY_FILES_SELECT_OPTION.png.sha1 new file mode 100644 index 0000000..05a9ed8 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_MY_FILES_SELECT_OPTION.png.sha1
@@ -0,0 +1 @@ +af5584dda2b2b3fac83219b0f98827a81bdfafc5 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_TO_DROPDOWN_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_TO_DROPDOWN_LABEL.png.sha1 new file mode 100644 index 0000000..c3a558a9 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_TO_DROPDOWN_LABEL.png.sha1
@@ -0,0 +1 @@ +03b160bac577a3e1dd52cb8fa036346c4f5a33f9 \ No newline at end of file
diff --git a/chromeos/components/BUILD.gn b/chromeos/components/BUILD.gn index af3852c5..049a1fb 100644 --- a/chromeos/components/BUILD.gn +++ b/chromeos/components/BUILD.gn
@@ -9,7 +9,11 @@ # To add a unit test to this target, make a "unit_test" source_set in your # component and add a reference here. test("chromeos_components_unittests") { - sources = [ "run_all_unittests.cc" ] + sources = [ + "chromeos_components_test_suite.cc", + "chromeos_components_test_suite.h", + "run_all_unittests.cc", + ] deps = [ "//base", @@ -37,11 +41,17 @@ "//chromeos/components/tether:unit_tests", "//chromeos/components/trial_group:unit_tests", "//mojo/core/embedder", + "//ui/base:base", ] if (!is_official_build) { deps += [ "//chromeos/components/telemetry_extension_ui:unit_tests" ] } + + data_deps = [ + "//chromeos/strings:chromeos_test_strings", + "//ui/resources:ui_test_pak_data", + ] } group("closure_compile") {
diff --git a/chromeos/components/camera_app_ui/resources/.eslintrc.js b/chromeos/components/camera_app_ui/resources/.eslintrc.js index 271a5add..d35cbb9d 100644 --- a/chromeos/components/camera_app_ui/resources/.eslintrc.js +++ b/chromeos/components/camera_app_ui/resources/.eslintrc.js
@@ -192,7 +192,7 @@ // 'func-name-matching': 'off', // 'func-names': 'off', // 'func-style': 'off', - // 'id-blacklist': 'off', + // 'id-denylist': 'off', // 'id-length': 'off', // 'id-match': 'off', 'indent': [
diff --git a/chromeos/components/camera_app_ui/resources/js/background.js b/chromeos/components/camera_app_ui/resources/js/background.js index 64f3f8b..65dd24c 100644 --- a/chromeos/components/camera_app_ui/resources/js/background.js +++ b/chromeos/components/camera_app_ui/resources/js/background.js
@@ -9,12 +9,13 @@ ForegroundOps, // eslint-disable-line no-unused-vars } from './background_ops.js'; import {browserProxy} from './browser_proxy/browser_proxy.js'; -// eslint-disable-next-line no-unused-vars -import {TestingErrorCallback} from './error.js'; import {Intent} from './intent.js'; import {initMetrics, setMetricsEnabled} from './metrics.js'; import {PerfLogger} from './perf.js'; -import {PerfEvent} from './type.js'; +import { + PerfEvent, + TestingErrorCallback, // eslint-disable-line no-unused-vars +} from './type.js'; /** * Fixed minimum width of the window inner-bounds in pixels.
diff --git a/chromeos/components/camera_app_ui/resources/js/background_ops.js b/chromeos/components/camera_app_ui/resources/js/background_ops.js index 285d5f89..69bb7323 100644 --- a/chromeos/components/camera_app_ui/resources/js/background_ops.js +++ b/chromeos/components/camera_app_ui/resources/js/background_ops.js
@@ -5,11 +5,11 @@ // eslint-disable-next-line no-unused-vars import {AppWindow} from './app_window.js'; // eslint-disable-next-line no-unused-vars -import {TestingErrorCallback} from './error.js'; -// eslint-disable-next-line no-unused-vars import {Intent} from './intent.js'; // eslint-disable-next-line no-unused-vars import {PerfLogger} from './perf.js'; +// eslint-disable-next-line no-unused-vars +import {TestingErrorCallback} from './type.js'; /** * Operations supported by foreground window. @@ -81,3 +81,22 @@ */ notifySuspension() {} } + +/** + * Creates a fake background ops. + * @return {!BackgroundOps} + */ +export function createFakeBackgroundOps() { + const perfLogger = new PerfLogger(); + const url = window.location.href; + const intent = url.includes('intent') ? Intent.create(new URL(url)) : null; + return /** @type {!BackgroundOps} */ ({ + bindForegroundOps: (ops) => {}, + bindAppWindow: (appWindow) => {}, + getIntent: () => intent, + getPerfLogger: () => perfLogger, + getTestingErrorCallback: () => null, + notifyActivation: () => {}, + notifySuspension: () => {}, + }); +}
diff --git a/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy.js b/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy.js index a589fd12..7129a90 100644 --- a/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy.js +++ b/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert, promisify} from '../chrome_util.js'; +import {promisify} from '../chrome_util.js'; import {ChromeDirectoryEntry} from '../models/chrome_file_system_entry.js'; import {getMaybeLazyDirectory} from '../models/lazy_directory_entry.js'; import {Resolution} from '../type.js'; @@ -163,12 +163,6 @@ } /** @override */ - getBackgroundOps() { - assert(window['backgroundOps'] !== undefined); - return window['backgroundOps']; - } - - /** @override */ async fitWindow() { const appWindow = chrome.app.window.current();
diff --git a/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy_interface.js b/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy_interface.js index 6affb9a5..077d3dc 100644 --- a/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy_interface.js +++ b/chromeos/components/camera_app_ui/resources/js/browser_proxy/browser_proxy_interface.js
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// eslint-disable-next-line no-unused-vars -import {BackgroundOps} from '../background_ops.js'; import { AbstractDirectoryEntry, // eslint-disable-line no-unused-vars AbstractFileEntry, // eslint-disable-line no-unused-vars @@ -118,12 +116,6 @@ isMp4RecordingEnabled() {} /** - * @return {!BackgroundOps} - * @abstract - */ - getBackgroundOps() {} - - /** * @return {!Promise} * @abstract */
diff --git a/chromeos/components/camera_app_ui/resources/js/browser_proxy/webui_browser_proxy.js b/chromeos/components/camera_app_ui/resources/js/browser_proxy/webui_browser_proxy.js index 4bf7d5ca..113347601 100644 --- a/chromeos/components/camera_app_ui/resources/js/browser_proxy/webui_browser_proxy.js +++ b/chromeos/components/camera_app_ui/resources/js/browser_proxy/webui_browser_proxy.js
@@ -11,14 +11,10 @@ */ import '/strings.m.js'; -// eslint-disable-next-line no-unused-vars -import {BackgroundOps} from '../background_ops.js'; import {assert} from '../chrome_util.js'; -import {Intent} from '../intent.js'; import {getMaybeLazyDirectory} from '../models/lazy_directory_entry.js'; import {NativeDirectoryEntry} from '../models/native_file_system_entry.js'; import {ChromeHelper} from '../mojo/chrome_helper.js'; -import {PerfLogger} from '../perf.js'; // eslint-disable-next-line no-unused-vars import {BrowserProxy} from './browser_proxy_interface.js'; @@ -157,24 +153,6 @@ } /** @override */ - getBackgroundOps() { - // TODO(crbug.com/980846): Refactor after migrating to SWA since there is no - // background page for SWA. - const perfLogger = new PerfLogger(); - const url = window.location.href; - const intent = url.includes('intent') ? Intent.create(new URL(url)) : null; - return /** @type {!BackgroundOps} */ ({ - bindForegroundOps: (ops) => {}, - bindAppWindow: (appWindow) => {}, - getIntent: () => intent, - getPerfLogger: () => perfLogger, - getTestingErrorCallback: () => null, - notifyActivation: () => {}, - notifySuspension: () => {}, - }); - } - - /** @override */ fitWindow() { // TODO(crbug.com/980846): Remove the method once we migrate to SWA. }
diff --git a/chromeos/components/camera_app_ui/resources/js/dom.js b/chromeos/components/camera_app_ui/resources/js/dom.js index 07bf306..6caa43f 100644 --- a/chromeos/components/camera_app_ui/resources/js/dom.js +++ b/chromeos/components/camera_app_ui/resources/js/dom.js
@@ -3,7 +3,6 @@ // found in the LICENSE file. import {assertInstanceof} from './chrome_util.js'; -import {setupI18nElements} from './util.js'; // Disables eslint check for closure compiler constructor type. /* eslint-disable valid-jsdoc */ @@ -61,16 +60,4 @@ return getAllFrom(document, selector, type); } -/** - * Instantiates template with the target selector. - * @param {string} selector - * @return {!Node} - */ -export function instantiateTemplate(selector) { - const tpl = get(selector, HTMLTemplateElement); - const node = document.importNode(tpl.content, true); - setupI18nElements(node); - return node; -} - /* eslint-enable valid-jsdoc */
diff --git a/chromeos/components/camera_app_ui/resources/js/error.js b/chromeos/components/camera_app_ui/resources/js/error.js index 0a9298d6..2cbe755 100644 --- a/chromeos/components/camera_app_ui/resources/js/error.js +++ b/chromeos/components/camera_app_ui/resources/js/error.js
@@ -10,15 +10,10 @@ ErrorInfo, // eslint-disable-line no-unused-vars ErrorLevel, ErrorType, + TestingErrorCallback, // eslint-disable-line no-unused-vars } from './type.js'; /** - * Callback for reporting error in testing run. - * @typedef {function(!ErrorInfo)} - */ -export let TestingErrorCallback; - -/** * Code location of stack frame. * @typedef {{ * fileName: string, @@ -30,20 +25,6 @@ export let StackFrame; /** - * Throws when a method is not implemented. - */ -export class NotImplementedError extends Error { - /** - * @param {string=} message - * @public - */ - constructor(message = 'Method is not implemented') { - super(message); - this.name = this.constructor.name; - } -} - -/** * Converts v8 CallSite object to StackFrame. * @param {!CallSite} callsite * @return {!StackFrame}
diff --git a/chromeos/components/camera_app_ui/resources/js/lib/README.md b/chromeos/components/camera_app_ui/resources/js/lib/README.md index 31704e2..0502393 100644 --- a/chromeos/components/camera_app_ui/resources/js/lib/README.md +++ b/chromeos/components/camera_app_ui/resources/js/lib/README.md
@@ -1,7 +1,7 @@ # analytics.js * [Project Page](https://developers.google.com/analytics/devguides/collection/analyticsjs) -* The extern file [universal_analytics_api.js]((https://github.com/google/closure-compiler/blob/master/contrib/externs/universal_analytics_api.js)) is copied from the [closure compiler project](https://github.com/google/closure-compiler) +* The extern file [universal_analytics_api.js](https://github.com/google/closure-compiler/blob/4327b35e038666593b0c72f90e75c4f33fc7a060/contrib/externs/universal_analytics_api.js) is copied from the [closure compiler project](https://github.com/google/closure-compiler) # comlink.js
diff --git a/chromeos/components/camera_app_ui/resources/js/main.js b/chromeos/components/camera_app_ui/resources/js/main.js index 2495431a..c441884 100644 --- a/chromeos/components/camera_app_ui/resources/js/main.js +++ b/chromeos/components/camera_app_ui/resources/js/main.js
@@ -6,6 +6,7 @@ import {AppWindow} from './app_window.js'; import { BackgroundOps, // eslint-disable-line no-unused-vars + createFakeBackgroundOps, ForegroundOps, // eslint-disable-line no-unused-vars } from './background_ops.js'; import {browserProxy} from './browser_proxy/browser_proxy.js'; @@ -279,7 +280,15 @@ if (instance !== null) { return; } - const bgOps = browserProxy.getBackgroundOps(); + + let bgOps; + if (window['backgroundOps'] !== undefined) { + bgOps = window['backgroundOps']; + } else { + // TODO(crbug.com/980846): Refactor after migrating to SWA since there is no + // background page for SWA. + bgOps = createFakeBackgroundOps(); + } browserProxy.setupUnloadListener(() => { const intent = bgOps.getIntent();
diff --git a/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js b/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js index 14c5b7b..0d676e8 100644 --- a/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js +++ b/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. import {assert} from '../chrome_util.js'; -import {NotImplementedError} from '../error.js'; +import {NotImplementedError} from '../type.js'; import {AsyncWriter} from './async_writer.js'; import {
diff --git a/chromeos/components/camera_app_ui/resources/js/type.js b/chromeos/components/camera_app_ui/resources/js/type.js index fd48240..0db416a 100644 --- a/chromeos/components/camera_app_ui/resources/js/type.js +++ b/chromeos/components/camera_app_ui/resources/js/type.js
@@ -222,3 +222,23 @@ WARNING: 'WARNING', ERROR: 'ERROR', }; + +/** + * Callback for reporting error in testing run. + * @typedef {function(!ErrorInfo)} + */ +export let TestingErrorCallback; + +/** + * Throws when a method is not implemented. + */ +export class NotImplementedError extends Error { + /** + * @param {string=} message + * @public + */ + constructor(message = 'Method is not implemented') { + super(message); + this.name = this.constructor.name; + } +}
diff --git a/chromeos/components/camera_app_ui/resources/js/util.js b/chromeos/components/camera_app_ui/resources/js/util.js index 0fc1643..2472d3a 100644 --- a/chromeos/components/camera_app_ui/resources/js/util.js +++ b/chromeos/components/camera_app_ui/resources/js/util.js
@@ -4,6 +4,7 @@ import {browserProxy} from './browser_proxy/browser_proxy.js'; import {assertInstanceof} from './chrome_util.js'; +import * as dom from './dom.js'; import {reportError} from './error.js'; import * as state from './state.js'; import * as tooltip from './tooltip.js'; @@ -441,3 +442,15 @@ animateOnce(el); }); } + +/** + * Instantiates template with the target selector. + * @param {string} selector + * @return {!Node} + */ +export function instantiateTemplate(selector) { + const tpl = dom.get(selector, HTMLTemplateElement); + const node = document.importNode(tpl.content, true); + setupI18nElements(node); + return node; +}
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js b/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js index 40cc51d1..1f161b5 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js +++ b/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js
@@ -109,7 +109,7 @@ * @return {!Promise} Promise for the operation. */ async setSource_(stream) { - const node = dom.instantiateTemplate('#preview-video-template'); + const node = util.instantiateTemplate('#preview-video-template'); const video = dom.getFrom(node, 'video', HTMLVideoElement); await new Promise((resolve) => { const handler = () => {
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera_intent.js b/chromeos/components/camera_app_ui/resources/js/views/camera_intent.js index ed2b389..d7dedbc 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/camera_intent.js +++ b/chromeos/components/camera_app_ui/resources/js/views/camera_intent.js
@@ -144,6 +144,10 @@ } return (async () => { await take; + if (this.photoResult_ === null && this.videoResultFile_ === null) { + // In case of take early finish without any result e.g. Timer canceled. + return; + } state.set(state.State.SUSPEND, true); await this.start(); @@ -153,7 +157,7 @@ } else if (this.videoResultFile_ !== null) { return this.reviewResult_.openVideo(this.videoResultFile_); } else { - assertNotReached('End take without intent result.'); + assertNotReached('None of intent result.'); } })(); const result = this.photoResult_ || this.videoResult_;
diff --git a/chromeos/components/camera_app_ui/resources/js/views/settings.js b/chromeos/components/camera_app_ui/resources/js/views/settings.js index f1384fc..6d78711 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/settings.js +++ b/chromeos/components/camera_app_ui/resources/js/views/settings.js
@@ -441,7 +441,7 @@ let /** !HTMLElement */ videoItem; if (deviceId !== focusedId) { const extItem = - dom.instantiateTemplate('#extcam-resolution-item-template'); + util.instantiateTemplate('#extcam-resolution-item-template'); [titleItem, photoItem, videoItem] = dom.getAllFrom(extItem, '.menu-item', HTMLElement); @@ -610,7 +610,7 @@ .forEach((element) => element.parentNode.removeChild(element)); resolutions.forEach((r) => { - const item = dom.instantiateTemplate('#resolution-item-template'); + const item = util.instantiateTemplate('#resolution-item-template'); const label = dom.getFrom(item, 'label', HTMLLabelElement); util.setInkdropEffect(label); const input = dom.getFrom(item, 'input', HTMLInputElement);
diff --git a/chromeos/components/camera_app_ui/resources/js/window_controller/mojo_window_controller.js b/chromeos/components/camera_app_ui/resources/js/window_controller/mojo_window_controller.js index 451d73a..737f70d8 100644 --- a/chromeos/components/camera_app_ui/resources/js/window_controller/mojo_window_controller.js +++ b/chromeos/components/camera_app_ui/resources/js/window_controller/mojo_window_controller.js
@@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// eslint-disable-next-line no-unused-vars -import {NotImplementedError} from '../error.js'; +import {NotImplementedError} from '../type.js'; // eslint-disable-next-line no-unused-vars import {WindowController} from './window_controller_interface.js';
diff --git a/chromeos/components/chromeos_components_test_suite.cc b/chromeos/components/chromeos_components_test_suite.cc new file mode 100644 index 0000000..df5488a --- /dev/null +++ b/chromeos/components/chromeos_components_test_suite.cc
@@ -0,0 +1,53 @@ +// Copyright 2020 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 "chromeos/components/chromeos_components_test_suite.h" + +#include "base/base_paths.h" +#include "base/files/file_path.h" +#include "base/i18n/rtl.h" +#include "base/path_service.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/base/ui_base_paths.h" + +namespace { + +// Initializes the i18n stack and loads the necessary strings. Uses a specific +// locale, so that the tests can compare against golden strings without +// depending on the environment. +void InitI18n() { + base::i18n::SetICUDefaultLocale("en_US"); + + ui::RegisterPathProvider(); + + base::FilePath ui_test_pak_path; + ASSERT_TRUE(base::PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path)); + ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path); + + base::FilePath dir_module_path; + ASSERT_TRUE(base::PathService::Get(base::DIR_MODULE, &dir_module_path)); + base::FilePath chromeos_test_strings_path = + dir_module_path.Append(FILE_PATH_LITERAL("chromeos_test_strings.pak")); + ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath( + chromeos_test_strings_path, ui::SCALE_FACTOR_NONE); +} + +} // namespace + +ChromeosComponentsTestSuite::ChromeosComponentsTestSuite(int argc, char** argv) + : TestSuite(argc, argv) {} + +ChromeosComponentsTestSuite::~ChromeosComponentsTestSuite() = default; + +void ChromeosComponentsTestSuite::Initialize() { + base::TestSuite::Initialize(); + + InitI18n(); +} + +void ChromeosComponentsTestSuite::Shutdown() { + ui::ResourceBundle::CleanupSharedInstance(); + base::TestSuite::Shutdown(); +}
diff --git a/chromeos/components/chromeos_components_test_suite.h b/chromeos/components/chromeos_components_test_suite.h new file mode 100644 index 0000000..a891ff0 --- /dev/null +++ b/chromeos/components/chromeos_components_test_suite.h
@@ -0,0 +1,26 @@ +// Copyright 2020 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 CHROMEOS_COMPONENTS_CHROMEOS_COMPONENTS_TEST_SUITE_H_ +#define CHROMEOS_COMPONENTS_CHROMEOS_COMPONENTS_TEST_SUITE_H_ + +#include "base/test/test_suite.h" + +class ChromeosComponentsTestSuite : public base::TestSuite { + public: + ChromeosComponentsTestSuite(int argc, char** argv); + + ChromeosComponentsTestSuite(const ChromeosComponentsTestSuite&) = delete; + ChromeosComponentsTestSuite& operator=(const ChromeosComponentsTestSuite&) = + delete; + + ~ChromeosComponentsTestSuite() override; + + protected: + // base::TestSuite: + void Initialize() override; + void Shutdown() override; +}; + +#endif // CHROMEOS_COMPONENTS_CHROMEOS_COMPONENTS_TEST_SUITE_H_
diff --git a/chromeos/components/media_app_ui/resources/js/receiver.js b/chromeos/components/media_app_ui/resources/js/receiver.js index 2e925b8..b283d71 100644 --- a/chromeos/components/media_app_ui/resources/js/receiver.js +++ b/chromeos/components/media_app_ui/resources/js/receiver.js
@@ -313,6 +313,12 @@ } window.addEventListener('DOMContentLoaded', () => { + // TODO(crbug/1138798): Reorder .js deps so this can be done at load time. + // Note: go/bbsrc/flags.ts processes this, `window.features` variable. + /** @type{{features: Object<string, boolean>}} */ (window).features = { + imageAnnotation: loadTimeData.getBoolean('imageAnnotation') + }; + const app = getApp(); if (app) { initializeApp(app);
diff --git a/chromeos/components/quick_answers/test/test_helpers.h b/chromeos/components/quick_answers/test/test_helpers.h index 61008225..8417c32 100644 --- a/chromeos/components/quick_answers/test/test_helpers.h +++ b/chromeos/components/quick_answers/test/test_helpers.h
@@ -43,7 +43,8 @@ }; MATCHER_P(QuickAnswerEqual, quick_answer, "") { - return (arg->primary_answer == quick_answer->primary_answer); + return (arg->primary_answer == quick_answer->primary_answer && + arg->secondary_answer == quick_answer->secondary_answer); } MATCHER_P(QuickAnswersRequestEqual, quick_answers_request, "") {
diff --git a/chromeos/components/quick_answers/translation_result_loader.cc b/chromeos/components/quick_answers/translation_result_loader.cc index 90daee0..ecf1400d 100644 --- a/chromeos/components/quick_answers/translation_result_loader.cc +++ b/chromeos/components/quick_answers/translation_result_loader.cc
@@ -44,10 +44,6 @@ constexpr base::StringPiece kTargetLanguageKey = "target"; std::string BuildTitleText(const IntentInfo& intent_info) { - // TODO(b/169453041): Add test support for localized strings. - if (!ui::ResourceBundle::HasSharedInstance()) - return std::string(); - auto locale_name = l10n_util::GetDisplayNameForLocale( intent_info.source_language, intent_info.target_language, true); return l10n_util::GetStringFUTF8(IDS_QUICK_ANSWERS_TRANSLATION_TITLE_TEXT,
diff --git a/chromeos/components/quick_answers/translation_result_loader_unittest.cc b/chromeos/components/quick_answers/translation_result_loader_unittest.cc index b58bc23..dc6e64ad0 100644 --- a/chromeos/components/quick_answers/translation_result_loader_unittest.cc +++ b/chromeos/components/quick_answers/translation_result_loader_unittest.cc
@@ -37,6 +37,7 @@ } )"; +constexpr char kTestTranslationTitle[] = "test · inglés"; constexpr char kTestTranslationResult[] = "prueba"; const auto kTestTranslationIntent = @@ -87,6 +88,7 @@ std::unique_ptr<QuickAnswer> expected_quick_answer = std::make_unique<QuickAnswer>(); expected_quick_answer->primary_answer = kTestTranslationResult; + expected_quick_answer->secondary_answer = kTestTranslationTitle; test_url_loader_factory_.AddResponse(kCloudTranslationApiRequest, kValidResponse); EXPECT_CALL(
diff --git a/chromeos/components/run_all_unittests.cc b/chromeos/components/run_all_unittests.cc index 437a61964..0802eca 100644 --- a/chromeos/components/run_all_unittests.cc +++ b/chromeos/components/run_all_unittests.cc
@@ -6,6 +6,7 @@ #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #include "build/chromeos_buildflags.h" +#include "chromeos/components/chromeos_components_test_suite.h" #include "mojo/core/embedder/embedder.h" #if BUILDFLAG(IS_CHROMEOS_DEVICE) @@ -17,8 +18,8 @@ // Some unit tests make Mojo calls. mojo::core::Init(); - base::TestSuite test_suite(argc, argv); - return base::LaunchUnitTests( - argc, argv, - base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite))); + ChromeosComponentsTestSuite test_suite(argc, argv); + return base::LaunchUnitTests(argc, argv, + base::BindOnce(&ChromeosComponentsTestSuite::Run, + base::Unretained(&test_suite))); }
diff --git a/chromeos/components/scanning/resources/BUILD.gn b/chromeos/components/scanning/resources/BUILD.gn index 2bbd2a1..56cf92d 100644 --- a/chromeos/components/scanning/resources/BUILD.gn +++ b/chromeos/components/scanning/resources/BUILD.gn
@@ -16,6 +16,7 @@ ":page_size_select", ":resolution_select", ":scan_preview", + ":scan_to_select", ":scanner_select", ":scanning_app", ":scanning_app_types", @@ -75,6 +76,15 @@ ] } +js_library("scan_to_select") { + deps = [ + ":select_behavior", + "//chromeos/components/scanning/mojom:mojom_js_library_for_compile", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:i18n_behavior.m", + ] +} + js_library("scanner_select") { deps = [ ":scanning_app_types", @@ -94,6 +104,7 @@ ":page_size_select", ":resolution_select", ":scan_preview", + ":scan_to_select", ":scanner_select", ":scanning_app_types", ":scanning_app_util", @@ -143,6 +154,7 @@ "scan_preview.js", "scan_settings_section.js", "scanner_select.js", + "scan_to_select.js", "scanning_app.js", "scanning_shared_css.js", "source_select.js",
diff --git a/chromeos/components/scanning/resources/scan_to_select.html b/chromeos/components/scanning/resources/scan_to_select.html new file mode 100644 index 0000000..d0d810dd --- /dev/null +++ b/chromeos/components/scanning/resources/scan_to_select.html
@@ -0,0 +1,12 @@ +<scan-settings-section> + <span id="scanToLabel" slot="label">[[i18n('scanToDropdownLabel')]]</span> + <div slot="settings"> + <!-- TODO(jschettler): Verify this meets a11y expecations (e.g. ChromeVox + should announce when a new option is focused). --> + <select class="md-select" disabled="[[disabled]]"> + <option> + [[i18n('myFilesSelectOption')]] + </option> + </select> + </div> +</scan-settings-section>
diff --git a/chromeos/components/scanning/resources/scan_to_select.js b/chromeos/components/scanning/resources/scan_to_select.js new file mode 100644 index 0000000..3f6419c5 --- /dev/null +++ b/chromeos/components/scanning/resources/scan_to_select.js
@@ -0,0 +1,22 @@ +// Copyright 2020 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. + +import './scan_settings_section.js'; + +import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; +import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {SelectBehavior} from './select_behavior.js'; + +/** + * @fileoverview + * 'scan-to-select' displays the chosen directory to save completed scans. + */ +Polymer({ + is: 'scan-to-select', + + _template: html`{__html_template__}`, + + behaviors: [I18nBehavior, SelectBehavior], +});
diff --git a/chromeos/components/scanning/resources/scanning_app.html b/chromeos/components/scanning/resources/scanning_app.html index 9579d8e6..3983d791 100644 --- a/chromeos/components/scanning/resources/scanning_app.html +++ b/chromeos/components/scanning/resources/scanning_app.html
@@ -33,6 +33,8 @@ <source-select id="sourceSelect" sources="[[capabilities_.sources]]" settings-disabled="[[settingsDisabled_]]" selected-source="{{selectedSource}}"></source-select> + <scan-to-select id="scanToSelect" + settings-disabled="[[settingsDisabled_]]"></scan-to-select> <file-type-select id="fileTypeSelect" settings-disabled="[[settingsDisabled_]]" selected-file-type="{{selectedFileType}}"></file-type-select> <color-mode-select id="colorModeSelect" @@ -54,4 +56,3 @@ <p id="statusText">[[statusText_]]</p> </div> </div> -</div>
diff --git a/chromeos/components/scanning/resources/scanning_app.js b/chromeos/components/scanning/resources/scanning_app.js index d7d5026..967f983c 100644 --- a/chromeos/components/scanning/resources/scanning_app.js +++ b/chromeos/components/scanning/resources/scanning_app.js
@@ -11,6 +11,7 @@ import './page_size_select.js'; import './resolution_select.js'; import './scan_preview.js'; +import './scan_to_select.js'; import './scanner_select.js'; import './scanning_shared_css.js'; import './source_select.js';
diff --git a/chromeos/components/scanning/resources/scanning_app_resources.grd b/chromeos/components/scanning/resources/scanning_app_resources.grd index 93c1bb1..1edcf38e 100644 --- a/chromeos/components/scanning/resources/scanning_app_resources.grd +++ b/chromeos/components/scanning/resources/scanning_app_resources.grd
@@ -16,6 +16,8 @@ <include name="IDR_SCANNING_APP_INDEX_HTML" file="index.html" type="BINDATA" /> <include name="IDR_SCANNING_MOJO_LITE_JS" file="${root_gen_dir}/chromeos/components/scanning/mojom/scanning.mojom-lite.js" use_base_dir="false" type="BINDATA" /> <include name="IDR_SCANNING_APP_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/scanning_app.js" use_base_dir="false" type="BINDATA"/> + <include name="IDR_SCANNING_APP_SCAN_TO_SELECT_HTML" file="scan_to_select.html" type="BINDATA"/> + <include name="IDR_SCANNING_APP_SCAN_TO_SELECT_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/scan_to_select.js" use_base_dir="false" type="BINDATA"/> <include name="IDR_SCANNING_APP_SCANNER_SELECT_HTML" file="scanner_select.html" type="BINDATA"/> <include name="IDR_SCANNING_APP_SCANNER_SELECT_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/scanner_select.js" use_base_dir="false" type="BINDATA"/> <include name="IDR_SCANNING_APP_SOURCE_SELECT_HTML" file="source_select.html" type="BINDATA"/>
diff --git a/chromeos/components/scanning/scanning_ui.cc b/chromeos/components/scanning/scanning_ui.cc index 764eb140..61b18f8 100644 --- a/chromeos/components/scanning/scanning_ui.cc +++ b/chromeos/components/scanning/scanning_ui.cc
@@ -53,12 +53,14 @@ {"colorModeDropdownLabel", IDS_SCANNING_APP_COLOR_MODE_DROPDOWN_LABEL}, {"fileTypeDropdownLabel", IDS_SCANNING_APP_FILE_TYPE_DROPDOWN_LABEL}, {"jpgOptionText", IDS_SCANNING_APP_JPG_OPTION_TEXT}, + {"myFilesSelectOption", IDS_SCANNING_APP_MY_FILES_SELECT_OPTION}, {"noScannersText", IDS_SCANNING_APP_NO_SCANNERS_TEXT}, {"pdfOptionText", IDS_SCANNING_APP_PDF_OPTION_TEXT}, {"pngOptionText", IDS_SCANNING_APP_PNG_OPTION_TEXT}, {"pageSizeDropdownLabel", IDS_SCANNING_APP_PAGE_SIZE_DROPDOWN_LABEL}, {"resolutionDropdownLabel", IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL}, {"resolutionOptionText", IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT}, + {"scanToDropdownLabel", IDS_SCANNING_APP_SCAN_TO_DROPDOWN_LABEL}, {"scannerDropdownLabel", IDS_SCANNING_APP_SCANNER_DROPDOWN_LABEL}, {"sourceDropdownLabel", IDS_SCANNING_APP_SOURCE_DROPDOWN_LABEL}};
diff --git a/chromeos/components/security_token_pin/BUILD.gn b/chromeos/components/security_token_pin/BUILD.gn index 187d8ae..c07f7b4 100644 --- a/chromeos/components/security_token_pin/BUILD.gn +++ b/chromeos/components/security_token_pin/BUILD.gn
@@ -32,8 +32,4 @@ "//testing/gtest", "//ui/base", ] - data_deps = [ - "//chromeos/strings:chromeos_test_strings", - "//ui/resources:ui_test_pak_data", - ] }
diff --git a/chromeos/components/security_token_pin/error_generator_unittest.cc b/chromeos/components/security_token_pin/error_generator_unittest.cc index 211d19a..419ef40 100644 --- a/chromeos/components/security_token_pin/error_generator_unittest.cc +++ b/chromeos/components/security_token_pin/error_generator_unittest.cc
@@ -4,50 +4,22 @@ #include "chromeos/components/security_token_pin/error_generator.h" -#include "base/base_paths.h" -#include "base/files/file_path.h" -#include "base/i18n/rtl.h" -#include "base/path_service.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" #include "chromeos/components/security_token_pin/constants.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/base/resource/scale_factor.h" -#include "ui/base/ui_base_paths.h" namespace chromeos { namespace security_token_pin { class SecurityTokenPinErrorGeneratorTest : public testing::Test { protected: - SecurityTokenPinErrorGeneratorTest() { InitI18n(); } + SecurityTokenPinErrorGeneratorTest() = default; - ~SecurityTokenPinErrorGeneratorTest() override { - ui::ResourceBundle::CleanupSharedInstance(); - } - - private: - // Initializes the i18n stack and loads the necessary strings. Uses a specific - // locale, so that the tests can compare against golden strings without - // depending on the environment. - void InitI18n() { - base::i18n::SetICUDefaultLocale("en_US"); - - ui::RegisterPathProvider(); - - base::FilePath ui_test_pak_path; - ASSERT_TRUE(base::PathService::Get(ui::UI_TEST_PAK, &ui_test_pak_path)); - ui::ResourceBundle::InitSharedInstanceWithPakPath(ui_test_pak_path); - - base::FilePath dir_module_path; - ASSERT_TRUE(base::PathService::Get(base::DIR_MODULE, &dir_module_path)); - base::FilePath chromeos_test_strings_path = - dir_module_path.Append(FILE_PATH_LITERAL("chromeos_test_strings.pak")); - ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath( - chromeos_test_strings_path, ui::SCALE_FACTOR_NONE); - } + SecurityTokenPinErrorGeneratorTest( + const SecurityTokenPinErrorGeneratorTest&) = delete; + SecurityTokenPinErrorGeneratorTest& operator=( + const SecurityTokenPinErrorGeneratorTest&) = delete; }; // Tests that an empty message is returned when there's neither an error nor the
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc index f4e5c5e..475bb61 100644 --- a/chromeos/constants/chromeos_features.cc +++ b/chromeos/constants/chromeos_features.cc
@@ -431,6 +431,10 @@ // ChromeOS Media App. https://crbug.com/996088. const base::Feature kMediaApp{"MediaApp", base::FEATURE_ENABLED_BY_DEFAULT}; +// Whether image annotation is enabled in the ChromeOS media app. +const base::Feature kMediaAppAnnotation{"MediaAppAnnotation", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Whether known extensions for RAW image formats are handled by the ChromeOS // Media App. const base::Feature kMediaAppHandlesRaw{"MediaAppHandlesRaw",
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h index e4473a2..a0275b9 100644 --- a/chromeos/constants/chromeos_features.h +++ b/chromeos/constants/chromeos_features.h
@@ -194,6 +194,8 @@ extern const base::Feature kLoginDisplayPasswordButton; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kMediaApp; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) +extern const base::Feature kMediaAppAnnotation; +COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kMediaAppHandlesRaw; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kMinimumChromeVersion;
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom index 8385e2a0..16caed0 100644 --- a/chromeos/crosapi/mojom/crosapi.mojom +++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -15,6 +15,7 @@ import "mojo/public/mojom/base/token.mojom"; import "mojo/public/mojom/base/values.mojom"; import "services/device/public/mojom/hid.mojom"; +import "url/mojom/url.mojom"; // LacrosInfo is a set of parameters passed to ash from lacros-chrome // upon lacros startup, which contains the lacros information such as version, @@ -194,4 +195,8 @@ // The histograms returned is zip compressed and is typically around 100KB. [MinVersion=7] GetHistograms@4() => (mojo_base.mojom.BigString compressed_histograms); + + // Returns Url of the active tab from lacros if there is any. + [MinVersion=8] + GetActiveTabUrl@5() => (url.mojom.Url? url); };
diff --git a/chromeos/lacros/lacros_chrome_service_delegate.h b/chromeos/lacros/lacros_chrome_service_delegate.h index 5b82663..7dec91f6 100644 --- a/chromeos/lacros/lacros_chrome_service_delegate.h +++ b/chromeos/lacros/lacros_chrome_service_delegate.h
@@ -10,6 +10,8 @@ #include "base/callback.h" #include "base/values.h" +class GURL; + namespace chromeos { // Interface to inject Chrome dependent behavior into LacrosChromeServiceImpl @@ -34,6 +36,11 @@ using GetHistogramsCallback = base::OnceCallback<void(const std::string&)>; // Gets lacros histograms. virtual void GetHistograms(GetHistogramsCallback callback) = 0; + + using GetActiveTabUrlCallback = + base::OnceCallback<void(const base::Optional<GURL>&)>; + // Gets Url of the active tab if there is any. + virtual void GetActiveTabUrl(GetActiveTabUrlCallback callback) = 0; }; } // namespace chromeos
diff --git a/chromeos/lacros/lacros_chrome_service_impl.cc b/chromeos/lacros/lacros_chrome_service_impl.cc index ec51f688a..d4cab019 100644 --- a/chromeos/lacros/lacros_chrome_service_impl.cc +++ b/chromeos/lacros/lacros_chrome_service_impl.cc
@@ -12,6 +12,7 @@ #include "base/task/thread_pool.h" #include "chromeos/lacros/lacros_chrome_service_delegate.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "url/gurl.h" namespace chromeos { namespace { @@ -89,6 +90,13 @@ owner_, std::move(callback))); } + void GetActiveTabUrl(GetActiveTabUrlCallback callback) override { + owner_sequence_->PostTask( + FROM_HERE, + base::BindOnce(&LacrosChromeServiceImpl::GetActiveTabUrlAffineSequence, + owner_, std::move(callback))); + } + // Unlike most of other methods of this class, this is called on the // affined thread. Specifically, it is intended to be called before starting // the message pumping of the affined thread to pass the initialization @@ -434,6 +442,12 @@ delegate_->GetHistograms(std::move(callback)); } +void LacrosChromeServiceImpl::GetActiveTabUrlAffineSequence( + GetActiveTabUrlCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(affine_sequence_checker_); + delegate_->GetActiveTabUrl(std::move(callback)); +} + int LacrosChromeServiceImpl::AshChromeServiceVersion() { if (g_disable_all_crosapi_for_tests) return -1;
diff --git a/chromeos/lacros/lacros_chrome_service_impl.h b/chromeos/lacros/lacros_chrome_service_impl.h index b894c09..418b1ce 100644 --- a/chromeos/lacros/lacros_chrome_service_impl.h +++ b/chromeos/lacros/lacros_chrome_service_impl.h
@@ -24,6 +24,8 @@ #include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/hid.mojom.h" +class GURL; + namespace chromeos { class LacrosChromeServiceDelegate; @@ -198,6 +200,11 @@ // Gets histograms on the affine sequence. void GetHistogramsAffineSequence(GetHistogramsCallback callback); + using GetActiveTabUrlCallback = + base::OnceCallback<void(const base::Optional<GURL>&)>; + // Gets Url of the active tab on the affine sequence. + void GetActiveTabUrlAffineSequence(GetActiveTabUrlCallback callback); + // Returns ash's version of the AshChromeService mojo interface version. This // determines which interface methods are available. This is safe to call from // any sequence. This can only be called after BindReceiver().
diff --git a/chromeos/login/auth/user_context.cc b/chromeos/login/auth/user_context.cc index fcb4e92..51e7b44a 100644 --- a/chromeos/login/auth/user_context.cc +++ b/chromeos/login/auth/user_context.cc
@@ -40,7 +40,8 @@ context.is_using_oauth_ == is_using_oauth_ && context.auth_flow_ == auth_flow_ && context.user_type_ == user_type_ && context.public_session_locale_ == public_session_locale_ && - context.public_session_input_method_ == public_session_input_method_; + context.public_session_input_method_ == public_session_input_method_ && + context.login_input_method_used_ == login_input_method_used_; } bool UserContext::operator!=(const UserContext& context) const { @@ -250,6 +251,15 @@ managed_guest_session_launch_extension_id; } +void UserContext::SetLoginInputMethodUsed(const std::string& input_method_id) { + DCHECK(login_input_method_used_.empty()); + login_input_method_used_ = input_method_id; +} + +const std::string& UserContext::GetLoginInputMethodUsed() const { + return login_input_method_used_; +} + void UserContext::ClearSecrets() { key_.ClearSecret(); password_key_.ClearSecret();
diff --git a/chromeos/login/auth/user_context.h b/chromeos/login/auth/user_context.h index 816b01ba..0d279cc 100644 --- a/chromeos/login/auth/user_context.h +++ b/chromeos/login/auth/user_context.h
@@ -137,6 +137,11 @@ // created. Setting this pref indicates that this Managed Guest Session is // lockable. void SetManagedGuestSessionLaunchExtensionId(const std::string& extension_id); + // We need to pull input method used to log in into the user session to make + // it consistent. This method will remember given input method to be used + // when session starts. + void SetLoginInputMethodUsed(const std::string& input_method_id); + const std::string& GetLoginInputMethodUsed() const; void ClearSecrets(); @@ -161,6 +166,9 @@ std::string gaps_cookie_; bool is_under_advanced_protection_ = false; std::string managed_guest_session_launch_extension_id_; + // |login_input_method_used_| is non-empty if login password/code was used, + // i.e. user used some input method to log in. + std::string login_input_method_used_; // For password reuse detection use. base::Optional<password_manager::PasswordHashData> sync_password_data_;
diff --git a/chromeos/services/assistant/public/cpp/features.cc b/chromeos/services/assistant/public/cpp/features.cc index 1a3a642..14de1735 100644 --- a/chromeos/services/assistant/public/cpp/features.cc +++ b/chromeos/services/assistant/public/cpp/features.cc
@@ -41,6 +41,9 @@ const base::Feature kAssistantWaitScheduling{"AssistantWaitScheduling", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kEnableBetterAssistant{"EnableBetterAssistant", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kEnableBloom{"EnableBloom", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -84,6 +87,10 @@ return base::FeatureList::IsEnabled(kAssistantAudioEraser); } +bool IsBetterAssistantEnabled() { + return base::FeatureList::IsEnabled(kEnableBetterAssistant); +} + bool IsBetterOnboardingEnabled() { return base::FeatureList::IsEnabled(kAssistantBetterOnboarding); }
diff --git a/chromeos/services/assistant/public/cpp/features.h b/chromeos/services/assistant/public/cpp/features.h index baedcb5..48bb828c 100644 --- a/chromeos/services/assistant/public/cpp/features.h +++ b/chromeos/services/assistant/public/cpp/features.h
@@ -58,6 +58,10 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnableAmbientAssistant; +// Enables Better Assistant. +COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) +extern const base::Feature kEnableBetterAssistant; + // Enables Bloom integration. COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnableBloom; @@ -93,6 +97,8 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAudioEraserEnabled(); +COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsBetterAssistantEnabled(); + COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsBetterOnboardingEnabled(); COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsBloomEnabled();
diff --git a/chromeos/services/ime/decoder/decoder_engine.cc b/chromeos/services/ime/decoder/decoder_engine.cc index e224b68f9..c1377e5 100644 --- a/chromeos/services/ime/decoder/decoder_engine.cc +++ b/chromeos/services/ime/decoder/decoder_engine.cc
@@ -138,6 +138,15 @@ engine_main_entry_->IsImeSupported(ime_spec.c_str()); } +void DecoderEngine::OnInputMethodChanged(const std::string& engine_id) { + const uint64_t seq_id = current_seq_id_; + ++current_seq_id_; + + ProcessMessage( + WrapAndSerializeMessage(OnInputMethodChangedToProto(seq_id, engine_id)), + base::DoNothing()); +} + void DecoderEngine::OnFocus(mojom::InputFieldInfoPtr input_field_info) { const uint64_t seq_id = current_seq_id_; ++current_seq_id_;
diff --git a/chromeos/services/ime/decoder/decoder_engine.h b/chromeos/services/ime/decoder/decoder_engine.h index 35047a0..2675891 100644 --- a/chromeos/services/ime/decoder/decoder_engine.h +++ b/chromeos/services/ime/decoder/decoder_engine.h
@@ -32,6 +32,7 @@ void ProcessMessage(const std::vector<uint8_t>& message, ProcessMessageCallback callback) override; + void OnInputMethodChanged(const std::string& engine_id) override; void OnFocus(mojom::InputFieldInfoPtr input_field_info) override; void OnBlur() override; void OnKeyEvent(mojom::PhysicalKeyEventPtr event,
diff --git a/chromeos/services/ime/decoder/decoder_engine_unittest.cc b/chromeos/services/ime/decoder/decoder_engine_unittest.cc index 1196449e..0dc23b8 100644 --- a/chromeos/services/ime/decoder/decoder_engine_unittest.cc +++ b/chromeos/services/ime/decoder/decoder_engine_unittest.cc
@@ -53,6 +53,7 @@ ProcessMessageCallback callback) final { std::move(callback).Run({}); } + void OnInputMethodChanged(const std::string& engine_id) final {} void OnFocus(mojom::InputFieldInfoPtr input_field_info) final {} void OnBlur() final {} void ProcessKeypressForRulebased( @@ -103,6 +104,23 @@ EXPECT_TRUE(receiver.is_bound()); } +TEST_F(DecoderEngineTest, OnInputMethodChangedSendsMessageToSharedLib) { + DecoderEngine engine(/*platform=*/nullptr); + StubInputChannel stub_channel; + mojo::Receiver<mojom::InputChannel> receiver(&stub_channel); + mojo::Remote<mojom::InputChannel> client; + ASSERT_TRUE(engine.BindRequest(kImeSpec, client.BindNewPipeAndPassReceiver(), + receiver.BindNewPipeAndPassRemote(), {})); + ime::Wrapper expected_proto; + *expected_proto.mutable_public_message() = + OnInputMethodChangedToProto(/*seq_id=*/0, "xkb:us::eng"); + + EXPECT_CALL(mock_main_entry_, Process).With(EqualsProto(expected_proto)); + + client->OnInputMethodChanged("xkb:us::eng"); + client.FlushForTesting(); +} + TEST_F(DecoderEngineTest, OnFocusSendsMessageToSharedLib) { DecoderEngine engine(/*platform=*/nullptr); StubInputChannel stub_channel;
diff --git a/chromeos/services/ime/decoder/proto_conversion.cc b/chromeos/services/ime/decoder/proto_conversion.cc index f497c2e..1fb5896 100644 --- a/chromeos/services/ime/decoder/proto_conversion.cc +++ b/chromeos/services/ime/decoder/proto_conversion.cc
@@ -63,6 +63,15 @@ } // namespace +ime::PublicMessage OnInputMethodChangedToProto(uint64_t seq_id, + const std::string& engine_id) { + ime::PublicMessage message; + message.set_seq_id(seq_id); + + message.mutable_on_input_method_changed()->set_engine_id(engine_id); + return message; +} + ime::PublicMessage OnFocusToProto(uint64_t seq_id, mojom::InputFieldInfoPtr input_field_info) { ime::PublicMessage message;
diff --git a/chromeos/services/ime/decoder/proto_conversion.h b/chromeos/services/ime/decoder/proto_conversion.h index 35fa41fd..9e5a9a0f 100644 --- a/chromeos/services/ime/decoder/proto_conversion.h +++ b/chromeos/services/ime/decoder/proto_conversion.h
@@ -13,6 +13,11 @@ namespace chromeos { namespace ime { +// Converts arguments of a Mojo call to InputChannel::OnInputMethodChanged into +// a proto. +ime::PublicMessage OnInputMethodChangedToProto(uint64_t seq_id, + const std::string& engine_id); + // Converts arguments of a Mojo call to InputChannel::OnFocus into a proto. ime::PublicMessage OnFocusToProto(uint64_t seq_id, mojom::InputFieldInfoPtr input_field_info);
diff --git a/chromeos/services/ime/decoder/proto_conversion_unittest.cc b/chromeos/services/ime/decoder/proto_conversion_unittest.cc index fca998b0..4deefb2 100644 --- a/chromeos/services/ime/decoder/proto_conversion_unittest.cc +++ b/chromeos/services/ime/decoder/proto_conversion_unittest.cc
@@ -10,6 +10,20 @@ namespace chromeos { namespace ime { +TEST(ProtoConversionTest, OnInputMethodChangedToProto) { + ime::PublicMessage expected_message; + expected_message.set_seq_id(42); + ime::OnInputMethodChanged& args = + *expected_message.mutable_on_input_method_changed(); + args.set_engine_id("xkb:us::eng"); + + ime::PublicMessage actual_message = + OnInputMethodChangedToProto(/*seq_id=*/42, "xkb:us::eng"); + + EXPECT_EQ(actual_message.SerializeAsString(), + expected_message.SerializeAsString()); +} + TEST(ProtoConversionTest, OnFocusToProto) { auto info = mojom::InputFieldInfo::New(mojom::InputFieldType::kNumber, mojom::AutocorrectMode::kEnabled,
diff --git a/chromeos/services/ime/ime_service_unittest.cc b/chromeos/services/ime/ime_service_unittest.cc index ec15abb..8f54d2b 100644 --- a/chromeos/services/ime/ime_service_unittest.cc +++ b/chromeos/services/ime/ime_service_unittest.cc
@@ -55,6 +55,7 @@ MOCK_METHOD2(ProcessMessage, void(const std::vector<uint8_t>& message, ProcessMessageCallback)); + MOCK_METHOD1(OnInputMethodChanged, void(const std::string& engine_id)); MOCK_METHOD1(OnFocus, void(mojom::InputFieldInfoPtr input_field_info)); MOCK_METHOD0(OnBlur, void()); MOCK_METHOD2(ProcessKeypressForRulebased,
diff --git a/chromeos/services/ime/input_engine.cc b/chromeos/services/ime/input_engine.cc index 0cdfcc7..6aa0bce 100644 --- a/chromeos/services/ime/input_engine.cc +++ b/chromeos/services/ime/input_engine.cc
@@ -107,6 +107,10 @@ NOTIMPLEMENTED(); // Protobuf message is not used in the rulebased engine. } +void InputEngine::OnInputMethodChanged(const std::string& engine_id) { + NOTIMPLEMENTED(); // Not used in the rulebased engine. +} + void InputEngine::OnFocus(mojom::InputFieldInfoPtr input_field_info) { NOTIMPLEMENTED(); // Not used in the rulebased engine. }
diff --git a/chromeos/services/ime/input_engine.h b/chromeos/services/ime/input_engine.h index 3f8befa..7886ee32 100644 --- a/chromeos/services/ime/input_engine.h +++ b/chromeos/services/ime/input_engine.h
@@ -46,6 +46,7 @@ // mojom::InputChannel overrides: void ProcessMessage(const std::vector<uint8_t>& message, ProcessMessageCallback callback) override; + void OnInputMethodChanged(const std::string& engine_id) override; void OnFocus(mojom::InputFieldInfoPtr input_field_info) override; void OnBlur() override; void OnSurroundingTextChanged(
diff --git a/chromeos/services/ime/public/mojom/input_engine.mojom b/chromeos/services/ime/public/mojom/input_engine.mojom index 05ba81c..b5de25a 100644 --- a/chromeos/services/ime/public/mojom/input_engine.mojom +++ b/chromeos/services/ime/public/mojom/input_engine.mojom
@@ -164,6 +164,11 @@ // protobuf message. ProcessMessage(array<uint8> message) => (array<uint8> result); + // Called when the input method changes. + // |engine_id| is the unique identifier for the input method, as specified in: + // chrome/browser/resources/chromeos/input_method/google_xkb_manifest.json + OnInputMethodChanged(string engine_id); + // Called when there's a new focused input field. OnFocus(InputFieldInfo input_field_info);
diff --git a/chromeos/services/ime/public/proto/messages.proto b/chromeos/services/ime/public/proto/messages.proto index d1f51bd..9347c577 100644 --- a/chromeos/services/ime/public/proto/messages.proto +++ b/chromeos/services/ime/public/proto/messages.proto
@@ -35,6 +35,7 @@ OnSurroundingTextChanged on_surrounding_text_changed = 5; OnBlur on_blur = 6; OnCompositionCanceled on_composition_canceled = 7; + OnInputMethodChanged on_input_method_changed = 8; } } @@ -70,6 +71,12 @@ optional PersonalizationMode personalization = 3; } +// Protobuf version of InputEngine::OnInputMethodChanged in +// chromeos/services/ime/public/mojom/input_engine.mojom +message OnInputMethodChanged { + optional string engine_id = 1; +} + // Protobuf version of InputEngine::OnFocus in // chromeos/services/ime/public/mojom/input_engine.mojom message OnFocus {
diff --git a/chromeos/ui/base/BUILD.gn b/chromeos/ui/base/BUILD.gn index 1c3c5001..a508945a 100644 --- a/chromeos/ui/base/BUILD.gn +++ b/chromeos/ui/base/BUILD.gn
@@ -29,6 +29,7 @@ "//base", "//skia", "//ui/base", + "//ui/display", "//ui/gfx/geometry", ] }
diff --git a/chromeos/ui/base/DEPS b/chromeos/ui/base/DEPS index 8423e250..875d72eb 100644 --- a/chromeos/ui/base/DEPS +++ b/chromeos/ui/base/DEPS
@@ -1,5 +1,6 @@ include_rules = [ - "+ui/base", "+third_party/skia", + "+ui/base", + "+ui/display", "+ui/gfx", ]
diff --git a/chromeos/ui/base/tablet_state.cc b/chromeos/ui/base/tablet_state.cc index b4cde3e..dc1c1071 100644 --- a/chromeos/ui/base/tablet_state.cc +++ b/chromeos/ui/base/tablet_state.cc
@@ -35,11 +35,11 @@ } bool TabletState::InTabletMode() const { - return state_ == TabletState::kInTabletMode || - state_ == TabletState::kEnteringTabletMode; + return state_ == display::TabletState::kInTabletMode || + state_ == display::TabletState::kEnteringTabletMode; } -void TabletState::SetState(State state) { +void TabletState::SetState(display::TabletState state) { state_ = state; for (auto& observer : observers_)
diff --git a/chromeos/ui/base/tablet_state.h b/chromeos/ui/base/tablet_state.h index b14ca62..b95fdeb 100644 --- a/chromeos/ui/base/tablet_state.h +++ b/chromeos/ui/base/tablet_state.h
@@ -7,6 +7,7 @@ #include "base/component_export.h" #include "base/observer_list.h" +#include "ui/display/tablet_state.h" namespace ash { class TabletModeController; @@ -23,18 +24,9 @@ // Returns the singleton instance. static TabletState* Get(); - // Tracks whether we are in the process of entering or exiting tablet mode. - // Used for logging histogram metrics. - enum State { - kInClamshellMode, - kEnteringTabletMode, - kInTabletMode, - kExitingTabletMode, - }; - class COMPONENT_EXPORT(CHROMEOS_UI_BASE) Observer { public: - virtual void OnTabletStateChanged(State state) = 0; + virtual void OnTabletStateChanged(display::TabletState state) = 0; protected: virtual ~Observer() = default; @@ -51,18 +43,18 @@ // Returns true if the system is in tablet mode. bool InTabletMode() const; - State state() const { return state_; } + display::TabletState state() const { return state_; } private: // The friend class declaration here is used to control classes that can set // the tablet state. friend class ash::TabletModeController; - void SetState(State state); + void SetState(display::TabletState state); base::ObserverList<Observer>::Unchecked observers_; - State state_ = State::kInClamshellMode; + display::TabletState state_ = display::TabletState::kInClamshellMode; }; } // namespace chromeos
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index 1fcafb9..bde59a3 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -15,6 +15,7 @@ #include "base/mac/foundation_util.h" #include "base/memory/weak_ptr.h" #include "base/metrics/field_trial.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" #include "base/strings/sys_string_conversions.h" @@ -107,7 +108,8 @@ void UpdateFieldManagerWithFillingResults( scoped_refptr<FieldDataManager> fieldDataManager, - NSString* jsonString) { + NSString* jsonString, + size_t numFieldsInFormData) { std::map<uint32_t, base::string16> fillingResults; if (autofill::ExtractFillingResults(jsonString, &fillingResults)) { for (auto& fillData : fillingResults) { @@ -116,6 +118,8 @@ kAutofilledOnUserTrigger); } } + // TODO(crbug/1131038): Remove once the experiment is over. + UMA_HISTOGRAM_BOOLEAN("Autofill.FormFillSuccessIOS", !fillingResults.empty()); } void UpdateFieldManagerForClearedIDs( @@ -944,6 +948,7 @@ SuggestionHandledCompletion suggestionHandledCompletionCopy = [_suggestionHandledCompletion copy]; _suggestionHandledCompletion = nil; + size_t numFieldsInFormData = data->FindPath("fields")->DictSize(); [_jsAutofillManager fillForm:std::move(data) forceFillFieldIdentifier:SysUTF16ToNSString(_pendingAutocompleteField) forceFillFieldUniqueID:_pendingAutocompleteFieldID @@ -953,7 +958,8 @@ if (!strongSelf) return; UpdateFieldManagerWithFillingResults( - strongSelf->_fieldDataManager, jsonString); + strongSelf->_fieldDataManager, jsonString, + numFieldsInFormData); // It is possible that the fill was not initiated by selecting // a suggestion in this case the callback is nil. if (suggestionHandledCompletionCopy)
diff --git a/components/browser_ui/styles/android/java/res/values-night/colors.xml b/components/browser_ui/styles/android/java/res/values-night/colors.xml index e005ee9..4136af65d 100644 --- a/components/browser_ui/styles/android/java/res/values-night/colors.xml +++ b/components/browser_ui/styles/android/java/res/values-night/colors.xml
@@ -10,8 +10,4 @@ <color name="control_highlight_color">@color/default_control_color_highlight_dark</color> <color name="text_highlight_color">@color/highlight_color_on_light_text</color> - - <!-- Navigation bar colors --> - <color name="bottom_system_nav_color">@android:color/black</color> - <color name="bottom_system_nav_divider_color">@android:color/black</color> </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/colors.xml b/components/browser_ui/styles/android/java/res/values/colors.xml index a24b7d5f..0f54fd8 100644 --- a/components/browser_ui/styles/android/java/res/values/colors.xml +++ b/components/browser_ui/styles/android/java/res/values/colors.xml
@@ -32,6 +32,6 @@ <color name="default_favicon_background_color">@color/default_control_color_normal_light</color> <!-- Navigation bar colors --> - <color name="bottom_system_nav_color">@color/modern_white</color> - <color name="bottom_system_nav_divider_color">@color/black_alpha_12</color> + <color name="bottom_system_nav_color">@color/toolbar_background_primary</color> + <color name="bottom_system_nav_divider_color">@color/hairline_stroke_color</color> </resources>
diff --git a/components/cronet/cronet_prefs_manager.cc b/components/cronet/cronet_prefs_manager.cc index d3f4557..acec3dd 100644 --- a/components/cronet/cronet_prefs_manager.cc +++ b/components/cronet/cronet_prefs_manager.cc
@@ -110,11 +110,11 @@ ~PrefServiceAdapter() override {} // PrefDelegate implementation. - const base::DictionaryValue* GetServerProperties() const override { - return pref_service_->GetDictionary(path_); + const base::Value* GetServerProperties() const override { + return pref_service_->Get(path_); } - void SetServerProperties(const base::DictionaryValue& value, + void SetServerProperties(const base::Value& value, base::OnceClosure callback) override { pref_service_->Set(path_, value); if (callback)
diff --git a/components/download/internal/common/download_job_factory.cc b/components/download/internal/common/download_job_factory.cc index 052f69f..f40905b 100644 --- a/components/download/internal/common/download_job_factory.cc +++ b/components/download/internal/common/download_job_factory.cc
@@ -13,7 +13,6 @@ #include "components/download/internal/common/save_package_download_job.h" #include "components/download/public/common/download_features.h" #include "components/download/public/common/download_item.h" -#include "components/download/public/common/download_stats.h" #include "net/http/http_response_info.h" namespace download { @@ -92,47 +91,6 @@ has_content_length && satisfy_min_file_size && satisfy_connection_type && http_get_method && can_support_parallel_requests; - - if (!IsParallelDownloadEnabled()) - return is_parallelizable; - - RecordParallelDownloadCreationEvent( - is_parallelizable - ? ParallelDownloadCreationEvent::STARTED_PARALLEL_DOWNLOAD - : ParallelDownloadCreationEvent::FELL_BACK_TO_NORMAL_DOWNLOAD); - if (!has_strong_validator) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_STRONG_VALIDATORS); - } - if (!range_support_allowed) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_ACCEPT_RANGE_HEADER); - if (create_info.accept_range == RangeRequestSupportType::kUnknown) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_UNKNOWN_RANGE_SUPPORT); - } - } - if (!has_content_length) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_CONTENT_LENGTH_HEADER); - } - if (!satisfy_min_file_size) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_FILE_SIZE); - } - if (!satisfy_connection_type) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_CONNECTION_TYPE); - } - if (!http_get_method) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_HTTP_METHOD); - } - if (!can_support_parallel_requests) { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent:: - FALLBACK_REASON_RESUMPTION_WITHOUT_SLICES); - } return is_parallelizable; }
diff --git a/components/download/internal/common/download_stats.cc b/components/download/internal/common/download_stats.cc index 8d8e020c..3d9f4b61 100644 --- a/components/download/internal/common/download_stats.cc +++ b/components/download/internal/common/download_stats.cc
@@ -672,11 +672,6 @@ } } -void RecordParallelDownloadCreationEvent(ParallelDownloadCreationEvent event) { - UMA_HISTOGRAM_ENUMERATION("Download.ParallelDownload.CreationEvent", event, - ParallelDownloadCreationEvent::COUNT); -} - void RecordSavePackageEvent(SavePackageEvent event) { UMA_HISTOGRAM_ENUMERATION("Download.SavePackage", event, SAVE_PACKAGE_LAST_ENTRY);
diff --git a/components/download/internal/common/parallel_download_job.cc b/components/download/internal/common/parallel_download_job.cc index 330a85d..c4c8847 100644 --- a/components/download/internal/common/parallel_download_job.cc +++ b/components/download/internal/common/parallel_download_job.cc
@@ -185,9 +185,6 @@ first_slice_offset, content_length_ - first_slice_offset + initial_request_offset_, GetParallelRequestCount(), GetMinSliceSize()); - } else { - RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent::FALLBACK_REASON_REMAINING_TIME); } }
diff --git a/components/download/public/common/download_stats.h b/components/download/public/common/download_stats.h index 90d8095..06dc85c 100644 --- a/components/download/public/common/download_stats.h +++ b/components/download/public/common/download_stats.h
@@ -173,51 +173,6 @@ kMaxValue = kCacheMigrationFailedCount }; -// When parallel download is enabled, the download may fall back to a normal -// download for various reasons. This enum counts the number of parallel -// download and fallbacks. Also records the reasons why the download falls back -// to a normal download. The reasons are not mutually exclusive. -// Used in histogram "Download.ParallelDownload.CreationEvent" and should be -// treated as append-only. -enum class ParallelDownloadCreationEvent { - // The total number of downloads started as parallel download. - STARTED_PARALLEL_DOWNLOAD = 0, - - // The total number of downloads fell back to normal download when parallel - // download is enabled. - FELL_BACK_TO_NORMAL_DOWNLOAD, - - // No ETag or Last-Modified response header. - FALLBACK_REASON_STRONG_VALIDATORS, - - // No Accept-Range response header. - FALLBACK_REASON_ACCEPT_RANGE_HEADER, - - // No Content-Length response header. - FALLBACK_REASON_CONTENT_LENGTH_HEADER, - - // File size is not complied to finch configuration. - FALLBACK_REASON_FILE_SIZE, - - // The HTTP connection type does not meet the requirement. - FALLBACK_REASON_CONNECTION_TYPE, - - // The remaining time does not meet the requirement. - FALLBACK_REASON_REMAINING_TIME, - - // The http method or url scheme does not meet the requirement. - FALLBACK_REASON_HTTP_METHOD, - - // Range support is unknown from the response. - FALLBACK_REASON_UNKNOWN_RANGE_SUPPORT, - - // Resumed download doesn't have any slices. - FALLBACK_REASON_RESUMPTION_WITHOUT_SLICES, - - // Last entry of the enum. - COUNT, -}; - // Events for user scheduled downloads. Used in histograms, don't reuse or // remove items. Keep in sync with DownloadLaterEvent in enums.xml. enum class DownloadLaterEvent { @@ -321,11 +276,6 @@ int64_t bytes_downloaded, const base::TimeDelta& time_span); -// Records the parallel download creation counts and the reasons why the -// download falls back to non-parallel download. -COMPONENTS_DOWNLOAD_EXPORT void RecordParallelDownloadCreationEvent( - ParallelDownloadCreationEvent event); - // Record the result of a download file rename. COMPONENTS_DOWNLOAD_EXPORT void RecordDownloadFileRenameResultAfterRetry( base::TimeDelta time_since_first_failure,
diff --git a/components/metrics/unsent_log_store.cc b/components/metrics/unsent_log_store.cc index 5175649d..928dd66 100644 --- a/components/metrics/unsent_log_store.cc +++ b/components/metrics/unsent_log_store.cc
@@ -162,6 +162,7 @@ DCHECK_LT(static_cast<size_t>(staged_log_index_), list_.size()); if (list_[staged_log_index_]->samples_count.has_value()) total_samples_sent_ += list_[staged_log_index_]->samples_count.value(); + metrics_->RecordSentLog(); } void UnsentLogStore::TrimAndPersistUnsentLogs() { @@ -303,6 +304,7 @@ size_t dropped_logs_count = list_.size() - trimmed_list.size(); if (dropped_logs_count > 0) metrics_->RecordDroppedLogsNum(dropped_logs_count); + metrics_->RecordIntendingToSentLogs(trimmed_list.size()); // Put the trimmed list in the correct place. list_.swap(trimmed_list);
diff --git a/components/metrics/unsent_log_store_metrics.cc b/components/metrics/unsent_log_store_metrics.cc index 426f4fc..de1622e 100644 --- a/components/metrics/unsent_log_store_metrics.cc +++ b/components/metrics/unsent_log_store_metrics.cc
@@ -22,6 +22,10 @@ void UnsentLogStoreMetrics::RecordDroppedLogsNum(int dropped_logs_num) {} +void UnsentLogStoreMetrics::RecordIntendingToSentLogs(int num) {} + +void UnsentLogStoreMetrics::RecordSentLog() {} + void UnsentLogStoreMetrics::RecordLastUnsentLogMetadataMetrics( int unsent_samples_count, int sent_samples_count,
diff --git a/components/metrics/unsent_log_store_metrics.h b/components/metrics/unsent_log_store_metrics.h index 013a0651..69ef2ff 100644 --- a/components/metrics/unsent_log_store_metrics.h +++ b/components/metrics/unsent_log_store_metrics.h
@@ -40,10 +40,21 @@ virtual void RecordCompressionRatio(size_t compressed_size, size_t original_size); + // Records the size of a dropped log in bytes. virtual void RecordDroppedLogSize(size_t size); + // Record the number of logs that were dropped (not staged). These include + // logs that were dropped due to be being too large and also logs that were + // dropped because there were too many. virtual void RecordDroppedLogsNum(int dropped_logs_num); + // Records the number of logs that were not dropped and instead staged / + // intended to be sent. + virtual void RecordIntendingToSentLogs(int num); + + // Record when a single staged log was sent. + virtual void RecordSentLog(); + virtual void RecordLastUnsentLogMetadataMetrics(int unsent_samples_count, int sent_samples_count, int persisted_size_in_kb);
diff --git a/components/metrics/unsent_log_store_metrics_impl.cc b/components/metrics/unsent_log_store_metrics_impl.cc index f6efa5a0..54f1400 100644 --- a/components/metrics/unsent_log_store_metrics_impl.cc +++ b/components/metrics/unsent_log_store_metrics_impl.cc
@@ -31,6 +31,14 @@ base::UmaHistogramCounts1M("UMA.UnsentLogs.Dropped", dropped_logs_num); } +void RecordIntendingToSentLogs(int num) { + base::UmaHistogramExactLinear("UMA.UnsentLogs.IntendingToSend", num, 22); +} + +void RecordSentLog() { + base::UmaHistogramBoolean("UMA.UnsentLogs.Sent", true); +} + void UnsentLogStoreMetricsImpl::RecordLastUnsentLogMetadataMetrics( int unsent_samples_count, int sent_samples_count,
diff --git a/components/page_load_metrics/browser/BUILD.gn b/components/page_load_metrics/browser/BUILD.gn index ce601841..561688b6 100644 --- a/components/page_load_metrics/browser/BUILD.gn +++ b/components/page_load_metrics/browser/BUILD.gn
@@ -20,6 +20,8 @@ "observers/core/uma_page_load_metrics_observer.h", "observers/layout_page_load_metrics_observer.cc", "observers/layout_page_load_metrics_observer.h", + "observers/prerender_page_load_metrics_observer.cc", + "observers/prerender_page_load_metrics_observer.h", "observers/use_counter/ukm_features.cc", "observers/use_counter_page_load_metrics_observer.cc", "observers/use_counter_page_load_metrics_observer.h", @@ -88,6 +90,7 @@ "observers/core/uma_page_load_metrics_observer_unittest.cc", "observers/page_load_metrics_observer_content_test_harness.cc", "observers/page_load_metrics_observer_content_test_harness.h", + "observers/prerender_page_load_metrics_observer_unittest.cc", "observers/use_counter_page_load_metrics_observer_unittest.cc", "page_load_metrics_util_unittest.cc", "resource_tracker_unittest.cc",
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index 72c2baf6..8bb395b 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -35,6 +35,7 @@ #include "net/base/net_errors.h" #include "services/network/public/mojom/fetch_api.mojom-shared.h" #include "third_party/blink/public/common/loader/resource_type_util.h" +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" #include "ui/base/page_transition_types.h" namespace page_load_metrics { @@ -803,7 +804,8 @@ mojom::FrameRenderDataUpdatePtr render_data, mojom::CpuTimingPtr cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta) { + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness) { // We may receive notifications from frames that have been navigated away // from. We simply ignore them. // TODO(crbug.com/1061060): We should not ignore page timings if the page is @@ -826,7 +828,7 @@ render_frame_host, std::move(timing), std::move(metadata), std::move(new_features), resources, std::move(render_data), std::move(cpu_timing), std::move(new_deferred_resource_data), - std::move(input_timing_delta)); + std::move(input_timing_delta), std::move(mobile_friendliness)); } } @@ -858,13 +860,15 @@ mojom::FrameRenderDataUpdatePtr render_data, mojom::CpuTimingPtr cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta) { + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness) { content::RenderFrameHost* render_frame_host = page_load_metrics_receiver_.GetCurrentTargetFrame(); OnTimingUpdated(render_frame_host, std::move(timing), std::move(metadata), std::move(new_features), resources, std::move(render_data), std::move(cpu_timing), std::move(new_deferred_resource_data), - std::move(input_timing_delta)); + std::move(input_timing_delta), + std::move(mobile_friendliness)); } void MetricsWebContentsObserver::SetUpSharedMemoryForSmoothness(
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h index 0cbee5e..da3dad35 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.h +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.h
@@ -27,6 +27,10 @@ #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom.h" +namespace blink { +struct MobileFriendliness; +} // namespace blink + namespace content { class NavigationHandle; class RenderFrameHost; @@ -162,7 +166,8 @@ mojom::FrameRenderDataUpdatePtr render_data, mojom::CpuTimingPtr cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta); + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness); // Informs the observers of the currently committed load that the event // corresponding to |event_key| has occurred. This should not be called within @@ -181,14 +186,17 @@ content::NavigationHandle* navigation_handle); // page_load_metrics::mojom::PageLoadMetrics implementation. - void UpdateTiming(mojom::PageLoadTimingPtr timing, - mojom::FrameMetadataPtr metadata, - mojom::PageLoadFeaturesPtr new_features, - std::vector<mojom::ResourceDataUpdatePtr> resources, - mojom::FrameRenderDataUpdatePtr render_data, - mojom::CpuTimingPtr cpu_timing, - mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing) override; + void UpdateTiming( + mojom::PageLoadTimingPtr timing, + mojom::FrameMetadataPtr metadata, + mojom::PageLoadFeaturesPtr new_features, + std::vector<mojom::ResourceDataUpdatePtr> resources, + mojom::FrameRenderDataUpdatePtr render_data, + mojom::CpuTimingPtr cpu_timing, + mojom::DeferredResourceCountsPtr new_deferred_resource_data, + mojom::InputTimingPtr input_timing, + const blink::MobileFriendliness& mobile_friendliness) override; + void SetUpSharedMemoryForSmoothness( base::ReadOnlySharedMemoryRegion shared_memory) override;
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc index 0a218b62..121cc7f1 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer_unittest.cc
@@ -113,7 +113,7 @@ std::vector<mojom::ResourceDataUpdatePtr>(), mojom::FrameRenderDataUpdatePtr(base::in_place), timing.Clone(), mojom::DeferredResourceCountsPtr(base::in_place), - mojom::InputTimingPtr(base::in_place)); + mojom::InputTimingPtr(base::in_place), blink::MobileFriendliness()); } void SimulateTimingUpdate(const mojom::PageLoadTiming& timing, @@ -139,7 +139,7 @@ mojom::FrameRenderDataUpdatePtr(base::in_place), mojom::CpuTimingPtr(base::in_place), mojom::DeferredResourceCountsPtr(base::in_place), - mojom::InputTimingPtr(base::in_place)); + mojom::InputTimingPtr(base::in_place), blink::MobileFriendliness()); } void AttachObserver() {
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc index a7ead53..cf729f28 100644 --- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc +++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.cc
@@ -23,6 +23,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom.h" +#include "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom.h" #include "url/gurl.h" namespace page_load_metrics { @@ -112,7 +113,8 @@ SimulatePageLoadTimingUpdate( timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), - mojom::DeferredResourceCounts(), mojom::InputTiming(), rfh); + mojom::DeferredResourceCounts(), mojom::InputTiming(), + blink::MobileFriendliness(), rfh); } void PageLoadMetricsObserverTester::SimulateCpuTimingUpdate( @@ -128,7 +130,8 @@ SimulatePageLoadTimingUpdate( *timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), cpu_timing, - mojom::DeferredResourceCounts(), mojom::InputTiming(), rfh); + mojom::DeferredResourceCounts(), mojom::InputTiming(), + blink::MobileFriendliness(), rfh); } void PageLoadMetricsObserverTester::SimulateInputTimingUpdate( @@ -144,7 +147,8 @@ SimulatePageLoadTimingUpdate( *timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), - mojom::DeferredResourceCounts(), input_timing, rfh); + mojom::DeferredResourceCounts(), input_timing, + blink::MobileFriendliness(), rfh); } void PageLoadMetricsObserverTester::SimulateTimingAndMetadataUpdate( @@ -154,7 +158,7 @@ timing, metadata, mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), mojom::DeferredResourceCounts(), mojom::InputTiming(), - web_contents()->GetMainFrame()); + blink::MobileFriendliness(), web_contents()->GetMainFrame()); } void PageLoadMetricsObserverTester::SimulateMetadataUpdate( @@ -165,7 +169,8 @@ SimulatePageLoadTimingUpdate( timing, metadata, mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), - mojom::DeferredResourceCounts(), mojom::InputTiming(), rfh); + mojom::DeferredResourceCounts(), mojom::InputTiming(), + blink::MobileFriendliness(), rfh); } void PageLoadMetricsObserverTester::SimulateFeaturesUpdate( @@ -174,7 +179,7 @@ mojom::PageLoadTiming(), mojom::FrameMetadata(), new_features, mojom::FrameRenderDataUpdate(), mojom::CpuTiming(), mojom::DeferredResourceCounts(), mojom::InputTiming(), - web_contents()->GetMainFrame()); + blink::MobileFriendliness(), web_contents()->GetMainFrame()); } void PageLoadMetricsObserverTester::SimulateRenderDataUpdate( @@ -190,7 +195,7 @@ SimulatePageLoadTimingUpdate( timing, mojom::FrameMetadata(), mojom::PageLoadFeatures(), render_data, mojom::CpuTiming(), mojom::DeferredResourceCounts(), mojom::InputTiming(), - rfh); + blink::MobileFriendliness(), rfh); } void PageLoadMetricsObserverTester::SimulatePageLoadTimingUpdate( @@ -201,12 +206,13 @@ const mojom::CpuTiming& cpu_timing, const mojom::DeferredResourceCounts& new_deferred_resource_data, const mojom::InputTiming& input_timing, + const blink::MobileFriendliness& mobile_friendliness, content::RenderFrameHost* rfh) { metrics_web_contents_observer_->OnTimingUpdated( rfh, timing.Clone(), metadata.Clone(), new_features.Clone(), std::vector<mojom::ResourceDataUpdatePtr>(), render_data.Clone(), cpu_timing.Clone(), new_deferred_resource_data.Clone(), - input_timing.Clone()); + input_timing.Clone(), mobile_friendliness); // If sending the timing update caused the PageLoadMetricsUpdateDispatcher to // schedule a buffering timer, then fire it now so metrics are dispatched to // observers. @@ -232,7 +238,7 @@ mojom::FrameRenderDataUpdatePtr(base::in_place), mojom::CpuTimingPtr(base::in_place), mojom::DeferredResourceCountsPtr(base::in_place), - mojom::InputTimingPtr(base::in_place)); + mojom::InputTimingPtr(base::in_place), blink::MobileFriendliness()); } void PageLoadMetricsObserverTester::SimulateLoadedResource( @@ -306,6 +312,15 @@ url, first_party_url, blocked_by_policy, storage_type); } +void PageLoadMetricsObserverTester::SimulateMobileFriendlinessUpdate( + blink::MobileFriendliness& mobile_friendliness) { + SimulatePageLoadTimingUpdate( + mojom::PageLoadTiming(), mojom::FrameMetadata(), + mojom::PageLoadFeatures(), mojom::FrameRenderDataUpdate(), + mojom::CpuTiming(), mojom::DeferredResourceCounts(), mojom::InputTiming(), + mobile_friendliness, web_contents()->GetMainFrame()); +} + const PageLoadMetricsObserverDelegate& PageLoadMetricsObserverTester::GetDelegateForCommittedLoad() const { return metrics_web_contents_observer_->GetDelegateForCommittedLoad();
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h index f97dfa2..5bde3dd8 100644 --- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h +++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h
@@ -141,6 +141,9 @@ bool blocked_by_policy, StorageType storage_type); + void SimulateMobileFriendlinessUpdate( + blink::MobileFriendliness& mobile_friendliness); + MetricsWebContentsObserver* metrics_web_contents_observer() { return metrics_web_contents_observer_; } @@ -162,6 +165,7 @@ const mojom::CpuTiming& cpu_timing, const mojom::DeferredResourceCounts& new_deferred_resource_data, const mojom::InputTiming& input_timing, + const blink::MobileFriendliness& mobile_friendliness, content::RenderFrameHost* rfh); content::WebContents* web_contents() const { return web_contents_; }
diff --git a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc new file mode 100644 index 0000000..8b7c369 --- /dev/null +++ b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.cc
@@ -0,0 +1,48 @@ +// Copyright 2020 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/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h" + +#include "components/page_load_metrics/browser/metrics_web_contents_observer.h" +#include "content/public/browser/web_contents.h" +#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" + +void PrerenderPageLoadMetricsObserver::OnFirstContentfulPaintInPage( + const page_load_metrics::mojom::PageLoadTiming& timing) { + did_fcp_ = true; +} + +void PrerenderPageLoadMetricsObserver::OnStorageAccessed( + const GURL& url, + const GURL& first_party_url, + bool blocked_by_policy, + page_load_metrics::StorageType access_type) { + if (access_type != page_load_metrics::StorageType::kLocalStorage || + did_local_storage_) + return; + + // The purpose of this observer is to estimate how many prerendering pages + // will use certain features. The plan for prerendering is to delay loading + // of cross-origin iframes, so we want to ignore feature uses inside + // cross-origin iframes. To do this, just check if the |url| is cross-origin + // to |first_party_url|. This may not be an accurate count if a third-party + // subframe embeds a first-party subframe, or if there is a way for a frame + // to access cross-origin storage, but it's probably not significant. + if (!url::IsSameOriginWith(url, first_party_url)) + return; + + did_local_storage_ = true; + RecordFeatureUse( + did_fcp_ ? blink::mojom::WebFeature::kLocalStorageFirstUsedAfterFcp + : blink::mojom::WebFeature::kLocalStorageFirstUsedBeforeFcp); +} + +void PrerenderPageLoadMetricsObserver::RecordFeatureUse( + blink::mojom::WebFeature feature) { + page_load_metrics::mojom::PageLoadFeatures page_load_features; + page_load_features.features.push_back(feature); + + page_load_metrics::MetricsWebContentsObserver::RecordFeatureUsage( + GetDelegate().GetWebContents()->GetMainFrame(), page_load_features); +}
diff --git a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h new file mode 100644 index 0000000..ee6b087 --- /dev/null +++ b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h
@@ -0,0 +1,40 @@ +// Copyright 2020 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 COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_PRERENDER_PAGE_LOAD_METRICS_OBSERVER_H_ +#define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_PRERENDER_PAGE_LOAD_METRICS_OBSERVER_H_ + +#include "components/page_load_metrics/browser/page_load_metrics_observer.h" + +namespace blink { +namespace mojom { +enum class WebFeature : int32_t; +} // namespace mojom +} // namespace blink + +// Records metrics relevant to prerendering. Currently it logs feature usage in +// normal page loads which, when if used during prerendering, may result in +// cancelling or freezing the prerender, to help estimate the effect on +// coverage. +class PrerenderPageLoadMetricsObserver + : public page_load_metrics::PageLoadMetricsObserver { + public: + PrerenderPageLoadMetricsObserver() = default; + + // page_load_metrics::PageLoadMetricsObserver implementation: + void OnFirstContentfulPaintInPage( + const page_load_metrics::mojom::PageLoadTiming& timing) override; + void OnStorageAccessed(const GURL& url, + const GURL& first_party_url, + bool blocked_by_policy, + page_load_metrics::StorageType access_type) override; + + private: + void RecordFeatureUse(blink::mojom::WebFeature feature); + + bool did_fcp_ = false; + bool did_local_storage_ = false; +}; + +#endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_PRERENDER_PAGE_LOAD_METRICS_OBSERVER_H_
diff --git a/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer_unittest.cc b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer_unittest.cc new file mode 100644 index 0000000..ba6455cf --- /dev/null +++ b/components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer_unittest.cc
@@ -0,0 +1,124 @@ +// Copyright 2020 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/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h" + +#include <memory> + +#include "components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h" +#include "components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.h" +#include "components/page_load_metrics/browser/page_load_tracker.h" +#include "components/page_load_metrics/common/test/page_load_metrics_test_util.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/navigation_simulator.h" + +namespace { + +const char kDefaultTestUrl[] = "https://a.test"; +const char kOtherOriginUrl[] = "https://b.test"; +const char kFeaturesHistogramName[] = "Blink.UseCounter.Features"; + +class PrerenderPageLoadMetricsObserverTest + : public page_load_metrics::PageLoadMetricsObserverContentTestHarness { + protected: + void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override { + // PrerenderPageLoadMetricsObserver requires + // UseCounterPageLoadMetricsObserver to log UseCounter to UMA. + tracker->AddObserver(std::make_unique<UseCounterPageLoadMetricsObserver>()); + + tracker->AddObserver(std::make_unique<PrerenderPageLoadMetricsObserver>()); + } + + void SimulateFirstContentfulPaint() { + page_load_metrics::mojom::PageLoadTiming timing; + page_load_metrics::InitPageLoadTimingForTest(&timing); + timing.navigation_start = base::Time::Now(); + timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(50); + timing.paint_timing->first_contentful_paint = + base::TimeDelta::FromMilliseconds(100); + PopulateRequiredTimingFields(&timing); + tester()->SimulateTimingUpdate(timing); + } + + int GetPageVisits() { + return tester()->histogram_tester().GetBucketCount( + kFeaturesHistogramName, static_cast<base::Histogram::Sample>( + blink::mojom::WebFeature::kPageVisits)); + } + + int GetLocalStorageBeforeFcpCount() { + return tester()->histogram_tester().GetBucketCount( + kFeaturesHistogramName, + static_cast<base::Histogram::Sample>( + blink::mojom::WebFeature::kLocalStorageFirstUsedBeforeFcp)); + } + + int GetLocalStorageAfterFcpCount() { + return tester()->histogram_tester().GetBucketCount( + kFeaturesHistogramName, + static_cast<base::Histogram::Sample>( + blink::mojom::WebFeature::kLocalStorageFirstUsedAfterFcp)); + } +}; + +TEST_F(PrerenderPageLoadMetricsObserverTest, NoLocalStorage) { + NavigateAndCommit(GURL(kDefaultTestUrl)); + + EXPECT_EQ(GetPageVisits(), 1); + EXPECT_EQ(GetLocalStorageBeforeFcpCount(), 0); + EXPECT_EQ(GetLocalStorageAfterFcpCount(), 0); +} + +TEST_F(PrerenderPageLoadMetricsObserverTest, LocalStorageBeforeFcp) { + NavigateAndCommit(GURL(kDefaultTestUrl)); + + // Access local storage. + tester()->SimulateStorageAccess( + GURL(kDefaultTestUrl), GURL(kDefaultTestUrl), false, + page_load_metrics::StorageType::kLocalStorage); + + // Reach FCP. + SimulateFirstContentfulPaint(); + + // Access local storage again. + tester()->SimulateStorageAccess( + GURL(kDefaultTestUrl), GURL(kDefaultTestUrl), false, + page_load_metrics::StorageType::kLocalStorage); + + EXPECT_EQ(GetPageVisits(), 1); + EXPECT_EQ(GetLocalStorageBeforeFcpCount(), 1); + // The UMA counts the first use, so AfterFcp is 0. + EXPECT_EQ(GetLocalStorageAfterFcpCount(), 0); +} + +TEST_F(PrerenderPageLoadMetricsObserverTest, LocalStorageAfterFcp) { + NavigateAndCommit(GURL(kDefaultTestUrl)); + + // Reach FCP. + SimulateFirstContentfulPaint(); + + // Access local storage. + tester()->SimulateStorageAccess( + GURL(kDefaultTestUrl), GURL(kDefaultTestUrl), false, + page_load_metrics::StorageType::kLocalStorage); + + EXPECT_EQ(GetPageVisits(), 1); + EXPECT_EQ(GetLocalStorageBeforeFcpCount(), 0); + EXPECT_EQ(GetLocalStorageAfterFcpCount(), 1); +} + +TEST_F(PrerenderPageLoadMetricsObserverTest, ThirdPartyLocalStorage) { + NavigateAndCommit(GURL(kDefaultTestUrl)); + + tester()->SimulateStorageAccess( + GURL(kOtherOriginUrl), GURL(kDefaultTestUrl), false, + page_load_metrics::StorageType::kLocalStorage); + + // Cross-origin local storage is not logged. + EXPECT_EQ(GetPageVisits(), 1); + EXPECT_EQ(GetLocalStorageBeforeFcpCount(), 0); + EXPECT_EQ(GetLocalStorageAfterFcpCount(), 0); +} + +} // namespace
diff --git a/components/page_load_metrics/browser/page_load_metrics_embedder_base.cc b/components/page_load_metrics/browser/page_load_metrics_embedder_base.cc index 4b19375..c51ce24 100644 --- a/components/page_load_metrics/browser/page_load_metrics_embedder_base.cc +++ b/components/page_load_metrics/browser/page_load_metrics_embedder_base.cc
@@ -9,6 +9,7 @@ #include "components/page_load_metrics/browser/observers/back_forward_cache_page_load_metrics_observer.h" #include "components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.h" #include "components/page_load_metrics/browser/observers/layout_page_load_metrics_observer.h" +#include "components/page_load_metrics/browser/observers/prerender_page_load_metrics_observer.h" #include "components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.h" #include "components/page_load_metrics/browser/page_load_tracker.h" @@ -28,6 +29,11 @@ tracker->AddObserver(std::make_unique<UmaPageLoadMetricsObserver>()); tracker->AddObserver(std::make_unique<LayoutPageLoadMetricsObserver>()); tracker->AddObserver(std::make_unique<UseCounterPageLoadMetricsObserver>()); + + // So far, PrerenderPageLoadMetricsObserver is used to gather metrics from + // normal (non-prerendering) page loads, to estimate future coverage of + // prerendering, so it's in the !IsPrerendering() block. + tracker->AddObserver(std::make_unique<PrerenderPageLoadMetricsObserver>()); } // Allow the embedder to register any embedder-specific observers RegisterEmbedderObservers(tracker);
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h index 6c85b7a..2edd339 100644 --- a/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h +++ b/components/page_load_metrics/browser/page_load_metrics_observer_delegate.h
@@ -17,6 +17,10 @@ class WebContents; } // namespace content +namespace blink { +struct MobileFriendliness; +} // namespace blink + namespace page_load_metrics { namespace mojom { @@ -119,6 +123,7 @@ virtual const PageRenderData& GetPageRenderData() const = 0; // InputTiming data accumulated across all frames. virtual const mojom::InputTiming& GetPageInputTiming() const = 0; + virtual const blink::MobileFriendliness& GetMobileFriendliness() const = 0; virtual const PageRenderData& GetMainFrameRenderData() const = 0; virtual const ui::ScopedVisibilityTracker& GetVisibilityTracker() const = 0; virtual const ResourceTracker& GetResourceTracker() const = 0;
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc index f5e3667..2d73613 100644 --- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc +++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
@@ -439,7 +439,8 @@ pending_merged_page_timing_(CreatePageLoadTiming()), main_frame_metadata_(mojom::FrameMetadata::New()), subframe_metadata_(mojom::FrameMetadata::New()), - page_input_timing_(mojom::InputTiming()) {} + page_input_timing_(mojom::InputTiming()), + mobile_friendliness_(blink::MobileFriendliness()) {} PageLoadMetricsUpdateDispatcher::~PageLoadMetricsUpdateDispatcher() { ShutDown(); @@ -467,7 +468,8 @@ mojom::FrameRenderDataUpdatePtr render_data, mojom::CpuTimingPtr new_cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta) { + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness) { if (embedder_interface_->IsExtensionUrl( render_frame_host->GetLastCommittedURL())) { // Extensions can inject child frames into a page. We don't want to track @@ -496,6 +498,7 @@ UpdateSubFrameTiming(render_frame_host, std::move(new_timing)); } UpdatePageInputTiming(*input_timing_delta); + UpdateMobileFriendliness(mobile_friendliness); UpdatePageRenderData(*render_data); if (!is_main_frame) { // This path is just for the AMP metrics. @@ -723,6 +726,11 @@ input_timing_delta.total_adjusted_input_delay; } +void PageLoadMetricsUpdateDispatcher::UpdateMobileFriendliness( + const blink::MobileFriendliness& mobile_friendliness) { + mobile_friendliness_ = mobile_friendliness; +} + void PageLoadMetricsUpdateDispatcher::UpdatePageRenderData( const mojom::FrameRenderDataUpdate& render_data) { page_render_data_.layout_shift_score += render_data.layout_shift_delta;
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h index ac16426..ce260f10 100644 --- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h +++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
@@ -13,6 +13,7 @@ #include "base/timer/timer.h" #include "components/page_load_metrics/browser/page_load_metrics_observer.h" #include "components/page_load_metrics/common/page_load_metrics.mojom.h" +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" namespace content { class NavigationHandle; @@ -152,7 +153,8 @@ mojom::FrameRenderDataUpdatePtr render_data, mojom::CpuTimingPtr new_cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta); + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness); void SetUpSharedMemoryForSmoothness( content::RenderFrameHost* render_frame_host, @@ -188,6 +190,9 @@ const mojom::InputTiming& page_input_timing() const { return page_input_timing_; } + const blink::MobileFriendliness& mobile_friendliness() const { + return mobile_friendliness_; + } private: using FrameTreeNodeId = int; @@ -209,6 +214,8 @@ const mojom::FrameMetadataPtr& frame_metadata); void UpdatePageRenderData(const mojom::FrameRenderDataUpdate& render_data); + void UpdateMobileFriendliness( + const blink::MobileFriendliness& mobile_friendliness); void UpdateMainFrameRenderData( const mojom::FrameRenderDataUpdate& render_data); void OnSubFrameRenderDataChanged( @@ -251,6 +258,9 @@ // InputTiming data accumulated across all frames. mojom::InputTiming page_input_timing_; + // MobileFrienddliness data for current view. + blink::MobileFriendliness mobile_friendliness_; + // In general, page_render_data_ contains combined data across all frames on // the page, while main_frame_render_data_ contains data specific to the main // frame.
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc index 9b699cb6..a10302b 100644 --- a/components/page_load_metrics/browser/page_load_tracker.cc +++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -902,6 +902,10 @@ const mojom::InputTiming& PageLoadTracker::GetPageInputTiming() const { return metrics_update_dispatcher_.page_input_timing(); } +const blink::MobileFriendliness& PageLoadTracker::GetMobileFriendliness() + const { + return metrics_update_dispatcher_.mobile_friendliness(); +} const PageRenderData& PageLoadTracker::GetMainFrameRenderData() const { return metrics_update_dispatcher_.main_frame_render_data();
diff --git a/components/page_load_metrics/browser/page_load_tracker.h b/components/page_load_metrics/browser/page_load_tracker.h index 2d678787..97f97e3 100644 --- a/components/page_load_metrics/browser/page_load_tracker.h +++ b/components/page_load_metrics/browser/page_load_tracker.h
@@ -228,6 +228,7 @@ const mojom::FrameMetadata& GetSubframeMetadata() const override; const PageRenderData& GetPageRenderData() const override; const mojom::InputTiming& GetPageInputTiming() const override; + const blink::MobileFriendliness& GetMobileFriendliness() const override; const PageRenderData& GetMainFrameRenderData() const override; const ui::ScopedVisibilityTracker& GetVisibilityTracker() const override; const ResourceTracker& GetResourceTracker() const override; @@ -446,6 +447,7 @@ const bool started_in_foreground_; mojom::PageLoadTimingPtr last_dispatched_merged_page_timing_; + blink::MobileFriendliness latest_mobile_friendliness_; ui::PageTransition page_transition_;
diff --git a/components/page_load_metrics/common/BUILD.gn b/components/page_load_metrics/common/BUILD.gn index 5605576..3067a47 100644 --- a/components/page_load_metrics/common/BUILD.gn +++ b/components/page_load_metrics/common/BUILD.gn
@@ -45,6 +45,7 @@ sources = [ "page_load_metrics.mojom" ] public_deps = [ "//mojo/public/mojom/base", + "//third_party/blink/public/mojom:mobile_metrics", "//third_party/blink/public/mojom:web_feature_mojo_bindings", "//ui/gfx/geometry/mojom", "//url/mojom:url_mojom_origin",
diff --git a/components/page_load_metrics/common/page_load_metrics.mojom b/components/page_load_metrics/common/page_load_metrics.mojom index 33995cc..59e1863 100644 --- a/components/page_load_metrics/common/page_load_metrics.mojom +++ b/components/page_load_metrics/common/page_load_metrics.mojom
@@ -8,6 +8,8 @@ import "mojo/public/mojom/base/shared_memory.mojom"; import "mojo/public/mojom/base/time.mojom"; import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import + "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom"; import "third_party/blink/public/mojom/use_counter/css_property_id.mojom"; import "url/mojom/origin.mojom"; @@ -334,7 +336,8 @@ FrameRenderDataUpdate render_data, CpuTiming cpu_load_timing, DeferredResourceCounts new_deferred_resource_data, - InputTiming input_timing_delta); + InputTiming input_timing_delta, + blink.mojom.MobileFriendliness mobile_friendliness); // Set up a shared memory used to transfer smoothness data from the renderer // to the browser. The structure is defined in
diff --git a/components/page_load_metrics/renderer/OWNERS b/components/page_load_metrics/renderer/OWNERS new file mode 100644 index 0000000..d5fefd8 --- /dev/null +++ b/components/page_load_metrics/renderer/OWNERS
@@ -0,0 +1,2 @@ +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.cc b/components/page_load_metrics/renderer/fake_page_timing_sender.cc index 09e27c60..a590380 100644 --- a/components/page_load_metrics/renderer/fake_page_timing_sender.cc +++ b/components/page_load_metrics/renderer/fake_page_timing_sender.cc
@@ -23,10 +23,11 @@ const mojom::FrameRenderDataUpdate& render_data, const mojom::CpuTimingPtr& cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - const mojom::InputTimingPtr new_input_timing) { + const mojom::InputTimingPtr new_input_timing, + const blink::MobileFriendliness& mobile_friendliness) { validator_->UpdateTiming(timing, metadata, new_features, resources, render_data, cpu_timing, new_deferred_resource_data, - new_input_timing); + new_input_timing, mobile_friendliness); } void FakePageTimingSender::SetUpSmoothnessReporting( @@ -83,6 +84,17 @@ actual_input_timing->total_adjusted_input_delay); } +void FakePageTimingSender::PageTimingValidator:: + UpdateExpectedMobileFriendliness( + const blink::MobileFriendliness& mobile_friendliness) { + expected_mobile_friendliness = mobile_friendliness; +} + +void FakePageTimingSender::PageTimingValidator:: + VerifyExpectedMobileFriendliness() const { + ASSERT_EQ(expected_mobile_friendliness, actual_mobile_friendliness); +} + void FakePageTimingSender::PageTimingValidator::VerifyExpectedCpuTimings() const { ASSERT_EQ(actual_cpu_timings_.size(), expected_cpu_timings_.size()); @@ -163,7 +175,8 @@ const mojom::FrameRenderDataUpdate& render_data, const mojom::CpuTimingPtr& cpu_timing, const mojom::DeferredResourceCountsPtr& new_deferred_resource_data, - const mojom::InputTimingPtr& new_input_timing) { + const mojom::InputTimingPtr& new_input_timing, + const blink::MobileFriendliness& mobile_friendliness) { actual_timings_.push_back(timing.Clone()); if (!cpu_timing->task_time.is_zero()) { actual_cpu_timings_.push_back(cpu_timing.Clone()); @@ -187,6 +200,7 @@ actual_input_timing->total_input_delay += new_input_timing->total_input_delay; actual_input_timing->total_adjusted_input_delay += new_input_timing->total_adjusted_input_delay; + actual_mobile_friendliness = mobile_friendliness; VerifyExpectedTimings(); VerifyExpectedCpuTimings(); @@ -194,6 +208,7 @@ VerifyExpectedCssProperties(); VerifyExpectedRenderData(); VerifyExpectedFrameIntersectionUpdate(); + VerifyExpectedMobileFriendliness(); } } // namespace page_load_metrics
diff --git a/components/page_load_metrics/renderer/fake_page_timing_sender.h b/components/page_load_metrics/renderer/fake_page_timing_sender.h index cb4f3687..bcfe36ea 100644 --- a/components/page_load_metrics/renderer/fake_page_timing_sender.h +++ b/components/page_load_metrics/renderer/fake_page_timing_sender.h
@@ -11,6 +11,7 @@ #include "components/page_load_metrics/common/page_load_metrics.mojom.h" #include "components/page_load_metrics/common/page_load_timing.h" #include "components/page_load_metrics/renderer/page_timing_sender.h" +#include "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom.h" namespace page_load_metrics { @@ -57,6 +58,8 @@ void VerifyExpectedInputTiming() const; + void VerifyExpectedMobileFriendliness() const; + // PageLoad features that are expected to be sent through SendTiming() // should be passed via UpdateExpectedPageLoadFeatures. void UpdateExpectPageLoadFeatures(const blink::mojom::WebFeature feature); @@ -72,6 +75,9 @@ void UpdateExpectedInputTiming(const base::TimeDelta input_delay); + void UpdateExpectedMobileFriendliness( + const blink::MobileFriendliness& mobile_friendliness); + void UpdateExpectFrameIntersectionUpdate( const mojom::FrameIntersectionUpdate& frame_intersection_update) { expected_frame_intersection_update_ = frame_intersection_update.Clone(); @@ -101,7 +107,8 @@ const mojom::FrameRenderDataUpdate& render_data, const mojom::CpuTimingPtr& cpu_timing, const mojom::DeferredResourceCountsPtr& new_deferred_resource_data, - const mojom::InputTimingPtr& input_timing); + const mojom::InputTimingPtr& input_timing, + const blink::MobileFriendliness& mobile_friendliness); private: std::vector<mojom::PageLoadTimingPtr> expected_timings_; @@ -118,19 +125,24 @@ mojom::FrameIntersectionUpdatePtr actual_frame_intersection_update_; mojom::InputTimingPtr expected_input_timing; mojom::InputTimingPtr actual_input_timing; + blink::MobileFriendliness expected_mobile_friendliness; + blink::MobileFriendliness actual_mobile_friendliness; DISALLOW_COPY_AND_ASSIGN(PageTimingValidator); }; explicit FakePageTimingSender(PageTimingValidator* validator); ~FakePageTimingSender() override; - void SendTiming(const mojom::PageLoadTimingPtr& timing, - const mojom::FrameMetadataPtr& metadata, - mojom::PageLoadFeaturesPtr new_features, - std::vector<mojom::ResourceDataUpdatePtr> resources, - const mojom::FrameRenderDataUpdate& render_data, - const mojom::CpuTimingPtr& cpu_timing, - mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr new_input_timing) override; + void SendTiming( + const mojom::PageLoadTimingPtr& timing, + const mojom::FrameMetadataPtr& metadata, + mojom::PageLoadFeaturesPtr new_features, + std::vector<mojom::ResourceDataUpdatePtr> resources, + const mojom::FrameRenderDataUpdate& render_data, + const mojom::CpuTimingPtr& cpu_timing, + mojom::DeferredResourceCountsPtr new_deferred_resource_data, + mojom::InputTimingPtr new_input_timing, + const blink::MobileFriendliness& mobile_friendliness) override; + void SetUpSmoothnessReporting( base::ReadOnlySharedMemoryRegion shared_memory) override;
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc index 7a2faa6..70fa1c24 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.cc
@@ -16,6 +16,7 @@ #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/loader/resource_type_util.h" +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" #include "third_party/blink/public/platform/web_rect.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_document_loader.h" @@ -49,20 +50,23 @@ ~MojoPageTimingSender() override = default; - void SendTiming(const mojom::PageLoadTimingPtr& timing, - const mojom::FrameMetadataPtr& metadata, - mojom::PageLoadFeaturesPtr new_features, - std::vector<mojom::ResourceDataUpdatePtr> resources, - const mojom::FrameRenderDataUpdate& render_data, - const mojom::CpuTimingPtr& cpu_timing, - mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta) override { + void SendTiming( + const mojom::PageLoadTimingPtr& timing, + const mojom::FrameMetadataPtr& metadata, + mojom::PageLoadFeaturesPtr new_features, + std::vector<mojom::ResourceDataUpdatePtr> resources, + const mojom::FrameRenderDataUpdate& render_data, + const mojom::CpuTimingPtr& cpu_timing, + mojom::DeferredResourceCountsPtr new_deferred_resource_data, + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness) override { DCHECK(page_load_metrics_); page_load_metrics_->UpdateTiming( limited_sending_mode_ ? CreatePageLoadTiming() : timing->Clone(), metadata->Clone(), std::move(new_features), std::move(resources), render_data.Clone(), cpu_timing->Clone(), - std::move(new_deferred_resource_data), std::move(input_timing_delta)); + std::move(new_deferred_resource_data), std::move(input_timing_delta), + std::move(mobile_friendliness)); } void SetUpSmoothnessReporting( @@ -360,6 +364,12 @@ main_frame_intersection); } +void MetricsRenderFrameObserver::OnMobileFriendlinessChanged( + const blink::MobileFriendliness& mf) { + if (page_timing_metrics_sender_) + page_timing_metrics_sender_->DidObserveMobileFriendlinessChanged(mf); +} + bool MetricsRenderFrameObserver::SetUpSmoothnessReporting( base::ReadOnlySharedMemoryRegion& shared_memory) { if (page_timing_metrics_sender_) {
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h index 4901d4d6..50b6445 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -95,6 +95,7 @@ void OnMainFrameIntersectionChanged( const blink::WebRect& main_frame_intersection) override; + void OnMobileFriendlinessChanged(const blink::MobileFriendliness&) override; bool SetUpSmoothnessReporting( base::ReadOnlySharedMemoryRegion& shared_memory) override;
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc index dc6a862b..05c1338 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -13,6 +13,7 @@ #include "base/stl_util.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "components/page_load_metrics/common/page_load_metrics.mojom.h" #include "components/page_load_metrics/common/page_load_metrics_constants.h" #include "components/page_load_metrics/renderer/page_timing_sender.h" #include "services/network/public/cpp/url_loader_completion_status.h" @@ -20,7 +21,6 @@ #include "ui/gfx/geometry/rect.h" namespace page_load_metrics { - namespace { const int kInitialTimerDelayMillis = 50; const int64_t kInputDelayAdjustmentMillis = int64_t(50); @@ -137,6 +137,12 @@ } } +void PageTimingMetricsSender::DidObserveMobileFriendlinessChanged( + const blink::MobileFriendliness& mf) { + mobile_friendliness_ = mf; + EnsureSendTimer(); +} + void PageTimingMetricsSender::DidStartResponse( const GURL& response_url, int resource_id, @@ -307,10 +313,11 @@ } } - sender_->SendTiming(last_timing_, metadata_, std::move(new_features_), - std::move(resources), render_data_, last_cpu_timing_, - std::move(new_deferred_resource_data_), - std::move(input_timing_delta_)); + sender_->SendTiming( + last_timing_, metadata_, std::move(new_features_), std::move(resources), + render_data_, last_cpu_timing_, std::move(new_deferred_resource_data_), + std::move(input_timing_delta_), std::move(mobile_friendliness_)); + mobile_friendliness_ = blink::MobileFriendliness(); input_timing_delta_ = mojom::InputTiming::New(); new_deferred_resource_data_ = mojom::DeferredResourceCounts::New(); new_features_ = mojom::PageLoadFeatures::New();
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.h b/components/page_load_metrics/renderer/page_timing_metrics_sender.h index 80c438f..fd673db5 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender.h +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.h
@@ -59,6 +59,7 @@ uint32_t ng_call_count); void DidObserveLazyLoadBehavior( blink::WebLocalFrameClient::LazyLoadBehavior lazy_load_behavior); + void DidObserveMobileFriendlinessChanged(const blink::MobileFriendliness&); void DidStartResponse(const GURL& response_url, int resource_id, @@ -106,6 +107,7 @@ mojom::PageLoadTimingPtr last_timing_; mojom::CpuTimingPtr last_cpu_timing_; mojom::InputTimingPtr input_timing_delta_; + blink::MobileFriendliness mobile_friendliness_; // The the sender keep track of metadata as it comes in, because the sender is // scoped to a single committed load.
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc index e711594..721372d 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc
@@ -161,6 +161,26 @@ validator_.VerifyExpectedInputTiming(); } +TEST_F(PageTimingMetricsSenderTest, SendMobileFriendlinessEvents) { + mojom::PageLoadTiming timing; + blink::MobileFriendliness mobile_friendliness; + mobile_friendliness.viewport_hardcoded_width = 480; + mobile_friendliness.allow_user_zoom = true; + InitPageLoadTimingForTest(&timing); + metrics_sender_->Update(timing.Clone(), + PageTimingMetadataRecorder::MonotonicTiming()); + validator_.ExpectPageLoadTiming(timing); + + metrics_sender_->DidObserveMobileFriendlinessChanged(mobile_friendliness); + + blink::MobileFriendliness expected_mf; + expected_mf.viewport_hardcoded_width = 480; + expected_mf.allow_user_zoom = true; + validator_.UpdateExpectedMobileFriendliness(expected_mf); + metrics_sender_->mock_timer()->Fire(); + validator_.VerifyExpectedMobileFriendliness(); +} + TEST_F(PageTimingMetricsSenderTest, SendSingleFeature) { mojom::PageLoadTiming timing; InitPageLoadTimingForTest(&timing);
diff --git a/components/page_load_metrics/renderer/page_timing_sender.h b/components/page_load_metrics/renderer/page_timing_sender.h index 9507e467..ca7cfa29 100644 --- a/components/page_load_metrics/renderer/page_timing_sender.h +++ b/components/page_load_metrics/renderer/page_timing_sender.h
@@ -22,7 +22,8 @@ const mojom::FrameRenderDataUpdate& render_data, const mojom::CpuTimingPtr& cpu_timing, mojom::DeferredResourceCountsPtr new_deferred_resource_data, - mojom::InputTimingPtr input_timing_delta) = 0; + mojom::InputTimingPtr input_timing_delta, + const blink::MobileFriendliness& mobile_friendliness) = 0; virtual void SetUpSmoothnessReporting( base::ReadOnlySharedMemoryRegion shared_memory) = 0; };
diff --git a/components/policy/core/browser/cloud/message_util.cc b/components/policy/core/browser/cloud/message_util.cc index 1a2762e8..de7279a 100644 --- a/components/policy/core/browser/cloud/message_util.cc +++ b/components/policy/core/browser/cloud/message_util.cc
@@ -62,6 +62,8 @@ case DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED: // This is shown only on registration failed. return IDS_POLICY_DM_STATUS_UNKNOWN_ERROR; + case DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: + return IDS_POLICY_DM_STATUS_SERVICE_DOMAIN_MISMATCH; } NOTREACHED() << "Unhandled DM status " << status; return IDS_POLICY_DM_STATUS_UNKNOWN_ERROR;
diff --git a/components/policy/core/common/cloud/cloud_policy_constants.h b/components/policy/core/common/cloud/cloud_policy_constants.h index cf989ae..65780e26 100644 --- a/components/policy/core/common/cloud/cloud_policy_constants.h +++ b/components/policy/core/common/cloud/cloud_policy_constants.h
@@ -141,6 +141,8 @@ DM_STATUS_SERVICE_ENTERPRISE_ACCOUNT_IS_NOT_ELIGIBLE_TO_ENROLL = 906, // Service error: Enterprise TOS has not been accepted. DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED = 907, + // Service error: Illegal account for packaged EDU license. + DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE = 908, }; // List of modes that the device can be locked into.
diff --git a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc index 2d0148a..ee38892 100644 --- a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc +++ b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc
@@ -328,6 +328,7 @@ case DM_STATUS_SERVICE_CONSUMER_ACCOUNT_WITH_PACKAGED_LICENSE: case DM_STATUS_SERVICE_ENTERPRISE_ACCOUNT_IS_NOT_ELIGIBLE_TO_ENROLL: case DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED: + case DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: // Need a re-registration, no use in retrying. CancelRefresh(); return;
diff --git a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc index f5cf4df..4e514b84 100644 --- a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc
@@ -546,6 +546,7 @@ {DM_STATUS_SERVICE_ENTERPRISE_ACCOUNT_IS_NOT_ELIGIBLE_TO_ENROLL, -1, 1}, {DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED, -1, 1}, {DM_STATUS_SERVICE_TOO_MANY_REQUESTS, kPolicyRefreshRate, 1}, + {DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE, -1, 1}, }; class CloudPolicyRefreshSchedulerClientErrorTest
diff --git a/components/policy/core/common/cloud/device_management_service.cc b/components/policy/core/common/cloud/device_management_service.cc index 9addfcd..bb1ae44 100644 --- a/components/policy/core/common/cloud/device_management_service.cc +++ b/components/policy/core/common/cloud/device_management_service.cc
@@ -126,6 +126,7 @@ const int DeviceManagementService::kArcDisabled; const int DeviceManagementService::kInvalidDomainlessCustomer; const int DeviceManagementService::kTosHasNotBeenAccepted; +const int DeviceManagementService::kIllegalAccountForPackagedEDULicense; // static std::string DeviceManagementService::JobConfiguration::GetJobTypeAsString(
diff --git a/components/policy/core/common/cloud/device_management_service.h b/components/policy/core/common/cloud/device_management_service.h index 08d5cae..31b37e81 100644 --- a/components/policy/core/common/cloud/device_management_service.h +++ b/components/policy/core/common/cloud/device_management_service.h
@@ -88,6 +88,7 @@ static constexpr int kArcDisabled = 904; static constexpr int kInvalidDomainlessCustomer = 905; static constexpr int kTosHasNotBeenAccepted = 906; + static constexpr int kIllegalAccountForPackagedEDULicense = 907; // Number of times to retry on ERR_NETWORK_CHANGED errors. static const int kMaxRetries = 3;
diff --git a/components/policy/core/common/cloud/device_management_service_unittest.cc b/components/policy/core/common/cloud/device_management_service_unittest.cc index 72c592e..5b3aac4 100644 --- a/components/policy/core/common/cloud/device_management_service_unittest.cc +++ b/components/policy/core/common/cloud/device_management_service_unittest.cc
@@ -463,6 +463,11 @@ net::OK, 906, PROTO_STRING(kResponseEmpty)), + FailedRequestParams( + DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE, + net::OK, + 907, + PROTO_STRING(kResponseEmpty)), FailedRequestParams(DM_STATUS_REQUEST_TOO_LARGE, net::OK, 413,
diff --git a/components/policy/core/common/cloud/dmserver_job_configurations.cc b/components/policy/core/common/cloud/dmserver_job_configurations.cc index b0ba060..571c40a 100644 --- a/components/policy/core/common/cloud/dmserver_job_configurations.cc +++ b/components/policy/core/common/cloud/dmserver_job_configurations.cc
@@ -204,6 +204,9 @@ case DeviceManagementService::kTosHasNotBeenAccepted: code = DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED; break; + case DeviceManagementService::kIllegalAccountForPackagedEDULicense: + code = DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE; + break; default: // Handle all unknown 5xx HTTP error codes as temporary and any other // unknown error as one that needs more time to recover.
diff --git a/components/policy/core/common/cloud/enterprise_metrics.h b/components/policy/core/common/cloud/enterprise_metrics.h index 814aab1..3dc7c006 100644 --- a/components/policy/core/common/cloud/enterprise_metrics.h +++ b/components/policy/core/common/cloud/enterprise_metrics.h
@@ -140,8 +140,10 @@ kMetricEnrollmentRegisterEnterpriseTosHasNotBeenAccepted = 61, // Too many requests are uploadede within a short time. kMetricEnrollmentTooManyRequests = 62, + // Enrollment failed: illegal account for packaged EDU license. + kMetricEnrollmentIllegalAccountForPackagedEDULicense = 63, // Max value for use with enumeration histogram UMA functions. - kMaxValue = kMetricEnrollmentTooManyRequests + kMaxValue = kMetricEnrollmentIllegalAccountForPackagedEDULicense }; // Events related to policy refresh.
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index f050471..a5c0cc4 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -2908,59 +2908,32 @@ // a copy used for reporting purposes. enum FailureReason { FAILURE_REASON_UNKNOWN = 0; - INVALID_ID = 1; - MALFORMED_EXTENSION_SETTINGS = 2; - REPLACED_BY_ARC_APP = 3; - MALFORMED_EXTENSION_DICT = 4; - NOT_SUPPORTED_EXTENSION_DICT = 5; - MALFORMED_EXTENSION_DICT_FILE_PATH = 6; - MALFORMED_EXTENSION_DICT_VERSION = 7; - MALFORMED_EXTENSION_DICT_UPDATE_URL = 8; - LOCALE_NOT_SUPPORTED = 9; - NOT_PERFORMING_NEW_INSTALL = 10; - TOO_OLD_PROFILE = 11; - DO_NOT_INSTALL_FOR_ENTERPRISE = 12; - ALREADY_INSTALLED = 13; - CRX_FETCH_FAILED = 14; - MANIFEST_FETCH_FAILED = 15; - MANIFEST_INVALID = 16; - NO_UPDATE = 17; - CRX_INSTALL_ERROR_DECLINED = 18; - CRX_INSTALL_ERROR_SANDBOXED_UNPACKER_FAILURE = 19; - CRX_INSTALL_ERROR_OTHER = 20; - NO_UPDATE_URL = 21; - PENDING_ADD_FAILED = 22; - DOWNLOADER_ADD_FAILED = 23; - IN_PROGRESS = 24; - CRX_FETCH_URL_EMPTY = 25; - CRX_FETCH_URL_INVALID = 26; - OVERRIDDEN_BY_SETTINGS = 27; } @@ -2970,15 +2943,10 @@ // in the installation process. enum InstallationStage { INSTALLATION_STAGE_UNKNOWN = 0; - CREATED = 1; - PENDING = 2; - DOWNLOADING = 3; - INSTALLING = 4; - COMPLETE = 5; } @@ -2987,23 +2955,14 @@ // reporting purposes. enum UserType { USER_TYPE_UNKNOWN = 0; - USER_TYPE_REGULAR = 1; - USER_TYPE_GUEST = 2; - USER_TYPE_PUBLIC_ACCOUNT = 3; - USER_TYPE_SUPERVISED = 4; - USER_TYPE_KIOSK_APP = 5; - USER_TYPE_CHILD = 6; - USER_TYPE_ARC_KIOSK_APP = 7; - USER_TYPE_ACTIVE_DIRECTORY = 8; - USER_TYPE_WEB_KIOSK_APP = 9; } @@ -3013,25 +2972,15 @@ // for reporting purposes. enum DownloadingStage { DOWNLOADING_STAGE_UNKNOWN = 0; - DOWNLOAD_PENDING = 1; - QUEUED_FOR_MANIFEST = 2; - DOWNLOADING_MANIFEST = 3; - DOWNLOADING_MANIFEST_RETRY = 4; - PARSING_MANIFEST = 5; - MANIFEST_LOADED = 6; - QUEUED_FOR_CRX = 7; - DOWNLOADING_CRX = 8; - DOWNLOADING_CRX_RETRY = 9; - FINISHED = 10; } @@ -3041,19 +2990,12 @@ // copy used for reporting purposes. enum InstallCreationStage { INSTALL_CREATION_STAGE_UNKNOWN = 0; - CREATION_INITIATED = 1; - NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_FORCED = 2; - NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_NOT_FORCED = 3; - NOTIFIED_FROM_MANAGEMENT = 4; - NOTIFIED_FROM_MANAGEMENT_NOT_FORCED = 5; - SEEN_BY_POLICY_LOADER = 6; - SEEN_BY_EXTERNAL_PROVIDER = 7; } @@ -3064,15 +3006,10 @@ // copy used for reporting purposes. enum DownloadCacheStatus { CACHE_UNKNOWN = 0; - CACHE_DISABLED = 1; - CACHE_MISS = 2; - CACHE_OUTDATED = 3; - CACHE_HIT = 4; - CACHE_HIT_ON_MANIFEST_FETCH_FAILURE = 5; }
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp index 80f52152..37e46bf 100644 --- a/components/policy_strings.grdp +++ b/components/policy_strings.grdp
@@ -585,8 +585,11 @@ <message name="IDS_POLICY_DLP_ANDROID_APPS" desc="Name shown for ARC in data leak prevention toasts."> Android apps </message> - <message name="IDS_POLICY_DLP_PRINTING_BLOCKED" desc="A toast informing the user that printing is blocked."> - Printing of this content is blocked by your administrator + <message name="IDS_POLICY_DLP_PRINTING_BLOCKED_TITLE" desc="The title for notification informing the user that printing is blocked."> + Printing is blocked + </message> + <message name="IDS_POLICY_DLP_PRINTING_BLOCKED_MESSAGE" desc="The message for notification informing the user that printing is blocked."> + Printing of this content is blocked by your administrator. </message> </grit-part>
diff --git a/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED.png.sha1 deleted file mode 100644 index aec5b41..0000000 --- a/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -e36454c13cd9e034b5a9b21abffdfa0e369a8632 \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED_MESSAGE.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED_MESSAGE.png.sha1 new file mode 100644 index 0000000..37f6b08 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED_MESSAGE.png.sha1
@@ -0,0 +1 @@ +9cc120d3ece536d600e37f93fbc265f5e5600c5d \ No newline at end of file
diff --git a/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED_TITLE.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED_TITLE.png.sha1 new file mode 100644 index 0000000..37f6b08 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_DLP_PRINTING_BLOCKED_TITLE.png.sha1
@@ -0,0 +1 @@ +9cc120d3ece536d600e37f93fbc265f5e5600c5d \ No newline at end of file
diff --git a/components/printing/browser/BUILD.gn b/components/printing/browser/BUILD.gn index 1b3c83d0..c727ca4 100644 --- a/components/printing/browser/BUILD.gn +++ b/components/printing/browser/BUILD.gn
@@ -56,6 +56,7 @@ "//components/printing/common:mojo_interfaces", "//components/services/print_compositor/public/cpp", "//components/services/print_compositor/public/mojom", + "//components/site_isolation", "//components/strings:components_strings_grit", "//printing", "//printing/common:common",
diff --git a/components/printing/browser/DEPS b/components/printing/browser/DEPS index 14f9e1df..1b04a6a 100644 --- a/components/printing/browser/DEPS +++ b/components/printing/browser/DEPS
@@ -2,6 +2,7 @@ "+components/crash/core/common", "+components/discardable_memory/service", "+components/services/print_compositor/public", + "+components/site_isolation", "+components/strings/grit", "+content/public/browser", "+mojo/public",
diff --git a/components/printing/browser/print_manager_utils.cc b/components/printing/browser/print_manager_utils.cc index 5df4092..1b7ca78d 100644 --- a/components/printing/browser/print_manager_utils.cc +++ b/components/printing/browser/print_manager_utils.cc
@@ -7,7 +7,7 @@ #include "components/printing/browser/print_composite_client.h" #include "components/printing/common/print.mojom.h" #include "components/printing/common/print_messages.h" -#include "content/public/browser/site_isolation_policy.h" +#include "components/site_isolation/site_isolation_policy.h" #include "printing/mojom/print.mojom.h" #include "printing/print_settings.h" @@ -37,7 +37,8 @@ // where OOPIF is used such as isolate-extensions, but should be good for // feature testing purpose. Eventually, we will remove this check and use pdf // compositor service by default for printing. - if (content::SiteIsolationPolicy::ShouldPdfCompositorBeEnabledForOopifs()) { + if (site_isolation::SiteIsolationPolicy:: + ShouldPdfCompositorBeEnabledForOopifs()) { PrintCompositeClient::CreateForWebContents(web_contents); PrintCompositeClient::FromWebContents(web_contents) ->SetUserAgent(user_agent);
diff --git a/components/search/BUILD.gn b/components/search/BUILD.gn index 8fdf67a..ea67c5c6 100644 --- a/components/search/BUILD.gn +++ b/components/search/BUILD.gn
@@ -4,8 +4,6 @@ static_library("search") { sources = [ - "ntp_features.cc", - "ntp_features.h", "search.cc", "search.h", "search_provider_observer.cc",
diff --git a/components/site_isolation/site_isolation_policy.cc b/components/site_isolation/site_isolation_policy.cc index 9a91d30..e9e300c 100644 --- a/components/site_isolation/site_isolation_policy.cc +++ b/components/site_isolation/site_isolation_policy.cc
@@ -130,4 +130,19 @@ "SiteIsolation.SavedUserTriggeredIsolatedOrigins.Size", origins.size()); } +// static +bool SiteIsolationPolicy::ShouldPdfCompositorBeEnabledForOopifs() { + // We only create pdf compositor client and use pdf compositor service when + // one of the site isolation modes that forces OOPIFs is on. This includes + // full site isolation on desktop, password-triggered site isolation on + // Android for high-memory devices, and/or isolated origins specified via + // command line, enterprise policy, or field trials. + // + // TODO(weili, thestig): Eventually, we should remove this check and use pdf + // compositor service by default for printing. + return content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites() || + IsIsolationForPasswordSitesEnabled() || + content::SiteIsolationPolicy::AreIsolatedOriginsEnabled(); +} + } // namespace site_isolation
diff --git a/components/site_isolation/site_isolation_policy.h b/components/site_isolation/site_isolation_policy.h index ade65a8..2a56331cb 100644 --- a/components/site_isolation/site_isolation_policy.h +++ b/components/site_isolation/site_isolation_policy.h
@@ -45,6 +45,10 @@ // memory threshold. static bool ShouldDisableSiteIsolationDueToMemoryThreshold(); + // Returns true if the PDF compositor should be enabled to allow out-of- + // process iframes (OOPIF's) to print properly. + static bool ShouldPdfCompositorBeEnabledForOopifs(); + private: DISALLOW_IMPLICIT_CONSTRUCTORS(SiteIsolationPolicy); };
diff --git a/components/user_manager/known_user.cc b/components/user_manager/known_user.cc index fca0c615..e5fb80b 100644 --- a/components/user_manager/known_user.cc +++ b/components/user_manager/known_user.cc
@@ -692,8 +692,8 @@ return GetStringPref(account_id, kAccountManager, manager); } -void SetUserLastInputMethod(const AccountId& account_id, - const std::string& input_method) { +void SetUserLastLoginInputMethod(const AccountId& account_id, + const std::string& input_method) { SetStringPref(account_id, kLastInputMethod, input_method); }
diff --git a/components/user_manager/known_user.h b/components/user_manager/known_user.h index ce68cfe..73ce319 100644 --- a/components/user_manager/known_user.h +++ b/components/user_manager/known_user.h
@@ -237,8 +237,8 @@ bool USER_MANAGER_EXPORT GetAccountManager(const AccountId& account_id, std::string* manager); void USER_MANAGER_EXPORT -SetUserLastInputMethod(const AccountId& account_id, - const std::string& input_method); +SetUserLastLoginInputMethod(const AccountId& account_id, + const std::string& input_method); bool USER_MANAGER_EXPORT GetUserLastInputMethod(const AccountId& account_id, std::string* input_method);
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index f707b06a..5332d565 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -1814,6 +1814,99 @@ Maybe<std::string>() /* frame_id */, request.has_user_gesture); } +namespace { +String BuildCorsError(network::mojom::CorsError cors_error) { + switch (cors_error) { + case network::mojom::CorsError::kDisallowedByMode: + return protocol::Network::CorsErrorEnum::DisallowedByMode; + + case network::mojom::CorsError::kInvalidResponse: + return protocol::Network::CorsErrorEnum::InvalidResponse; + + case network::mojom::CorsError::kWildcardOriginNotAllowed: + return protocol::Network::CorsErrorEnum::WildcardOriginNotAllowed; + + case network::mojom::CorsError::kMissingAllowOriginHeader: + return protocol::Network::CorsErrorEnum::MissingAllowOriginHeader; + + case network::mojom::CorsError::kMultipleAllowOriginValues: + return protocol::Network::CorsErrorEnum::MultipleAllowOriginValues; + + case network::mojom::CorsError::kInvalidAllowOriginValue: + return protocol::Network::CorsErrorEnum::InvalidAllowOriginValue; + + case network::mojom::CorsError::kAllowOriginMismatch: + return protocol::Network::CorsErrorEnum::AllowOriginMismatch; + + case network::mojom::CorsError::kInvalidAllowCredentials: + return protocol::Network::CorsErrorEnum::InvalidAllowCredentials; + + case network::mojom::CorsError::kCorsDisabledScheme: + return protocol::Network::CorsErrorEnum::CorsDisabledScheme; + + case network::mojom::CorsError::kPreflightInvalidStatus: + return protocol::Network::CorsErrorEnum::PreflightInvalidStatus; + + case network::mojom::CorsError::kPreflightDisallowedRedirect: + return protocol::Network::CorsErrorEnum::PreflightDisallowedRedirect; + + case network::mojom::CorsError::kPreflightWildcardOriginNotAllowed: + return protocol::Network::CorsErrorEnum:: + PreflightWildcardOriginNotAllowed; + + case network::mojom::CorsError::kPreflightMissingAllowOriginHeader: + return protocol::Network::CorsErrorEnum:: + PreflightMissingAllowOriginHeader; + + case network::mojom::CorsError::kPreflightMultipleAllowOriginValues: + return protocol::Network::CorsErrorEnum:: + PreflightMultipleAllowOriginValues; + + case network::mojom::CorsError::kPreflightInvalidAllowOriginValue: + return protocol::Network::CorsErrorEnum::PreflightInvalidAllowOriginValue; + + case network::mojom::CorsError::kPreflightAllowOriginMismatch: + return protocol::Network::CorsErrorEnum::PreflightAllowOriginMismatch; + + case network::mojom::CorsError::kPreflightInvalidAllowCredentials: + return protocol::Network::CorsErrorEnum::PreflightInvalidAllowCredentials; + + case network::mojom::CorsError::kPreflightMissingAllowExternal: + return protocol::Network::CorsErrorEnum::PreflightMissingAllowExternal; + + case network::mojom::CorsError::kPreflightInvalidAllowExternal: + return protocol::Network::CorsErrorEnum::PreflightInvalidAllowExternal; + + case network::mojom::CorsError::kInvalidAllowMethodsPreflightResponse: + return protocol::Network::CorsErrorEnum:: + InvalidAllowMethodsPreflightResponse; + + case network::mojom::CorsError::kInvalidAllowHeadersPreflightResponse: + return protocol::Network::CorsErrorEnum:: + InvalidAllowHeadersPreflightResponse; + + case network::mojom::CorsError::kMethodDisallowedByPreflightResponse: + return protocol::Network::CorsErrorEnum:: + MethodDisallowedByPreflightResponse; + + case network::mojom::CorsError::kHeaderDisallowedByPreflightResponse: + return protocol::Network::CorsErrorEnum:: + HeaderDisallowedByPreflightResponse; + + case network::mojom::CorsError::kRedirectContainsCredentials: + return protocol::Network::CorsErrorEnum::RedirectContainsCredentials; + } +} + +std::unique_ptr<protocol::Network::CorsErrorStatus> BuildCorsErrorStatus( + network::CorsErrorStatus status) { + return protocol::Network::CorsErrorStatus::Create() + .SetCorsError(BuildCorsError(status.cors_error)) + .SetFailedParameter(status.failed_parameter) + .Build(); +} +} // namespace + void NetworkHandler::ResponseReceived( const std::string& request_id, const std::string& loader_id, @@ -1845,7 +1938,10 @@ static_cast<double>(base::Time::kMicrosecondsPerSecond), resource_type, net::ErrorToString(status.error_code), status.error_code == net::Error::ERR_ABORTED, - GetBlockedReasonFor(status)); + GetBlockedReasonFor(status), + status.cors_error_status + ? BuildCorsErrorStatus(*status.cors_error_status) + : Maybe<protocol::Network::CorsErrorStatus>()); return; } frontend_->LoadingFinished(
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc index 835c9be6..7e8fcda 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -90,6 +90,16 @@ new_device); } +void MediaStreamDispatcherHost::OnDeviceRequestStateChange( + const std::string& label, + const blink::MediaStreamDevice& device, + const blink::mojom::MediaStreamStateChange new_state) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + GetMediaStreamDeviceObserver()->OnDeviceRequestStateChange(label, device, + new_state); +} + const mojo::Remote<blink::mojom::MediaStreamDeviceObserver>& MediaStreamDispatcherHost::GetMediaStreamDeviceObserver() { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -171,7 +181,10 @@ base::BindRepeating(&MediaStreamDispatcherHost::OnDeviceStopped, weak_factory_.GetWeakPtr()), base::BindRepeating(&MediaStreamDispatcherHost::OnDeviceChanged, - weak_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr()), + base::BindRepeating( + &MediaStreamDispatcherHost::OnDeviceRequestStateChange, + weak_factory_.GetWeakPtr())); } void MediaStreamDispatcherHost::CancelRequest(int page_request_id) {
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.h b/content/browser/renderer_host/media/media_stream_dispatcher_host.h index 7b6617b2..4ea592f 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host.h +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
@@ -95,6 +95,10 @@ void OnDeviceChanged(const std::string& label, const blink::MediaStreamDevice& old_device, const blink::MediaStreamDevice& new_device); + void OnDeviceRequestStateChange( + const std::string& label, + const blink::MediaStreamDevice& device, + const blink::mojom::MediaStreamStateChange new_state); static int next_requester_id_;
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc index d1e3cf88..ff55286 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -138,11 +138,13 @@ const blink::MediaStreamDevice& device) override { OnDeviceStoppedInternal(label, device); } - - // mojom::MediaStreamDeviceObserver implementation. void OnDeviceChanged(const std::string& label, const blink::MediaStreamDevice& old_device, const blink::MediaStreamDevice& new_device) override {} + void OnDeviceRequestStateChange( + const std::string& label, + const blink::MediaStreamDevice& device, + const blink::mojom::MediaStreamStateChange new_state) override {} mojo::PendingRemote<blink::mojom::MediaStreamDeviceObserver> BindNewPipeAndPassRemote() {
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index 483c7e3c..3f9c410 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -664,6 +664,8 @@ DeviceChangedCallback device_changed_cb; + DeviceRequestStateChangeCallback device_request_state_change_cb; + std::unique_ptr<MediaStreamUIProxy> ui_proxy; std::string tab_capture_device_id; @@ -882,7 +884,8 @@ StreamSelectionInfoPtr audio_stream_selection_info_ptr, GenerateStreamCallback generate_stream_cb, DeviceStoppedCallback device_stopped_cb, - DeviceChangedCallback device_changed_cb) { + DeviceChangedCallback device_changed_cb, + DeviceRequestStateChangeCallback device_request_state_change_cb) { DCHECK_CURRENTLY_ON(BrowserThread::IO); SendLogMessage(GetGenerateStreamLogString(render_process_id, render_frame_id, requester_id, page_request_id)); @@ -893,6 +896,8 @@ blink::MEDIA_GENERATE_STREAM, controls, std::move(salt_and_origin), std::move(device_stopped_cb)); request->device_changed_cb = std::move(device_changed_cb); + request->device_request_state_change_cb = + std::move(device_request_state_change_cb); const std::string& label = AddRequest(base::WrapUnique(request));
diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h index 045e5f5..90d13b32 100644 --- a/content/browser/renderer_host/media/media_stream_manager.h +++ b/content/browser/renderer_host/media/media_stream_manager.h
@@ -109,6 +109,11 @@ const blink::MediaStreamDevice& old_device, const blink::MediaStreamDevice& new_device)>; + using DeviceRequestStateChangeCallback = base::RepeatingCallback<void( + const std::string& label, + const blink::MediaStreamDevice& device, + const blink::mojom::MediaStreamStateChange new_state)>; + // Callback for testing. using GenerateStreamTestCallback = base::OnceCallback<bool(const blink::StreamControls&)>; @@ -190,7 +195,8 @@ blink::mojom::StreamSelectionInfoPtr audio_stream_selection_info_ptr, GenerateStreamCallback generate_stream_cb, DeviceStoppedCallback device_stopped_cb, - DeviceChangedCallback device_changed_cb); + DeviceChangedCallback device_changed_cb, + DeviceRequestStateChangeCallback device_request_state_change_cb); // Cancel an open request identified by |page_request_id| for the given frame. // Must be called on the IO thread.
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc index bd3deb0..11344deb 100644 --- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -262,6 +262,8 @@ true /* request_video */, &audio_device, &video_device); MediaStreamManager::DeviceStoppedCallback stopped_callback; MediaStreamManager::DeviceChangedCallback changed_callback; + MediaStreamManager::DeviceRequestStateChangeCallback + request_state_change_callback; std::vector<blink::mojom::MediaStreamType> expected_types; expected_types.push_back( @@ -287,7 +289,7 @@ blink::mojom::StreamSelectionStrategy::SEARCH_BY_DEVICE_ID, base::nullopt), std::move(generate_stream_callback), std::move(stopped_callback), - std::move(changed_callback)); + std::move(changed_callback), std::move(request_state_change_callback)); run_loop_.Run(); EXPECT_EQ(blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE, @@ -362,6 +364,8 @@ &audio_device, nullptr); MediaStreamManager::DeviceStoppedCallback stopped_callback; MediaStreamManager::DeviceChangedCallback changed_callback; + MediaStreamManager::DeviceRequestStateChangeCallback + request_state_change_callback; StreamSelectionInfoPtr info = StreamSelectionInfo::New(strategy, session_id); @@ -369,7 +373,8 @@ render_process_id, render_frame_id, requester_id, page_request_id, controls, MediaDeviceSaltAndOrigin(), false /* user_gesture */, std::move(info), std::move(generate_stream_callback), - std::move(stopped_callback), std::move(changed_callback)); + std::move(stopped_callback), std::move(changed_callback), + std::move(request_state_change_callback)); run_loop.Run(); return audio_device; @@ -717,7 +722,8 @@ base::nullopt), std::move(generate_stream_callback), MediaStreamManager::DeviceStoppedCallback(), - MediaStreamManager::DeviceChangedCallback()); + MediaStreamManager::DeviceChangedCallback(), + MediaStreamManager::DeviceRequestStateChangeCallback()); run_loop_.Run(); EXPECT_CALL(*media_observer_, OnMediaRequestStateChanged(_, _, _, _, _, _)) @@ -756,6 +762,8 @@ MediaStreamManager::DeviceChangedCallback changed_callback; EXPECT_CALL(*media_observer_, OnMediaRequestStateChanged(_, _, _, _, _, _)) .Times(testing::AtLeast(1)); + MediaStreamManager::DeviceRequestStateChangeCallback + request_state_change_callback; media_stream_manager_->GenerateStream( render_process_id, render_frame_id, requester_id, page_request_id, @@ -764,7 +772,7 @@ blink::mojom::StreamSelectionStrategy::SEARCH_BY_DEVICE_ID, base::nullopt), std::move(generate_stream_callback), std::move(stopped_callback), - std::move(changed_callback)); + std::move(changed_callback), std::move(request_state_change_callback)); run_loop_.Run(); EXPECT_EQ(controls.video.stream_type, video_device.type); EXPECT_NE(DesktopMediaID::TYPE_NONE, @@ -818,6 +826,8 @@ &video_device); EXPECT_CALL(*media_observer_, OnMediaRequestStateChanged(_, _, _, _, _, _)) .Times(testing::AtLeast(1)); + MediaStreamManager::DeviceRequestStateChangeCallback + request_state_change_callback; media_stream_manager_->GenerateStream( render_process_id, render_frame_id, requester_id, page_request_id, @@ -826,7 +836,7 @@ blink::mojom::StreamSelectionStrategy::SEARCH_BY_DEVICE_ID, base::nullopt), std::move(generate_stream_callback), std::move(stopped_callback), - std::move(changed_callback)); + std::move(changed_callback), std::move(request_state_change_callback)); run_loop_.Run(); EXPECT_EQ(controls.video.stream_type, video_device.type); EXPECT_NE(DesktopMediaID::TYPE_NONE,
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index 88b1f9e..3c03088 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -79,6 +79,7 @@ #include "net/test/embedded_test_server/http_response.h" #include "services/network/public/cpp/constants.h" #include "services/network/public/cpp/features.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "storage/browser/blob/blob_handle.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/loader/url_loader_throttle.h" @@ -1022,7 +1023,7 @@ request->method = "GET"; request->is_main_resource_load = true; auto dispatcher = std::make_unique<ServiceWorkerFetchDispatcher>( - std::move(request), blink::mojom::ResourceType::kMainFrame, + std::move(request), network::mojom::RequestDestination::kDocument, /*client_id=*/base::GenerateGUID(), version, base::BindLambdaForTesting([&]() { is_prepare_callback_called = true; }), base::BindLambdaForTesting( @@ -1101,7 +1102,7 @@ request->method = "GET"; request->is_main_resource_load = true; auto dispatcher = std::make_unique<ServiceWorkerFetchDispatcher>( - std::move(request), blink::mojom::ResourceType::kMainFrame, + std::move(request), network::mojom::RequestDestination::kDocument, /*client_id=*/base::GenerateGUID(), version, base::BindLambdaForTesting([&]() { is_prepare_callback_called = true; }), base::BindLambdaForTesting(
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc index d1663b8..a7fffbc 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -67,17 +67,17 @@ ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler( base::WeakPtr<ServiceWorkerContextCore> context, base::WeakPtr<ServiceWorkerContainerHost> container_host, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination destination, bool skip_service_worker, ServiceWorkerAccessedCallback service_worker_accessed_callback) : context_(std::move(context)), container_host_(std::move(container_host)), - resource_type_(resource_type), + destination_(destination), skip_service_worker_(skip_service_worker), force_update_started_(false), service_worker_accessed_callback_( std::move(service_worker_accessed_callback)) { - DCHECK(ServiceWorkerUtils::IsMainResourceType(resource_type)); + DCHECK(ServiceWorkerUtils::IsMainRequestDestination(destination)); TRACE_EVENT_WITH_FLOW0("ServiceWorker", "ServiceWorkerControlleeRequestHandler::" "ServiceWorkerControlleeRequestHandler", @@ -99,7 +99,7 @@ // For navigations, the update logic is taken care of // during navigation and waits for the HintToUpdateServiceWorker message. - if (blink::IsResourceTypeFrame(resource_type_)) + if (blink::IsRequestDestinationFrame(destination_)) return; // For shared workers. The renderer doesn't yet send a @@ -439,9 +439,9 @@ ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN); ServiceWorkerMetrics::CountControlledPageLoad( active_version->site_for_uma(), - resource_type_ == blink::mojom::ResourceType::kMainFrame); + destination_ == network::mojom::RequestDestination::kDocument); - if (blink::IsResourceTypeFrame(resource_type_)) + if (blink::IsRequestDestinationFrame(destination_)) container_host_->AddServiceWorkerToUpdate(active_version); if (active_version->fetch_handler_existence() !=
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h index 12d68bd..72c93a4 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.h +++ b/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -22,7 +22,6 @@ #include "services/network/public/cpp/resource_request.h" #include "services/network/public/mojom/fetch_api.mojom.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h" -#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "url/gurl.h" namespace content { @@ -44,7 +43,7 @@ ServiceWorkerControlleeRequestHandler( base::WeakPtr<ServiceWorkerContextCore> context, base::WeakPtr<ServiceWorkerContainerHost> container_host, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination destination, bool skip_service_worker, ServiceWorkerAccessedCallback service_worker_accessed_callback); ~ServiceWorkerControlleeRequestHandler(); @@ -106,7 +105,7 @@ const base::WeakPtr<ServiceWorkerContextCore> context_; const base::WeakPtr<ServiceWorkerContainerHost> container_host_; - const blink::mojom::ResourceType resource_type_; + const network::mojom::RequestDestination destination_; // If true, service workers are bypassed for request interception. const bool skip_service_worker_;
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc index 2b3ad26..039ce4c 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -30,7 +30,6 @@ #include "services/network/public/cpp/resource_request_body.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h" -#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h" namespace content { @@ -43,10 +42,10 @@ ServiceWorkerRequestTestResources( ServiceWorkerControlleeRequestHandlerTest* test, const GURL& url, - blink::mojom::ResourceType type, + network::mojom::RequestDestination destination, network::mojom::RequestMode request_mode = network::mojom::RequestMode::kNoCors) - : resource_type_(type), + : destination_(destination), request_(test->url_request_context_.CreateRequest( url, net::DEFAULT_PRIORITY, @@ -55,14 +54,14 @@ handler_(std::make_unique<ServiceWorkerControlleeRequestHandler>( test->context()->AsWeakPtr(), test->container_host_, - type, + destination, /*skip_service_worker=*/false, base::DoNothing())) {} void MaybeCreateLoader() { network::ResourceRequest resource_request; resource_request.url = request_->url(); - resource_request.resource_type = static_cast<int>(resource_type_); + resource_request.destination = destination_; resource_request.headers = request()->extra_request_headers(); handler_->MaybeCreateLoader(resource_request, nullptr, base::DoNothing(), base::DoNothing()); @@ -80,7 +79,7 @@ net::URLRequest* request() const { return request_.get(); } private: - const blink::mojom::ResourceType resource_type_; + const network::mojom::RequestDestination destination_; std::unique_ptr<net::URLRequest> request_; std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler_; }; @@ -187,7 +186,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); @@ -211,7 +210,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); @@ -235,7 +234,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); @@ -264,7 +263,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); @@ -293,7 +292,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); EXPECT_FALSE(version_->HasControllee()); @@ -317,7 +316,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); EXPECT_FALSE(version_->HasControllee()); @@ -343,7 +342,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); base::RunLoop().RunUntilIdle(); @@ -375,7 +374,7 @@ // Conduct a main resource load. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.MaybeCreateLoader(); EXPECT_FALSE(test_resources.loader()); @@ -403,11 +402,11 @@ // Create an interceptor that skips service workers. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.SetHandler( std::make_unique<ServiceWorkerControlleeRequestHandler>( context()->AsWeakPtr(), container_host_, - blink::mojom::ResourceType::kMainFrame, + network::mojom::RequestDestination::kDocument, /*skip_service_worker=*/true, base::DoNothing())); // Conduct a main resource load. @@ -444,11 +443,11 @@ // Create an interceptor. ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); test_resources.SetHandler( std::make_unique<ServiceWorkerControlleeRequestHandler>( context()->AsWeakPtr(), container_host_, - blink::mojom::ResourceType::kMainFrame, + network::mojom::RequestDestination::kDocument, /*skip_service_worker=*/false, base::DoNothing())); // Destroy the context and make a new one. @@ -484,7 +483,7 @@ ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); // Sets an offline header to indicate force loading offline page. test_resources.request()->SetExtraRequestHeaderByName( "X-Chrome-offline", "reason=download", true); @@ -506,7 +505,7 @@ ServiceWorkerRequestTestResources test_resources( this, GURL("https://host/scope/doc"), - blink::mojom::ResourceType::kMainFrame); + network::mojom::RequestDestination::kDocument); // Empty offline header value should not cause fallback. test_resources.request()->SetExtraRequestHeaderByName("X-Chrome-offline", "", true);
diff --git a/content/browser/service_worker/service_worker_disk_cache.cc b/content/browser/service_worker/service_worker_disk_cache.cc index 120b2e5b..9d85ac8 100644 --- a/content/browser/service_worker/service_worker_disk_cache.cc +++ b/content/browser/service_worker/service_worker_disk_cache.cc
@@ -172,15 +172,16 @@ return; } - DCHECK(!base::Contains(active_entry_calls_, key)); - active_entry_calls_.emplace(key, std::move(callback)); + uint64_t call_id = GetNextCallId(); + DCHECK(!base::Contains(active_entry_calls_, call_id)); + active_entry_calls_.emplace(call_id, std::move(callback)); disk_cache::EntryResult result = disk_cache_->CreateEntry( base::NumberToString(key), net::HIGHEST, base::BindOnce(&ServiceWorkerDiskCache::DidGetEntryResult, - weak_factory_.GetWeakPtr(), key)); + weak_factory_.GetWeakPtr(), call_id)); if (result.net_error() != net::ERR_IO_PENDING) { - DidGetEntryResult(key, std::move(result)); + DidGetEntryResult(call_id, std::move(result)); } } @@ -206,15 +207,16 @@ return; } - DCHECK(!base::Contains(active_entry_calls_, key)); - active_entry_calls_.emplace(key, std::move(callback)); + uint64_t call_id = GetNextCallId(); + DCHECK(!base::Contains(active_entry_calls_, call_id)); + active_entry_calls_.emplace(call_id, std::move(callback)); disk_cache::EntryResult result = disk_cache_->OpenEntry( base::NumberToString(key), net::HIGHEST, base::BindOnce(&ServiceWorkerDiskCache::DidGetEntryResult, - weak_factory_.GetWeakPtr(), key)); + weak_factory_.GetWeakPtr(), call_id)); if (result.net_error() != net::ERR_IO_PENDING) { - DidGetEntryResult(key, std::move(result)); + DidGetEntryResult(call_id, std::move(result)); } } @@ -241,15 +243,16 @@ return; } - DCHECK(!base::Contains(active_doom_calls_, key)); - active_doom_calls_.emplace(key, std::move(callback)); + uint64_t call_id = GetNextCallId(); + DCHECK(!base::Contains(active_doom_calls_, call_id)); + active_doom_calls_.emplace(call_id, std::move(callback)); net::Error net_error = disk_cache_->DoomEntry( base::NumberToString(key), net::HIGHEST, base::BindOnce(&ServiceWorkerDiskCache::DidDoomEntry, - weak_factory_.GetWeakPtr(), key)); + weak_factory_.GetWeakPtr(), call_id)); if (net_error != net::ERR_IO_PENDING) { - DidDoomEntry(key, net_error); + DidDoomEntry(call_id, net_error); } } @@ -304,9 +307,13 @@ pending_calls_.clear(); } -void ServiceWorkerDiskCache::DidGetEntryResult(int64_t key, +uint64_t ServiceWorkerDiskCache::GetNextCallId() { + return next_call_id_++; +} + +void ServiceWorkerDiskCache::DidGetEntryResult(uint64_t call_id, disk_cache::EntryResult result) { - auto it = active_entry_calls_.find(key); + auto it = active_entry_calls_.find(call_id); DCHECK(it != active_entry_calls_.end()); EntryCallback callback = std::move(it->second); active_entry_calls_.erase(it); @@ -321,8 +328,8 @@ std::move(callback).Run(net_error, std::move(entry)); } -void ServiceWorkerDiskCache::DidDoomEntry(int64_t key, int net_error) { - auto it = active_doom_calls_.find(key); +void ServiceWorkerDiskCache::DidDoomEntry(uint64_t call_id, int net_error) { + auto it = active_doom_calls_.find(call_id); DCHECK(it != active_doom_calls_.end()); net::CompletionOnceCallback callback = std::move(it->second); active_doom_calls_.erase(it);
diff --git a/content/browser/service_worker/service_worker_disk_cache.h b/content/browser/service_worker/service_worker_disk_cache.h index cd548d69..a2a9dd76 100644 --- a/content/browser/service_worker/service_worker_disk_cache.h +++ b/content/browser/service_worker/service_worker_disk_cache.h
@@ -87,8 +87,7 @@ base::OnceCallback<void(int rv, std::unique_ptr<ServiceWorkerDiskCacheEntry>)>; - // Creates/opens/dooms a disk cache entry associated with `key`. These calls - // should not overlap. + // Creates/opens/dooms a disk cache entry associated with `key`. void CreateEntry(int64_t key, EntryCallback callback); void OpenEntry(int64_t key, EntryCallback callback); void DoomEntry(int64_t key, net::CompletionOnceCallback callback); @@ -118,8 +117,10 @@ net::CompletionOnceCallback callback); void OnCreateBackendComplete(int return_value); - void DidGetEntryResult(int64_t key, disk_cache::EntryResult result); - void DidDoomEntry(int64_t key, int net_error); + uint64_t GetNextCallId(); + + void DidGetEntryResult(uint64_t call_id, disk_cache::EntryResult result); + void DidDoomEntry(uint64_t call_id, int net_error); // Called by ServiceWorkerDiskCacheEntry constructor. void AddOpenEntry(ServiceWorkerDiskCacheEntry* entry); @@ -131,8 +132,10 @@ net::CompletionOnceCallback init_callback_; scoped_refptr<CreateBackendCallbackShim> create_backend_callback_; std::vector<base::OnceClosure> pending_calls_; - std::map</*key=*/int64_t, EntryCallback> active_entry_calls_; - std::map</*key=*/int64_t, net::CompletionOnceCallback> active_doom_calls_; + uint64_t next_call_id_ = 0; + std::map</*call_id=*/uint64_t, EntryCallback> active_entry_calls_; + std::map</*call_id=*/uint64_t, net::CompletionOnceCallback> + active_doom_calls_; std::set<ServiceWorkerDiskCacheEntry*> open_entries_; std::unique_ptr<disk_cache::Backend> disk_cache_;
diff --git a/content/browser/service_worker/service_worker_disk_cache_unittest.cc b/content/browser/service_worker/service_worker_disk_cache_unittest.cc new file mode 100644 index 0000000..b38f8fa --- /dev/null +++ b/content/browser/service_worker/service_worker_disk_cache_unittest.cc
@@ -0,0 +1,80 @@ +// Copyright 2020 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/service_worker/service_worker_disk_cache.h" + +#include "base/bind_helpers.h" +#include "base/files/scoped_temp_dir.h" +#include "base/test/bind_test_util.h" +#include "base/test/task_environment.h" +#include "net/base/net_errors.h" +#include "net/disk_cache/disk_cache.h" +#include "testing/gtest/include/gtest/gtest.h" + +// TODO(bashi): Port tests from AppCacheDiskCacheTest. + +namespace content { + +class ServiceWorkerDiskCacheTest : public testing::Test { + public: + ServiceWorkerDiskCacheTest() = default; + + void SetUp() override { ASSERT_TRUE(directory_.CreateUniqueTempDir()); } + + void TearDown() override { FlushCacheTasks(); } + + void FlushCacheTasks() { + disk_cache::FlushCacheThreadForTesting(); + task_environment_.RunUntilIdle(); + } + + void InitializeDiskCache(ServiceWorkerDiskCache* disk_cache) { + base::RunLoop loop; + disk_cache->InitWithDiskBackend( + directory_.GetPath(), false, + /*post_cleanup_callback=*/base::DoNothing::Once(), + base::BindLambdaForTesting([&](int rv) { + ASSERT_EQ(rv, net::OK); + loop.Quit(); + })); + loop.Run(); + } + + private: + base::test::TaskEnvironment task_environment_; + base::ScopedTempDir directory_; +}; + +// Tests that callbacks of operations are invoked even when these operations are +// called at the same time for the same key. +TEST_F(ServiceWorkerDiskCacheTest, MultipleCallsForSameKey) { + auto disk_cache = std::make_unique<ServiceWorkerDiskCache>(); + + bool create_entry_called = false; + bool open_entry_called = false; + bool doom_entry_called = false; + + const int64_t kKey = 1; + disk_cache->CreateEntry( + kKey, base::BindLambdaForTesting( + [&](int rv, std::unique_ptr<ServiceWorkerDiskCacheEntry>) { + create_entry_called = true; + })); + disk_cache->OpenEntry( + kKey, base::BindLambdaForTesting( + [&](int rv, std::unique_ptr<ServiceWorkerDiskCacheEntry>) { + open_entry_called = true; + })); + disk_cache->DoomEntry(kKey, base::BindLambdaForTesting( + [&](int rv) { doom_entry_called = true; })); + + InitializeDiskCache(disk_cache.get()); + FlushCacheTasks(); + + EXPECT_TRUE(create_entry_called); + EXPECT_TRUE(open_entry_called); + EXPECT_TRUE(doom_entry_called); +} + +} // namespace content
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc index 09b4ff6..9c29b2d 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -46,6 +46,7 @@ #include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" +#include "third_party/blink/public/mojom/loader/resource_load_info.mojom.h" namespace content { @@ -217,15 +218,16 @@ }; using EventType = ServiceWorkerMetrics::EventType; -EventType ResourceTypeToEventType(blink::mojom::ResourceType resource_type) { - switch (resource_type) { - case blink::mojom::ResourceType::kMainFrame: +EventType RequestDestinationToEventType( + network::mojom::RequestDestination destination) { + switch (destination) { + case network::mojom::RequestDestination::kDocument: return EventType::FETCH_MAIN_FRAME; - case blink::mojom::ResourceType::kSubFrame: + case network::mojom::RequestDestination::kIframe: return EventType::FETCH_SUB_FRAME; - case blink::mojom::ResourceType::kSharedWorker: + case network::mojom::RequestDestination::kSharedWorker: return EventType::FETCH_SHARED_WORKER; - case blink::mojom::ResourceType::kServiceWorker: + case network::mojom::RequestDestination::kServiceWorker: return EventType::FETCH_SUB_RESOURCE; default: return EventType::FETCH_SUB_RESOURCE; @@ -459,7 +461,7 @@ ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( blink::mojom::FetchAPIRequestPtr request, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination destination, const std::string& client_id, scoped_refptr<ServiceWorkerVersion> version, base::OnceClosure prepare_callback, @@ -468,7 +470,7 @@ : request_(std::move(request)), client_id_(client_id), version_(std::move(version)), - resource_type_(resource_type), + destination_(destination), prepare_callback_(std::move(prepare_callback)), fetch_callback_(std::move(fetch_callback)), is_offline_capability_check_(is_offline_capability_check) { @@ -679,8 +681,8 @@ URLLoaderFactoryGetter* url_loader_factory_getter, scoped_refptr<ServiceWorkerContextWrapper> context_wrapper, int frame_tree_node_id) { - if (resource_type_ != blink::mojom::ResourceType::kMainFrame && - resource_type_ != blink::mojom::ResourceType::kSubFrame) { + if (destination_ != network::mojom::RequestDestination::kDocument && + destination_ != network::mojom::RequestDestination::kIframe) { return false; } if (!version_->navigation_preload_state().enabled) @@ -707,11 +709,11 @@ } network::ResourceRequest resource_request(original_request); - if (resource_type_ == blink::mojom::ResourceType::kMainFrame) { + if (destination_ == network::mojom::RequestDestination::kDocument) { resource_request.resource_type = static_cast<int>( blink::mojom::ResourceType::kNavigationPreloadMainFrame); } else { - DCHECK_EQ(blink::mojom::ResourceType::kSubFrame, resource_type_); + DCHECK_EQ(network::mojom::RequestDestination::kIframe, destination_); resource_request.resource_type = static_cast<int>( blink::mojom::ResourceType::kNavigationPreloadSubFrame); } @@ -772,7 +774,7 @@ ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() const { - return ResourceTypeToEventType(resource_type_); + return RequestDestinationToEventType(destination_); } bool ServiceWorkerFetchDispatcher::IsEventDispatched() const {
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.h b/content/browser/service_worker/service_worker_fetch_dispatcher.h index b7756b7..2bd7c6e 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.h +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.h
@@ -18,12 +18,12 @@ #include "content/common/content_export.h" #include "content/public/browser/web_contents.h" #include "mojo/public/cpp/system/data_pipe.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h" #include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h" -#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h" namespace content { @@ -53,7 +53,7 @@ using WebContentsGetter = base::RepeatingCallback<WebContents*()>; ServiceWorkerFetchDispatcher(blink::mojom::FetchAPIRequestPtr request, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination destination, const std::string& client_id, scoped_refptr<ServiceWorkerVersion> version, base::OnceClosure prepare_callback, @@ -114,7 +114,7 @@ blink::mojom::FetchAPIRequestPtr request_; std::string client_id_; scoped_refptr<ServiceWorkerVersion> version_; - const blink::mojom::ResourceType resource_type_; + const network::mojom::RequestDestination destination_; base::OnceClosure prepare_callback_; FetchCallback fetch_callback_;
diff --git a/content/browser/service_worker/service_worker_main_resource_loader.cc b/content/browser/service_worker/service_worker_main_resource_loader.cc index c9e61002f..8d1116c 100644 --- a/content/browser/service_worker/service_worker_main_resource_loader.cc +++ b/content/browser/service_worker/service_worker_main_resource_loader.cc
@@ -164,8 +164,8 @@ // Dispatch the fetch event. fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>( blink::mojom::FetchAPIRequest::From(resource_request_), - static_cast<blink::mojom::ResourceType>(resource_request_.resource_type), - container_host_->client_uuid(), active_worker, + resource_request_.destination, container_host_->client_uuid(), + active_worker, base::BindOnce(&ServiceWorkerMainResourceLoader::DidPrepareFetchEvent, weak_factory_.GetWeakPtr(), active_worker, active_worker->running_status()), @@ -488,8 +488,8 @@ DCHECK(!completion_time_.is_null()); // We only record these metrics for top-level navigation. - if (resource_request_.resource_type != - static_cast<int>(blink::mojom::ResourceType::kMainFrame)) + if (resource_request_.destination != + network::mojom::RequestDestination::kDocument) return; // |fetch_event_timing_| is recorded in renderer so we can get reasonable
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc index 3794c2d..938e4f8 100644 --- a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc +++ b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.cc
@@ -82,7 +82,7 @@ void MaybeCreateLoaderOnCoreThread( base::WeakPtr<ServiceWorkerMainResourceLoaderInterceptor> interceptor_on_ui, ServiceWorkerMainResourceHandleCore* handle_core, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination request_destination, bool skip_service_worker, bool are_ancestors_secure, int frame_tree_node_id, @@ -117,14 +117,16 @@ DCHECK(client_remote); base::WeakPtr<ServiceWorkerContainerHost> container_host; - if (resource_type == blink::mojom::ResourceType::kMainFrame || - resource_type == blink::mojom::ResourceType::kSubFrame) { + if (request_destination == network::mojom::RequestDestination::kDocument || + request_destination == network::mojom::RequestDestination::kIframe) { container_host = context_core->CreateContainerHostForWindow( std::move(host_receiver), are_ancestors_secure, std::move(client_remote), frame_tree_node_id); } else { - DCHECK(resource_type == blink::mojom::ResourceType::kWorker || - resource_type == blink::mojom::ResourceType::kSharedWorker); + DCHECK(request_destination == + network::mojom::RequestDestination::kWorker || + request_destination == + network::mojom::RequestDestination::kSharedWorker); DCHECK(worker_token); ServiceWorkerClientInfo client_info = @@ -141,7 +143,7 @@ DCHECK(!handle_core->interceptor()); handle_core->set_interceptor( std::make_unique<ServiceWorkerControlleeRequestHandler>( - context_core->AsWeakPtr(), container_host, resource_type, + context_core->AsWeakPtr(), container_host, request_destination, skip_service_worker, handle_core->service_worker_accessed_callback())); } @@ -216,8 +218,8 @@ return base::WrapUnique(new ServiceWorkerMainResourceLoaderInterceptor( std::move(navigation_handle), - request_info.is_main_frame ? blink::mojom::ResourceType::kMainFrame - : blink::mojom::ResourceType::kSubFrame, + request_info.is_main_frame ? network::mojom::RequestDestination::kDocument + : network::mojom::RequestDestination::kIframe, request_info.begin_params->skip_service_worker, request_info.are_ancestors_secure, request_info.frame_tree_node_id, ChildProcessHost::kInvalidUniqueID, /* worker_token = */ nullptr)); @@ -231,11 +233,11 @@ base::WeakPtr<ServiceWorkerMainResourceHandle> navigation_handle) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - auto resource_type = - static_cast<blink::mojom::ResourceType>(resource_request.resource_type); - DCHECK(resource_type == blink::mojom::ResourceType::kWorker || - resource_type == blink::mojom::ResourceType::kSharedWorker) - << resource_request.resource_type; + DCHECK(resource_request.destination == + network::mojom::RequestDestination::kWorker || + resource_request.destination == + network::mojom::RequestDestination::kSharedWorker) + << resource_request.destination; // Create the handler even for insecure HTTP since it's used in the // case of redirect to HTTPS. @@ -243,7 +245,7 @@ return nullptr; return base::WrapUnique(new ServiceWorkerMainResourceLoaderInterceptor( - std::move(navigation_handle), resource_type, + std::move(navigation_handle), resource_request.destination, resource_request.skip_service_worker, /*are_ancestors_secure=*/false, FrameTreeNode::kFrameTreeNodeInvalidId, process_id, &worker_token)); } @@ -297,14 +299,14 @@ // LoaderCallbackWrapper() on the UI thread. ServiceWorkerContextWrapper::RunOrPostTaskOnCoreThread( FROM_HERE, - base::BindOnce(&MaybeCreateLoaderOnCoreThread, GetWeakPtr(), - handle_->core(), resource_type_, skip_service_worker_, - are_ancestors_secure_, frame_tree_node_id_, process_id_, - base::OptionalOrNullptr(worker_token_), - std::move(host_receiver), std::move(client_remote), - tentative_resource_request, browser_context, - std::move(loader_callback), std::move(fallback_callback), - initialize_container_host_only)); + base::BindOnce( + &MaybeCreateLoaderOnCoreThread, GetWeakPtr(), handle_->core(), + request_destination_, skip_service_worker_, are_ancestors_secure_, + frame_tree_node_id_, process_id_, + base::OptionalOrNullptr(worker_token_), std::move(host_receiver), + std::move(client_remote), tentative_resource_request, browser_context, + std::move(loader_callback), std::move(fallback_callback), + initialize_container_host_only)); if (original_callback) std::move(original_callback).Run({}); @@ -365,14 +367,14 @@ ServiceWorkerMainResourceLoaderInterceptor:: ServiceWorkerMainResourceLoaderInterceptor( base::WeakPtr<ServiceWorkerMainResourceHandle> handle, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination request_destination, bool skip_service_worker, bool are_ancestors_secure, int frame_tree_node_id, int process_id, const DedicatedOrSharedWorkerToken* worker_token) : handle_(std::move(handle)), - resource_type_(resource_type), + request_destination_(request_destination), skip_service_worker_(skip_service_worker), are_ancestors_secure_(are_ancestors_secure), frame_tree_node_id_(frame_tree_node_id),
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h index 422884a..9c12b7b 100644 --- a/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h +++ b/content/browser/service_worker/service_worker_main_resource_loader_interceptor.h
@@ -19,8 +19,8 @@ #include "content/public/common/child_process_host.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "third_party/blink/public/common/tokens/tokens.h" -#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h" namespace content { @@ -85,7 +85,7 @@ ServiceWorkerMainResourceLoaderInterceptor( base::WeakPtr<ServiceWorkerMainResourceHandle> handle, - blink::mojom::ResourceType resource_type, + network::mojom::RequestDestination request_destination, bool skip_service_worker, bool are_ancestors_secure, int frame_tree_node_id, @@ -115,7 +115,7 @@ const base::WeakPtr<ServiceWorkerMainResourceHandle> handle_; // For all clients: - const blink::mojom::ResourceType resource_type_; + const network::mojom::RequestDestination request_destination_; const bool skip_service_worker_; // For window clients:
diff --git a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc index 85e3fbd..1a5ab449 100644 --- a/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc +++ b/content/browser/service_worker/service_worker_offline_capability_check_browsertest.cc
@@ -23,6 +23,7 @@ #include "content/public/test/content_browser_test_utils.h" #include "content/shell/browser/shell.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "url/gurl.h" @@ -152,7 +153,7 @@ fetch_event_dispatch->fetch_dispatcher = std::make_unique<ServiceWorkerFetchDispatcher>( - std::move(request), blink::mojom::ResourceType::kMainFrame, + std::move(request), network::mojom::RequestDestination::kDocument, base::GenerateGUID() /* client_id */, std::move(version), base::DoNothing() /* prepare callback */, std::move(fetch_callback), fetch_event_dispatch->param_and_expected_result.param
diff --git a/content/browser/service_worker/service_worker_offline_capability_checker.cc b/content/browser/service_worker/service_worker_offline_capability_checker.cc index 410e488..c9cfc8c 100644 --- a/content/browser/service_worker/service_worker_offline_capability_checker.cc +++ b/content/browser/service_worker/service_worker_offline_capability_checker.cc
@@ -12,6 +12,7 @@ #include "content/browser/service_worker/service_worker_version.h" #include "content/browser/storage_partition_impl.h" #include "content/common/fetch/fetch_request_type_converters.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_database.mojom.h" #include "url/gurl.h" @@ -95,6 +96,7 @@ resource_request.mode = network::mojom::RequestMode::kNavigate; resource_request.resource_type = static_cast<int>(blink::mojom::ResourceType::kMainFrame); + resource_request.destination = network::mojom::RequestDestination::kDocument; // Store the weak reference to ServiceWorkerContextCore before // |preferred_version| moves. @@ -108,9 +110,8 @@ fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>( blink::mojom::FetchAPIRequest::From(resource_request), - static_cast<blink::mojom::ResourceType>(resource_request.resource_type), - base::GenerateGUID() /* client_id */, std::move(preferred_version), - base::DoNothing() /* prepare callback */, + resource_request.destination, base::GenerateGUID() /* client_id */, + std::move(preferred_version), base::DoNothing() /* prepare callback */, base::BindOnce(&ServiceWorkerOfflineCapabilityChecker::OnFetchResult, base::Unretained(this)), /*is_offline_capability_check=*/true);
diff --git a/content/browser/service_worker/service_worker_version_browsertest.cc b/content/browser/service_worker/service_worker_version_browsertest.cc index 5db8b49..19591e9 100644 --- a/content/browser/service_worker/service_worker_version_browsertest.cc +++ b/content/browser/service_worker/service_worker_version_browsertest.cc
@@ -59,11 +59,11 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "services/network/public/cpp/features.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "storage/browser/test/blob_test_utils.h" #include "third_party/blink/public/common/service_worker/service_worker_status_code.h" #include "third_party/blink/public/common/service_worker/service_worker_type_converters.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" -#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" using blink::mojom::CacheStorageError; @@ -718,8 +718,8 @@ BrowserThread::CurrentlyOn(ServiceWorkerContext::GetCoreThreadId())); version_->SetStatus(ServiceWorkerVersion::ACTIVATED); GURL url = embedded_test_server()->GetURL(path); - blink::mojom::ResourceType resource_type = - blink::mojom::ResourceType::kMainFrame; + network::mojom::RequestDestination destination = + network::mojom::RequestDestination::kDocument; base::OnceClosure prepare_callback = CreatePrepareReceiver(prepare_result); ServiceWorkerFetchDispatcher::FetchCallback fetch_callback = CreateResponseReceiver(std::move(done), result); @@ -727,7 +727,7 @@ request->url = url; request->method = "GET"; fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>( - std::move(request), resource_type, std::string() /* client_id */, + std::move(request), destination, std::string() /* client_id */, version_, std::move(prepare_callback), std::move(fetch_callback), /*is_offline_cpability_check=*/false); fetch_dispatcher_->Run();
diff --git a/content/browser/worker_host/worker_script_loader_factory_unittest.cc b/content/browser/worker_host/worker_script_loader_factory_unittest.cc index 553fbaa9..1acffdd 100644 --- a/content/browser/worker_host/worker_script_loader_factory_unittest.cc +++ b/content/browser/worker_host/worker_script_loader_factory_unittest.cc
@@ -17,6 +17,7 @@ #include "net/base/isolation_info.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h" +#include "services/network/public/mojom/fetch_api.mojom.h" #include "services/network/test/test_url_loader_client.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/tokens/tokens.h" @@ -74,6 +75,8 @@ url::Origin::Create(url), net::SiteForCookies()); resource_request.resource_type = static_cast<int>(blink::mojom::ResourceType::kSharedWorker); + resource_request.destination = + network::mojom::RequestDestination::kSharedWorker; factory->CreateLoaderAndStart( loader.InitWithNewPipeAndPassReceiver(), 0 /* routing_id */, 0 /* request_id */, network::mojom::kURLLoadOptionNone,
diff --git a/content/public/browser/site_isolation_policy.cc b/content/public/browser/site_isolation_policy.cc index 77b39af..e5ef000 100644 --- a/content/public/browser/site_isolation_policy.cc +++ b/content/public/browser/site_isolation_policy.cc
@@ -114,17 +114,6 @@ } // static -bool SiteIsolationPolicy::ShouldPdfCompositorBeEnabledForOopifs() { - // TODO(weili): We only create pdf compositor client and use pdf compositor - // service when site-per-process or isolate-origins flag/feature is enabled, - // or top-document-isolation feature is enabled. This may not cover all cases - // where OOPIF is used such as isolate-extensions, but should be good for - // feature testing purpose. Eventually, we will remove this check and use pdf - // compositor service by default for printing. - return AreIsolatedOriginsEnabled() || UseDedicatedProcessesForAllSites(); -} - -// static bool SiteIsolationPolicy::AreDynamicIsolatedOriginsEnabled() { return !IsSiteIsolationDisabled(); }
diff --git a/content/public/browser/site_isolation_policy.h b/content/public/browser/site_isolation_policy.h index fa09d22..fc0c16f 100644 --- a/content/public/browser/site_isolation_policy.h +++ b/content/public/browser/site_isolation_policy.h
@@ -38,10 +38,6 @@ // Returns true if error page isolation is enabled. static bool IsErrorPageIsolationEnabled(bool in_main_frame); - // Returns true if the PDF compositor should be enabled to allow out-of- - // process iframes (OOPIF's) to print properly. - static bool ShouldPdfCompositorBeEnabledForOopifs(); - // Returns true if isolated origins may be added at runtime in response // to hints such as users typing in a password or (in the future) an origin // opting itself into isolation via a header.
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h index f63b174..615b735 100644 --- a/content/public/renderer/render_frame_observer.h +++ b/content/public/renderer/render_frame_observer.h
@@ -39,7 +39,7 @@ class WebFormElement; class WebString; class WebWorkerFetchContext; -} +} // namespace blink namespace network { struct URLLoaderCompletionStatus; @@ -275,6 +275,9 @@ const std::string& interface_name, mojo::ScopedInterfaceEndpointHandle* handle); + // Called when a page's mobile friendliness changed. + virtual void OnMobileFriendlinessChanged(const blink::MobileFriendliness&) {} + // The smoothness metrics is shared over shared-memory. The interested // observer should invalidate |shared_memory| (by std::move()'ing it), and // return true. All other observers should return false (default).
diff --git a/content/renderer/media/batching_media_log.cc b/content/renderer/media/batching_media_log.cc index 351b7392..aac0dee 100644 --- a/content/renderer/media/batching_media_log.cc +++ b/content/renderer/media/batching_media_log.cc
@@ -32,10 +32,10 @@ // TODO(tmathmeyer) replace this with a log-only EventHandler. void Log(media::MediaLogRecord* event) { if (event->type == media::MediaLogRecord::Type::kMediaStatus) { - LOG(ERROR) << "MediaEvent: " << ToJSON(event); + DVLOG(1) << "MediaEvent: " << ToJSON(event); } else if (event->type == media::MediaLogRecord::Type::kMessage && event->params.HasKey("error")) { - LOG(ERROR) << "MediaEvent: " << ToJSON(event); + DVLOG(1) << "MediaEvent: " << ToJSON(event); } else if (event->type != media::MediaLogRecord::Type::kMediaPropertyChange) { DVLOG(1) << "MediaEvent: " << ToJSON(event); }
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index e9550f7..4f39cd2 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -6095,6 +6095,13 @@ output_device_id); } +void RenderFrameImpl::DidChangeMobileFriendliness( + const blink::MobileFriendliness& mf) { + for (auto& observer : observers_) { + observer.OnMobileFriendlinessChanged(mf); + } +} + void RenderFrameImpl::InitializeMediaStreamDeviceObserver() { RenderThreadImpl* render_thread = RenderThreadImpl::current(); if (!render_thread) // Will be NULL during unit tests.
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 5bf0eef..5af447b 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -731,6 +731,8 @@ void DidCommitAndDrawCompositorFrame() override; void WasHidden() override; void WasShown() override; + void DidChangeMobileFriendliness(const blink::MobileFriendliness&) override; + void SetUpSharedMemoryForSmoothness( base::ReadOnlySharedMemoryRegion shared_memory) override; blink::WebURL LastCommittedUrlForUKM() override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 59b1fa92..802c7c63 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1967,6 +1967,7 @@ "../browser/service_worker/service_worker_context_wrapper_unittest.cc", "../browser/service_worker/service_worker_controllee_request_handler_unittest.cc", "../browser/service_worker/service_worker_database_unittest.cc", + "../browser/service_worker/service_worker_disk_cache_unittest.cc", "../browser/service_worker/service_worker_installed_scripts_sender_unittest.cc", "../browser/service_worker/service_worker_job_unittest.cc", "../browser/service_worker/service_worker_main_resource_loader_interceptor_unittest.cc",
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index a9291e4..4792726 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -245,6 +245,9 @@ crbug.com/1136414 [ fuchsia ] conformance/ogles/GL/build/build_009_to_016.html [ Skip ] crbug.com/1136414 [ fuchsia ] conformance/ogles/GL/mat/mat_009_to_016.html [ Skip ] +# Anti-aliasing disabled on Fuchsia +[ fuchsia ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] + #################### # Win failures # ####################
diff --git a/content/web_test/BUILD.gn b/content/web_test/BUILD.gn index dba7450..65d4651 100644 --- a/content/web_test/BUILD.gn +++ b/content/web_test/BUILD.gn
@@ -42,6 +42,7 @@ static_library("web_test_common") { testonly = true sources = [ + "common/web_test_constants.cc", "common/web_test_constants.h", "common/web_test_string_util.cc", "common/web_test_string_util.h",
diff --git a/content/web_test/browser/web_test_control_host.cc b/content/web_test/browser/web_test_control_host.cc index 8a9531d0..053b789 100644 --- a/content/web_test/browser/web_test_control_host.cc +++ b/content/web_test/browser/web_test_control_host.cc
@@ -1217,6 +1217,8 @@ GetWebTestRenderThreadRemote(process_host) ->ReplicateWebTestRuntimeFlagsChanges( accumulated_web_test_runtime_flags_changes_.Clone()); + GetWebTestRenderThreadRemote(process_host) + ->ReplicateWorkQueueStates(work_queue_states_.Clone()); } } @@ -1229,6 +1231,7 @@ devtools_bindings_.reset(); devtools_protocol_test_bindings_.reset(); accumulated_web_test_runtime_flags_changes_.Clear(); + work_queue_states_.Clear(); ShellBrowserContext* browser_context = ShellContentBrowserClient::Get()->browser_context(); @@ -1711,6 +1714,32 @@ next_pointer_lock_action_ = NextPointerLockAction::kWillSucceed; } +void WebTestControlHost::WorkItemAdded(mojom::WorkItemPtr work_item) { + // TODO(peria): Check if |work_item| comes from the main window's main frame. + // TODO(peria): Reject the item if the work queue is frozen. + work_queue_.push_back(std::move(work_item)); +} + +void WebTestControlHost::RequestWorkItem() { + DCHECK(main_window_); + RenderProcessHost* main_frame_process = + main_window_->web_contents()->GetRenderViewHost()->GetProcess(); + if (work_queue_.empty()) { + work_queue_states_.SetBoolPath(kDictKeyWorkQueueHasItems, false); + GetWebTestRenderThreadRemote(main_frame_process) + ->ReplicateWorkQueueStates(work_queue_states_.Clone()); + } else { + GetWebTestRenderThreadRemote(main_frame_process) + ->ProcessWorkItem(work_queue_.front()->Clone()); + work_queue_.pop_front(); + } +} + +void WebTestControlHost::WorkQueueStatesChanged( + base::Value changed_work_queue_states) { + work_queue_states_.MergeDictionary(&changed_work_queue_states); +} + void WebTestControlHost::GoToOffset(int offset) { main_window_->GoBackOrForward(offset); }
diff --git a/content/web_test/browser/web_test_control_host.h b/content/web_test/browser/web_test_control_host.h index e5813b02..1bf370c 100644 --- a/content/web_test/browser/web_test_control_host.h +++ b/content/web_test/browser/web_test_control_host.h
@@ -246,6 +246,9 @@ void SetPointerLockWillFail() override; void SetPointerLockWillRespondAsynchronously() override; void AllowPointerLock() override; + void WorkItemAdded(mojom::WorkItemPtr work_item) override; + void RequestWorkItem() override; + void WorkQueueStatesChanged(base::Value changed_work_queue_states) override; void DiscardMainWindow(); void CloseTestOpenedWindows(); @@ -354,6 +357,13 @@ // renderer created while test is in progress). base::DictionaryValue accumulated_web_test_runtime_flags_changes_; + // Work items to be processed in the TestRunner on the renderer process + // that hosts the main window's main frame. + base::circular_deque<mojom::WorkItemPtr> work_queue_; + + // Properties of the work queue. + base::DictionaryValue work_queue_states_; + mojom::WebTestRendererDumpResultPtr renderer_dump_result_; std::string navigation_history_dump_; base::Optional<SkBitmap> pixel_dump_;
diff --git a/content/web_test/common/web_test.mojom b/content/web_test/common/web_test.mojom index 61e6153..8a83c41 100644 --- a/content/web_test/common/web_test.mojom +++ b/content/web_test/common/web_test.mojom
@@ -5,8 +5,8 @@ module content.mojom; import "mojo/public/mojom/base/file_path.mojom"; -import "mojo/public/mojom/base/values.mojom"; import "mojo/public/mojom/base/string16.mojom"; +import "mojo/public/mojom/base/values.mojom"; import "skia/public/mojom/bitmap.mojom"; import "third_party/blink/public/mojom/permissions/permission_status.mojom"; import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom"; @@ -50,6 +50,48 @@ gfx.mojom.Rect selection_rect; }; +// Tasks in the work queue. TestRunner on the main window's process manages +// the queue, but TestRunner can migrate processes on navigations, so the queue +// is stored on the browser side. +// The work queue can be populated in the first page's loading on the main +// window's main frame, and gets frozen at the end of the loading. +// Work queues on non-main windows are frozen from the beginning, and can't +// add work items. + +// Navigates backward/forward in history +struct WorkItemBackForward { + // Navigation distance. If |distance| is negative, navigates to backward. + int32 distance; +}; + +// Navigates a frame named |target| to |url| +struct WorkItemLoad { + string url; + // If |target| is empty, it means the main frame. + string target; +}; + +// Reloads +struct WorkItemReload {}; + +// Runs JavaScript code |script| which may trigger a navigation +struct WorkItemLoadingScript { + string script; +}; + +// Runs JavaScript code |script| which does not trigger navigations +struct WorkItemNonLoadingScript { + string script; +}; + +union WorkItem { + WorkItemBackForward back_forward; + WorkItemLoad load; + WorkItemReload reload; + WorkItemLoadingScript loading_script; + WorkItemNonLoadingScript non_loading_script; +}; + // Web test messages sent from the browser process to the renderer. This // interface is associated with RenderFrameHost. interface WebTestRenderFrame { @@ -95,6 +137,13 @@ // leak detection in order for the test harness to drop anything that tests // passed in and which could cause a leak otherwise. ResetRendererAfterWebTest() => (); + + // Processes a work item. This is called for the process with the main + // window's main frame. + ProcessWorkItem(WorkItem work_item); + + // Syncs the work queue states to the new renderer. + ReplicateWorkQueueStates(mojo_base.mojom.DictionaryValue work_queue_states); }; // Web test messages sent from the renderer process to the browser. This @@ -244,4 +293,18 @@ // Allow a pending pointer lock request. AllowPointerLock(); + + // Notifies the browser that a work item is enqueued. + WorkItemAdded(WorkItem work_item); + + // Requests the browser to send a work item. If the work queue has N items, + // there will be N+1 calls to RequestWorkItem and N replies via + // WebTestRenderThread.ProcessWorkItem. The last RequestWorkItem sets + // |has_items| bit false, and is replied via + // WebTestRenderThread.ReplicateWorkQueueStates. + RequestWorkItem(); + + // Notifies the browser that the work queue states changed. + WorkQueueStatesChanged( + mojo_base.mojom.DictionaryValue changed_work_queue_states); };
diff --git a/content/web_test/common/web_test_constants.cc b/content/web_test/common/web_test_constants.cc new file mode 100644 index 0000000..feb76438 --- /dev/null +++ b/content/web_test/common/web_test_constants.cc
@@ -0,0 +1,12 @@ +// Copyright 2020 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/web_test/common/web_test_constants.h" + +namespace content { + +// DictValue key to show if the work queue has something to do. +const char kDictKeyWorkQueueHasItems[] = "has_items"; + +} // namespace content
diff --git a/content/web_test/common/web_test_constants.h b/content/web_test/common/web_test_constants.h index 97451ff..8968c08 100644 --- a/content/web_test/common/web_test_constants.h +++ b/content/web_test/common/web_test_constants.h
@@ -9,6 +9,8 @@ constexpr int kDefaultDatabaseQuota = -1; +extern const char kDictKeyWorkQueueHasItems[]; + } // namespace content #endif // CONTENT_WEB_TEST_COMMON_WEB_TEST_CONSTANTS_H_
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc index 0b26eba..8b98e33 100644 --- a/content/web_test/renderer/test_runner.cc +++ b/content/web_test/renderer/test_runner.cc
@@ -2140,69 +2140,100 @@ TestRunner::WorkQueue::WorkQueue(TestRunner* controller) : controller_(controller) {} -TestRunner::WorkQueue::~WorkQueue() { - Reset(); -} - -void TestRunner::WorkQueue::ProcessWorkSoon() { - // We delay processing queued work to avoid recursion problems, and to avoid - // running tasks in the middle of a navigation call stack, where blink and - // content may have inconsistent states halfway through being updated. - blink::scheduler::GetSingleThreadTaskRunnerForTesting()->PostTask( - FROM_HERE, base::BindOnce(&TestRunner::WorkQueue::ProcessWork, - weak_factory_.GetWeakPtr())); -} - void TestRunner::WorkQueue::Reset() { - frozen_ = false; - finished_loading_ = false; - while (!queue_.empty()) { - delete queue_.front(); - queue_.pop_front(); - } + // Set values in a TrackedDictionary |states_| to avoid accessing missing + // values. + set_frozen(false); + set_has_items(false); + states_.ResetChangeTracking(); + set_loading(true); } -void TestRunner::WorkQueue::AddWork(WorkItem* work) { - if (frozen_) { - delete work; +void TestRunner::WorkQueue::AddWork(mojom::WorkItemPtr work_item) { + if (is_frozen()) return; - } - queue_.push_back(work); + controller_->GetWebTestControlHostRemote()->WorkItemAdded( + std::move(work_item)); + set_has_items(true); + OnStatesChanged(); } -void TestRunner::WorkQueue::ProcessWork() { - WebFrameTestProxy* in_process_main_frame = - controller_->FindInProcessMainWindowMainFrame(); - if (!in_process_main_frame) +void TestRunner::WorkQueue::RequestWork() { + controller_->GetWebTestControlHostRemote()->RequestWorkItem(); +} + +void TestRunner::WorkQueue::ProcessWorkItem(mojom::WorkItemPtr work_item) { + // Watch for loading finishing inside ProcessWorkItemInternal(). + set_loading(true); + bool started_load = ProcessWorkItemInternal(std::move(work_item)); + if (started_load) { + // If a load started, and didn't complete inside of + // ProcessWorkItemInternal(), then mark the load as running. + if (loading_) + controller_->frame_will_start_load_ = true; + + // Wait for an ongoing load to complete before requesting the next WorkItem. return; + } + RequestWork(); +} - while (!queue_.empty()) { - finished_loading_ = false; // Watch for loading finishing inside Run(). - bool started_load = queue_.front()->Run(controller_, in_process_main_frame); - delete queue_.front(); - queue_.pop_front(); - - if (started_load) { - // If a load started, and didn't complete inside of Run(), then mark - // the load as running. - if (!finished_loading_) - controller_->frame_will_start_load_ = true; - - // Quit doing work once a load is in progress. - // - // TODO(danakj): We could avoid the post-task of ProcessWork() by not - // early-outting here if |finished_loading_|. Since load finished we - // could keep running work. And in RemoveLoadingFrame() instead of - // calling ProcessWorkSoon() unconditionally, only call it if we're not - // already inside ProcessWork(). - return; +bool TestRunner::WorkQueue::ProcessWorkItemInternal( + mojom::WorkItemPtr work_item) { + switch (work_item->which()) { + case mojom::WorkItem::Tag::BACK_FORWARD: { + mojom::WorkItemBackForwardPtr& item_back_forward = + work_item->get_back_forward(); + controller_->GoToOffset(item_back_forward->distance); + return true; // TODO(danakj): Did it really start a navigation? } + case mojom::WorkItem::Tag::LOADING_SCRIPT: { + mojom::WorkItemLoadingScriptPtr& item_loading_script = + work_item->get_loading_script(); + WebFrameTestProxy* main_frame = + controller_->FindInProcessMainWindowMainFrame(); + DCHECK(main_frame); + main_frame->GetWebFrame()->ExecuteScript(blink::WebScriptSource( + blink::WebString::FromUTF8(item_loading_script->script))); + return true; // TODO(danakj): Did it really start a navigation? + } + case mojom::WorkItem::Tag::NON_LOADING_SCRIPT: { + mojom::WorkItemNonLoadingScriptPtr& item_non_loading_script = + work_item->get_non_loading_script(); + WebFrameTestProxy* main_frame = + controller_->FindInProcessMainWindowMainFrame(); + DCHECK(main_frame); + main_frame->GetWebFrame()->ExecuteScript(blink::WebScriptSource( + blink::WebString::FromUTF8(item_non_loading_script->script))); + return false; + } + case mojom::WorkItem::Tag::LOAD: { + mojom::WorkItemLoadPtr& item_load = work_item->get_load(); + controller_->LoadURLForFrame(GURL(item_load->url), item_load->target); + return true; // TODO(danakj): Did it really start a navigation? + } + case mojom::WorkItem::Tag::RELOAD: + controller_->Reload(); + return true; } + NOTREACHED(); + return false; +} - // If there was no navigation stated, there may be no more tasks in the - // system. We can safely finish the test here as we're not in the middle - // of a navigation call stack, and ProcessWork() was a posted task. - controller_->FinishTestIfReady(); +void TestRunner::WorkQueue::ReplicateStates( + const base::DictionaryValue& values) { + states_.ApplyUntrackedChanges(values); + if (!has_items()) + controller_->FinishTestIfReady(); +} + +void TestRunner::WorkQueue::OnStatesChanged() { + if (states_.changed_values().empty()) + return; + + controller_->GetWebTestControlHostRemote()->WorkQueueStatesChanged( + states_.changed_values().Clone()); + states_.ResetChangeTracking(); } TestRunner::TestRunner() @@ -2520,15 +2551,17 @@ // No more new work after the first complete load. work_queue_.set_frozen(true); + work_queue_.OnStatesChanged(); + // Inform the work queue that any load it started is done, in case it is - // still inside ProcessWork(). - work_queue_.set_finished_loading(); + // still inside ProcessWorkItem(). + work_queue_.set_loading(false); // testRunner.waitUntilDone() will pause the work queue if it is being used by // the test, until testRunner.notifyDone() is called. However this can only be // done once. if (!web_test_runtime_flags_.wait_until_done() || did_notify_done_) - work_queue_.ProcessWorkSoon(); + work_queue_.RequestWork(); } void TestRunner::FinishTestIfReady() { @@ -2552,7 +2585,7 @@ // If there are tasks in the queue still, we must wait for them before // finishing the test. - if (!work_queue_.is_empty()) + if (work_queue_.has_items()) return; // If waiting for testRunner.notifyDone() then we can not end the test. @@ -2650,19 +2683,6 @@ return web_test_runtime_flags_.dump_navigation_policy(); } -class WorkItemBackForward : public TestRunner::WorkItem { - public: - explicit WorkItemBackForward(int distance) : distance_(distance) {} - - bool Run(TestRunner* test_runner, WebFrameTestProxy*) override { - test_runner->GoToOffset(distance_); - return true; // FIXME: Did it really start a navigation? - } - - private: - int distance_; -}; - WebFrameTestProxy* TestRunner::FindInProcessMainWindowMainFrame() { for (WebFrameTestProxy* main_frame : main_frames_) { WebViewTestProxy* view = main_frame->GetWebViewTestProxy(); @@ -2691,82 +2711,45 @@ } void TestRunner::QueueBackNavigation(int how_far_back) { - work_queue_.AddWork(new WorkItemBackForward(-how_far_back)); + work_queue_.AddWork(mojom::WorkItem::NewBackForward( + mojom::WorkItemBackForward::New(-how_far_back))); } void TestRunner::QueueForwardNavigation(int how_far_forward) { - work_queue_.AddWork(new WorkItemBackForward(how_far_forward)); + work_queue_.AddWork(mojom::WorkItem::NewBackForward( + mojom::WorkItemBackForward::New(how_far_forward))); } -class WorkItemReload : public TestRunner::WorkItem { - public: - bool Run(TestRunner* test_runner, WebFrameTestProxy*) override { - test_runner->Reload(); - return true; - } -}; - void TestRunner::QueueReload() { - work_queue_.AddWork(new WorkItemReload()); + work_queue_.AddWork(mojom::WorkItem::NewReload(mojom::WorkItemReload::New())); } -class WorkItemLoadingScript : public TestRunner::WorkItem { - public: - explicit WorkItemLoadingScript(const std::string& script) : script_(script) {} - - bool Run(TestRunner*, WebFrameTestProxy* main_frame) override { - main_frame->GetWebFrame()->ExecuteScript( - blink::WebScriptSource(blink::WebString::FromUTF8(script_))); - return true; // FIXME: Did it really start a navigation? - } - - private: - std::string script_; -}; - void TestRunner::QueueLoadingScript(const std::string& script) { - work_queue_.AddWork(new WorkItemLoadingScript(script)); + work_queue_.AddWork(mojom::WorkItem::NewLoadingScript( + mojom::WorkItemLoadingScript::New(script))); } -class WorkItemNonLoadingScript : public TestRunner::WorkItem { - public: - explicit WorkItemNonLoadingScript(const std::string& script) - : script_(script) {} - - bool Run(TestRunner*, WebFrameTestProxy* main_frame) override { - main_frame->GetWebFrame()->ExecuteScript( - blink::WebScriptSource(blink::WebString::FromUTF8(script_))); - return false; - } - - private: - std::string script_; -}; - void TestRunner::QueueNonLoadingScript(const std::string& script) { - work_queue_.AddWork(new WorkItemNonLoadingScript(script)); + work_queue_.AddWork(mojom::WorkItem::NewNonLoadingScript( + mojom::WorkItemNonLoadingScript::New(script))); } -class WorkItemLoad : public TestRunner::WorkItem { - public: - WorkItemLoad(const GURL& url, const std::string& target) - : url_(url), target_(target) {} - - bool Run(TestRunner* test_runner, WebFrameTestProxy*) override { - test_runner->LoadURLForFrame(url_, target_); - return true; // FIXME: Did it really start a navigation? - } - - private: - GURL url_; - std::string target_; -}; - void TestRunner::QueueLoad(const GURL& current_url, const std::string& relative_url, const std::string& target) { GURL full_url = current_url.Resolve(relative_url); - work_queue_.AddWork(new WorkItemLoad(full_url, target)); + work_queue_.AddWork(mojom::WorkItem::NewLoad( + mojom::WorkItemLoad::New(full_url.spec(), target))); +} + +void TestRunner::ProcessWorkItem(mojom::WorkItemPtr work_item) { + work_queue_.ProcessWorkItem(std::move(work_item)); +} + +void TestRunner::ReplicateWorkQueueStates(const base::DictionaryValue& values) { + if (!test_is_running_) + return; + work_queue_.ReplicateStates(values); } void TestRunner::OnTestPreferencesChanged(const TestPreferences& test_prefs,
diff --git a/content/web_test/renderer/test_runner.h b/content/web_test/renderer/test_runner.h index 5136141c..25ba0aa 100644 --- a/content/web_test/renderer/test_runner.h +++ b/content/web_test/renderer/test_runner.h
@@ -22,6 +22,7 @@ #include "base/strings/string16.h" #include "content/web_test/common/web_test.mojom.h" #include "content/web_test/common/web_test_bluetooth_fake_adapter_setter.mojom.h" +#include "content/web_test/common/web_test_constants.h" #include "content/web_test/renderer/fake_screen_orientation_impl.h" #include "content/web_test/renderer/gamepad_controller.h" #include "content/web_test/renderer/layout_dump.h" @@ -239,19 +240,13 @@ blink::WebString RegisterIsolatedFileSystem( const std::vector<base::FilePath>& file_paths); + void ProcessWorkItem(mojom::WorkItemPtr work_item); + void ReplicateWorkQueueStates(const base::DictionaryValue& changed_values); + blink::WebEffectiveConnectionType effective_connection_type() const { return effective_connection_type_; } - // A single item in the work queue. - class WorkItem { - public: - virtual ~WorkItem() {} - - // Returns true if this started a load. - virtual bool Run(TestRunner*, WebFrameTestProxy*) = 0; - }; - private: friend class TestRunnerBindings; friend class WorkQueue; @@ -259,30 +254,47 @@ // Helper class for managing events queued by methods like QueueLoad or // QueueScript. class WorkQueue { + static constexpr const char* kKeyFrozen = "frozen"; + public: explicit WorkQueue(TestRunner* controller); - virtual ~WorkQueue(); - void ProcessWorkSoon(); + ~WorkQueue() = default; // Reset the state of the class between tests. void Reset(); - void AddWork(WorkItem*); + void AddWork(mojom::WorkItemPtr work_item); + void RequestWork(); + void ProcessWorkItem(mojom::WorkItemPtr work_item); + void ReplicateStates(const base::DictionaryValue& values); - void set_frozen(bool frozen) { frozen_ = frozen; } - bool is_empty() const { return queue_.empty(); } + // Takes care of notifying the browser after a change to the state. + void OnStatesChanged(); - void set_finished_loading() { finished_loading_ = true; } + void set_loading(bool value) { loading_ = value; } + + void set_frozen(bool value) { states_.SetBoolean(kKeyFrozen, value); } + void set_has_items(bool value) { + states_.SetBoolean(kDictKeyWorkQueueHasItems, value); + } + bool has_items() const { return GetStateValue(kDictKeyWorkQueueHasItems); } private: - void ProcessWork(); + bool ProcessWorkItemInternal(mojom::WorkItemPtr work_item); - base::circular_deque<WorkItem*> queue_; - bool frozen_ = false; - bool finished_loading_ = false; + bool is_frozen() const { return GetStateValue(kKeyFrozen); } + + bool GetStateValue(const char* key) const { + base::Optional<bool> value = states_.current_values().FindBoolPath(key); + DCHECK(value.has_value()); + return value.value(); + } + + bool loading_ = true; + // Collection of flags to be synced with the browser process. + TrackedDictionary states_; + TestRunner* controller_; - - base::WeakPtrFactory<WorkQueue> weak_factory_{this}; }; // If the main test window's main frame is hosted in this renderer process,
diff --git a/content/web_test/renderer/web_test_render_thread_observer.cc b/content/web_test/renderer/web_test_render_thread_observer.cc index d0b0c8a..f5e5f25 100644 --- a/content/web_test/renderer/web_test_render_thread_observer.cc +++ b/content/web_test/renderer/web_test_render_thread_observer.cc
@@ -80,4 +80,17 @@ test_runner_->ResetRendererAfterWebTest(std::move(done_callback)); } +void WebTestRenderThreadObserver::ProcessWorkItem( + mojom::WorkItemPtr work_item) { + test_runner_->ProcessWorkItem(std::move(work_item)); +} + +void WebTestRenderThreadObserver::ReplicateWorkQueueStates( + base::Value work_queue_states) { + base::DictionaryValue* work_queue_states_dict = nullptr; + bool ok = work_queue_states.GetAsDictionary(&work_queue_states_dict); + DCHECK(ok); + test_runner_->ReplicateWorkQueueStates(*work_queue_states_dict); +} + } // namespace content
diff --git a/content/web_test/renderer/web_test_render_thread_observer.h b/content/web_test/renderer/web_test_render_thread_observer.h index 0cdb4f5..360c7f0d 100644 --- a/content/web_test/renderer/web_test_render_thread_observer.h +++ b/content/web_test/renderer/web_test_render_thread_observer.h
@@ -39,6 +39,8 @@ base::Value changed_layout_test_runtime_flags) override; void TestFinishedFromSecondaryRenderer() override; void ResetRendererAfterWebTest(base::OnceClosure done_callback) override; + void ProcessWorkItem(mojom::WorkItemPtr work_item) override; + void ReplicateWorkQueueStates(base::Value work_queue_states) override; // Helper to bind this class as the mojom::WebTestRenderThread. void OnWebTestRenderThreadAssociatedRequest(
diff --git a/docs/login/user_types.md b/docs/login/user_types.md index 3e5f8c99..99cf1c0 100644 --- a/docs/login/user_types.md +++ b/docs/login/user_types.md
@@ -16,9 +16,12 @@ ## Child users Users that logged in using -* a child account - an account designated for children under the age of 13. +* a Unicorn account - an account designated for children under the age of + consent in their jurisdiction. * a Geller account - an account with parental supervision that has no age restrictions. +* a Griffin account - similar to a Geller account, but for compliance with + European Union laws. In order to add a child user to the device, the user has to go through an adapted GAIA flow, which also requires their parent to authenticate.
diff --git a/docs/webui_explainer.md b/docs/webui_explainer.md index f62e208..6d247540 100644 --- a/docs/webui_explainer.md +++ b/docs/webui_explainer.md
@@ -407,12 +407,12 @@ ``` <a name="SetupWebUIDataSource"></a> -### webui::SetupWebUIDataSource() +### webui::SetupWebUIDataSource() and webui::SetupBundledWebUIDataSource() -This method performs common configuration tasks on a data source for a Web UI -that uses JS modules. When creating a Web UI that uses JS modules, use this -utility instead of duplicating the configuration steps it performs elsewhere. -Specific setup steps include: +These methods perform common configuration tasks on a data source for a Web UI +that uses JS modules. When creating a Web UI that uses JS modules, use these +utilities instead of duplicating the configuration steps they perform elsewhere. +Specific setup steps performed by these utilities include: * Setting the content security policy to allow the data source to load only resources from its own host (e.g. chrome://history), chrome://resources, and @@ -422,7 +422,13 @@ * Adding the test loader files to the data source, so that test files can be loaded as JS modules. * Setting the resource to load for the empty path. -* Adding all resources from a GritResourceMap. + +The version for non-bundled UIs (<code>SetupWebUIDataSource()</code>) also adds +all resources in a GritResourceMap. + +The version for bundled UIs (<code>SetupBundledWebUIDataSource()</code>) adds +a single specified bundled resource. Note that this version is only defined when +the optimize_webui build flag is enabled. ## Browser (C++) → Renderer (JS)
diff --git a/extensions/browser/api/system_cpu/cpu_info_provider_mac.cc b/extensions/browser/api/system_cpu/cpu_info_provider_mac.cc index 7690d83..606b8d9 100644 --- a/extensions/browser/api/system_cpu/cpu_info_provider_mac.cc +++ b/extensions/browser/api/system_cpu/cpu_info_provider_mac.cc
@@ -6,6 +6,7 @@ #include <mach/mach_host.h> +#include "base/mac/mac_util.h" #include "base/mac/scoped_mach_port.h" #include "base/system/sys_info.h" @@ -13,6 +14,16 @@ bool CpuInfoProvider::QueryCpuTimePerProcessor( std::vector<api::system_cpu::ProcessorInfo>* infos) { + if (base::mac::GetCPUType() == base::mac::CPUType::kTranslatedIntel) { + // In writing Rosetta, Apple needed to stop simulating an x86 environment + // somewhere, and they did so before they got to `host_processor_info()`. + // `host_processor_info()` is a Mach call to a host server in the kernel, + // and that server does not maintain data corresponding to the simulated + // processors. See https://crbug.com/1138707#c42 for details. See also + // FB8832191. + return false; + } + DCHECK(infos); natural_t num_of_processors;
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 7a99f6e..8a57c4d 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1580,7 +1580,7 @@ FILEMANAGERPRIVATEINTERNAL_GETPDFTHUMBNAIL = 1517, AUTOTESTPRIVATE_REMOVEALLNOTIFICATIONS = 1518, VIRTUALKEYBOARDPRIVATE_OPENSUGGESTIONSETTINGS = 1519, - ACCESSIBILITY_PRIVATE_ENABLEPOINTSCAN = 1520, + ACCESSIBILITY_PRIVATE_ACTIVATEPOINTSCAN = 1520, AUTOTESTPRIVATE_ACTIVATEADJACENTDESKSTOTARGETINDEX = 1521, DECLARATIVENETREQUEST_GETAVAILABLESTATICRULECOUNT = 1522, CHROMEOSINFOPRIVATE_ISTABLETMODEENABLED = 1523,
diff --git a/extensions/common/extension.h b/extensions/common/extension.h index 39ad12a..986b76c 100644 --- a/extensions/common/extension.h +++ b/extensions/common/extension.h
@@ -377,8 +377,6 @@ bool LoadManifestVersion(base::string16* error); bool LoadShortName(base::string16* error); - bool CheckMinimumChromeVersion(base::string16* error) const; - // The extension's human-readable name. Name is used for display purpose. It // might be wrapped with unicode bidi control characters so that it is // displayed correctly in RTL context.
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index a22b7848..3f2a593 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -691,6 +691,10 @@ includable_only: true } builders { + name: "chromium/try/gpu-fyi-try-linux-amd-rel" + includable_only: true + } + builders { name: "chromium/try/gpu-fyi-try-linux-intel-dqp" includable_only: true } @@ -795,6 +799,10 @@ includable_only: true } builders { + name: "chromium/try/gpu-fyi-try-win10-amd-rel-64" + includable_only: true + } + builders { name: "chromium/try/gpu-fyi-try-win10-intel-dqp-64" includable_only: true }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 5ab1938..3de0132 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -5403,6 +5403,53 @@ } } builders { + name: "Linux FYI Release (AMD RX 5500 XT)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.gpu.fyi\",\"perf_dashboard_machine_group\":\"ChromiumGPUFYI\",\"recipe\":\"chromium\"}" + execution_timeout_secs: 21600 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 0 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { name: "Linux FYI Release (Intel HD 630)" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -10307,6 +10354,53 @@ } } builders { + name: "Win10 FYI x64 Release (AMD RX 5500 XT)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.gpu.fyi\",\"perf_dashboard_machine_group\":\"ChromiumGPUFYI\",\"recipe\":\"chromium\"}" + execution_timeout_secs: 21600 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 0 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { name: "Win10 FYI x64 Release (Intel HD 630)" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -24322,6 +24416,60 @@ } } builders { + name: "gpu-fyi-try-linux-amd-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.linux.amd.try" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}" + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "chromium.resultdb.result_sink" + value: 0 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { name: "gpu-fyi-try-linux-intel-dqp" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -25711,6 +25859,60 @@ } } builders { + name: "gpu-fyi-try-win10-amd-rel-64" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.gpu.win10.amd.try" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}" + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "chromium.resultdb.result_sink" + value: 0 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { name: "gpu-fyi-try-win10-intel-dqp-64" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index c1439e1..9ae68b6 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -6872,6 +6872,11 @@ builders { name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (AMD RX 550)" category: "Windows|10|x64|AMD" + short_name: "550" + } + builders { + name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release (AMD RX 5500 XT)" + category: "Windows|10|x64|AMD" short_name: "rel" } builders { @@ -7092,6 +7097,11 @@ builders { name: "buildbucket/luci.chromium.ci/Linux FYI Release (AMD R7 240)" category: "Linux|AMD" + short_name: "240" + } + builders { + name: "buildbucket/luci.chromium.ci/Linux FYI Release (AMD RX 5500 XT)" + category: "Linux|AMD" short_name: "rel" } builders { @@ -11291,6 +11301,9 @@ name: "buildbucket/luci.chromium.try/gpu-fyi-try-chromeos-kevin" } builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-amd-rel" + } + builders { name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-dqp" } builders { @@ -11369,6 +11382,9 @@ name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-rel" } builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-amd-rel-64" + } + builders { name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-intel-dqp-64" } builders { @@ -12295,6 +12311,9 @@ name: "buildbucket/luci.chromium.try/fuchsia_x64" } builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-amd-rel" + } + builders { name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-dqp" } builders { @@ -12688,6 +12707,9 @@ id: "tryserver.chromium.win" name: "tryserver.chromium.win" builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-amd-rel-64" + } + builders { name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-intel-dqp-64" } builders {
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index 0dc09e7..f58f934 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -1783,6 +1783,20 @@ } } job { + id: "Linux FYI Release (AMD RX 5500 XT)" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Linux FYI Release (AMD RX 5500 XT)" + } +} +job { id: "Linux FYI Release (Intel HD 630)" realm: "ci" acls { @@ -3763,6 +3777,20 @@ } } job { + id: "Win10 FYI x64 Release (AMD RX 5500 XT)" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Win10 FYI x64 Release (AMD RX 5500 XT)" + } +} +job { id: "Win10 FYI x64 Release (Intel HD 630)" realm: "ci" acls {
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index e6893a6..74a363ba 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -3577,6 +3577,15 @@ name = "Linux FYI Release (AMD R7 240)", console_view_entry = ci.console_view_entry( category = "Linux|AMD", + short_name = "240", + ), + triggered_by = ["GPU FYI Linux Builder"], +) + +ci.gpu_fyi_thin_tester( + name = "Linux FYI Release (AMD RX 5500 XT)", + console_view_entry = ci.console_view_entry( + category = "Linux|AMD", short_name = "rel", ), triggered_by = ["GPU FYI Linux Builder"], @@ -3809,6 +3818,15 @@ name = "Win10 FYI x64 Release (AMD RX 550)", console_view_entry = ci.console_view_entry( category = "Windows|10|x64|AMD", + short_name = "550", + ), + triggered_by = ["GPU FYI Win x64 Builder"], +) + +ci.gpu_fyi_thin_tester( + name = "Win10 FYI x64 Release (AMD RX 5500 XT)", + console_view_entry = ci.console_view_entry( + category = "Windows|10|x64|AMD", short_name = "rel", ), triggered_by = ["GPU FYI Win x64 Builder"],
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star index 475db2e..2605acb 100644 --- a/infra/config/subprojects/chromium/gpu.try.star +++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -161,6 +161,11 @@ ) gpu_linux_builder( + name = "gpu-fyi-try-linux-amd-rel", + pool = "luci.chromium.gpu.linux.amd.try", +) + +gpu_linux_builder( name = "gpu-fyi-try-linux-intel-dqp", pool = "luci.chromium.gpu.linux.intel.try", ) @@ -340,6 +345,11 @@ ) gpu_win_builder( + name = "gpu-fyi-try-win10-amd-rel-64", + pool = "luci.chromium.gpu.win10.amd.try", +) + +gpu_win_builder( name = "gpu-fyi-try-win10-intel-dqp-64", pool = "luci.chromium.gpu.win10.intel.try", )
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index e2e28c0..29fe6b24d 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -214,6 +214,9 @@ <message name="IDS_IOS_LOCATION_AUTHORIZATION_ALERT" desc="Specifies the reason for sending the user's location to Google [Length: unlimited] [iOS only]."> Get a better Google experience in Chromium based on your location. </message> + <message name="IDS_IOS_LOCATION_MODAL_DESCRIPTION" desc="The description of the location permissions modal [Length: unlimited] [iOS only]."> + When you allow use of your location, Chromium sends it to your default search engine and sites where you give permission. Sites usually use your location for local information, like news or nearby shops. + </message> <message name="IDS_IOS_LOCATION_WHEN_IN_USE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's location information while the app is in use [Length: unlimited] [iOS only]."> Get a better experience in Chromium based on your location. </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCATION_MODAL_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCATION_MODAL_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..fa445db --- /dev/null +++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_LOCATION_MODAL_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +5e76f676db2a77a2f1256f9273f2ba876bc5cd88 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd index 67609092..2f291ca 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -214,6 +214,9 @@ <message name="IDS_IOS_LOCATION_AUTHORIZATION_ALERT" desc="Specifies the reason for sending the user's location to Google [Length: unlimited] [iOS only]."> Get a better Google experience in Chrome based on your location. </message> + <message name="IDS_IOS_LOCATION_MODAL_DESCRIPTION" desc="The description of the location permissions modal [Length: unlimited] [iOS only]."> + When you allow use of your location, Chrome sends it to your default search engine and sites where you give permission. Sites usually use your location for local information, like news or nearby shops. + </message> <message name="IDS_IOS_LOCATION_WHEN_IN_USE_USAGE_DESCRIPTION" desc="Specifies the reason for accessing the user's location information while the app is in use [Length: unlimited] [iOS only]."> Get a better experience in Chrome based on your location. </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCATION_MODAL_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCATION_MODAL_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..fa445db --- /dev/null +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_LOCATION_MODAL_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +5e76f676db2a77a2f1256f9273f2ba876bc5cd88 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 6398bee..359a3a1 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1027,6 +1027,12 @@ <message name="IDS_IOS_KEYBOARD_PREVIOUS_TAB" desc="Title of the keyboard shortcut to switch to the previous tab in the tab strip. [Length: 20 em] [iOS only]"> Previous Tab </message> + <message name="IDS_IOS_LOCATION_MODAL_TITLE" desc="The title of the locaton permissions modal [Length: unlimited] [iOS only]."> + Use Your Current Location. + </message> + <message name="IDS_IOS_LOCATION_MODAL_PRIMARY_BUTTON" desc="The primary button of the locaton permissions modal [Length: unlimited] [iOS only]."> + Allow Location... + </message> <message name="IDS_IOS_LONG_PRESS_TOOLBAR_IPH_PROMOTION_TEXT" desc="Text for the LongPress Toolbar Tip in-product help promotion, explaining that the user can long press on the toolbar's button to display more options. [iOS only]"> Touch & hold for more tab options </message> @@ -1756,6 +1762,9 @@ <message name="IDS_IOS_CHANGE_COMPROMISED_PASSWORD" desc="Button which is shown on Password Details Screen when password is compromised. [iOS only]" meaning="Telling user to change password on a website since it is compromised."> Change Password on Website </message> + <message name="IDS_IOS_DELETE_PASSWORD_DESCRIPTION" desc="Message at the top of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website."> + Deleting this password will not delete your account on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>. + </message> <message name="IDS_IOS_DELETE_COMPROMISED_PASSWORD_DESCRIPTION" desc="Message on top of the confirmation alert when the user tapped delete password button. [iOS only]" meaning="Explaining to the user that deleting password locally won't delete account on a website."> Deleting this password will not delete your account on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph>. Change your password on <ph name="WEBSITE">$1<ex>twitter.com</ex></ph> to keep it safe from others. </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DELETE_PASSWORD_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DELETE_PASSWORD_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..6a2cbb9 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DELETE_PASSWORD_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +efd4a799fae3a970124d6d79a43a538de3b086ed \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCATION_MODAL_PRIMARY_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCATION_MODAL_PRIMARY_BUTTON.png.sha1 new file mode 100644 index 0000000..fa445db --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCATION_MODAL_PRIMARY_BUTTON.png.sha1
@@ -0,0 +1 @@ +5e76f676db2a77a2f1256f9273f2ba876bc5cd88 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCATION_MODAL_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCATION_MODAL_TITLE.png.sha1 new file mode 100644 index 0000000..fa445db --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_LOCATION_MODAL_TITLE.png.sha1
@@ -0,0 +1 @@ +5e76f676db2a77a2f1256f9273f2ba876bc5cd88 \ No newline at end of file
diff --git a/ios/chrome/browser/net/http_server_properties_factory.cc b/ios/chrome/browser/net/http_server_properties_factory.cc index 4b6d365..924383f 100644 --- a/ios/chrome/browser/net/http_server_properties_factory.cc +++ b/ios/chrome/browser/net/http_server_properties_factory.cc
@@ -29,17 +29,15 @@ } // PrefDelegate implementation. - const base::DictionaryValue* GetServerProperties() const override { + const base::Value* GetServerProperties() const override { const base::Value* value; - if (pref_store_->GetValue(path_, &value)) { - const base::DictionaryValue* dict; - if (value->GetAsDictionary(&dict)) - return dict; + if (pref_store_->GetValue(path_, &value) && value->is_dict()) { + return value; } return nullptr; } - void SetServerProperties(const base::DictionaryValue& value, + void SetServerProperties(const base::Value& value, base::OnceClosure callback) override { pref_store_->SetValue(path_, value.CreateDeepCopy(), WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index f48a73ea..8b094e7 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1891,11 +1891,15 @@ } - (void)installFakeStatusBar { - if (IsThumbStripEnabled()) { + if (IsThumbStripEnabled() && !ios::GetChromeBrowserProvider() + ->GetFullscreenProvider() + ->IsInitialized()) { // A fake status bar on the browser view is not necessary when the thumb // strip feature is enabled because the view behind the browser view already // has a dark background. Adding a fake status bar would block the // visibility of the thumb strip thumbnails when moving the browser view. + // However, if the Fullscreen Provider is used, then the web content extends + // up to behind the tab strip, making the fake status bar necessary. return; } CGRect statusBarFrame = CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 0); @@ -2234,16 +2238,21 @@ } } -// Set the frame for the various views. View must be loaded. -- (void)setUpViewLayout:(BOOL)initialLayout { - DCHECK([self isViewLoaded]); - +// Sets up the frame for the fake status bar. View must be loaded. +- (void)setupStatusBarLayout { CGFloat topInset = self.view.safeAreaInsets.top; // Update the fake toolbar background height. CGRect fakeStatusBarFrame = _fakeStatusBarView.frame; fakeStatusBarFrame.size.height = topInset; _fakeStatusBarView.frame = fakeStatusBarFrame; +} + +// Set the frame for the various views. View must be loaded. +- (void)setUpViewLayout:(BOOL)initialLayout { + DCHECK([self isViewLoaded]); + + [self setupStatusBarLayout]; if (initialLayout) { // Add the toolbars as child view controllers. @@ -2825,7 +2834,6 @@ _fullscreenDisabler = std::make_unique<ScopedFullscreenDisabler>( FullscreenController::FromBrowser(_browser)); } - // Hide the tab strip and take a snapshot of it. If a snapshot of a hidden // view is taken, the snapshot will be a blank view. However, if the view's // parent is hidden but the view itself is not, the snapshot will not be a @@ -2838,6 +2846,33 @@ 0, self.tabStripView.frame.size.height); self.tabStripView.hidden = YES; [self.contentArea addSubview:self.tabStripSnapshot]; + + // Remove the fake status bar to allow the thumb strip animations to appear. + [_fakeStatusBarView removeFromSuperview]; + + if (currentViewRevealState == ViewRevealState::Hidden) { + // When the Fullscreen Provider is used, the web content extends up to the + // top of the BVC view. It has a visible background and blocks the thumb + // strip. Thus, when the view revealing process starts, the web content + // frame must be moved down. To prevent the actual web content from jumping, + // the content offset must be moved up by a corresponding amount. + if (self.currentWebState && ![self isNTPActiveForCurrentWebState] && + ios::GetChromeBrowserProvider() + ->GetFullscreenProvider() + ->IsInitialized()) { + CGFloat toolbarHeight = [self expandedTopToolbarHeight]; + CGRect webStateViewFrame = UIEdgeInsetsInsetRect( + [self viewForWebState:self.currentWebState].frame, + UIEdgeInsetsMake(toolbarHeight, 0, 0, 0)); + [self viewForWebState:self.currentWebState].frame = webStateViewFrame; + + CRWWebViewScrollViewProxy* scrollProxy = + self.currentWebState->GetWebViewProxy().scrollViewProxy; + CGPoint scrollOffset = scrollProxy.contentOffset; + scrollOffset.y += toolbarHeight; + scrollProxy.contentOffset = scrollOffset; + } + } } - (void)animateViewReveal:(ViewRevealState)nextViewRevealState { @@ -2874,6 +2909,29 @@ if (viewRevealState == ViewRevealState::Hidden) { // Stop disabling fullscreen. _fullscreenDisabler.reset(); + + // Add the status bar back to cover the web content. + [self installFakeStatusBar]; + [self setupStatusBarLayout]; + + // See the comments in |-willAnimateViewReveal:| for the explantation of why + // this is necessary. + if (self.currentWebState && ![self isNTPActiveForCurrentWebState] && + ios::GetChromeBrowserProvider() + ->GetFullscreenProvider() + ->IsInitialized()) { + CGFloat toolbarHeight = [self expandedTopToolbarHeight]; + CGRect webStateViewFrame = UIEdgeInsetsInsetRect( + [self viewForWebState:self.currentWebState].frame, + UIEdgeInsetsMake(-toolbarHeight, 0, 0, 0)); + [self viewForWebState:self.currentWebState].frame = webStateViewFrame; + + CRWWebViewScrollViewProxy* scrollProxy = + self.currentWebState->GetWebViewProxy().scrollViewProxy; + CGPoint scrollOffset = scrollProxy.contentOffset; + scrollOffset.y -= toolbarHeight; + scrollProxy.contentOffset = scrollOffset; + } } }
diff --git a/ios/chrome/browser/ui/commands/application_commands.h b/ios/chrome/browser/ui/commands/application_commands.h index dd889d0..66a0fb3 100644 --- a/ios/chrome/browser/ui/commands/application_commands.h +++ b/ios/chrome/browser/ui/commands/application_commands.h
@@ -79,6 +79,9 @@ - (void)showAdvancedSigninSettingsFromViewController: (UIViewController*)baseViewController; +- (void)showLocationPermissionsFromViewController: + (UIViewController*)baseViewController; + // Presents the Trusted Vault reauth dialog. // |baseViewController| presents the sign-in. // |retrievalTrigger| UI elements where the trusted vault reauth has been
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn index 9282f15..2915ef10 100644 --- a/ios/chrome/browser/ui/first_run/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -7,6 +7,11 @@ sources = [ "first_run_util.h", "first_run_util.mm", + "location_permissions_commands.h", + "location_permissions_coordinator.h", + "location_permissions_coordinator.mm", + "location_permissions_view_controller.h", + "location_permissions_view_controller.mm", "orientation_limiting_navigation_controller.h", "orientation_limiting_navigation_controller.mm", "static_file_view_controller.h", @@ -20,6 +25,7 @@ ":constants", "resources:checkbox", "resources:checkbox_checked", + "resources:first_run_location_permissions", "//base", "//base:i18n", "//components/metrics", @@ -31,6 +37,7 @@ "//ios/chrome/browser/browser_state", "//ios/chrome/browser/crash_report", "//ios/chrome/browser/first_run", + "//ios/chrome/browser/geolocation:geolocation_internal", "//ios/chrome/browser/main", "//ios/chrome/browser/signin", "//ios/chrome/browser/ui:feature_flags", @@ -48,6 +55,7 @@ "//ios/chrome/browser/web_state_list", "//ios/chrome/common", "//ios/chrome/common/ui/colors", + "//ios/chrome/common/ui/confirmation_alert", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/signin", "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/first_run/location_permissions_commands.h b/ios/chrome/browser/ui/first_run/location_permissions_commands.h new file mode 100644 index 0000000..9136b82 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/location_permissions_commands.h
@@ -0,0 +1,16 @@ +// Copyright 2020 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 IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_COMMANDS_H_ +#define IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_COMMANDS_H_ + +// Command to signal to receiver to handle location permissions modal actions. +@protocol LocationPermissionsCommands <NSObject> + +// Command the modal to be hidden. +- (void)dismissLocationPermissionsExplanationModal; + +@end + +#endif // IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/first_run/location_permissions_coordinator.h b/ios/chrome/browser/ui/first_run/location_permissions_coordinator.h new file mode 100644 index 0000000..19c92825 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/location_permissions_coordinator.h
@@ -0,0 +1,18 @@ +// Copyright 2020 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 IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_COORDINATOR_H_ + +#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" + +#import "ios/chrome/browser/ui/first_run/location_permissions_commands.h" + +// Coordinator that manages a LocationPermissionsViewController. +@interface LocationPermissionsCoordinator : ChromeCoordinator +// Handler for all actions of this coordinator. +@property(nonatomic, weak) id<LocationPermissionsCommands> handler; +@end + +#endif // IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/first_run/location_permissions_coordinator.mm b/ios/chrome/browser/ui/first_run/location_permissions_coordinator.mm new file mode 100644 index 0000000..2afd99ab --- /dev/null +++ b/ios/chrome/browser/ui/first_run/location_permissions_coordinator.mm
@@ -0,0 +1,68 @@ +// Copyright 2020 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. + +#import "ios/chrome/browser/ui/first_run/location_permissions_coordinator.h" + +#import "ios/chrome/browser/geolocation/omnibox_geolocation_controller.h" +#import "ios/chrome/browser/ui/first_run/location_permissions_view_controller.h" +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@interface LocationPermissionsCoordinator () <ConfirmationAlertActionHandler> + +// The fullscreen confirmation modal promo view controller this coordiantor +// manages. +@property(nonatomic, strong) + LocationPermissionsViewController* locationPermissionsViewController; +@end + +@implementation LocationPermissionsCoordinator + +#pragma mark - Public Methods. + +- (void)start { + [super start]; + self.locationPermissionsViewController = + [[LocationPermissionsViewController alloc] init]; + self.locationPermissionsViewController.actionHandler = self; + self.locationPermissionsViewController.modalPresentationStyle = + UIModalPresentationFormSheet; + [self.baseViewController + presentViewController:self.locationPermissionsViewController + animated:YES + completion:nil]; +} + +- (void)stop { + [self.locationPermissionsViewController.presentingViewController + dismissViewControllerAnimated:YES + completion:nil]; + self.locationPermissionsViewController = nil; + [super stop]; +} + +#pragma mark - ConfirmationAlertActionHandler + +- (void)confirmationAlertPrimaryAction { + [self.handler dismissLocationPermissionsExplanationModal]; + [[OmniboxGeolocationController sharedInstance] + triggerSystemPromptForNewUser:YES]; +} + +- (void)confirmationAlertSecondaryAction { + [self.handler dismissLocationPermissionsExplanationModal]; +} + +- (void)confirmationAlertDismissAction { + // No-op. +} + +- (void)confirmationAlertLearnMoreAction { + // No-op. +} + +@end
diff --git a/ios/chrome/browser/ui/first_run/location_permissions_view_controller.h b/ios/chrome/browser/ui/first_run/location_permissions_view_controller.h new file mode 100644 index 0000000..b0a06430 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/location_permissions_view_controller.h
@@ -0,0 +1,15 @@ +// Copyright 2020 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 IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_VIEW_CONTROLLER_H_ + +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" + +// Presents a fullscreen modal that explains location data usage. Accepting the +// main action will trigger a native location permissions prompt. +@interface LocationPermissionsViewController : ConfirmationAlertViewController +@end + +#endif // IOS_CHROME_BROWSER_UI_FIRST_RUN_LOCATION_PERMISSIONS_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/first_run/location_permissions_view_controller.mm b/ios/chrome/browser/ui/first_run/location_permissions_view_controller.mm new file mode 100644 index 0000000..6e1b106 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/location_permissions_view_controller.mm
@@ -0,0 +1,41 @@ +// Copyright 2020 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. + +#import "ios/chrome/browser/ui/first_run/location_permissions_view_controller.h" + +#include "ios/chrome/grit/ios_google_chrome_strings.h" +#include "ios/chrome/grit/ios_strings.h" +#include "ui/base/l10n/l10n_util_mac.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation LocationPermissionsViewController + +#pragma mark - Public + +- (void)loadView { + self.image = [UIImage imageNamed:@"first_run_location_permissions"]; + self.customSpacingAfterImage = 30; + self.primaryActionAvailable = YES; + self.secondaryActionAvailable = YES; + self.showDismissBarButton = NO; + self.titleString = l10n_util::GetNSString(IDS_IOS_LOCATION_MODAL_TITLE); + self.subtitleString = + l10n_util::GetNSString(IDS_IOS_LOCATION_MODAL_DESCRIPTION); + self.primaryActionString = + l10n_util::GetNSString(IDS_IOS_LOCATION_MODAL_PRIMARY_BUTTON); + self.secondaryActionString = + l10n_util::GetNSString(IDS_IOS_DEFAULT_BROWSER_SECONDARY_BUTTON_TEXT); + self.dismissBarButtonSystemItem = UIBarButtonSystemItemCancel; +#if defined(__IPHONE_13_4) + if (@available(iOS 13.4, *)) { + self.pointerInteractionEnabled = YES; + } +#endif // defined(__IPHONE_13_4) + [super loadView]; +} + +@end
diff --git a/ios/chrome/browser/ui/first_run/resources/BUILD.gn b/ios/chrome/browser/ui/first_run/resources/BUILD.gn index 965ff8f..004e6f81 100644 --- a/ios/chrome/browser/ui/first_run/resources/BUILD.gn +++ b/ios/chrome/browser/ui/first_run/resources/BUILD.gn
@@ -25,3 +25,13 @@ "checkbox_checked.imageset/checkbox_checked~ipad.png", ] } + +imageset("first_run_location_permissions") { + sources = [ + "first_run_location_permissions.imageset/Contents.json", + "first_run_location_permissions.imageset/first_run_location_permissions_dark@2x.png", + "first_run_location_permissions.imageset/first_run_location_permissions_dark@3x.png", + "first_run_location_permissions.imageset/first_run_location_permissions_light@2x.png", + "first_run_location_permissions.imageset/first_run_location_permissions_light@3x.png", + ] +}
diff --git a/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/Contents.json b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/Contents.json new file mode 100644 index 0000000..2af7afa --- /dev/null +++ b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/Contents.json
@@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "first_run_location_permissions_light@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "first_run_location_permissions_dark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "first_run_location_permissions_light@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "first_run_location_permissions_dark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +}
diff --git a/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_dark@2x.png b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_dark@2x.png new file mode 100644 index 0000000..83593c5 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_dark@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_dark@3x.png b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_dark@3x.png new file mode 100644 index 0000000..ba0aa6c5 --- /dev/null +++ b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_dark@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_light@2x.png b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_light@2x.png new file mode 100644 index 0000000..d819c6b --- /dev/null +++ b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_light@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_light@3x.png b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_light@3x.png new file mode 100644 index 0000000..654c7ad --- /dev/null +++ b/ios/chrome/browser/ui/first_run/resources/first_run_location_permissions.imageset/first_run_location_permissions_light@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm index 8fe49fb..f200d26 100644 --- a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.mm
@@ -249,6 +249,11 @@ [self.dispatcher showAdvancedSigninSettingsFromViewController: presentingViewController]; + } else if (base::FeatureList::IsEnabled( + kLocationFirstRunModal)) { + [self.dispatcher + showLocationPermissionsFromViewController: + presentingViewController]; } }]; }
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn index 29003a5e..e778cfc 100644 --- a/ios/chrome/browser/ui/main/BUILD.gn +++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -85,6 +85,7 @@ "//ios/chrome/browser/crash_report/breadcrumbs", "//ios/chrome/browser/crash_report/breadcrumbs:feature_flags", "//ios/chrome/browser/first_run", + "//ios/chrome/browser/geolocation:geolocation_internal", "//ios/chrome/browser/main", "//ios/chrome/browser/ntp:features", "//ios/chrome/browser/screenshot",
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm index c476fbe..4cb0cda 100644 --- a/ios/chrome/browser/ui/main/scene_controller.mm +++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -38,6 +38,7 @@ #include "ios/chrome/browser/crash_report/crash_report_helper.h" #import "ios/chrome/browser/crash_report/crash_restore_helper.h" #import "ios/chrome/browser/first_run/first_run.h" +#import "ios/chrome/browser/geolocation/omnibox_geolocation_controller.h" #import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/main/browser_list.h" #import "ios/chrome/browser/main/browser_list_factory.h" @@ -59,6 +60,8 @@ #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/commands/show_signin_command.h" #import "ios/chrome/browser/ui/first_run/first_run_util.h" +#import "ios/chrome/browser/ui/first_run/location_permissions_commands.h" +#import "ios/chrome/browser/ui/first_run/location_permissions_coordinator.h" #import "ios/chrome/browser/ui/first_run/orientation_limiting_navigation_controller.h" #import "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h" #include "ios/chrome/browser/ui/history/history_coordinator.h" @@ -141,7 +144,8 @@ SettingsNavigationControllerDelegate, SceneURLLoadingServiceDelegate, TabGridCoordinatorDelegate, - WebStateListObserving> { + WebStateListObserving, + LocationPermissionsCommands> { std::unique_ptr<WebStateListObserverBridge> _webStateListForwardingObserver; } @@ -205,6 +209,9 @@ // time it is accessed. @property(nonatomic, strong) SigninCoordinator* signinCoordinator; +@property(nonatomic, strong) + LocationPermissionsCoordinator* locationPermissionsCoordinator; + // Additional product specific data used by UserFeedbackDataSource. // TODO(crbug.com/1117041): Move this into a UserFeedback config object. @property(nonatomic, strong) @@ -1078,7 +1085,25 @@ self.signinCoordinator = [SigninCoordinator advancedSettingsSigninCoordinatorWithBaseViewController:baseViewController browser:mainBrowser]; - [self startSigninCoordinatorWithCompletion:nil]; + [self startSigninCoordinatorWithCompletion:^(BOOL success) { + if (base::FeatureList::IsEnabled(kLocationFirstRunModal)) { + [self showLocationPermissionsFromViewController:baseViewController]; + } + }]; +} + +- (void)showLocationPermissionsFromViewController: + (UIViewController*)baseViewController { + self.locationPermissionsCoordinator = [[LocationPermissionsCoordinator alloc] + initWithBaseViewController:baseViewController + browser:self.mainInterface.browser]; + self.locationPermissionsCoordinator.handler = self; + [self.locationPermissionsCoordinator start]; +} + +- (void)dismissLocationPermissionsExplanationModal { + [self.locationPermissionsCoordinator stop]; + self.locationPermissionsCoordinator = nil; } - (void)
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm index 5889bc86..4b6ce5fb 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
@@ -12,6 +12,7 @@ #include "base/notreached.h" #include "base/strings/sys_string_conversions.h" #include "components/open_from_clipboard/clipboard_recent_content.h" +#include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/browser_commands.h" #import "ios/chrome/browser/ui/commands/find_in_page_commands.h" @@ -133,7 +134,9 @@ break; #endif // !defined(NDEBUG) case PopupMenuActionOpenNewWindow: - [self.dispatcher openNewWindowWithActivity:nil]; + [self.dispatcher openNewWindowWithActivity:ActivityToLoadURL( + WindowActivityToolsOrigin, + GURL(kChromeUINewTabURL))]; break; case PopupMenuActionBookmarks: RecordAction(UserMetricsAction("MobileMenuAllBookmarks"));
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm index bc93e0bc..d9570d6 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
@@ -148,13 +148,17 @@ [self.alertCoordinator start]; } -- (void)showPasswordDeleteDialogWithOrigin:(NSString*)origin { +- (void)showPasswordDeleteDialogWithOrigin:(NSString*)origin + compromisedPassword:(BOOL)compromisedPassword { NSString* message; - if (origin.length > 0) + if (origin.length > 0) { + int stringID = compromisedPassword + ? IDS_IOS_DELETE_COMPROMISED_PASSWORD_DESCRIPTION + : IDS_IOS_DELETE_PASSWORD_DESCRIPTION; message = - l10n_util::GetNSStringF(IDS_IOS_DELETE_COMPROMISED_PASSWORD_DESCRIPTION, - base::SysNSStringToUTF16(origin)); + l10n_util::GetNSStringF(stringID, base::SysNSStringToUTF16(origin)); + } self.actionSheetCoordinator = [[ActionSheetCoordinator alloc] initWithBaseViewController:self.viewController browser:self.browser @@ -168,9 +172,8 @@ [self.actionSheetCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_IOS_CONFIRM_PASSWORD_DELETION) action:^{ - [weakSelf - passwordDeletionConfirmedForCompromised:origin.length > - 0]; + [weakSelf passwordDeletionConfirmedForCompromised: + compromisedPassword]; } style:UIAlertActionStyleDestructive];
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_handler.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_handler.h index 8d77f21..4d10434f 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_handler.h +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_handler.h
@@ -17,8 +17,10 @@ // Called when the user wants to delete password. |origin| is a short website // version. It is displayed inside dialog. If |origin| is nil dialog is -// displayed without message. -- (void)showPasswordDeleteDialogWithOrigin:(NSString*)origin; +// displayed without message. |compromisedPassword| indicates whether password +// is compromised. +- (void)showPasswordDeleteDialogWithOrigin:(NSString*)origin + compromisedPassword:(BOOL)compromisedPassword; // Called when the user wants to save edited password. - (void)showPasswordEditDialogWithOrigin:(NSString*)origin;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm index 13cf024c..43c03e8 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
@@ -462,12 +462,15 @@ // Called when user tapped Delete button during editing. It means presented // password should be deleted. - (void)deleteItems:(NSArray<NSIndexPath*>*)indexPaths { - // Pass origin only if password is compromised as confirmation message makes + // Pass origin only if password is present as confirmation message makes // sense only in this case. - if (self.password.isCompromised) { - [self.handler showPasswordDeleteDialogWithOrigin:self.password.origin]; + if ([self.password.password length]) { + [self.handler + showPasswordDeleteDialogWithOrigin:self.password.origin + compromisedPassword:self.password.isCompromised]; } else { - [self.handler showPasswordDeleteDialogWithOrigin:nil]; + [self.handler showPasswordDeleteDialogWithOrigin:nil + compromisedPassword:NO]; } }
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm index f9badb4f..2b9acf4 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller_unittest.mm
@@ -50,6 +50,8 @@ @property(nonatomic, assign) BOOL deletionCalled; +@property(nonatomic, assign) BOOL deletionCalledOnCompromisedPassword; + @property(nonatomic, assign) BOOL editingCalled; @end @@ -62,8 +64,10 @@ - (void)showPasscodeDialog { } -- (void)showPasswordDeleteDialogWithOrigin:(NSString*)origin { +- (void)showPasswordDeleteDialogWithOrigin:(NSString*)origin + compromisedPassword:(BOOL)compromisedPassword { self.deletionCalled = YES; + self.deletionCalledOnCompromisedPassword = compromisedPassword; } - (void)showPasswordEditDialogWithOrigin:(NSString*)origin { @@ -336,6 +340,25 @@ from:nil forEvent:nil]; EXPECT_TRUE(handler().deletionCalled); + EXPECT_FALSE(handler().deletionCalledOnCompromisedPassword); +} + +// Tests compromised password deletion trigger showing password delete dialog. +TEST_F(PasswordDetailsTableViewControllerTest, TestCompromisedPasswordDelete) { + SetPassword(kExampleCom, kUsername, kPassword, true); + + EXPECT_FALSE(handler().deletionCalled); + PasswordDetailsTableViewController* passwordDetails = + base::mac::ObjCCastStrict<PasswordDetailsTableViewController>( + controller()); + [passwordDetails editButtonPressed]; + [[UIApplication sharedApplication] + sendAction:passwordDetails.deleteButton.action + to:passwordDetails.deleteButton.target + from:nil + forEvent:nil]; + EXPECT_TRUE(handler().deletionCalled); + EXPECT_TRUE(handler().deletionCalledOnCompromisedPassword); } // Tests password editing. User confirmed this action.
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm index c5b6797..8ed446e3 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -476,6 +476,8 @@ self.actionSheetCoordinator.alertStyle = UIAlertControllerStyleActionSheet; + __weak TabGridCoordinator* weakSelf = self; + [self.actionSheetCoordinator addItemWithTitle:base::SysUTF16ToNSString( l10n_util::GetPluralStringFUTF16( @@ -485,6 +487,7 @@ base::RecordAction(base::UserMetricsAction( "MobileTabGridCloseAllTabsConfirmationConfirmed")); [tabGridMediator closeAllItems]; + [weakSelf.baseViewController closeAllTabsConfirmationClosed]; } style:UIAlertActionStyleDestructive]; [self.actionSheetCoordinator @@ -492,6 +495,7 @@ action:^{ base::RecordAction(base::UserMetricsAction( "MobileTabGridCloseAllTabsConfirmationCanceled")); + [weakSelf.baseViewController closeAllTabsConfirmationClosed]; } style:UIAlertActionStyleCancel]; [self.actionSheetCoordinator start];
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h index 5d5b836..b2830c91 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.h
@@ -80,6 +80,10 @@ - (void)contentDidAppear; - (void)contentWillDisappearAnimated:(BOOL)animated; +// Notifies the ViewController that the Close All Tabs confirmation action sheet +// has been closed. +- (void)closeAllTabsConfirmationClosed; + @end #endif // IOS_CHROME_BROWSER_UI_TAB_GRID_TAB_GRID_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm index 8cd8f66..3a1e4657 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -401,6 +401,10 @@ self.remoteTabsViewController.preventUpdates = YES; } +- (void)closeAllTabsConfirmationClosed { + self.topToolbar.pageControl.userInteractionEnabled = YES; +} + #pragma mark - Public Properties - (id<GridConsumer>)regularTabsConsumer { @@ -1329,7 +1333,7 @@ // toolbar in order to avoid alignment issues when changing the device // orientation to landscape in multi window mode. UIBarButtonItem* buttonAnchor = self.topToolbar.leadingButton; - + self.topToolbar.pageControl.userInteractionEnabled = NO; switch (self.currentPage) { case TabGridPageIncognitoTabs: [self.incognitoTabsDelegate
diff --git a/ios/chrome/browser/ui/tabs/BUILD.gn b/ios/chrome/browser/ui/tabs/BUILD.gn index 2bc2206..946bcb8 100644 --- a/ios/chrome/browser/ui/tabs/BUILD.gn +++ b/ios/chrome/browser/ui/tabs/BUILD.gn
@@ -68,6 +68,8 @@ "//ios/chrome/common/ui/elements", "//ios/chrome/common/ui/resources:default_world_favicon", "//ios/chrome/common/ui/util", + "//ios/public/provider/chrome/browser", + "//ios/public/provider/chrome/browser/ui", "//ios/third_party/material_components_ios", "//ios/web", "//ui/base",
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm index 23998b1..c930afe 100644 --- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm +++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
@@ -58,6 +58,8 @@ #include "ios/chrome/browser/web_state_list/web_state_opener.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/grit/ios_strings.h" +#include "ios/public/provider/chrome/browser/chrome_browser_provider.h" +#import "ios/public/provider/chrome/browser/ui/fullscreen_provider.h" #import "ios/web/public/navigation/navigation_manager.h" #import "ios/web/public/web_state.h" #import "ios/web/public/web_state_observer_bridge.h" @@ -120,7 +122,14 @@ if (base::FeatureList::IsEnabled(kExpandedTabStrip)) { // The background needs to be clear to allow the thumb strip to be seen // from behind the tab strip during the enter/exit thumb strip animation. - return UIColor.clearColor; + // However, when using the fullscreen provider, the WKWebView extends behind + // the tab strip. In this case, a clear background would lead to seeing the + // WKWebView instead of the thumb strip. + return ios::GetChromeBrowserProvider() + ->GetFullscreenProvider() + ->IsInitialized() + ? UIColor.blackColor + : UIColor.clearColor; } return UIColor.blackColor; } @@ -171,6 +180,7 @@ CRWWebStateObserver, TabStripViewLayoutDelegate, TabViewDelegate, + ViewRevealingAnimatee, WebStateListObserving, WebStateFaviconDriverObserver, UIGestureRecognizerDelegate, @@ -567,6 +577,8 @@ - (void)setPanGestureHandler: (ViewRevealingVerticalPanHandler*)panGestureHandler { _panGestureHandler = panGestureHandler; + [self.panGestureHandler addAnimatee:self]; + [self.view removeGestureRecognizer:self.panGestureRecognizer]; UIPanGestureRecognizer* panGestureRecognizer = [[UIPanGestureRecognizer alloc] @@ -1802,4 +1814,26 @@ self.useTabStacking = [self shouldUseTabStacking]; } +#pragma mark - ViewRevealingAnimatee +- (void)willAnimateViewReveal:(ViewRevealState)currentViewRevealState { + // Specifically when using the FullscreenProvider, the background of the view + // is non-clear to cover the WKWebView. In this case, make the tab strip + // background clear as soon as view revealing begins so any animations that + // should be visible behind the tab strip are visible. See the comment on + // |BackgroundColor()| for more details. + self.view.backgroundColor = UIColor.clearColor; +} + +- (void)animateViewReveal:(ViewRevealState)nextViewRevealState { + // No-op. +} + +- (void)didAnimateViewReveal:(ViewRevealState)viewRevealState { + if (viewRevealState == ViewRevealState::Hidden) { + // Reset the background color to cover up the WKWebView if it is behind + // the tab strip. + self.view.backgroundColor = BackgroundColor(); + } +} + @end
diff --git a/ios/chrome/browser/ui/thumb_strip/BUILD.gn b/ios/chrome/browser/ui/thumb_strip/BUILD.gn index 5da5ea03..9357d34b 100644 --- a/ios/chrome/browser/ui/thumb_strip/BUILD.gn +++ b/ios/chrome/browser/ui/thumb_strip/BUILD.gn
@@ -31,3 +31,26 @@ ] configs += [ "//build/config/compiler:enable_arc" ] } + +source_set("eg2_tests") { + defines = [ "CHROME_EARL_GREY_2" ] + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ "thumb_strip_egtest.mm" ] + deps = [ + ":feature_flags", + "//base", + "//base/test:test_support", + "//ios/chrome/browser/ui:feature_flags", + "//ios/chrome/test:eg_test_support+eg2", + "//ios/chrome/test/earl_grey:eg_test_support+eg2", + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ios/third_party/earl_grey2:test_lib", + "//net:test_support", + "//url", + ] + frameworks = [ "UIKit.framework" ] +}
diff --git a/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm b/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm new file mode 100644 index 0000000..6b58433 --- /dev/null +++ b/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm
@@ -0,0 +1,104 @@ +// Copyright 2020 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 "base/ios/ios_util.h" +#import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/ui/thumb_strip/thumb_strip_feature.h" +#import "ios/chrome/browser/ui/ui_feature_flags.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" +#import "ios/chrome/test/earl_grey/chrome_matchers.h" +#import "ios/chrome/test/earl_grey/chrome_test_case.h" +#import "ios/testing/earl_grey/app_launch_configuration.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#include "net/test/embedded_test_server/http_request.h" +#include "net/test/embedded_test_server/http_response.h" +#include "net/test/embedded_test_server/request_handler_util.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using base::test::ios::kWaitForPageLoadTimeout; +using base::test::ios::kWaitForJSCompletionTimeout; +using base::test::ios::WaitUntilConditionOrTimeout; + +using chrome_test_util::PrimaryToolbar; + +namespace { + +// net::EmbeddedTestServer handler that responds with the request's query as the +// title and body. +std::unique_ptr<net::test_server::HttpResponse> HandleQueryTitle( + const net::test_server::HttpRequest& request) { + std::unique_ptr<net::test_server::BasicHttpResponse> http_response( + new net::test_server::BasicHttpResponse); + http_response->set_content_type("text/html"); + http_response->set_content("<html><head><title>" + request.GetURL().query() + + "</title></head><body>" + + request.GetURL().query() + "</body></html>"); + return std::move(http_response); +} + +} // namespace + +// Thumb Strip tests for Chrome. +@interface ThumbStripTestCase : ChromeTestCase +@end + +@implementation ThumbStripTestCase + +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + // Enabling this feature causes all tests to fail as part of setup. + // See crbug.com/1143299. + if (base::ios::IsRunningOnIOS13OrLater()) { + config.features_enabled.push_back(kExpandedTabStrip); + } + return config; +} + +// Sets up the EmbeddedTestServer as needed for tests. +- (void)setUpTestServer { + self.testServer->RegisterDefaultHandler( + base::Bind(net::test_server::HandlePrefixedRequest, "/querytitle", + base::Bind(&HandleQueryTitle))); + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start"); +} + +// Tests that the entire thumb strip is visible in peeked state. Specifically, +// this tests that the thumb strip is not partially covered when using the +// FullscreenProvider. +- (void)testThumbStripVisibleInPeekedState { + // The feature only works on iPad. + if (![ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_SKIPPED(@"Thumb strip is not enabled on iPhone"); + } + + // See crbug.com/1143299. + if (!base::ios::IsRunningOnIOS13OrLater()) { + EARL_GREY_TEST_DISABLED(@"Fails on iOS 12 devices."); + } + + [self setUpTestServer]; + + const GURL URL = self.testServer->GetURL("/querytitle?Hello"); + + [ChromeEarlGrey loadURL:URL]; + [ChromeEarlGrey waitForWebStateContainingText:"Hello"]; + + // Swipe down to reveal the thumb strip. + [[EarlGrey selectElementWithMatcher:PrimaryToolbar()] + performAction:grey_swipeSlowInDirection(kGREYDirectionDown)]; + + // Make sure that the entire tab thumbnail is fully visible and not covered. + // This acts as a good proxy to the entire thumbstrip being visible. + [[EarlGrey + selectElementWithMatcher:grey_allOf(grey_accessibilityLabel(@"Hello"), + grey_kindOfClassName(@"GridCell"), + grey_minimumVisiblePercent(1), nil)] + assertWithMatcher:grey_notNil()]; +} + +@end
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn index bf372be..306b375 100644 --- a/ios/chrome/test/earl_grey2/BUILD.gn +++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -170,6 +170,7 @@ "//ios/chrome/browser/ui/side_swipe:eg2_tests", "//ios/chrome/browser/ui/tab_grid:eg2_tests", "//ios/chrome/browser/ui/tabs:eg2_tests", + "//ios/chrome/browser/ui/thumb_strip:eg2_tests", "//ios/chrome/browser/ui/toolbar:eg2_tests", "//ios/chrome/browser/ui/webui:eg2_tests", "//ios/chrome/browser/ui/webui/interstitials:eg2_tests",
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc index f1f45c9..dba9cf3 100644 --- a/media/filters/decoder_stream.cc +++ b/media/filters/decoder_stream.cc
@@ -581,27 +581,23 @@ return; default: - // TODO(liberato): Use |status| better, since it might not be a generic - // error anymore. if (!decoder_produced_a_frame_ && base::FeatureList::IsEnabled(kFallbackAfterDecodeError)) { - pending_decode_requests_ = 0; + MEDIA_LOG(WARNING, media_log_) + << GetStreamTypeString() + << " decoder fallback after initial decode error."; // Prevent all pending decode requests and outputs from those requests // from being called back. fallback_weak_factory_.InvalidateWeakPtrs(); - - std::string fallback_message = - GetStreamTypeString() + - " fallback to new decoder after initial decode error."; - FUNCTION_DVLOG(1) << ": " << fallback_message; - MEDIA_LOG(WARNING, media_log_) << fallback_message; + pending_decode_requests_ = 0; state_ = STATE_REINITIALIZING_DECODER; SelectDecoder(); } else { - std::string error_message = GetStreamTypeString() + " decode error!"; - FUNCTION_DVLOG(1) << ": " << error_message; - MEDIA_LOG(ERROR, media_log_) << error_message; + media_log_->NotifyError(std::move(status)); + MEDIA_LOG(ERROR, media_log_) + << GetStreamTypeString() << " decode error!"; + state_ = STATE_ERROR; ClearOutputs(); if (read_cb_)
diff --git a/media/gpu/chromeos/image_processor.cc b/media/gpu/chromeos/image_processor.cc index c3227c88..5a621f2 100644 --- a/media/gpu/chromeos/image_processor.cc +++ b/media/gpu/chromeos/image_processor.cc
@@ -21,12 +21,6 @@ namespace { -std::ostream& operator<<(std::ostream& ostream, - const VideoFrame::StorageType& storage_type) { - ostream << VideoFrame::StorageTypeToString(storage_type); - return ostream; -} - // Verify if the format of |frame| matches |config|. bool CheckVideoFrameFormat(const ImageProcessor::PortConfig& config, const VideoFrame& frame) { @@ -45,12 +39,6 @@ return false; } - if (frame.storage_type() != config.storage_type()) { - VLOGF(1) << "Invalid frame.storage_type=" << frame.storage_type() - << ", input_storage_type=" << config.storage_type(); - return false; - } - return true; }
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc index f765bea63..ba3e756 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -207,7 +207,7 @@ // V4L2VEA doesn't support temporal layers but we let it pass here to support // simulcast. if (config.HasSpatialLayer()) { - VLOGF(1) << "Spatial layer encoding is supported"; + VLOGF(1) << "Spatial layer encoding is not yet supported"; return false; }
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index 9388b57..5f4ec62 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -271,7 +271,7 @@ // VaapiVEA supports temporal layers for VP9 only, but we also allow VP8 to // support VP8 simulcast. if (config.HasSpatialLayer()) { - VLOGF(1) << "Spatial layer encoding is supported"; + VLOGF(1) << "Spatial layer encoding is not yet supported"; return false; }
diff --git a/net/base/network_change_notifier_mac.mm b/net/base/network_change_notifier_mac.mm index 80d21a4c..7317270 100644 --- a/net/base/network_change_notifier_mac.mm +++ b/net/base/network_change_notifier_mac.mm
@@ -113,6 +113,10 @@ CTRadioAccessTechnologyeHRPD, nil]; NSSet<NSString*>* technologies_4g = [NSSet setWithObjects:CTRadioAccessTechnologyLTE, nil]; + // TODO: Use constants from CoreTelephony once Cronet builds with XCode 12.1 + NSSet<NSString*>* technologies_5g = + [NSSet setWithObjects:@"CTRadioAccessTechnologyNRNSA", + @"CTRadioAccessTechnologyNR", nil]; int best_network = 0; for (NSString* service in service_current_radio_access_technology) { if (!service_current_radio_access_technology[service]) { @@ -128,6 +132,8 @@ current_network = 3; } else if ([technologies_4g containsObject:network_type]) { current_network = 4; + } else if ([technologies_5g containsObject:network_type]) { + current_network = 5; } else { // New technology? NOTREACHED(); @@ -145,6 +151,8 @@ return CONNECTION_3G; case 4: return CONNECTION_4G; + case 5: + return CONNECTION_5G; default: // Default to CONNECTION_3G to not change existing behavior. return CONNECTION_3G;
diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc index b04ab19..eb318f09 100644 --- a/net/http/bidirectional_stream.cc +++ b/net/http/bidirectional_stream.cc
@@ -39,23 +39,23 @@ base::Value NetLogHeadersParams(const spdy::Http2HeaderBlock* headers, NetLogCaptureMode capture_mode) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); dict.SetKey("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode)); - return std::move(dict); + return dict; } base::Value NetLogParams(const GURL& url, const std::string& method, const HttpRequestHeaders* headers, NetLogCaptureMode capture_mode) { - base::DictionaryValue dict; - dict.SetString("url", url.possibly_invalid_spec()); - dict.SetString("method", method); + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetStringKey("url", url.possibly_invalid_spec()); + dict.SetStringKey("method", method); std::string empty; base::Value headers_param(headers->NetLogParams(empty, capture_mode)); dict.SetKey("headers", std::move(headers_param)); - return std::move(dict); + return dict; } } // namespace
diff --git a/net/http/http_auth_handler_negotiate.cc b/net/http/http_auth_handler_negotiate.cc index 281e62f6..e5383c81 100644 --- a/net/http/http_auth_handler_negotiate.cc +++ b/net/http/http_auth_handler_negotiate.cc
@@ -36,14 +36,13 @@ base::Value NetLogParameterChannelBindings( const std::string& channel_binding_token, NetLogCaptureMode capture_mode) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); if (!NetLogCaptureIncludesSocketBytes(capture_mode)) - return std::move(dict); + return dict; - dict.Clear(); - dict.SetString("token", base::HexEncode(channel_binding_token.data(), - channel_binding_token.size())); - return std::move(dict); + dict.SetStringKey("token", base::HexEncode(channel_binding_token.data(), + channel_binding_token.size())); + return dict; } // Uses |negotiate_auth_system_factory| to create the auth system, otherwise
diff --git a/net/http/http_cache_lookup_manager.cc b/net/http/http_cache_lookup_manager.cc index 1e71a417..b3774cd 100644 --- a/net/http/http_cache_lookup_manager.cc +++ b/net/http/http_cache_lookup_manager.cc
@@ -17,10 +17,10 @@ base::Value NetLogPushLookupTransactionParams( const NetLogSource& net_log, const ServerPushDelegate::ServerPushHelper* push_helper) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); net_log.AddToEventParameters(&dict); - dict.SetString("push_url", push_helper->GetURL().possibly_invalid_spec()); - return std::move(dict); + dict.SetStringKey("push_url", push_helper->GetURL().possibly_invalid_spec()); + return dict; } HttpCacheLookupManager::LookupTransaction::LookupTransaction(
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 07020cc..6dd71b0 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc
@@ -258,76 +258,77 @@ return spdy_session_pool_.SpdySessionPoolInfoToValue(); } -std::unique_ptr<base::Value> HttpNetworkSession::QuicInfoToValue() const { - std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->Set("sessions", quic_stream_factory_.QuicStreamFactoryInfoToValue()); - dict->SetBoolean("quic_enabled", IsQuicEnabled()); +base::Value HttpNetworkSession::QuicInfoToValue() const { + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetKey("sessions", + base::Value::FromUniquePtrValue( + quic_stream_factory_.QuicStreamFactoryInfoToValue())); + dict.SetBoolKey("quic_enabled", IsQuicEnabled()); const QuicParams* quic_params = context_.quic_context->params(); - auto connection_options(std::make_unique<base::ListValue>()); + base::Value connection_options(base::Value::Type::LIST); for (const auto& option : quic_params->connection_options) - connection_options->AppendString(quic::QuicTagToString(option)); - dict->Set("connection_options", std::move(connection_options)); + connection_options.Append(quic::QuicTagToString(option)); + dict.SetKey("connection_options", std::move(connection_options)); - auto supported_versions(std::make_unique<base::ListValue>()); + base::Value supported_versions(base::Value::Type::LIST); for (const auto& version : quic_params->supported_versions) - supported_versions->AppendString(ParsedQuicVersionToString(version)); - dict->Set("supported_versions", std::move(supported_versions)); + supported_versions.Append(ParsedQuicVersionToString(version)); + dict.SetKey("supported_versions", std::move(supported_versions)); - auto origins_to_force_quic_on(std::make_unique<base::ListValue>()); + base::Value origins_to_force_quic_on(base::Value::Type::LIST); for (const auto& origin : quic_params->origins_to_force_quic_on) - origins_to_force_quic_on->AppendString(origin.ToString()); - dict->Set("origins_to_force_quic_on", std::move(origins_to_force_quic_on)); + origins_to_force_quic_on.Append(origin.ToString()); + dict.SetKey("origins_to_force_quic_on", std::move(origins_to_force_quic_on)); - dict->SetInteger("max_packet_length", quic_params->max_packet_length); - dict->SetInteger("max_server_configs_stored_in_properties", - quic_params->max_server_configs_stored_in_properties); - dict->SetInteger("idle_connection_timeout_seconds", - quic_params->idle_connection_timeout.InSeconds()); - dict->SetInteger("reduced_ping_timeout_seconds", - quic_params->reduced_ping_timeout.InSeconds()); - dict->SetBoolean("retry_without_alt_svc_on_quic_errors", - quic_params->retry_without_alt_svc_on_quic_errors); - dict->SetBoolean("disable_bidirectional_streams", - quic_params->disable_bidirectional_streams); - dict->SetBoolean("close_sessions_on_ip_change", - quic_params->close_sessions_on_ip_change); - dict->SetBoolean("goaway_sessions_on_ip_change", - quic_params->goaway_sessions_on_ip_change); - dict->SetBoolean("migrate_sessions_on_network_change_v2", - quic_params->migrate_sessions_on_network_change_v2); - dict->SetBoolean("migrate_sessions_early_v2", - quic_params->migrate_sessions_early_v2); - dict->SetInteger( - "retransmittable_on_wire_timeout_milliseconds", - quic_params->retransmittable_on_wire_timeout.InMilliseconds()); - dict->SetBoolean("retry_on_alternate_network_before_handshake", - quic_params->retry_on_alternate_network_before_handshake); - dict->SetBoolean("migrate_idle_sessions", quic_params->migrate_idle_sessions); - dict->SetInteger("idle_session_migration_period_seconds", - quic_params->idle_session_migration_period.InSeconds()); - dict->SetInteger("max_time_on_non_default_network_seconds", - quic_params->max_time_on_non_default_network.InSeconds()); - dict->SetInteger( + dict.SetIntKey("max_packet_length", quic_params->max_packet_length); + dict.SetIntKey("max_server_configs_stored_in_properties", + quic_params->max_server_configs_stored_in_properties); + dict.SetIntKey("idle_connection_timeout_seconds", + quic_params->idle_connection_timeout.InSeconds()); + dict.SetIntKey("reduced_ping_timeout_seconds", + quic_params->reduced_ping_timeout.InSeconds()); + dict.SetBoolKey("retry_without_alt_svc_on_quic_errors", + quic_params->retry_without_alt_svc_on_quic_errors); + dict.SetBoolKey("disable_bidirectional_streams", + quic_params->disable_bidirectional_streams); + dict.SetBoolKey("close_sessions_on_ip_change", + quic_params->close_sessions_on_ip_change); + dict.SetBoolKey("goaway_sessions_on_ip_change", + quic_params->goaway_sessions_on_ip_change); + dict.SetBoolKey("migrate_sessions_on_network_change_v2", + quic_params->migrate_sessions_on_network_change_v2); + dict.SetBoolKey("migrate_sessions_early_v2", + quic_params->migrate_sessions_early_v2); + dict.SetIntKey("retransmittable_on_wire_timeout_milliseconds", + quic_params->retransmittable_on_wire_timeout.InMilliseconds()); + dict.SetBoolKey("retry_on_alternate_network_before_handshake", + quic_params->retry_on_alternate_network_before_handshake); + dict.SetBoolKey("migrate_idle_sessions", quic_params->migrate_idle_sessions); + dict.SetIntKey("idle_session_migration_period_seconds", + quic_params->idle_session_migration_period.InSeconds()); + dict.SetIntKey("max_time_on_non_default_network_seconds", + quic_params->max_time_on_non_default_network.InSeconds()); + dict.SetIntKey( "max_num_migrations_to_non_default_network_on_write_error", quic_params->max_migrations_to_non_default_network_on_write_error); - dict->SetInteger( + dict.SetIntKey( "max_num_migrations_to_non_default_network_on_path_degrading", quic_params->max_migrations_to_non_default_network_on_path_degrading); - dict->SetBoolean("allow_server_migration", - quic_params->allow_server_migration); - dict->SetBoolean("race_stale_dns_on_connection", - quic_params->race_stale_dns_on_connection); - dict->SetBoolean("go_away_on_path_degrading", - quic_params->go_away_on_path_degrading); - dict->SetBoolean("estimate_initial_rtt", quic_params->estimate_initial_rtt); - dict->SetBoolean("server_push_cancellation", - params_.enable_server_push_cancellation); - dict->SetInteger("initial_rtt_for_handshake_milliseconds", - quic_params->initial_rtt_for_handshake.InMilliseconds()); + dict.SetBoolKey("allow_server_migration", + quic_params->allow_server_migration); + dict.SetBoolKey("race_stale_dns_on_connection", + quic_params->race_stale_dns_on_connection); + dict.SetBoolKey("go_away_on_path_degrading", + quic_params->go_away_on_path_degrading); + dict.SetBoolKey("estimate_initial_rtt", quic_params->estimate_initial_rtt); + dict.SetBoolKey("server_push_cancellation", + params_.enable_server_push_cancellation); + dict.SetIntKey("initial_rtt_for_handshake_milliseconds", + quic_params->initial_rtt_for_handshake.InMilliseconds()); - return std::move(dict); + return dict; } void HttpNetworkSession::CloseAllConnections(int net_error, @@ -343,7 +344,7 @@ void HttpNetworkSession::CloseIdleConnections(const char* net_log_reason_utf8) { normal_socket_pool_manager_->CloseIdleSockets(net_log_reason_utf8); websocket_socket_pool_manager_->CloseIdleSockets(net_log_reason_utf8); - spdy_session_pool_.CloseCurrentIdleSessions(); + spdy_session_pool_.CloseCurrentIdleSessions(net_log_reason_utf8); } void HttpNetworkSession::SetServerPushDelegate(
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index c823c73c..a57b489 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h
@@ -248,7 +248,7 @@ // Creates a Value summary of the state of the QUIC sessions and // configuration. - std::unique_ptr<base::Value> QuicInfoToValue() const; + base::Value QuicInfoToValue() const; void CloseAllConnections(int net_error, const char* net_log_reason_utf8); void CloseIdleConnections(const char* net_log_reason_utf8);
diff --git a/net/http/http_request_headers.cc b/net/http/http_request_headers.cc index 81e8ca2..84ea9ac 100644 --- a/net/http/http_request_headers.cc +++ b/net/http/http_request_headers.cc
@@ -197,17 +197,17 @@ base::Value HttpRequestHeaders::NetLogParams( const std::string& request_line, NetLogCaptureMode capture_mode) const { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); dict.SetKey("line", NetLogStringValue(request_line)); - auto headers = std::make_unique<base::ListValue>(); - for (auto it = headers_.begin(); it != headers_.end(); ++it) { + base::Value headers(base::Value::Type::LIST); + for (const auto& header : headers_) { std::string log_value = - ElideHeaderValueForNetLog(capture_mode, it->key, it->value); - headers->Append( - NetLogStringValue(base::StrCat({it->key, ": ", log_value}))); + ElideHeaderValueForNetLog(capture_mode, header.key, header.value); + headers.Append( + NetLogStringValue(base::StrCat({header.key, ": ", log_value}))); } - dict.Set("headers", std::move(headers)); - return std::move(dict); + dict.SetKey("headers", std::move(headers)); + return dict; } HttpRequestHeaders::HeaderVector::iterator HttpRequestHeaders::FindHeader(
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc index 4c14292..8daf586 100644 --- a/net/http/http_response_headers.cc +++ b/net/http/http_response_headers.cc
@@ -1333,8 +1333,8 @@ base::Value HttpResponseHeaders::NetLogParams( NetLogCaptureMode capture_mode) const { - base::DictionaryValue dict; - base::ListValue headers; + base::Value dict(base::Value::Type::DICTIONARY); + base::Value headers(base::Value::Type::LIST); headers.Append(NetLogStringValue(GetStatusLine())); size_t iterator = 0; std::string name; @@ -1345,7 +1345,7 @@ headers.Append(NetLogStringValue(base::StrCat({name, ": ", log_value}))); } dict.SetKey("headers", std::move(headers)); - return std::move(dict); + return dict; } bool HttpResponseHeaders::IsChunkEncoded() const {
diff --git a/net/http/http_server_properties.cc b/net/http/http_server_properties.cc index 38728fd..7f67a27 100644 --- a/net/http/http_server_properties.cc +++ b/net/http/http_server_properties.cc
@@ -375,16 +375,14 @@ MaybeQueueWriteProperties(); } -std::unique_ptr<base::Value> -HttpServerProperties::GetAlternativeServiceInfoAsValue() const { +base::Value HttpServerProperties::GetAlternativeServiceInfoAsValue() const { const base::Time now = clock_->Now(); const base::TimeTicks now_ticks = tick_clock_->NowTicks(); - std::unique_ptr<base::ListValue> dict_list(new base::ListValue); + base::Value dict_list(base::Value::Type::LIST); for (const auto& server_info : server_info_map_) { if (!server_info.second.alternative_services.has_value()) continue; - std::unique_ptr<base::ListValue> alternative_service_list( - new base::ListValue); + base::Value alternative_service_list(base::Value::Type::LIST); const ServerInfoMapKey& key = server_info.first; for (const AlternativeServiceInfo& alternative_service_info : server_info.second.alternative_services.value()) { @@ -415,19 +413,18 @@ ")"; alternative_service_string.append(broken_info_string); } - alternative_service_list->AppendString(alternative_service_string); + alternative_service_list.Append(std::move(alternative_service_string)); } - if (alternative_service_list->empty()) + if (alternative_service_list.GetList().empty()) continue; - std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); - dict->SetString("server", key.server.Serialize()); - dict->SetString("network_isolation_key", - key.network_isolation_key.ToDebugString()); - dict->Set("alternative_service", std::unique_ptr<base::Value>( - std::move(alternative_service_list))); - dict_list->Append(std::move(dict)); + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetStringKey("server", key.server.Serialize()); + dict.SetStringKey("network_isolation_key", + key.network_isolation_key.ToDebugString()); + dict.SetKey("alternative_service", std::move(alternative_service_list)); + dict_list.Append(std::move(dict)); } - return std::move(dict_list); + return dict_list; } bool HttpServerProperties::WasLastLocalAddressWhenQuicWorked(
diff --git a/net/http/http_server_properties.h b/net/http/http_server_properties.h index 6c71351..bab8f59 100644 --- a/net/http/http_server_properties.h +++ b/net/http/http_server_properties.h
@@ -111,12 +111,12 @@ // Returns the branch of the preferences system for the server properties. // Returns nullptr if the pref system has no data for the server properties. - virtual const base::DictionaryValue* GetServerProperties() const = 0; + virtual const base::Value* GetServerProperties() const = 0; // Sets the server properties to the given value. If |callback| is // non-empty, flushes data to persistent storage and invokes |callback| // asynchronously when complete. - virtual void SetServerProperties(const base::DictionaryValue& value, + virtual void SetServerProperties(const base::Value& value, base::OnceClosure callback) = 0; // Starts listening for prefs to be loaded. If prefs are already loaded, @@ -362,7 +362,7 @@ // Returns all alternative service mappings as human readable strings. // Empty alternative service hostnames will be printed as such. - std::unique_ptr<base::Value> GetAlternativeServiceInfoAsValue() const; + base::Value GetAlternativeServiceInfoAsValue() const; // Tracks the last local address when QUIC was known to work. The address // cannot be set to an empty address - use
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc index 00fb6ee..41632986 100644 --- a/net/http/http_server_properties_manager.cc +++ b/net/http/http_server_properties_manager.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" +#include "base/optional.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/time/tick_clock.h" @@ -105,20 +106,22 @@ void AddAlternativeServiceFieldsToDictionaryValue( const AlternativeService& alternative_service, - base::DictionaryValue* dict) { - dict->SetInteger(kPortKey, alternative_service.port); + base::Value* dict) { + DCHECK(dict->is_dict()); + dict->SetIntKey(kPortKey, alternative_service.port); if (!alternative_service.host.empty()) { - dict->SetString(kHostKey, alternative_service.host); + dict->SetStringKey(kHostKey, alternative_service.host); } - dict->SetString(kProtocolKey, - NextProtoToString(alternative_service.protocol)); + dict->SetStringKey(kProtocolKey, + NextProtoToString(alternative_service.protocol)); } // Fails in the case of NetworkIsolationKeys that can't be persisted to disk, // like unique origins. bool TryAddBrokenAlternativeServiceFieldsToDictionaryValue( const BrokenAlternativeService& broken_alt_service, - base::DictionaryValue* dict) { + base::Value* dict) { + DCHECK(dict->is_dict()); base::Value network_isolation_key_value; if (!broken_alt_service.network_isolation_key.ToValue( &network_isolation_key_value)) { @@ -226,24 +229,23 @@ net_log_.EndEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_INITIALIZATION); - const base::DictionaryValue* http_server_properties_dict = + const base::Value* http_server_properties_dict = pref_delegate_->GetServerProperties(); // If there are no preferences set, do nothing. - if (!http_server_properties_dict) + if (!http_server_properties_dict || !http_server_properties_dict->is_dict()) return; net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_CACHE, [&] { return http_server_properties_dict->Clone(); }); - int version_number = kMissingVersion; - if (!http_server_properties_dict->GetIntegerWithoutPathExpansion( - kVersionKey, &version_number) || - version_number != kVersionNumber) { + base::Optional<int> maybe_version_number = + http_server_properties_dict->FindIntKey(kVersionKey); + if (!maybe_version_number.has_value() || + *maybe_version_number != kVersionNumber) { DVLOG(1) << "Missing or unsupported. Clearing all properties. " - << version_number; + << maybe_version_number.value_or(kMissingVersion); return; } - const base::ListValue* servers_list = nullptr; // For Version 5, data is stored in the following format. // |servers| are saved in MRU order. |servers| are in the format flattened // representation of (scheme/host/port) where port might be ignored if is @@ -257,8 +259,9 @@ // ... // ], ... // }, - if (!http_server_properties_dict->GetListWithoutPathExpansion( - kServersKey, &servers_list)) { + const base::Value* servers_list = + http_server_properties_dict->FindListKey(kServersKey); + if (!servers_list) { DVLOG(1) << "Malformed http_server_properties for servers list."; return; } @@ -277,15 +280,14 @@ // Iterate servers list in reverse MRU order so that entries are inserted // into |spdy_servers_map|, |alternative_service_map|, and // |server_network_stats_map| from oldest to newest. - const base::DictionaryValue* server_dict = nullptr; - for (auto it = servers_list->end(); it != servers_list->begin();) { + for (auto it = servers_list->GetList().end(); + it != servers_list->GetList().begin();) { --it; - if (!it->GetAsDictionary(&server_dict)) { + if (!it->is_dict()) { DVLOG(1) << "Malformed http_server_properties for servers dictionary."; continue; } - AddServerData(*server_dict, server_info_map->get(), - use_network_isolation_key); + AddServerData(*it, server_info_map->get(), use_network_isolation_key); } AddToQuicServerInfoMap(*http_server_properties_dict, @@ -294,9 +296,9 @@ // Read list containing broken and recently-broken alternative services, if // it exists. - const base::ListValue* broken_alt_svc_list; - if (http_server_properties_dict->GetListWithoutPathExpansion( - kBrokenAlternativeServicesKey, &broken_alt_svc_list)) { + const base::Value* broken_alt_svc_list = + http_server_properties_dict->FindListKey(kBrokenAlternativeServicesKey); + if (broken_alt_svc_list) { *broken_alternative_service_list = std::make_unique<BrokenAlternativeServiceList>(); *recently_broken_alternative_services = @@ -304,16 +306,15 @@ kMaxRecentlyBrokenAlternativeServiceEntries); // Iterate list in reverse-MRU order - for (auto it = broken_alt_svc_list->end(); - it != broken_alt_svc_list->begin();) { + for (auto it = broken_alt_svc_list->GetList().end(); + it != broken_alt_svc_list->GetList().begin();) { --it; - const base::DictionaryValue* entry_dict; - if (!it->GetAsDictionary(&entry_dict)) { + if (!it->is_dict()) { DVLOG(1) << "Malformed broken alterantive service entry."; continue; } AddToBrokenAlternativeServices( - *entry_dict, use_network_isolation_key, + *it, use_network_isolation_key, broken_alternative_service_list->get(), recently_broken_alternative_services->get()); } @@ -339,7 +340,7 @@ } void HttpServerPropertiesManager::AddToBrokenAlternativeServices( - const base::DictionaryValue& broken_alt_svc_entry_dict, + const base::Value& broken_alt_svc_entry_dict, bool use_network_isolation_key, BrokenAlternativeServiceList* broken_alternative_service_list, RecentlyBrokenAlternativeServices* recently_broken_alternative_services) { @@ -362,33 +363,33 @@ // Read broken-count and add an entry for |alt_service| into // |recently_broken_alternative_services|. - if (broken_alt_svc_entry_dict.HasKey(kBrokenCountKey)) { - int broken_count; - if (!broken_alt_svc_entry_dict.GetIntegerWithoutPathExpansion( - kBrokenCountKey, &broken_count)) { + if (broken_alt_svc_entry_dict.FindKey(kBrokenCountKey)) { + base::Optional<int> broken_count = + broken_alt_svc_entry_dict.FindIntKey(kBrokenCountKey); + if (!broken_count.has_value()) { DVLOG(1) << "Recently broken alternative service has malformed " << "broken-count."; return; } - if (broken_count < 0) { + if (broken_count.value() < 0) { DVLOG(1) << "Broken alternative service has negative broken-count."; return; } recently_broken_alternative_services->Put( BrokenAlternativeService(alt_service, network_isolation_key, use_network_isolation_key), - broken_count); + broken_count.value()); contains_broken_count_or_broken_until = true; } // Read broken-until and add an entry for |alt_service| in // |broken_alternative_service_list|. - if (broken_alt_svc_entry_dict.HasKey(kBrokenUntilKey)) { - std::string expiration_string; + if (broken_alt_svc_entry_dict.FindKey(kBrokenUntilKey)) { + const std::string* expiration_string = + broken_alt_svc_entry_dict.FindStringKey(kBrokenUntilKey); int64_t expiration_int64; - if (!broken_alt_svc_entry_dict.GetStringWithoutPathExpansion( - kBrokenUntilKey, &expiration_string) || - !base::StringToInt64(expiration_string, &expiration_int64)) { + if (!expiration_string || + !base::StringToInt64(*expiration_string, &expiration_int64)) { DVLOG(1) << "Broken alternative service has malformed broken-until " << "string."; return; @@ -413,7 +414,7 @@ } void HttpServerPropertiesManager::AddServerData( - const base::DictionaryValue& server_dict, + const base::Value& server_dict, HttpServerProperties::ServerInfoMap* server_info_map, bool use_network_isolation_key) { // Get server's scheme/host/pair. @@ -449,18 +450,18 @@ } bool HttpServerPropertiesManager::ParseAlternativeServiceDict( - const base::DictionaryValue& dict, + const base::Value& dict, bool host_optional, const std::string& parsing_under, AlternativeService* alternative_service) { // Protocol is mandatory. - std::string protocol_str; - if (!dict.GetStringWithoutPathExpansion(kProtocolKey, &protocol_str)) { + const std::string* protocol_str = dict.FindStringKey(kProtocolKey); + if (!protocol_str) { DVLOG(1) << "Malformed alternative service protocol string under: " << parsing_under; return false; } - NextProto protocol = NextProtoFromString(protocol_str); + NextProto protocol = NextProtoFromString(*protocol_str); if (!IsAlternateProtocolValid(protocol)) { DVLOG(1) << "Invalid alternative service protocol string \"" << protocol_str << "\" under: " << parsing_under; @@ -470,12 +471,15 @@ // If host is optional, it defaults to "". std::string host = ""; - if (dict.HasKey(kHostKey)) { - if (!dict.GetStringWithoutPathExpansion(kHostKey, &host)) { + const std::string* hostp = nullptr; + if (dict.FindKey(kHostKey)) { + hostp = dict.FindStringKey(kHostKey); + if (!hostp) { DVLOG(1) << "Malformed alternative service host string under: " << parsing_under; return false; } + host = *hostp; } else if (!host_optional) { DVLOG(1) << "alternative service missing host string under: " << parsing_under; @@ -484,18 +488,18 @@ alternative_service->host = host; // Port is mandatory. - int port = 0; - if (!dict.GetInteger(kPortKey, &port) || !IsPortValid(port)) { + base::Optional<int> maybe_port = dict.FindIntKey(kPortKey); + if (!maybe_port.has_value() || !IsPortValid(maybe_port.value())) { DVLOG(1) << "Malformed alternative service port under: " << parsing_under; return false; } - alternative_service->port = static_cast<uint32_t>(port); + alternative_service->port = static_cast<uint32_t>(maybe_port.value()); return true; } bool HttpServerPropertiesManager::ParseAlternativeServiceInfoDictOfServer( - const base::DictionaryValue& dict, + const base::Value& dict, const std::string& server_str, AlternativeServiceInfo* alternative_service_info) { AlternativeService alternative_service; @@ -506,15 +510,14 @@ alternative_service_info->set_alternative_service(alternative_service); // Expiration is optional, defaults to one day. - if (!dict.HasKey(kExpirationKey)) { + if (!dict.FindKey(kExpirationKey)) { alternative_service_info->set_expiration(base::Time::Now() + base::TimeDelta::FromDays(1)); } else { - std::string expiration_string; - if (dict.GetStringWithoutPathExpansion(kExpirationKey, - &expiration_string)) { + const std::string* expiration_string = dict.FindStringKey(kExpirationKey); + if (expiration_string) { int64_t expiration_int64 = 0; - if (!base::StringToInt64(expiration_string, &expiration_int64)) { + if (!base::StringToInt64(*expiration_string, &expiration_int64)) { DVLOG(1) << "Malformed alternative service expiration for server: " << server_str; return false; @@ -530,16 +533,15 @@ // Advertised versions list is optional. // It is only used for versions that use the legacy Google AltSvc format. - if (dict.HasKey(kAdvertisedVersionsKey)) { - const base::ListValue* versions_list = nullptr; - if (!dict.GetListWithoutPathExpansion(kAdvertisedVersionsKey, - &versions_list)) { + if (dict.FindKey(kAdvertisedVersionsKey)) { + const base::Value* versions_list = dict.FindListKey(kAdvertisedVersionsKey); + if (!versions_list) { DVLOG(1) << "Malformed alternative service advertised versions list for " << "server: " << server_str; return false; } quic::ParsedQuicVersionVector advertised_versions; - for (const auto& value : *versions_list) { + for (const auto& value : versions_list->GetList()) { int version; if (!value.GetAsInteger(&version)) { DVLOG(1) << "Malformed alternative service version for server: " @@ -564,12 +566,12 @@ bool HttpServerPropertiesManager::ParseAlternativeServiceInfo( const url::SchemeHostPort& server, - const base::DictionaryValue& server_pref_dict, + const base::Value& server_pref_dict, HttpServerProperties::ServerInfo* server_info) { DCHECK(!server_info->alternative_services.has_value()); - const base::ListValue* alternative_service_list; - if (!server_pref_dict.GetListWithoutPathExpansion( - kAlternativeServiceKey, &alternative_service_list)) { + const base::Value* alternative_service_list = + server_pref_dict.FindListKey(kAlternativeServiceKey); + if (!alternative_service_list) { return true; } if (server.scheme() != "https") { @@ -577,13 +579,12 @@ } AlternativeServiceInfoVector alternative_service_info_vector; - for (const auto& alternative_service_list_item : *alternative_service_list) { - const base::DictionaryValue* alternative_service_dict; - if (!alternative_service_list_item.GetAsDictionary( - &alternative_service_dict)) + for (const auto& alternative_service_list_item : + alternative_service_list->GetList()) { + if (!alternative_service_list_item.is_dict()) return false; AlternativeServiceInfo alternative_service_info; - if (!ParseAlternativeServiceInfoDictOfServer(*alternative_service_dict, + if (!ParseAlternativeServiceInfoDictOfServer(alternative_service_list_item, server.Serialize(), &alternative_service_info)) { return false; @@ -602,56 +603,55 @@ } void HttpServerPropertiesManager::ReadLastLocalAddressWhenQuicWorked( - const base::DictionaryValue& http_server_properties_dict, + const base::Value& http_server_properties_dict, IPAddress* last_local_address_when_quic_worked) { - const base::DictionaryValue* supports_quic_dict = nullptr; - if (!http_server_properties_dict.GetDictionaryWithoutPathExpansion( - kSupportsQuicKey, &supports_quic_dict)) { + const base::Value* supports_quic_dict = + http_server_properties_dict.FindDictKey(kSupportsQuicKey); + if (!supports_quic_dict) { return; } - bool used_quic = false; - if (!supports_quic_dict->GetBooleanWithoutPathExpansion(kUsedQuicKey, - &used_quic)) { + const base::Value* used_quic = supports_quic_dict->FindKey(kUsedQuicKey); + if (!used_quic || !used_quic->is_bool()) { DVLOG(1) << "Malformed SupportsQuic"; return; } - if (!used_quic) + if (!used_quic->GetBool()) return; - std::string address; - if (!supports_quic_dict->GetStringWithoutPathExpansion(kAddressKey, - &address) || - !last_local_address_when_quic_worked->AssignFromIPLiteral(address)) { + const std::string* address = supports_quic_dict->FindStringKey(kAddressKey); + if (!address || + !last_local_address_when_quic_worked->AssignFromIPLiteral(*address)) { DVLOG(1) << "Malformed SupportsQuic"; } } void HttpServerPropertiesManager::ParseNetworkStats( const url::SchemeHostPort& server, - const base::DictionaryValue& server_pref_dict, + const base::Value& server_pref_dict, HttpServerProperties::ServerInfo* server_info) { DCHECK(!server_info->server_network_stats.has_value()); - const base::DictionaryValue* server_network_stats_dict = nullptr; - if (!server_pref_dict.GetDictionaryWithoutPathExpansion( - kNetworkStatsKey, &server_network_stats_dict)) { + const base::Value* server_network_stats_dict = + server_pref_dict.FindDictKey(kNetworkStatsKey); + if (!server_network_stats_dict) { return; } - int srtt; - if (!server_network_stats_dict->GetIntegerWithoutPathExpansion(kSrttKey, - &srtt)) { + base::Optional<int> maybe_srtt = + server_network_stats_dict->FindIntKey(kSrttKey); + if (!maybe_srtt.has_value()) { DVLOG(1) << "Malformed ServerNetworkStats for server: " << server.Serialize(); return; } ServerNetworkStats server_network_stats; - server_network_stats.srtt = base::TimeDelta::FromMicroseconds(srtt); + server_network_stats.srtt = + base::TimeDelta::FromMicroseconds(maybe_srtt.value()); // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist // bandwidth_estimate. server_info->server_network_stats = server_network_stats; } void HttpServerPropertiesManager::AddToQuicServerInfoMap( - const base::DictionaryValue& http_server_properties_dict, + const base::Value& http_server_properties_dict, bool use_network_isolation_key, HttpServerProperties::QuicServerInfoMap* quic_server_info_map) { const base::Value* quic_server_info_list = @@ -719,9 +719,9 @@ std::set<std::pair<std::string, NetworkIsolationKey>> persisted_canonical_suffix_set; const base::Time now = base::Time::Now(); - base::DictionaryValue http_server_properties_dict; + base::Value http_server_properties_dict(base::Value::Type::DICTIONARY); - // Convert |server_info_map| to a DictionaryValue and add it to + // Convert |server_info_map| to a dictionary Value and add it to // |http_server_properties_dict|. base::Value servers_list(base::Value::Type::LIST); for (auto map_it = server_info_map.rbegin(); map_it != server_info_map.rend(); @@ -735,7 +735,7 @@ if (!key.network_isolation_key.ToValue(&network_isolation_key_value)) continue; - base::DictionaryValue server_dict; + base::Value server_dict(base::Value::Type::DICTIONARY); bool supports_spdy = server_info.supports_spdy.value_or(false); if (supports_spdy) @@ -765,7 +765,7 @@ } http_server_properties_dict.SetKey(kServersKey, std::move(servers_list)); - http_server_properties_dict.SetInteger(kVersionKey, kVersionNumber); + http_server_properties_dict.SetIntKey(kVersionKey, kVersionNumber); SaveLastLocalAddressWhenQuicWorkedToPrefs(last_local_address_when_quic_worked, &http_server_properties_dict); @@ -786,71 +786,68 @@ void HttpServerPropertiesManager::SaveAlternativeServiceToServerPrefs( const AlternativeServiceInfoVector& alternative_service_info_vector, - base::DictionaryValue* server_pref_dict) { + base::Value* server_pref_dict) { if (alternative_service_info_vector.empty()) { return; } - std::unique_ptr<base::ListValue> alternative_service_list( - new base::ListValue); + base::Value alternative_service_list(base::Value::Type::LIST); for (const AlternativeServiceInfo& alternative_service_info : alternative_service_info_vector) { const AlternativeService& alternative_service = alternative_service_info.alternative_service(); DCHECK(IsAlternateProtocolValid(alternative_service.protocol)); - std::unique_ptr<base::DictionaryValue> alternative_service_dict( - new base::DictionaryValue); - AddAlternativeServiceFieldsToDictionaryValue( - alternative_service, alternative_service_dict.get()); + base::Value alternative_service_dict(base::Value::Type::DICTIONARY); + AddAlternativeServiceFieldsToDictionaryValue(alternative_service, + &alternative_service_dict); // JSON cannot store int64_t, so expiration is converted to a string. - alternative_service_dict->SetString( + alternative_service_dict.SetStringKey( kExpirationKey, base::NumberToString( alternative_service_info.expiration().ToInternalValue())); - std::unique_ptr<base::ListValue> advertised_versions_list = - std::make_unique<base::ListValue>(); + base::Value advertised_versions_list(base::Value::Type::LIST); for (const auto& version : alternative_service_info.advertised_versions()) { - advertised_versions_list->AppendInteger(version.transport_version); + advertised_versions_list.Append(version.transport_version); } - alternative_service_dict->SetList(kAdvertisedVersionsKey, - std::move(advertised_versions_list)); - alternative_service_list->Append(std::move(alternative_service_dict)); + alternative_service_dict.SetKey(kAdvertisedVersionsKey, + std::move(advertised_versions_list)); + alternative_service_list.Append(std::move(alternative_service_dict)); } - if (alternative_service_list->GetSize() == 0) + if (alternative_service_list.GetList().size() == 0) return; - server_pref_dict->SetWithoutPathExpansion( - kAlternativeServiceKey, std::move(alternative_service_list)); + server_pref_dict->SetKey(kAlternativeServiceKey, + std::move(alternative_service_list)); } void HttpServerPropertiesManager::SaveLastLocalAddressWhenQuicWorkedToPrefs( const IPAddress& last_local_address_when_quic_worked, - base::DictionaryValue* http_server_properties_dict) { + base::Value* http_server_properties_dict) { if (!last_local_address_when_quic_worked.IsValid()) return; - auto supports_quic_dict = std::make_unique<base::DictionaryValue>(); - supports_quic_dict->SetBoolean(kUsedQuicKey, true); - supports_quic_dict->SetString(kAddressKey, - last_local_address_when_quic_worked.ToString()); - http_server_properties_dict->SetWithoutPathExpansion( - kSupportsQuicKey, std::move(supports_quic_dict)); + base::Value supports_quic_dict(base::Value::Type::DICTIONARY); + supports_quic_dict.SetBoolKey(kUsedQuicKey, true); + supports_quic_dict.SetStringKey( + kAddressKey, last_local_address_when_quic_worked.ToString()); + http_server_properties_dict->SetKey(kSupportsQuicKey, + std::move(supports_quic_dict)); } void HttpServerPropertiesManager::SaveNetworkStatsToServerPrefs( const ServerNetworkStats& server_network_stats, - base::DictionaryValue* server_pref_dict) { - auto server_network_stats_dict = std::make_unique<base::DictionaryValue>(); + base::Value* server_pref_dict) { + base::Value server_network_stats_dict(base::Value::Type::DICTIONARY); // Becasue JSON doesn't support int64_t, persist int64_t as a string. - server_network_stats_dict->SetInteger( + server_network_stats_dict.SetIntKey( kSrttKey, static_cast<int>(server_network_stats.srtt.InMicroseconds())); // TODO(rtenneti): When QUIC starts using bandwidth_estimate, then persist // bandwidth_estimate. - server_pref_dict->SetWithoutPathExpansion( - kNetworkStatsKey, std::move(server_network_stats_dict)); + server_pref_dict->SetKey(kNetworkStatsKey, + std::move(server_network_stats_dict)); } void HttpServerPropertiesManager::SaveQuicServerInfoMapToServerPrefs( const HttpServerProperties::QuicServerInfoMap& quic_server_info_map, - base::DictionaryValue* http_server_properties_dict) { + base::Value* http_server_properties_dict) { if (quic_server_info_map.empty()) return; base::Value quic_servers_list(base::Value::Type::LIST); @@ -881,7 +878,7 @@ size_t max_broken_alternative_services, const RecentlyBrokenAlternativeServices& recently_broken_alternative_services, - base::DictionaryValue* http_server_properties_dict) { + base::Value* http_server_properties_dict) { if (broken_alternative_service_list.empty() && recently_broken_alternative_services.empty()) { return; @@ -889,8 +886,7 @@ // JSON list will be in MRU order according to // |recently_broken_alternative_services|. - std::unique_ptr<base::ListValue> json_list = - std::make_unique<base::ListValue>(); + base::Value json_list(base::Value::Type::LIST); // Maps recently-broken alternative services to the index where it's stored // in |json_list|. @@ -902,14 +898,14 @@ const BrokenAlternativeService& broken_alt_service = it->first; int broken_count = it->second; - base::DictionaryValue entry_dict; + base::Value entry_dict(base::Value::Type::DICTIONARY); if (!TryAddBrokenAlternativeServiceFieldsToDictionaryValue( broken_alt_service, &entry_dict)) { continue; } entry_dict.SetKey(kBrokenCountKey, base::Value(broken_count)); - json_list_index_map[broken_alt_service] = json_list->GetList().size(); - json_list->Append(std::move(entry_dict)); + json_list_index_map[broken_alt_service] = json_list.GetList().size(); + json_list.Append(std::move(entry_dict)); } } @@ -932,32 +928,31 @@ auto index_map_it = json_list_index_map.find(broken_alt_service); if (index_map_it != json_list_index_map.end()) { size_t json_list_index = index_map_it->second; - base::DictionaryValue* entry_dict = nullptr; - bool result = json_list->GetDictionary(json_list_index, &entry_dict); - DCHECK(result); - DCHECK(!entry_dict->HasKey(kBrokenUntilKey)); - entry_dict->SetKey(kBrokenUntilKey, - base::Value(base::NumberToString(expiration_int64))); + base::Value& entry_dict = json_list.GetList()[json_list_index]; + DCHECK(entry_dict.is_dict()); + DCHECK(!entry_dict.FindKey(kBrokenUntilKey)); + entry_dict.SetKey(kBrokenUntilKey, + base::Value(base::NumberToString(expiration_int64))); } else { - base::DictionaryValue entry_dict; + base::Value entry_dict(base::Value::Type::DICTIONARY); if (!TryAddBrokenAlternativeServiceFieldsToDictionaryValue( broken_alt_service, &entry_dict)) { continue; } entry_dict.SetKey(kBrokenUntilKey, base::Value(base::NumberToString(expiration_int64))); - json_list->Append(std::move(entry_dict)); + json_list.Append(std::move(entry_dict)); } } } // This can happen if all the entries are for NetworkIsolationKeys for opaque // origins, which isn't exactly common, but can theoretically happen. - if (json_list->empty()) + if (json_list.GetList().empty()) return; - http_server_properties_dict->SetWithoutPathExpansion( - kBrokenAlternativeServicesKey, std::move(json_list)); + http_server_properties_dict->SetKey(kBrokenAlternativeServicesKey, + std::move(json_list)); } void HttpServerPropertiesManager::OnHttpServerPropertiesLoaded() {
diff --git a/net/http/http_server_properties_manager.h b/net/http/http_server_properties_manager.h index d805951..c62b371 100644 --- a/net/http/http_server_properties_manager.h +++ b/net/http/http_server_properties_manager.h
@@ -21,7 +21,6 @@ #include "net/log/net_log_with_source.h" namespace base { -class DictionaryValue; class TickClock; } @@ -127,7 +126,7 @@ FRIEND_TEST_ALL_PREFIXES(HttpServerPropertiesManagerTest, DoNotLoadExpiredAlternativeService); - void AddServerData(const base::DictionaryValue& server_dict, + void AddServerData(const base::Value& server_dict, HttpServerProperties::ServerInfoMap* server_info_map, bool use_network_isolation_key); @@ -141,13 +140,13 @@ // |alternative_service| is the output of parsing |dict|. // Return value is true if parsing is successful. static bool ParseAlternativeServiceDict( - const base::DictionaryValue& dict, + const base::Value& dict, bool host_optional, const std::string& parsing_under, AlternativeService* alternative_service); static bool ParseAlternativeServiceInfoDictOfServer( - const base::DictionaryValue& dict, + const base::Value& dict, const std::string& server_str, AlternativeServiceInfo* alternative_service_info); @@ -156,43 +155,43 @@ // not considered corruption). static bool ParseAlternativeServiceInfo( const url::SchemeHostPort& server, - const base::DictionaryValue& server_dict, + const base::Value& server_dict, HttpServerProperties::ServerInfo* server_info); void ReadLastLocalAddressWhenQuicWorked( - const base::DictionaryValue& server_dict, + const base::Value& server_dict, IPAddress* last_local_address_when_quic_worked); void ParseNetworkStats(const url::SchemeHostPort& server, - const base::DictionaryValue& server_dict, + const base::Value& server_dict, HttpServerProperties::ServerInfo* server_info); void AddToQuicServerInfoMap( - const base::DictionaryValue& server_dict, + const base::Value& server_dict, bool use_network_isolation_key, HttpServerProperties::QuicServerInfoMap* quic_server_info_map); void AddToBrokenAlternativeServices( - const base::DictionaryValue& broken_alt_svc_entry_dict, + const base::Value& broken_alt_svc_entry_dict, bool use_network_isolation_key, BrokenAlternativeServiceList* broken_alternative_service_list, RecentlyBrokenAlternativeServices* recently_broken_alternative_services); void SaveAlternativeServiceToServerPrefs( const AlternativeServiceInfoVector& alternative_service_info_vector, - base::DictionaryValue* server_pref_dict); + base::Value* server_pref_dict); void SaveLastLocalAddressWhenQuicWorkedToPrefs( const IPAddress& last_local_address_when_quic_worked, - base::DictionaryValue* http_server_properties_dict); + base::Value* http_server_properties_dict); void SaveNetworkStatsToServerPrefs( const ServerNetworkStats& server_network_stats, - base::DictionaryValue* server_pref_dict); + base::Value* server_pref_dict); void SaveQuicServerInfoMapToServerPrefs( const HttpServerProperties::QuicServerInfoMap& quic_server_info_map, - base::DictionaryValue* http_server_properties_dict); + base::Value* http_server_properties_dict); void SaveBrokenAlternativeServicesToPrefs( const BrokenAlternativeServiceList& broken_alternative_service_list, size_t max_broken_alternative_services, const RecentlyBrokenAlternativeServices& recently_broken_alternative_services, - base::DictionaryValue* http_server_properties_dict); + base::Value* http_server_properties_dict); void OnHttpServerPropertiesLoaded();
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc index f7849bad..4d4443f 100644 --- a/net/http/http_server_properties_manager_unittest.cc +++ b/net/http/http_server_properties_manager_unittest.cc
@@ -86,13 +86,11 @@ ~MockPrefDelegate() override = default; // HttpServerProperties::PrefDelegate implementation. - const base::DictionaryValue* GetServerProperties() const override { - return &prefs_; - } + const base::Value* GetServerProperties() const override { return &prefs_; } - void SetServerProperties(const base::DictionaryValue& value, + void SetServerProperties(const base::Value& value, base::OnceClosure callback) override { - prefs_.Clear(); + prefs_.DictClear(); prefs_.MergeDictionary(&value); ++num_pref_updates_; if (!prefs_changed_callback_.is_null()) @@ -107,9 +105,9 @@ prefs_changed_callback_ = std::move(callback); } - void InitializePrefs(const base::DictionaryValue& value) { + void InitializePrefs(const base::Value& value) { ASSERT_FALSE(prefs_changed_callback_.is_null()); - prefs_.Clear(); + prefs_.DictClear(); prefs_.MergeDictionary(&value); std::move(prefs_changed_callback_).Run(); } @@ -133,7 +131,7 @@ } private: - base::DictionaryValue prefs_; + base::Value prefs_ = base::Value(base::Value::Type::DICTIONARY); base::OnceClosure prefs_changed_callback_; base::OnceClosure extra_prefs_changed_callback_; int num_pref_updates_ = 0; @@ -182,8 +180,7 @@ // ServerInfoMap. std::unique_ptr<HttpServerProperties::ServerInfoMap> ValueToServerInfoMap( const base::Value& value) { - const base::DictionaryValue* dictionary_value; - if (!value.GetAsDictionary(&dictionary_value)) + if (!value.is_dict()) return nullptr; std::unique_ptr<MockPrefDelegate> pref_delegate = @@ -213,7 +210,7 @@ 10 /* max_server_configs_stored_in_properties */, nullptr /* net_log */, base::DefaultTickClock::GetInstance()); - unowned_pref_delegate->InitializePrefs(*dictionary_value); + unowned_pref_delegate->InitializePrefs(value); EXPECT_TRUE(callback_invoked); return out; } @@ -248,7 +245,7 @@ // |expect_pref_update| should be true if a pref update is expected to be // queued in response to the load. void InitializePrefs( - const base::DictionaryValue& dict = base::DictionaryValue(), + const base::Value& dict = base::Value(base::Value::Type::DICTIONARY), bool expect_pref_update = false) { EXPECT_FALSE(http_server_props_->IsInitialized()); pref_delegate_->InitializePrefs(dict); @@ -283,9 +280,9 @@ } // Returns a dictionary with only the version field populated. - static base::DictionaryValue DictWithVersion() { - base::DictionaryValue http_server_properties_dict; - http_server_properties_dict.SetInteger("version", 5); + static base::Value DictWithVersion() { + base::Value http_server_properties_dict(base::Value::Type::DICTIONARY); + http_server_properties_dict.SetIntKey("version", 5); return http_server_properties_dict; } @@ -299,45 +296,43 @@ }; TEST_F(HttpServerPropertiesManagerTest, BadCachedHostPortPair) { - auto server_pref_dict = std::make_unique<base::DictionaryValue>(); + base::Value server_pref_dict(base::Value::Type::DICTIONARY); // Set supports_spdy for www.google.com:65536. - server_pref_dict->SetBoolean("supports_spdy", true); + server_pref_dict.SetBoolKey("supports_spdy", true); // Set up alternative_service for www.google.com:65536. - auto alternative_service_dict = std::make_unique<base::DictionaryValue>(); - alternative_service_dict->SetString("protocol_str", "h2"); - alternative_service_dict->SetInteger("port", 80); - auto alternative_service_list = std::make_unique<base::ListValue>(); - alternative_service_list->Append(std::move(alternative_service_dict)); - server_pref_dict->SetWithoutPathExpansion( - "alternative_service", std::move(alternative_service_list)); + base::Value alternative_service_dict(base::Value::Type::DICTIONARY); + alternative_service_dict.SetStringKey("protocol_str", "h2"); + alternative_service_dict.SetIntKey("port", 80); + base::Value alternative_service_list(base::Value::Type::LIST); + alternative_service_list.Append(std::move(alternative_service_dict)); + server_pref_dict.SetKey("alternative_service", + std::move(alternative_service_list)); // Set up ServerNetworkStats for www.google.com:65536. - auto stats = std::make_unique<base::DictionaryValue>(); - stats->SetInteger("srtt", 10); - server_pref_dict->SetWithoutPathExpansion("network_stats", std::move(stats)); + base::Value stats(base::Value::Type::DICTIONARY); + stats.SetIntKey("srtt", 10); + server_pref_dict.SetKey("network_stats", std::move(stats)); // Set the server preference for www.google.com:65536. - auto servers_dict = std::make_unique<base::DictionaryValue>(); - servers_dict->SetWithoutPathExpansion("www.google.com:65536", - std::move(server_pref_dict)); - auto servers_list = std::make_unique<base::ListValue>(); - servers_list->Append(std::move(servers_dict)); - base::DictionaryValue http_server_properties_dict = DictWithVersion(); - http_server_properties_dict.SetWithoutPathExpansion( - "servers", std::move(servers_list)); + base::Value servers_dict(base::Value::Type::DICTIONARY); + servers_dict.SetKey("www.google.com:65536", std::move(server_pref_dict)); + base::Value servers_list(base::Value::Type::LIST); + servers_list.Append(std::move(servers_dict)); + base::Value http_server_properties_dict = DictWithVersion(); + http_server_properties_dict.SetKey("servers", std::move(servers_list)); // Set quic_server_info for www.google.com:65536. - auto quic_servers_dict = std::make_unique<base::DictionaryValue>(); - auto quic_server_pref_dict1 = std::make_unique<base::DictionaryValue>(); - quic_server_pref_dict1->SetKey("server_info", - base::Value("quic_server_info1")); - quic_servers_dict->SetWithoutPathExpansion("http://mail.google.com:65536", - std::move(quic_server_pref_dict1)); + base::Value quic_servers_dict(base::Value::Type::DICTIONARY); + base::Value quic_server_pref_dict1(base::Value::Type::DICTIONARY); + quic_server_pref_dict1.SetKey("server_info", + base::Value("quic_server_info1")); + quic_servers_dict.SetKey("http://mail.google.com:65536", + std::move(quic_server_pref_dict1)); - http_server_properties_dict.SetWithoutPathExpansion( - "quic_servers", std::move(quic_servers_dict)); + http_server_properties_dict.SetKey("quic_servers", + std::move(quic_servers_dict)); // Set up the pref. InitializePrefs(http_server_properties_dict); @@ -358,37 +353,35 @@ } TEST_F(HttpServerPropertiesManagerTest, BadCachedAltProtocolPort) { - auto server_pref_dict = std::make_unique<base::DictionaryValue>(); + base::Value server_pref_dict(base::Value::Type::DICTIONARY); // Set supports_spdy for www.google.com:80. - server_pref_dict->SetBoolean("supports_spdy", true); + server_pref_dict.SetBoolKey("supports_spdy", true); // Set up alternative_service for www.google.com:80. - auto alternative_service_dict = std::make_unique<base::DictionaryValue>(); - alternative_service_dict->SetString("protocol_str", "h2"); - alternative_service_dict->SetInteger("port", 65536); - auto alternative_service_list = std::make_unique<base::ListValue>(); - alternative_service_list->Append(std::move(alternative_service_dict)); - server_pref_dict->SetWithoutPathExpansion( - "alternative_service", std::move(alternative_service_list)); + base::Value alternative_service_dict(base::Value::Type::DICTIONARY); + alternative_service_dict.SetStringKey("protocol_str", "h2"); + alternative_service_dict.SetIntKey("port", 65536); + base::Value alternative_service_list(base::Value::Type::LIST); + alternative_service_list.Append(std::move(alternative_service_dict)); + server_pref_dict.SetKey("alternative_service", + std::move(alternative_service_list)); // Set the server preference for www.google.com:80. - auto servers_dict = std::make_unique<base::DictionaryValue>(); - servers_dict->SetWithoutPathExpansion("www.google.com:80", - std::move(server_pref_dict)); - auto servers_list = std::make_unique<base::ListValue>(); - servers_list->Append(std::move(servers_dict)); - base::DictionaryValue http_server_properties_dict = DictWithVersion(); - http_server_properties_dict.SetWithoutPathExpansion( - "servers", std::move(servers_list)); + base::Value servers_dict(base::Value::Type::DICTIONARY); + servers_dict.SetKey("www.google.com:80", std::move(server_pref_dict)); + base::Value servers_list(base::Value::Type::LIST); + servers_list.Append(std::move(servers_dict)); + base::Value http_server_properties_dict = DictWithVersion(); + http_server_properties_dict.SetKey("servers", std::move(servers_list)); - // Set up the pref. - InitializePrefs(http_server_properties_dict); + // Set up the pref. + InitializePrefs(http_server_properties_dict); - // Verify alternative service is not set. - EXPECT_FALSE( - HasAlternativeService(url::SchemeHostPort("http", "www.google.com", 80), - NetworkIsolationKey())); + // Verify alternative service is not set. + EXPECT_FALSE( + HasAlternativeService(url::SchemeHostPort("http", "www.google.com", 80), + NetworkIsolationKey())); } TEST_F(HttpServerPropertiesManagerTest, SupportsSpdy) { @@ -627,7 +620,8 @@ alternative_service_info_vector[0].alternative_service()); // Initializing prefs does not result in a task to write the prefs. - InitializePrefs(base::DictionaryValue(), true /* expect_pref_update */); + InitializePrefs(base::Value(base::Value::Type::DICTIONARY), + true /* expect_pref_update */); alternative_service_info_vector = http_server_props_->GetAlternativeServiceInfos(spdy_server_mail, NetworkIsolationKey()); @@ -1038,8 +1032,7 @@ // https://crbug.com/444956: Add 200 alternative_service servers followed by // supports_quic and verify we have read supports_quic from prefs. TEST_F(HttpServerPropertiesManagerTest, BadLastLocalAddressWhenQuicWorked) { - std::unique_ptr<base::ListValue> servers_list = - std::make_unique<base::ListValue>(); + base::Value servers_list(base::Value::Type::LIST); for (int i = 1; i <= 200; ++i) { // Set up alternative_service for www.google.com:i. @@ -1054,25 +1047,23 @@ server_dict.SetStringKey("server", StringPrintf("https://www.google.com:%d", i)); server_dict.SetKey("isolation", base::Value(base::Value::Type::LIST)); - servers_list->Append(std::move(server_dict)); + servers_list.Append(std::move(server_dict)); } // Set the server preference for http://mail.google.com server. base::Value server_dict2(base::Value::Type::DICTIONARY); server_dict2.SetStringKey("server", "https://mail.google.com"); server_dict2.SetKey("isolation", base::Value(base::Value::Type::LIST)); - servers_list->Append(std::move(server_dict2)); + servers_list.Append(std::move(server_dict2)); - base::DictionaryValue http_server_properties_dict = DictWithVersion(); - http_server_properties_dict.SetWithoutPathExpansion("servers", - std::move(servers_list)); + base::Value http_server_properties_dict = DictWithVersion(); + http_server_properties_dict.SetKey("servers", std::move(servers_list)); // Set up SupportsQuic for 127.0.0.1 - auto supports_quic = std::make_unique<base::DictionaryValue>(); - supports_quic->SetBoolean("used_quic", true); - supports_quic->SetString("address", "127.0.0.1"); - http_server_properties_dict.SetWithoutPathExpansion("supports_quic", - std::move(supports_quic)); + base::Value supports_quic(base::Value::Type::DICTIONARY); + supports_quic.SetBoolKey("used_quic", true); + supports_quic.SetStringKey("address", "127.0.0.1"); + http_server_properties_dict.SetKey("supports_quic", std::move(supports_quic)); // Set up the pref. InitializePrefs(http_server_properties_dict); @@ -1183,24 +1174,20 @@ // A copy of |pref_delegate_|'s server dict will be created, and the broken // alternative service's "broken_until" field is removed and verified // separately. The rest of the server dict copy is verified afterwards. - base::Value server_value_copy = - pref_delegate_->GetServerProperties()->Clone(); + base::Value server_dict = pref_delegate_->GetServerProperties()->Clone(); + ASSERT_TRUE(server_dict.is_dict()); // Extract and remove the "broken_until" string for "www.google.com:1234". - base::DictionaryValue* server_dict; - ASSERT_TRUE(server_value_copy.GetAsDictionary(&server_dict)); - base::ListValue* broken_alt_svc_list; - ASSERT_TRUE(server_dict->GetList("broken_alternative_services", - &broken_alt_svc_list)); - ASSERT_EQ(2u, broken_alt_svc_list->GetSize()); - base::DictionaryValue* broken_alt_svcs_list_entry; - ASSERT_TRUE( - broken_alt_svc_list->GetDictionary(0, &broken_alt_svcs_list_entry)); - ASSERT_TRUE(broken_alt_svcs_list_entry->HasKey("broken_until")); - std::string expiration_string; - ASSERT_TRUE(broken_alt_svcs_list_entry->GetStringWithoutPathExpansion( - "broken_until", &expiration_string)); - broken_alt_svcs_list_entry->RemoveKey("broken_until"); + base::Value* broken_alt_svc_list = + server_dict.FindListKey("broken_alternative_services"); + ASSERT_TRUE(broken_alt_svc_list); + ASSERT_EQ(2u, broken_alt_svc_list->GetList().size()); + base::Value& broken_alt_svcs_list_entry = broken_alt_svc_list->GetList()[0]; + const std::string* broken_until_str = + broken_alt_svcs_list_entry.FindStringKey("broken_until"); + ASSERT_TRUE(broken_until_str); + const std::string expiration_string = *broken_until_str; + broken_alt_svcs_list_entry.RemoveKey("broken_until"); // Expiration time of "www.google.com:1234" should be 5 minutes minus the // update-prefs-delay from when the prefs were written. @@ -1246,22 +1233,21 @@ "\"version\":5}"; std::string preferences_json; - EXPECT_TRUE(base::JSONWriter::Write(server_value_copy, &preferences_json)); + EXPECT_TRUE(base::JSONWriter::Write(server_dict, &preferences_json)); EXPECT_EQ(expected_json, preferences_json); } TEST_F(HttpServerPropertiesManagerTest, ParseAlternativeServiceInfo) { InitializePrefs(); - std::unique_ptr<base::Value> server_value = base::JSONReader::ReadDeprecated( + std::unique_ptr<base::Value> server_dict = base::JSONReader::ReadDeprecated( "{\"alternative_service\":[{\"port\":443,\"protocol_str\":\"h2\"}," "{\"port\":123,\"protocol_str\":\"quic\"," "\"expiration\":\"9223372036854775807\"},{\"host\":\"example.org\"," "\"port\":1234,\"protocol_str\":\"h2\"," "\"expiration\":\"13758804000000000\"}]}"); - ASSERT_TRUE(server_value); - base::DictionaryValue* server_dict; - ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); + ASSERT_TRUE(server_dict); + ASSERT_TRUE(server_dict->is_dict()); const url::SchemeHostPort server("https", "example.com", 443); HttpServerProperties::ServerInfo server_info; @@ -1311,12 +1297,11 @@ TEST_F(HttpServerPropertiesManagerTest, DoNotLoadAltSvcForInsecureOrigins) { InitializePrefs(); - std::unique_ptr<base::Value> server_value = base::JSONReader::ReadDeprecated( + std::unique_ptr<base::Value> server_dict = base::JSONReader::ReadDeprecated( "{\"alternative_service\":[{\"port\":443,\"protocol_str\":\"h2\"," "\"expiration\":\"9223372036854775807\"}]}"); - ASSERT_TRUE(server_value); - base::DictionaryValue* server_dict; - ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); + ASSERT_TRUE(server_dict); + ASSERT_TRUE(server_dict->is_dict()); const url::SchemeHostPort server("http", "example.com", 80); HttpServerProperties::ServerInfo server_info; @@ -1371,68 +1356,70 @@ EXPECT_EQ(1U, GetPendingMainThreadTaskCount()); EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates()); - const base::DictionaryValue* pref_dict = - pref_delegate_->GetServerProperties(); + const base::Value* pref_dict = pref_delegate_->GetServerProperties(); - const base::ListValue* servers_list = nullptr; - ASSERT_TRUE(pref_dict->GetListWithoutPathExpansion("servers", &servers_list)); - auto it = servers_list->begin(); - const base::DictionaryValue* server_pref_dict; - ASSERT_TRUE(it->GetAsDictionary(&server_pref_dict)); + const base::Value* servers_list = pref_dict->FindListKey("servers"); + ASSERT_TRUE(servers_list); + auto it = servers_list->GetList().begin(); + const base::Value& server_pref_dict = *it; + ASSERT_TRUE(server_pref_dict.is_dict()); - const std::string* server_str = server_pref_dict->FindStringKey("server"); + const std::string* server_str = server_pref_dict.FindStringKey("server"); ASSERT_TRUE(server_str); EXPECT_EQ("https://www.example.com", *server_str); const base::Value* network_isolation_key_value = - server_pref_dict->FindKey("isolation"); + server_pref_dict.FindKey("isolation"); ASSERT_TRUE(network_isolation_key_value); ASSERT_EQ(base::Value::Type::LIST, network_isolation_key_value->type()); EXPECT_TRUE(network_isolation_key_value->GetList().empty()); - const base::ListValue* altsvc_list; - ASSERT_TRUE(server_pref_dict->GetList("alternative_service", &altsvc_list)); + const base::Value* altsvc_list = + server_pref_dict.FindListKey("alternative_service"); + ASSERT_TRUE(altsvc_list); - ASSERT_EQ(2u, altsvc_list->GetSize()); + ASSERT_EQ(2u, altsvc_list->GetList().size()); - const base::DictionaryValue* altsvc_entry; - std::string hostname; + const base::Value& altsvc_entry = altsvc_list->GetList()[0]; + ASSERT_TRUE(altsvc_entry.is_dict()); + const std::string* hostname = altsvc_entry.FindStringKey("host"); - ASSERT_TRUE(altsvc_list->GetDictionary(0, &altsvc_entry)); - ASSERT_TRUE(altsvc_entry->GetString("host", &hostname)); - EXPECT_EQ("broken.example.com", hostname); + ASSERT_TRUE(hostname); + EXPECT_EQ("broken.example.com", *hostname); - ASSERT_TRUE(altsvc_list->GetDictionary(1, &altsvc_entry)); - ASSERT_TRUE(altsvc_entry->GetString("host", &hostname)); - EXPECT_EQ("valid.example.com", hostname); + const base::Value& altsvc_entry2 = altsvc_list->GetList()[1]; + ASSERT_TRUE(altsvc_entry.is_dict()); + hostname = altsvc_entry2.FindStringKey("host"); + ASSERT_TRUE(hostname); + EXPECT_EQ("valid.example.com", *hostname); } // Test that expired alternative service entries on disk are ignored. TEST_F(HttpServerPropertiesManagerTest, DoNotLoadExpiredAlternativeService) { InitializePrefs(); - auto alternative_service_list = std::make_unique<base::ListValue>(); - auto expired_dict = std::make_unique<base::DictionaryValue>(); - expired_dict->SetString("protocol_str", "h2"); - expired_dict->SetString("host", "expired.example.com"); - expired_dict->SetInteger("port", 443); + base::Value alternative_service_list(base::Value::Type::LIST); + base::Value expired_dict(base::Value::Type::DICTIONARY); + expired_dict.SetStringKey("protocol_str", "h2"); + expired_dict.SetStringKey("host", "expired.example.com"); + expired_dict.SetIntKey("port", 443); base::Time time_one_day_ago = base::Time::Now() - base::TimeDelta::FromDays(1); - expired_dict->SetString( + expired_dict.SetStringKey( "expiration", base::NumberToString(time_one_day_ago.ToInternalValue())); - alternative_service_list->Append(std::move(expired_dict)); + alternative_service_list.Append(std::move(expired_dict)); - auto valid_dict = std::make_unique<base::DictionaryValue>(); - valid_dict->SetString("protocol_str", "h2"); - valid_dict->SetString("host", "valid.example.com"); - valid_dict->SetInteger("port", 443); - valid_dict->SetString( + base::Value valid_dict(base::Value::Type::DICTIONARY); + valid_dict.SetStringKey("protocol_str", "h2"); + valid_dict.SetStringKey("host", "valid.example.com"); + valid_dict.SetIntKey("port", 443); + valid_dict.SetStringKey( "expiration", base::NumberToString(one_day_from_now_.ToInternalValue())); - alternative_service_list->Append(std::move(valid_dict)); + alternative_service_list.Append(std::move(valid_dict)); - base::DictionaryValue server_pref_dict; - server_pref_dict.SetWithoutPathExpansion("alternative_service", - std::move(alternative_service_list)); + base::Value server_pref_dict(base::Value::Type::DICTIONARY); + server_pref_dict.SetKey("alternative_service", + std::move(alternative_service_list)); const url::SchemeHostPort server("https", "example.com", 443); HttpServerProperties::ServerInfo server_info; @@ -1558,7 +1545,7 @@ TEST_F(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) { InitializePrefs(); - std::unique_ptr<base::Value> server_value = base::JSONReader::ReadDeprecated( + std::unique_ptr<base::Value> server_dict = base::JSONReader::ReadDeprecated( "{\"alternative_service\":[" "{\"port\":443,\"protocol_str\":\"quic\"}," "{\"port\":123,\"protocol_str\":\"quic\"," @@ -1566,9 +1553,8 @@ // Add 33 which we know is not supported, as regression test for // https://crbug.com/1061509 "\"advertised_versions\":[33,46,43]}]}"); - ASSERT_TRUE(server_value); - base::DictionaryValue* server_dict; - ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); + ASSERT_TRUE(server_dict); + ASSERT_TRUE(server_dict->is_dict()); const url::SchemeHostPort server("https", "example.com", 443); HttpServerProperties::ServerInfo server_info; @@ -1764,7 +1750,7 @@ std::string expiration_str = base::NumberToString(static_cast<int64_t>(one_day_from_now_.ToTimeT())); - std::unique_ptr<base::Value> server_value = base::JSONReader::ReadDeprecated( + std::unique_ptr<base::Value> server_dict = base::JSONReader::ReadDeprecated( "{" "\"broken_alternative_services\":[" "{\"broken_until\":\"" + @@ -1808,9 +1794,8 @@ "{\"address\":\"127.0.0.1\",\"used_quic\":true}," "\"version\":5" "}"); - ASSERT_TRUE(server_value); - base::DictionaryValue* server_dict; - ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); + ASSERT_TRUE(server_dict); + ASSERT_TRUE(server_dict->is_dict()); // Don't use the test fixture's InitializePrefs() method, since there are // pending tasks. Initializing prefs should queue a pref update task, since @@ -2028,7 +2013,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); // Set kServer1 to support H2, but require HTTP/1.1. Set kServer2 to only // require HTTP/1.1. @@ -2047,7 +2033,7 @@ // Wait until the data's been written to prefs, and then tear down the // HttpServerProperties. FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting()); - std::unique_ptr<base::DictionaryValue> saved_value = + std::unique_ptr<base::Value> saved_value = unowned_pref_delegate->GetServerProperties()->CreateDeepCopy(); properties.reset(); @@ -2215,7 +2201,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); // Set a values using kNetworkIsolationKey. properties->SetSupportsSpdy(kServer, kNetworkIsolationKey, true); @@ -2235,7 +2222,7 @@ // Wait until the data's been written to prefs, and then tear down the // HttpServerProperties. FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting()); - std::unique_ptr<base::DictionaryValue> saved_value = + std::unique_ptr<base::Value> saved_value = unowned_pref_delegate->GetServerProperties()->CreateDeepCopy(); properties.reset(); @@ -2308,7 +2295,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); // Set alternative services for kServer1 using kNetworkIsolationKey1. That // information should be retrieved when fetching information for any server @@ -2386,7 +2374,7 @@ // Wait until the data's been written to prefs, and then tear down the // HttpServerProperties. FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting()); - std::unique_ptr<base::DictionaryValue> saved_value = + std::unique_ptr<base::Value> saved_value = unowned_pref_delegate->GetServerProperties()->CreateDeepCopy(); properties.reset(); @@ -2445,7 +2433,7 @@ SCOPED_TRACE(static_cast<int>(save_network_isolation_key_mode)); // Save prefs using |save_network_isolation_key_mode|. - std::unique_ptr<base::DictionaryValue> saved_value; + std::unique_ptr<base::Value> saved_value; { // Configure the the feature. std::unique_ptr<base::test::ScopedFeatureList> feature_list = @@ -2465,7 +2453,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); // Set kAlternativeService1 as broken in the context of // kNetworkIsolationKey1, and kAlternativeService2 as broken in the @@ -2661,7 +2650,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); properties->MarkAlternativeServiceBroken(kAlternativeService, kNetworkIsolationKey); @@ -2703,7 +2693,7 @@ SCOPED_TRACE(static_cast<int>(save_network_isolation_key_mode)); // Save prefs using |save_network_isolation_key_mode|. - std::unique_ptr<base::DictionaryValue> saved_value; + std::unique_ptr<base::Value> saved_value; { // Configure the the feature. std::unique_ptr<base::test::ScopedFeatureList> feature_list = @@ -2723,7 +2713,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); // Set kServer1 to kQuicServerInfo1 in the context of // kNetworkIsolationKey1, Set kServer2 to kQuicServerInfo2 in the context @@ -2888,7 +2879,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); // Set kQuicServerInfo1 for kServer1 using kNetworkIsolationKey1. That // information should be retrieved when fetching information for any server @@ -2936,7 +2928,7 @@ // Wait until the data's been written to prefs, and then tear down the // HttpServerProperties. FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting()); - std::unique_ptr<base::DictionaryValue> saved_value = + std::unique_ptr<base::Value> saved_value = unowned_pref_delegate->GetServerProperties()->CreateDeepCopy(); properties.reset(); @@ -2990,7 +2982,8 @@ std::make_unique<HttpServerProperties>(std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock()); - unowned_pref_delegate->InitializePrefs(base::DictionaryValue()); + unowned_pref_delegate->InitializePrefs( + base::Value(base::Value::Type::DICTIONARY)); properties->SetQuicServerInfo(kServer, kNetworkIsolationKey, "QuicServerInfo");
diff --git a/net/http/http_server_properties_unittest.cc b/net/http/http_server_properties_unittest.cc index f6d9c55..b7f6901 100644 --- a/net/http/http_server_properties_unittest.cc +++ b/net/http/http_server_properties_unittest.cc
@@ -25,10 +25,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" -namespace base { -class ListValue; -} - namespace net { const base::TimeDelta BROKEN_ALT_SVC_EXPIRE_DELAYS[10] = { @@ -2343,10 +2339,10 @@ "}" "]"; - std::unique_ptr<base::Value> alternative_service_info_value = + base::Value alternative_service_info_value = impl_.GetAlternativeServiceInfoAsValue(); std::string alternative_service_info_json; - base::JSONWriter::Write(*alternative_service_info_value, + base::JSONWriter::Write(alternative_service_info_value, &alternative_service_info_json); EXPECT_EQ(expected_json, alternative_service_info_json); }
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc index 7f61045..fef9fd4 100644 --- a/net/http/http_stream_factory_job.cc +++ b/net/http/http_stream_factory_job.cc
@@ -73,24 +73,24 @@ bool expect_spdy, bool using_quic, RequestPriority priority) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); if (source.IsValid()) source.AddToEventParameters(&dict); - dict.SetString("original_url", original_url.GetOrigin().spec()); - dict.SetString("url", url.GetOrigin().spec()); - dict.SetBoolean("expect_spdy", expect_spdy); - dict.SetBoolean("using_quic", using_quic); - dict.SetString("priority", RequestPriorityToString(priority)); - return std::move(dict); + dict.SetStringKey("original_url", original_url.GetOrigin().spec()); + dict.SetStringKey("url", url.GetOrigin().spec()); + dict.SetBoolKey("expect_spdy", expect_spdy); + dict.SetBoolKey("using_quic", using_quic); + dict.SetStringKey("priority", RequestPriorityToString(priority)); + return dict; } // Returns parameters associated with the Proto (with NPN negotiation) of a HTTP // stream. base::Value NetLogHttpStreamProtoParams(NextProto negotiated_protocol) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); - dict.SetString("proto", NextProtoToString(negotiated_protocol)); - return std::move(dict); + dict.SetStringKey("proto", NextProtoToString(negotiated_protocol)); + return dict; } HttpStreamFactory::Job::Job(Delegate* delegate,
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc index df59847..d787629 100644 --- a/net/http/http_stream_factory_job_controller.cc +++ b/net/http/http_stream_factory_job_controller.cc
@@ -36,12 +36,12 @@ // Returns parameters associated with the proxy resolution. base::Value NetLogHttpStreamJobProxyServerResolved( const ProxyServer& proxy_server) { - base::DictionaryValue dict; + base::Value dict(base::Value::Type::DICTIONARY); - dict.SetString("proxy_server", proxy_server.is_valid() - ? proxy_server.ToPacString() - : std::string()); - return std::move(dict); + dict.SetStringKey("proxy_server", proxy_server.is_valid() + ? proxy_server.ToPacString() + : std::string()); + return dict; } } // namespace @@ -51,18 +51,18 @@ const int kMaxDelayTimeForMainJobSecs = 3; base::Value NetLogJobControllerParams(const GURL& url, bool is_preconnect) { - base::DictionaryValue dict; - dict.SetString("url", url.possibly_invalid_spec()); - dict.SetBoolean("is_preconnect", is_preconnect); - return std::move(dict); + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetStringKey("url", url.possibly_invalid_spec()); + dict.SetBoolKey("is_preconnect", is_preconnect); + return dict; } base::Value NetLogAltSvcParams(const AlternativeServiceInfo* alt_svc_info, bool is_broken) { - base::DictionaryValue dict; - dict.SetString("alt_svc", alt_svc_info->ToString()); - dict.SetBoolean("is_broken", is_broken); - return std::move(dict); + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetStringKey("alt_svc", alt_svc_info->ToString()); + dict.SetBoolKey("is_broken", is_broken); + return dict; } HttpStreamFactory::JobController::JobController(
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc index f005f3c..00ca59d 100644 --- a/net/http/http_stream_factory_job_controller_unittest.cc +++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -19,6 +19,7 @@ #include "base/test/task_environment.h" #include "base/test/test_mock_time_task_runner.h" #include "base/threading/platform_thread.h" +#include "base/values.h" #include "net/base/completion_once_callback.h" #include "net/base/features.h" #include "net/base/host_port_pair.h" @@ -108,10 +109,8 @@ ~MockPrefDelegate() override = default; // HttpServerProperties::PrefDelegate implementation: - const base::DictionaryValue* GetServerProperties() const override { - return nullptr; - } - void SetServerProperties(const base::DictionaryValue& value, + const base::Value* GetServerProperties() const override { return nullptr; } + void SetServerProperties(const base::Value& value, base::OnceClosure callback) override {} void WaitForPrefLoad(base::OnceClosure pref_loaded_callback) override {}
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc index 9b52377..925374a 100644 --- a/net/http/http_stream_factory_unittest.cc +++ b/net/http/http_stream_factory_unittest.cc
@@ -98,7 +98,6 @@ namespace base { class Value; -class DictionaryValue; } // namespace base namespace net { @@ -1041,10 +1040,9 @@ int GetSpdySessionCount(HttpNetworkSession* session) { std::unique_ptr<base::Value> value( session->spdy_session_pool()->SpdySessionPoolInfoToValue()); - base::ListValue* session_list; - if (!value || !value->GetAsList(&session_list)) + if (!value || !value->is_list()) return -1; - return session_list->GetSize(); + return value->GetList().size(); } // Return count of sockets handed out by a given socket pool. @@ -1057,12 +1055,11 @@ #if defined(OS_ANDROID) // Return count of distinct QUIC sessions. int GetQuicSessionCount(HttpNetworkSession* session) { - std::unique_ptr<base::DictionaryValue> dict( - base::DictionaryValue::From(session->QuicInfoToValue())); - base::ListValue* session_list; - if (!dict->GetList("sessions", &session_list)) + base::Value dict(session->QuicInfoToValue()); + base::Value* session_list = dict.FindListKey("sessions"); + if (!session_list) return -1; - return session_list->GetSize(); + return session_list->GetList().size(); } #endif
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc index 81b87403..9d7ac8f 100644 --- a/net/http/http_stream_parser.cc +++ b/net/http/http_stream_parser.cc
@@ -71,11 +71,11 @@ base::Value NetLogSendRequestBodyParams(uint64_t length, bool is_chunked, bool did_merge) { - base::DictionaryValue dict; - dict.SetInteger("length", static_cast<int>(length)); - dict.SetBoolean("is_chunked", is_chunked); - dict.SetBoolean("did_merge", did_merge); - return std::move(dict); + base::Value dict(base::Value::Type::DICTIONARY); + dict.SetIntKey("length", static_cast<int>(length)); + dict.SetBoolKey("is_chunked", is_chunked); + dict.SetBoolKey("did_merge", did_merge); + return dict; } void NetLogSendRequestBody(const NetLogWithSource& net_log,
diff --git a/net/http/transport_security_persister.cc b/net/http/transport_security_persister.cc index 137c09f..e1d2bfc 100644 --- a/net/http/transport_security_persister.cc +++ b/net/http/transport_security_persister.cc
@@ -16,6 +16,7 @@ #include "base/json/json_writer.h" #include "base/location.h" #include "base/metrics/histogram_macros.h" +#include "base/optional.h" #include "base/sequenced_task_runner.h" #include "base/task_runner_util.h" #include "base/threading/thread_task_runner_handle.h" @@ -198,7 +199,7 @@ const TransportSecurityState::ExpectCTState& expect_ct_state = expect_ct_iterator.domain_state(); - base::DictionaryValue ct_entry; + base::Value ct_entry(base::Value::Type::DICTIONARY); base::Value network_isolation_key_value; // Don't serialize entries with transient NetworkIsolationKeys. @@ -300,36 +301,32 @@ // // TODO(mmenke): Remove once the obsolete format is no longer supported. bool DeserializeObsoleteExpectCTState( - const base::DictionaryValue* parsed, + const base::Value* parsed, TransportSecurityState::ExpectCTState* state) { - const base::DictionaryValue* expect_ct_subdictionary; - if (!parsed->GetDictionary(kExpectCTSubdictionary, - &expect_ct_subdictionary)) { + const base::Value* expect_ct_subdictionary = + parsed->FindDictKey(kExpectCTSubdictionary); + if (!expect_ct_subdictionary) { // Expect-CT data is not required, so this item is not malformed. return true; } - double observed; - bool has_observed = - expect_ct_subdictionary->GetDouble(kExpectCTObserved, &observed); - double expiry; - bool has_expiry = - expect_ct_subdictionary->GetDouble(kExpectCTExpiry, &expiry); - bool enforce; - bool has_enforce = - expect_ct_subdictionary->GetBoolean(kExpectCTEnforce, &enforce); - std::string report_uri_str; - bool has_report_uri = - expect_ct_subdictionary->GetString(kExpectCTReportUri, &report_uri_str); + base::Optional<double> observed = + expect_ct_subdictionary->FindDoubleKey(kExpectCTObserved); + base::Optional<double> expiry = + expect_ct_subdictionary->FindDoubleKey(kExpectCTExpiry); + base::Optional<bool> enforce = + expect_ct_subdictionary->FindBoolKey(kExpectCTEnforce); + const std::string* report_uri_str = + expect_ct_subdictionary->FindStringKey(kExpectCTReportUri); // If an Expect-CT subdictionary is present, it must have the required keys. - if (!has_observed || !has_expiry || !has_enforce) + if (!observed.has_value() || !expiry.has_value() || !enforce.has_value()) return false; - state->last_observed = base::Time::FromDoubleT(observed); - state->expiry = base::Time::FromDoubleT(expiry); - state->enforce = enforce; - if (has_report_uri) { - GURL report_uri(report_uri_str); + state->last_observed = base::Time::FromDoubleT(*observed); + state->expiry = base::Time::FromDoubleT(*expiry); + state->enforce = *enforce; + if (report_uri_str) { + GURL report_uri(*report_uri_str); if (report_uri.is_valid()) state->report_uri = report_uri; } @@ -457,24 +454,19 @@ } bool TransportSecurityPersister::DeserializeObsoleteData( - const base::Value& value, + const base::Value& dict_value, bool* dirty, TransportSecurityState* state) { const base::Time current_time(base::Time::Now()); bool dirtied = false; - const base::DictionaryValue* dict_value = nullptr; - int rv = value.GetAsDictionary(&dict_value); - // The one caller ensures |value| is of Value::Type::DICTIONARY already, - // though it doesn't extract a DictionaryValue*, since that is the deprecated - // way to use dictionaries. - DCHECK(rv); + // The one caller ensures |dict_value| is of Value::Type::DICTIONARY already. + DCHECK(dict_value.is_dict()); - for (base::DictionaryValue::Iterator i(*dict_value); - !i.IsAtEnd(); i.Advance()) { - const base::DictionaryValue* parsed = nullptr; - if (!i.value().GetAsDictionary(&parsed)) { - LOG(WARNING) << "Could not parse entry " << i.key() << "; skipping entry"; + for (const auto& i : dict_value.DictItems()) { + const base::Value& parsed = i.second; + if (!parsed.is_dict()) { + LOG(WARNING) << "Could not parse entry " << i.first << "; skipping entry"; continue; } @@ -483,45 +475,48 @@ // kIncludeSubdomains is a legacy synonym for kStsIncludeSubdomains. Parse // at least one of these properties, preferably the new one. - bool include_subdomains = false; - bool parsed_include_subdomains = parsed->GetBoolean(kIncludeSubdomains, - &include_subdomains); - sts_state.include_subdomains = include_subdomains; - if (parsed->GetBoolean(kStsIncludeSubdomains, &include_subdomains)) { - sts_state.include_subdomains = include_subdomains; + bool parsed_include_subdomains = false; + base::Optional<bool> include_subdomains = + parsed.FindBoolKey(kIncludeSubdomains); + if (include_subdomains.has_value()) { + sts_state.include_subdomains = include_subdomains.value(); + parsed_include_subdomains = true; + } + include_subdomains = parsed.FindBoolKey(kStsIncludeSubdomains); + if (include_subdomains.has_value()) { + sts_state.include_subdomains = include_subdomains.value(); parsed_include_subdomains = true; } - std::string mode_string; - double expiry = 0; - if (!parsed_include_subdomains || - !parsed->GetString(kMode, &mode_string) || - !parsed->GetDouble(kExpiry, &expiry)) { - LOG(WARNING) << "Could not parse some elements of entry " << i.key() + const std::string* mode_string = parsed.FindStringKey(kMode); + base::Optional<double> expiry = parsed.FindDoubleKey(kExpiry); // 0; + if (!parsed_include_subdomains || !mode_string || !expiry.has_value()) { + LOG(WARNING) << "Could not parse some elements of entry " << i.first << "; skipping entry"; continue; } - if (mode_string == kForceHTTPS || mode_string == kStrict) { + if (*mode_string == kForceHTTPS || *mode_string == kStrict) { sts_state.upgrade_mode = TransportSecurityState::STSState::MODE_FORCE_HTTPS; - } else if (mode_string == kDefault || mode_string == kPinningOnly) { + } else if (*mode_string == kDefault || *mode_string == kPinningOnly) { sts_state.upgrade_mode = TransportSecurityState::STSState::MODE_DEFAULT; } else { LOG(WARNING) << "Unknown TransportSecurityState mode string " - << mode_string << " found for entry " << i.key() + << mode_string << " found for entry " << i.first << "; skipping entry"; continue; } - sts_state.expiry = base::Time::FromDoubleT(expiry); + sts_state.expiry = base::Time::FromDoubleT(expiry.value()); - double sts_observed; - if (parsed->GetDouble(kStsObserved, &sts_observed)) { - sts_state.last_observed = base::Time::FromDoubleT(sts_observed); - } else if (parsed->GetDouble(kCreated, &sts_observed)) { + base::Optional<double> sts_observed = parsed.FindDoubleKey(kStsObserved); + if (sts_observed.has_value()) { + sts_state.last_observed = base::Time::FromDoubleT(sts_observed.value()); + } else if (parsed.FindDoubleKey(kCreated)) { // kCreated is a legacy synonym for both kStsObserved. - sts_state.last_observed = base::Time::FromDoubleT(sts_observed); + sts_observed = parsed.FindDoubleKey(kCreated); + sts_state.last_observed = base::Time::FromDoubleT(sts_observed.value()); } else { // We're migrating an old entry with no observation date. Make sure we // write the new date back in a reasonable time frame. @@ -529,7 +524,7 @@ sts_state.last_observed = base::Time::Now(); } - if (!DeserializeObsoleteExpectCTState(parsed, &expect_ct_state)) { + if (!DeserializeObsoleteExpectCTState(&parsed, &expect_ct_state)) { continue; } @@ -546,7 +541,7 @@ continue; } - std::string hashed = ExternalStringToHashedDomain(i.key()); + std::string hashed = ExternalStringToHashedDomain(i.first); if (hashed.empty()) { dirtied = true; continue;
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc index 716cda2e..18b36ab 100644 --- a/net/http/transport_security_state.cc +++ b/net/http/transport_security_state.cc
@@ -91,21 +91,20 @@ base::UmaHistogramSparse("Net.PublicKeyPinReportSendingFailure2", -net_error); } -std::unique_ptr<base::ListValue> GetPEMEncodedChainAsList( - const net::X509Certificate* cert_chain) { +base::Value GetPEMEncodedChainAsList(const net::X509Certificate* cert_chain) { if (!cert_chain) - return std::make_unique<base::ListValue>(); + return base::Value(base::Value::Type::LIST); - std::unique_ptr<base::ListValue> result(new base::ListValue()); + base::Value result(base::Value::Type::LIST); std::vector<std::string> pem_encoded_chain; cert_chain->GetPEMEncodedChain(&pem_encoded_chain); for (const std::string& cert : pem_encoded_chain) - result->Append(std::make_unique<base::Value>(cert)); + result.Append(cert); return result; } -bool HashReportForCache(const base::DictionaryValue& report, +bool HashReportForCache(const base::Value& report, const GURL& report_uri, std::string* cache_key) { char hashed[crypto::kSHA256Length]; @@ -129,23 +128,23 @@ if (pkp_state.report_uri.is_empty()) return false; - base::DictionaryValue report; + base::Value report(base::Value::Type::DICTIONARY); base::Time now = base::Time::Now(); - report.SetString("hostname", host_port_pair.host()); - report.SetInteger("port", host_port_pair.port()); - report.SetBoolean("include-subdomains", pkp_state.include_subdomains); - report.SetString("noted-hostname", pkp_state.domain); + report.SetStringKey("hostname", host_port_pair.host()); + report.SetIntKey("port", host_port_pair.port()); + report.SetBoolKey("include-subdomains", pkp_state.include_subdomains); + report.SetStringKey("noted-hostname", pkp_state.domain); - std::unique_ptr<base::ListValue> served_certificate_chain_list = + auto served_certificate_chain_list = GetPEMEncodedChainAsList(served_certificate_chain); - std::unique_ptr<base::ListValue> validated_certificate_chain_list = + auto validated_certificate_chain_list = GetPEMEncodedChainAsList(validated_certificate_chain); - report.Set("served-certificate-chain", - std::move(served_certificate_chain_list)); - report.Set("validated-certificate-chain", - std::move(validated_certificate_chain_list)); + report.SetKey("served-certificate-chain", + std::move(served_certificate_chain_list)); + report.SetKey("validated-certificate-chain", + std::move(validated_certificate_chain_list)); - std::unique_ptr<base::ListValue> known_pin_list(new base::ListValue()); + base::Value known_pin_list(base::Value::Type::LIST); for (const auto& hash_value : pkp_state.spki_hashes) { std::string known_pin; @@ -166,11 +165,10 @@ &base64_value); known_pin += "\"" + base64_value + "\""; - known_pin_list->Append( - std::unique_ptr<base::Value>(new base::Value(known_pin))); + known_pin_list.Append(known_pin); } - report.Set("known-pins", std::move(known_pin_list)); + report.SetKey("known-pins", std::move(known_pin_list)); // For the sent reports cache, do not include the effective expiration // date. The expiration date will likely change every time the user @@ -181,9 +179,9 @@ return false; } - report.SetString("date-time", base::TimeToISO8601(now)); - report.SetString("effective-expiration-date", - base::TimeToISO8601(pkp_state.expiry)); + report.SetStringKey("date-time", base::TimeToISO8601(now)); + report.SetStringKey("effective-expiration-date", + base::TimeToISO8601(pkp_state.expiry)); if (!base::JSONWriter::Write(report, serialized_report)) { LOG(ERROR) << "Failed to serialize HPKP violation report."; return false; @@ -456,7 +454,6 @@ const X509Certificate* served_certificate_chain, const X509Certificate* validated_certificate_chain, const PublicKeyPinReportStatus report_status, - const NetworkIsolationKey& network_isolation_key, std::string* pinning_failure_log) { // Perform pin validation only if the server actually has public key pins. if (!HasPublicKeyPins(host_port_pair.host())) { @@ -466,7 +463,7 @@ PKPStatus pin_validity = CheckPublicKeyPinsImpl( host_port_pair, is_issued_by_known_root, public_key_hashes, served_certificate_chain, validated_certificate_chain, report_status, - network_isolation_key, pinning_failure_log); + pinning_failure_log); // Don't track statistics when a local trust anchor would override the pinning // anyway. @@ -748,7 +745,6 @@ const X509Certificate* served_certificate_chain, const X509Certificate* validated_certificate_chain, const TransportSecurityState::PublicKeyPinReportStatus report_status, - const net::NetworkIsolationKey& network_isolation_key, std::string* failure_log) { if (pkp_state.CheckPublicKeyPins(hashes, failure_log)) return PKPStatus::OK; @@ -790,8 +786,7 @@ base::TimeDelta::FromMinutes(kTimeToRememberReportsMins)); report_sender_->Send(pkp_state.report_uri, "application/json; charset=utf-8", - serialized_report, network_isolation_key, - base::OnceCallback<void()>(), + serialized_report, base::OnceCallback<void()>(), base::BindOnce(RecordUMAForHPKPReportFailure)); return PKPStatus::VIOLATED; } @@ -1119,7 +1114,6 @@ const X509Certificate* served_certificate_chain, const X509Certificate* validated_certificate_chain, const PublicKeyPinReportStatus report_status, - const NetworkIsolationKey& network_isolation_key, std::string* failure_log) { PKPState pkp_state; bool found_state = GetPKPState(host_port_pair.host(), &pkp_state); @@ -1130,7 +1124,7 @@ return CheckPinsAndMaybeSendReport( host_port_pair, is_issued_by_known_root, pkp_state, hashes, served_certificate_chain, validated_certificate_chain, report_status, - network_isolation_key, failure_log); + failure_log); } bool TransportSecurityState::GetStaticDomainState(const std::string& host,
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h index ed34c788..da59832 100644 --- a/net/http/transport_security_state.h +++ b/net/http/transport_security_state.h
@@ -303,7 +303,6 @@ virtual void Send(const GURL& report_uri, base::StringPiece content_type, base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, base::OnceCallback<void()> success_callback, base::OnceCallback<void(const GURL&, int /* net_error */, @@ -386,7 +385,6 @@ const X509Certificate* served_certificate_chain, const X509Certificate* validated_certificate_chain, const PublicKeyPinReportStatus report_status, - const NetworkIsolationKey& network_isolation_key, std::string* failure_log); bool HasPublicKeyPins(const std::string& host); @@ -608,7 +606,6 @@ const X509Certificate* served_certificate_chain, const X509Certificate* validated_certificate_chain, const PublicKeyPinReportStatus report_status, - const NetworkIsolationKey& network_isolation_key, std::string* failure_log); // If a Delegate is present, notify it that the internal state has @@ -651,7 +648,6 @@ const X509Certificate* served_certificate_chain, const X509Certificate* validated_certificate_chain, const TransportSecurityState::PublicKeyPinReportStatus report_status, - const net::NetworkIsolationKey& network_isolation_key, std::string* failure_log); // Returns true and updates |*expect_ct_result| iff there is a static
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc index 8ffeb1cf..4b90996 100644 --- a/net/http/transport_security_state_unittest.cc +++ b/net/http/transport_security_state_unittest.cc
@@ -121,34 +121,27 @@ const GURL& report_uri, base::StringPiece content_type, base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, base::OnceCallback<void()> success_callback, base::OnceCallback<void(const GURL&, int, int)> error_callback) override { latest_report_uri_ = report_uri; latest_report_.assign(report.data(), report.size()); latest_content_type_.assign(content_type.data(), content_type.size()); - latest_network_isolation_key_ = network_isolation_key; } void Clear() { latest_report_uri_ = GURL(); latest_report_ = std::string(); latest_content_type_ = std::string(); - latest_network_isolation_key_ = NetworkIsolationKey(); } const GURL& latest_report_uri() { return latest_report_uri_; } const std::string& latest_report() { return latest_report_; } const std::string& latest_content_type() { return latest_content_type_; } - const NetworkIsolationKey& latest_network_isolation_key() { - return latest_network_isolation_key_; - } private: GURL latest_report_uri_; std::string latest_report_; std::string latest_content_type_; - NetworkIsolationKey latest_network_isolation_key_; }; // A mock ReportSenderInterface that simulates a net error on every report sent. @@ -165,7 +158,6 @@ const GURL& report_uri, base::StringPiece content_type, base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, base::OnceCallback<void()> success_callback, base::OnceCallback<void(const GURL&, int, int)> error_callback) override { ASSERT_FALSE(error_callback.is_null()); @@ -336,7 +328,7 @@ } // As with CreateUniqueHostName(), returns a unique NetworkIsolationKey for use -// with Expect-CT pruning tests. +// with Expect-CT prunung tests. NetworkIsolationKey CreateUniqueNetworkIsolationKey(bool is_transient) { if (is_transient) return NetworkIsolationKey::CreateTransient(); @@ -922,8 +914,6 @@ const char kPreloadedPinDomain[] = "with-report-uri-pkp.preloaded.test"; const uint16_t kPort = 443; HostPortPair host_port_pair(kPreloadedPinDomain, kPort); - net::NetworkIsolationKey network_isolation_key = - NetworkIsolationKey::CreateTransient(); TransportSecurityState state; MockCertificateReportSender mock_report_sender; @@ -958,10 +948,9 @@ // Trigger a violation and check that it sends a report. std::string failure_log; EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, - state.CheckPublicKeyPins(host_port_pair, true, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri()); @@ -972,8 +961,6 @@ ASSERT_NO_FATAL_FAILURE(CheckHPKPReport( report, host_port_pair, pkp_state.include_subdomains, pkp_state.domain, cert1.get(), cert2.get(), pkp_state.spki_hashes)); - EXPECT_EQ(network_isolation_key, - mock_report_sender.latest_network_isolation_key()); } // Tests that report URIs are thrown out if they point to the same host, @@ -982,8 +969,6 @@ HostPortPair host_port_pair(kHost, kPort); GURL https_report_uri("https://example.test/report"); GURL http_report_uri("http://example.test/report"); - NetworkIsolationKey network_isolation_key = - NetworkIsolationKey::CreateTransient(); TransportSecurityState state; MockCertificateReportSender mock_report_sender; state.SetReportSender(&mock_report_sender); @@ -1013,24 +998,20 @@ // because the report-uri is HTTPS and same-host as the pins. std::string failure_log; EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, - state.CheckPublicKeyPins(host_port_pair, true, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); EXPECT_TRUE(mock_report_sender.latest_report_uri().is_empty()); // An HTTP report uri to the same host should be okay. state.AddHPKP("example.test", expiry, true, good_hashes, http_report_uri); EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, - state.CheckPublicKeyPins(host_port_pair, true, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); EXPECT_EQ(http_report_uri, mock_report_sender.latest_report_uri()); - EXPECT_EQ(network_isolation_key, - mock_report_sender.latest_network_isolation_key()); } // Tests that static (preloaded) expect CT state is read correctly. @@ -3184,70 +3165,6 @@ HostPortPair host_port_pair(kHost, kPort); HostPortPair subdomain_host_port_pair(kSubdomain, kPort); GURL report_uri(kReportUri); - NetworkIsolationKey network_isolation_key = - NetworkIsolationKey::CreateTransient(); - // Two dummy certs to use as the server-sent and validated chains. The - // contents don't matter. - scoped_refptr<X509Certificate> cert1 = - ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); - ASSERT_TRUE(cert1); - scoped_refptr<X509Certificate> cert2 = - ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"); - ASSERT_TRUE(cert2); - - HashValueVector good_hashes, bad_hashes; - - for (size_t i = 0; kGoodPath[i]; i++) - EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes)); - for (size_t i = 0; kBadPath[i]; i++) - EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes)); - - TransportSecurityState state; - EnableStaticPins(&state); - MockCertificateReportSender mock_report_sender; - state.SetReportSender(&mock_report_sender); - - EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); - EXPECT_EQ(std::string(), mock_report_sender.latest_report()); - - std::string failure_log; - EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, - state.CheckPublicKeyPins(host_port_pair, true, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); - - // A report should have been sent. Check that it contains the - // right information. - EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri()); - std::string report = mock_report_sender.latest_report(); - ASSERT_FALSE(report.empty()); - ASSERT_NO_FATAL_FAILURE(CheckHPKPReport(report, host_port_pair, true, kHost, - cert1.get(), cert2.get(), - good_hashes)); - EXPECT_EQ(network_isolation_key, - mock_report_sender.latest_network_isolation_key()); - mock_report_sender.Clear(); - - // Now trigger the same violation; a duplicative report should not be - // sent. - EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, - state.CheckPublicKeyPins(host_port_pair, true, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); - EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); - EXPECT_EQ(std::string(), mock_report_sender.latest_report()); - EXPECT_EQ(NetworkIsolationKey(), - mock_report_sender.latest_network_isolation_key()); -} - -TEST_F(TransportSecurityStateStaticTest, HPKPReporting) { - HostPortPair host_port_pair(kHost, kPort); - HostPortPair subdomain_host_port_pair(kSubdomain, kPort); - GURL report_uri(kReportUri); - NetworkIsolationKey network_isolation_key = - NetworkIsolationKey::CreateTransient(); // Two dummy certs to use as the server-sent and validated chains. The // contents don't matter. scoped_refptr<X509Certificate> cert1 = @@ -3276,8 +3193,61 @@ EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, state.CheckPublicKeyPins( host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), - TransportSecurityState::DISABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); + + // A report should have been sent. Check that it contains the + // right information. + EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri()); + std::string report = mock_report_sender.latest_report(); + ASSERT_FALSE(report.empty()); + ASSERT_NO_FATAL_FAILURE(CheckHPKPReport(report, host_port_pair, true, kHost, + cert1.get(), cert2.get(), + good_hashes)); + mock_report_sender.Clear(); + + // Now trigger the same violation; a duplicative report should not be + // sent. + EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, + state.CheckPublicKeyPins( + host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); + EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); + EXPECT_EQ(std::string(), mock_report_sender.latest_report()); +} + +TEST_F(TransportSecurityStateStaticTest, HPKPReporting) { + HostPortPair host_port_pair(kHost, kPort); + HostPortPair subdomain_host_port_pair(kSubdomain, kPort); + GURL report_uri(kReportUri); + // Two dummy certs to use as the server-sent and validated chains. The + // contents don't matter. + scoped_refptr<X509Certificate> cert1 = + ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); + ASSERT_TRUE(cert1); + scoped_refptr<X509Certificate> cert2 = + ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"); + ASSERT_TRUE(cert2); + + HashValueVector good_hashes, bad_hashes; + + for (size_t i = 0; kGoodPath[i]; i++) + EXPECT_TRUE(AddHash(kGoodPath[i], &good_hashes)); + for (size_t i = 0; kBadPath[i]; i++) + EXPECT_TRUE(AddHash(kBadPath[i], &bad_hashes)); + + TransportSecurityState state; + EnableStaticPins(&state); + MockCertificateReportSender mock_report_sender; + state.SetReportSender(&mock_report_sender); + + EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); + EXPECT_EQ(std::string(), mock_report_sender.latest_report()); + + std::string failure_log; + EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, + state.CheckPublicKeyPins( + host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::DISABLE_PIN_REPORTS, &failure_log)); // No report should have been sent because of the DISABLE_PIN_REPORTS // argument. @@ -3285,20 +3255,18 @@ EXPECT_EQ(std::string(), mock_report_sender.latest_report()); EXPECT_EQ(TransportSecurityState::PKPStatus::OK, - state.CheckPublicKeyPins(host_port_pair, true, good_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, true, good_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); // No report should have been sent because there was no violation. EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); EXPECT_EQ(std::string(), mock_report_sender.latest_report()); EXPECT_EQ(TransportSecurityState::PKPStatus::BYPASSED, - state.CheckPublicKeyPins(host_port_pair, false, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, false, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); // No report should have been sent because the certificate chained to a // non-public root. @@ -3306,10 +3274,9 @@ EXPECT_EQ(std::string(), mock_report_sender.latest_report()); EXPECT_EQ(TransportSecurityState::PKPStatus::OK, - state.CheckPublicKeyPins(host_port_pair, false, good_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, false, good_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); // No report should have been sent because there was no violation, even though // the certificate chained to a local trust anchor. @@ -3317,10 +3284,9 @@ EXPECT_EQ(std::string(), mock_report_sender.latest_report()); EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, - state.CheckPublicKeyPins(host_port_pair, true, bad_hashes, - cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + state.CheckPublicKeyPins( + host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); // Now a report should have been sent. Check that it contains the // right information. @@ -3337,7 +3303,7 @@ state.CheckPublicKeyPins(subdomain_host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), TransportSecurityState::ENABLE_PIN_REPORTS, - network_isolation_key, &failure_log)); + &failure_log)); // Now a report should have been sent for the subdomain. Check that it // contains the right information. @@ -3349,8 +3315,6 @@ ASSERT_NO_FATAL_FAILURE(CheckHPKPReport(report, subdomain_host_port_pair, true, kHost, cert1.get(), cert2.get(), good_hashes)); - EXPECT_EQ(network_isolation_key, - mock_report_sender.latest_network_isolation_key()); } // Tests that a histogram entry is recorded when TransportSecurityState @@ -3388,8 +3352,7 @@ EXPECT_EQ(TransportSecurityState::PKPStatus::VIOLATED, state.CheckPublicKeyPins( host_port_pair, true, bad_hashes, cert1.get(), cert2.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - NetworkIsolationKey::CreateTransient(), &failure_log)); + TransportSecurityState::ENABLE_PIN_REPORTS, &failure_log)); // Check that the UMA histogram was updated when the report failed to // send.
diff --git a/net/log/net_log_util.cc b/net/log/net_log_util.cc index 56f66e51..980dc11 100644 --- a/net/log/net_log_util.cc +++ b/net/log/net_log_util.cc
@@ -63,25 +63,19 @@ }; const StringToConstant kCertStatusFlags[] = { -#define CERT_STATUS_FLAG(label, value) \ - { #label, value } \ - , +#define CERT_STATUS_FLAG(label, value) {#label, value}, #include "net/cert/cert_status_flags_list.h" #undef CERT_STATUS_FLAG }; const StringToConstant kLoadFlags[] = { -#define LOAD_FLAG(label, value) \ - { #label, value } \ - , +#define LOAD_FLAG(label, value) {#label, value}, #include "net/base/load_flags_list.h" #undef LOAD_FLAG }; const StringToConstant kLoadStateTable[] = { -#define LOAD_STATE(label, value) \ - { #label, LOAD_STATE_##label } \ - , +#define LOAD_STATE(label, value) {#label, LOAD_STATE_##label}, #include "net/base/load_states_list.h" #undef LOAD_STATE }; @@ -412,15 +406,12 @@ *context->http_server_properties(); net_info_dict.SetKey( kNetInfoAltSvcMappings, - base::Value::FromUniquePtrValue( - http_server_properties.GetAlternativeServiceInfoAsValue())); + http_server_properties.GetAlternativeServiceInfoAsValue()); } // Log QUIC info. { - net_info_dict.SetKey(kNetInfoQuic, - base::Value::FromUniquePtrValue( - http_network_session->QuicInfoToValue())); + net_info_dict.SetKey(kNetInfoQuic, http_network_session->QuicInfoToValue()); } // Log HTTP Cache info.
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc index e67bcb29..6c7c05d 100644 --- a/net/quic/crypto/proof_verifier_chromium.cc +++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -496,6 +496,7 @@ // possible values of CheckCTRequirements() are handled. break; } + TransportSecurityState::PKPStatus pin_validity = transport_security_state_->CheckPublicKeyPins( HostPortPair(hostname_, port_), @@ -503,7 +504,6 @@ cert_verify_result.public_key_hashes, cert_.get(), cert_verify_result.verified_cert.get(), TransportSecurityState::ENABLE_PIN_REPORTS, - proof_verifier_->network_isolation_key_, &verify_details_->pinning_failure_log); switch (pin_validity) { case TransportSecurityState::PKPStatus::VIOLATED:
diff --git a/net/quic/crypto/proof_verifier_chromium_test.cc b/net/quic/crypto/proof_verifier_chromium_test.cc index 3480be6..312ae5f 100644 --- a/net/quic/crypto/proof_verifier_chromium_test.cc +++ b/net/quic/crypto/proof_verifier_chromium_test.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/memory/ref_counted.h" -#include "base/strings/string_piece.h" #include "base/test/metrics/histogram_tester.h" #include "net/base/completion_once_callback.h" #include "net/base/net_errors.h" @@ -134,35 +133,6 @@ } // namespace -// A mock ReportSenderInterface that just remembers the latest report -// URI and its NetworkIsolationKey. -class MockCertificateReportSender - : public TransportSecurityState::ReportSenderInterface { - public: - MockCertificateReportSender() = default; - ~MockCertificateReportSender() override = default; - - void Send( - const GURL& report_uri, - base::StringPiece content_type, - base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, - base::OnceCallback<void()> success_callback, - base::OnceCallback<void(const GURL&, int, int)> error_callback) override { - latest_report_uri_ = report_uri; - latest_network_isolation_key_ = network_isolation_key; - } - - const GURL& latest_report_uri() { return latest_report_uri_; } - const NetworkIsolationKey& latest_network_isolation_key() { - return latest_network_isolation_key_; - } - - private: - GURL latest_report_uri_; - NetworkIsolationKey latest_network_isolation_key_; -}; - class ProofVerifierChromiumTest : public ::testing::Test { public: ProofVerifierChromiumTest() @@ -738,65 +708,6 @@ EXPECT_TRUE(verify_details->pkp_bypassed); } -// Test that PKP errors result in sending reports. -TEST_F(ProofVerifierChromiumTest, PKPReport) { - NetworkIsolationKey network_isolation_key = - NetworkIsolationKey::CreateTransient(); - - MockCertificateReportSender report_sender; - transport_security_state_.SetReportSender(&report_sender); - - GURL report_uri("https://foo.test/"); - transport_security_state_.AddHPKP( - kCTAndPKPHost, base::Time::Now() + base::TimeDelta::FromDays(1), - false /* include_subdomains */, - HashValueVector{HashValue(HASH_VALUE_SHA256)}, report_uri); - ScopedTransportSecurityStateSource scoped_security_state_source; - - dummy_result_.is_issued_by_known_root = true; - dummy_result_.public_key_hashes = MakeHashValueVector(0x01); - - MockCertVerifier dummy_verifier; - dummy_verifier.AddResultForCert(test_cert_.get(), dummy_result_, OK); - - ProofVerifierChromium proof_verifier( - &dummy_verifier, &ct_policy_enforcer_, &transport_security_state_, - ct_verifier_.get(), nullptr, {}, network_isolation_key); - - std::unique_ptr<DummyProofVerifierCallback> callback( - new DummyProofVerifierCallback); - quic::QuicAsyncStatus status = proof_verifier.VerifyProof( - kCTAndPKPHost, kTestPort, kTestConfig, kTestTransportVersion, - kTestChloHash, certs_, kTestEmptySCT, GetTestSignature(), - verify_context_.get(), &error_details_, &details_, std::move(callback)); - ASSERT_EQ(quic::QUIC_FAILURE, status); - - ASSERT_TRUE(details_.get()); - ProofVerifyDetailsChromium* verify_details = - static_cast<ProofVerifyDetailsChromium*>(details_.get()); - EXPECT_TRUE(verify_details->cert_verify_result.cert_status & - CERT_STATUS_PINNED_KEY_MISSING); - EXPECT_FALSE(verify_details->pkp_bypassed); - EXPECT_NE("", verify_details->pinning_failure_log); - - callback = std::make_unique<DummyProofVerifierCallback>(); - status = proof_verifier.VerifyCertChain( - kCTAndPKPHost, kTestPort, certs_, kTestEmptyOCSPResponse, kTestEmptySCT, - verify_context_.get(), &error_details_, &details_, std::move(callback)); - ASSERT_EQ(quic::QUIC_FAILURE, status); - - ASSERT_TRUE(details_.get()); - verify_details = static_cast<ProofVerifyDetailsChromium*>(details_.get()); - EXPECT_TRUE(verify_details->cert_verify_result.cert_status & - CERT_STATUS_PINNED_KEY_MISSING); - EXPECT_FALSE(verify_details->pkp_bypassed); - EXPECT_NE("", verify_details->pinning_failure_log); - - EXPECT_EQ(report_uri, report_sender.latest_report_uri()); - EXPECT_EQ(network_isolation_key, - report_sender.latest_network_isolation_key()); -} - // Test that when CT is required (in this case, by the delegate), the // absence of CT information is a socket error. TEST_F(ProofVerifierChromiumTest, CTIsRequired) {
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index d29204c..103bafb2 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -1203,8 +1203,7 @@ host_and_port_, server_cert_verify_result_.is_issued_by_known_root, server_cert_verify_result_.public_key_hashes, server_cert_.get(), server_cert_verify_result_.verified_cert.get(), - TransportSecurityState::ENABLE_PIN_REPORTS, - ssl_config_.network_isolation_key, &pinning_failure_log_); + TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_); switch (pin_validity) { case TransportSecurityState::PKPStatus::VIOLATED: server_cert_verify_result_.cert_status |=
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc index 6eb6fcb3..9556041 100644 --- a/net/spdy/spdy_session.cc +++ b/net/spdy/spdy_session.cc
@@ -885,7 +885,7 @@ HostPortPair(new_hostname, 0), ssl_info.is_issued_by_known_root, ssl_info.public_key_hashes, ssl_info.unverified_cert.get(), ssl_info.cert.get(), TransportSecurityState::DISABLE_PIN_REPORTS, - network_isolation_key, &pinning_failure_log) == + &pinning_failure_log) == TransportSecurityState::PKPStatus::VIOLATED) { return false; }
diff --git a/net/spdy/spdy_session_pool.cc b/net/spdy/spdy_session_pool.cc index 2343ad8..f207996 100644 --- a/net/spdy/spdy_session_pool.cc +++ b/net/spdy/spdy_session_pool.cc
@@ -419,9 +419,8 @@ false /* idle_only */); } -void SpdySessionPool::CloseCurrentIdleSessions() { - CloseCurrentSessionsHelper(ERR_ABORTED, "Closing idle sessions.", - true /* idle_only */); +void SpdySessionPool::CloseCurrentIdleSessions(const std::string& description) { + CloseCurrentSessionsHelper(ERR_ABORTED, description, true /* idle_only */); } void SpdySessionPool::CloseAllSessions() {
diff --git a/net/spdy/spdy_session_pool.h b/net/spdy/spdy_session_pool.h index 5a2caca..9ae9580 100644 --- a/net/spdy/spdy_session_pool.h +++ b/net/spdy/spdy_session_pool.h
@@ -264,7 +264,7 @@ // Close only the currently existing SpdySessions that are idle. // Let any new ones created while this method is running continue to // live. - void CloseCurrentIdleSessions(); + void CloseCurrentIdleSessions(const std::string& description); // Repeatedly close all SpdySessions until all of them (including new ones // created in the process of closing the current ones, and new ones created in
diff --git a/net/spdy/spdy_session_pool_unittest.cc b/net/spdy/spdy_session_pool_unittest.cc index 63bb90c..23ffbe4 100644 --- a/net/spdy/spdy_session_pool_unittest.cc +++ b/net/spdy/spdy_session_pool_unittest.cc
@@ -250,6 +250,7 @@ } TEST_F(SpdySessionPoolTest, CloseCurrentIdleSessions) { + const std::string close_session_description = "Closing idle sessions."; MockConnect connect_data(SYNCHRONOUS, OK); MockRead reads[] = { MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. @@ -318,7 +319,7 @@ EXPECT_TRUE(session3->IsAvailable()); // Should not do anything, all are active - spdy_session_pool_->CloseCurrentIdleSessions(); + spdy_session_pool_->CloseCurrentIdleSessions(close_session_description); EXPECT_TRUE(session1->is_active()); EXPECT_TRUE(session1->IsAvailable()); EXPECT_TRUE(session2->is_active()); @@ -340,7 +341,7 @@ EXPECT_TRUE(session3->IsAvailable()); // Should close session 1 and 3, 2 should be left open - spdy_session_pool_->CloseCurrentIdleSessions(); + spdy_session_pool_->CloseCurrentIdleSessions(close_session_description); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session1); @@ -349,7 +350,7 @@ EXPECT_FALSE(session3); // Should not do anything - spdy_session_pool_->CloseCurrentIdleSessions(); + spdy_session_pool_->CloseCurrentIdleSessions(close_session_description); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(session2->is_active()); @@ -364,7 +365,7 @@ EXPECT_TRUE(session2->IsAvailable()); // This should close session 2 - spdy_session_pool_->CloseCurrentIdleSessions(); + spdy_session_pool_->CloseCurrentIdleSessions(close_session_description); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(session2); @@ -582,7 +583,7 @@ // Test that calling CloseIdleSessions, does not cause a crash. // http://crbug.com/181400 - spdy_session_pool_->CloseCurrentIdleSessions(); + spdy_session_pool_->CloseCurrentIdleSessions("Closing idle sessions."); base::RunLoop().RunUntilIdle(); // Verify spdy_session and spdy_session1 are closed.
diff --git a/net/url_request/report_sender.cc b/net/url_request/report_sender.cc index 269658b..1a04006 100644 --- a/net/url_request/report_sender.cc +++ b/net/url_request/report_sender.cc
@@ -7,7 +7,6 @@ #include <utility> #include "net/base/elements_upload_data_stream.h" -#include "net/base/isolation_info.h" #include "net/base/load_flags.h" #include "net/base/request_priority.h" #include "net/base/upload_bytes_element_reader.h" @@ -59,7 +58,6 @@ void ReportSender::Send(const GURL& report_uri, base::StringPiece content_type, base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, SuccessCallback success_callback, ErrorCallback error_callback) { DCHECK(!content_type.empty()); @@ -68,10 +66,9 @@ url_request->SetUserData( &kUserDataKey, std::make_unique<CallbackInfo>(std::move(success_callback), std::move(error_callback))); + url_request->SetLoadFlags(kLoadFlags); url_request->set_allow_credentials(false); - url_request->set_isolation_info(IsolationInfo::CreatePartial( - IsolationInfo::RequestType::kOther, network_isolation_key)); HttpRequestHeaders extra_headers; extra_headers.SetHeader(HttpRequestHeaders::kContentType, content_type);
diff --git a/net/url_request/report_sender.h b/net/url_request/report_sender.h index 7e2f57c..1e40236 100644 --- a/net/url_request/report_sender.h +++ b/net/url_request/report_sender.h
@@ -20,7 +20,6 @@ namespace net { -class NetworkIsolationKey; class URLRequestContext; // ReportSender asynchronously sends serialized reports to a URI. @@ -28,9 +27,6 @@ // the format of the report being sent (JSON, protobuf, etc.) and the particular // data that it contains. Multiple reports can be in-flight at once. This class // owns inflight requests and cleans them up when necessary. -// -// Despite this class's name, it has nothing to do with the Reporting API, -// which is implemented in net/reporting. class NET_EXPORT ReportSender : public URLRequest::Delegate, public TransportSecurityState::ReportSenderInterface { @@ -53,7 +49,6 @@ void Send(const GURL& report_uri, base::StringPiece content_type, base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, SuccessCallback success_callback, ErrorCallback error_callback) override;
diff --git a/net/url_request/report_sender_unittest.cc b/net/url_request/report_sender_unittest.cc index da2bda3..c921c6cc 100644 --- a/net/url_request/report_sender_unittest.cc +++ b/net/url_request/report_sender_unittest.cc
@@ -143,11 +143,6 @@ expected_content_type_ = content_type; } - void set_expected_network_isolation_key( - const NetworkIsolationKey& expected_network_isolation_key) { - expected_network_isolation_key_ = expected_network_isolation_key; - } - // NetworkDelegateImpl implementation. int OnBeforeURLRequest(URLRequest* request, CompletionOnceCallback callback, @@ -158,12 +153,6 @@ EXPECT_FALSE(request->allow_credentials()); EXPECT_TRUE(request->load_flags() & LOAD_DO_NOT_SAVE_COOKIES); - EXPECT_EQ(expected_network_isolation_key_, - request->isolation_info().network_isolation_key()); - EXPECT_EQ(IsolationInfo::RequestType::kOther, - request->isolation_info().request_type()); - EXPECT_TRUE(request->site_for_cookies().IsNull()); - const HttpRequestHeaders& extra_headers = request->extra_request_headers(); std::string content_type; EXPECT_TRUE(extra_headers.GetHeader(HttpRequestHeaders::kContentType, @@ -190,7 +179,6 @@ GURL expect_url_; std::set<std::string> expect_reports_; std::string expected_content_type_; - NetworkIsolationKey expected_network_isolation_key_; DISALLOW_COPY_AND_ASSIGN(TestReportSenderNetworkDelegate); }; @@ -223,9 +211,6 @@ size_t request_sequence_number, base::OnceCallback<void()> success_callback, base::OnceCallback<void(const GURL&, int, int)> error_callback) { - NetworkIsolationKey network_isolation_key = - NetworkIsolationKey::CreateTransient(); - base::RunLoop run_loop; network_delegate_.set_url_request_destroyed_callback( run_loop.QuitClosure()); @@ -233,11 +218,10 @@ network_delegate_.set_expect_url(url); network_delegate_.ExpectReport(report); network_delegate_.set_expected_content_type("application/foobar"); - network_delegate_.set_expected_network_isolation_key(network_isolation_key); EXPECT_EQ(request_sequence_number, network_delegate_.num_requests()); - reporter->Send(url, "application/foobar", report, network_isolation_key, + reporter->Send(url, "application/foobar", report, std::move(success_callback), std::move(error_callback)); // The report is sent asynchronously, so wait for the report's @@ -293,11 +277,11 @@ EXPECT_EQ(0u, network_delegate_.num_requests()); - reporter.Send(url, "application/foobar", kDummyReport, NetworkIsolationKey(), + reporter.Send(url, "application/foobar", kDummyReport, base::OnceCallback<void()>(), base::OnceCallback<void(const GURL&, int, int)>()); reporter.Send(url, "application/foobar", kSecondDummyReport, - NetworkIsolationKey(), base::OnceCallback<void()>(), + base::OnceCallback<void()>(), base::OnceCallback<void(const GURL&, int, int)>()); run_loop.Run(); @@ -322,7 +306,7 @@ std::unique_ptr<ReportSender> reporter( new ReportSender(context(), TRAFFIC_ANNOTATION_FOR_TESTS)); - reporter->Send(url, "application/foobar", kDummyReport, NetworkIsolationKey(), + reporter->Send(url, "application/foobar", kDummyReport, base::OnceCallback<void()>(), base::OnceCallback<void(const GURL&, int, int)>()); reporter.reset();
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index a1b676ff..8464322 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -640,26 +640,20 @@ const GURL& report_uri, base::StringPiece content_type, base::StringPiece report, - const NetworkIsolationKey& network_isolation_key, base::OnceCallback<void()> success_callback, base::OnceCallback<void(const GURL&, int, int)> error_callback) override { latest_report_uri_ = report_uri; latest_report_.assign(report.data(), report.size()); latest_content_type_.assign(content_type.data(), content_type.size()); - latest_network_isolation_key_ = network_isolation_key; } const GURL& latest_report_uri() { return latest_report_uri_; } const std::string& latest_report() { return latest_report_; } const std::string& latest_content_type() { return latest_content_type_; } - const NetworkIsolationKey& latest_network_isolation_key() { - return latest_network_isolation_key_; - } private: GURL latest_report_uri_; std::string latest_report_; std::string latest_content_type_; - NetworkIsolationKey latest_network_isolation_key_; }; // OCSPErrorTestDelegate caches the SSLInfo passed to OnSSLCertificateError. @@ -2879,12 +2873,7 @@ origin2_(url::Origin::Create(GURL("https://bar.test/"))), isolation_info1_(IsolationInfo::CreateForInternalRequest(origin1_)), isolation_info2_(IsolationInfo::CreateForInternalRequest(origin2_)), - test_server_(base::FilePath(kTestFilePath)) { - // Needed for NetworkIsolationKey to make it down to the socket layer, for - // the PKP violation report test. - feature_list_.InitAndEnableFeature( - net::features::kPartitionConnectionsByNetworkIsolationKey); - } + test_server_(base::FilePath(kTestFilePath)) {} protected: // ProtocolHandler for the scheme that's unsafe to redirect to. @@ -3047,8 +3036,6 @@ HttpTestServer* http_test_server() { return &test_server_; } private: - base::test::ScopedFeatureList feature_list_; - HttpTestServer test_server_; }; @@ -5209,14 +5196,11 @@ context.set_cert_verifier(&cert_verifier); context.Init(); - IsolationInfo isolation_info = IsolationInfo::CreateTransient(); - // Now send a request to trigger the violation. TestDelegate d; std::unique_ptr<URLRequest> violating_request(context.CreateRequest( https_test_server.GetURL(test_server_hostname, "/simple.html"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); - violating_request->set_isolation_info(isolation_info); violating_request->Start(); d.RunUntilComplete(); @@ -5234,8 +5218,6 @@ std::string report_hostname; EXPECT_TRUE(report_dict->GetString("hostname", &report_hostname)); EXPECT_EQ(test_server_hostname, report_hostname); - EXPECT_EQ(isolation_info.network_isolation_key(), - mock_report_sender.latest_network_isolation_key()); } // Tests that reports do not get sent on requests to static pkp hosts that @@ -5281,7 +5263,6 @@ std::unique_ptr<URLRequest> request(context.CreateRequest( https_test_server.GetURL(test_server_hostname, "/simple.html"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); - request->set_isolation_info(IsolationInfo::CreateTransient()); request->Start(); d.RunUntilComplete(); @@ -5290,8 +5271,6 @@ EXPECT_EQ(OK, d.request_status()); EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); EXPECT_EQ(std::string(), mock_report_sender.latest_report()); - EXPECT_EQ(NetworkIsolationKey(), - mock_report_sender.latest_network_isolation_key()); TransportSecurityState::STSState sts_state; TransportSecurityState::PKPState pkp_state; EXPECT_TRUE(security_state.GetStaticDomainState(test_server_hostname, @@ -5342,7 +5321,6 @@ std::unique_ptr<URLRequest> request(context.CreateRequest( https_test_server.GetURL(test_server_hostname, "/simple.html"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS)); - request->set_isolation_info(IsolationInfo::CreateTransient()); request->Start(); d.RunUntilComplete(); @@ -5351,8 +5329,6 @@ EXPECT_EQ(OK, d.request_status()); EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri()); EXPECT_EQ(std::string(), mock_report_sender.latest_report()); - EXPECT_EQ(NetworkIsolationKey(), - mock_report_sender.latest_network_isolation_key()); TransportSecurityState::STSState sts_state; TransportSecurityState::PKPState pkp_state; EXPECT_TRUE(security_state.GetStaticDomainState(test_server_hostname,
diff --git a/services/network/expect_ct_reporter.cc b/services/network/expect_ct_reporter.cc index 5055242..ff6bbf0d 100644 --- a/services/network/expect_ct_reporter.cc +++ b/services/network/expect_ct_reporter.cc
@@ -230,10 +230,11 @@ return; } + // TODO(https://crbug.com/993805): Pass in preflight->network_isolation_key, + // once reporting API accepts NetworkIsolationKeys. report_sender_->Send(preflight->report_uri, "application/expect-ct-report+json; charset=utf-8", - preflight->serialized_report, - preflight->network_isolation_key, success_callback_, + preflight->serialized_report, success_callback_, // Since |this| owns the |report_sender_|, it's safe to // use base::Unretained here: |report_sender_| will be // destroyed before |this|.
diff --git a/services/network/expect_ct_reporter_unittest.cc b/services/network/expect_ct_reporter_unittest.cc index 4eed0b4..e2fc979 100644 --- a/services/network/expect_ct_reporter_unittest.cc +++ b/services/network/expect_ct_reporter_unittest.cc
@@ -52,7 +52,6 @@ const GURL& report_uri, base::StringPiece content_type, base::StringPiece serialized_report, - const net::NetworkIsolationKey& network_isolation_key, base::OnceCallback<void()> success_callback, base::OnceCallback<void(const GURL&, int, int)> error_callback) override { sent_report_count_++; @@ -60,7 +59,6 @@ latest_serialized_report_.assign(serialized_report.data(), serialized_report.size()); latest_content_type_.assign(content_type.data(), content_type.size()); - latest_network_isolation_key_ = network_isolation_key; if (!report_callback_.is_null()) { EXPECT_EQ(expected_report_uri_, latest_report_uri_); std::move(report_callback_).Run(); @@ -79,10 +77,6 @@ return latest_serialized_report_; } - const net::NetworkIsolationKey latest_network_isolation_key() const { - return latest_network_isolation_key_; - } - // Can be called to wait for a single report, which is expected to be sent to // |report_uri|. Returns immediately if a report has already been sent in the // past. @@ -102,7 +96,6 @@ GURL latest_report_uri_; std::string latest_content_type_; std::string latest_serialized_report_; - net::NetworkIsolationKey latest_network_isolation_key_; base::OnceClosure report_callback_; GURL expected_report_uri_; }; @@ -447,13 +440,11 @@ const GURL fail_report_uri = test_server().GetURL(fail_path); const GURL successful_report_uri = test_server().GetURL(successful_path); - const net::NetworkIsolationKey network_isolation_key = - net::NetworkIsolationKey::CreateTransient(); reporter->OnExpectCTFailed( host_port, fail_report_uri, base::Time(), ssl_info.cert.get(), ssl_info.unverified_cert.get(), ssl_info.signed_certificate_timestamps, - network_isolation_key); + net::NetworkIsolationKey()); bad_cors_run_loop.Run(); // The CORS preflight response may not even have been received yet, so // these expectations are mostly aspirational. @@ -468,10 +459,9 @@ reporter->OnExpectCTFailed( host_port, successful_report_uri, base::Time(), ssl_info.cert.get(), ssl_info.unverified_cert.get(), ssl_info.signed_certificate_timestamps, - network_isolation_key); + net::NetworkIsolationKey()); sender->WaitForReport(successful_report_uri); EXPECT_EQ(successful_report_uri, sender->latest_report_uri()); - EXPECT_EQ(network_isolation_key, sender->latest_network_isolation_key()); EXPECT_EQ(1, sender->sent_report_count()); }
diff --git a/services/network/http_server_properties_pref_delegate.cc b/services/network/http_server_properties_pref_delegate.cc index 8dda6b2..1bac16b 100644 --- a/services/network/http_server_properties_pref_delegate.cc +++ b/services/network/http_server_properties_pref_delegate.cc
@@ -27,13 +27,13 @@ pref_registry->RegisterDictionaryPref(kPrefPath); } -const base::DictionaryValue* -HttpServerPropertiesPrefDelegate::GetServerProperties() const { - return pref_service_->GetDictionary(kPrefPath); +const base::Value* HttpServerPropertiesPrefDelegate::GetServerProperties() + const { + return pref_service_->Get(kPrefPath); } void HttpServerPropertiesPrefDelegate::SetServerProperties( - const base::DictionaryValue& value, + const base::Value& value, base::OnceClosure callback) { pref_service_->Set(kPrefPath, value); if (callback)
diff --git a/services/network/http_server_properties_pref_delegate.h b/services/network/http_server_properties_pref_delegate.h index 47fd481..76357102 100644 --- a/services/network/http_server_properties_pref_delegate.h +++ b/services/network/http_server_properties_pref_delegate.h
@@ -25,8 +25,8 @@ static void RegisterPrefs(PrefRegistrySimple* pref_registry); // net::HttpServerProperties::PrefDelegate implementation. - const base::DictionaryValue* GetServerProperties() const override; - void SetServerProperties(const base::DictionaryValue& value, + const base::Value* GetServerProperties() const override; + void SetServerProperties(const base::Value& value, base::OnceClosure callback) override; void WaitForPrefLoad(base::OnceClosure callback) override;
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 4d71d05d..0b988b1 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -58111,7 +58111,6 @@ "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58242,7 +58241,6 @@ "test_id_prefix": "ninja://components:components_browsertests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58302,7 +58300,6 @@ "args": [ "--enable-features=StorageServiceOutOfProcess" ], - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58431,7 +58428,6 @@ "test_id_prefix": "ninja://ui/events:events_unittests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58453,7 +58449,6 @@ "args": [ "--enable-features=StorageServiceOutOfProcess" ], - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58473,7 +58468,6 @@ "test_id_prefix": "ninja://extensions:extensions_browsertests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58618,7 +58612,6 @@ "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58641,7 +58634,6 @@ "args": [ "--enable-features=StorageServiceOutOfProcess" ], - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59184,7 +59176,6 @@ "test_id_prefix": "ninja://storage:storage_unittests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59257,7 +59248,6 @@ "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -59294,7 +59284,6 @@ "test_id_prefix": "ninja://url:url_unittests/" }, { - "experiment_percentage": 100, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 035dc054..64cecb8e 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10633,6 +10633,42 @@ } ] }, + "Linux FYI Release (AMD RX 5500 XT)": { + "isolated_scripts": [ + { + "args": [ + "noop_sleep", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "noop_sleep_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:7340", + "os": "Ubuntu", + "pool": "chromium.tests.gpu.experimental" + } + ], + "expiration": 21600, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + } + ] + }, "Linux FYI Release (Intel HD 630)": { "gtest_tests": [ { @@ -28159,6 +28195,42 @@ } ] }, + "Win10 FYI x64 Release (AMD RX 5500 XT)": { + "isolated_scripts": [ + { + "args": [ + "noop_sleep", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "noop_sleep_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:7340", + "os": "Windows-10", + "pool": "chromium.tests.gpu.experimental" + } + ], + "expiration": 21600, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + } + ] + }, "Win10 FYI x64 Release (Intel HD 630)": { "gtest_tests": [ {
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index ad94779..4824b99 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -404,6 +404,15 @@ }, }, }, + 'linux_amd_rx_5500_xt': { + 'swarming': { + 'dimensions': { + 'gpu': '1002:7340', + 'os': 'Ubuntu', + 'pool': 'chromium.tests.gpu.experimental', + }, + }, + }, 'linux_intel_hd_530': { 'swarming': { 'dimensions': { @@ -868,6 +877,15 @@ }, }, }, + 'win10_amd_rx_5500_xt': { + 'swarming': { + 'dimensions': { + 'gpu': '1002:7340', + 'os': 'Windows-10', + 'pool': 'chromium.tests.gpu.experimental', + }, + }, + }, 'win10_gce_gpu_pool': { 'swarming': { 'dimensions': {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index a22a29ca..b7fc8698 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -636,9 +636,6 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/lacros.browser_tests.filter', ], }, - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, 'linux-lacros-tester-rel': { 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/lacros.browser_tests.filter', @@ -965,10 +962,6 @@ ], }, # https://crbug.com/1111979, - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, - # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [ '--gtest_filter=-NetExportFileWriterTest*', @@ -1275,10 +1268,6 @@ 'Win10 Tests x64 (dbg)': { 'experiment_percentage': 100, # https://crbug.com/876615 }, - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [ @@ -1288,11 +1277,7 @@ }, }, 'extensions_unittests': { - # https://crbug.com/1111979 'modifications': { - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [ @@ -1591,10 +1576,6 @@ ], }, # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, - # https://crbug.com/1111979 'linux-lacros-tester-rel': { 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/lacros.interactive_ui_tests.filter', @@ -2521,10 +2502,6 @@ 'shards': 6, }, }, - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'experiment_percentage': 100, @@ -2539,10 +2516,6 @@ }, 'storage_service_extensions_browsertests': { 'modifications': { - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [ @@ -2562,10 +2535,6 @@ '--gtest_filter=-SadTabViewInteractiveUITest.ReloadMultipleSadTabs', ], }, - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, } }, 'swiftshader_unittests': { @@ -2621,10 +2590,6 @@ 'shards': 4, }, }, - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [ @@ -2823,10 +2788,6 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/lacros.unit_tests.filter', ], }, - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [ @@ -2853,10 +2814,6 @@ }, 'views_unittests': { 'modifications': { - # https://crbug.com/1111979 - 'linux-lacros-tester-fyi-rel': { - 'experiment_percentage': 100, - }, # https://crbug.com/1111979, 'linux-lacros-tester-rel': { 'args': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 882f11a3..14466e4 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -3820,6 +3820,20 @@ 'gpu_telemetry_tests': 'gpu_fyi_linux_release_telemetry_tests', }, }, + 'Linux FYI Release (AMD RX 5500 XT)': { + 'os_type': 'linux', + 'browser_config': 'release', + # There are only two bots of this type in the Swarming pool right now, + # so we have to increase the default expiration time of 1 hour + # to prevent webgl2_conformance_tests' shards from timing out. + 'mixins': [ + 'limited_capacity_bot', + 'linux_amd_rx_5500_xt', + ], + 'test_suites': { + 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', + }, + }, 'Linux FYI Release (Intel HD 630)': { 'os_type': 'linux', 'browser_config': 'release', @@ -4260,6 +4274,19 @@ 'gpu_telemetry_tests': 'gpu_fyi_win_nvidia_amd_release_telemetry_tests', }, }, + 'Win10 FYI x64 Release (AMD RX 5500 XT)': { + # This bot currently only has two pieces of hardware behind it, + # and is being qualified for potential scale-out. + 'os_type': 'win', + 'browser_config': 'release_x64', + 'mixins': [ + 'limited_capacity_bot', + 'win10_amd_rx_5500_xt', + ], + 'test_suites': { + 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', + }, + }, 'Win10 FYI x64 Release (Intel HD 630)': { 'os_type': 'win', 'browser_config': 'release_x64',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 0747b89..592ade06 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -4707,6 +4707,8 @@ "OmniboxDynamicMaxAutocompleteUrlCutoff": "2", "OmniboxLocalZeroSuggestAgeThreshold": "7", "OmniboxMaxURLMatches": "7", + "RichAutocompletionAutocompleteNonPrefixAll": "true", + "RichAutocompletionAutocompleteTitles": "true", "UIMaxAutocompleteMatches": "8" }, "enable_features": [ @@ -4721,6 +4723,7 @@ "OmniboxReactiveZeroSuggestionsOnNTPOmnibox", "OmniboxReactiveZeroSuggestionsOnNTPRealbox", "OmniboxRemoveSuggestionsFromClipboard", + "OmniboxRichAutocompletion", "OmniboxRichEntitySuggestions", "OmniboxTrendingZeroPrefixSuggestionsOnNTP", "OmniboxUIExperimentMaxAutocompleteMatches",
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn index fc0c7c7..d4577dd 100644 --- a/third_party/blink/common/BUILD.gn +++ b/third_party/blink/common/BUILD.gn
@@ -137,6 +137,7 @@ "messaging/transferable_message_mojom_traits.cc", "messaging/web_message_port.cc", "mime_util/mime_util.cc", + "mobile_metrics/mobile_friendliness.cc", "notifications/notification_mojom_traits.cc", "notifications/notification_resources.cc", "notifications/platform_notification_data.cc",
diff --git a/third_party/blink/common/mobile_metrics/OWNERS b/third_party/blink/common/mobile_metrics/OWNERS new file mode 100644 index 0000000..d5fefd8 --- /dev/null +++ b/third_party/blink/common/mobile_metrics/OWNERS
@@ -0,0 +1,2 @@ +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/common/mobile_metrics/mobile_friendliness.cc b/third_party/blink/common/mobile_metrics/mobile_friendliness.cc new file mode 100644 index 0000000..d033c172 --- /dev/null +++ b/third_party/blink/common/mobile_metrics/mobile_friendliness.cc
@@ -0,0 +1,16 @@ +// Copyright 2020 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 "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" + +namespace blink { + +bool MobileFriendliness::operator==(const MobileFriendliness& other) const { + return viewport_device_width == other.viewport_device_width && + viewport_initial_scale == other.viewport_initial_scale && + viewport_hardcoded_width == other.viewport_hardcoded_width && + allow_user_zoom == other.allow_user_zoom; +} + +} // namespace blink
diff --git a/third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.cc b/third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.cc new file mode 100644 index 0000000..555d07a8 --- /dev/null +++ b/third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.cc
@@ -0,0 +1,23 @@ +// Copyright 2020 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 "third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.h" +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" + +namespace mojo { + +bool StructTraits<blink::mojom::MobileFriendlinessDataView, + blink::MobileFriendliness>:: + Read(blink::mojom::MobileFriendlinessDataView data, + blink::MobileFriendliness* mf) { + if (data.viewport_initial_scale() < 0 || data.viewport_hardcoded_width() < 0) + return false; + mf->viewport_device_width = data.viewport_device_width(); + mf->viewport_initial_scale = data.viewport_initial_scale(); + mf->viewport_hardcoded_width = data.viewport_hardcoded_width(); + mf->allow_user_zoom = data.allow_user_zoom(); + return true; +} + +} // namespace mojo
diff --git a/third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.h b/third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.h new file mode 100644 index 0000000..a75191bf --- /dev/null +++ b/third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.h
@@ -0,0 +1,35 @@ +// Copyright 2020 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 THIRD_PARTY_BLINK_COMMON_MOBILE_METRICS_MOBILE_FRIENDLINESS_MOJOM_TRAITS_H_ +#define THIRD_PARTY_BLINK_COMMON_MOBILE_METRICS_MOBILE_FRIENDLINESS_MOJOM_TRAITS_H_ + +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" +#include "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom-shared.h" + +namespace mojo { + +template <> +class StructTraits<blink::mojom::MobileFriendlinessDataView, + blink::MobileFriendliness> { + public: + static bool viewport_device_width(const blink::MobileFriendliness& mf) { + return mf.viewport_device_width; + } + static double viewport_initial_scale(const blink::MobileFriendliness& mf) { + return mf.viewport_initial_scale; + } + static int viewport_hardcoded_width(const blink::MobileFriendliness& mf) { + return mf.viewport_hardcoded_width; + } + static bool allow_user_zoom(const blink::MobileFriendliness& mf) { + return mf.allow_user_zoom; + } + static bool Read(blink::mojom::MobileFriendlinessDataView data, + blink::MobileFriendliness* mf); +}; + +} // namespace mojo + +#endif // THIRD_PARTY_BLINK_COMMON_MOBILE_METRICS_MOBILE_FRIENDLINESS_MOJOM_TRAITS_H_
diff --git a/third_party/blink/perf_tests/dom/custom-element-default-style-with-shadow.html b/third_party/blink/perf_tests/dom/custom-element-default-style-with-shadow.html index 7d4644f..0b9115e 100644 --- a/third_party/blink/perf_tests/dom/custom-element-default-style-with-shadow.html +++ b/third_party/blink/perf_tests/dom/custom-element-default-style-with-shadow.html
@@ -12,23 +12,17 @@ } }); -PerfTestRunner.measureTime({ +PerfTestRunner.measureRunsPerSecond({ description: "Measures performance of styling custom elements with shadowRoot's innerHTML.", - setup: function() { - while (holderElement.innerHTML = '') { - holderElement.removeChild(holderElement.firstChild); - } - }, - run: function() { + holderElement.textContent = ''; for (i = 0; i < 100; i++) { holderElement.appendChild(document.createElement('my-element')); // force layout. document.body.offsetWidth; } }, - warmUpCount: 3, - iterationCount: 500, + warmUpCount: 1, }); </script>
diff --git a/third_party/blink/perf_tests/dom/custom-element-default-style.html b/third_party/blink/perf_tests/dom/custom-element-default-style.html index c46b0f6..113618c 100644 --- a/third_party/blink/perf_tests/dom/custom-element-default-style.html +++ b/third_party/blink/perf_tests/dom/custom-element-default-style.html
@@ -13,23 +13,18 @@ } }, { style: constructedStyleSheet }); -PerfTestRunner.measureTime({ +PerfTestRunner.measureRunsPerSecond({ description: "Measures performance of styling custom elements with default style.", - setup: function() { - while (holderElement.innerHTML = '') { - holderElement.removeChild(holderElement.firstChild); - } - }, - run: function() { + holderElement.textContent = ''; for (i = 0; i < 100; i++) { holderElement.appendChild(document.createElement('element-constructed')); // force layout. document.body.offsetWidth; } }, - warmUpCount: 3, - iterationCount: 500, + + warmUpCount: 1, }); </script>
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn index 4316e9d..fe791255 100644 --- a/third_party/blink/public/common/BUILD.gn +++ b/third_party/blink/public/common/BUILD.gn
@@ -152,6 +152,7 @@ "metrics/document_update_reason.h", "metrics/form_element_pii_type.h", "mime_util/mime_util.h", + "mobile_metrics/mobile_friendliness.h", "navigation/triggering_event_info.h", "notifications/notification_constants.h", "notifications/notification_mojom_traits.h",
diff --git a/third_party/blink/public/common/mobile_metrics/mobile_friendliness.h b/third_party/blink/public/common/mobile_metrics/mobile_friendliness.h new file mode 100644 index 0000000..26fbe826 --- /dev/null +++ b/third_party/blink/public/common/mobile_metrics/mobile_friendliness.h
@@ -0,0 +1,42 @@ +// Copyright 2020 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_MOBILE_METRICS_MOBILE_FRIENDLINESS_H_ +#define THIRD_PARTY_BLINK_PUBLIC_COMMON_MOBILE_METRICS_MOBILE_FRIENDLINESS_H_ + +#include "third_party/blink/public/common/common_export.h" + +namespace blink { + +// This structure contains extracted mobile friendliness metrics from the page. +// Used for UKM logging. +struct BLINK_COMMON_EXPORT MobileFriendliness { + MobileFriendliness() = default; + MobileFriendliness(const MobileFriendliness&) = default; + + bool operator==(const MobileFriendliness& other) const; + bool operator!=(const MobileFriendliness& other) const { + return !(*this == other); + } + + // Whether <meta name="viewport" content="width=device-width"> is specified or + // not. + bool viewport_device_width = false; + + // The value specified in meta tag like <meta name="viewport" + // content="initial-scale=1.0">. + double viewport_initial_scale = 0; + + // The value specified in meta tag like <meta name="viewport" + // content="width=500">. + int viewport_hardcoded_width = 0; + + // Whether the page allows user to zoom in/out. + // It is specified like <meta name="viewport" content="user-scalable=no">. + bool allow_user_zoom = true; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_MOBILE_METRICS_MOBILE_FRIENDLINESS_H_
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 3f46238a..21de602c 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -4485,6 +4485,39 @@ corp-not-same-origin-after-defaulted-to-same-origin-by-coep corp-not-same-site + # The reason why request was blocked. + type CorsError extends string + enum + DisallowedByMode + InvalidResponse + WildcardOriginNotAllowed + MissingAllowOriginHeader + MultipleAllowOriginValues + InvalidAllowOriginValue + AllowOriginMismatch + InvalidAllowCredentials + CorsDisabledScheme + PreflightInvalidStatus + PreflightDisallowedRedirect + PreflightWildcardOriginNotAllowed + PreflightMissingAllowOriginHeader + PreflightMultipleAllowOriginValues + PreflightInvalidAllowOriginValue + PreflightAllowOriginMismatch + PreflightInvalidAllowCredentials + PreflightMissingAllowExternal + PreflightInvalidAllowExternal + InvalidAllowMethodsPreflightResponse + InvalidAllowHeadersPreflightResponse + MethodDisallowedByPreflightResponse + HeaderDisallowedByPreflightResponse + RedirectContainsCredentials + + type CorsErrorStatus extends object + properties + CorsError corsError + string failedParameter + # Source of serviceworker response. type ServiceWorkerResponseSource extends string enum @@ -5235,6 +5268,8 @@ optional boolean canceled # The reason why loading was blocked, if any. optional BlockedReason blockedReason + # The reason why loading was blocked by CORS, if any. + optional CorsErrorStatus corsErrorStatus # Fired when HTTP request has finished loading. event loadingFinished
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 0a0ca47..a1e16377 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -1315,3 +1315,20 @@ export_define = "BLINK_COMMON_IMPLEMENTATION=1" export_header = "third_party/blink/public/common/common_export.h" } + +mojom("mobile_metrics") { + sources = [ "mobile_metrics/mobile_friendliness.mojom" ] + cpp_typemaps = [ + { + types = [ + { + mojom = "blink.mojom.MobileFriendliness" + cpp = "::blink::MobileFriendliness" + }, + ] + traits_headers = [ "//third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.h" ] + traits_sources = [ "//third_party/blink/common/mobile_metrics/mobile_friendliness_mojom_traits.cc" ] + traits_public_deps = [ "//third_party/blink/public/common:headers" ] + }, + ] +}
diff --git a/third_party/blink/public/mojom/mediastream/media_stream.mojom b/third_party/blink/public/mojom/mediastream/media_stream.mojom index 10b7e719..25733c6 100644 --- a/third_party/blink/public/mojom/mediastream/media_stream.mojom +++ b/third_party/blink/public/mojom/mediastream/media_stream.mojom
@@ -70,6 +70,12 @@ FORCE_NEW_STREAM, }; +// Type of state change for the corresponding requests. +enum MediaStreamStateChange { + PLAY, + PAUSE, +}; + // See MediaStreamDispatcherHost below for information. struct StreamSelectionInfo { StreamSelectionStrategy strategy; @@ -108,12 +114,14 @@ }; // Per-frame renderer-side interface that receives device stopped/change -// notifications from the browser process. +// notifications or pause requests from the browser process. interface MediaStreamDeviceObserver { OnDeviceStopped(string label, MediaStreamDevice device); OnDeviceChanged(string label, MediaStreamDevice old_device, MediaStreamDevice new_device); + // Requests to pause or resume the corresponding media stream device. + OnDeviceRequestStateChange(string label, MediaStreamDevice device, MediaStreamStateChange new_state); }; // Per-frame browser-side interface that is used by the renderer process to
diff --git a/third_party/blink/public/mojom/mobile_metrics/OWNERS b/third_party/blink/public/mojom/mobile_metrics/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/third_party/blink/public/mojom/mobile_metrics/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom b/third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom new file mode 100644 index 0000000..ef0a990 --- /dev/null +++ b/third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom
@@ -0,0 +1,21 @@ +// Copyright 2020 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. + +module blink.mojom; + +// Metrics about mobile friendliness for UpdateTiming call. +struct MobileFriendliness { + // Whether <meta name="viewport" content="width=device-width"> is specified or + // not. + bool viewport_device_width = false; + + // The value specified in viewport initial-scale in meta tag. + double viewport_initial_scale = 0; + + // The value specified in viewport width in meta tag. + int32 viewport_hardcoded_width = 0; + + // Whether the page allows user to zoom in/out. + bool allow_user_zoom = true; +}; \ No newline at end of file
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index 9b64905..d641219 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3040,6 +3040,8 @@ kBarcodeDetectorDetect = 3711, kFaceDetectorDetect = 3712, kTextDetectorDetect = 3713, + kLocalStorageFirstUsedBeforeFcp = 3714, + kLocalStorageFirstUsedAfterFcp = 3715, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/modules/mediastream/media_stream_video_source.h b/third_party/blink/public/web/modules/mediastream/media_stream_video_source.h index eeb14337..8259b7b 100644 --- a/third_party/blink/public/web/modules/mediastream/media_stream_video_source.h +++ b/third_party/blink/public/web/modules/mediastream/media_stream_video_source.h
@@ -169,6 +169,8 @@ bool IsRunning() const { return state_ == STARTED; } + bool IsStoppedForRestart() const { return state_ == STOPPED_FOR_RESTART; } + size_t NumTracks() const { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); return tracks_.size();
diff --git a/third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h b/third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h index 5ffeb7e..dc25adc 100644 --- a/third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h +++ b/third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h
@@ -29,11 +29,16 @@ using OnDeviceChangedCb = base::RepeatingCallback<void(const MediaStreamDevice& old_device, const MediaStreamDevice& new_device)>; - void AddStream(const WebString& label, - const MediaStreamDevices& audio_devices, - const MediaStreamDevices& video_devices, - OnDeviceStoppedCb on_device_stopped_cb, - OnDeviceChangedCb on_device_changed_cb); + using OnDeviceRequestStateChangeCb = base::RepeatingCallback<void( + const MediaStreamDevice& device, + const mojom::MediaStreamStateChange new_state)>; + void AddStream( + const WebString& label, + const MediaStreamDevices& audio_devices, + const MediaStreamDevices& video_devices, + OnDeviceStoppedCb on_device_stopped_cb, + OnDeviceChangedCb on_device_changed_cb, + OnDeviceRequestStateChangeCb on_device_request_state_change_cb); void AddStream(const WebString& label, const MediaStreamDevice& device); bool RemoveStream(const WebString& label); void RemoveStreamDevice(const MediaStreamDevice& device);
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h index 1c586d81..bf600a1d 100644 --- a/third_party/blink/public/web/web_local_frame_client.h +++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -117,6 +117,7 @@ class WebURL; class WebURLResponse; struct FramePolicy; +struct MobileFriendliness; struct WebConsoleMessage; struct WebContextMenuData; struct WebPluginParams; @@ -701,6 +702,9 @@ // compositor (thread) and submitted to the display compositor. virtual void DidCommitAndDrawCompositorFrame() {} + // Notification that MobileFriendliness metrics changed. + virtual void DidChangeMobileFriendliness(const MobileFriendliness&) {} + // Inform the widget that it was hidden. virtual void WasHidden() {}
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record.cc b/third_party/blink/renderer/bindings/core/v8/module_record.cc index b85a1fc..ef6715f 100644 --- a/third_party/blink/renderer/bindings/core/v8/module_record.cc +++ b/third_party/blink/renderer/bindings/core/v8/module_record.cc
@@ -123,35 +123,6 @@ return ScriptValue(); } -ScriptEvaluationResult ModuleRecord::Evaluate(ScriptState* script_state, - v8::Local<v8::Module> record, - const KURL& source_url) { - v8::Isolate* isolate = script_state->GetIsolate(); - - // Isolate exceptions that occur when executing the code. These exceptions - // should not interfere with javascript code we might evaluate from C++ when - // returning from here. - v8::TryCatch try_catch(isolate); - - ExecutionContext* execution_context = ExecutionContext::From(script_state); - - // Script IDs are not available on errored modules or on non-source text - // modules, so we give them a default value. - probe::ExecuteScript probe(execution_context, source_url, - record->GetStatus() != v8::Module::kErrored && - record->IsSourceTextModule() - ? record->ScriptId() - : v8::UnboundScript::kNoScriptId); - - v8::Local<v8::Value> result; - if (!V8ScriptRunner::EvaluateModule(isolate, execution_context, record, - script_state->GetContext()) - .ToLocal(&result)) { - return ScriptEvaluationResult::FromModuleException(try_catch.Exception()); - } - return ScriptEvaluationResult::FromModuleSuccess(result); -} - void ModuleRecord::ReportException(ScriptState* script_state, v8::Local<v8::Value> exception) { V8ScriptRunner::ReportException(script_state->GetIsolate(), exception);
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record.h b/third_party/blink/renderer/bindings/core/v8/module_record.h index 36b21f1..289213f 100644 --- a/third_party/blink/renderer/bindings/core/v8/module_record.h +++ b/third_party/blink/renderer/bindings/core/v8/module_record.h
@@ -80,10 +80,6 @@ v8::Local<v8::Module> record, const KURL& source_url); - static ScriptEvaluationResult Evaluate(ScriptState*, - v8::Local<v8::Module> record, - const KURL& source_url); - static void ReportException(ScriptState*, v8::Local<v8::Value> exception); static Vector<ModuleRequest> ModuleRequests(ScriptState*,
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record_test.cc b/third_party/blink/renderer/bindings/core/v8/module_record_test.cc index 6e7bf40..71bb2af 100644 --- a/third_party/blink/renderer/bindings/core/v8/module_record_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/module_record_test.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/script/classic_script.h" +#include "third_party/blink/renderer/core/script/js_module_script.h" #include "third_party/blink/renderer/core/script/module_record_resolver.h" #include "third_party/blink/renderer/core/testing/dummy_modulator.h" #include "third_party/blink/renderer/core/testing/module_test_base.h" @@ -46,7 +47,7 @@ private: // Implements ModuleRecordResolver: - void RegisterModuleScript(const ModuleScript*) override { NOTREACHED(); } + void RegisterModuleScript(const ModuleScript*) override {} void UnregisterModuleScript(const ModuleScript*) override { NOTREACHED(); } const ModuleScript* GetModuleScriptFromModuleRecord( @@ -69,7 +70,7 @@ class ModuleRecordTestModulator final : public DummyModulator { public: - ModuleRecordTestModulator(v8::Isolate* isolate); + explicit ModuleRecordTestModulator(ScriptState*); ~ModuleRecordTestModulator() override = default; void Trace(Visitor*) const override; @@ -81,17 +82,25 @@ private: // Implements Modulator: + ScriptState* GetScriptState() override { return script_state_; } + ModuleRecordResolver* GetModuleRecordResolver() override { return resolver_.Get(); } + Member<ScriptState> script_state_; Member<TestModuleRecordResolver> resolver_; }; -ModuleRecordTestModulator::ModuleRecordTestModulator(v8::Isolate* isolate) - : resolver_(MakeGarbageCollected<TestModuleRecordResolver>(isolate)) {} +ModuleRecordTestModulator::ModuleRecordTestModulator(ScriptState* script_state) + : script_state_(script_state), + resolver_(MakeGarbageCollected<TestModuleRecordResolver>( + script_state->GetIsolate())) { + Modulator::SetModulator(script_state, this); +} void ModuleRecordTestModulator::Trace(Visitor* visitor) const { + visitor->Trace(script_state_); visitor->Trace(resolver_); DummyModulator::Trace(visitor); } @@ -141,11 +150,9 @@ V8TestingScope scope; auto* modulator = - MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetIsolate()); + MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetScriptState()); auto* resolver = modulator->GetTestModuleRecordResolver(); - Modulator::SetModulator(scope.GetScriptState(), modulator); - const KURL js_url("https://example.com/foo.js"); v8::Local<v8::Module> module = ModuleRecord::Compile( scope.GetIsolate(), "export const a = 42;", js_url, js_url, @@ -163,11 +170,9 @@ V8TestingScope scope; auto* modulator = - MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetIsolate()); + MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetScriptState()); auto* resolver = modulator->GetTestModuleRecordResolver(); - Modulator::SetModulator(scope.GetScriptState(), modulator); - const KURL js_url_a("https://example.com/a.js"); v8::Local<v8::Module> module_a = ModuleRecord::Compile( scope.GetIsolate(), "export const a = 'a';", js_url_a, js_url_a, @@ -224,11 +229,9 @@ V8TestingScope scope; auto* modulator = - MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetIsolate()); + MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetScriptState()); auto* resolver = modulator->GetTestModuleRecordResolver(); - Modulator::SetModulator(scope.GetScriptState(), modulator); - const KURL js_url_f("https://example.com/failure.js"); v8::Local<v8::Module> module_failure = ModuleRecord::Compile( scope.GetIsolate(), "nonexistent_function()", js_url_f, js_url_f, @@ -239,7 +242,8 @@ js_url_f) .IsEmpty()); ScriptEvaluationResult evaluation_result1 = - ModuleRecord::Evaluate(scope.GetScriptState(), module_failure, js_url_f); + JSModuleScript::CreateForTest(modulator, module_failure, js_url_f) + ->RunScriptAndReturnValue(); resolver->PrepareMockResolveResult(module_failure); @@ -253,7 +257,8 @@ ModuleRecord::Instantiate(scope.GetScriptState(), module, js_url_c) .IsEmpty()); ScriptEvaluationResult evaluation_result2 = - ModuleRecord::Evaluate(scope.GetScriptState(), module, js_url_f); + JSModuleScript::CreateForTest(modulator, module, js_url_c) + ->RunScriptAndReturnValue(); if (base::FeatureList::IsEnabled(features::kTopLevelAwait)) { EXPECT_EQ(evaluation_result1.GetResultType(), @@ -291,8 +296,7 @@ V8TestingScope scope; auto* modulator = - MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetIsolate()); - Modulator::SetModulator(scope.GetScriptState(), modulator); + MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetScriptState()); const KURL js_url("https://example.com/foo.js"); v8::Local<v8::Module> module = ModuleRecord::Compile( @@ -304,7 +308,8 @@ ModuleRecord::Instantiate(scope.GetScriptState(), module, js_url); ASSERT_TRUE(exception.IsEmpty()); - EXPECT_EQ(ModuleRecord::Evaluate(scope.GetScriptState(), module, js_url) + EXPECT_EQ(JSModuleScript::CreateForTest(modulator, module, js_url) + ->RunScriptAndReturnValue() .GetResultType(), ScriptEvaluationResult::ResultType::kSuccess); v8::Local<v8::Value> value = @@ -327,8 +332,7 @@ V8TestingScope scope; auto* modulator = - MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetIsolate()); - Modulator::SetModulator(scope.GetScriptState(), modulator); + MakeGarbageCollected<ModuleRecordTestModulator>(scope.GetScriptState()); const KURL js_url("https://example.com/foo.js"); v8::Local<v8::Module> module = ModuleRecord::Compile( @@ -340,7 +344,8 @@ ASSERT_TRUE(exception.IsEmpty()); ScriptEvaluationResult result = - ModuleRecord::Evaluate(scope.GetScriptState(), module, js_url); + JSModuleScript::CreateForTest(modulator, module, js_url) + ->RunScriptAndReturnValue(); v8::Local<v8::Value> value; if (base::FeatureList::IsEnabled(features::kTopLevelAwait)) {
diff --git a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc index 2790c8f..b54f028e0 100644 --- a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc +++ b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc
@@ -132,10 +132,8 @@ return; } - // We're using |SanitizeScriptErrors::kDoNotSanitize| to keep the existing - // behavior, but this causes failures on - // wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html - // and friends. + // We use |SanitizeScriptErrors::kDoNotSanitize| because muted errors flag is + // not set in https://html.spec.whatwg.org/C/#timer-initialisation-steps DVLOG(1) << "ScheduledAction::execute " << this << ": executing from source"; if (LocalDOMWindow* window = DynamicTo<LocalDOMWindow>(context)) { window->GetScriptController().ExecuteScriptAndReturnValue(
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc index ec7bcf34..f6dac9b 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -32,6 +32,7 @@ #include "third_party/blink/renderer/bindings/core/v8/binding_security.h" #include "third_party/blink/renderer/bindings/core/v8/referrer_script_info.h" #include "third_party/blink/renderer/bindings/core/v8/script_evaluation_result.h" +#include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/script_source_code.h" #include "third_party/blink/renderer/bindings/core/v8/script_streamer.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" @@ -44,6 +45,8 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" #include "third_party/blink/renderer/core/probe/core_probes.h" +#include "third_party/blink/renderer/core/script/modulator.h" +#include "third_party/blink/renderer/core/script/module_script.h" #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h" #include "third_party/blink/renderer/platform/instrumentation/histogram.h" @@ -635,18 +638,146 @@ return result; } -v8::MaybeLocal<v8::Value> V8ScriptRunner::EvaluateModule( - v8::Isolate* isolate, - ExecutionContext* execution_context, - v8::Local<v8::Module> module, - v8::Local<v8::Context> context) { - TRACE_EVENT0("v8,devtools.timeline", "v8.evaluateModule"); - RUNTIME_CALL_TIMER_SCOPE(isolate, RuntimeCallStats::CounterId::kV8); - v8::Isolate::SafeForTerminationScope safe_for_termination(isolate); - // Do not perform a microtask checkpoint here. A checkpoint is performed - // only after module error handling to ensure proper timing with and without - // top-level await. - return module->Evaluate(context); +class ModuleEvaluationRejectionCallback final : public ScriptFunction { + public: + explicit ModuleEvaluationRejectionCallback(ScriptState* script_state) + : ScriptFunction(script_state) {} + + static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) { + ModuleEvaluationRejectionCallback* self = + MakeGarbageCollected<ModuleEvaluationRejectionCallback>(script_state); + return self->BindToV8Function(); + } + + private: + ScriptValue Call(ScriptValue value) override { + ModuleRecord::ReportException(GetScriptState(), value.V8Value()); + return ScriptValue(); + } +}; + +// <specdef href="https://html.spec.whatwg.org/C/#run-a-module-script"> +// Spec with TLA: https://github.com/whatwg/html/pull/4352 +ScriptEvaluationResult V8ScriptRunner::EvaluateModule( + ModuleScript* module_script, + RethrowErrorsOption rethrow_errors) { + // <spec step="1">If rethrow errors is not given, let it be false.</spec> + + // <spec step="2">Let settings be the settings object of script.</spec> + // + // The settings object is |module_script->SettingsObject()|. + ScriptState* script_state = module_script->SettingsObject()->GetScriptState(); + DCHECK_EQ(Modulator::From(script_state), module_script->SettingsObject()); + ExecutionContext* execution_context = ExecutionContext::From(script_state); + v8::Isolate* isolate = script_state->GetIsolate(); + + // <spec step="3">Check if we can run script with settings. If this returns + // "do not run" then return NormalCompletion(empty).</spec> + if (!execution_context->CanExecuteScripts(kAboutToExecuteScript)) { + return ScriptEvaluationResult::FromModuleNotRun(); + } + + // <spec step="4">Prepare to run script given settings.</spec> + // + // These are placed here to also cover ModuleRecord::ReportException(). + v8::MicrotasksScope microtasks_scope(isolate, + ToMicrotaskQueue(execution_context), + v8::MicrotasksScope::kRunMicrotasks); + ScriptState::EscapableScope scope(script_state); + + // Without TLA: <spec step="5">Let evaluationStatus be null.</spec> + ScriptEvaluationResult result = ScriptEvaluationResult::FromModuleNotRun(); + + // <spec step="6">If script's error to rethrow is not null, ...</spec> + if (module_script->HasErrorToRethrow()) { + // Without TLA: <spec step="6">... then set evaluationStatus to Completion + // { [[Type]]: throw, [[Value]]: script's error to rethrow, + // [[Target]]: empty }.</spec> + // With TLA: <spec step="5">If script's error to rethrow is not null, + // then let valuationPromise be a promise rejected with script's error + // to rethrow.</spec> + result = ScriptEvaluationResult::FromModuleException( + module_script->CreateErrorToRethrow().V8Value()); + } else { + // <spec step="7">Otherwise:</spec> + + // <spec step="7.1">Let record be script's record.</spec> + v8::Local<v8::Module> record = module_script->V8Module(); + CHECK(!record.IsEmpty()); + + // <spec step="7.2">Set evaluationStatus to record.Evaluate(). ...</spec> + + // Isolate exceptions that occur when executing the code. These exceptions + // should not interfere with javascript code we might evaluate from C++ + // when returning from here. + v8::TryCatch try_catch(isolate); + + // Script IDs are not available on errored modules or on non-source text + // modules, so we give them a default value. + probe::ExecuteScript probe(execution_context, module_script->SourceURL(), + record->GetStatus() != v8::Module::kErrored && + record->IsSourceTextModule() + ? record->ScriptId() + : v8::UnboundScript::kNoScriptId); + + TRACE_EVENT0("v8,devtools.timeline", "v8.evaluateModule"); + RUNTIME_CALL_TIMER_SCOPE(isolate, RuntimeCallStats::CounterId::kV8); + v8::Isolate::SafeForTerminationScope safe_for_termination(isolate); + + // Do not perform a microtask checkpoint here. A checkpoint is performed + // only after module error handling to ensure proper timing with and + // without top-level await. + v8::Local<v8::Value> v8_result; + if (!record->Evaluate(script_state->GetContext()).ToLocal(&v8_result)) { + result = + ScriptEvaluationResult::FromModuleException(try_catch.Exception()); + } else { + result = ScriptEvaluationResult::FromModuleSuccess(v8_result); + } + + // <spec step="7.2">... If Evaluate fails to complete as a result of the + // user agent aborting the running script, then set evaluationStatus to + // Completion { [[Type]]: throw, [[Value]]: a new "QuotaExceededError" + // DOMException, [[Target]]: empty }.</spec> + } + + // [not specced] Store V8 code cache on successful evaluation. + if (result.GetResultType() == ScriptEvaluationResult::ResultType::kSuccess) { + execution_context->GetTaskRunner(TaskType::kNetworking) + ->PostTask(FROM_HERE, + WTF::Bind(&Modulator::ProduceCacheModuleTreeTopLevel, + WrapWeakPersistent(Modulator::From(script_state)), + WrapWeakPersistent(module_script))); + } + + if (!rethrow_errors.ShouldRethrow()) { + if (base::FeatureList::IsEnabled(features::kTopLevelAwait)) { + // <spec step="7"> If report errors is true, then upon rejection of + // evaluationPromise with reason, report the exception given by reason + // for script.</spec> + v8::Local<v8::Function> callback_failure = + ModuleEvaluationRejectionCallback::CreateFunction(script_state); + // Add a rejection handler to report back errors once the result + // promise is rejected. + result.GetPromise(script_state) + .Then(v8::Local<v8::Function>(), callback_failure); + } else { + // <spec step="8">If evaluationStatus is an abrupt completion, + // then:</spec> + if (result.GetResultType() == + ScriptEvaluationResult::ResultType::kException) { + // <spec step="8.2">Otherwise, report the exception given by + // evaluationStatus.[[Value]] for script.</spec> + ModuleRecord::ReportException(script_state, + result.GetExceptionForModule()); + } + } + } + + // <spec step="8">Clean up after running script with settings.</spec> + // - Partially implement in MicrotaskScope destructor and the + // - ScriptState::EscapableScope destructor. + return result.Escape(&scope); } void V8ScriptRunner::ReportException(v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h index 38ca4a3..65b8867 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h +++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.h
@@ -43,6 +43,7 @@ class ScriptEvaluationResult; class ExecutionContext; class KURL; +class ModuleScript; class ReferrerScriptInfo; class ScriptFetchOptions; class ScriptSourceCode; @@ -55,6 +56,9 @@ public: // Rethrow errors flag in // https://html.spec.whatwg.org/C/#run-a-classic-script + // implemented by CompileAndRunScript() and + // https://html.spec.whatwg.org/C/#run-a-module-script + // implemented by EvaluateModule(). class RethrowErrorsOption final { STACK_ALLOCATED(); @@ -70,11 +74,20 @@ return RethrowErrorsOption(base::nullopt); } - // Rethrow errors flag is true. When rethrowing, a NetworkError with - // `message` is thrown. This is used only for importScripts(), and - // `message` is used to throw NetworkErrors with the same message text, - // no matter whether the NetworkError is thrown inside or outside - // EvaluateAndReturnValue(). + // Rethrow errors flag is true. + // When an exception is to be rethrown, + // For classic scripts: + // The exception is rethrown to V8, and ScriptEvaluationResult doesn't + // retain the exception. + // When script's muted errors is true, a NetworkError with + // `message` is thrown. This is used only for importScripts(), and + // `message` is used to throw NetworkErrors with the same message text, + // no matter whether the NetworkError is thrown inside or outside + // V8ScriptRunner. + // For module scripts: + // The exception is caught and + // ScriptEvaluationResult::GetExceptionForModule() returns the exception + // to be rethrown. static RethrowErrorsOption Rethrow(const String& message) { return RethrowErrorsOption(message); } @@ -134,10 +147,13 @@ int argc, v8::Local<v8::Value> info[], v8::Isolate*); - static v8::MaybeLocal<v8::Value> EvaluateModule(v8::Isolate*, - ExecutionContext*, - v8::Local<v8::Module>, - v8::Local<v8::Context>); + + // https://html.spec.whatwg.org/C/#run-a-module-script + // Callers must enter a v8::HandleScope before calling. + // See the class comments of RethrowErrorsOption and ScriptEvaluationResult + // for exception handling and return value semantics. + static ScriptEvaluationResult EvaluateModule(ModuleScript*, + RethrowErrorsOption); // Only to be used from ModuleRecord::ReportException(). static void ReportExceptionForModule(v8::Isolate*,
diff --git a/third_party/blink/renderer/bindings/core/v8/window_proxy.cc b/third_party/blink/renderer/bindings/core/v8/window_proxy.cc index 3139b74..b57941b 100644 --- a/third_party/blink/renderer/bindings/core/v8/window_proxy.cc +++ b/third_party/blink/renderer/bindings/core/v8/window_proxy.cc
@@ -108,14 +108,6 @@ CHECK(global_proxy_.IsEmpty()); global_proxy_.Set(isolate_, global_proxy); - - // Initialize the window proxy now, to re-establish the connection between - // the global object and the v8::Context. This is really only needed for a - // RemoteDOMWindow, since it has no scripting environment of its own. - // Without this, existing script references to a swapped in RemoteDOMWindow - // would be broken until that RemoteDOMWindow was vended again through an - // interface like window.frames. - Initialize(); } // Create a new environment and setup the global object.
diff --git a/third_party/blink/renderer/bindings/core/v8/window_proxy.h b/third_party/blink/renderer/bindings/core/v8/window_proxy.h index 33d85e2..4323a5c7 100644 --- a/third_party/blink/renderer/bindings/core/v8/window_proxy.h +++ b/third_party/blink/renderer/bindings/core/v8/window_proxy.h
@@ -155,6 +155,8 @@ CORE_EXPORT v8::Local<v8::Object> GlobalProxyIfNotDetached(); v8::Local<v8::Object> ReleaseGlobalProxy(); + // This does not initialize the window proxy, either Initialize or + // InitializeIfNeeded needs to be called after this method. void SetGlobalProxy(v8::Local<v8::Object>); // TODO(dcheng): Temporarily exposed to avoid include cycles. Remove the need
diff --git a/third_party/blink/renderer/bindings/core/v8/window_proxy_manager.cc b/third_party/blink/renderer/bindings/core/v8/window_proxy_manager.cc index f13c18e..66bc944 100644 --- a/third_party/blink/renderer/bindings/core/v8/window_proxy_manager.cc +++ b/third_party/blink/renderer/bindings/core/v8/window_proxy_manager.cc
@@ -57,6 +57,15 @@ const GlobalProxyVector& global_proxies) { for (const auto& entry : global_proxies) WindowProxyMaybeUninitialized(*entry.first)->SetGlobalProxy(entry.second); + + // Initialize the window proxies now, to re-establish the connection between + // the global object and the v8::Context. This is really only needed for a + // RemoteDOMWindow, since it has no scripting environment of its own. + // Without this, existing script references to a swapped in RemoteDOMWindow + // would be broken until that RemoteDOMWindow was vended again through an + // interface like window.frames. + for (const auto& entry : global_proxies) + WindowProxyMaybeUninitialized(*entry.first)->InitializeIfNeeded(); } WindowProxyManager::WindowProxyManager(Frame& frame, FrameType frame_type)
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index ab9fe9c3..8820413 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -271,6 +271,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_property_definition.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_queuing_strategy_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_queuing_strategy_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_readable_writable_pair.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_readable_writable_pair.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_reporting_observer_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_reporting_observer_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_request_init.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index 6d2fbac1..b0e1e89 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -486,6 +486,7 @@ "//third_party/blink/renderer/core/streams/readable_stream.idl", "//third_party/blink/renderer/core/streams/readable_stream_default_controller.idl", "//third_party/blink/renderer/core/streams/readable_stream_default_reader.idl", + "//third_party/blink/renderer/core/streams/readable_writable_pair.idl", "//third_party/blink/renderer/core/streams/stream_pipe_options.idl", "//third_party/blink/renderer/core/streams/transform_stream.idl", "//third_party/blink/renderer/core/streams/transform_stream_default_controller.idl",
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 3df2710..f74ec73 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -43,6 +43,7 @@ import("//third_party/blink/renderer/core/loader/build.gni") import("//third_party/blink/renderer/core/mathml/build.gni") import("//third_party/blink/renderer/core/messaging/build.gni") +import("//third_party/blink/renderer/core/mobile_metrics/build.gni") import("//third_party/blink/renderer/core/mojo/build.gni") import("//third_party/blink/renderer/core/offscreencanvas/build.gni") import("//third_party/blink/renderer/core/origin_trials/build.gni") @@ -215,6 +216,8 @@ sources += rebase_path(blink_core_sources_loader, "", "loader") sources += rebase_path(blink_core_sources_mathml, "", "mathml") sources += rebase_path(blink_core_sources_messaging, "", "messaging") + sources += + rebase_path(blink_core_sources_mobile_metrics, "", "mobile_metrics") sources += rebase_path(blink_core_sources_mojo, "", "mojo") sources += rebase_path(blink_core_sources_offscreencanvas, "", "offscreencanvas") @@ -1436,6 +1439,7 @@ "loader/web_associated_url_loader_impl_test.cc", "messaging/blink_transferable_message_mojom_traits_test.cc", "messaging/message_port_descriptor_mojom_traits_test.cc", + "mobile_metrics/mobile_friendliness_checker_test.cc", "origin_trials/origin_trial_context_test.cc", "origin_trials/origin_trials_test.cc", "page/autoscroll_controller_test.cc",
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index 0571805f..840f4d85 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -736,6 +736,7 @@ "mojo/test/mojo_interface_request_event_init.idl", "page/scrolling/scroll_state_init.idl", "resize_observer/resize_observer_options.idl", + "streams/readable_writable_pair.idl", "streams/stream_pipe_options.idl", "streams/queuing_strategy_init.idl", "timing/measure_memory/measure_memory.idl",
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc index 16f4263..4a5f4ef 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -267,6 +267,21 @@ return true; } +void ExtractInvalidationSets(InvalidationSet* invalidation_set, + DescendantInvalidationSet*& descendants, + SiblingInvalidationSet*& siblings) { + CHECK(invalidation_set->IsAlive()); + if (auto* descendant = + DynamicTo<DescendantInvalidationSet>(invalidation_set)) { + descendants = descendant; + siblings = nullptr; + return; + } + + siblings = To<SiblingInvalidationSet>(invalidation_set); + descendants = siblings->Descendants(); +} + } // anonymous namespace InvalidationSet& RuleFeatureSet::EnsureMutableInvalidationSet( @@ -370,21 +385,6 @@ } } -void ExtractInvalidationSets(InvalidationSet* invalidation_set, - DescendantInvalidationSet*& descendants, - SiblingInvalidationSet*& siblings) { - CHECK(invalidation_set->IsAlive()); - if (auto* descendant = - DynamicTo<DescendantInvalidationSet>(invalidation_set)) { - descendants = descendant; - siblings = nullptr; - return; - } - - siblings = To<SiblingInvalidationSet>(invalidation_set); - descendants = siblings->Descendants(); -} - RuleFeatureSet::RuleFeatureSet() : is_alive_(true) {} RuleFeatureSet::~RuleFeatureSet() {
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc index ccfefead..f6fda6f 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
@@ -47,7 +47,6 @@ #include "third_party/blink/renderer/core/loader/threadable_loader_client.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/platform/blob/blob_url.h" -#include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_error.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h" @@ -213,14 +212,12 @@ } void FileReaderLoader::Failed(FileErrorCode error_code, FailureType type) { - DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, failure_histogram, - ("Storage.Blob.FileReaderLoader.FailureType", - static_cast<int>(FailureType::kCount))); // If an error was already reported, don't report this error again. if (error_code_ != FileErrorCode::kOK) return; error_code_ = error_code; - failure_histogram.Count(static_cast<int>(type)); + base::UmaHistogramEnumeration("Storage.Blob.FileReaderLoader.FailureType", + type); Cleanup(); if (client_) client_->DidFail(error_code_);
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.h b/third_party/blink/renderer/core/fileapi/file_reader_loader.h index 31682e5..0e470b1 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_loader.h +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.h
@@ -125,7 +125,7 @@ // into this bucket. If there are a large number of errors reported here, // then there can be a new enumeration reported for mojo pipe errors. kMojoPipeUnexpectedReadError = 10, - kCount + kMaxValue = kMojoPipeUnexpectedReadError, }; void Cleanup();
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_sync.cc b/third_party/blink/renderer/core/fileapi/file_reader_sync.cc index f38d4d5c..02039b9 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_sync.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader_sync.cc
@@ -32,6 +32,7 @@ #include <memory> +#include "base/metrics/histogram_functions.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" @@ -39,7 +40,6 @@ #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/instrumentation/histogram.h" namespace blink { @@ -51,7 +51,7 @@ DEDICATED_WORKER = 1, SHARED_WORKER = 2, SERVICE_WORKER = 3, - MAX + kMaxValue = SERVICE_WORKER, }; } // namespace @@ -64,10 +64,7 @@ type = WorkerType::SHARED_WORKER; else if (context->IsServiceWorkerGlobalScope()) type = WorkerType::SERVICE_WORKER; - DEFINE_THREAD_SAFE_STATIC_LOCAL( - EnumerationHistogram, worker_type_histogram, - ("FileReaderSync.WorkerType", static_cast<int>(WorkerType::MAX))); - worker_type_histogram.Count(static_cast<int>(type)); + base::UmaHistogramEnumeration("FileReaderSync.WorkerType", type); } DOMArrayBuffer* FileReaderSync::readAsArrayBuffer(
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h index d76577d..d83455d1 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client.h +++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -412,6 +412,8 @@ // AppCache ------------------------------------------------------------ virtual void UpdateSubresourceFactory( std::unique_ptr<blink::PendingURLLoaderFactoryBundle> pending_factory) {} + + virtual void DidChangeMobileFriendliness(const MobileFriendliness&) {} }; } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc index 3c33cbe..fcb0103c 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -36,6 +36,7 @@ #include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/type_converter.h" #include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/public/mojom/frame/navigation_initiator.mojom-blink.h" @@ -1163,4 +1164,10 @@ web_frame_->Client()->UpdateSubresourceFactory(std::move(pending_factory)); } +void LocalFrameClientImpl::DidChangeMobileFriendliness( + const MobileFriendliness& mf) { + DCHECK(web_frame_->Client()); + web_frame_->Client()->DidChangeMobileFriendliness(mf); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.h b/third_party/blink/renderer/core/frame/local_frame_client_impl.h index c71ed356..537639f 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client_impl.h +++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.h
@@ -270,6 +270,8 @@ std::unique_ptr<blink::PendingURLLoaderFactoryBundle> pending_factory) override; + void DidChangeMobileFriendliness(const MobileFriendliness&) override; + private: bool IsLocalFrameClientImpl() const override { return true; } WebDevToolsAgentImpl* DevToolsAgent();
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 7f374df..856a3c16 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -105,6 +105,7 @@ #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" #include "third_party/blink/renderer/core/media_type_names.h" +#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/page/autoscroll_controller.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/focus_controller.h" @@ -267,7 +268,9 @@ paint_frame_count_(0), unique_id_(NewUniqueObjectId()), layout_shift_tracker_(MakeGarbageCollected<LayoutShiftTracker>(this)), - paint_timing_detector_(MakeGarbageCollected<PaintTimingDetector>(this)) + paint_timing_detector_(MakeGarbageCollected<PaintTimingDetector>(this)), + mobile_friendliness_checker_( + MakeGarbageCollected<MobileFriendlinessChecker>(*this)) #if DCHECK_IS_ON() , is_updating_descendant_dependent_flags_(false) @@ -298,6 +301,7 @@ visitor->Trace(scroll_event_queue_); visitor->Trace(layout_shift_tracker_); visitor->Trace(paint_timing_detector_); + visitor->Trace(mobile_friendliness_checker_); visitor->Trace(lifecycle_observers_); visitor->Trace(fullscreen_video_elements_); } @@ -4589,6 +4593,11 @@ 1.0f, GetChromeClient()->WindowToViewportScalar(&GetFrame(), 1.0f))); } +void LocalFrameView::DidChangeMobileFriendliness( + const blink::MobileFriendliness& mf) { + GetFrame().Client()->DidChangeMobileFriendliness(mf); +} + LocalFrameUkmAggregator& LocalFrameView::EnsureUkmAggregator() { if (!ukm_aggregator_) { ukm_aggregator_ = base::MakeRefCounted<LocalFrameUkmAggregator>(
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 17f224a..27769df 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -90,6 +90,7 @@ class LayoutSVGRoot; class LayoutView; class LocalFrame; +class MobileFriendlinessChecker; class Page; class PaintLayer; class PaintLayerScrollableArea; @@ -105,6 +106,7 @@ class WebPluginContainerImpl; struct AnnotatedRegionValue; struct IntrinsicSizingInfo; +struct MobileFriendliness; struct PhysicalOffset; struct PhysicalRect; @@ -685,6 +687,11 @@ return *paint_timing_detector_; } + MobileFriendlinessChecker& GetMobileFriendlinessChecker() const { + return *mobile_friendliness_checker_; + } + void DidChangeMobileFriendliness(const MobileFriendliness& mf); + // Return the UKM aggregator for this frame, creating it if necessary. LocalFrameUkmAggregator& EnsureUkmAggregator(); @@ -1061,6 +1068,7 @@ UniqueObjectId unique_id_; Member<LayoutShiftTracker> layout_shift_tracker_; Member<PaintTimingDetector> paint_timing_detector_; + Member<MobileFriendlinessChecker> mobile_friendliness_checker_; HeapHashSet<WeakMember<LifecycleNotificationObserver>> lifecycle_observers_;
diff --git a/third_party/blink/renderer/core/frame/viewport_data.cc b/third_party/blink/renderer/core/frame/viewport_data.cc index 2e63af4..411ea3c3 100644 --- a/third_party/blink/renderer/core/frame/viewport_data.cc +++ b/third_party/blink/renderer/core/frame/viewport_data.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/core/frame/settings.h" +#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" @@ -104,6 +105,8 @@ if (document_->GetFrame()->IsMainFrame()) { document_->GetPage()->GetChromeClient().DispatchViewportPropertiesDidChange( GetViewportDescription()); + document_->View()->GetMobileFriendlinessChecker().NotifyViewportUpdated( + GetViewportDescription()); } }
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc index bc8bb80..0cd24755 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element_test.cc
@@ -83,7 +83,8 @@ inner_editor->appendChild(doc.CreateRawElement(html_names::kBrTag)); RunDocumentLifecycle(); // Should be "1234\n5678\n90". The legacy behavior is wrong. - EXPECT_EQ(GetParam() ? "1234\n5678\n90" : "1234567890", + EXPECT_EQ(textarea.GetLayoutBox()->IsLayoutNGObject() ? "1234\n5678\n90" + : "1234567890", textarea.ValueWithHardLineBreaks()); }
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc index f2df8d4..f06d2ab 100644 --- a/third_party/blink/renderer/core/html/forms/text_control_element.cc +++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -940,13 +940,12 @@ return value(); if (layout_object->IsLayoutNGObject()) { - const auto* items = layout_object->FragmentItems(); - if (!items) + NGInlineCursor cursor(*layout_object); + if (!cursor) return value(); const auto* mapping = NGInlineNode::GetOffsetMapping(layout_object); if (!mapping) return value(); - NGInlineCursor cursor(*items); Position break_position = GetNextSoftBreak(*mapping, cursor); StringBuilder result; for (Node& node : NodeTraversal::DescendantsOf(*inner_text)) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc index 2afcd62..173920dd 100644 --- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -40,6 +40,7 @@ #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" #include "net/http/http_status_code.h" +#include "services/network/public/cpp/cors/cors_error_status.h" #include "services/network/public/mojom/referrer_policy.mojom-blink.h" #include "services/network/public/mojom/trust_tokens.mojom-blink.h" #include "services/network/public/mojom/websocket.mojom-blink.h" @@ -394,6 +395,97 @@ return protocol::Network::BlockedReasonEnum::Other; } +String BuildCorsError(network::mojom::CorsError cors_error) { + switch (cors_error) { + case network::mojom::CorsError::kDisallowedByMode: + return protocol::Network::CorsErrorEnum::DisallowedByMode; + + case network::mojom::CorsError::kInvalidResponse: + return protocol::Network::CorsErrorEnum::InvalidResponse; + + case network::mojom::CorsError::kWildcardOriginNotAllowed: + return protocol::Network::CorsErrorEnum::WildcardOriginNotAllowed; + + case network::mojom::CorsError::kMissingAllowOriginHeader: + return protocol::Network::CorsErrorEnum::MissingAllowOriginHeader; + + case network::mojom::CorsError::kMultipleAllowOriginValues: + return protocol::Network::CorsErrorEnum::MultipleAllowOriginValues; + + case network::mojom::CorsError::kInvalidAllowOriginValue: + return protocol::Network::CorsErrorEnum::InvalidAllowOriginValue; + + case network::mojom::CorsError::kAllowOriginMismatch: + return protocol::Network::CorsErrorEnum::AllowOriginMismatch; + + case network::mojom::CorsError::kInvalidAllowCredentials: + return protocol::Network::CorsErrorEnum::InvalidAllowCredentials; + + case network::mojom::CorsError::kCorsDisabledScheme: + return protocol::Network::CorsErrorEnum::CorsDisabledScheme; + + case network::mojom::CorsError::kPreflightInvalidStatus: + return protocol::Network::CorsErrorEnum::PreflightInvalidStatus; + + case network::mojom::CorsError::kPreflightDisallowedRedirect: + return protocol::Network::CorsErrorEnum::PreflightDisallowedRedirect; + + case network::mojom::CorsError::kPreflightWildcardOriginNotAllowed: + return protocol::Network::CorsErrorEnum:: + PreflightWildcardOriginNotAllowed; + + case network::mojom::CorsError::kPreflightMissingAllowOriginHeader: + return protocol::Network::CorsErrorEnum:: + PreflightMissingAllowOriginHeader; + + case network::mojom::CorsError::kPreflightMultipleAllowOriginValues: + return protocol::Network::CorsErrorEnum:: + PreflightMultipleAllowOriginValues; + + case network::mojom::CorsError::kPreflightInvalidAllowOriginValue: + return protocol::Network::CorsErrorEnum::PreflightInvalidAllowOriginValue; + + case network::mojom::CorsError::kPreflightAllowOriginMismatch: + return protocol::Network::CorsErrorEnum::PreflightAllowOriginMismatch; + + case network::mojom::CorsError::kPreflightInvalidAllowCredentials: + return protocol::Network::CorsErrorEnum::PreflightInvalidAllowCredentials; + + case network::mojom::CorsError::kPreflightMissingAllowExternal: + return protocol::Network::CorsErrorEnum::PreflightMissingAllowExternal; + + case network::mojom::CorsError::kPreflightInvalidAllowExternal: + return protocol::Network::CorsErrorEnum::PreflightInvalidAllowExternal; + + case network::mojom::CorsError::kInvalidAllowMethodsPreflightResponse: + return protocol::Network::CorsErrorEnum:: + InvalidAllowMethodsPreflightResponse; + + case network::mojom::CorsError::kInvalidAllowHeadersPreflightResponse: + return protocol::Network::CorsErrorEnum:: + InvalidAllowHeadersPreflightResponse; + + case network::mojom::CorsError::kMethodDisallowedByPreflightResponse: + return protocol::Network::CorsErrorEnum:: + MethodDisallowedByPreflightResponse; + + case network::mojom::CorsError::kHeaderDisallowedByPreflightResponse: + return protocol::Network::CorsErrorEnum:: + HeaderDisallowedByPreflightResponse; + + case network::mojom::CorsError::kRedirectContainsCredentials: + return protocol::Network::CorsErrorEnum::RedirectContainsCredentials; + } +} + +std::unique_ptr<protocol::Network::CorsErrorStatus> BuildCorsErrorStatus( + network::CorsErrorStatus status) { + return protocol::Network::CorsErrorStatus::create() + .setCorsError(BuildCorsError(status.cors_error)) + .setFailedParameter(String::FromUTF8(status.failed_parameter)) + .build(); +} + String BuildServiceWorkerResponseSource(const ResourceResponse& response) { switch (response.GetServiceWorkerResponseSource()) { case network::mojom::FetchResponseSource::kCacheStorage: @@ -1290,15 +1382,21 @@ error.GetResourceRequestBlockedReason(); protocol::Maybe<String> blocked_reason; if (resource_request_blocked_reason) { - blocked_reason = - BuildBlockedReason(resource_request_blocked_reason.value()); + blocked_reason = BuildBlockedReason(*resource_request_blocked_reason); + } + auto cors_error_status = error.CorsErrorStatus(); + protocol::Maybe<protocol::Network::CorsErrorStatus> + protocol_cors_error_status; + if (cors_error_status) { + protocol_cors_error_status = BuildCorsErrorStatus(*cors_error_status); } is_handling_sync_xhr_ = false; GetFrontend()->loadingFailed( request_id, base::TimeTicks::Now().since_origin().InSecondsF(), InspectorPageAgent::ResourceTypeJson( resources_data_->GetResourceType(request_id)), - error.LocalizedDescription(), canceled, std::move(blocked_reason)); + error.LocalizedDescription(), canceled, std::move(blocked_reason), + std::move(protocol_cors_error_status)); } void InspectorNetworkAgent::ScriptImported(uint64_t identifier,
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc index ff02f37..d96d871 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -4640,7 +4640,7 @@ RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) { for (const NGPhysicalBoxFragment& fragment : PhysicalFragments()) { if (const NGFragmentItems* items = fragment.Items()) { - NGInlineCursor cursor(*items); + NGInlineCursor cursor(fragment, *items); NGFragmentItem::RecalcInkOverflowForCursor(&cursor); } // Even if this turned out to be an inline formatting context with
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc index a61a428..60b459e 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc
@@ -2433,7 +2433,7 @@ } } else if (const NGPhysicalBoxFragment* fragment = CurrentFragment()) { if (const NGFragmentItems* items = fragment->Items()) { - for (NGInlineCursor cursor(*items); cursor; + for (NGInlineCursor cursor(*fragment, *items); cursor; cursor.MoveToNextSkippingChildren()) { const NGFragmentItem* child = cursor.CurrentItem(); DCHECK(child); @@ -2497,7 +2497,7 @@ StyleRef().IsLeftToRightDirection()) { if (const NGPhysicalBoxFragment* fragment = CurrentFragment()) { if (const NGFragmentItems* items = fragment->Items()) { - for (NGInlineCursor cursor(*items); cursor; + for (NGInlineCursor cursor(*fragment, *items); cursor; cursor.MoveToNextSkippingChildren()) { if (!cursor.Current().IsLineBox()) continue; @@ -2835,12 +2835,17 @@ return; } - if (const NGFragmentItems* fragment_items = FragmentItems()) { - NGInlineCursor first_line(*fragment_items); - if (first_line) { - DCHECK(!FirstRootBox()); + const auto fragments = PhysicalFragments(); + if (!fragments.IsEmpty()) { + DCHECK(!FirstRootBox()); + for (const NGPhysicalBoxFragment& fragment : fragments) { + NGInlineCursor first_line(fragment); + if (!first_line) + continue; first_line.MoveToFirstLine(); - if (first_line && first_line.Current().UsesFirstLineStyle()) { + if (!first_line) + continue; + if (first_line.Current().UsesFirstLineStyle()) { // Mark all descendants of the first line if first-line style. for (NGInlineCursor descendants = first_line.CursorForDescendants(); descendants; descendants.MoveToNext()) { @@ -2856,6 +2861,7 @@ } StyleRef().ClearCachedPseudoElementStyles(); SetShouldDoFullPaintInvalidation(); + return; } } return;
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index 22d0ebf5..c9a6e93b2 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -1682,7 +1682,7 @@ if (UNLIKELY(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled())) { if (const LayoutBlockFlow* container = FragmentItemsContainer()) { if (const NGFragmentItems* items = container->FragmentItems()) - items->DirtyLinesFromChangedChild(child); + items->DirtyLinesFromChangedChild(*container, child); } return; }
diff --git a/third_party/blink/renderer/core/layout/ng/custom/layout_worklet_test.cc b/third_party/blink/renderer/core/layout/ng/custom/layout_worklet_test.cc index 34bffe0..74242d2 100644 --- a/third_party/blink/renderer/core/layout/ng/custom/layout_worklet_test.cc +++ b/third_party/blink/renderer/core/layout/ng/custom/layout_worklet_test.cc
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/core/layout/ng/custom/css_layout_definition.h" #include "third_party/blink/renderer/core/layout/ng/custom/layout_worklet_global_scope.h" #include "third_party/blink/renderer/core/layout/ng/custom/layout_worklet_global_scope_proxy.h" +#include "third_party/blink/renderer/core/script/js_module_script.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" namespace blink { @@ -59,7 +60,9 @@ ModuleRecord::Instantiate(script_state, module, js_url); EXPECT_TRUE(exception.IsEmpty()); - return ModuleRecord::Evaluate(script_state, module, js_url); + return JSModuleScript::CreateForTest(Modulator::From(script_state), module, + js_url) + ->RunScriptAndReturnValue(); } private:
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc index 1252339..32f2ecf4 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
@@ -103,10 +103,7 @@ cursor.Current().OffsetInContainerBlock(); const PhysicalSize caret_size(caret_width, caret_height); - // TODO(crbug.com/1061423): Shouldn't assume that there's only one - // fragment. - const NGPhysicalBoxFragment& fragment = - *cursor.Current().GetLayoutObject()->ContainingBlockFlowFragment(); + const NGPhysicalBoxFragment& fragment = cursor.BoxFragment(); NGInlineCursor line_box(cursor); line_box.MoveToContainingLine(); const PhysicalOffset line_box_offset =
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc index e2222336..447e9fe 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
@@ -60,11 +60,13 @@ void TestFirstDirtyLineIndex(const char* id, wtf_size_t expected_index) { LayoutBlockFlow* block_flow = GetLayoutBlockFlowByElementId(id); - const NGFragmentItems* items = block_flow->FragmentItems(); + const NGPhysicalBoxFragment* fragment = block_flow->GetPhysicalFragment(0); + const NGFragmentItems* items = fragment->Items(); items->DirtyLinesFromNeedsLayout(block_flow); - const NGFragmentItem* end_reusable_item = items->EndOfReusableItems(); + const NGFragmentItem* end_reusable_item = + items->EndOfReusableItems(*fragment); - NGInlineCursor cursor(*items); + NGInlineCursor cursor(*fragment, *items); const auto lines = GetLines(&cursor); EXPECT_EQ(IndexOf(lines, end_reusable_item), expected_index); }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc index 8593c4137..6c6e6e2 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.cc
@@ -207,9 +207,10 @@ return true; } -const NGFragmentItem* NGFragmentItems::EndOfReusableItems() const { +const NGFragmentItem* NGFragmentItems::EndOfReusableItems( + const NGPhysicalBoxFragment& container) const { const NGFragmentItem* last_line_start = &front(); - for (NGInlineCursor cursor(*this); cursor;) { + for (NGInlineCursor cursor(container, *this); cursor;) { const NGFragmentItem& item = *cursor.Current(); if (item.IsDirty()) return &item; @@ -264,8 +265,9 @@ } bool NGFragmentItems::TryDirtyLastLineFor( + const LayoutBlockFlow& container, const LayoutObject& layout_object) const { - NGInlineCursor cursor(*this); + NGInlineCursor cursor(container); cursor.MoveTo(layout_object); if (!cursor) return false; @@ -278,6 +280,7 @@ } void NGFragmentItems::DirtyLinesFromChangedChild( + const LayoutBlockFlow& container, const LayoutObject* child) const { if (UNLIKELY(!child)) { front().SetDirty(); @@ -303,7 +306,7 @@ if (UNLIKELY(child->IsFloatingOrOutOfFlowPositioned())) continue; if (child->IsInLayoutNGInlineFormattingContext() && - TryDirtyLastLineFor(*child)) + TryDirtyLastLineFor(container, *child)) return; continue; } @@ -332,7 +335,7 @@ for (LayoutObject* child = container->FirstChild(); child; child = child->NextSibling()) { if (child->NeedsLayout()) { - DirtyLinesFromChangedChild(child); + DirtyLinesFromChangedChild(*container, child); return; } }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.h index a3dca82..f395940 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items.h
@@ -74,10 +74,12 @@ // Returns the end (next of the last) item that are reusable. If no items are // reusable, it is the first item. - const NGFragmentItem* EndOfReusableItems() const; + const NGFragmentItem* EndOfReusableItems( + const NGPhysicalBoxFragment& container) const; // Mark items dirty when |child| is removed from the tree. - void DirtyLinesFromChangedChild(const LayoutObject* child) const; + void DirtyLinesFromChangedChild(const LayoutBlockFlow& container, + const LayoutObject* child) const; // Mark items dirty from |LayoutObject::NeedsLayout| flags. void DirtyLinesFromNeedsLayout(const LayoutBlockFlow* block_flow) const; @@ -97,7 +99,8 @@ static bool CanReuseAll(NGInlineCursor* cursor); bool TryDirtyFirstLineFor(const LayoutObject& layout_object) const; - bool TryDirtyLastLineFor(const LayoutObject& layout_object) const; + bool TryDirtyLastLineFor(const LayoutBlockFlow& container, + const LayoutObject& layout_object) const; String text_content_; String first_line_text_content_;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc index eb2181a..de7782fd 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
@@ -196,8 +196,8 @@ NGFragmentItemsBuilder::AddPreviousItemsResult NGFragmentItemsBuilder::AddPreviousItems( + const NGPhysicalBoxFragment& container, const NGFragmentItems& items, - const PhysicalSize& container_size, NGBoxFragmentBuilder* container_builder, const NGFragmentItem* end_item, wtf_size_t max_lines) { @@ -228,7 +228,7 @@ // This is needed because the container size may be different, in that case, // the physical offsets are different when `writing-mode: vertial-rl`. DCHECK(!is_converted_to_physical_); - const WritingModeConverter converter(GetWritingDirection(), container_size); + const WritingModeConverter converter(GetWritingDirection(), container.Size()); const WritingMode writing_mode = GetWritingMode(); WritingModeConverter line_converter( {ToLineWritingMode(writing_mode), TextDirection::kLtr}); @@ -238,7 +238,7 @@ LayoutUnit used_block_size; wtf_size_t line_count = 0; - for (NGInlineCursor cursor(items); cursor;) { + for (NGInlineCursor cursor(container, items); cursor;) { DCHECK(cursor.Current().Item()); const NGFragmentItem& item = *cursor.Current().Item(); if (&item == end_item)
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h index 49041a2..53a8b890 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h
@@ -98,8 +98,8 @@ // When |stop_at_dirty| is true, this function checks reusability of previous // items and stops copying before the first dirty line. AddPreviousItemsResult AddPreviousItems( + const NGPhysicalBoxFragment& container, const NGFragmentItems& items, - const PhysicalSize& container_size, NGBoxFragmentBuilder* container_builder = nullptr, const NGFragmentItem* end_item = nullptr, wtf_size_t max_lines = 0);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc index 10cc3da3..a6cba13 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -34,17 +34,21 @@ MakeNull(); } -void NGInlineCursor::SetRoot(const NGFragmentItems& fragment_items, +void NGInlineCursor::SetRoot(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& fragment_items, ItemsSpan items) { + DCHECK_EQ(box_fragment.Items(), &fragment_items); DCHECK(items.data() || !items.size()); + root_box_fragment_ = &box_fragment; fragment_items_ = &fragment_items; items_ = items; DCHECK(fragment_items_->IsSubSpan(items_)); MoveToItem(items_.begin()); } -void NGInlineCursor::SetRoot(const NGFragmentItems& items) { - SetRoot(items, items.Items()); +void NGInlineCursor::SetRoot(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& items) { + SetRoot(box_fragment, items, items.Items()); } void NGInlineCursor::SetRoot(const NGPaintFragment& root_paint_fragment) { @@ -62,7 +66,7 @@ root_block_flow_->GetPhysicalFragment(fragment_index_); DCHECK(fragment); if (const NGFragmentItems* items = fragment->Items()) { - SetRoot(*items); + SetRoot(*fragment, *items); return true; } } @@ -95,13 +99,20 @@ SetRoot(block_flow); } -NGInlineCursor::NGInlineCursor(const NGFragmentItems& fragment_items, +NGInlineCursor::NGInlineCursor(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& fragment_items, ItemsSpan items) { - SetRoot(fragment_items, items); + SetRoot(box_fragment, fragment_items, items); } -NGInlineCursor::NGInlineCursor(const NGFragmentItems& items) { - SetRoot(items); +NGInlineCursor::NGInlineCursor(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& items) { + SetRoot(box_fragment, items); +} + +NGInlineCursor::NGInlineCursor(const NGPhysicalBoxFragment& box_fragment) { + if (const NGFragmentItems* items = box_fragment.Items()) + SetRoot(box_fragment, *items); } NGInlineCursor::NGInlineCursor(const NGPaintFragment& root_paint_fragment) { @@ -144,11 +155,8 @@ return layout_object->ContainingNGBlockFlow(); } if (IsItemCursor()) { - const NGFragmentItem& item = fragment_items_->front(); - const LayoutObject* layout_object = item.GetLayoutObject(); - if (item.Type() == NGFragmentItem::kLine) - return To<LayoutBlockFlow>(layout_object); - return layout_object->ContainingNGBlockFlow(); + DCHECK(root_box_fragment_); + return To<LayoutBlockFlow>(root_box_fragment_->GetLayoutObject()); } NOTREACHED(); return nullptr; @@ -169,9 +177,10 @@ if (current_.item_) { unsigned descendants_count = current_.item_->DescendantsCount(); if (descendants_count > 1) { + DCHECK(root_box_fragment_); DCHECK(fragment_items_); return NGInlineCursor( - *fragment_items_, + *root_box_fragment_, *fragment_items_, ItemsSpan(&*(current_.item_iter_ + 1), descendants_count - 1)); } return NGInlineCursor(); @@ -1029,7 +1038,7 @@ } if (cursor.current_.item_) { if (!fragment_items_) - SetRoot(*cursor.fragment_items_); + SetRoot(*cursor.root_box_fragment_, *cursor.fragment_items_); // Note: We use address instead of iterato because we can't compare // iterators in different span. See |base::CheckedContiguousIterator<T>|. const ptrdiff_t index = &*cursor.current_.item_iter_ - &*items_.begin();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h index e16016ff..2be4356 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h
@@ -216,9 +216,9 @@ using ItemsSpan = NGFragmentItems::Span; explicit NGInlineCursor(const LayoutBlockFlow& block_flow); - explicit NGInlineCursor(const NGFragmentItems& items); - explicit NGInlineCursor(const NGFragmentItems& fragment_items, - ItemsSpan items); + explicit NGInlineCursor(const NGPhysicalBoxFragment& box_fragment); + NGInlineCursor(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& items); explicit NGInlineCursor(const NGPaintFragment& root_paint_fragment); explicit NGInlineCursor(const NGInlineBackwardCursor& backward_cursor); NGInlineCursor(const NGInlineCursor& other) = default; @@ -245,6 +245,12 @@ return *fragment_items_; } + // Returns the |NGPhysicalBoxFragment| that owns |Items|. + const NGPhysicalBoxFragment& BoxFragment() const { + DCHECK(root_box_fragment_); + return *root_box_fragment_; + } + // Returns the |LayoutBlockFlow| containing this cursor. const LayoutBlockFlow* GetLayoutBlockFlow() const; @@ -480,6 +486,10 @@ #endif private: + NGInlineCursor(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& fragment_items, + ItemsSpan items); + // Returns true if |this| is only for a part of an inline formatting context; // in other words, if |this| is created by |CursorForDescendants|. bool IsDescendantsCursor() const { @@ -508,8 +518,11 @@ // Move the cursor position to the first fragment in tree. void MoveToFirst(); - void SetRoot(const NGFragmentItems& items); - void SetRoot(const NGFragmentItems& fragment_items, ItemsSpan items); + void SetRoot(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& items); + void SetRoot(const NGPhysicalBoxFragment& box_fragment, + const NGFragmentItems& fragment_items, + ItemsSpan items); void SetRoot(const NGPaintFragment& root_paint_fragment); void SetRoot(const LayoutBlockFlow& block_flow); bool SetRoot(const LayoutBlockFlow& block_flow, wtf_size_t fragment_index); @@ -565,7 +578,7 @@ ItemsSpan items_; const NGFragmentItems* fragment_items_ = nullptr; - + const NGPhysicalBoxFragment* root_box_fragment_ = nullptr; const NGPaintFragment* root_paint_fragment_ = nullptr; CulledInlineTraversal culled_inline_;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc index 85ef9b7..6c79196 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor_test.cc
@@ -1189,16 +1189,16 @@ // Test cursors rooted at |NGFragmentItems|. // They can enumerate fragments only in the specified fragmentainer. - Vector<const NGFragmentItems*> fragment_items_list; + Vector<const NGPhysicalBoxFragment*> fragments; for (const NGPhysicalBoxFragment& fragment : block_flow->PhysicalFragments()) { - fragment_items_list.push_back(fragment.Items()); - DCHECK_NE(fragment_items_list.back(), nullptr); + DCHECK(fragment.HasItems()); + fragments.push_back(&fragment); } - EXPECT_EQ(fragment_items_list.size(), 3u); - TestFragment1(NGInlineCursor(*fragment_items_list[0])); - TestFragment2(NGInlineCursor(*fragment_items_list[1])); - TestFragment3(NGInlineCursor(*fragment_items_list[2])); + EXPECT_EQ(fragments.size(), 3u); + TestFragment1(NGInlineCursor(*fragments[0], *fragments[0]->Items())); + TestFragment2(NGInlineCursor(*fragments[1], *fragments[1]->Items())); + TestFragment3(NGInlineCursor(*fragments[2], *fragments[2]->Items())); } } // namespace
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc index e3602886..252185fc 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
@@ -286,7 +286,7 @@ if (child->IsInLayoutNGInlineFormattingContext()) { if (RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) { if (const NGFragmentItems* items = Base::FragmentItems()) - items->DirtyLinesFromChangedChild(child); + items->DirtyLinesFromChangedChild(*this, child); } } }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc index ba54d4ef..7bbf34f 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -991,7 +991,8 @@ // Find reusable lines. Fail if no items are reusable. previous_items->DirtyLinesFromNeedsLayout(inline_node.GetLayoutBlockFlow()); - const NGFragmentItem* end_item = previous_items->EndOfReusableItems(); + const NGFragmentItem* end_item = + previous_items->EndOfReusableItems(previous_fragment); DCHECK(end_item); if (!end_item || end_item == &previous_items->front()) return false; @@ -1011,7 +1012,7 @@ const NGConstraintSpace& space = ConstraintSpace(); DCHECK_EQ(items_builder->GetWritingDirection(), space.GetWritingDirection()); const auto result = - items_builder->AddPreviousItems(*previous_items, previous_fragment.Size(), + items_builder->AddPreviousItems(previous_fragment, *previous_items, &container_builder_, end_item, max_lines); if (UNLIKELY(!result.succeeded)) { DCHECK_EQ(children.size(), children_before);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 911cd94..b589457 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -1452,7 +1452,7 @@ if (previous_break_token) previously_consumed_block_size = previous_break_token->ConsumedBlockSize(); bool initial_container_is_flipped = Style().IsFlippedBlocksWritingMode(); - for (NGInlineCursor cursor(items); cursor; cursor.MoveToNext()) { + for (NGInlineCursor cursor(container, items); cursor; cursor.MoveToNext()) { if (const NGPhysicalBoxFragment* child = cursor.Current().BoxFragment()) { // Replaced elements and inline blocks need Location() set relative to // their block container.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc b/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc index 92cd91d..aa65979 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc
@@ -23,7 +23,7 @@ if (parent_break_token) child_break_tokens_ = parent_break_token->ChildBreakTokens(); if (parent.HasItems()) { - current_.cursor_.emplace(*parent.Items()); + current_.cursor_.emplace(parent); current_.block_break_token_ = parent_break_token; UpdateSelfFromCursor(); } else {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc index 965877c..d71aeff 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -590,7 +590,7 @@ // Traverse child items. if (items) { - for (NGInlineCursor cursor(*items); cursor; + for (NGInlineCursor cursor(*this, *items); cursor; cursor.MoveToNextSkippingChildren()) { const NGFragmentItem* item = cursor.CurrentItem(); if (item->Type() == NGFragmentItem::kLine) { @@ -737,7 +737,7 @@ if (IsScrollContainer()) point += PhysicalOffset(PixelSnappedScrolledContentOffset()); if (const NGFragmentItems* items = Items()) { - NGInlineCursor cursor(*items); + NGInlineCursor cursor(*this, *items); if (const PositionWithAffinity position = cursor.PositionForPointInInlineFormattingContext(point, *this)) return AdjustForEditingBoundary(position);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc index 09906d3e..0e8f61d1 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_container_fragment.cc
@@ -140,7 +140,7 @@ if (const auto* box = DynamicTo<NGPhysicalBoxFragment>(this)) { DCHECK_EQ(box->PostLayout(), box); if (const NGFragmentItems* items = box->Items()) { - for (NGInlineCursor cursor(*items); cursor; cursor.MoveToNext()) { + for (NGInlineCursor cursor(*box, *items); cursor; cursor.MoveToNext()) { DCHECK(cursor.Current().Item()); const NGFragmentItem& item = *cursor.Current().Item(); if (UNLIKELY(item.IsLayoutObjectDestroyedOrMoved()))
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc index ba19c9e3..96f6039 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -132,7 +132,7 @@ bool has_fragment_items = false; if (flags_ & NGPhysicalFragment::DumpItems) { if (const NGFragmentItems* fragment_items = box->Items()) { - NGInlineCursor cursor(*fragment_items); + NGInlineCursor cursor(*box, *fragment_items); Append(&cursor, indent + 2); has_fragment_items = true; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc index 06759f8..9498283 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_layout_algorithm.cc
@@ -210,8 +210,7 @@ auto* items_builder = container_builder_.ItemsBuilder(); DCHECK(items_builder); DCHECK_EQ(items_builder->GetWritingDirection(), writing_direction_); - items_builder->AddPreviousItems(*previous_items, - previous_physical_container_size_); + items_builder->AddPreviousItems(previous_fragment, *previous_items); } }
diff --git a/third_party/blink/renderer/core/mobile_metrics/build.gni b/third_party/blink/renderer/core/mobile_metrics/build.gni new file mode 100644 index 0000000..68fd1cf --- /dev/null +++ b/third_party/blink/renderer/core/mobile_metrics/build.gni
@@ -0,0 +1,8 @@ +# Copyright 2020 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. + +blink_core_sources_mobile_metrics = [ + "mobile_friendliness_checker.cc", + "mobile_friendliness_checker.h", +]
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc new file mode 100644 index 0000000..02fdb31f --- /dev/null +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -0,0 +1,42 @@ +// Copyright 2020 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 <sstream> + +#include "third_party/blink/renderer/core/frame/local_frame_view.h" +#include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" +#include "third_party/blink/renderer/core/page/viewport_description.h" + +namespace blink { + +MobileFriendlinessChecker::MobileFriendlinessChecker(LocalFrameView& frame_view) + : frame_view_(&frame_view) {} + +MobileFriendlinessChecker::~MobileFriendlinessChecker() = default; + +void MobileFriendlinessChecker::NotifyViewportUpdated( + const ViewportDescription& viewport) { + if (viewport.type != ViewportDescription::Type::kViewportMeta) + return; + + mobile_friendliness_.viewport_device_width = + viewport.max_width.IsDeviceWidth(); + if (viewport.max_width.IsFixed()) { + mobile_friendliness_.viewport_hardcoded_width = + viewport.max_width.GetFloatValue(); + } + if (viewport.zoom_is_explicit) + mobile_friendliness_.viewport_initial_scale = viewport.zoom; + + if (viewport.user_zoom_is_explicit) + mobile_friendliness_.allow_user_zoom = viewport.user_zoom; + + frame_view_->DidChangeMobileFriendliness(mobile_friendliness_); +} + +void MobileFriendlinessChecker::Trace(Visitor* visitor) const { + visitor->Trace(frame_view_); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h new file mode 100644 index 0000000..9242929 --- /dev/null +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
@@ -0,0 +1,40 @@ +// Copyright 2020 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 THIRD_PARTY_BLINK_RENDERER_CORE_MOBILE_METRICS_MOBILE_FRIENDLINESS_CHECKER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_MOBILE_METRICS_MOBILE_FRIENDLINESS_CHECKER_H_ + +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/heap/heap.h" +#include "third_party/blink/renderer/platform/heap/member.h" + +namespace blink { +class Visitor; +class LocalFrameView; +struct ViewportDescription; + +// Calculates the mobile usability of current page, especially friendliness on +// smart phone devices are checked. The calculated value will be sent as a part +// of UKM. +class CORE_EXPORT MobileFriendlinessChecker + : public GarbageCollected<MobileFriendlinessChecker> { + public: + explicit MobileFriendlinessChecker(LocalFrameView& frame_view); + virtual ~MobileFriendlinessChecker(); + + void NotifyViewportUpdated(const ViewportDescription&); + const blink::MobileFriendliness& GetMobileFriendliness() const { + return mobile_friendliness_; + } + void Trace(Visitor* visitor) const; + + private: + Member<LocalFrameView> frame_view_; + blink::MobileFriendliness mobile_friendliness_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_MOBILE_METRICS_MOBILE_FRIENDLINESS_CHECKER_H_
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc new file mode 100644 index 0000000..668c112 --- /dev/null +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
@@ -0,0 +1,104 @@ +// Copyright 2014 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 "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" +#include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" +#include "third_party/blink/public/web/web_settings.h" +#include "third_party/blink/renderer/core/frame/frame_test_helpers.h" +#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" +#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/url_test_helpers.h" + +namespace blink { + +static constexpr char kBaseUrl[] = "http://www.test.com/"; +class MobileFriendlinessCheckerTest : public testing::Test { + public: + ~MobileFriendlinessCheckerTest() override { + url_test_helpers::UnregisterAllURLsAndClearMemoryCache(); + } + + static void ConfigureAndroidSettings(WebSettings* settings) { + settings->SetJavaScriptEnabled(true); + settings->SetPreferCompositingToLCDTextEnabled(true); + settings->SetViewportEnabled(true); + settings->SetViewportMetaEnabled(true); + settings->SetShrinksViewportContentToFit(true); + settings->SetMainFrameResizesAreOrientationChanges(true); + } + + void SetUp() override { + helper_.Initialize(nullptr, nullptr, nullptr, ConfigureAndroidSettings); + } + + WebViewImpl* WebView() const { return helper_.GetWebView(); } + + const MobileFriendliness& CalculateMobileFriendlinessFromFile( + const std::string& path) { + RegisterMockedHttpURLLoad(path); + NavigateTo(kBaseUrl + path); + LocalFrameView& frame_view = *WebView()->MainFrameImpl()->GetFrameView(); + frame_view.UpdateLifecycleToPrePaintClean(DocumentUpdateReason::kTest); + return frame_view.GetMobileFriendlinessChecker().GetMobileFriendliness(); + } + + private: + void NavigateTo(const std::string& url) { + frame_test_helpers::LoadFrame(WebView()->MainFrameImpl(), url); + } + + void RegisterMockedHttpURLLoad(const std::string& file_name) { + url_test_helpers::RegisterMockedURLLoadFromBase( + WebString::FromUTF8(kBaseUrl), blink::test::CoreTestDataPath(), + WebString::FromUTF8(file_name)); + } + + frame_test_helpers::WebViewHelper helper_; +}; + +TEST_F(MobileFriendlinessCheckerTest, NoViewportSetting) { + MobileFriendliness expected_mf; + MobileFriendliness actual_mf = + CalculateMobileFriendlinessFromFile("bar.html"); + EXPECT_EQ(expected_mf, actual_mf); +} + +TEST_F(MobileFriendlinessCheckerTest, DeviceWidth) { + MobileFriendliness expected_mf; + expected_mf.viewport_device_width = true; + MobileFriendliness actual_mf = + CalculateMobileFriendlinessFromFile("viewport/viewport-1.html"); + EXPECT_EQ(expected_mf, actual_mf); +} + +TEST_F(MobileFriendlinessCheckerTest, HardcodedViewport) { + MobileFriendliness expected_mf; + expected_mf.viewport_hardcoded_width = 200; + MobileFriendliness actual_mf = + CalculateMobileFriendlinessFromFile("viewport/viewport-30.html"); + EXPECT_EQ(expected_mf, actual_mf); +} + +TEST_F(MobileFriendlinessCheckerTest, DeviceWidthWithInitialScale05) { + // Specifying initial-scale=0.5 is usually not the best choice for most web + // pages. But we cannot determine that such page must not be mobile friendly. + MobileFriendliness expected_mf; + expected_mf.viewport_device_width = true; + expected_mf.viewport_initial_scale = 0.5; + MobileFriendliness actual_mf = + CalculateMobileFriendlinessFromFile("viewport/viewport-34.html"); + EXPECT_EQ(expected_mf, actual_mf); +} + +TEST_F(MobileFriendlinessCheckerTest, UserZoom) { + MobileFriendliness expected_mf; + expected_mf.viewport_device_width = true; + expected_mf.viewport_initial_scale = 2.0; + expected_mf.allow_user_zoom = false; + MobileFriendliness actual_mf = CalculateMobileFriendlinessFromFile( + "viewport-initial-scale-and-user-scalable-no.html"); + EXPECT_EQ(expected_mf, actual_mf); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index 25aa44f..ef62ba2 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -572,7 +572,7 @@ PaintBlockFlowContents(paint_info, paint_offset); } else { DCHECK(physical_box_fragment.IsInlineBox()); - NGInlineCursor cursor(*items_); + NGInlineCursor cursor(physical_box_fragment, *items_); PaintInlineItems(paint_info.ForDescendants(), paint_offset, PhysicalOffset(), &cursor); } @@ -694,7 +694,7 @@ return; } DCHECK(items_); - NGInlineCursor children(*items_); + NGInlineCursor children(fragment, *items_); PaintLineBoxChildren(&children, paint_info.ForDescendants(), paint_offset); } @@ -882,7 +882,7 @@ if (const NGPhysicalBoxFragment* box = DynamicTo<NGPhysicalBoxFragment>(&container)) { if (const NGFragmentItems* items = box->Items()) { - NGInlineCursor cursor(*items); + NGInlineCursor cursor(*box, *items); PaintFloatingItems(float_paint_info, &cursor); return; } @@ -2273,9 +2273,9 @@ return false; } if (items_) { - NGInlineCursor cursor(*items_); - return HitTestChildren(hit_test, PhysicalFragment(), cursor, - accumulated_offset); + const NGPhysicalBoxFragment& fragment = PhysicalFragment(); + NGInlineCursor cursor(fragment, *items_); + return HitTestChildren(hit_test, fragment, cursor, accumulated_offset); } // Check descendants of this fragment because floats may be in the // |NGFragmentItems| of the descendants. @@ -2468,7 +2468,7 @@ if (const auto* box = DynamicTo<NGPhysicalBoxFragment>(&container)) { if (const NGFragmentItems* items = box->Items()) { - NGInlineCursor children(*items); + NGInlineCursor children(*box, *items); if (HitTestFloatingChildItems(hit_test, children, accumulated_offset)) return true; // Even if this turned out to be an inline formatting context, we need to
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc index 5860485..9c51a27 100644 --- a/third_party/blink/renderer/core/script/dynamic_module_resolver.cc +++ b/third_party/blink/renderer/core/script/dynamic_module_resolver.cc
@@ -154,8 +154,8 @@ // <spec step="7">Run the module script result, with the rethrow errors // boolean set to true.</spec> - ScriptEvaluationResult result = modulator_->ExecuteModule( - module_script, Modulator::CaptureEvalErrorFlag::kCapture); + ScriptEvaluationResult result = module_script->RunScriptAndReturnValue( + V8ScriptRunner::RethrowErrorsOption::Rethrow(String())); switch (result.GetResultType()) { case ScriptEvaluationResult::ResultType::kException: @@ -217,8 +217,8 @@ // step="2.3">Assert: Evaluate has already been invoked on moduleRecord // and successfully completed.</spec> // - // Because |error| is empty, we are sure that ExecuteModule() above was - // successfully completed. + // Because |error| is empty, we are sure that RunScriptAndReturnValue() + // above was successfully completed. // <spec // href="https://tc39.github.io/proposal-dynamic-import/#sec-finishdynamicimport"
diff --git a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc index 4f393a1..67af9dc 100644 --- a/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc +++ b/third_party/blink/renderer/core/script/dynamic_module_resolver_test.cc
@@ -37,7 +37,9 @@ class DynamicModuleResolverTestModulator final : public DummyModulator { public: explicit DynamicModuleResolverTestModulator(ScriptState* script_state) - : script_state_(script_state) {} + : script_state_(script_state) { + Modulator::SetModulator(script_state, this); + } ~DynamicModuleResolverTestModulator() override = default; void ResolveTreeFetch(ModuleScript* module_script) { @@ -91,17 +93,6 @@ fetch_tree_was_called_ = true; } - ScriptEvaluationResult ExecuteModule( - ModuleScript* module_script, - CaptureEvalErrorFlag capture_error) final { - EXPECT_EQ(CaptureEvalErrorFlag::kCapture, capture_error); - - ScriptState::EscapableScope scope(script_state_); - ScriptEvaluationResult result = ModuleRecord::Evaluate( - script_state_, module_script->V8Module(), module_script->SourceURL()); - return result.Escape(&scope); - } - Member<ScriptState> script_state_; Member<ModuleTreeClient> pending_client_; KURL expected_fetch_tree_url_;
diff --git a/third_party/blink/renderer/core/script/modulator.h b/third_party/blink/renderer/core/script/modulator.h index c84529e..fe0ac6d 100644 --- a/third_party/blink/renderer/core/script/modulator.h +++ b/third_party/blink/renderer/core/script/modulator.h
@@ -195,26 +195,12 @@ virtual Vector<ModuleRequest> ModuleRequestsFromModuleRecord( v8::Local<v8::Module>) = 0; - enum class CaptureEvalErrorFlag : bool { kReport, kCapture }; - - // ExecuteModule implements #run-a-module-script HTML spec algorithm. - // https://html.spec.whatwg.org/C/#run-a-module-script - // CaptureEvalErrorFlag is used to implement "rethrow errors" parameter in - // run-a-module-script. - // - When "rethrow errors" is to be set, use kCapture for EvaluateModule(). - // Then EvaluateModule() wraps exceptions in a ScriptEvaluationResult instead - // of throwing it and the caller should rethrow the exception. - // - When "rethrow errors" is not to be set, use kReport. If there is an error - // to throw, EvaluateModule() "report the error" inside it, and returns - // ScriptEvaluationResult wrapping the error. Otherwise, it returns either a - // ScriptEvaluationResult that is empty or contains the successful evaluation - // result. - virtual ScriptEvaluationResult ExecuteModule(ModuleScript*, - CaptureEvalErrorFlag) = 0; - virtual ModuleScriptFetcher* CreateModuleScriptFetcher( ModuleScriptCustomFetchType, util::PassKey<ModuleScriptLoader> pass_key) = 0; + + // Produce V8 code cache for the given ModuleScript and its submodules. + virtual void ProduceCacheModuleTreeTopLevel(ModuleScript*) = 0; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/script/modulator_impl_base.cc b/third_party/blink/renderer/core/script/modulator_impl_base.cc index 4cccd49..87b4419 100644 --- a/third_party/blink/renderer/core/script/modulator_impl_base.cc +++ b/third_party/blink/renderer/core/script/modulator_impl_base.cc
@@ -49,24 +49,6 @@ ModulatorImplBase::~ModulatorImplBase() {} -class ModuleEvaluationRejectionCallback final : public ScriptFunction { - public: - explicit ModuleEvaluationRejectionCallback(ScriptState* script_state) - : ScriptFunction(script_state) {} - - static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) { - ModuleEvaluationRejectionCallback* self = - MakeGarbageCollected<ModuleEvaluationRejectionCallback>(script_state); - return self->BindToV8Function(); - } - - private: - ScriptValue Call(ScriptValue value) override { - ModuleRecord::ReportException(GetScriptState(), value.V8Value()); - return ScriptValue(); - } -}; - bool ModulatorImplBase::IsScriptingDisabled() const { return !GetExecutionContext()->CanExecuteScripts(kAboutToExecuteScript); } @@ -335,101 +317,6 @@ } } -// <specdef href="https://html.spec.whatwg.org/C/#run-a-module-script"> -// Spec with TLA: https://github.com/whatwg/html/pull/4352 -ScriptEvaluationResult ModulatorImplBase::ExecuteModule( - ModuleScript* module_script, - CaptureEvalErrorFlag capture_error) { - // <spec step="1">If rethrow errors is not given, let it be false.</spec> - - // <spec step="2">Let settings be the settings object of script.</spec> - // - // The settings object is |this|. - - // <spec step="3">Check if we can run script with settings. If this returns - // "do not run" then return NormalCompletion(empty).</spec> - if (IsScriptingDisabled()) { - return ScriptEvaluationResult::FromModuleNotRun(); - } - - // <spec step="4">Prepare to run script given settings.</spec> - // - // These are placed here to also cover ModuleRecord::ReportException(). - v8::Isolate* isolate = script_state_->GetIsolate(); - v8::MicrotasksScope microtasks_scope(isolate, - ToMicrotaskQueue(GetExecutionContext()), - v8::MicrotasksScope::kRunMicrotasks); - ScriptState::EscapableScope scope(script_state_); - - // Without TLA: <spec step="5">Let evaluationStatus be null.</spec> - ScriptEvaluationResult result = ScriptEvaluationResult::FromModuleNotRun(); - - // <spec step="6">If script's error to rethrow is not null, ...</spec> - if (module_script->HasErrorToRethrow()) { - // Without TLA: <spec step="6">... then set evaluationStatus to Completion - // { [[Type]]: throw, [[Value]]: script's error to rethrow, - // [[Target]]: empty }.</spec> - // With TLA: <spec step="5">If script's error to rethrow is not null, - // then let valuationPromise be a promise rejected with script's error - // to rethrow.</spec> - result = ScriptEvaluationResult::FromModuleException( - module_script->CreateErrorToRethrow().V8Value()); - } else { - // <spec step="7">Otherwise:</spec> - - // <spec step="7.1">Let record be script's record.</spec> - v8::Local<v8::Module> record = module_script->V8Module(); - CHECK(!record.IsEmpty()); - - // <spec step="7.2">Set evaluationStatus to record.Evaluate(). ...</spec> - result = ModuleRecord::Evaluate(script_state_, record, - module_script->SourceURL()); - - // <spec step="7.2">... If Evaluate fails to complete as a result of the - // user agent aborting the running script, then set evaluationStatus to - // Completion { [[Type]]: throw, [[Value]]: a new "QuotaExceededError" - // DOMException, [[Target]]: empty }.</spec> - - // [not specced] Store V8 code cache on successful evaluation. - if (result.GetResultType() == - ScriptEvaluationResult::ResultType::kSuccess) { - TaskRunner()->PostTask( - FROM_HERE, - WTF::Bind(&ModulatorImplBase::ProduceCacheModuleTreeTopLevel, - WrapWeakPersistent(this), WrapPersistent(module_script))); - } - } - - if (capture_error == CaptureEvalErrorFlag::kReport) { - if (base::FeatureList::IsEnabled(features::kTopLevelAwait)) { - // <spec step="7"> If report errors is true, then upon rejection of - // evaluationPromise with reason, report the exception given by reason - // for script.</spec> - v8::Local<v8::Function> callback_failure = - ModuleEvaluationRejectionCallback::CreateFunction(script_state_); - // Add a rejection handler to report back errors once the result - // promise is rejected. - result.GetPromise(script_state_) - .Then(v8::Local<v8::Function>(), callback_failure); - } else { - // <spec step="8">If evaluationStatus is an abrupt completion, - // then:</spec> - if (result.GetResultType() == - ScriptEvaluationResult::ResultType::kException) { - // <spec step="8.2">Otherwise, report the exception given by - // evaluationStatus.[[Value]] for script.</spec> - ModuleRecord::ReportException(script_state_, - result.GetExceptionForModule()); - } - } - } - - // <spec step="8">Clean up after running script with settings.</spec> - // - Partially implement in MicrotaskScope destructor and the - // - ScriptState::EscapableScope destructor. - return result.Escape(&scope); -} - void ModulatorImplBase::Trace(Visitor* visitor) const { visitor->Trace(script_state_); visitor->Trace(map_);
diff --git a/third_party/blink/renderer/core/script/modulator_impl_base.h b/third_party/blink/renderer/core/script/modulator_impl_base.h index 41ad23db..ce455c8 100644 --- a/third_party/blink/renderer/core/script/modulator_impl_base.h +++ b/third_party/blink/renderer/core/script/modulator_impl_base.h
@@ -90,8 +90,6 @@ ScriptValue InstantiateModule(v8::Local<v8::Module>, const KURL&) override; Vector<ModuleRequest> ModuleRequestsFromModuleRecord( v8::Local<v8::Module>) override; - ScriptEvaluationResult ExecuteModule(ModuleScript*, - CaptureEvalErrorFlag) override; // Populates |reason| and returns true if the dynamic import is disallowed on // the associated execution context. In that case, a caller of this function @@ -100,7 +98,7 @@ // modification of |reason|. virtual bool IsDynamicImportForbidden(String* reason) = 0; - void ProduceCacheModuleTreeTopLevel(ModuleScript*); + void ProduceCacheModuleTreeTopLevel(ModuleScript*) override; void ProduceCacheModuleTree(ModuleScript*, HeapHashSet<Member<const ModuleScript>>*);
diff --git a/third_party/blink/renderer/core/script/module_script.cc b/third_party/blink/renderer/core/script/module_script.cc index 6c574d9..e4dbe76 100644 --- a/third_party/blink/renderer/core/script/module_script.cc +++ b/third_party/blink/renderer/core/script/module_script.cc
@@ -4,8 +4,11 @@ #include "third_party/blink/renderer/core/script/module_script.h" +#include "base/macros.h" #include "third_party/blink/renderer/bindings/core/v8/module_record.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/script/module_record_resolver.h" #include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" @@ -101,31 +104,31 @@ } void ModuleScript::RunScript(LocalDOMWindow*) { - // We need a HandleScope for the ScriptEvaluationResult that is created - // in ::ExecuteModule(...). + // We need a HandleScope for the `ScriptEvaluationResult` returned from + // `RunScriptAndReturnValue`. ScriptState::Scope scope(SettingsObject()->GetScriptState()); DVLOG(1) << *this << "::RunScript()"; - - SettingsObject()->ExecuteModule(this, - Modulator::CaptureEvalErrorFlag::kReport); + ignore_result(RunScriptAndReturnValue()); } bool ModuleScript::RunScriptOnWorkerOrWorklet( WorkerOrWorkletGlobalScope& global_scope) { - // We need a HandleScope for the ScriptEvaluationResult that is created - // in ::ExecuteModule(...). + // We need a HandleScope for the `ScriptEvaluationResult` returned from + // `RunScriptAndReturnValue`. ScriptState::Scope scope(SettingsObject()->GetScriptState()); DCHECK(global_scope.IsContextThread()); - // This |error| is always null because the second argument is |kReport|. // TODO(nhiroki): Catch an error when an evaluation error happens. // (https://crbug.com/680046) - ScriptEvaluationResult result = SettingsObject()->ExecuteModule( - this, Modulator::CaptureEvalErrorFlag::kReport); - + ScriptEvaluationResult result = RunScriptAndReturnValue(); return result.GetResultType() == ScriptEvaluationResult::ResultType::kSuccess; } +ScriptEvaluationResult ModuleScript::RunScriptAndReturnValue( + V8ScriptRunner::RethrowErrorsOption rethrow_errors) { + return V8ScriptRunner::EvaluateModule(this, std::move(rethrow_errors)); +} + std::pair<size_t, size_t> ModuleScript::GetClassicScriptSizes() const { return std::pair<size_t, size_t>(0, 0); }
diff --git a/third_party/blink/renderer/core/script/module_script.h b/third_party/blink/renderer/core/script/module_script.h index ab6083b..79199c5 100644 --- a/third_party/blink/renderer/core/script/module_script.h +++ b/third_party/blink/renderer/core/script/module_script.h
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/bindings/core/v8/module_record.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h" #include "third_party/blink/renderer/bindings/core/v8/world_safe_v8_reference.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/script/modulator.h" @@ -54,6 +55,16 @@ virtual void ProduceCache() {} const KURL& SourceURL() const { return source_url_; } + // https://html.spec.whatwg.org/C/#run-a-module-script + // Callers must enter a `v8::HandleScope` before calling. + // See the class comments of `RethrowErrorsOption` and + // `ScriptEvaluationResult` for exception handling and return value semantics. + WARN_UNUSED_RESULT ScriptEvaluationResult RunScriptAndReturnValue( + V8ScriptRunner::RethrowErrorsOption = + V8ScriptRunner::RethrowErrorsOption::DoNotRethrow()); + + Modulator* SettingsObject() const { return settings_object_; } + protected: ModuleScript(Modulator*, v8::Local<v8::Module>, @@ -61,8 +72,6 @@ const KURL& base_url, const ScriptFetchOptions&); - Modulator* SettingsObject() const { return settings_object_; } - private: mojom::blink::ScriptType GetScriptType() const override { return mojom::blink::ScriptType::kModule;
diff --git a/third_party/blink/renderer/core/script/module_script_test.cc b/third_party/blink/renderer/core/script/module_script_test.cc index 5bd22131..09f6f34 100644 --- a/third_party/blink/renderer/core/script/module_script_test.cc +++ b/third_party/blink/renderer/core/script/module_script_test.cc
@@ -167,10 +167,7 @@ module_script->V8Module(), module_script->SourceURL()) .IsEmpty()); - ASSERT_EQ(ModuleRecord::Evaluate(scope.GetScriptState(), - module_script->V8Module(), - module_script->SourceURL()) - .GetResultType(), + ASSERT_EQ(module_script->RunScriptAndReturnValue().GetResultType(), ScriptEvaluationResult::ResultType::kSuccess); TestFoo(scope); @@ -294,10 +291,7 @@ module_script->V8Module(), module_script->SourceURL()) .IsEmpty()); - ASSERT_EQ(ModuleRecord::Evaluate(scope.GetScriptState(), - module_script->V8Module(), - module_script->SourceURL()) - .GetResultType(), + ASSERT_EQ(module_script->RunScriptAndReturnValue().GetResultType(), ScriptEvaluationResult::ResultType::kSuccess); TestFoo(scope);
diff --git a/third_party/blink/renderer/core/streams/readable_stream.cc b/third_party/blink/renderer/core/streams/readable_stream.cc index 62680307..c3f55ec5 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.cc +++ b/third_party/blink/renderer/core/streams/readable_stream.cc
@@ -18,6 +18,7 @@ #include "third_party/blink/renderer/core/streams/promise_handler.h" #include "third_party/blink/renderer/core/streams/readable_stream_default_controller.h" #include "third_party/blink/renderer/core/streams/readable_stream_reader.h" +#include "third_party/blink/renderer/core/streams/readable_writable_pair.h" #include "third_party/blink/renderer/core/streams/stream_algorithms.h" #include "third_party/blink/renderer/core/streams/stream_pipe_options.h" #include "third_party/blink/renderer/core/streams/stream_promise_resolver.h" @@ -1229,143 +1230,86 @@ return getReader(script_state, exception_state); } -ScriptValue ReadableStream::pipeThrough(ScriptState* script_state, - ScriptValue transform_stream, - ExceptionState& exception_state) { - return pipeThrough(script_state, transform_stream, - StreamPipeOptions::Create(), exception_state); +ReadableStream* ReadableStream::pipeThrough(ScriptState* script_state, + ReadableWritablePair* transform, + ExceptionState& exception_state) { + return pipeThrough(script_state, transform, StreamPipeOptions::Create(), + exception_state); } // https://streams.spec.whatwg.org/#rs-pipe-through -ScriptValue ReadableStream::pipeThrough(ScriptState* script_state, - ScriptValue transform_stream, - const StreamPipeOptions* options, - ExceptionState& exception_state) { +ReadableStream* ReadableStream::pipeThrough(ScriptState* script_state, + ReadableWritablePair* transform, + const StreamPipeOptions* options, + ExceptionState& exception_state) { // https://streams.spec.whatwg.org/#rs-pipe-through - // The first part of this function implements the unpacking of the {readable, - // writable} argument to the method. - v8::Local<v8::Value> pair_value = transform_stream.V8Value(); - v8::Local<v8::Context> context = script_state->GetContext(); + DCHECK(transform->hasReadable()); + ReadableStream* readable_stream = transform->readable(); - constexpr char kWritableIsNotWritableStream[] = - "parameter 1's 'writable' property is not a WritableStream."; - constexpr char kReadableIsNotReadableStream[] = - "parameter 1's 'readable' property is not a ReadableStream."; - constexpr char kWritableIsLocked[] = "parameter 1's 'writable' is locked."; + DCHECK(transform->hasWritable()); + WritableStream* writable_stream = transform->writable(); - v8::Local<v8::Object> pair; - if (!pair_value->ToObject(context).ToLocal(&pair)) { - exception_state.ThrowTypeError(kWritableIsNotWritableStream); - return ScriptValue(); - } - - v8::Isolate* isolate = script_state->GetIsolate(); - v8::Local<v8::Value> writable, readable; - { - v8::TryCatch block(isolate); - if (!pair->Get(context, V8String(isolate, "writable")).ToLocal(&writable)) { - exception_state.RethrowV8Exception(block.Exception()); - return ScriptValue(); - } - DCHECK(!block.HasCaught()); - - if (!pair->Get(context, V8String(isolate, "readable")).ToLocal(&readable)) { - exception_state.RethrowV8Exception(block.Exception()); - return ScriptValue(); - } - DCHECK(!block.HasCaught()); - } - - // 2. If ! IsWritableStream(_writable_) is *false*, throw a *TypeError* - // exception. - WritableStream* writable_stream = - V8WritableStream::ToImplWithTypeCheck(isolate, writable); - if (!writable_stream) { - exception_state.ThrowTypeError(kWritableIsNotWritableStream); - return ScriptValue(); - } - - // 3. If ! IsReadableStream(_readable_) is *false*, throw a *TypeError* - // exception. - if (!V8ReadableStream::HasInstance(readable, isolate)) { - exception_state.ThrowTypeError(kReadableIsNotReadableStream); - return ScriptValue(); - } - - // 4. If signal is not undefined, and signal is not an instance of the - // AbortSignal interface, throw a TypeError exception. - auto* pipe_options = MakeGarbageCollected<PipeOptions>(options); - - // 5. If ! IsReadableStreamLocked(*this*) is *true*, throw a *TypeError* - // exception. + // 1. If ! IsReadableStreamLocked(this) is true, throw a TypeError exception. if (IsLocked(this)) { exception_state.ThrowTypeError("Cannot pipe a locked stream"); - return ScriptValue(); + return nullptr; } - // 6. If ! IsWritableStreamLocked(_writable_) is *true*, throw a *TypeError* - // exception. + // 2. If ! IsWritableStreamLocked(transform["writable"]) is true, throw a + // TypeError exception. if (WritableStream::IsLocked(writable_stream)) { - exception_state.ThrowTypeError(kWritableIsLocked); - return ScriptValue(); + exception_state.ThrowTypeError("parameter 1's 'writable' is locked"); + return nullptr; } - // 7. Let _promise_ be ! ReadableStreamPipeTo(*this*, _writable_, - // _preventClose_, _preventAbort_, _preventCancel_, - // _signal_). + // 3. Let signal be options["signal"] if it exists, or undefined otherwise. + auto* pipe_options = MakeGarbageCollected<PipeOptions>(options); + // 4. Let promise be ! ReadableStreamPipeTo(this, transform["writable"], + // options["preventClose"], options["preventAbort"], + // options["preventCancel"], signal). ScriptPromise promise = PipeTo(script_state, this, writable_stream, pipe_options); - // 8. Set _promise_.[[PromiseIsHandled]] to *true*. + // 5. Set promise.[[PromiseIsHandled]] to true. promise.MarkAsHandled(); - // 9. Return _readable_. - return ScriptValue(script_state->GetIsolate(), readable); + // 6. Return transform["readable"]. + return readable_stream; } ScriptPromise ReadableStream::pipeTo(ScriptState* script_state, - ScriptValue destination, + WritableStream* destination, ExceptionState& exception_state) { return pipeTo(script_state, destination, StreamPipeOptions::Create(), exception_state); } ScriptPromise ReadableStream::pipeTo(ScriptState* script_state, - ScriptValue destination_value, + WritableStream* destination, const StreamPipeOptions* options, ExceptionState& exception_state) { // https://streams.spec.whatwg.org/#rs-pipe-to - // 2. If ! IsWritableStream(dest) is false, return a promise rejected with a - // TypeError exception. - // TODO(ricea): Do this in the IDL instead. - WritableStream* destination = V8WritableStream::ToImplWithTypeCheck( - script_state->GetIsolate(), destination_value.V8Value()); - - if (!destination) { - exception_state.ThrowTypeError("Illegal invocation"); - return ScriptPromise(); - } - - // 3. If signal is not undefined, and signal is not an instance of the - // AbortSignal interface, return a promise rejected with a TypeError - // exception. - auto* pipe_options = MakeGarbageCollected<PipeOptions>(options); - - // 4. If ! IsReadableStreamLocked(this) is true, return a promise rejected - // with a TypeError exception. + // 1. If ! IsReadableStreamLocked(this) is true, return a promise rejected + // with a TypeError exception. if (IsLocked(this)) { exception_state.ThrowTypeError("Cannot pipe a locked stream"); return ScriptPromise(); } - // 5. If ! IsWritableStreamLocked(dest) is true, return a promise rejected - // with a TypeError exception. + // 2. If ! IsWritableStreamLocked(destination) is true, return a promise + // rejected with a TypeError exception. if (WritableStream::IsLocked(destination)) { exception_state.ThrowTypeError("Cannot pipe to a locked stream"); return ScriptPromise(); } + // 3. Let signal be options["signal"] if it exists, or undefined otherwise. + auto* pipe_options = MakeGarbageCollected<PipeOptions>(options); + + // 4. Return ! ReadableStreamPipeTo(this, destination, + // options["preventClose"], options["preventAbort"], + // options["preventCancel"], signal). return PipeTo(script_state, this, destination, pipe_options); }
diff --git a/third_party/blink/renderer/core/streams/readable_stream.h b/third_party/blink/renderer/core/streams/readable_stream.h index 0f40be2..a80c602 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.h +++ b/third_party/blink/renderer/core/streams/readable_stream.h
@@ -21,6 +21,7 @@ class ExceptionState; class MessagePort; class ReadableStreamDefaultController; +class ReadableWritablePair; class ScriptPromise; class ScriptState; class StrategySizeAlgorithm; @@ -115,21 +116,23 @@ ScriptValue options, ExceptionState&); - ScriptValue pipeThrough(ScriptState*, - ScriptValue transform_stream, - ExceptionState&); + ReadableStream* pipeThrough(ScriptState*, + ReadableWritablePair* transform, + ExceptionState&); // https://streams.spec.whatwg.org/#rs-pipe-through - ScriptValue pipeThrough(ScriptState*, - ScriptValue transform_stream, - const StreamPipeOptions* options, - ExceptionState&); + ReadableStream* pipeThrough(ScriptState*, + ReadableWritablePair* transform, + const StreamPipeOptions* options, + ExceptionState&); - ScriptPromise pipeTo(ScriptState*, ScriptValue destination, ExceptionState&); + ScriptPromise pipeTo(ScriptState*, + WritableStream* destination, + ExceptionState&); // https://streams.spec.whatwg.org/#rs-pipe-to ScriptPromise pipeTo(ScriptState*, - ScriptValue destination_value, + WritableStream* destination, const StreamPipeOptions* options, ExceptionState&);
diff --git a/third_party/blink/renderer/core/streams/readable_stream.idl b/third_party/blink/renderer/core/streams/readable_stream.idl index 743cdb8..d5fde2c769 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.idl +++ b/third_party/blink/renderer/core/streams/readable_stream.idl
@@ -12,9 +12,9 @@ // TODO(yhirano): function length is different from what's specced. Fix it. [RaisesException, CallWith=ScriptState] Promise<any> cancel(optional any reason); [RaisesException, CallWith=ScriptState, MeasureAs=ReadableStreamGetReader] ReadableStreamDefaultReader getReader(optional any mode); - [RaisesException, CallWith=ScriptState, MeasureAs=ReadableStreamPipeThrough] any pipeThrough( - any transformStream, optional StreamPipeOptions options); + [RaisesException, CallWith=ScriptState, MeasureAs=ReadableStreamPipeThrough] ReadableStream pipeThrough( + ReadableWritablePair transform, optional StreamPipeOptions options); [RaisesException, CallWith=ScriptState, MeasureAs=ReadableStreamPipeTo] Promise<any> pipeTo( - any destination, optional StreamPipeOptions options); + WritableStream destination, optional StreamPipeOptions options); [RaisesException, CallWith=ScriptState] any tee(); };
diff --git a/third_party/blink/renderer/core/streams/readable_writable_pair.idl b/third_party/blink/renderer/core/streams/readable_writable_pair.idl new file mode 100644 index 0000000..dc74b49 --- /dev/null +++ b/third_party/blink/renderer/core/streams/readable_writable_pair.idl
@@ -0,0 +1,10 @@ +// Copyright 2020 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. + +// https://streams.spec.whatwg.org/#dictdef-readablewritablepair + +dictionary ReadableWritablePair { + required ReadableStream readable; + required WritableStream writable; +};
diff --git a/third_party/blink/renderer/core/testing/dummy_modulator.cc b/third_party/blink/renderer/core/testing/dummy_modulator.cc index 8ca1f367..876b7cb4 100644 --- a/third_party/blink/renderer/core/testing/dummy_modulator.cc +++ b/third_party/blink/renderer/core/testing/dummy_modulator.cc
@@ -169,12 +169,6 @@ return Vector<ModuleRequest>(); } -ScriptEvaluationResult DummyModulator::ExecuteModule(ModuleScript*, - CaptureEvalErrorFlag) { - NOTREACHED(); - return ScriptEvaluationResult::FromModuleNotRun(); -} - ModuleScriptFetcher* DummyModulator::CreateModuleScriptFetcher( ModuleScriptCustomFetchType, util::PassKey<ModuleScriptLoader> pass_key) { @@ -182,4 +176,6 @@ return nullptr; } +void DummyModulator::ProduceCacheModuleTreeTopLevel(ModuleScript*) {} + } // namespace blink
diff --git a/third_party/blink/renderer/core/testing/dummy_modulator.h b/third_party/blink/renderer/core/testing/dummy_modulator.h index ae36753d..19f1523 100644 --- a/third_party/blink/renderer/core/testing/dummy_modulator.h +++ b/third_party/blink/renderer/core/testing/dummy_modulator.h
@@ -76,11 +76,10 @@ ScriptValue InstantiateModule(v8::Local<v8::Module>, const KURL&) override; Vector<ModuleRequest> ModuleRequestsFromModuleRecord( v8::Local<v8::Module>) override; - ScriptEvaluationResult ExecuteModule(ModuleScript*, - CaptureEvalErrorFlag) override; ModuleScriptFetcher* CreateModuleScriptFetcher( ModuleScriptCustomFetchType, util::PassKey<ModuleScriptLoader>) override; + void ProduceCacheModuleTreeTopLevel(ModuleScript*) override; Member<ModuleRecordResolver> resolver_; };
diff --git a/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc b/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc index f8f4090..1b03c451 100644 --- a/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc +++ b/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc
@@ -70,10 +70,7 @@ } // Step 5: "Run a module script given script." - ScriptEvaluationResult result = - Modulator::From(script_state_) - ->ExecuteModule(module_script, - Modulator::CaptureEvalErrorFlag::kReport); + ScriptEvaluationResult result = module_script->RunScriptAndReturnValue(); auto* global_scope = To<WorkletGlobalScope>(ExecutionContext::From(script_state_));
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc index f291382..26effa43 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.cc
@@ -121,6 +121,25 @@ } } +void MediaStreamDeviceObserver::OnDeviceRequestStateChange( + const String& label, + const MediaStreamDevice& device, + const mojom::blink::MediaStreamStateChange new_state) { + DVLOG(1) << __func__ << " label=" << label << " device_id=" << device.id; + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + + auto it = label_stream_map_.find(label); + if (it == label_stream_map_.end()) { + // This can happen if a user stops a device from JS at the same + // time as the underlying media device is unplugged from the system. + return; + } + Stream* stream = &it->value; + + if (stream->on_device_request_state_change_cb) + stream->on_device_request_state_change_cb.Run(device, new_state); +} + void MediaStreamDeviceObserver::BindMediaStreamDeviceObserverReceiver( mojo::PendingReceiver<mojom::blink::MediaStreamDeviceObserver> receiver) { receiver_.reset(); @@ -132,12 +151,16 @@ const blink::MediaStreamDevices& audio_devices, const blink::MediaStreamDevices& video_devices, WebMediaStreamDeviceObserver::OnDeviceStoppedCb on_device_stopped_cb, - WebMediaStreamDeviceObserver::OnDeviceChangedCb on_device_changed_cb) { + WebMediaStreamDeviceObserver::OnDeviceChangedCb on_device_changed_cb, + WebMediaStreamDeviceObserver::OnDeviceRequestStateChangeCb + on_device_request_state_change_cb) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); Stream stream; stream.on_device_stopped_cb = std::move(on_device_stopped_cb); stream.on_device_changed_cb = std::move(on_device_changed_cb); + stream.on_device_request_state_change_cb = + std::move(on_device_request_state_change_cb); stream.audio_devices = audio_devices; stream.video_devices = video_devices;
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h index 26ec980..1e99adae 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h +++ b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer.h
@@ -45,7 +45,9 @@ const blink::MediaStreamDevices& audio_devices, const blink::MediaStreamDevices& video_devices, WebMediaStreamDeviceObserver::OnDeviceStoppedCb on_device_stopped_cb, - WebMediaStreamDeviceObserver::OnDeviceChangedCb on_device_changed_cb); + WebMediaStreamDeviceObserver::OnDeviceChangedCb on_device_changed_cb, + WebMediaStreamDeviceObserver::OnDeviceRequestStateChangeCb + on_device_request_state_change_cb); void AddStream(const String& label, const blink::MediaStreamDevice& device); bool RemoveStream(const String& label); void RemoveStreamDevice(const blink::MediaStreamDevice& device); @@ -66,12 +68,16 @@ FRIEND_TEST_ALL_PREFIXES(MediaStreamDeviceObserverTest, OnDeviceChanged); FRIEND_TEST_ALL_PREFIXES(MediaStreamDeviceObserverTest, OnDeviceChangedChangesDeviceAfterRebind); + FRIEND_TEST_ALL_PREFIXES(MediaStreamDeviceObserverTest, + OnDeviceRequestStateChange); // Private class for keeping track of opened devices and who have // opened it. struct Stream { WebMediaStreamDeviceObserver::OnDeviceStoppedCb on_device_stopped_cb; WebMediaStreamDeviceObserver::OnDeviceChangedCb on_device_changed_cb; + WebMediaStreamDeviceObserver::OnDeviceRequestStateChangeCb + on_device_request_state_change_cb; MediaStreamDevices audio_devices; MediaStreamDevices video_devices; }; @@ -82,6 +88,10 @@ void OnDeviceChanged(const String& label, const MediaStreamDevice& old_device, const MediaStreamDevice& new_device) override; + void OnDeviceRequestStateChange( + const String& label, + const MediaStreamDevice& device, + const mojom::blink::MediaStreamStateChange new_state) override; void BindMediaStreamDeviceObserverReceiver( mojo::PendingReceiver<mojom::blink::MediaStreamDeviceObserver> receiver);
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer_test.cc index 7a8e309..6baf2598 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_device_observer_test.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_device_observer_test.cc
@@ -204,4 +204,33 @@ EXPECT_EQ(video_devices[0].id, "video_device-456"); } +TEST_F(MediaStreamDeviceObserverTest, OnDeviceRequestStateChange) { + const int kRequestId = 5; + + EXPECT_EQ(observer_->label_stream_map_.size(), 0u); + + // OpenDevice request. + base::RunLoop run_loop1; + mock_dispatcher_host_.OpenDevice( + kRequestId, "device_path", + blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE, + base::BindOnce(&MediaStreamDeviceObserverTest::OnDeviceOpened, + base::Unretained(this), run_loop1.QuitClosure())); + run_loop1.Run(); + + EXPECT_EQ(observer_->label_stream_map_.size(), 1u); + + observer_->OnDeviceRequestStateChange( + stream_label_, current_device_, + mojom::blink::MediaStreamStateChange::PAUSE); + + EXPECT_EQ(observer_->label_stream_map_.size(), 1u); + + observer_->OnDeviceRequestStateChange( + stream_label_, current_device_, + mojom::blink::MediaStreamStateChange::PLAY); + + EXPECT_EQ(observer_->label_stream_map_.size(), 1u); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc index fa36dc3..a713db5 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
@@ -682,9 +682,16 @@ void MediaStreamVideoTrack::OnReadyStateChanged( WebMediaStreamSource::ReadyState state) { DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); - for (auto* sink : sinks_) + + // Copy the vectors first, since sinks might DisconnectFromTrack() and + // invalidate iterators. + + Vector<WebMediaStreamSink*> sinks_copy(sinks_); + for (auto* sink : sinks_copy) sink->OnReadyStateChanged(state); - for (auto* encoded_sink : encoded_sinks_) + + Vector<WebMediaStreamSink*> encoded_sinks_copy(encoded_sinks_); + for (auto* encoded_sink : encoded_sinks_copy) encoded_sink->OnReadyStateChanged(state); }
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc index 3d76553..4eaa82c 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -1188,6 +1188,47 @@ source_impl->ChangeSource(new_device); } +void UserMediaProcessor::OnDeviceRequestStateChange( + const MediaStreamDevice& device, + const mojom::blink::MediaStreamStateChange new_state) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + SendLogMessage(base::StringPrintf( + "OnDeviceRequestStateChange({session_id=%s}, {device_id=%s}, " + "{new_state=%s})", + device.session_id().ToString().c_str(), device.id.c_str(), + (new_state == mojom::blink::MediaStreamStateChange::PAUSE ? "PAUSE" + : "PLAY"))); + + MediaStreamSource* source = FindLocalSource(device); + if (!source) { + // This happens if the same device is used in several guM requests or + // if a user happens to stop a track from JS at the same time + // as the underlying media device is unplugged from the system. + return; + } + + WebPlatformMediaStreamSource* const source_impl = source->GetPlatformSource(); + source_impl->SetSourceMuted(new_state == + mojom::blink::MediaStreamStateChange::PAUSE); + MediaStreamVideoSource* video_source = + static_cast<blink::MediaStreamVideoSource*>(source_impl); + if (!video_source) { + return; + } + if (new_state == mojom::blink::MediaStreamStateChange::PAUSE) { + if (video_source->IsRunning()) { + video_source->StopForRestart(base::DoNothing()); + } + } else if (new_state == mojom::blink::MediaStreamStateChange::PLAY) { + if (video_source->IsStoppedForRestart()) { + video_source->Restart(*video_source->GetCurrentFormat(), + base::DoNothing()); + } + } else { + NOTREACHED(); + } +} + void UserMediaProcessor::Trace(Visitor* visitor) const { visitor->Trace(dispatcher_host_); visitor->Trace(frame_); @@ -1383,6 +1424,8 @@ WTF::BindRepeating(&UserMediaProcessor::OnDeviceStopped, WrapWeakPersistent(this)), WTF::BindRepeating(&UserMediaProcessor::OnDeviceChanged, + WrapWeakPersistent(this)), + WTF::BindRepeating(&UserMediaProcessor::OnDeviceRequestStateChange, WrapWeakPersistent(this))); }
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.h b/third_party/blink/renderer/modules/mediastream/user_media_processor.h index ca0d8709..6c49015 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_processor.h +++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.h
@@ -86,6 +86,9 @@ void OnDeviceStopped(const blink::MediaStreamDevice& device); void OnDeviceChanged(const blink::MediaStreamDevice& old_device, const blink::MediaStreamDevice& new_device); + void OnDeviceRequestStateChange( + const MediaStreamDevice& device, + const mojom::blink::MediaStreamStateChange new_state); void set_media_stream_dispatcher_host_for_testing( mojo::PendingRemote<blink::mojom::blink::MediaStreamDispatcherHost>
diff --git a/third_party/blink/renderer/modules/mediastream/web_media_stream_device_observer.cc b/third_party/blink/renderer/modules/mediastream/web_media_stream_device_observer.cc index 8a3105e..52effbe0 100644 --- a/third_party/blink/renderer/modules/mediastream/web_media_stream_device_observer.cc +++ b/third_party/blink/renderer/modules/mediastream/web_media_stream_device_observer.cc
@@ -28,10 +28,12 @@ const MediaStreamDevices& audio_devices, const MediaStreamDevices& video_devices, OnDeviceStoppedCb on_device_stopped_cb, - OnDeviceChangedCb on_device_changed_cb) { + OnDeviceChangedCb on_device_changed_cb, + OnDeviceRequestStateChangeCb on_device_request_state_change_cb) { observer_->AddStream(label, audio_devices, video_devices, std::move(on_device_stopped_cb), - std::move(on_device_changed_cb)); + std::move(on_device_changed_cb), + std::move(on_device_request_state_change_cb)); } void WebMediaStreamDeviceObserver::AddStream(const WebString& label,
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc index d37ab20c..f34366d 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc
@@ -26,6 +26,7 @@ #include "third_party/blink/renderer/core/messaging/message_channel.h" #include "third_party/blink/renderer/core/messaging/message_port.h" #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h" +#include "third_party/blink/renderer/core/script/js_module_script.h" #include "third_party/blink/renderer/core/script/script.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h" @@ -149,7 +150,9 @@ EXPECT_TRUE(exception.IsEmpty()); ScriptEvaluationResult result = - ModuleRecord::Evaluate(script_state, module, js_url); + JSModuleScript::CreateForTest(Modulator::From(script_state), module, + js_url) + ->RunScriptAndReturnValue(); return result.GetResultType() == ScriptEvaluationResult::ResultType::kSuccess; }
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc index 0a1daa3..6314257 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
@@ -28,6 +28,7 @@ #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/worker_devtools_params.h" #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h" +#include "third_party/blink/renderer/core/script/js_module_script.h" #include "third_party/blink/renderer/core/script/script.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h" @@ -121,7 +122,9 @@ ModuleRecord::Instantiate(script_state, module, js_url); EXPECT_TRUE(exception.IsEmpty()); ScriptEvaluationResult result = - ModuleRecord::Evaluate(script_state, module, js_url); + JSModuleScript::CreateForTest(Modulator::From(script_state), module, + js_url) + ->RunScriptAndReturnValue(); EXPECT_EQ(result.GetResultType(), ScriptEvaluationResult::ResultType::kSuccess); wait_event->Signal();
diff --git a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc index e4bfb7de..84d6002 100644 --- a/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc +++ b/third_party/blink/renderer/modules/worklet/animation_and_paint_worklet_thread_test.cc
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h" #include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h" #include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/core/script/js_module_script.h" #include "third_party/blink/renderer/core/script/script.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/core/workers/parent_execution_context_task_runners.h" @@ -81,9 +82,11 @@ ScriptValue exception = ModuleRecord::Instantiate(script_state, module, js_url); EXPECT_TRUE(exception.IsEmpty()); - EXPECT_EQ( - ModuleRecord::Evaluate(script_state, module, js_url).GetResultType(), - ScriptEvaluationResult::ResultType::kSuccess); + EXPECT_EQ(JSModuleScript::CreateForTest(Modulator::From(script_state), + module, js_url) + ->RunScriptAndReturnValue() + .GetResultType(), + ScriptEvaluationResult::ResultType::kSuccess); wait_event->Signal(); } };
diff --git a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc index 8fbc532..b9fbc7db 100644 --- a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc +++ b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.cc
@@ -199,6 +199,15 @@ {"und-Orya", "or"}, // Oriya {"und-Taml", "ta"}, // Tamil {"und-Telu", "te"}, // Telugu + + // List of locales with hyphens not to fall back. + {"de-1901", nullptr}, + {"de-1996", nullptr}, + {"de-ch-1901", nullptr}, + {"en-gb", nullptr}, + {"en-us", nullptr}, + {"mn-cyrl", nullptr}, + {"und-ethi", nullptr}, }; LocaleMap map; for (const auto& it : locale_fallback_data) @@ -206,12 +215,28 @@ return map; } +// static +AtomicString HyphenationMinikin::MapLocale(const AtomicString& locale) { + DEFINE_STATIC_LOCAL(LocaleMap, locale_fallback, (CreateLocaleFallbackMap())); + for (AtomicString mapped_locale = locale;;) { + const auto& it = locale_fallback.find(mapped_locale); + if (it != locale_fallback.end()) { + if (it->value) + return it->value; + return mapped_locale; + } + const wtf_size_t last_hyphen = mapped_locale.ReverseFind('-'); + if (last_hyphen == kNotFound || !last_hyphen) + return mapped_locale; + mapped_locale = AtomicString(mapped_locale.GetString().Left(last_hyphen)); + } +} + scoped_refptr<Hyphenation> Hyphenation::PlatformGetHyphenation( const AtomicString& locale) { - DEFINE_STATIC_LOCAL(LocaleMap, locale_fallback, (CreateLocaleFallbackMap())); - const auto& it = locale_fallback.find(locale); - if (it != locale_fallback.end()) - return LayoutLocale::Get(it->value)->GetHyphenation(); + const AtomicString mapped_locale = HyphenationMinikin::MapLocale(locale); + if (mapped_locale.Impl() != locale.Impl()) + return LayoutLocale::Get(mapped_locale)->GetHyphenation(); scoped_refptr<HyphenationMinikin> hyphenation( base::AdoptRef(new HyphenationMinikin));
diff --git a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.h b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.h index e17bacf..e3c39c1 100644 --- a/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.h +++ b/third_party/blink/renderer/platform/text/hyphenation/hyphenation_minikin.h
@@ -28,6 +28,8 @@ wtf_size_t before_index) const override; Vector<wtf_size_t, 8> HyphenLocations(const StringView&) const override; + static AtomicString MapLocale(const AtomicString& locale); + static scoped_refptr<HyphenationMinikin> FromFileForTesting(base::File); private:
diff --git a/third_party/blink/renderer/platform/text/hyphenation_test.cc b/third_party/blink/renderer/platform/text/hyphenation_test.cc index 5fae8d4..1b608fa4 100644 --- a/third_party/blink/renderer/platform/text/hyphenation_test.cc +++ b/third_party/blink/renderer/platform/text/hyphenation_test.cc
@@ -72,6 +72,33 @@ EXPECT_EQ(nullptr, LayoutLocale::Get("en-UK")->GetHyphenation()); } +#if defined(USE_MINIKIN_HYPHENATION) +TEST_F(HyphenationTest, MapLocale) { + EXPECT_EQ(HyphenationMinikin::MapLocale("de-de"), "de-1996"); + EXPECT_EQ(HyphenationMinikin::MapLocale("de-de-xyz"), "de-1996"); + EXPECT_EQ(HyphenationMinikin::MapLocale("de-li"), "de-1996"); + EXPECT_EQ(HyphenationMinikin::MapLocale("de-li-1901"), "de-ch-1901"); + EXPECT_EQ(HyphenationMinikin::MapLocale("en"), "en-gb"); + EXPECT_EQ(HyphenationMinikin::MapLocale("en-gu"), "en-us"); + EXPECT_EQ(HyphenationMinikin::MapLocale("en-gu-xyz"), "en-us"); + EXPECT_EQ(HyphenationMinikin::MapLocale("en-xyz"), "en-gb"); + EXPECT_EQ(HyphenationMinikin::MapLocale("en-xyz-xyz"), "en-gb"); + EXPECT_EQ(HyphenationMinikin::MapLocale("fr-ca"), "fr"); + EXPECT_EQ(HyphenationMinikin::MapLocale("fr-fr"), "fr"); + EXPECT_EQ(HyphenationMinikin::MapLocale("fr-fr-xyz"), "fr"); + EXPECT_EQ(HyphenationMinikin::MapLocale("mn-xyz"), "mn-cyrl"); + EXPECT_EQ(HyphenationMinikin::MapLocale("und-Deva-xyz"), "hi"); + + const char* no_map_locales[] = {"en-us", "fr"}; + for (const char* locale_str : no_map_locales) { + AtomicString locale(locale_str); + AtomicString mapped_locale = HyphenationMinikin::MapLocale(locale); + // If no mapping, the same instance should be returned. + EXPECT_EQ(locale.Impl(), mapped_locale.Impl()); + } +} +#endif + #if defined(USE_MINIKIN_HYPHENATION) || defined(OS_MAC) TEST_F(HyphenationTest, HyphenLocations) { scoped_refptr<Hyphenation> hyphenation = GetHyphenation("en-us");
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc index c1533935..a08ef5e 100644 --- a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc +++ b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
@@ -273,6 +273,42 @@ return dst_frame; } +scoped_refptr<media::VideoFrame> MakeScaledNV12VideoFrame( + scoped_refptr<media::VideoFrame> source_frame, + scoped_refptr<blink::WebRtcVideoFrameAdapter::BufferPoolOwner> + scaled_frame_pool) { + gfx::GpuMemoryBuffer* gmb = source_frame->GetGpuMemoryBuffer(); + if (!gmb || !gmb->Map()) { + return nullptr; + } + // Crop to the visible rectangle specified in |source_frame|. + const uint8_t* src_y = (reinterpret_cast<const uint8_t*>(gmb->memory(0)) + + source_frame->visible_rect().x() + + (source_frame->visible_rect().y() * gmb->stride(0))); + const uint8_t* src_uv = + (reinterpret_cast<const uint8_t*>(gmb->memory(1)) + + ((source_frame->visible_rect().x() / 2) * 2) + + ((source_frame->visible_rect().y() / 2) * gmb->stride(1))); + + auto dst_frame = scaled_frame_pool->CreateFrame( + media::PIXEL_FORMAT_NV12, source_frame->natural_size(), + gfx::Rect(source_frame->natural_size()), source_frame->natural_size(), + source_frame->timestamp()); + dst_frame->metadata()->MergeMetadataFrom(source_frame->metadata()); + const auto& nv12_planes = dst_frame->layout().planes(); + libyuv::NV12Scale(src_y, gmb->stride(0), src_uv, gmb->stride(1), + source_frame->visible_rect().width(), + source_frame->visible_rect().height(), + dst_frame->data(media::VideoFrame::kYPlane), + nv12_planes[media::VideoFrame::kYPlane].stride, + dst_frame->data(media::VideoFrame::kUVPlane), + nv12_planes[media::VideoFrame::kUVPlane].stride, + dst_frame->coded_size().width(), + dst_frame->coded_size().height(), libyuv::kFilterBox); + gmb->Unmap(); + return dst_frame; +} + scoped_refptr<media::VideoFrame> ConstructVideoFrameFromGpu( scoped_refptr<media::VideoFrame> source_frame, scoped_refptr<blink::WebRtcVideoFrameAdapter::BufferPoolOwner> @@ -287,11 +323,14 @@ // Convert to I420 and scale to the natural size specified in |source_frame|. const bool dont_convert_nv12_image = base::FeatureList::IsEnabled(blink::features::kWebRtcLibvpxEncodeNV12); - if (dont_convert_nv12_image && - source_frame->natural_size() == source_frame->visible_rect().size()) { + if (!dont_convert_nv12_image) { + return MakeScaledI420VideoFrame(std::move(source_frame), + std::move(scaled_frame_pool)); + } else if (source_frame->natural_size() == + source_frame->visible_rect().size()) { return WrapGmbVideoFrameForMappedMemoryAccess(std::move(source_frame)); } else { - return MakeScaledI420VideoFrame(std::move(source_frame), + return MakeScaledNV12VideoFrame(std::move(source_frame), std::move(scaled_frame_pool)); } }
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc index f03ab08..f04b3a2 100644 --- a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc +++ b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc
@@ -91,9 +91,12 @@ auto i420_frame = gmb_frame_adapter->ToI420(); EXPECT_EQ(i420_frame->width(), kNaturalSize.width()); EXPECT_EQ(i420_frame->height(), kNaturalSize.height()); + auto* get_i420_frame = gmb_frame_adapter->GetI420(); + EXPECT_EQ(get_i420_frame->width(), kNaturalSize.width()); + EXPECT_EQ(get_i420_frame->height(), kNaturalSize.height()); } -TEST(WebRtcVideoFrameAdapterTest, Nv12WrapsGmbWhenNoScalingNeeeded) { +TEST(WebRtcVideoFrameAdapterTest, Nv12WrapsGmbWhenNoScalingNeeededWithFeature) { base::test::ScopedFeatureList scoped_feautre_list; scoped_feautre_list.InitAndEnableFeature( blink::features::kWebRtcLibvpxEncodeNV12); @@ -135,4 +138,45 @@ EXPECT_EQ(i420_frame->height(), kNaturalSize.height()); } +TEST(WebRtcVideoFrameAdapterTest, Nv12ScalesGmbWithFeature) { + base::test::ScopedFeatureList scoped_feautre_list; + scoped_feautre_list.InitAndEnableFeature( + blink::features::kWebRtcLibvpxEncodeNV12); + const gfx::Size kCodedSize(1280, 960); + const gfx::Rect kVisibleRect(0, 120, 1280, 720); + const gfx::Size kNaturalSize(640, 360); + scoped_refptr<WebRtcVideoFrameAdapter::BufferPoolOwner> pool = + new WebRtcVideoFrameAdapter::BufferPoolOwner(); + + auto gmb_frame = + CreateTestFrame(kCodedSize, kVisibleRect, kNaturalSize, + media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER); + + // The adapter should report width and height from the natural size for + // VideoFrame backed by GpuMemoryBuffer. + rtc::scoped_refptr<webrtc::VideoFrameBuffer> gmb_frame_adapter( + new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(gmb_frame, pool)); + EXPECT_EQ(gmb_frame_adapter->width(), kNaturalSize.width()); + EXPECT_EQ(gmb_frame_adapter->height(), kNaturalSize.height()); + + // Under feature, expect that the adapted frame is NV12 with frame should + // have the same size as the natural size. + std::vector<webrtc::VideoFrameBuffer::Type> nv12_type{ + webrtc::VideoFrameBuffer::Type::kNV12}; + auto nv12_frame = gmb_frame_adapter->GetMappedFrameBuffer(nv12_type); + ASSERT_TRUE(nv12_frame); + EXPECT_EQ(webrtc::VideoFrameBuffer::Type::kNV12, nv12_frame->type()); + EXPECT_EQ(nv12_frame->width(), kNaturalSize.width()); + EXPECT_EQ(nv12_frame->height(), kNaturalSize.height()); + + // Even though we have an NV12 frame, ToI420 should return an I420 frame. + std::vector<webrtc::VideoFrameBuffer::Type> i420_type{ + webrtc::VideoFrameBuffer::Type::kI420}; + EXPECT_FALSE(gmb_frame_adapter->GetMappedFrameBuffer(i420_type)); + auto i420_frame = gmb_frame_adapter->ToI420(); + ASSERT_TRUE(i420_frame); + EXPECT_EQ(i420_frame->width(), kNaturalSize.width()); + EXPECT_EQ(i420_frame->height(), kNaturalSize.height()); +} + } // namespace blink
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index df34f18..8a92358 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -6053,6 +6053,7 @@ # Temporarily disable tests to allow a fix in devtools frontend crbug.com/1011811 http/tests/devtools/modules-load-initial.js [ Pass Failure ] +crbug.com/1035309 http/tests/devtools/throttling/mobile-throttling.js [ Pass Failure ] crbug.com/1092794 fast/canvas/OffscreenCanvas-2d-placeholder-willReadFrequently.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/android/ChromiumWPTExpectations b/third_party/blink/web_tests/android/ChromiumWPTExpectations index 6529218..7d28c29 100644 --- a/third_party/blink/web_tests/android/ChromiumWPTExpectations +++ b/third_party/blink/web_tests/android/ChromiumWPTExpectations
@@ -2720,8 +2720,6 @@ crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-in-setInterval.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-failure.https.any.html [ Failure ] @@ -2729,8 +2727,6 @@ crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-success.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-success.any.worker.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-incumbent.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html [ Failure ]
diff --git a/third_party/blink/web_tests/android/WeblayerWPTExpectations b/third_party/blink/web_tests/android/WeblayerWPTExpectations index acec65cd..4bfe84d 100644 --- a/third_party/blink/web_tests/android/WeblayerWPTExpectations +++ b/third_party/blink/web_tests/android/WeblayerWPTExpectations
@@ -2624,8 +2624,6 @@ crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-in-setInterval.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-failure.https.any.html [ Failure ] @@ -2633,8 +2631,6 @@ crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-success.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-success.any.worker.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-incumbent.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html [ Failure ]
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations index c91dbb8..f6b4f3a 100644 --- a/third_party/blink/web_tests/android/WebviewWPTExpectations +++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -2835,8 +2835,6 @@ crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-in-setInterval.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/compile-error-same-origin-with-hash.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/requires-failure.https.any.html [ Failure ] @@ -2846,8 +2844,6 @@ crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html [ Timeout ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry.html [ Timeout ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-incumbent.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html [ Failure ] -crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html [ Failure ] crbug.com/1050754 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-same-origin-with-hash.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/is-specificity-shadow-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/is-specificity-shadow-expected.txt new file mode 100644 index 0000000..077db756 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/is-specificity-shadow-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Specificity of :host() inside :is() assert_equals: expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/is-specificity-shadow.html b/third_party/blink/web_tests/external/wpt/css/selectors/is-specificity-shadow.html new file mode 100644 index 0000000..af03995 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/is-specificity-shadow.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>Specificity of :host() inside :is()</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#matches"> +<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector"> +<style> + main :not(:is(:host(#a))) { color: green; } + main :not(:is(:host(.a))) { color: red; } +</style> +<main> + <div id=element>Green</div> +</main> +<script> + test(function() { + assert_equals(getComputedStyle(element).color, 'rgb(0, 128, 0)'); + }, 'Specificity of :host() inside :is()'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval-expected.txt deleted file mode 100644 index fa2584f..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL window.onerror - compile error in cross-origin setInterval assert_equals: first arg expected "Script error." but got "Uncaught SyntaxError: Unexpected end of input" -FAIL window.onerror - compile error in cross-origin setInterval (column) assert_equals: fourth arg expected 0 but got 2 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html index 14e9a8bc2..c4028e6 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html
@@ -10,22 +10,13 @@ <script> setup({allow_uncaught_exception:true}); var t = async_test(); - var t_col = async_test(document.title+' (column)'); var ran = false; - var col_value; var interval; - window.onerror = t.step_func(function(a, b, c, d){ + window.addEventListener('error', t.step_func(e => { clearInterval(interval); ran = true; - col_value = d; - assert_equals(a, 'Script error.', 'first arg'); - assert_equals(b, '', 'second arg'); - assert_equals(c, 0, 'third arg'); - }); - function col_check() { - assert_equals(col_value, 0, 'fourth arg'); - t_col.done(); - } + assert_equals(e.error.constructor, SyntaxError); + })); var script = document.createElement('script'); script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/syntax-error-in-setInterval.js'); document.body.appendChild(script);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout-expected.txt deleted file mode 100644 index bfa9c01c..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL window.onerror - compile error in cross-origin setTimeout assert_equals: first arg expected "Script error." but got "Uncaught SyntaxError: Unexpected end of input" -FAIL window.onerror - compile error in cross-origin setTimeout (column) assert_equals: fourth arg expected 0 but got 2 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html index 7c46cc2..1eebf82f 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html
@@ -10,20 +10,11 @@ <script> setup({allow_uncaught_exception:true}); var t = async_test(); - var t_col = async_test(document.title+' (column)'); var ran = false; - var col_value; - window.onerror = t.step_func(function(a, b, c, d){ + window.addEventListener('error', t.step_func(e => { ran = true; - col_value = d; - assert_equals(a, 'Script error.', 'first arg'); - assert_equals(b, '', 'second arg'); - assert_equals(c, 0, 'third arg'); - }); - function col_check() { - assert_equals(col_value, 0, 'fourth arg'); - t_col.done(); - } + assert_equals(e.error.constructor, SyntaxError); + })); var script = document.createElement('script'); script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/syntax-error-in-setTimeout.js'); document.body.appendChild(script);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval-expected.txt deleted file mode 100644 index 1a692dd..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL window.onerror - runtime error in cross-origin setInterval assert_equals: first arg expected "Script error." but got "Uncaught ReferenceError: undefined_variable is not defined" -FAIL window.onerror - runtime error in cross-origin setInterval (column) assert_equals: fourth arg expected 0 but got 1 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html index dd97566..8b92f7d 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html
@@ -10,22 +10,13 @@ <script> setup({allow_uncaught_exception:true}); var t = async_test(); - var t_col = async_test(document.title+' (column)'); var ran = false; - var col_value; var interval; - window.onerror = t.step_func(function(a, b, c, d){ + window.addEventListener('error', t.step_func(e => { clearInterval(interval); ran = true; - col_value = d; - assert_equals(a, 'Script error.', 'first arg'); - assert_equals(b, '', 'second arg'); - assert_equals(c, 0, 'third arg'); - }); - function col_check() { - assert_equals(col_value, 0, 'fourth arg'); - t_col.done(); - } + assert_equals(e.error.constructor, ReferenceError); + })); var script = document.createElement('script'); script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/undefined-variable-in-setInterval.js'); document.body.appendChild(script);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout-expected.txt deleted file mode 100644 index 2067df8..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL window.onerror - runtime error in cross-origin setTimeout assert_equals: first arg expected "Script error." but got "Uncaught ReferenceError: undefined_variable is not defined" -FAIL window.onerror - runtime error in cross-origin setTimeout (column) assert_equals: fourth arg expected 0 but got 1 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html index 6f9add5..2e1a9d2 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html
@@ -10,20 +10,11 @@ <script> setup({allow_uncaught_exception:true}); var t = async_test(); - var t_col = async_test(document.title+' (column)'); var ran = false; - var col_value; - window.onerror = t.step_func(function(a, b, c, d){ + window.addEventListener('error', t.step_func(e => { ran = true; - col_value = d; - assert_equals(a, 'Script error.', 'first arg'); - assert_equals(b, '', 'second arg'); - assert_equals(c, 0, 'third arg'); - }); - function col_check() { - assert_equals(col_value, 0, 'fourth arg'); - t_col.done(); - } + assert_equals(e.error.constructor, ReferenceError); + })); var script = document.createElement('script'); script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/undefined-variable-in-setTimeout.js'); document.body.appendChild(script);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js index 3b42fd9..afec1144 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js
@@ -5,5 +5,4 @@ assert_true(ran, 'ran'); t.done(); }); - t_col.step(col_check); }, 20); \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js index 84eb4fc..427542b 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js
@@ -4,5 +4,4 @@ assert_true(ran, 'ran'); t.done(); }); - t_col.step(col_check); }, 20);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js index 4aa7da8..c2a017a 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js
@@ -5,5 +5,4 @@ assert_true(ran, 'ran'); t.done(); }); - t_col.step(col_check); }, 20); \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js index 6350ab6..6fa54cd 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js
@@ -4,5 +4,4 @@ assert_true(ran, 'ran'); t.done(); }); - t_col.step(col_check); }, 20);
diff --git a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any-expected.txt b/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any-expected.txt deleted file mode 100644 index a7d386a..0000000 --- a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any-expected.txt +++ /dev/null
@@ -1,43 +0,0 @@ -This is a testharness.js-based test. -PASS Piping through a duck-typed pass-through transform stream should work -PASS Piping through a transform errored on the writable end does not cause an unhandled promise rejection -PASS pipeThrough should not call pipeTo on this -PASS pipeThrough should not call pipeTo on the ReadableStream prototype -PASS pipeThrough should brand-check this and not allow 'null' -FAIL pipeThrough should brand-check readable and not allow 'null' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'undefined' -FAIL pipeThrough should brand-check readable and not allow 'undefined' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '0' -FAIL pipeThrough should brand-check readable and not allow '0' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'NaN' -FAIL pipeThrough should brand-check readable and not allow 'NaN' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'true' -FAIL pipeThrough should brand-check readable and not allow 'true' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'ReadableStream' -FAIL pipeThrough should brand-check readable and not allow 'ReadableStream' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '[object ReadableStream]' -FAIL pipeThrough should brand-check readable and not allow '[object ReadableStream]' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check writable and not allow 'null' -PASS pipeThrough should brand-check writable and not allow 'undefined' -PASS pipeThrough should brand-check writable and not allow '0' -PASS pipeThrough should brand-check writable and not allow 'NaN' -PASS pipeThrough should brand-check writable and not allow 'true' -PASS pipeThrough should brand-check writable and not allow 'WritableStream' -PASS pipeThrough should brand-check writable and not allow '[object WritableStream]' -PASS pipeThrough should rethrow errors from accessing readable or writable -PASS invalid values of signal should throw; specifically 'null' -PASS invalid values of signal should throw; specifically '0' -PASS invalid values of signal should throw; specifically 'NaN' -PASS invalid values of signal should throw; specifically 'true' -PASS invalid values of signal should throw; specifically 'AbortSignal' -PASS invalid values of signal should throw; specifically '[object AbortSignal]' -PASS pipeThrough should accept a real AbortSignal -PASS pipeThrough should throw if this is locked -PASS pipeThrough should throw if writable is locked -PASS pipeThrough should not care if readable is locked -PASS preventCancel should work -PASS preventClose should work -PASS preventAbort should work -PASS pipeThrough() should throw if an option getter grabs a writer -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.serviceworker-expected.txt deleted file mode 100644 index a7d386a..0000000 --- a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.serviceworker-expected.txt +++ /dev/null
@@ -1,43 +0,0 @@ -This is a testharness.js-based test. -PASS Piping through a duck-typed pass-through transform stream should work -PASS Piping through a transform errored on the writable end does not cause an unhandled promise rejection -PASS pipeThrough should not call pipeTo on this -PASS pipeThrough should not call pipeTo on the ReadableStream prototype -PASS pipeThrough should brand-check this and not allow 'null' -FAIL pipeThrough should brand-check readable and not allow 'null' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'undefined' -FAIL pipeThrough should brand-check readable and not allow 'undefined' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '0' -FAIL pipeThrough should brand-check readable and not allow '0' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'NaN' -FAIL pipeThrough should brand-check readable and not allow 'NaN' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'true' -FAIL pipeThrough should brand-check readable and not allow 'true' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'ReadableStream' -FAIL pipeThrough should brand-check readable and not allow 'ReadableStream' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '[object ReadableStream]' -FAIL pipeThrough should brand-check readable and not allow '[object ReadableStream]' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check writable and not allow 'null' -PASS pipeThrough should brand-check writable and not allow 'undefined' -PASS pipeThrough should brand-check writable and not allow '0' -PASS pipeThrough should brand-check writable and not allow 'NaN' -PASS pipeThrough should brand-check writable and not allow 'true' -PASS pipeThrough should brand-check writable and not allow 'WritableStream' -PASS pipeThrough should brand-check writable and not allow '[object WritableStream]' -PASS pipeThrough should rethrow errors from accessing readable or writable -PASS invalid values of signal should throw; specifically 'null' -PASS invalid values of signal should throw; specifically '0' -PASS invalid values of signal should throw; specifically 'NaN' -PASS invalid values of signal should throw; specifically 'true' -PASS invalid values of signal should throw; specifically 'AbortSignal' -PASS invalid values of signal should throw; specifically '[object AbortSignal]' -PASS pipeThrough should accept a real AbortSignal -PASS pipeThrough should throw if this is locked -PASS pipeThrough should throw if writable is locked -PASS pipeThrough should not care if readable is locked -PASS preventCancel should work -PASS preventClose should work -PASS preventAbort should work -PASS pipeThrough() should throw if an option getter grabs a writer -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.sharedworker-expected.txt deleted file mode 100644 index a7d386a..0000000 --- a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.sharedworker-expected.txt +++ /dev/null
@@ -1,43 +0,0 @@ -This is a testharness.js-based test. -PASS Piping through a duck-typed pass-through transform stream should work -PASS Piping through a transform errored on the writable end does not cause an unhandled promise rejection -PASS pipeThrough should not call pipeTo on this -PASS pipeThrough should not call pipeTo on the ReadableStream prototype -PASS pipeThrough should brand-check this and not allow 'null' -FAIL pipeThrough should brand-check readable and not allow 'null' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'undefined' -FAIL pipeThrough should brand-check readable and not allow 'undefined' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '0' -FAIL pipeThrough should brand-check readable and not allow '0' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'NaN' -FAIL pipeThrough should brand-check readable and not allow 'NaN' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'true' -FAIL pipeThrough should brand-check readable and not allow 'true' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'ReadableStream' -FAIL pipeThrough should brand-check readable and not allow 'ReadableStream' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '[object ReadableStream]' -FAIL pipeThrough should brand-check readable and not allow '[object ReadableStream]' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check writable and not allow 'null' -PASS pipeThrough should brand-check writable and not allow 'undefined' -PASS pipeThrough should brand-check writable and not allow '0' -PASS pipeThrough should brand-check writable and not allow 'NaN' -PASS pipeThrough should brand-check writable and not allow 'true' -PASS pipeThrough should brand-check writable and not allow 'WritableStream' -PASS pipeThrough should brand-check writable and not allow '[object WritableStream]' -PASS pipeThrough should rethrow errors from accessing readable or writable -PASS invalid values of signal should throw; specifically 'null' -PASS invalid values of signal should throw; specifically '0' -PASS invalid values of signal should throw; specifically 'NaN' -PASS invalid values of signal should throw; specifically 'true' -PASS invalid values of signal should throw; specifically 'AbortSignal' -PASS invalid values of signal should throw; specifically '[object AbortSignal]' -PASS pipeThrough should accept a real AbortSignal -PASS pipeThrough should throw if this is locked -PASS pipeThrough should throw if writable is locked -PASS pipeThrough should not care if readable is locked -PASS preventCancel should work -PASS preventClose should work -PASS preventAbort should work -PASS pipeThrough() should throw if an option getter grabs a writer -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.worker-expected.txt deleted file mode 100644 index a7d386a..0000000 --- a/third_party/blink/web_tests/external/wpt/streams/piping/pipe-through.any.worker-expected.txt +++ /dev/null
@@ -1,43 +0,0 @@ -This is a testharness.js-based test. -PASS Piping through a duck-typed pass-through transform stream should work -PASS Piping through a transform errored on the writable end does not cause an unhandled promise rejection -PASS pipeThrough should not call pipeTo on this -PASS pipeThrough should not call pipeTo on the ReadableStream prototype -PASS pipeThrough should brand-check this and not allow 'null' -FAIL pipeThrough should brand-check readable and not allow 'null' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'undefined' -FAIL pipeThrough should brand-check readable and not allow 'undefined' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '0' -FAIL pipeThrough should brand-check readable and not allow '0' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'NaN' -FAIL pipeThrough should brand-check readable and not allow 'NaN' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'true' -FAIL pipeThrough should brand-check readable and not allow 'true' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow 'ReadableStream' -FAIL pipeThrough should brand-check readable and not allow 'ReadableStream' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check this and not allow '[object ReadableStream]' -FAIL pipeThrough should brand-check readable and not allow '[object ReadableStream]' assert_false: writable should not have been accessed expected false got true -PASS pipeThrough should brand-check writable and not allow 'null' -PASS pipeThrough should brand-check writable and not allow 'undefined' -PASS pipeThrough should brand-check writable and not allow '0' -PASS pipeThrough should brand-check writable and not allow 'NaN' -PASS pipeThrough should brand-check writable and not allow 'true' -PASS pipeThrough should brand-check writable and not allow 'WritableStream' -PASS pipeThrough should brand-check writable and not allow '[object WritableStream]' -PASS pipeThrough should rethrow errors from accessing readable or writable -PASS invalid values of signal should throw; specifically 'null' -PASS invalid values of signal should throw; specifically '0' -PASS invalid values of signal should throw; specifically 'NaN' -PASS invalid values of signal should throw; specifically 'true' -PASS invalid values of signal should throw; specifically 'AbortSignal' -PASS invalid values of signal should throw; specifically '[object AbortSignal]' -PASS pipeThrough should accept a real AbortSignal -PASS pipeThrough should throw if this is locked -PASS pipeThrough should throw if writable is locked -PASS pipeThrough should not care if readable is locked -PASS preventCancel should work -PASS preventClose should work -PASS preventAbort should work -PASS pipeThrough() should throw if an option getter grabs a writer -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/cors-errors-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/network/cors-errors-expected.txt new file mode 100644 index 0000000..2065779 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/cors-errors-expected.txt
@@ -0,0 +1,35 @@ +Test to make sure CORS errors are correctly reported. +{ + canceled : false + corsErrorStatus : { + corsError : AllowOriginMismatch + failedParameter : http://127.0.0.1 + } + errorText : net::ERR_FAILED + requestId : <string> + timestamp : <number> + type : Fetch +} +{ + canceled : false + corsErrorStatus : { + corsError : MissingAllowOriginHeader + failedParameter : + } + errorText : net::ERR_FAILED + requestId : <string> + timestamp : <number> + type : Fetch +} +{ + canceled : false + corsErrorStatus : { + corsError : PreflightInvalidAllowOriginValue + failedParameter : 1 + } + errorText : net::ERR_FAILED + requestId : <string> + timestamp : <number> + type : Fetch +} +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/cors-errors.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/cors-errors.js new file mode 100644 index 0000000..6fab6905 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/cors-errors.js
@@ -0,0 +1,41 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Test to make sure CORS errors are correctly reported.`); + + // This url should be cross origin. + const url = + `https://127.0.0.1:8443/inspector-protocol/network/resources/cors-headers.php`; + + await dp.Network.enable(); + + const failures = []; + let checkComplete; + let completion = new Promise(r => { + checkComplete = () => failures.length == 3 && r(); + }); + + dp.Network.onLoadingFailed(event => { + failures.push(event.params); + checkComplete(); + }); + + session.evaluate(` + fetch('${url}'); + `); + session.evaluate(` + fetch('${url}?origin=${encodeURIComponent('http://127.0.0.1')}'); + `); + session.evaluate(` + fetch("${ + url}?methods=GET&origin=1", {method: 'POST', mode: 'cors', body: 'FOO', cache: 'no-cache', headers: { 'Content-Type': 'application/json'} }); + `); + + await completion; + failures.sort( + (a, b) => a.corsErrorStatus.corsError.localeCompare( + b.corsErrorStatus.corsError)); + for (const failure of failures) { + testRunner.log(failure); + } + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/cors-headers.php b/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/cors-headers.php new file mode 100644 index 0000000..cdcbc6f --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/cors-headers.php
@@ -0,0 +1,15 @@ +<?php +$origin = !empty($_GET['origin']) ? $_GET['origin'] : '*'; +if (isset($_GET['origin'])) { + header("Access-Control-Allow-Origin: $origin"); +} +$methods = !empty($_GET['methods']) ? $_GET['methods'] : 'OPTIONS'; +header("Access-Control-Allow-Methods: $methods"); +header('Access-Control-Allow-Headers: content-type'); +if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { + echo 'replied to options with Access-Control-Allow headers'; + http_response_code(400); +} else { + echo 'post data: ' . file_get_contents('php://input'); +} +?>
diff --git a/third_party/blink/web_tests/http/tests/navigation/back-send-referrer-expected.txt b/third_party/blink/web_tests/http/tests/navigation/back-send-referrer-expected.txt index 13d7413..56b5628a 100644 --- a/third_party/blink/web_tests/http/tests/navigation/back-send-referrer-expected.txt +++ b/third_party/blink/web_tests/http/tests/navigation/back-send-referrer-expected.txt
@@ -1,2 +1,2 @@ Referrer: http://127.0.0.1:8000/navigation/back-send-referrer.html -window.name: 3 +history.length : 3
diff --git a/third_party/blink/web_tests/http/tests/navigation/resources/back-send-referrer-helper.php b/third_party/blink/web_tests/http/tests/navigation/resources/back-send-referrer-helper.php index 6d9dd3c2..fe9bfbb4 100644 --- a/third_party/blink/web_tests/http/tests/navigation/resources/back-send-referrer-helper.php +++ b/third_party/blink/web_tests/http/tests/navigation/resources/back-send-referrer-helper.php
@@ -7,25 +7,36 @@ <html> <script> - window.name = parseInt(window.name) + 1; -</script> + // This test consists of following 3 pages in its history. + // a. back-send-referrer.html + // b. back-send-referrer-helper.php + // c. back-send-referrer-helper.php?x=42 + // It expects to navigate a.->b.->c.-(back)->b. and the last navigation + // handles the referrer correctly. + window.addEventListener('pageshow', () => { + document.getElementById('length').innerText = history.length; -Referrer: <?php echo $_SERVER['HTTP_REFERER']; ?> -<br/> -window.name: <script>document.write(window.name)</script> - -<form name=loopback action="" method=GET></form> - -<script> - if (window.name == 1) { - // Navigate once more (in a timeout) to add a history entry. - setTimeout(function() {document.loopback.submit();}, 0); - } else if (window.name == 2) { - history.go(-1); + if (history.length == 2) { + // Showing b. for the first time. + // Navigate once more (in a timeout) to add a history entry. + setTimeout(function() { document.loopback.submit(); }, 0); + } else if (location.search) { + // Showing c. The query means nothing. + setTimeout(function() { history.back(); }, 0); } else { - if (window.testRunner) - testRunner.notifyDone(); + // Should be showing b. for the second time. + if (window.testRunner) { + testRunner.notifyDone(); + } } + }); </script> -</html> +Referrer: <?php echo $_SERVER['HTTP_REFERER']; ?><br> +history.length : <span id="length"></span> + +<form name=loopback action="" method=GET> + <input type="hidden" name="x" value="42"> +</form> + +</html> \ No newline at end of file
diff --git a/third_party/closure_compiler/externs/accessibility_private.js b/third_party/closure_compiler/externs/accessibility_private.js index be013ed..45c952be 100644 --- a/third_party/closure_compiler/externs/accessibility_private.js +++ b/third_party/closure_compiler/externs/accessibility_private.js
@@ -274,11 +274,9 @@ chrome.accessibilityPrivate.updateSwitchAccessBubble = function(bubble, show, anchor, actions) {}; /** - * Enables or disables point scanning in Switch Access. - * @param {boolean} enabled True for start point scanning, false for end point - * scanning. + * Activates point scanning in Switch Access. */ -chrome.accessibilityPrivate.enablePointScan = function(enabled) {}; +chrome.accessibilityPrivate.activatePointScan = function() {}; /** * Sets current ARC app to use native ARC support.
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index c4d1903..c1f78f1 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -1532,7 +1532,6 @@ if asan: cmdline += [os.path.join('bin', 'run_with_asan'), '--'] cmdline += [ - '../../testing/test_env.py', '../../build/android/test_wrapper/logdog_wrapper.py', '--target', target, '--logdog-bin-cmd', '../../.task_template_packages/logdog_butler', @@ -1547,7 +1546,6 @@ ] elif is_cros_device and test_type != 'script': cmdline += [ - '../../testing/test_env.py', os.path.join('bin', 'run_%s' % target), '--logs-dir=${ISOLATED_OUTDIR}', ]
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index ffe85e1..0cb5939 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -914,6 +914,7 @@ 'fuchsia-fyi-x64-rel': 'release_trybot_fuchsia', 'fuchsia_x64': 'release_trybot_fuchsia', 'fuchsia-x64-cast': 'release_trybot_fuchsia_cast', + 'gpu-fyi-try-linux-amd-rel': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-intel-dqp': 'angle_deqp_release_trybot', 'gpu-fyi-try-linux-intel-exp': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-intel-rel': 'gpu_fyi_tests_release_trybot', @@ -1071,6 +1072,7 @@ 'gpu-fyi-try-win7-nvidia-dqp-64': 'angle_deqp_release_trybot', 'gpu-fyi-try-win7-nvidia-rel-32': 'gpu_fyi_tests_release_trybot_x86', 'gpu-fyi-try-win7-nvidia-rel-64': 'gpu_fyi_tests_release_trybot', + 'gpu-fyi-try-win10-amd-rel-64': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-win10-intel-dqp-64': 'angle_deqp_release_trybot', 'gpu-fyi-try-win10-intel-exp-64': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-win10-intel-rel-64': 'gpu_fyi_tests_release_trybot',
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json index 5c2b537..80447e6 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -122,6 +122,20 @@ "use_goma": true } }, + "gpu-fyi-try-linux-amd-rel": { + "gn_args": { + "build_angle_gles1_conform_tests": true, + "build_angle_trace_perf_tests": true, + "dcheck_always_on": true, + "ffmpeg_branding": "Chrome", + "internal_gles2_conform_tests": true, + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "symbol_level": 1, + "use_goma": true + } + }, "gpu-fyi-try-linux-intel-dqp": { "gn_args": { "build_angle_deqp_tests": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.win.json b/tools/mb/mb_config_expectations/tryserver.chromium.win.json index db8ca55..adf39d45 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.win.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.win.json
@@ -1,4 +1,18 @@ { + "gpu-fyi-try-win10-amd-rel-64": { + "gn_args": { + "build_angle_gles1_conform_tests": true, + "build_angle_trace_perf_tests": true, + "dcheck_always_on": true, + "ffmpeg_branding": "Chrome", + "internal_gles2_conform_tests": true, + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "symbol_level": 1, + "use_goma": true + } + }, "gpu-fyi-try-win10-intel-dqp-64": { "gn_args": { "build_angle_deqp_tests": true,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 3d48771..4fa7c7dc 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -7319,6 +7319,11 @@ <int value="1" label="Some data available to fill"/> </enum> +<enum name="BooleanAutofillFormFillSuccessIOS"> + <int value="0" label="Not filled"/> + <int value="1" label="Filled"/> +</enum> + <enum name="BooleanAutofillInteractionAfterParsedAsType"> <int value="0" label="No interaction"/> <int value="1" label="Interaction observed"/> @@ -16640,6 +16645,11 @@ <int value="5" label="HeavyAd Element opened"/> <int value="6" label="ContentSecurityPolicy Directive opened"/> <int value="7" label="ContentSecurityPolicy Element opened"/> + <int value="8" label="CrossOriginEmbedderPolicy LearnMore opened"/> + <int value="9" label="MixedContent LearnMore opened"/> + <int value="10" label="SameSiteCookie LearnMore opened"/> + <int value="11" label="HeavyAd LearnMore opened"/> + <int value="12" label="ContentSecurityPolicy LearnMore opened"/> </enum> <enum name="DevToolsKeybindSets"> @@ -25174,7 +25184,7 @@ <int value="1517" label="FILEMANAGERPRIVATEINTERNAL_GETPDFTHUMBNAIL"/> <int value="1518" label="AUTOTESTPRIVATE_REMOVEALLNOTIFICATIONS"/> <int value="1519" label="VIRTUALKEYBOARDPRIVATE_OPENSUGGESTIONSETTINGS"/> - <int value="1520" label="ACCESSIBILITY_PRIVATE_ENABLEPOINTSCAN"/> + <int value="1520" label="ACCESSIBILITY_PRIVATE_ACTIVATEPOINTSCAN"/> <int value="1521" label="AUTOTESTPRIVATE_ACTIVATEADJACENTDESKSTOTARGETINDEX"/> <int value="1522" label="DECLARATIVENETREQUEST_GETAVAILABLESTATICRULECOUNT"/> <int value="1523" label="CHROMEOSINFOPRIVATE_ISTABLETMODEENABLED"/> @@ -30066,6 +30076,8 @@ <int value="3711" label="BarcodeDetectorDetect"/> <int value="3712" label="FaceDetectorDetect"/> <int value="3713" label="TextDetectorDetect"/> + <int value="3714" label="LocalStorageFirstUsedBeforeFcp"/> + <int value="3715" label="LocalStorageFirstUsedAfterFcp"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -39175,109 +39187,6 @@ <int value="2" label="Subresource"/> </enum> -<enum name="IsolatedPrerenderPrefetchStatus"> - <int value="0" label="Prefetch Used, No Probe"> - The interceptor used a prefetch. - </int> - <int value="1" label="Prefetch Used, Probe Success"> - The interceptor used a prefetch after successfully probing the origin. - </int> - <int value="2" label="Prefetch Not Used, Probe Failed"> - The interceptor was not able to use an available prefetch because the origin - probe failed. - </int> - <int value="3" label="Prefetch Not Started"> - The url was eligible to be prefetched, but the network request was never - made. - </int> - <int value="4" label="Prefetch Not,Eligible: Google Domain"> - The url was not eligible to be prefetched because it is a Google-owned - domain. - </int> - <int value="5" label="Prefetch Not Eligible: User Has Cookies"> - The url was not eligible to be prefetched because the user had cookies for - that origin. - </int> - <int value="6" label="Prefetch Not Eligible: User Has ServiceWorker"> - The url was not eligible to be prefetched because there was a registered - service worker for that origin. - </int> - <int value="7" label="Prefetch Not Eligible: Scheme Is Not HTTPS"> - The url was not eligible to be prefetched because its scheme was not - https://. - </int> - <int value="8" label="Prefetch Not Eligible: Host Is IP Address"> - The url was not eligible to be prefetched because its host was an IP - address. - </int> - <int value="9" label="Prefetch Not Eligible: Non-Default Storage Partition"> - The url was not eligible to be prefetched because it uses a non-default - storage partition. - </int> - <int value="10" label="Prefetch Not Finished In Time"> - The network request was cancelled before it finished. This happens when - there is a new navigation. - </int> - <int value="11" label="Prefetch Failed: Net Error"> - The prefetch failed because of a net error. - </int> - <int value="12" label="Prefetch Failed: Non 2XX Status"> - The prefetch failed with a non-2XX HTTP response code. - </int> - <int value="13" label="Prefetch Failed: Not HTML"> - The prefetch's Content-Type header was not html. - </int> - <int value="14" label="Prefetch Successful"> - The prefetch finished successfully but was never used. - </int> - <int value="15" label="Navigated To Link Not On SRP"> - The navigation off of the Google SRP was to a url that was not on the SRP. - </int> - <int value="16" label="Prefetch Used, No Probe, Did NoStatePrefetch"> - The url was prefetched and No State Prerendered and committed without a - probe to the origin. - </int> - <int value="17" label="Prefetch Used, Probe Success, Did NoStatePrefetch"> - The url was prefetched and No State Prerendered and committed with a - successful probe to the origin. - </int> - <int value="18" label="Prefetch Not Used, Probe Failed, Did NoStatePrefetch"> - The url was prefetched and No State Prerendered but the origin probe failed - and the prefetch was not used. - </int> - <int value="19" - label="Prefetch Used, No Probe, NoStatePrefetch Attempt Denied"> - The url was prefetched but was not No State Prerendered despite attempting - to do so and committed without a probe to the origin. - </int> - <int value="20" - label="Prefetch Used, Probe Success, NoStatePrefetch Attempt Denied"> - The url was prefetched but was not No State Prerendered despite attempting - to do so and committed with a successful probe to the origin. - </int> - <int value="21" - label="Prefetch Not Used, Probe Failed, NoStatePrefetch Attempt Denied"> - The url was prefetched but was not No State Prerendered despite attempting - to do so, and the origin probe failed and the prefetch was not used. - </int> - <int value="22" label="Prefetch Used, No Probe, NoStatePrefetch Not Started"> - The url was prefetched and eligible for NoStatePrerender but wasn't started - and committed without a probe to the origin. - </int> - <int value="23" - label="Prefetch Used, Probe Success, NoStatePrefetch Not Started"> - The url was prefetched and eligible for NoStatePrerender but wasn't started - and committed with a successful probe to the origin. - </int> - <int value="24" - label="Prefetch Not Used, Probe Failed, NoStatePrefetch Not Started"> - The url was prefetched and eligible for NoStatePrerender but wasn't started - and the origin probe failed and the prefetch was not used. - </int> - <int value="25" label="Subresource throttled"/> - <int value="26" label="Prediction position not eligible"/> -</enum> - <enum name="IsPinnedToTaskbarResult"> <int value="0" label="Not pinned"/> <int value="1" label="Pinned"/> @@ -41885,6 +41794,7 @@ label="ProcessSharingWithStrictSiteInstances:disabled"/> <int value="-1898386671" label="PasswordCheck:enabled"/> <int value="-1896871201" label="CrossOriginOpenerPolicyReporting:enabled"/> + <int value="-1896733769" label="CheckOfflineCapability:disabled"/> <int value="-1896394207" label="PasswordChange:disabled"/> <int value="-1895719323" label="VrBrowsingTabsView:enabled"/> <int value="-1895050832" label="GlobalMediaControlsCastStartStop:disabled"/> @@ -42508,6 +42418,7 @@ <int value="-1322882747" label="disable-datasaver-prompt"/> <int value="-1321640296" label="AutofillDownstreamCvcPromptUseGooglePayLogo:enabled"/> + <int value="-1321212159" label="MediaAppAnnotation:enabled"/> <int value="-1320181781" label="ChromeOSDirectVideoDecoder:disabled"/> <int value="-1319688939" label="ignore-gpu-blacklist"/> <int value="-1318914924" label="OverflowIconsForMediaControls:enabled"/> @@ -42618,6 +42529,7 @@ label="HappinessTrackingSurveysForDesktopSettings:enabled"/> <int value="-1220675698" label="OmniboxDeferredKeyboardPopup:enabled"/> <int value="-1218608640" label="disable-offline-load-stale-cache"/> + <int value="-1218063855" label="MediaAppAnnotation:disabled"/> <int value="-1217623062" label="AutofillAlwaysReturnCloudTokenizedCard:disabled"/> <int value="-1217462552" @@ -43587,6 +43499,7 @@ <int value="-250543540" label="DeferAllScript:enabled"/> <int value="-249415830" label="FilteringScrollPrediction:disabled"/> <int value="-248223420" label="AutofillKeyboardAccessory:disabled"/> + <int value="-247542772" label="CheckOfflineCapability:enabled"/> <int value="-245342115" label="PermissionChip:enabled"/> <int value="-241353344" label="MidiManagerWinrt:disabled"/> <int value="-240531943" label="ContextualSearchRankerQuery:disabled"/> @@ -55637,6 +55550,9 @@ </enum> <enum name="ParallelDownloadCreationEvent"> + <obsolete> + Deprecated as of 10/2020 + </obsolete> <int value="0" label="Parallel download started"/> <int value="1" label="Fall back to normal download"/> <int value="2" label="No strong validators response headers"/> @@ -58757,6 +58673,109 @@ <int value="3" label="Upgrade preferred app to newer version"/> </enum> +<enum name="PrefetchProxyPrefetchStatus"> + <int value="0" label="Prefetch Used, No Probe"> + The interceptor used a prefetch. + </int> + <int value="1" label="Prefetch Used, Probe Success"> + The interceptor used a prefetch after successfully probing the origin. + </int> + <int value="2" label="Prefetch Not Used, Probe Failed"> + The interceptor was not able to use an available prefetch because the origin + probe failed. + </int> + <int value="3" label="Prefetch Not Started"> + The url was eligible to be prefetched, but the network request was never + made. + </int> + <int value="4" label="Prefetch Not,Eligible: Google Domain"> + The url was not eligible to be prefetched because it is a Google-owned + domain. + </int> + <int value="5" label="Prefetch Not Eligible: User Has Cookies"> + The url was not eligible to be prefetched because the user had cookies for + that origin. + </int> + <int value="6" label="Prefetch Not Eligible: User Has ServiceWorker"> + The url was not eligible to be prefetched because there was a registered + service worker for that origin. + </int> + <int value="7" label="Prefetch Not Eligible: Scheme Is Not HTTPS"> + The url was not eligible to be prefetched because its scheme was not + https://. + </int> + <int value="8" label="Prefetch Not Eligible: Host Is IP Address"> + The url was not eligible to be prefetched because its host was an IP + address. + </int> + <int value="9" label="Prefetch Not Eligible: Non-Default Storage Partition"> + The url was not eligible to be prefetched because it uses a non-default + storage partition. + </int> + <int value="10" label="Prefetch Not Finished In Time"> + The network request was cancelled before it finished. This happens when + there is a new navigation. + </int> + <int value="11" label="Prefetch Failed: Net Error"> + The prefetch failed because of a net error. + </int> + <int value="12" label="Prefetch Failed: Non 2XX Status"> + The prefetch failed with a non-2XX HTTP response code. + </int> + <int value="13" label="Prefetch Failed: Not HTML"> + The prefetch's Content-Type header was not html. + </int> + <int value="14" label="Prefetch Successful"> + The prefetch finished successfully but was never used. + </int> + <int value="15" label="Navigated To Link Not On SRP"> + The navigation off of the Google SRP was to a url that was not on the SRP. + </int> + <int value="16" label="Prefetch Used, No Probe, Did NoStatePrefetch"> + The url was prefetched and No State Prerendered and committed without a + probe to the origin. + </int> + <int value="17" label="Prefetch Used, Probe Success, Did NoStatePrefetch"> + The url was prefetched and No State Prerendered and committed with a + successful probe to the origin. + </int> + <int value="18" label="Prefetch Not Used, Probe Failed, Did NoStatePrefetch"> + The url was prefetched and No State Prerendered but the origin probe failed + and the prefetch was not used. + </int> + <int value="19" + label="Prefetch Used, No Probe, NoStatePrefetch Attempt Denied"> + The url was prefetched but was not No State Prerendered despite attempting + to do so and committed without a probe to the origin. + </int> + <int value="20" + label="Prefetch Used, Probe Success, NoStatePrefetch Attempt Denied"> + The url was prefetched but was not No State Prerendered despite attempting + to do so and committed with a successful probe to the origin. + </int> + <int value="21" + label="Prefetch Not Used, Probe Failed, NoStatePrefetch Attempt Denied"> + The url was prefetched but was not No State Prerendered despite attempting + to do so, and the origin probe failed and the prefetch was not used. + </int> + <int value="22" label="Prefetch Used, No Probe, NoStatePrefetch Not Started"> + The url was prefetched and eligible for NoStatePrerender but wasn't started + and committed without a probe to the origin. + </int> + <int value="23" + label="Prefetch Used, Probe Success, NoStatePrefetch Not Started"> + The url was prefetched and eligible for NoStatePrerender but wasn't started + and committed with a successful probe to the origin. + </int> + <int value="24" + label="Prefetch Not Used, Probe Failed, NoStatePrefetch Not Started"> + The url was prefetched and eligible for NoStatePrerender but wasn't started + and the origin probe failed and the prefetch was not used. + </int> + <int value="25" label="Subresource throttled"/> + <int value="26" label="Prediction position not eligible"/> +</enum> + <enum name="PrefetchRedirect"> <int value="0" label="Prefetch request made"/> <int value="1" label="Prefetch request was redirected normally"/>
diff --git a/tools/metrics/histograms/histograms_xml/autofill/histograms.xml b/tools/metrics/histograms/histograms_xml/autofill/histograms.xml index d9c36858..d1f9be2 100644 --- a/tools/metrics/histograms/histograms_xml/autofill/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/autofill/histograms.xml
@@ -802,6 +802,15 @@ </summary> </histogram> +<histogram name="Autofill.FormFillSuccessIOS" + enum="BooleanAutofillFormFillSuccessIOS" expires_after="2021-04-30"> + <owner>kazinova@chromium.org</owner> + <owner>chrome-autofill@google.com</owner> + <summary> + Records whether the the form was successfully filled by Autofill on iOS. + </summary> +</histogram> + <histogram name="Autofill.FormSubmittedState" enum="AutofillFormSubmittedState" expires_after="M95"> <owner>battre@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/download/histograms.xml b/tools/metrics/histograms/histograms_xml/download/histograms.xml index fce7bb5..850de125 100644 --- a/tools/metrics/histograms/histograms_xml/download/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/download/histograms.xml
@@ -491,6 +491,9 @@ <histogram name="Download.ParallelDownload.CreationEvent" enum="ParallelDownloadCreationEvent" expires_after="2020-12-06"> + <obsolete> + Deprecated as of 10/2020 + </obsolete> <owner>xingliu@chromium.org</owner> <summary> When parallel downloading feature is enabled, a download may be created as
diff --git a/tools/metrics/histograms/histograms_xml/uma/histograms.xml b/tools/metrics/histograms/histograms_xml/uma/histograms.xml index 769cc27..3a8f72f 100644 --- a/tools/metrics/histograms/histograms_xml/uma/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/uma/histograms.xml
@@ -584,9 +584,13 @@ expires_after="2021-08-30"> <owner>holte@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>mpearson@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> - Counter for number of UMA unsent logs removed from persistent storage. + The number of UMA unsent logs removed from persistent storage. + + Useful in comparison with UMA.UnsentLogs.IntendingToSend (that counts hte + number of UMA unsent logs that are intended to be sent, i.e., not dropped). </summary> </histogram> @@ -604,6 +608,20 @@ </summary> </histogram> +<histogram name="UMA.UnsentLogs.IntendingToSend" units="logs" + expires_after="2021-04-01"> + <owner>mpearson@chromium.org</owner> + <owner>src/base/metrics/OWNERS</owner> + <summary> + The number of UMA unsent logs from persistent storage that will be staged / + are intended to be sent. These logs are not dropped from persistent storage. + + Useful in comparison with UMA.UnsentLogs.Dropped (to see how many persistent + logs are intended to be sent versus are not intended to be sent) and with + UMA.UnsentLogs.IntendingToSend (to see how many are actually sent). + </summary> +</histogram> + <histogram name="UMA.UnsentLogs.PersistedSizeInKB" units="KB" expires_after="2021-05-30"> <owner>michaelbai@chromium.org</owner> @@ -616,6 +634,17 @@ </summary> </histogram> +<histogram name="UMA.UnsentLogs.Sent" enum="Boolean" expires_after="2021-04-01"> + <owner>mpearson@chromium.org</owner> + <owner>src/base/metrics/OWNERS</owner> + <summary> + Emitted when a UMA unsent log is marked as sent. + + Useful in comparison with UMA.UnsentLogs.Dropped and + UMA.UnsentLogs.IntendingToSend. + </summary> +</histogram> + <histogram name="UMA.UnsentLogs.SentCount" units="samples" expires_after="2021-05-30"> <owner>michaelbai@chromium.org</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 6cd6c7b6..32d25bd5 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -7819,6 +7819,31 @@ </metric> </event> +<event name="MobileFriendliness"> + <owner>kumagi@chromium.org</owner> + <metric name="AllowUserZoom" enum="Boolean"> + <summary> + Whether the page allows the user to zoom in/out. + </summary> + </metric> + <metric name="ViewportDeviceWidth" enum="Boolean"> + <summary> + Whether the width of the viewport specified as device-width or not. + </summary> + </metric> + <metric name="ViewportHardcodedWidth"> + <summary> + Specified hardcoded viewport width in CSS pixels. + </summary> + </metric> + <metric name="ViewportInitialScaleX10"> + <summary> + Specified initial viewport scaling multipled by 10. 1 means 0.1, 100 means + 10. [1-100]. + </summary> + </metric> +</event> + <event name="MobileMenu.DirectShare"> <owner>sayman@chromium.org</owner> <summary> @@ -10540,12 +10565,12 @@ when a probe was required. </summary> </metric> - <metric name="SRPClickPrefetchStatus" enum="IsolatedPrerenderPrefetchStatus"> + <metric name="SRPClickPrefetchStatus" enum="PrefetchProxyPrefetchStatus"> <summary> The outcome of the prefetch eligibility check and possible attempt to prefetch the resource. The prefetched url is always the committed URL of - the page. See |IsolatedPrerenderPrefetchStatus| for a mapping of enum - values and their meanings. + the page. See |PrefetchProxyPrefetchStatus| for a mapping of enum values + and their meanings. </summary> </metric> <metric name="SRPPrefetchEligibleCount"> @@ -10610,12 +10635,12 @@ Always set when the event is recorded. </summary> </metric> - <metric name="Status" enum="IsolatedPrerenderPrefetchStatus"> + <metric name="Status" enum="PrefetchProxyPrefetchStatus"> <summary> The outcome of the prefetch eligibility check and possible attempt to - prefetch the resource and reuse it. See |IsolatedPrerenderPrefetchStatus| - for a mapping of enum values and their meanings. Always set when the event - is recorded. + prefetch the resource and reuse it. See |PrefetchProxyPrefetchStatus| for + a mapping of enum values and their meanings. Always set when the event is + recorded. </summary> </metric> </event>
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 8b18a74..cb543773 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -162,9 +162,6 @@ <item id="interest_feedv2_send" added_in_milestone="83" hash_code="85742023" type="0" content_hash_code="49706671" os_list="linux,windows" file_path="components/feed/core/v2/feed_network_impl.cc"/> <item id="intranet_redirect_detector" added_in_milestone="62" hash_code="21785164" type="0" content_hash_code="62025595" os_list="linux,windows" file_path="chrome/browser/intranet_redirect_detector.cc"/> <item id="invalidation_service" added_in_milestone="62" hash_code="72354423" type="0" deprecated="2020-01-23" content_hash_code="78425687" file_path=""/> - <item id="isolated_prerender_canary_check" added_in_milestone="85" hash_code="60914954" type="0" content_hash_code="2991117" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.cc"/> - <item id="isolated_prerender_loader" added_in_milestone="81" hash_code="2181152" type="0" content_hash_code="113933667" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/isolated_prerender_url_loader.cc"/> - <item id="isolated_prerender_probe" added_in_milestone="83" hash_code="115160522" type="0" content_hash_code="75211055" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/isolated_prerender_origin_prober.cc"/> <item id="javascript_report_error" added_in_milestone="87" hash_code="109607776" type="0" content_hash_code="30837893" os_list="linux,windows" file_path="components/crash/content/browser/error_reporting/send_javascript_error_report.cc"/> <item id="kaleidoscope_service" added_in_milestone="87" hash_code="49759694" type="0" content_hash_code="14307563" os_list="linux,windows" file_path="chrome/browser/media/kaleidoscope/kaleidoscope_service.cc"/> <item id="kids_chrome_management_client_classify_url" added_in_milestone="77" hash_code="109987793" type="0" deprecated="2019-07-30" content_hash_code="112740597" file_path=""/> @@ -181,7 +178,7 @@ <item id="mirroring_get_setup_info" added_in_milestone="68" hash_code="78447809" type="0" content_hash_code="64839410" os_list="windows,linux" file_path="components/mirroring/service/receiver_setup_querier.cc"/> <item id="missing" added_in_milestone="62" hash_code="77012883" type="0" reserved="1" os_list="linux,windows" file_path=""/> <item id="mojo_context_state" added_in_milestone="63" hash_code="93232258" type="0" deprecated="2017-10-20" content_hash_code="124821232" file_path=""/> - <item id="navigation_predictor_srp_prefetch" added_in_milestone="81" hash_code="57773453" type="0" content_hash_code="38811322" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/isolated_prerender_tab_helper.cc"/> + <item id="navigation_predictor_srp_prefetch" added_in_milestone="81" hash_code="57773453" type="0" content_hash_code="38811322" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc"/> <item id="navigation_url_loader" added_in_milestone="62" hash_code="63171670" type="0" content_hash_code="129352907" os_list="linux,windows" file_path="content/browser/loader/navigation_url_loader_impl.cc"/> <item id="nearby_share_contacts" added_in_milestone="86" hash_code="91999155" type="1" second_id="29188932" deprecated="2020-09-21" content_hash_code="74684570" file_path=""/> <item id="nearby_share_list_public_certificates" added_in_milestone="86" hash_code="123714070" type="1" second_id="29188932" deprecated="2020-09-21" content_hash_code="24145546" file_path=""/> @@ -239,6 +236,9 @@ <item id="ppapi_download_request" added_in_milestone="62" hash_code="135967426" type="0" content_hash_code="110461402" os_list="linux,windows" file_path="chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc"/> <item id="predictive_prefetch" added_in_milestone="85" hash_code="72157052" type="0" content_hash_code="28097398" os_list="linux,windows" file_path="chrome/browser/predictors/prefetch_manager.cc"/> <item id="prefetch_download" added_in_milestone="62" hash_code="44583172" type="0" content_hash_code="21424542" os_list="linux,windows" file_path="components/offline_pages/core/prefetch/prefetch_downloader_impl.cc"/> + <item id="prefetch_proxy_canary_check" added_in_milestone="88" hash_code="9229948" type="0" content_hash_code="53040767" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc"/> + <item id="prefetch_proxy_loader" added_in_milestone="88" hash_code="119210936" type="0" content_hash_code="39561111" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader.cc"/> + <item id="prefetch_proxy_probe" added_in_milestone="88" hash_code="123387409" type="0" content_hash_code="1909853" os_list="linux,windows" file_path="chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_origin_prober.cc"/> <item id="prefetch_visuals" added_in_milestone="75" hash_code="91068704" type="0" content_hash_code="90439946" os_list="linux,windows" file_path="components/offline_pages/core/prefetch/visuals_fetch_by_url.cc"/> <item id="previews_litepage_origin_prober" added_in_milestone="78" hash_code="33703614" type="0" deprecated="2020-04-23" content_hash_code="116235355" file_path="chrome/browser/previews/previews_lite_page_redirect_url_loader.cc"/> <item id="previews_litepage_prober" added_in_milestone="78" hash_code="33813109" type="0" deprecated="2020-04-23" content_hash_code="52572789" file_path="chrome/browser/previews/previews_lite_page_redirect_decider.cc"/>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml index ddb94ec4..9e17428 100644 --- a/tools/traffic_annotation/summary/grouping.xml +++ b/tools/traffic_annotation/summary/grouping.xml
@@ -16,7 +16,7 @@ <sender name="Unsorted Sender"> <!-- TODO(nicolaso): do a pass through some of the recent ones, and find them a new home --> - <traffic_annotation unique_id="isolated_prerender_canary_check"/> + <traffic_annotation unique_id="prefetch_proxy_canary_check"/> <traffic_annotation unique_id="nearby_webrtc_connection"/> <traffic_annotation unique_id="proxy_config_windows_resolver"/> <traffic_annotation unique_id="remoting_directory_delete_host"/> @@ -41,12 +41,12 @@ <traffic_annotation unique_id="devtools_cdp_network_resource"/> <traffic_annotation unique_id="downloads_api_run_async"/> <traffic_annotation unique_id="media_feeds_checker"/> - <traffic_annotation unique_id="isolated_prerender_loader"/> + <traffic_annotation unique_id="prefetch_proxy_loader"/> <traffic_annotation unique_id="intranet_redirect_detector"/> <traffic_annotation unique_id="dial_url_fetcher"/> <traffic_annotation unique_id="send_message_express"/> <traffic_annotation unique_id="browser_switcher_ieem_sitelist"/> - <traffic_annotation unique_id="isolated_prerender_probe"/> + <traffic_annotation unique_id="prefetch_proxy_probe"/> <traffic_annotation unique_id="enterprise_safe_browsing_realtime_url_lookup"/> <traffic_annotation unique_id="remote_copy_message_handler"/> <traffic_annotation unique_id="chrome_HaTS_service"/>
diff --git a/ui/base/ime/chromeos/input_method_manager.h b/ui/base/ime/chromeos/input_method_manager.h index 55f8093..815b29b 100644 --- a/ui/base/ime/chromeos/input_method_manager.h +++ b/ui/base/ime/chromeos/input_method_manager.h
@@ -37,12 +37,11 @@ // InputMethodManager::Get(). class COMPONENT_EXPORT(UI_BASE_IME_CHROMEOS) InputMethodManager { public: - enum UISessionState { - STATE_LOGIN_SCREEN = 0, - STATE_BROWSER_SCREEN, - STATE_LOCK_SCREEN, - STATE_SECONDARY_LOGIN_SCREEN, - STATE_TERMINATING, + enum class UIStyle { + kLogin, + kSecondaryLogin, + kLock, + kNormal, }; enum MenuItemStyle { @@ -251,6 +250,10 @@ // Returns the URL of the input view of the active input method. virtual const GURL& GetInputViewUrl() const = 0; + // Get the current UI screen type (e.g. login screen, lock screen, etc.). + virtual InputMethodManager::UIStyle GetUIStyle() const = 0; + virtual void SetUIStyle(InputMethodManager::UIStyle ui_style) = 0; + protected: friend base::RefCounted<InputMethodManager::State>; @@ -273,9 +276,6 @@ // Destroy the global instance. static COMPONENT_EXPORT(UI_BASE_IME_CHROMEOS) void Shutdown(); - // Get the current UI session state (e.g. login screen, lock screen, etc.). - virtual UISessionState GetUISessionState() = 0; - // Adds an observer to receive notifications of input method related // changes as desribed in the Observer class above. virtual void AddObserver(Observer* observer) = 0;
diff --git a/ui/base/ime/chromeos/mock_input_method_manager.cc b/ui/base/ime/chromeos/mock_input_method_manager.cc index 61c153bb..5ff855f 100644 --- a/ui/base/ime/chromeos/mock_input_method_manager.cc +++ b/ui/base/ime/chromeos/mock_input_method_manager.cc
@@ -112,6 +112,15 @@ return GURL::EmptyGURL(); } +InputMethodManager::UIStyle MockInputMethodManager::State::GetUIStyle() const { + return ui_style_; +} + +void MockInputMethodManager::State::SetUIStyle( + InputMethodManager::UIStyle ui_style) { + ui_style_ = ui_style; +} + MockInputMethodManager::State::~State() = default; MockInputMethodManager::MockInputMethodManager() @@ -119,10 +128,6 @@ MockInputMethodManager::~MockInputMethodManager() = default; -InputMethodManager::UISessionState MockInputMethodManager::GetUISessionState() { - return InputMethodManager::STATE_BROWSER_SCREEN; -} - void MockInputMethodManager::AddObserver( InputMethodManager::Observer* observer) {}
diff --git a/ui/base/ime/chromeos/mock_input_method_manager.h b/ui/base/ime/chromeos/mock_input_method_manager.h index 5db0050..f7739d6 100644 --- a/ui/base/ime/chromeos/mock_input_method_manager.h +++ b/ui/base/ime/chromeos/mock_input_method_manager.h
@@ -65,6 +65,8 @@ void EnableInputView() override; void DisableInputView() override; const GURL& GetInputViewUrl() const override; + InputMethodManager::UIStyle GetUIStyle() const override; + void SetUIStyle(InputMethodManager::UIStyle ui_style) override; // The active input method ids cache (actually default only) std::vector<std::string> active_input_method_ids; @@ -77,6 +79,9 @@ // Allowed input methods ids std::vector<std::string> allowed_input_method_ids_; + InputMethodManager::UIStyle ui_style_ = + InputMethodManager::UIStyle::kNormal; + DISALLOW_COPY_AND_ASSIGN(State); }; @@ -84,7 +89,6 @@ ~MockInputMethodManager() override; // InputMethodManager: - UISessionState GetUISessionState() override; void AddObserver(InputMethodManager::Observer* observer) override; void AddCandidateWindowObserver( InputMethodManager::CandidateWindowObserver* observer) override;
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn index 3c549dc..429cb8f 100644 --- a/ui/display/BUILD.gn +++ b/ui/display/BUILD.gn
@@ -35,6 +35,7 @@ "screen.h", "screen_base.cc", "screen_base.h", + "tablet_state.h", "unified_desktop_utils.cc", "unified_desktop_utils.h", ]
diff --git a/ui/display/tablet_state.h b/ui/display/tablet_state.h new file mode 100644 index 0000000..1413fce --- /dev/null +++ b/ui/display/tablet_state.h
@@ -0,0 +1,20 @@ +// Copyright 2020 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 UI_DISPLAY_TABLET_STATE_H_ +#define UI_DISPLAY_TABLET_STATE_H_ + +namespace display { + +// Tracks whether we are in the process of entering or exiting tablet mode. +enum class TabletState { + kInClamshellMode, + kEnteringTabletMode, + kInTabletMode, + kExitingTabletMode, +}; + +} // namespace display + +#endif // UI_DISPLAY_TABLET_STATE_H_
diff --git a/ui/file_manager/BUILD.gn b/ui/file_manager/BUILD.gn index c097bbb..188066d 100644 --- a/ui/file_manager/BUILD.gn +++ b/ui/file_manager/BUILD.gn
@@ -64,6 +64,7 @@ "file_manager/foreground/elements:js_test_gen_html", "file_manager/foreground/js:js_test_gen_html", "file_manager/foreground/js/metadata:js_test_gen_html", + "file_manager/foreground/js/metadata:js_test_gen_html_modules", "file_manager/foreground/js/ui:js_test_gen_html", "gallery/js:js_test_gen_html", "gallery/js/image_editor:js_test_gen_html",
diff --git a/ui/file_manager/externs/background/file_operation_manager.js b/ui/file_manager/externs/background/file_operation_manager.js index 232a456..fbac9ec 100644 --- a/ui/file_manager/externs/background/file_operation_manager.js +++ b/ui/file_manager/externs/background/file_operation_manager.js
@@ -50,9 +50,18 @@ paste(sourceEntries, targetEntry, isMove, opt_taskId) {} /** + * Returns true if all entries will use trash for delete. + * + * @param {!VolumeManager} volumeManager + * @param {!Array<!Entry>} entries The entries. + * @return {boolean} + */ + willUseTrash(volumeManager, entries) {} + + /** * Schedules the files deletion. * - * @param {Array<Entry>} entries The entries. + * @param {!Array<!Entry>} entries The entries. */ deleteEntries(entries) {}
diff --git a/ui/file_manager/file_manager/background/js/file_operation_manager.js b/ui/file_manager/file_manager/background/js/file_operation_manager.js index 1ffb6e7..1fca1e3 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_manager.js +++ b/ui/file_manager/file_manager/background/js/file_operation_manager.js
@@ -388,9 +388,21 @@ } /** + * Returns true if all entries will use trash for delete. + * + * @param {!VolumeManager} volumeManager + * @param {!Array<!Entry>} entries The entries. + * @return {boolean} + */ + willUseTrash(volumeManager, entries) { + return entries.every( + entry => this.trash_.shouldMoveToTrash(volumeManager, entry)); + } + + /** * Schedules the files deletion. * - * @param {Array<Entry>} entries The entries. + * @param {!Array<!Entry>} entries The entries. */ deleteEntries(entries) { const task =
diff --git a/ui/file_manager/file_manager/background/js/mock_file_operation_manager.js b/ui/file_manager/file_manager/background/js/mock_file_operation_manager.js index c8c5940..a2132e6 100644 --- a/ui/file_manager/file_manager/background/js/mock_file_operation_manager.js +++ b/ui/file_manager/file_manager/background/js/mock_file_operation_manager.js
@@ -93,6 +93,7 @@ hasQueuedTasks() {} filterSameDirectoryEntry() {} + willUseTrash() {} deleteEntries() {} restoreDeleted() {} zipSelection() {}
diff --git a/ui/file_manager/file_manager/background/js/trash.js b/ui/file_manager/file_manager/background/js/trash.js index a776f8a..94a07613 100644 --- a/ui/file_manager/file_manager/background/js/trash.js +++ b/ui/file_manager/file_manager/background/js/trash.js
@@ -84,9 +84,8 @@ * @param {!Entry} entry The entry to remove. * @return {?TrashConfig} Valid TrashConfig if item should be moved to trash, * else null if item should be permanently deleted. - * @private */ - shouldMoveToTrash_(volumeManager, entry) { + shouldMoveToTrash(volumeManager, entry) { const info = volumeManager.getLocationInfo(entry); if (!loadTimeData.getBoolean('FILES_TRASH_ENABLED') || !info) { return null; @@ -118,7 +117,7 @@ */ removeFileOrDirectory(volumeManager, entry, permanentlyDelete) { if (!permanentlyDelete) { - const config = this.shouldMoveToTrash_(volumeManager, entry); + const config = this.shouldMoveToTrash(volumeManager, entry); if (config) { return this.trashFileOrDirectory_(entry, config); }
diff --git a/ui/file_manager/file_manager/background/js/trash_unittest.js b/ui/file_manager/file_manager/background/js/trash_unittest.js index 4910725..dbad0d9 100644 --- a/ui/file_manager/file_manager/background/js/trash_unittest.js +++ b/ui/file_manager/file_manager/background/js/trash_unittest.js
@@ -162,8 +162,6 @@ /** * Test that Downloads has its own /Downloads/.Trash since it is a separate * mount on a device and we don't want move to trash to be a copy operation. - * - * @suppress {accessControls} Access shouldMoveToTrash_(). */ async function testDownloadsHasOwnTrash(done) { const trash = new Trash(); @@ -197,14 +195,14 @@ // Delete /Downloads/.Trash/files/file2. const file2Trashed = fs.entries['/Downloads/.Trash/files/file2']; - assertFalse(!!trash.shouldMoveToTrash_(volumeManager, file2Trashed)); + assertFalse(!!trash.shouldMoveToTrash(volumeManager, file2Trashed)); await trash.removeFileOrDirectory( volumeManager, file2Trashed, deletePermanently); assertEquals(11, Object.keys(fs.entries).length); // Delete /Downloads/.Trash. const downloadsTrash = fs.entries['/Downloads/.Trash']; - assertFalse(!!trash.shouldMoveToTrash_(volumeManager, downloadsTrash)); + assertFalse(!!trash.shouldMoveToTrash(volumeManager, downloadsTrash)); await trash.removeFileOrDirectory( volumeManager, downloadsTrash, deletePermanently); assertEquals(7, Object.keys(fs.entries).length); @@ -214,8 +212,6 @@ /** * Test crostini trash in .local/share/Trash. - * - * @suppress {accessControls} Access shouldMoveToTrash_(). */ async function testCrostiniTrash(done) { const trash = new Trash(); @@ -252,14 +248,14 @@ // Move /file2 to trash, then delete /.local/share/Trash/files/file2. await trash.removeFileOrDirectory(volumeManager, file2, deletePermanently); const file2Trashed = fs.entries['/.local/share/Trash/files/file2']; - assertFalse(!!trash.shouldMoveToTrash_(volumeManager, file2Trashed)); + assertFalse(!!trash.shouldMoveToTrash(volumeManager, file2Trashed)); await trash.removeFileOrDirectory( volumeManager, file2Trashed, deletePermanently); assertEquals(8, Object.keys(fs.entries).length); // Delete /.local/share/Trash. const crostiniTrash = fs.entries['/.local/share/Trash']; - assertFalse(!!trash.shouldMoveToTrash_(volumeManager, crostiniTrash)); + assertFalse(!!trash.shouldMoveToTrash(volumeManager, crostiniTrash)); await trash.removeFileOrDirectory( volumeManager, crostiniTrash, deletePermanently); assertEquals(4, Object.keys(fs.entries).length);
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js index 9324502..ebea919 100644 --- a/ui/file_manager/file_manager/common/js/util.js +++ b/ui/file_manager/file_manager/common/js/util.js
@@ -1238,6 +1238,9 @@ if (util.isPluginVmEnabled() && entry.fullPath === '/PvmDefault') { return true; } + if (util.isFilesCameraFolderEnabled() && entry.fullPath === '/Camera') { + return true; + } } if (volumeInfo.volumeType === VolumeManagerCommon.RootType.CROSTINI &&
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js index be307b3..3b8f9fc 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -1112,6 +1112,13 @@ return; } + // We show undo toast rather than dialog for entries which will use trash. + if (fileManager.fileOperationManager.willUseTrash( + fileManager.volumeManager, entries)) { + fileManager.fileOperationManager.deleteEntries(entries); + return; + } + const message = entries.length === 1 ? strf('GALLERY_CONFIRM_DELETE_ONE', entries[0].name) : strf('GALLERY_CONFIRM_DELETE_SOME', entries.length);
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.js index 6f6d69e..26d0a25 100644 --- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller_unittest.js
@@ -127,8 +127,9 @@ FileGrid.decorate(grid, metadataModel, volumeManager, historyLoader, a11y); // Setup the ListContainer and its dependencies - listContainer = - new ListContainer(queryRequiredElement('#list-container'), table, grid); + listContainer = new ListContainer( + queryRequiredElement('#list-container'), table, grid, + DialogType.FULL_PAGE); listContainer.dataModel = dataModel; listContainer.selectionModel = new cr.ui.ListSelectionModel(); listContainer.setCurrentListType(ListContainer.ListType.DETAIL);
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn b/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn index 6cd128c..2d9a6c53 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/metadata/BUILD.gn
@@ -5,6 +5,7 @@ import("//third_party/closure_compiler/compile_js.gni") import("//third_party/closure_compiler/js_unit_tests.gni") import("//ui/file_manager/base/gn/js_test_gen_html.gni") +import("//ui/webui/resources/tools/js_modulizer.gni") # TODO(tapted): This entire folder should move to //ui/file_manager/base. visibility = [ "//ui/file_manager/*" ] @@ -13,10 +14,22 @@ testonly = true deps = [ ":closure_compile_module", + ":closure_jsmodules", + ":js_test_gen_html_modules_type_check_auto", ":js_test_gen_html_type_check_auto", ] } +js_type_check("closure_jsmodules") { + uses_js_modules = true + deps = [ + ":image_orientation.m", + ":metadata_item.m", + ":metadata_provider.m", + ":metadata_request.m", + ] +} + js_type_check("closure_compile_module") { deps = [ ":byte_reader", @@ -128,10 +141,17 @@ js_library("image_orientation") { } -js_unittest("image_orientation_unittest") { +js_library("image_orientation.m") { + sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/image_orientation.m.js" ] + deps = [] + + extra_deps = [ ":modulize" ] +} + +js_unittest("image_orientation_unittest.m") { deps = [ - ":image_orientation", - "//ui/webui/resources/js:webui_resource_test", + ":image_orientation.m", + "//chrome/test/data/webui:chai_assert", ] } @@ -187,6 +207,13 @@ js_library("metadata_item") { } +js_library("metadata_item.m") { + sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.m.js" ] + deps = [] + + extra_deps = [ ":modulize" ] +} + js_library("metadata_model") { deps = [ ":content_metadata_provider", @@ -220,9 +247,27 @@ ] } +js_library("metadata_provider.m") { + sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_provider.m.js" ] + deps = [ + ":metadata_item.m", + ":metadata_request.m", + "//ui/webui/resources/js:assert.m", + ] + + extra_deps = [ ":modulize" ] +} + js_library("metadata_request") { } +js_library("metadata_request.m") { + sources = [ "$root_gen_dir/ui/file_manager/file_manager/foreground/js/metadata/metadata_request.m.js" ] + deps = [] + + extra_deps = [ ":modulize" ] +} + js_library("mock_metadata") { deps = [ ":metadata_model" ] } @@ -260,13 +305,23 @@ ] } +js_test_gen_html("js_test_gen_html_modules") { + deps = [ ":image_orientation_unittest.m" ] + js_module = true + + closure_flags = strict_error_checking_closure_args + [ + "js_module_root=./gen/ui/file_manager/file_manager/foreground/js/metadata", + "js_module_root=../../ui/file_manager/file_manager/foreground/js/metadata", + "browser_resolver_prefix_replacements=\"chrome://test/=./\"", + ] +} + js_test_gen_html("js_test_gen_html") { deps = [ ":content_metadata_provider_unittest", ":exif_parser_unittest", ":external_metadata_provider_unittest", ":file_system_metadata_provider_unittest", - ":image_orientation_unittest", ":metadata_cache_item_unittest", ":metadata_cache_set_unittest", ":metadata_model_unittest", @@ -275,3 +330,12 @@ ] mocks = [ "metadata_dispatcher_mock_deps.js" ] } + +js_modulizer("modulize") { + input_files = [ + "metadata_item.js", + "metadata_request.js", + "image_orientation.js", + "metadata_provider.js", + ] +}
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/image_orientation.js b/ui/file_manager/file_manager/foreground/js/metadata/image_orientation.js index 034b7b3e..8551fa5 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/image_orientation.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/image_orientation.js
@@ -13,7 +13,7 @@ * Class representing image orientation. * @final */ -class ImageOrientation { +/* #export */ class ImageOrientation { /** * The constructor takes 2x2 matrix value that cancels the image orientation: * |a, c|
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/image_orientation_unittest.js b/ui/file_manager/file_manager/foreground/js/metadata/image_orientation_unittest.m.js similarity index 90% rename from ui/file_manager/file_manager/foreground/js/metadata/image_orientation_unittest.js rename to ui/file_manager/file_manager/foreground/js/metadata/image_orientation_unittest.m.js index 7f306e6..d4b575a 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/image_orientation_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/image_orientation_unittest.m.js
@@ -2,7 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -function testGetSizeAfterCancelling() { +import {assertDeepEquals, assertEquals, assertTrue} from 'chrome://test/chai_assert.js'; + +import {ImageOrientation} from './image_orientation.m.js'; + +export function testGetSizeAfterCancelling() { // Crockwise 90 degrees image orientation. const orientation = new ImageOrientation(0, 1, 1, 0); @@ -12,7 +16,7 @@ assertEquals(100, size.height); } -function testCancelImageOrientation() { +export function testCancelImageOrientation() { // Crockwise 90 degrees image orientation. const orientation = new ImageOrientation(0, 1, 1, 0); @@ -39,7 +43,9 @@ orientation.cancelImageOrientation(destinationContext, 2, 1); destinationContext.drawImage(canvas, 0, 0); const destinationImageData = destinationContext.getImageData(0, 0, 1, 2); - assertArrayEquals([255, 0, 0, 100, 0, 0, 0, 100], destinationImageData.data); + assertDeepEquals( + new Uint8ClampedArray([255, 0, 0, 100, 0, 0, 0, 100]), + destinationImageData.data); } function assertImageOrientationEquals(expected, actual, message) { @@ -49,7 +55,7 @@ assertEquals(expected.d, actual.d, message); } -function testFromRotationAndScale() { +export function testFromRotationAndScale() { const rotate270 = {scaleX: 1, scaleY: 1, rotate90: -1}; const rotate90 = {scaleX: 1, scaleY: 1, rotate90: 1}; const flipX = {scaleX: -1, scaleY: 1, rotate90: 0};
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.js index 7caf69f9..f579752d6 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_item.js
@@ -16,7 +16,7 @@ * @unrestricted to allow access for properties via '.' or '[]', useful for * computed properties. */ -class MetadataItem { +/* #export */ class MetadataItem { constructor() { /** * Size of the file. -1 for directory.
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_provider.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_provider.js index 2072984..c7b41f0 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_provider.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_provider.js
@@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// #import {assert} from 'chrome://resources/js/assert.m.js'; +// #import {MetadataRequest} from './metadata_request.m.js'; +// #import {MetadataItem} from './metadata_item.m.js'; + /** * @abstract */
diff --git a/ui/file_manager/file_manager/foreground/js/metadata/metadata_request.js b/ui/file_manager/file_manager/foreground/js/metadata/metadata_request.js index 2306099..eeae688 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata/metadata_request.js +++ b/ui/file_manager/file_manager/foreground/js/metadata/metadata_request.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -class MetadataRequest { +/* #export */ class MetadataRequest { /** * @param {!Entry} entry Entry * @param {!Array<string>} names Property name list to be requested.
diff --git a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn index b2dc391..78ac837 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -421,6 +421,7 @@ ":file_grid", ":file_table", "//ui/file_manager/file_manager/common/js:util", + "//ui/file_manager/file_manager/foreground/js:dialog_type", "//ui/webui/resources/js/cr/ui:list_item", ] }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js index 8422e61..63ecc3e 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
@@ -439,7 +439,8 @@ initAdditionalUI(table, grid, volumeManager) { // List container. this.listContainer = new ListContainer( - queryRequiredElement('#list-container', this.element), table, grid); + queryRequiredElement('#list-container', this.element), table, grid, + this.dialogType_); // Location line. this.locationLine = new LocationLine(
diff --git a/ui/file_manager/file_manager/foreground/js/ui/list_container.js b/ui/file_manager/file_manager/foreground/js/ui/list_container.js index dad0765..0d22878 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/list_container.js +++ b/ui/file_manager/file_manager/foreground/js/ui/list_container.js
@@ -20,8 +20,9 @@ * @param {!HTMLElement} element Element of the container. * @param {!FileTable} table File table. * @param {!FileGrid} grid File grid. + * @param {DialogType} type The type of the main dialog. */ - constructor(element, table, grid) { + constructor(element, table, grid, type) { /** * The container element of the file list. * @type {!HTMLElement} @@ -144,6 +145,13 @@ e.stopPropagation(); } }.bind(this), true); + + // Ensure the list and grid are marked ARIA single select for save as. + if (type === DialogType.SELECT_SAVEAS_FILE) { + const list = table.querySelector('#file-list'); + list.setAttribute('aria-multiselectable', 'false'); + grid.setAttribute('aria-multiselectable', 'false'); + } } /**
diff --git a/ui/file_manager/integration_tests/file_manager/file_dialog.js b/ui/file_manager/integration_tests/file_manager/file_dialog.js index 0b4129f6..e53e200 100644 --- a/ui/file_manager/integration_tests/file_manager/file_dialog.js +++ b/ui/file_manager/integration_tests/file_manager/file_dialog.js
@@ -257,7 +257,48 @@ }; /** - * Tests opening save file dialog on Downloads and closing it with Ok button. + * Tests opening file dialog sets aria-multiselect true on grid and list. + */ +testcase.openFileDialogAriaMultipleSelect = async () => { + // Open File dialog. + chrome.fileSystem.chooseEntry({type: 'openFile'}, (entry) => {}); + const appId = await remoteCall.waitForWindow('dialog#'); + + // Wait to finish initial load. + await remoteCall.waitFor('isFileManagerLoaded', appId, true); + + // Check: <list> has aria-multiselect set to true. + const list = 'list#file-list[aria-multiselectable=true]'; + await remoteCall.waitForElement(appId, list); + + // Check: <grid> has aria-multiselect set to true. + const grid = 'grid#file-list[aria-multiselectable=true]'; + await remoteCall.waitForElement(appId, grid); +}; + +/** + * Tests opening save file dialog sets aria-multiselect false on grid and list. + */ +testcase.saveFileDialogAriaSingleSelect = async () => { + // Open Save as dialog. + chrome.fileSystem.chooseEntry({type: 'saveFile'}, (entry) => {}); + const appId = await remoteCall.waitForWindow('dialog#'); + + // Wait to finish initial load. + await remoteCall.waitFor('isFileManagerLoaded', appId, true); + + // Check: <list> has aria-multiselect set to false. + const list = 'list#file-list[aria-multiselectable=false]'; + await remoteCall.waitForElement(appId, list); + + // Check: <grid> has aria-multiselect set to false. + const grid = 'grid#file-list[aria-multiselectable=false]'; + await remoteCall.waitForElement(appId, grid); +}; + +/** + * Tests opening save file dialog on Downloads and closing it + * with Ok button. */ testcase.saveFileDialogDownloads = () => { return saveFileDialogClickOkButton('downloads', TEST_LOCAL_FILE);
diff --git a/ui/file_manager/integration_tests/file_manager/trash.js b/ui/file_manager/integration_tests/file_manager/trash.js index 86b13584..2a29277 100644 --- a/ui/file_manager/integration_tests/file_manager/trash.js +++ b/ui/file_manager/integration_tests/file_manager/trash.js
@@ -6,6 +6,7 @@ /** * Delete files in MyFiles and ensure they are moved to /.Trash. + * Then delete items from /.Trash/files and /.Trash/info, then delete /.Trash. */ testcase.trashMoveToTrash = async () => { const appId = await setupAndWaitUntilReady( @@ -15,12 +16,8 @@ await remoteCall.waitAndClickElement( appId, '#file-list [file-name="hello.txt"]'); - // Delete item and confirm delete. + // Delete item and wait for it to be removed (no dialog). await remoteCall.waitAndClickElement(appId, '#delete-button'); - await remoteCall.waitAndClickElement( - appId, '.files-confirm-dialog .cr-dialog-ok'); - - // Wait for completion of file deletion. await remoteCall.waitForElementLost( appId, '#file-list [file-name="hello.txt"]'); @@ -42,15 +39,49 @@ // Navigate to /My files/Downloads/.Trash/files. await navigateWithDirectoryTree(appId, '/My files/Downloads/.Trash/files'); - // Ensure hello.txt exists. - await remoteCall.waitForElement(appId, '#file-list [file-name="hello.txt"]'); + // Select hello.txt. + await remoteCall.waitAndClickElement( + appId, '#file-list [file-name="hello.txt"]'); - // Navigate to /My files/.Trash/files. + // Delete item and confirm delete (dialog shown). + await remoteCall.waitAndClickElement(appId, '#delete-button'); + await remoteCall.waitAndClickElement( + appId, '.files-confirm-dialog .cr-dialog-ok'); + + // Wait for completion of file deletion. + await remoteCall.waitForElementLost( + appId, '#file-list [file-name="hello.txt"]'); + + // Navigate to /My files/Downloads/.Trash/info. await navigateWithDirectoryTree(appId, '/My files/Downloads/.Trash/info'); - // Ensure hello.txt.trashinfo exists. - await remoteCall.waitForElement( + // Select hello.txt.trashinfo. + await remoteCall.waitAndClickElement( appId, '#file-list [file-name="hello.txt.trashinfo"]'); + + // Delete item and confirm delete (dialog shown). + await remoteCall.waitAndClickElement(appId, '#delete-button'); + await remoteCall.waitAndClickElement( + appId, '.files-confirm-dialog .cr-dialog-ok'); + + // Wait for completion of file deletion. + await remoteCall.waitForElementLost( + appId, '#file-list [file-name="hello.txt.trashinfo"]'); + + // Navigate to /My files/Downloads. + await navigateWithDirectoryTree(appId, '/My files/Downloads'); + + // Select .Trash. + await remoteCall.waitAndClickElement( + appId, '#file-list [file-name=".Trash"]'); + + // Delete item and confirm delete (dialog shown). + await remoteCall.waitAndClickElement(appId, '#delete-button'); + await remoteCall.waitAndClickElement( + appId, '.files-confirm-dialog .cr-dialog-ok'); + + // Wait for completion of file deletion. + await remoteCall.waitForElementLost(appId, '#file-list [file-name=".Trash"]'); }; /** @@ -64,12 +95,8 @@ await remoteCall.waitAndClickElement( appId, '#file-list [file-name="hello.txt"]'); - // Delete item and confirm delete. + // Delete item and wait for it to be removed (no dialog). await remoteCall.waitAndClickElement(appId, '#delete-button'); - await remoteCall.waitAndClickElement( - appId, '.files-confirm-dialog .cr-dialog-ok'); - - // Wait for file to be removed from list. await remoteCall.waitForElementLost( appId, '#file-list [file-name="hello.txt"]');
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc index 5da30bb..2706b90 100644 --- a/ui/gfx/render_text.cc +++ b/ui/gfx/render_text.cc
@@ -1968,7 +1968,8 @@ size_t merge_candidate = 0; for (size_t i = 1; i < rects.size(); i++) { - if (rects[i].Intersects(rects[merge_candidate])) { + if (rects[i].Intersects(rects[merge_candidate]) || + rects[i].SharesEdgeWith(rects[merge_candidate])) { DCHECK_EQ(rects[i].y(), rects[merge_candidate].y()); DCHECK_EQ(rects[i].height(), rects[merge_candidate].height()); rects[merge_candidate].Union(rects[i]);
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h index be9c345..29c589e 100644 --- a/ui/gfx/render_text.h +++ b/ui/gfx/render_text.h
@@ -569,8 +569,8 @@ // guaranteed not to be smaller. These bounds could be visually discontinuous // if the substring is split by a LTR/RTL level change. These bounds are in // local coordinates, but may be outside the visible region if the text is - // longer than the textfield. Subsequent text, cursor, or bounds changes may - // invalidate returned values. + // larger than the available space. Subsequent text, cursor, or bounds changes + // may invalidate returned values. virtual std::vector<Rect> GetSubstringBounds(const Range& range) = 0; // Gets the horizontal span (relative to the left of the text, not the view)
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index 6eb0458..06bdb40 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc
@@ -7650,6 +7650,17 @@ test::RenderTextTestApi::MergeIntersectingRects(test_rects); ASSERT_EQ(1u, test_rects.size()); EXPECT_EQ(Rect(0, 0, 17, 10), test_rects[0]); + + // The first 3 rects are adjacent horizontally. The 4th rect is adjacent to + // the 3rd rect vertically, but is not merged. The last rect is adjacent to + // the 4th rect. + test_rects = std::vector<Rect>{Rect(0, 0, 10, 10), Rect(10, 0, 10, 10), + Rect(20, 0, 10, 10), Rect(20, 10, 10, 10), + Rect(30, 10, 10, 10)}; + test::RenderTextTestApi::MergeIntersectingRects(test_rects); + ASSERT_EQ(2u, test_rects.size()); + EXPECT_EQ(Rect(0, 0, 30, 10), test_rects[0]); + EXPECT_EQ(Rect(20, 10, 20, 10), test_rects[1]); } // Ensures that text is centered vertically and consistently when either the
diff --git a/ui/ozone/platform/scenic/scenic_surface.cc b/ui/ozone/platform/scenic/scenic_surface.cc index 3848c17..a36f4546 100644 --- a/ui/ozone/platform/scenic/scenic_surface.cc +++ b/ui/ozone/platform/scenic/scenic_surface.cc
@@ -98,6 +98,12 @@ scenic::ViewHolder view_holder(&scenic_session_, std::move(view_holder_token), "OverlayViewHolder"); scenic::EntityNode entity_node(&scenic_session_); + fuchsia::ui::gfx::ViewProperties view_properties; + view_properties.bounding_box = {{-0.5f, -0.5f, 0.f}, {0.5f, 0.5f, 0.f}}; + view_properties.focus_change = false; + view_holder.SetViewProperties(std::move(view_properties)); + view_holder.SetHitTestBehavior(fuchsia::ui::gfx::HitTestBehavior::kSuppress); + entity_node.AddChild(view_holder); parent_->AddChild(entity_node); scenic_session_.Present2( @@ -106,24 +112,34 @@ [](fuchsia::scenic::scheduling::FuturePresentationTimes info) {}); DCHECK(!overlays_.count(id)); - overlays_.emplace(id, std::move(entity_node)); + overlays_.emplace( + std::piecewise_construct, std::forward_as_tuple(id), + std::forward_as_tuple(std::move(view_holder), std::move(entity_node))); return true; } bool ScenicSurface::UpdateOverlayViewPosition(gfx::SysmemBufferCollectionId id, int plane_z_order, - const gfx::Rect& display_bounds) { + const gfx::Rect& display_bounds, + const gfx::RectF& crop_rect) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(overlays_.count(id)); auto& overlay_view_info = overlays_.at(id); + if (overlay_view_info.plane_z_order == plane_z_order && - overlay_view_info.display_bounds == display_bounds) { + overlay_view_info.display_bounds == display_bounds && + overlay_view_info.crop_rect == crop_rect) { return false; } + overlay_view_info.plane_z_order = plane_z_order; overlay_view_info.display_bounds = display_bounds; + overlay_view_info.crop_rect = crop_rect; + // TODO(crbug.com/1143514): Only queue commands for the affected overlays + // instead of the whole scene. UpdateViewHolderScene(); + return true; } @@ -160,25 +176,43 @@ } void ScenicSurface::UpdateViewHolderScene() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + // |plane_z_order| for main surface is 0. int min_z_order = 0; for (const auto& overlay : overlays_) { min_z_order = std::min(overlay.second.plane_z_order, min_z_order); } for (auto& overlay : overlays_) { + auto& info = overlay.second; + + // Apply view bound clipping around the ImagePipe that has size 1x1 and + // centered at (0, 0). + fuchsia::ui::gfx::ViewProperties view_properties; + const float left_bound = -0.5f + info.crop_rect.x(); + const float top_bound = -0.5f + info.crop_rect.y(); + view_properties.bounding_box = {{left_bound, top_bound, 0.f}, + {left_bound + info.crop_rect.width(), + top_bound + info.crop_rect.height(), 0.f}}; + view_properties.focus_change = false; + info.view_holder.SetViewProperties(std::move(view_properties)); + + // Scale ImagePipe based on the display bounds and clip rect given. const float scaled_width = - overlay.second.display_bounds.width() / main_shape_size_.width(); + info.display_bounds.width() / + (info.crop_rect.width() * main_shape_size_.width()); const float scaled_height = - overlay.second.display_bounds.height() / main_shape_size_.height(); - overlay.second.entity_node.SetScale(scaled_width, scaled_height, 1.f); - const float scaled_x = - overlay.second.display_bounds.x() / main_shape_size_.width(); - const float scaled_y = - overlay.second.display_bounds.y() / main_shape_size_.height(); - overlay.second.entity_node.SetTranslation( + info.display_bounds.height() / + (info.crop_rect.height() * main_shape_size_.height()); + info.entity_node.SetScale(scaled_width, scaled_height, 1.f); + + // Position ImagePipe based on the display bounds given. + const float scaled_x = info.display_bounds.x() / main_shape_size_.width(); + const float scaled_y = info.display_bounds.y() / main_shape_size_.height(); + info.entity_node.SetTranslation( scaled_x - (0.5f - scaled_width / 2), scaled_y - (0.5f - scaled_height / 2), - (min_z_order - overlay.second.plane_z_order) * kElevationStep); + (min_z_order - info.plane_z_order) * kElevationStep); } main_material_.SetColor(255, 255, 255, 0 > min_z_order ? 254 : 255);
diff --git a/ui/ozone/platform/scenic/scenic_surface.h b/ui/ozone/platform/scenic/scenic_surface.h index ee026a0c..e2df23d 100644 --- a/ui/ozone/platform/scenic/scenic_surface.h +++ b/ui/ozone/platform/scenic/scenic_surface.h
@@ -13,6 +13,7 @@ #include "base/threading/thread_checker.h" #include "mojo/public/cpp/platform/platform_handle.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/size_f.h" #include "ui/gfx/native_pixmap_handle.h" #include "ui/gfx/native_widget_types.h" @@ -55,7 +56,8 @@ // |id| to be added by PresentOverlayView() before. bool UpdateOverlayViewPosition(gfx::SysmemBufferCollectionId id, int plane_z_order, - const gfx::Rect& display_bounds); + const gfx::Rect& display_bounds, + const gfx::RectF& crop_rect); // Remove ViewHolder specified by |id|. bool RemoveOverlayView(gfx::SysmemBufferCollectionId id); @@ -90,11 +92,14 @@ const gfx::AcceleratedWidget window_; struct OverlayViewInfo { - OverlayViewInfo(scenic::EntityNode node) : entity_node(std::move(node)) {} + OverlayViewInfo(scenic::ViewHolder holder, scenic::EntityNode node) + : view_holder(std::move(holder)), entity_node(std::move(node)) {} + scenic::ViewHolder view_holder; scenic::EntityNode entity_node; int plane_z_order = 0; gfx::Rect display_bounds; + gfx::RectF crop_rect; }; std::unordered_map<gfx::SysmemBufferCollectionId, OverlayViewInfo,
diff --git a/ui/ozone/platform/scenic/sysmem_native_pixmap.cc b/ui/ozone/platform/scenic/sysmem_native_pixmap.cc index efb111c..269ff143 100644 --- a/ui/ozone/platform/scenic/sysmem_native_pixmap.cc +++ b/ui/ozone/platform/scenic/sysmem_native_pixmap.cc
@@ -88,7 +88,7 @@ return false; } surface->UpdateOverlayViewPosition(buffer_collection_id, plane_z_order, - display_bounds); + display_bounds, crop_rect); overlay_view->SetBlendMode(enable_blend); overlay_view->PresentImage(handle_.buffer_index); return true;
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc index 0df2755e..1381e945 100644 --- a/ui/views/controls/label.cc +++ b/ui/views/controls/label.cc
@@ -473,6 +473,14 @@ SchedulePaint(); } +std::vector<gfx::Rect> Label::GetSubstringBounds(const gfx::Range& range) { + auto substring_bounds = full_text_->GetSubstringBounds(range); + for (auto& bound : substring_bounds) { + bound.Offset(GetInsets().left(), GetInsets().top()); + } + return substring_bounds; +} + views::PropertyChangedSubscription Label::AddTextChangedCallback( views::PropertyChangedCallback callback) { return AddPropertyChangedCallback(&full_text_ + kLabelText,
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index 044bf77..ac651de 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h
@@ -6,6 +6,7 @@ #define UI_VIEWS_CONTROLS_LABEL_H_ #include <memory> +#include <vector> #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" @@ -264,6 +265,10 @@ // |range| endpoints don't lie on grapheme boundaries. void SelectRange(const gfx::Range& range); + // Get the visual bounds containing the logical substring of the full text + // within the |range|. See gfx::RenderText. + std::vector<gfx::Rect> GetSubstringBounds(const gfx::Range& range); + views::PropertyChangedSubscription AddTextChangedCallback( views::PropertyChangedCallback callback) WARN_UNUSED_RESULT;
diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc index ba66347b..f3c30239 100644 --- a/ui/views/controls/label_unittest.cc +++ b/ui/views/controls/label_unittest.cc
@@ -1062,6 +1062,26 @@ EXPECT_TRUE(text_changed); } +// Verify that GetSubstringBounds returns the correct bounds, accounting for +// label insets. +TEST_F(LabelTest, GetSubstringBounds) { + label()->SetText(ASCIIToUTF16("abc")); + auto substring_bounds = label()->GetSubstringBounds(gfx::Range(0, 3)); + EXPECT_EQ(1u, substring_bounds.size()); + + gfx::Insets insets{2, 3, 4, 5}; + label()->SetBorder(CreateEmptyBorder(insets)); + auto substring_bounds_with_inset = + label()->GetSubstringBounds(gfx::Range(0, 3)); + EXPECT_EQ(1u, substring_bounds_with_inset.size()); + EXPECT_EQ(substring_bounds[0].x() + 3, substring_bounds_with_inset[0].x()); + EXPECT_EQ(substring_bounds[0].y() + 2, substring_bounds_with_inset[0].y()); + EXPECT_EQ(substring_bounds[0].width(), + substring_bounds_with_inset[0].width()); + EXPECT_EQ(substring_bounds[0].height(), + substring_bounds_with_inset[0].height()); +} + // TODO(crbug.com/1139395): Enable on ChromeOS along with the DCHECK in Label. #if !defined(OS_CHROMEOS) // Ensures DCHECK for subpixel rendering on transparent layer is working.
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index df5b1ffa..47adaa0 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn
@@ -41,6 +41,7 @@ deps = [ ":preprocess_generated", ":preprocess_src", + "cr_components:preprocess", "cr_elements:preprocess", ] }