diff --git a/DEPS b/DEPS index ab4e433..164a5ed 100644 --- a/DEPS +++ b/DEPS
@@ -167,11 +167,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': 'a718a61003d1e58c225b600cde9322f1c6ab3998', + 'skia_revision': '902cf1e12a74e0f4d28ca6089aaecfda63e3b728', # 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': '62fdbf47faaec6de6db1867667af75f86f439772', + 'v8_revision': '79eb4f5c4a72d35033d405fc5f1d539989b5d89c', # 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. @@ -179,7 +179,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': '2682b5a02d16d03094e579fea17c802b23999251', + 'angle_revision': 'a333b87cfcbe26daa7760aa710234c8e999d9ba5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -230,7 +230,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': 'cd2fb1efa170f03d4b3185e6537537072b00e3ad', + 'catapult_revision': '0b1af463167af25923a31dd190b41a32841e05fe', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -302,11 +302,11 @@ # 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': '21dfc919547fb3b139b56271d1aa09518bd75801', + 'dawn_revision': '720988d878a186959e2b799ac8644c82759ef890', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': 'ef79a5fa1b2c3303dc1dae969482ead934be85a8', + 'quiche_revision': 'bf0413d8c1d6d56838bc65b8f1f78b3970131d22', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -862,7 +862,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '40324d671c257be329238223356da4e77ab16540', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '5365f6a6b59d846523b9cea87a4b48ea934149c7', 'condition': 'checkout_linux', }, @@ -887,7 +887,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '3306bbe476fd4b069aad347afdd5b4e3564234aa', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1ad5811accaedf0cf6b05747261a6a006d0dc090', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -1280,7 +1280,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '603e7a0e5a97307a45bfe5903be23c6e384393be', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f91a82bb16246437dc6c565b80f13158d142dde6', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1532,7 +1532,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fa01042385e555b5340e1e732038fba9929bae29', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@482a6e85b16710573a1277cbb655e4be6665bdf2', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/metrics/aw_metrics_service_client.cc b/android_webview/browser/metrics/aw_metrics_service_client.cc index e117d98..f4078a2 100644 --- a/android_webview/browser/metrics/aw_metrics_service_client.cc +++ b/android_webview/browser/metrics/aw_metrics_service_client.cc
@@ -26,6 +26,7 @@ #include "components/metrics/metrics_pref_names.h" #include "components/metrics/metrics_service.h" #include "components/metrics/metrics_state_manager.h" +#include "components/metrics/net/cellular_logic_helper.h" #include "components/metrics/net/network_metrics_provider.h" #include "components/metrics/ui/screen_info_metrics_provider.h" #include "components/metrics/version_utils.h" @@ -251,10 +252,17 @@ } base::TimeDelta AwMetricsServiceClient::GetStandardUploadInterval() { - // The platform logging mechanism is responsible for upload frequency; this - // just specifies how frequently to provide logs to the platform. 30 minutes - // was chosen arbitrarily. - return base::TimeDelta::FromMinutes(30); + // In WebView, metrics collection (when we batch up all logged histograms into + // a ChromeUserMetricsExtension proto) and metrics uploading (when the proto + // goes to the server) happen separately. + // + // This interval controls the metrics collection rate, so we choose the + // standard upload interval to make sure we're collecting metrics consistently + // with Chrome for Android. The metrics uploading rate for WebView is + // controlled by the platform logging mechanism. Since this mechanism has its + // own logic for rate-limiting on cellular connections, we disable the + // component-layer logic. + return metrics::GetUploadInterval(false /* use_cellular_upload_interval */); } std::string AwMetricsServiceClient::GetAppPackageName() {
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java index 81dd7b2..ef572e5 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java
@@ -255,13 +255,15 @@ @Override public void onRendererUnresponsive(final AwRenderProcess renderProcess) { - if (mWebViewRendererClientAdapter != null) + if (mWebViewRendererClientAdapter != null) { mWebViewRendererClientAdapter.onRendererUnresponsive(mWebView, renderProcess); + } } @Override public void onRendererResponsive(final AwRenderProcess renderProcess) { - if (mWebViewRendererClientAdapter != null) + if (mWebViewRendererClientAdapter != null) { mWebViewRendererClientAdapter.onRendererResponsive(mWebView, renderProcess); + } } }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java b/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java index 6aa1165..91299cb4 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java +++ b/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java
@@ -141,8 +141,9 @@ public void addInputUIObserver(InputUIObserver observer) { if (observer == null) return; - if (mInputUIObservers == null) + if (mInputUIObservers == null) { mInputUIObservers = new ArrayList<WeakReference<InputUIObserver>>(); + } mInputUIObservers.add(new WeakReference<InputUIObserver>(observer)); }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java b/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java index 0417902..7f3d6f2 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java +++ b/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java
@@ -123,51 +123,53 @@ } private int toUMAAutofillSessionValue() { - if (mState == 0) + if (mState == 0) { return NO_CALLBACK_FORM_FRAMEWORK; - else if (mState == EVENT_VIRTUAL_STRUCTURE_PROVIDED) + } else if (mState == EVENT_VIRTUAL_STRUCTURE_PROVIDED) { return NO_SUGGESTION_USER_NOT_CHANGE_FORM_NO_FORM_SUBMITTED; - else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_USER_CHANGED_FIELD_VALUE)) + } else if (mState + == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_USER_CHANGED_FIELD_VALUE)) { return NO_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED; - else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_FORM_SUBMITTED)) + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_FORM_SUBMITTED)) { return NO_SUGGESTION_USER_NOT_CHANGE_FORM_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_USER_CHANGED_FIELD_VALUE - | EVENT_FORM_SUBMITTED)) + | EVENT_FORM_SUBMITTED)) { return NO_SUGGESTION_USER_CHANGE_FORM_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_FORM_AUTOFILLED)) + | EVENT_FORM_AUTOFILLED)) { return USER_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_NO_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_FORM_AUTOFILLED | EVENT_FORM_SUBMITTED)) + | EVENT_FORM_AUTOFILLED | EVENT_FORM_SUBMITTED)) { return USER_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE - | EVENT_FORM_SUBMITTED)) + | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE + | EVENT_FORM_SUBMITTED)) { return USER_SELECT_SUGGESTION_USER_CHANGE_FORM_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE)) + | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE)) { return USER_SELECT_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED; - else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED)) + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED)) { return USER_NOT_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_NO_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_FORM_SUBMITTED)) + | EVENT_FORM_SUBMITTED)) { return USER_NOT_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_USER_CHANGED_FIELD_VALUE | EVENT_FORM_SUBMITTED)) + | EVENT_USER_CHANGED_FIELD_VALUE | EVENT_FORM_SUBMITTED)) { return USER_NOT_SELECT_SUGGESTION_USER_CHANGE_FORM_FORM_SUBMITTED; - else if (mState + } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED - | EVENT_USER_CHANGED_FIELD_VALUE)) + | EVENT_USER_CHANGED_FIELD_VALUE)) { return USER_NOT_SELECT_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED; - else + } else { return SESSION_UNKNOWN; + } } private int mState; @@ -218,10 +220,11 @@ public void onUserChangeFieldValue(boolean isPreviouslyAutofilled) { if (mRecorder == null) return; - if (isPreviouslyAutofilled) + if (isPreviouslyAutofilled) { mRecorder.record(SessionRecorder.EVENT_USER_CHANGED_AUTOFILLED_FIELD); - else + } else { mRecorder.record(SessionRecorder.EVENT_USER_CHANGED_FIELD_VALUE); + } } private void recordSession() {
diff --git a/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java b/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java index 80548d44..bc630e6 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java +++ b/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java
@@ -104,8 +104,9 @@ } if (!proto.hasSignature() || !proto.hasCountry() || !proto.hasDate() - || !proto.hasIsGzipCompressed() || !proto.hasSeedData()) + || !proto.hasIsGzipCompressed() || !proto.hasSeedData()) { return null; + } SeedInfo info = new SeedInfo(); info.signature = proto.getSignature();
diff --git a/ash/app_list/views/assistant/privacy_info_view.cc b/ash/app_list/views/assistant/privacy_info_view.cc index 4f738210..7154a551 100644 --- a/ash/app_list/views/assistant/privacy_info_view.cc +++ b/ash/app_list/views/assistant/privacy_info_view.cc
@@ -14,6 +14,7 @@ #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/border.h" #include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/styled_label.h" #include "ui/views/layout/box_layout.h" @@ -199,10 +200,7 @@ close_button_->set_ink_drop_highlight_opacity(kInkDropHighlightOpacity); close_button_->set_ink_drop_base_color(kInkDropBaseColor); close_button_->set_has_ink_drop_action_on_click(true); - auto highlight_path = std::make_unique<SkPath>(); - highlight_path->addOval(gfx::RectToSkRect(gfx::Rect(close_button_->size()))); - close_button_->SetProperty(views::kHighlightPathKey, - highlight_path.release()); + views::InstallCircleHighlightPathGenerator(close_button_); row_container_->AddChildView(close_button_); }
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 5e3d003..a5e45f6 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -1980,15 +1980,9 @@ <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_BUTTON" desc="Label for button to add 1 minute to timer in Assistant timer notification."> Add 1 min </message> - <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_QUERY" desc="Query to issue to add 1 minute to an Assistant timer."> - Add 1 min to timer - </message> <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_BUTTON" desc="Label for stop button in Assistant timer notification."> Stop </message> - <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_QUERY" desc="Query to issue to stop Assistant timer."> - Stop timer - </message> <message name="IDS_ASSISTANT_CREATE_REMINDER_QUERY" desc="Query to issue to create reminder."> Create reminder </message>
diff --git a/ash/assistant/assistant_alarm_timer_controller.cc b/ash/assistant/assistant_alarm_timer_controller.cc index 37263a8..54f5b0b 100644 --- a/ash/assistant/assistant_alarm_timer_controller.cc +++ b/ash/assistant/assistant_alarm_timer_controller.cc
@@ -68,26 +68,17 @@ l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_TITLE); const std::string message = CreateTimerNotificationMessage(alarm_timer, time_remaining); - const GURL action_url = assistant::util::CreateAssistantQueryDeepLink( - l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_QUERY)); - base::Optional<GURL> stop_alarm_timer_action_url; - base::Optional<GURL> add_time_to_timer_action_url; - if (chromeos::assistant::features::IsAlarmTimerManagerEnabled()) { - stop_alarm_timer_action_url = assistant::util::CreateAlarmTimerDeepLink( - assistant::util::AlarmTimerAction::kStopRinging, - /*alarm_timer_id=*/base::nullopt, - /*duration=*/base::nullopt); - add_time_to_timer_action_url = assistant::util::CreateAlarmTimerDeepLink( - assistant::util::AlarmTimerAction::kAddTimeToTimer, alarm_timer.id, - kOneMin); - } else { - stop_alarm_timer_action_url = assistant::util::CreateAssistantQueryDeepLink( - l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_QUERY)); - add_time_to_timer_action_url = - assistant::util::CreateAssistantQueryDeepLink(l10n_util::GetStringUTF8( - IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_QUERY)); - } + base::Optional<GURL> stop_alarm_timer_action_url = + assistant::util::CreateAlarmTimerDeepLink( + assistant::util::AlarmTimerAction::kStopRinging, + /*alarm_timer_id=*/base::nullopt, + /*duration=*/base::nullopt); + + base::Optional<GURL> add_time_to_timer_action_url = + assistant::util::CreateAlarmTimerDeepLink( + assistant::util::AlarmTimerAction::kAddTimeToTimer, alarm_timer.id, + kOneMin); AssistantNotificationPtr notification = AssistantNotification::New(); @@ -152,7 +143,6 @@ void AssistantAlarmTimerController::BindReceiver( mojo::PendingReceiver<mojom::AssistantAlarmTimerController> receiver) { - DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled()); receiver_.Bind(std::move(receiver)); } @@ -166,20 +156,6 @@ model_.RemoveObserver(observer); } -// TODO(dmblack): Remove method when the LibAssistant Alarm/Timer API is ready. -void AssistantAlarmTimerController::OnTimerSoundingStarted() { - AlarmTimer timer; - timer.id = std::to_string(next_timer_id_++); - timer.type = AlarmTimerType::kTimer; - timer.end_time = base::TimeTicks::Now(); - model_.AddAlarmTimer(timer); -} - -// TODO(dmblack): Remove method when the LibAssistant Alarm/Timer API is ready. -void AssistantAlarmTimerController::OnTimerSoundingFinished() { - model_.RemoveAllAlarmsTimers(); -} - void AssistantAlarmTimerController::OnAlarmTimerStateChanged( mojom::AssistantAlarmTimerEventPtr event) { if (!event) { @@ -212,26 +188,18 @@ const AlarmTimer& alarm_timer, const base::TimeDelta& time_remaining) { // Schedule a repeating timer to tick the tracked alarms/timers. - if (chromeos::assistant::features::IsTimerTicksEnabled() && - !timer_.IsRunning()) { + if (!timer_.IsRunning()) { timer_.Start(FROM_HERE, kTickInterval, &model_, &AssistantAlarmTimerModel::Tick); } // Create a notification for the added alarm/timer. - DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled()); - if (chromeos::assistant::features::IsTimerNotificationEnabled()) { - assistant_controller_->notification_controller()->AddOrUpdateNotification( - CreateTimerNotification(alarm_timer, time_remaining)); - } + assistant_controller_->notification_controller()->AddOrUpdateNotification( + CreateTimerNotification(alarm_timer, time_remaining)); } void AssistantAlarmTimerController::OnAlarmsTimersTicked( const std::map<std::string, base::TimeDelta>& times_remaining) { - // This code should only be called when timer notifications/ticks are enabled. - DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled()); - DCHECK(chromeos::assistant::features::IsTimerTicksEnabled()); - // Update any existing notifications associated w/ our alarms/timers. for (auto& pair : times_remaining) { auto* notification_controller = @@ -245,16 +213,13 @@ } void AssistantAlarmTimerController::OnAllAlarmsTimersRemoved() { - if (chromeos::assistant::features::IsTimerTicksEnabled()) - timer_.Stop(); + // We can stop our timer from ticking when all alarms/timers are removed. + timer_.Stop(); // Remove any notifications associated w/ alarms/timers. - DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled()); - if (chromeos::assistant::features::IsTimerNotificationEnabled()) { - assistant_controller_->notification_controller() - ->RemoveNotificationByGroupingKey(kTimerNotificationGroupingKey, - /*from_server=*/false); - } + assistant_controller_->notification_controller() + ->RemoveNotificationByGroupingKey(kTimerNotificationGroupingKey, + /*from_server=*/false); } void AssistantAlarmTimerController::SetAssistant( @@ -306,18 +271,6 @@ if (old_visibility != AssistantVisibility::kVisible) return; - // We only do this if the AlarmTimerManager is enabled, as otherwise we would - // have to issue an Assistant query to stop ringing alarms/timers which would - // cause Assistant UI to once again show. This would be a bad user experience. - if (!chromeos::assistant::features::IsAlarmTimerManagerEnabled()) - return; - - // We only do this if timer notifications are enabled, as otherwise the - // ringing alarm/timer isn't bound to any particular UI affordance so it can - // maintain its own lifecycle. - if (!chromeos::assistant::features::IsTimerNotificationEnabled()) - return; - // We only do this if in-Assistant notifications are enabled, as in-Assistant // alarm/timer notifications only live as long the Assistant UI. Per UX // requirement, when Assistant UI dismisses with an in-Assistant timer
diff --git a/ash/assistant/assistant_alarm_timer_controller.h b/ash/assistant/assistant_alarm_timer_controller.h index 4ec45dc..e14dcfc 100644 --- a/ash/assistant/assistant_alarm_timer_controller.h +++ b/ash/assistant/assistant_alarm_timer_controller.h
@@ -52,8 +52,6 @@ void RemoveModelObserver(AssistantAlarmTimerModelObserver* observer); // mojom::AssistantAlarmTimerController: - void OnTimerSoundingStarted() override; - void OnTimerSoundingFinished() override; void OnAlarmTimerStateChanged( mojom::AssistantAlarmTimerEventPtr event) override; @@ -98,8 +96,6 @@ // Owned by AssistantController. chromeos::assistant::mojom::Assistant* assistant_; - int next_timer_id_ = 1; - DISALLOW_COPY_AND_ASSIGN(AssistantAlarmTimerController); };
diff --git a/ash/host/ash_window_tree_host_platform.cc b/ash/host/ash_window_tree_host_platform.cc index 4a8147d..c10bfa14 100644 --- a/ash/host/ash_window_tree_host_platform.cc +++ b/ash/host/ash_window_tree_host_platform.cc
@@ -25,7 +25,7 @@ #include "ui/gfx/transform.h" #include "ui/ozone/public/input_controller.h" #include "ui/ozone/public/ozone_platform.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_init_properties.h" namespace ash {
diff --git a/ash/host/ash_window_tree_host_unified.cc b/ash/host/ash_window_tree_host_unified.cc index fe31c6c8a..7e46505 100644 --- a/ash/host/ash_window_tree_host_unified.cc +++ b/ash/host/ash_window_tree_host_unified.cc
@@ -65,7 +65,7 @@ AshWindowTreeHostMirroringDelegate* delegate) : AshWindowTreeHostPlatform(), delegate_(delegate) { DCHECK(delegate); - std::unique_ptr<ui::PlatformWindow> window(new ui::StubWindow(this)); + std::unique_ptr<ui::PlatformWindowBase> window(new ui::StubWindow(this)); window->SetBounds(initial_bounds); SetPlatformWindow(std::move(window)); }
diff --git a/ash/public/mojom/assistant_controller.mojom b/ash/public/mojom/assistant_controller.mojom index bb7e017..124154e3 100644 --- a/ash/public/mojom/assistant_controller.mojom +++ b/ash/public/mojom/assistant_controller.mojom
@@ -53,12 +53,6 @@ // AssistantController. Currently used by the Assistant service to notify Ash // of changes to the underlying alarm/timer state in LibAssistant. interface AssistantAlarmTimerController { - // Invoked when a timer has started sounding. - OnTimerSoundingStarted(); - - // Invoked when a timer has finished sounding. - OnTimerSoundingFinished(); - // Invoked when an alarm/timer state changed. No alarm/timer is ringing if // |event| is nullptr. OnAlarmTimerStateChanged(AssistantAlarmTimerEvent? event);
diff --git a/ash/system/unified/feature_pod_button.cc b/ash/system/unified/feature_pod_button.cc index 5eef504..b5fc4197 100644 --- a/ash/system/unified/feature_pod_button.cc +++ b/ash/system/unified/feature_pod_button.cc
@@ -21,6 +21,7 @@ #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/animation/ink_drop_mask.h" #include "ui/views/border.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" @@ -48,10 +49,7 @@ SetImageHorizontalAlignment(ALIGN_CENTER); SetImageVerticalAlignment(ALIGN_MIDDLE); TrayPopupUtils::ConfigureTrayPopupButton(this); - - auto path = std::make_unique<SkPath>(); - path->addOval(gfx::RectToSkRect(gfx::Rect(kUnifiedFeaturePodIconSize))); - SetProperty(views::kHighlightPathKey, path.release()); + views::InstallCircleHighlightPathGenerator(this); } FeaturePodIconButton::~FeaturePodIconButton() = default;
diff --git a/ash/system/unified/top_shortcut_button.cc b/ash/system/unified/top_shortcut_button.cc index d8ef80b7..00b74335 100644 --- a/ash/system/unified/top_shortcut_button.cc +++ b/ash/system/unified/top_shortcut_button.cc
@@ -15,6 +15,7 @@ #include "ui/views/animation/ink_drop_highlight.h" #include "ui/views/animation/ink_drop_impl.h" #include "ui/views/animation/ink_drop_mask.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/view_class_properties.h" namespace ash { @@ -57,9 +58,7 @@ TrayPopupUtils::ConfigureTrayPopupButton(this); - auto path = std::make_unique<SkPath>(); - path->addOval(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize()))); - SetProperty(views::kHighlightPathKey, path.release()); + views::InstallCircleHighlightPathGenerator(this); } TopShortcutButton::~TopShortcutButton() = default; @@ -75,7 +74,7 @@ AshColorProvider::ControlsLayerType::kInactiveControlBackground, kUnifiedMenuButtonColor)); flags.setStyle(cc::PaintFlags::kFill_Style); - canvas->DrawPath(*GetProperty(views::kHighlightPathKey), flags); + canvas->DrawPath(views::GetHighlightPath(this), flags); views::ImageButton::PaintButtonContents(canvas); }
diff --git a/ash/system/unified/unified_slider_view.cc b/ash/system/unified/unified_slider_view.cc index 4efb05e..635b575 100644 --- a/ash/system/unified/unified_slider_view.cc +++ b/ash/system/unified/unified_slider_view.cc
@@ -14,6 +14,7 @@ #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/animation/ink_drop_mask.h" #include "ui/views/border.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/layout/box_layout.h" #include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" @@ -59,9 +60,7 @@ : TopShortcutButton(listener, accessible_name_id) { SetVectorIcon(icon); SetBorder(views::CreateEmptyBorder(kUnifiedCircularButtonFocusPadding)); - auto path = std::make_unique<SkPath>(); - path->addOval(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize()))); - SetProperty(views::kHighlightPathKey, path.release()); + views::InstallCircleHighlightPathGenerator(this); } UnifiedSliderButton::~UnifiedSliderButton() = default;
diff --git a/base/memory/fake_memory_pressure_monitor.h b/base/memory/fake_memory_pressure_monitor.h deleted file mode 100644 index d012876..0000000 --- a/base/memory/fake_memory_pressure_monitor.h +++ /dev/null
@@ -1,34 +0,0 @@ -// Copyright 2018 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 BASE_MEMORY_FAKE_MEMORY_PRESSURE_MONITOR_H_ -#define BASE_MEMORY_FAKE_MEMORY_PRESSURE_MONITOR_H_ - -#include "base/macros.h" -#include "base/memory/memory_pressure_monitor.h" - -namespace base { -namespace test { - -class FakeMemoryPressureMonitor : public base::MemoryPressureMonitor { - public: - FakeMemoryPressureMonitor(); - ~FakeMemoryPressureMonitor() override; - - void SetAndNotifyMemoryPressure(MemoryPressureLevel level); - - // base::MemoryPressureMonitor overrides: - MemoryPressureLevel GetCurrentPressureLevel() const override; - void SetDispatchCallback(const DispatchCallback& callback) override; - - private: - MemoryPressureLevel memory_pressure_level_; - - DISALLOW_COPY_AND_ASSIGN(FakeMemoryPressureMonitor); -}; - -} // namespace test -} // namespace base - -#endif // BASE_MEMORY_FAKE_MEMORY_PRESSURE_MONITOR_H_
diff --git a/base/strings/string_piece.cc b/base/strings/string_piece.cc index 278849fa..19e132f 100644 --- a/base/strings/string_piece.cc +++ b/base/strings/string_piece.cc
@@ -219,8 +219,11 @@ size_t find_first_of(const StringPiece16& self, const StringPiece16& s, size_t pos) { + // Use the faster std::find() if searching for a single character. StringPiece16::const_iterator found = - std::find_first_of(self.begin() + pos, self.end(), s.begin(), s.end()); + s.size() == 1 ? std::find(self.begin() + pos, self.end(), s[0]) + : std::find_first_of(self.begin() + pos, self.end(), + s.begin(), s.end()); if (found == self.end()) return StringPiece16::npos; return found - self.begin();
diff --git a/base/strings/string_split.cc b/base/strings/string_split.cc index 1456c3d..9a99925 100644 --- a/base/strings/string_split.cc +++ b/base/strings/string_split.cc
@@ -14,27 +14,15 @@ namespace { -// PieceToOutputType converts a StringPiece as needed to a given output type, -// which is either the same type of StringPiece (a NOP) or the corresponding -// non-piece string type. -// -// The default converter is a NOP, it works when the OutputType is the -// correct StringPiece. -template<typename Str, typename OutputType> -OutputType PieceToOutputType(BasicStringPiece<Str> piece) { - return piece; -} -template<> // Convert StringPiece to std::string -std::string PieceToOutputType<std::string, std::string>(StringPiece piece) { - return piece.as_string(); -} -template<> // Convert StringPiece16 to string16. -string16 PieceToOutputType<string16, string16>(StringPiece16 piece) { - return piece.as_string(); -} - // Returns either the ASCII or UTF-16 whitespace. template<typename Str> BasicStringPiece<Str> WhitespaceForType(); +#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING) +template <> +WStringPiece WhitespaceForType<std::wstring>() { + return kWhitespaceWide; +} +#endif + template<> StringPiece16 WhitespaceForType<string16>() { return kWhitespaceUTF16; } @@ -42,37 +30,12 @@ return kWhitespaceASCII; } -// Optimize the single-character case to call find() on the string instead, -// since this is the common case and can be made faster. This could have been -// done with template specialization too, but would have been less clear. -// -// There is no corresponding FindFirstNotOf because StringPiece already -// implements these different versions that do the optimized searching. -size_t FindFirstOf(StringPiece piece, char c, size_t pos) { - return piece.find(c, pos); -} -size_t FindFirstOf(StringPiece16 piece, char16 c, size_t pos) { - return piece.find(c, pos); -} -size_t FindFirstOf(StringPiece piece, StringPiece one_of, size_t pos) { - return piece.find_first_of(one_of, pos); -} -size_t FindFirstOf(StringPiece16 piece, StringPiece16 one_of, size_t pos) { - return piece.find_first_of(one_of, pos); -} - // General string splitter template. Can take 8- or 16-bit input, can produce -// the corresponding string or StringPiece output, and can take single- or -// multiple-character delimiters. -// -// DelimiterType is either a character (Str::value_type) or a string piece of -// multiple characters (BasicStringPiece<Str>). StringPiece has a version of -// find for both of these cases, and the single-character version is the most -// common and can be implemented faster, which is why this is a template. -template<typename Str, typename OutputStringType, typename DelimiterType> +// the corresponding string or StringPiece output. +template <typename OutputStringType, typename Str> static std::vector<OutputStringType> SplitStringT( BasicStringPiece<Str> str, - DelimiterType delimiter, + BasicStringPiece<Str> delimiter, WhitespaceHandling whitespace, SplitResult result_type) { std::vector<OutputStringType> result; @@ -81,7 +44,7 @@ size_t start = 0; while (start != Str::npos) { - size_t end = FindFirstOf(str, delimiter, start); + size_t end = str.find_first_of(delimiter, start); BasicStringPiece<Str> piece; if (end == Str::npos) { @@ -96,7 +59,7 @@ piece = TrimString(piece, WhitespaceForType<Str>(), TRIM_ALL); if (result_type == SPLIT_WANT_ALL || !piece.empty()) - result.push_back(PieceToOutputType<Str, OutputStringType>(piece)); + result.emplace_back(piece); } return result; } @@ -130,16 +93,16 @@ return true; } -template <typename Str, typename OutputStringType> -void SplitStringUsingSubstrT(BasicStringPiece<Str> input, - BasicStringPiece<Str> delimiter, - WhitespaceHandling whitespace, - SplitResult result_type, - std::vector<OutputStringType>* result) { +template <typename OutputStringType, typename Str> +std::vector<OutputStringType> SplitStringUsingSubstrT( + BasicStringPiece<Str> input, + BasicStringPiece<Str> delimiter, + WhitespaceHandling whitespace, + SplitResult result_type) { using Piece = BasicStringPiece<Str>; using size_type = typename Piece::size_type; - result->clear(); + std::vector<OutputStringType> result; for (size_type begin_index = 0, end_index = 0; end_index != Piece::npos; begin_index = end_index + delimiter.size()) { end_index = input.find(delimiter, begin_index); @@ -151,8 +114,10 @@ term = TrimString(term, WhitespaceForType<Str>(), TRIM_ALL); if (result_type == SPLIT_WANT_ALL || !term.empty()) - result->push_back(PieceToOutputType<Str, OutputStringType>(term)); + result.emplace_back(term); } + + return result; } } // namespace @@ -161,48 +126,29 @@ StringPiece separators, WhitespaceHandling whitespace, SplitResult result_type) { - if (separators.size() == 1) { - return SplitStringT<std::string, std::string, char>( - input, separators[0], whitespace, result_type); - } - return SplitStringT<std::string, std::string, StringPiece>( - input, separators, whitespace, result_type); + return SplitStringT<std::string>(input, separators, whitespace, result_type); } std::vector<string16> SplitString(StringPiece16 input, StringPiece16 separators, WhitespaceHandling whitespace, SplitResult result_type) { - if (separators.size() == 1) { - return SplitStringT<string16, string16, char16>( - input, separators[0], whitespace, result_type); - } - return SplitStringT<string16, string16, StringPiece16>( - input, separators, whitespace, result_type); + return SplitStringT<string16>(input, separators, whitespace, result_type); } std::vector<StringPiece> SplitStringPiece(StringPiece input, StringPiece separators, WhitespaceHandling whitespace, SplitResult result_type) { - if (separators.size() == 1) { - return SplitStringT<std::string, StringPiece, char>( - input, separators[0], whitespace, result_type); - } - return SplitStringT<std::string, StringPiece, StringPiece>( - input, separators, whitespace, result_type); + return SplitStringT<StringPiece>(input, separators, whitespace, result_type); } std::vector<StringPiece16> SplitStringPiece(StringPiece16 input, StringPiece16 separators, WhitespaceHandling whitespace, SplitResult result_type) { - if (separators.size() == 1) { - return SplitStringT<string16, StringPiece16, char16>( - input, separators[0], whitespace, result_type); - } - return SplitStringT<string16, StringPiece16, StringPiece16>( - input, separators, whitespace, result_type); + return SplitStringT<StringPiece16>(input, separators, whitespace, + result_type); } bool SplitStringIntoKeyValuePairs(StringPiece input, @@ -240,18 +186,16 @@ StringPiece16 delimiter, WhitespaceHandling whitespace, SplitResult result_type) { - std::vector<string16> result; - SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result); - return result; + return SplitStringUsingSubstrT<string16>(input, delimiter, whitespace, + result_type); } std::vector<std::string> SplitStringUsingSubstr(StringPiece input, StringPiece delimiter, WhitespaceHandling whitespace, SplitResult result_type) { - std::vector<std::string> result; - SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result); - return result; + return SplitStringUsingSubstrT<std::string>(input, delimiter, whitespace, + result_type); } std::vector<StringPiece16> SplitStringPieceUsingSubstr( @@ -260,8 +204,8 @@ WhitespaceHandling whitespace, SplitResult result_type) { std::vector<StringPiece16> result; - SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result); - return result; + return SplitStringUsingSubstrT<StringPiece16>(input, delimiter, whitespace, + result_type); } std::vector<StringPiece> SplitStringPieceUsingSubstr( @@ -269,9 +213,41 @@ StringPiece delimiter, WhitespaceHandling whitespace, SplitResult result_type) { - std::vector<StringPiece> result; - SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result); - return result; + return SplitStringUsingSubstrT<StringPiece>(input, delimiter, whitespace, + result_type); } +#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING) +std::vector<std::wstring> SplitString(WStringPiece input, + WStringPiece separators, + WhitespaceHandling whitespace, + SplitResult result_type) { + return SplitStringT<std::wstring>(input, separators, whitespace, result_type); +} + +std::vector<WStringPiece> SplitStringPiece(WStringPiece input, + WStringPiece separators, + WhitespaceHandling whitespace, + SplitResult result_type) { + return SplitStringT<WStringPiece>(input, separators, whitespace, result_type); +} + +std::vector<std::wstring> SplitStringUsingSubstr(WStringPiece input, + WStringPiece delimiter, + WhitespaceHandling whitespace, + SplitResult result_type) { + return SplitStringUsingSubstrT<std::wstring>(input, delimiter, whitespace, + result_type); +} + +std::vector<WStringPiece> SplitStringPieceUsingSubstr( + WStringPiece input, + WStringPiece delimiter, + WhitespaceHandling whitespace, + SplitResult result_type) { + return SplitStringUsingSubstrT<WStringPiece>(input, delimiter, whitespace, + result_type); +} +#endif + } // namespace base
diff --git a/base/strings/string_split.h b/base/strings/string_split.h index 406dd2a..d3181a7 100644 --- a/base/strings/string_split.h +++ b/base/strings/string_split.h
@@ -12,6 +12,7 @@ #include "base/base_export.h" #include "base/strings/string16.h" #include "base/strings/string_piece.h" +#include "build/build_config.h" namespace base { @@ -132,6 +133,31 @@ WhitespaceHandling whitespace, SplitResult result_type); +#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING) +BASE_EXPORT std::vector<std::wstring> SplitString(WStringPiece input, + WStringPiece separators, + WhitespaceHandling whitespace, + SplitResult result_type); + +BASE_EXPORT std::vector<WStringPiece> SplitStringPiece( + WStringPiece input, + WStringPiece separators, + WhitespaceHandling whitespace, + SplitResult result_type); + +BASE_EXPORT std::vector<std::wstring> SplitStringUsingSubstr( + WStringPiece input, + WStringPiece delimiter, + WhitespaceHandling whitespace, + SplitResult result_type); + +BASE_EXPORT std::vector<WStringPiece> SplitStringPieceUsingSubstr( + WStringPiece input, + WStringPiece delimiter, + WhitespaceHandling whitespace, + SplitResult result_type); +#endif + } // namespace base #endif // BASE_STRINGS_STRING_SPLIT_H_
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc index 4032621a..03ea3972 100644 --- a/base/strings/string_util.cc +++ b/base/strings/string_util.cc
@@ -262,8 +262,8 @@ return ReplaceCharsT(input, remove_chars, StringPiece(), output); } -template<typename Str> -TrimPositions TrimStringT(const Str& input, +template <typename Str> +TrimPositions TrimStringT(BasicStringPiece<Str> input, BasicStringPiece<Str> trim_chars, TrimPositions positions, Str* output) { @@ -271,40 +271,40 @@ // a StringPiece version of input to be able to call find* on it with the // StringPiece version of trim_chars (normally the trim_chars will be a // constant so avoid making a copy). - BasicStringPiece<Str> input_piece(input); const size_t last_char = input.length() - 1; - const size_t first_good_char = (positions & TRIM_LEADING) ? - input_piece.find_first_not_of(trim_chars) : 0; - const size_t last_good_char = (positions & TRIM_TRAILING) ? - input_piece.find_last_not_of(trim_chars) : last_char; + const size_t first_good_char = + (positions & TRIM_LEADING) ? input.find_first_not_of(trim_chars) : 0; + const size_t last_good_char = (positions & TRIM_TRAILING) + ? input.find_last_not_of(trim_chars) + : last_char; // When the string was all trimmed, report that we stripped off characters // from whichever position the caller was interested in. For empty input, we // stripped no characters, but we still need to clear |output|. - if (input.empty() || - (first_good_char == Str::npos) || (last_good_char == Str::npos)) { + if (input.empty() || first_good_char == Str::npos || + last_good_char == Str::npos) { bool input_was_empty = input.empty(); // in case output == &input output->clear(); return input_was_empty ? TRIM_NONE : positions; } // Trim. - *output = - input.substr(first_good_char, last_good_char - first_good_char + 1); + output->assign(input.data() + first_good_char, + last_good_char - first_good_char + 1); // Return where we trimmed from. return static_cast<TrimPositions>( - ((first_good_char == 0) ? TRIM_NONE : TRIM_LEADING) | - ((last_good_char == last_char) ? TRIM_NONE : TRIM_TRAILING)); + (first_good_char == 0 ? TRIM_NONE : TRIM_LEADING) | + (last_good_char == last_char ? TRIM_NONE : TRIM_TRAILING)); } -bool TrimString(const string16& input, +bool TrimString(StringPiece16 input, StringPiece16 trim_chars, string16* output) { return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE; } -bool TrimString(const std::string& input, +bool TrimString(StringPiece input, StringPiece trim_chars, std::string* output) { return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE; @@ -370,7 +370,7 @@ output->clear(); } -TrimPositions TrimWhitespace(const string16& input, +TrimPositions TrimWhitespace(StringPiece16 input, TrimPositions positions, string16* output) { return TrimStringT(input, StringPiece16(kWhitespaceUTF16), positions, output); @@ -381,7 +381,7 @@ return TrimStringPieceT(input, StringPiece16(kWhitespaceUTF16), positions); } -TrimPositions TrimWhitespaceASCII(const std::string& input, +TrimPositions TrimWhitespaceASCII(StringPiece input, TrimPositions positions, std::string* output) { return TrimStringT(input, StringPiece(kWhitespaceASCII), positions, output); @@ -1085,6 +1085,32 @@ return result; } +#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING) + +TrimPositions TrimWhitespace(WStringPiece input, + TrimPositions positions, + std::wstring* output) { + return TrimStringT(input, WStringPiece(kWhitespaceWide), positions, output); +} + +WStringPiece TrimWhitespace(WStringPiece input, TrimPositions positions) { + return TrimStringPieceT(input, WStringPiece(kWhitespaceWide), positions); +} + +bool TrimString(WStringPiece input, + WStringPiece trim_chars, + std::wstring* output) { + return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE; +} + +WStringPiece TrimString(WStringPiece input, + WStringPiece trim_chars, + TrimPositions positions) { + return TrimStringPieceT(input, trim_chars, positions); +} + +#endif + // The following code is compatible with the OpenBSD lcpy interface. See: // http://www.gratisoft.us/todd/papers/strlcpy.html // ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/{wcs,str}lcpy.c
diff --git a/base/strings/string_util.h b/base/strings/string_util.h index bddb038..ec0bee3 100644 --- a/base/strings/string_util.h +++ b/base/strings/string_util.h
@@ -204,10 +204,10 @@ // // It is safe to use the same variable for both |input| and |output| (this is // the normal usage to trim in-place). -BASE_EXPORT bool TrimString(const string16& input, +BASE_EXPORT bool TrimString(StringPiece16 input, StringPiece16 trim_chars, string16* output); -BASE_EXPORT bool TrimString(const std::string& input, +BASE_EXPORT bool TrimString(StringPiece input, StringPiece trim_chars, std::string* output); @@ -296,12 +296,12 @@ // // The std::string versions return where whitespace was found. // NOTE: Safe to use the same variable for both input and output. -BASE_EXPORT TrimPositions TrimWhitespace(const string16& input, +BASE_EXPORT TrimPositions TrimWhitespace(StringPiece16 input, TrimPositions positions, string16* output); BASE_EXPORT StringPiece16 TrimWhitespace(StringPiece16 input, TrimPositions positions); -BASE_EXPORT TrimPositions TrimWhitespaceASCII(const std::string& input, +BASE_EXPORT TrimPositions TrimWhitespaceASCII(StringPiece input, TrimPositions positions, std::string* output); BASE_EXPORT StringPiece TrimWhitespaceASCII(StringPiece input, @@ -532,6 +532,23 @@ const string16& a, size_t* offset); +#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING) +BASE_EXPORT TrimPositions TrimWhitespace(WStringPiece input, + TrimPositions positions, + std::wstring* output); + +BASE_EXPORT WStringPiece TrimWhitespace(WStringPiece input, + TrimPositions positions); + +BASE_EXPORT bool TrimString(WStringPiece input, + WStringPiece trim_chars, + std::wstring* output); + +BASE_EXPORT WStringPiece TrimString(WStringPiece input, + WStringPiece trim_chars, + TrimPositions positions); +#endif + } // namespace base #if defined(OS_WIN)
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn index 53ea803..b71bb86 100644 --- a/base/test/BUILD.gn +++ b/base/test/BUILD.gn
@@ -27,8 +27,6 @@ static_library("test_support") { testonly = true sources = [ - "../memory/fake_memory_pressure_monitor.cc", - "../memory/fake_memory_pressure_monitor.h", "../task/sequence_manager/test/fake_task.cc", "../task/sequence_manager/test/fake_task.h", "../task/sequence_manager/test/mock_time_domain.cc",
diff --git a/base/util/memory_pressure/BUILD.gn b/base/util/memory_pressure/BUILD.gn index 6065c9a..16bb4784b 100644 --- a/base/util/memory_pressure/BUILD.gn +++ b/base/util/memory_pressure/BUILD.gn
@@ -41,3 +41,16 @@ "//testing/gtest", ] } + +static_library("test_support") { + testonly = true + sources = [ + "fake_memory_pressure_monitor.cc", + "fake_memory_pressure_monitor.h", + ] + + public_deps = [ + ":memory_pressure", + "//base", + ] +}
diff --git a/base/memory/fake_memory_pressure_monitor.cc b/base/util/memory_pressure/fake_memory_pressure_monitor.cc similarity index 85% rename from base/memory/fake_memory_pressure_monitor.cc rename to base/util/memory_pressure/fake_memory_pressure_monitor.cc index 59fd3ef6..b9273c5 100644 --- a/base/memory/fake_memory_pressure_monitor.cc +++ b/base/util/memory_pressure/fake_memory_pressure_monitor.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 "base/memory/fake_memory_pressure_monitor.h" +#include "base/util/memory_pressure/fake_memory_pressure_monitor.h" -namespace base { +namespace util { namespace test { FakeMemoryPressureMonitor::FakeMemoryPressureMonitor() - : MemoryPressureMonitor(), + : MultiSourceMemoryPressureMonitor(), memory_pressure_level_(MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_NONE) {} FakeMemoryPressureMonitor::~FakeMemoryPressureMonitor() {} @@ -30,4 +30,4 @@ } } // namespace test -} // namespace base +} // namespace util
diff --git a/base/util/memory_pressure/fake_memory_pressure_monitor.h b/base/util/memory_pressure/fake_memory_pressure_monitor.h new file mode 100644 index 0000000..e972d08c --- /dev/null +++ b/base/util/memory_pressure/fake_memory_pressure_monitor.h
@@ -0,0 +1,40 @@ +// Copyright 2018 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 BASE_UTIL_MEMORY_PRESSURE_FAKE_MEMORY_PRESSURE_MONITOR_H_ +#define BASE_UTIL_MEMORY_PRESSURE_FAKE_MEMORY_PRESSURE_MONITOR_H_ + +#include "base/macros.h" +#include "base/util/memory_pressure/multi_source_memory_pressure_monitor.h" + +namespace util { +namespace test { + +class FakeMemoryPressureMonitor + : public ::util::MultiSourceMemoryPressureMonitor { + public: + using MemoryPressureLevel = + ::util::MultiSourceMemoryPressureMonitor::MemoryPressureLevel; + using DispatchCallback = + ::util::MultiSourceMemoryPressureMonitor::DispatchCallback; + + FakeMemoryPressureMonitor(); + ~FakeMemoryPressureMonitor() override; + + void SetAndNotifyMemoryPressure(MemoryPressureLevel level); + + // base::MemoryPressureMonitor overrides: + MemoryPressureLevel GetCurrentPressureLevel() const override; + void SetDispatchCallback(const DispatchCallback& callback) override; + + private: + MemoryPressureLevel memory_pressure_level_; + + DISALLOW_COPY_AND_ASSIGN(FakeMemoryPressureMonitor); +}; + +} // namespace test +} // namespace util + +#endif // BASE_UTIL_MEMORY_PRESSURE_FAKE_MEMORY_PRESSURE_MONITOR_H_
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py index a30dcf3..5182691 100755 --- a/build/android/gyp/dex.py +++ b/build/android/gyp/dex.py
@@ -402,7 +402,8 @@ output_paths=output_paths, input_paths=input_paths, input_strings=dex_cmd + [bool(options.incremental_dir)], - pass_changes=True) + pass_changes=True, + track_subpaths_whitelist=options.class_inputs) if __name__ == '__main__':
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py index 18a92dd..7d00afd 100644 --- a/build/android/gyp/util/build_utils.py +++ b/build/android/gyp/util/build_utils.py
@@ -642,6 +642,7 @@ output_paths=None, force=False, pass_changes=False, + track_subpaths_whitelist=None, depfile_deps=None): """Wraps md5_check.CallAndRecordIfStale() and writes a depfile if applicable. @@ -669,7 +670,8 @@ input_strings=input_strings, output_paths=output_paths, force=force, - pass_changes=pass_changes) + pass_changes=pass_changes, + track_subpaths_whitelist=track_subpaths_whitelist) # Write depfile even when inputs have not changed to ensure build correctness # on bots that build with & without patch, and the patch changes the depfile
diff --git a/build/android/gyp/util/md5_check.py b/build/android/gyp/util/md5_check.py index cd03e0e0..0ad6f1b 100644 --- a/build/android/gyp/util/md5_check.py +++ b/build/android/gyp/util/md5_check.py
@@ -20,9 +20,14 @@ _FORCE_REBUILD = int(os.environ.get('FORCE_REBUILD', 0)) -def CallAndRecordIfStale( - function, record_path=None, input_paths=None, input_strings=None, - output_paths=None, force=False, pass_changes=False): +def CallAndRecordIfStale(function, + record_path=None, + input_paths=None, + input_strings=None, + output_paths=None, + force=False, + pass_changes=False, + track_subpaths_whitelist=None): """Calls function if outputs are stale. Outputs are considered stale if: @@ -43,6 +48,8 @@ force: Whether to treat outputs as missing regardless of whether they actually are. pass_changes: Whether to pass a Changes instance to |function|. + track_subpaths_whitelist: Relevant only when pass_changes=True. List of .zip + files from |input_paths| to make subpath information available for. """ assert record_path or output_paths input_paths = input_paths or [] @@ -57,10 +64,11 @@ new_metadata = _Metadata(track_entries=pass_changes or PRINT_EXPLANATIONS) new_metadata.AddStrings(input_strings) + zip_whitelist = set(track_subpaths_whitelist or []) for path in input_paths: # It's faster to md5 an entire zip file than it is to just locate & hash # its central directory (which is what this used to do). - if pass_changes and _IsZipFile(path): + if path in zip_whitelist: entries = _ExtractZipEntries(path) new_metadata.AddZipFile(path, entries) else: @@ -391,14 +399,6 @@ return md5.hexdigest() -def _IsZipFile(path): - """Returns whether to treat the given file as a zip file.""" - # ijar doesn't set the CRC32 field. - if path.endswith('.interface.jar'): - return False - return path[-4:] in ('.zip', '.apk', '.jar') or path.endswith('.srcjar') - - def _ExtractZipEntries(path): """Returns a list of (path, CRC32) of all files within |path|.""" entries = []
diff --git a/build/android/gyp/util/md5_check_test.py b/build/android/gyp/util/md5_check_test.py index 872c30c..cba7a6a 100755 --- a/build/android/gyp/util/md5_check_test.py +++ b/build/android/gyp/util/md5_check_test.py
@@ -36,12 +36,18 @@ # Test out empty zip file to start. _WriteZipFile(input_file2.name, []) input_files = [input_file1.name, input_file2.name] + zip_paths = [input_file2.name] record_path = tempfile.NamedTemporaryFile(suffix='.stamp') - def CheckCallAndRecord(should_call, message, force=False, - outputs_specified=False, outputs_missing=False, - expected_changes=None, added_or_modified_only=None): + def CheckCallAndRecord(should_call, + message, + force=False, + outputs_specified=False, + outputs_missing=False, + expected_changes=None, + added_or_modified_only=None, + track_subentries=False): output_paths = None if outputs_specified: output_file1 = tempfile.NamedTemporaryFile() @@ -66,7 +72,8 @@ input_strings=input_strings, output_paths=output_paths, force=force, - pass_changes=(expected_changes or added_or_modified_only) is not None) + pass_changes=(expected_changes or added_or_modified_only) is not None, + track_subpaths_whitelist=zip_paths if track_subentries else None) self.assertEqual(should_call, self.called, message) if expected_changes: description = self.changes.DescribeDifference() @@ -80,7 +87,6 @@ CheckCallAndRecord(True, 'should call when record doesn\'t exist', expected_changes='Previous stamp file not found.', added_or_modified_only=False) - CheckCallAndRecord(True, 'pass_changes changed') CheckCallAndRecord(False, 'should not call when nothing changed') input_files = input_files[::-1] CheckCallAndRecord(False, 'reordering of inputs shouldn\'t trigger call') @@ -130,15 +136,21 @@ added_or_modified_only=False) _WriteZipFile(input_file2.name, [('path/1.txt', '1')]) - CheckCallAndRecord(True, 'added subpath should trigger call', - expected_changes='*Modified: %s*Subpath added: %s' % ( - input_file2.name, 'path/1.txt'), - added_or_modified_only=True) + CheckCallAndRecord( + True, + 'added subpath should trigger call', + expected_changes='*Modified: %s*Subpath added: %s' % (input_file2.name, + 'path/1.txt'), + added_or_modified_only=True, + track_subentries=True) _WriteZipFile(input_file2.name, [('path/1.txt', '2')]) - CheckCallAndRecord(True, 'changed subpath should trigger call', - expected_changes='*Modified: %s*Subpath modified: %s' % ( - input_file2.name, 'path/1.txt'), - added_or_modified_only=True) + CheckCallAndRecord( + True, + 'changed subpath should trigger call', + expected_changes='*Modified: %s*Subpath modified: %s' % + (input_file2.name, 'path/1.txt'), + added_or_modified_only=True, + track_subentries=True) _WriteZipFile(input_file2.name, []) CheckCallAndRecord(True, 'removed subpath should trigger call',
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index e479d21..49f04eaa 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1538,6 +1538,13 @@ # TODO(https://crbug.com/995993): Clean up and enable. "-Wno-implicit-fallthrough", ] + + if (llvm_force_head_revision) { + cflags += [ + # TODO(https://crbug.com/1011810): Re-enable once fix is in. + "-Wno-error=bool-operation", + ] + } } } }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 0fc43629..5663300e 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -8900242650300651232 \ No newline at end of file +8900186046979314384 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index a30bcc9..2eecdfc 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -8900242342079817824 \ No newline at end of file +8900185799248764720 \ No newline at end of file
diff --git a/build/toolchain/cros/BUILD.gn b/build/toolchain/cros/BUILD.gn index 5a9561f..0740fa2 100644 --- a/build/toolchain/cros/BUILD.gn +++ b/build/toolchain/cros/BUILD.gn
@@ -125,7 +125,7 @@ is_clang = cros_host_is_clang current_cpu = host_cpu current_os = "linux" - use_sysroot = false + use_sysroot = use_sysroot } } @@ -168,6 +168,6 @@ } v8_current_cpu = v8_target_cpu current_os = "linux" - use_sysroot = false + use_sysroot = use_sysroot } }
diff --git a/chrome/VERSION b/chrome/VERSION index 429addd..3f169043 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=79 MINOR=0 -BUILD=3936 +BUILD=3937 PATCH=0
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 806ecfe..750d2b4 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -102,6 +102,9 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelToolbarCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetMediator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetContent.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_suggestion_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_suggestion_card_item.xml new file mode 100644 index 0000000..7d46453 --- /dev/null +++ b/chrome/android/features/tab_ui/java/res/layout/tab_suggestion_card_item.xml
@@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2019 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. --> +<org.chromium.chrome.browser.tasks.tab_management.TabGridMessageCardView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/tab_grid_iph_item" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:background="@drawable/popup_bg_tinted"> + <org.chromium.ui.widget.ChromeImageView + android:id="@+id/icon" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:minWidth="8dp" + android:adjustViewBounds="true" + android:importantForAccessibility="no" + android:src="@drawable/ic_omnibox_page"/> + <org.chromium.chrome.browser.snackbar.TemplatePreservingTextView + android:id="@+id/description" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_gravity="start|center_vertical" + android:layout_marginTop="14dp" + android:layout_marginBottom="14dp" + android:layout_weight="4" + android:textAlignment="viewStart" + android:textAppearance="@style/TextAppearance.BlackBodyDefault" /> + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/action_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/TextButton" + android:layout_gravity="center"/> + <org.chromium.ui.widget.ChromeImageView + android:id="@+id/close_button" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + style="@style/BottomToolbarButton" + android:contentDescription="@string/close" + android:tint="@color/default_icon_color" /> +</org.chromium.chrome.browser.tasks.tab_management.TabGridMessageCardView>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java new file mode 100644 index 0000000..4cacd46d --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java
@@ -0,0 +1,86 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +import org.chromium.chrome.browser.snackbar.TemplatePreservingTextView; +import org.chromium.chrome.tab_ui.R; +import org.chromium.ui.widget.ButtonCompat; +import org.chromium.ui.widget.ChromeImageView; + +import java.lang.ref.WeakReference; + +/** + * Represents a secondary card view in Grid Tab Switcher. The view contains an icon, a description, + * an action button for acceptance, and a close button for dismissal. + */ +class TabGridMessageCardView extends LinearLayout { + private static WeakReference<Bitmap> sCloseButtonBitmapWeakRef; + + private ChromeImageView mIcon; + private TemplatePreservingTextView mDescription; + private ButtonCompat mActionButton; + private ChromeImageView mCloseButton; + + public TabGridMessageCardView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mIcon = findViewById(R.id.icon); + mDescription = findViewById(R.id.description); + mActionButton = findViewById(R.id.action_button); + mCloseButton = findViewById(R.id.close_button); + + if (sCloseButtonBitmapWeakRef == null || sCloseButtonBitmapWeakRef.get() == null) { + int closeButtonSize = + (int) getResources().getDimension(R.dimen.tab_grid_close_button_size); + Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.btn_close); + sCloseButtonBitmapWeakRef = new WeakReference<>( + Bitmap.createScaledBitmap(bitmap, closeButtonSize, closeButtonSize, true)); + } + mCloseButton.setImageBitmap(sCloseButtonBitmapWeakRef.get()); + } + + /** + * @see TemplatePreservingTextView#setTemplate(String), setDescriptionText() must be called + * after calling this method for the new template text to take effect. + */ + void setDescriptionTextTemplate(String template) { + mDescription.setTemplate(template); + } + + /** + * @see TemplatePreservingTextView#setText(CharSequence). + */ + void setDescriptionText(CharSequence text) { + mDescription.setText(text); + } + + /** + * Set action text for the action button. + * @param actionText Text to be displayed. + */ + void setAction(String actionText) { + mActionButton.setText(actionText); + } + + /** + * Set icon drawable. + * @param iconDrawable Drawable to be shown. + */ + void setIcon(Drawable iconDrawable) { + mIcon.setImageDrawable(iconDrawable); + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java new file mode 100644 index 0000000..b875633 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java
@@ -0,0 +1,30 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import android.view.ViewGroup; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * ViewBinder for TabGridSecondaryItem. + */ +class TabGridMessageCardViewBinder { + public static void bind(PropertyModel model, ViewGroup view, PropertyKey propertyKey) { + assert view instanceof TabGridMessageCardView; + + TabGridMessageCardView itemView = (TabGridMessageCardView) view; + if (TabGridMessageCardViewProperties.ACTION_TEXT == propertyKey) { + itemView.setAction(model.get(TabGridMessageCardViewProperties.ACTION_TEXT)); + } else if (TabGridMessageCardViewProperties.DESCRIPTION_TEXT == propertyKey) { + itemView.setDescriptionText( + model.get(TabGridMessageCardViewProperties.DESCRIPTION_TEXT)); + } else if (TabGridMessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE == propertyKey) { + itemView.setDescriptionTextTemplate( + model.get(TabGridMessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE)); + } + } +} \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java new file mode 100644 index 0000000..b33dc66 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java
@@ -0,0 +1,23 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * List of properties used by TabGridSecondaryItem. + */ +class TabGridMessageCardViewProperties { + public static final PropertyModel.WritableObjectPropertyKey<String> ACTION_TEXT = + new PropertyModel.WritableObjectPropertyKey<>(); + public static final PropertyModel.WritableObjectPropertyKey<String> DESCRIPTION_TEXT = + new PropertyModel.WritableObjectPropertyKey<>(); + public static final PropertyModel.WritableObjectPropertyKey<String> DESCRIPTION_TEXT_TEMPLATE = + new PropertyModel.WritableObjectPropertyKey<>(); + + public static final PropertyKey[] ALL_KEYS = + new PropertyKey[] {ACTION_TEXT, DESCRIPTION_TEXT, DESCRIPTION_TEXT_TEMPLATE}; +} \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index b5aebf94..d3c839a9 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -11,6 +11,7 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -26,6 +27,10 @@ import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType; import org.chromium.chrome.tab_ui.R; import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.ui.modelutil.MVCListAdapter; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; import org.chromium.ui.widget.ViewLookupCachingFrameLayout; @@ -59,6 +64,7 @@ static final int GRID_LAYOUT_SPAN_COUNT_LANDSCAPE = 3; private final TabListMediator mMediator; private final TabListRecyclerView mRecyclerView; + private final SimpleRecyclerViewAdapter mAdapter; private final @TabListMode int mMode; private final Rect mThumbnailLocationOfCurrentTab = new Rect(); @@ -100,15 +106,15 @@ boolean attachToParent, String componentName) { mMode = mode; TabListModel modelList = new TabListModel(); - SimpleRecyclerViewAdapter adapter = new SimpleRecyclerViewAdapter(modelList); + mAdapter = new SimpleRecyclerViewAdapter(modelList); RecyclerView.RecyclerListener recyclerListener = null; if (mMode == TabListMode.GRID || mMode == TabListMode.CAROUSEL) { - adapter.registerType(UiType.SELECTABLE, () -> { + mAdapter.registerType(UiType.SELECTABLE, () -> { return (ViewGroup) LayoutInflater.from(context).inflate( R.layout.selectable_tab_grid_card_item, parentView, false); }, TabGridViewBinder::bindSelectableTab); - adapter.registerType(UiType.CLOSABLE, () -> { + mAdapter.registerType(UiType.CLOSABLE, () -> { ViewGroup group = (ViewGroup) LayoutInflater.from(context).inflate( R.layout.closable_tab_grid_card_item, parentView, false); if (mMode == TabListMode.CAROUSEL) { @@ -126,7 +132,7 @@ thumbnail.setMinimumHeight(thumbnail.getWidth()); }; } else if (mMode == TabListMode.STRIP) { - adapter.registerType(UiType.STRIP, () -> { + mAdapter.registerType(UiType.STRIP, () -> { return (ViewGroup) LayoutInflater.from(context).inflate( R.layout.tab_strip_item, parentView, false); }, TabStripViewBinder::bind); @@ -153,7 +159,7 @@ context.getResources().getDimensionPixelSize(R.dimen.tab_carousel_height); } - mRecyclerView.setAdapter(adapter); + mRecyclerView.setAdapter(mAdapter); mRecyclerView.setHasFixedSize(true); if (recyclerListener != null) mRecyclerView.setRecyclerListener(recyclerListener); @@ -277,4 +283,15 @@ long getLastDirtyTimeForTesting() { return mRecyclerView.getLastDirtyTimeForTesting(); } + + /** + * Register a new view type for the component. + * @see MVCListAdapter#registerType(int, MVCListAdapter.ViewBuilder, + * PropertyModelChangeProcessor.ViewBinder). + */ + <T extends View> void registerItemType(@UiType int typeId, + MVCListAdapter.ViewBuilder<T> builder, + PropertyModelChangeProcessor.ViewBinder<PropertyModel, T, PropertyKey> binder) { + mAdapter.registerType(typeId, builder, binder); + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java index 81a3e7d..fe95695 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
@@ -23,12 +23,13 @@ */ public class TabProperties { /** IDs for possible types of UI in the tab list. */ - @IntDef({UiType.SELECTABLE, UiType.CLOSABLE, UiType.STRIP}) + @IntDef({UiType.SELECTABLE, UiType.CLOSABLE, UiType.STRIP, UiType.SUGGESTION}) @Retention(RetentionPolicy.SOURCE) public @interface UiType { int SELECTABLE = 0; int CLOSABLE = 1; int STRIP = 2; + int SUGGESTION = 3; } public static final PropertyModel.WritableIntPropertyKey TAB_ID =
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java index 2e70e78..4012109e 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -7,7 +7,9 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView.ViewHolder; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -17,6 +19,7 @@ import org.chromium.base.Callback; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.MenuOrKeyboardActionController; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; @@ -134,6 +137,32 @@ mMediator.setIphProvider(mTabGridIphItemCoordinator.getIphProvider()); } + if (mode == TabListCoordinator.TabListMode.GRID) { + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)) { + mTabListCoordinator.registerItemType(TabProperties.UiType.SUGGESTION, () -> { + return (ViewGroup) LayoutInflater.from(context).inflate( + R.layout.tab_suggestion_card_item, container, false); + }, TabGridMessageCardViewBinder::bind); + } + + assert mTabListCoordinator.getContainerView().getLayoutManager() + instanceof GridLayoutManager; + + // TODO(1004570): Have a flexible approach for span size look up for each UiType. + ((GridLayoutManager) mTabListCoordinator.getContainerView().getLayoutManager()) + .setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + int itemType = mTabListCoordinator.getContainerView() + .getAdapter() + .getItemViewType(position); + + if (itemType == TabProperties.UiType.SUGGESTION) return 2; + return 1; + } + }); + } + mMenuOrKeyboardActionController = menuOrKeyboardActionController; mMenuOrKeyboardActionController.registerMenuOrKeyboardActionHandler( mTabSwitcherMenuActionHandler);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java new file mode 100644 index 0000000..cac53f8f --- /dev/null +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java
@@ -0,0 +1,97 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management; + +import static org.junit.Assert.assertEquals; + +import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.SmallTest; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ui.DummyUiActivityTestCase; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +/** + * Tests for {@link TabGridMessageCardViewBinder}. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +public class TabGridMessageCardViewBinderTest extends DummyUiActivityTestCase { + private static final String ACTION_TEXT = "actionText"; + private static final String DESCRIPTION_TEXT = "descriptionText"; + + private ViewGroup mItemView; + private PropertyModel mItemViewModel; + private PropertyModelChangeProcessor mItemMCP; + + @Override + public void setUpTest() throws Exception { + super.setUpTest(); + + ViewGroup view = new LinearLayout(getActivity()); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + getActivity().setContentView(view); + + mItemView = (ViewGroup) getActivity().getLayoutInflater().inflate( + R.layout.tab_suggestion_card_item, null); + view.addView(mItemView); + }); + + mItemViewModel = + new PropertyModel.Builder(TabGridMessageCardViewProperties.ALL_KEYS) + .with(TabGridMessageCardViewProperties.ACTION_TEXT, ACTION_TEXT) + .with(TabGridMessageCardViewProperties.DESCRIPTION_TEXT, DESCRIPTION_TEXT) + .build(); + + mItemMCP = PropertyModelChangeProcessor.create( + mItemViewModel, mItemView, TabGridMessageCardViewBinder::bind); + } + + private String getDescriptionText() { + return ((TextView) mItemView.findViewById(R.id.description)).getText().toString(); + } + + @Test + @UiThreadTest + @SmallTest + public void testInitialBinding() { + assertEquals(ACTION_TEXT, + ((TextView) mItemView.findViewById(R.id.action_button)).getText().toString()); + assertEquals(DESCRIPTION_TEXT, getDescriptionText()); + } + + @Test + @UiThreadTest + @SmallTest + public void testBindingDescription_WithoutTemplate() { + mItemViewModel.set(TabGridMessageCardViewProperties.DESCRIPTION_TEXT, "test"); + assertEquals("test", getDescriptionText()); + } + + @Test + @UiThreadTest + @SmallTest + public void testBindingDescription_WithTemplate() { + mItemViewModel.set( + TabGridMessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE, "%s template"); + mItemViewModel.set(TabGridMessageCardViewProperties.DESCRIPTION_TEXT, "test"); + assertEquals("test template", getDescriptionText()); + } + + @Override + public void tearDownTest() throws Exception { + mItemMCP.destroy(); + super.tearDownTest(); + } +}
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni index e63a27e..ed30730 100644 --- a/chrome/android/features/tab_ui/tab_management_java_sources.gni +++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -25,6 +25,7 @@ tab_management_test_java_sources = [ "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/AssertsTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java", + "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java", "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java",
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 7415213..0de8387 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -972,6 +972,8 @@ "optimization_guide/optimization_guide_web_contents_observer.h", "optimization_guide/prediction/decision_tree_prediction_model.cc", "optimization_guide/prediction/decision_tree_prediction_model.h", + "optimization_guide/prediction/prediction_manager.cc", + "optimization_guide/prediction/prediction_manager.h", "optimization_guide/prediction/prediction_model.cc", "optimization_guide/prediction/prediction_model.h", "optimization_guide/prediction/prediction_model_fetcher.cc",
diff --git a/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc index f0b98385..c1e0837f 100644 --- a/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc +++ b/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/android/jni_string.h" +#include "base/strings/utf_string_conversions.h" #include "chrome/android/features/autofill_assistant/jni_headers/AssistantCollectUserDataNativeDelegate_jni.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android.h" #include "chrome/browser/autofill/android/personal_data_manager_android.h"
diff --git a/chrome/browser/android/document/document_web_contents_delegate.cc b/chrome/browser/android/document/document_web_contents_delegate.cc index 3b75d30..915de7aa 100644 --- a/chrome/browser/android/document/document_web_contents_delegate.cc +++ b/chrome/browser/android/document/document_web_contents_delegate.cc
@@ -41,21 +41,14 @@ NOTREACHED(); } -bool DocumentWebContentsDelegate::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool DocumentWebContentsDelegate::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { + const GURL& target_url) { NOTREACHED(); - return false; + return true; } static jlong JNI_DocumentWebContentsDelegate_Initialize(
diff --git a/chrome/browser/android/document/document_web_contents_delegate.h b/chrome/browser/android/document/document_web_contents_delegate.h index 2c3e345..e9b3d4ab9 100644 --- a/chrome/browser/android/document/document_web_contents_delegate.h +++ b/chrome/browser/android/document/document_web_contents_delegate.h
@@ -36,19 +36,12 @@ bool user_gesture, bool* was_blocked) override; void CloseContents(content::WebContents* source) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override; + const GURL& target_url) override; }; #endif // CHROME_BROWSER_ANDROID_DOCUMENT_DOCUMENT_WEB_CONTENTS_DELEGATE_H_
diff --git a/chrome/browser/background/background_contents.cc b/chrome/browser/background/background_contents.cc index 76359b0..a4d5fcd8 100644 --- a/chrome/browser/background/background_contents.cc +++ b/chrome/browser/background/background_contents.cc
@@ -32,9 +32,7 @@ BackgroundContents::BackgroundContents( scoped_refptr<SiteInstance> site_instance, content::RenderFrameHost* opener, - int32_t routing_id, - int32_t main_frame_routing_id, - int32_t main_frame_widget_routing_id, + bool is_new_browsing_instance, Delegate* delegate, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) @@ -49,11 +47,12 @@ opener ? opener->GetProcess()->GetID() : MSG_ROUTING_NONE; create_params.opener_render_frame_id = opener ? opener->GetRoutingID() : MSG_ROUTING_NONE; - create_params.routing_id = routing_id; - create_params.main_frame_routing_id = main_frame_routing_id; - create_params.main_frame_widget_routing_id = main_frame_widget_routing_id; - create_params.renderer_initiated_creation = routing_id != MSG_ROUTING_NONE; create_params.is_never_visible = true; + + // This isn't semantically sensible, but it is what the old code implicitly + // did. + create_params.renderer_initiated_creation = !is_new_browsing_instance; + if (session_storage_namespace) { content::SessionStorageNamespaceMap session_storage_namespace_map; session_storage_namespace_map.insert(
diff --git a/chrome/browser/background/background_contents.h b/chrome/browser/background/background_contents.h index 552f9a25..c661e6e 100644 --- a/chrome/browser/background/background_contents.h +++ b/chrome/browser/background/background_contents.h
@@ -62,9 +62,7 @@ BackgroundContents( scoped_refptr<content::SiteInstance> site_instance, content::RenderFrameHost* opener, - int32_t routing_id, - int32_t main_frame_routing_id, - int32_t main_frame_widget_routing_id, + bool is_new_browsing_instance, Delegate* delegate, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace);
diff --git a/chrome/browser/background/background_contents_service.cc b/chrome/browser/background/background_contents_service.cc index eb11a0b..0689f2f 100644 --- a/chrome/browser/background/background_contents_service.cc +++ b/chrome/browser/background/background_contents_service.cc
@@ -578,9 +578,8 @@ DVLOG(1) << "Loading background content url: " << url; BackgroundContents* contents = CreateBackgroundContents( - SiteInstance::CreateForURL(profile_, url), nullptr, MSG_ROUTING_NONE, - MSG_ROUTING_NONE, MSG_ROUTING_NONE, frame_name, application_id, - std::string(), nullptr); + SiteInstance::CreateForURL(profile_, url), nullptr, true, frame_name, + application_id, std::string(), nullptr); contents->CreateRenderViewSoon(url); } @@ -588,16 +587,13 @@ BackgroundContents* BackgroundContentsService::CreateBackgroundContents( scoped_refptr<SiteInstance> site, content::RenderFrameHost* opener, - int32_t routing_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, + bool is_new_browsing_instance, const std::string& frame_name, const std::string& application_id, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) { auto contents = std::make_unique<BackgroundContents>( - std::move(site), opener, routing_id, main_frame_route_id, - main_frame_widget_route_id, this, partition_id, + std::move(site), opener, is_new_browsing_instance, this, partition_id, session_storage_namespace); BackgroundContents* contents_ptr = contents.get(); AddBackgroundContents(std::move(contents), application_id, frame_name);
diff --git a/chrome/browser/background/background_contents_service.h b/chrome/browser/background/background_contents_service.h index bde2fc61..5fcfe86 100644 --- a/chrome/browser/background/background_contents_service.h +++ b/chrome/browser/background/background_contents_service.h
@@ -117,15 +117,13 @@ const std::string& GetParentApplicationId(BackgroundContents* contents) const; // Creates a new BackgroundContents using the passed |site| and - // the |route_id| and begins tracking the object internally so it can be - // shutdown if the parent application is uninstalled. + // begins tracking the object internally so it can be shutdown if the parent + // application is uninstalled. // Observers will receive a OnBackgroundContentsOpened call. BackgroundContents* CreateBackgroundContents( scoped_refptr<content::SiteInstance> site, content::RenderFrameHost* opener, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, + bool is_new_browsing_instance, const std::string& frame_name, const std::string& application_id, const std::string& partition_id,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 625d868..051fa09 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -550,6 +550,8 @@ "arc/input_method_manager/input_connection_impl.h", "arc/instance_throttle/arc_active_window_throttle_observer.cc", "arc/instance_throttle/arc_active_window_throttle_observer.h", + "arc/instance_throttle/arc_app_launch_throttle_observer.cc", + "arc/instance_throttle/arc_app_launch_throttle_observer.h", "arc/instance_throttle/arc_boot_phase_throttle_observer.cc", "arc/instance_throttle/arc_boot_phase_throttle_observer.h", "arc/instance_throttle/arc_instance_throttle.cc", @@ -2462,6 +2464,7 @@ "arc/input_method_manager/test_input_method_manager_bridge.cc", "arc/input_method_manager/test_input_method_manager_bridge.h", "arc/instance_throttle/arc_active_window_throttle_observer_unittest.cc", + "arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc", "arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc", "arc/instance_throttle/arc_instance_throttle_unittest.cc", "arc/intent_helper/arc_external_protocol_dialog_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc new file mode 100644 index 0000000..55713abe --- /dev/null +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc
@@ -0,0 +1,72 @@ +// Copyright 2019 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/arc/instance_throttle/arc_app_launch_throttle_observer.h" + +#include "base/location.h" +#include "base/task/post_task.h" +#include "base/task/task_traits.h" +#include "base/time/time.h" + +namespace arc { + +namespace { + +constexpr base::TimeDelta kAppLaunchTimeout = base::TimeDelta::FromSeconds(20); + +} // namespace + +ArcAppLaunchThrottleObserver::ArcAppLaunchThrottleObserver() + : ThrottleObserver(ThrottleObserver::PriorityLevel::CRITICAL, + "ArcAppLaunchRequested") {} + +ArcAppLaunchThrottleObserver::~ArcAppLaunchThrottleObserver() = default; + +void ArcAppLaunchThrottleObserver::StartObserving( + content::BrowserContext* context, + const ObserverStateChangedCallback& callback) { + ThrottleObserver::StartObserving(context, callback); + auto* app_list_prefs = ArcAppListPrefs::Get(context); + if (app_list_prefs) // for unit testing + app_list_prefs->AddObserver(this); + AddAppLaunchObserver(context, this); +} + +void ArcAppLaunchThrottleObserver::StopObserving() { + RemoveAppLaunchObserver(context(), this); + auto* app_list_prefs = ArcAppListPrefs::Get(context()); + if (app_list_prefs) // for unit testing + app_list_prefs->RemoveObserver(this); + ThrottleObserver::StopObserving(); +} + +void ArcAppLaunchThrottleObserver::OnAppLaunchRequested( + const ArcAppListPrefs::AppInfo& app_info) { + SetActive(true); + current_requests_.insert(app_info.package_name); + base::PostDelayedTask( + FROM_HERE, + base::BindOnce(&ArcAppLaunchThrottleObserver::OnLaunchedOrRequestExpired, + weak_ptr_factory_.GetWeakPtr(), app_info.package_name), + kAppLaunchTimeout); +} + +void ArcAppLaunchThrottleObserver::OnTaskCreated( + int32_t task_id, + const std::string& package_name, + const std::string& activity, + const std::string& intent) { + OnLaunchedOrRequestExpired(package_name); +} + +void ArcAppLaunchThrottleObserver::OnLaunchedOrRequestExpired( + const std::string& name) { + // This request has already expired or there are outstanding requests, + // do not deactivate the observer. + if (!current_requests_.erase(name) || current_requests_.size()) + return; + SetActive(false); +} + +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h new file mode 100644 index 0000000..39cd84b --- /dev/null +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h
@@ -0,0 +1,58 @@ +// Copyright 2019 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_ARC_INSTANCE_THROTTLE_ARC_APP_LAUNCH_THROTTLE_OBSERVER_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_INSTANCE_THROTTLE_ARC_APP_LAUNCH_THROTTLE_OBSERVER_H_ + +#include <set> +#include <string> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/chromeos/throttle_observer.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chrome/browser/ui/app_list/arc/arc_app_utils.h" + +namespace content { +class BrowserContext; +} + +namespace arc { + +// This class observes ARC app launches and sets its state to active while an +// app is being launched. +class ArcAppLaunchThrottleObserver : public chromeos::ThrottleObserver, + public ArcAppListPrefs::Observer, + public AppLaunchObserver { + public: + ArcAppLaunchThrottleObserver(); + ~ArcAppLaunchThrottleObserver() override; + + // chromeos::ThrottleObserver: + void StartObserving(content::BrowserContext* context, + const ObserverStateChangedCallback& callback) override; + void StopObserving() override; + + // AppLaunchObserver: + void OnAppLaunchRequested(const ArcAppListPrefs::AppInfo& app_info) override; + + // ArcAppListPrefs::Observer: + void OnTaskCreated(int32_t task_id, + const std::string& package_name, + const std::string& activity, + const std::string& intent) override; + + private: + void OnLaunchedOrRequestExpired(const std::string& name); + + std::set<std::string> current_requests_; + // Must go last. + base::WeakPtrFactory<ArcAppLaunchThrottleObserver> weak_ptr_factory_{this}; + + DISALLOW_COPY_AND_ASSIGN(ArcAppLaunchThrottleObserver); +}; + +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_INSTANCE_THROTTLE_ARC_APP_LAUNCH_THROTTLE_OBSERVER_H_
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc new file mode 100644 index 0000000..5f4b793d --- /dev/null +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc
@@ -0,0 +1,87 @@ +// Copyright 2019 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/arc/instance_throttle/arc_app_launch_throttle_observer.h" + +#include <memory> +#include <string> + +#include "base/macros.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "content/public/test/browser_task_environment.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace arc { +namespace { + +ArcAppListPrefs::AppInfo CreateAppInfoForPackage( + const std::string package_name) { + return ArcAppListPrefs::AppInfo(package_name, package_name, "", "", "", + base::Time(), base::Time(), true, true, true, + true, true, true, true); +} + +class ArcAppLaunchThrottleObserverTest : public testing::Test { + public: + using testing::Test::Test; + + protected: + ArcAppLaunchThrottleObserver* observer() { return &app_launch_observer_; } + + content::BrowserTaskEnvironment* environment() { return &task_environment_; } + + private: + content::BrowserTaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + ArcAppLaunchThrottleObserver app_launch_observer_; + + DISALLOW_COPY_AND_ASSIGN(ArcAppLaunchThrottleObserverTest); +}; + +TEST_F(ArcAppLaunchThrottleObserverTest, TestConstructDestruct) {} + +TEST_F(ArcAppLaunchThrottleObserverTest, TestOnAppLaunchRequested) { + const ArcAppListPrefs::AppInfo app1 = + CreateAppInfoForPackage("com.android.app1"); + const ArcAppListPrefs::AppInfo app2 = + CreateAppInfoForPackage("com.android.app2"); + const ArcAppListPrefs::AppInfo app3 = + CreateAppInfoForPackage("com.android.app3"); + EXPECT_FALSE(observer()->active()); + + // App1 launch requested, observer is active. + observer()->OnAppLaunchRequested(app1); + EXPECT_TRUE(observer()->active()); + + // App2 launch requested but finishes before App1, observer is still active. + observer()->OnAppLaunchRequested(app2); + observer()->OnTaskCreated(0, app2.package_name, "", ""); + EXPECT_TRUE(observer()->active()); + + // App3 finishes launch but observer is not waiting for app3, so it is still + // active. + observer()->OnTaskCreated(0, app3.package_name, "", ""); + + // App1 finishes launch, observer is inactive. + observer()->OnTaskCreated(0, app1.package_name, "", ""); +} + +// Check that a launch request expires. +TEST_F(ArcAppLaunchThrottleObserverTest, TestLaunchRequestExpires) { + const ArcAppListPrefs::AppInfo app = + CreateAppInfoForPackage("com.android.app"); + EXPECT_FALSE(observer()->active()); + + observer()->OnAppLaunchRequested(app); + EXPECT_TRUE(observer()->active()); + + environment()->FastForwardUntilNoTasksRemain(); + + EXPECT_FALSE(observer()->active()); +} + +} // namespace +} // namespace arc
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc index 1488f96d..0441e5e3 100644 --- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc +++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc
@@ -9,6 +9,7 @@ #include "base/no_destructor.h" #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_active_window_throttle_observer.h" +#include "chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h" #include "chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h" #include "components/arc/arc_browser_context_keyed_service_factory_base.h" #include "components/arc/arc_util.h" @@ -78,6 +79,7 @@ delegate_(std::make_unique<DefaultDelegateImpl>()) { AddObserver(std::make_unique<ArcActiveWindowThrottleObserver>()); AddObserver(std::make_unique<ArcBootPhaseThrottleObserver>()); + AddObserver(std::make_unique<ArcAppLaunchThrottleObserver>()); StartObservers(); }
diff --git a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc index d735d040..d159d77 100644 --- a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc +++ b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc
@@ -99,12 +99,11 @@ } void AnsibleManagementService::OnInstallLinuxPackageProgress( - const std::string& vm_name, - const std::string& container_name, + const ContainerId& container_id, InstallLinuxPackageProgressStatus status, int progress_percent) { - DCHECK_EQ(vm_name, kCrostiniDefaultVmName); - DCHECK_EQ(container_name, kCrostiniDefaultContainerName); + DCHECK_EQ(container_id.first, kCrostiniDefaultVmName); + DCHECK_EQ(container_id.second, kCrostiniDefaultContainerName); switch (status) { case InstallLinuxPackageProgressStatus::SUCCEEDED: @@ -129,8 +128,7 @@ } void AnsibleManagementService::OnUninstallPackageProgress( - const std::string& vm_name, - const std::string& container_name, + const ContainerId& container_id, UninstallPackageProgressStatus status, int progress_percent) { NOTIMPLEMENTED();
diff --git a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h index 8077e7d..6d32c6b5 100644 --- a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h +++ b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h
@@ -48,12 +48,10 @@ base::OnceCallback<void(bool success)> callback); // LinuxPackageOperationProgressObserver: - void OnInstallLinuxPackageProgress(const std::string& vm_name, - const std::string& container_name, + void OnInstallLinuxPackageProgress(const ContainerId& container_id, InstallLinuxPackageProgressStatus status, int progress_percent) override; - void OnUninstallPackageProgress(const std::string& vm_name, - const std::string& container_name, + void OnUninstallPackageProgress(const ContainerId& container_id, UninstallPackageProgressStatus status, int progress_percent) override;
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc index 586e750..f371d3e 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -2069,9 +2069,9 @@ NOTREACHED(); } + ContainerId container_id(signal.vm_name(), signal.container_name()); for (auto& observer : linux_package_operation_progress_observers_) { - observer.OnInstallLinuxPackageProgress(signal.vm_name(), - signal.container_name(), status, + observer.OnInstallLinuxPackageProgress(container_id, status, signal.progress_percent()); } } @@ -2103,9 +2103,9 @@ NOTREACHED(); } + ContainerId container_id(signal.vm_name(), signal.container_name()); for (auto& observer : linux_package_operation_progress_observers_) { - observer.OnUninstallPackageProgress(signal.vm_name(), - signal.container_name(), status, + observer.OnUninstallPackageProgress(container_id, status, signal.progress_percent()); } }
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h index ad5381a..e0d7448 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.h +++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -39,15 +39,13 @@ // |progress_percent| field is given as a percentage of the given step, // DOWNLOADING or INSTALLING. virtual void OnInstallLinuxPackageProgress( - const std::string& vm_name, - const std::string& container_name, + const ContainerId& container_id, InstallLinuxPackageProgressStatus status, int progress_percent) = 0; // A successfully started package uninstall will continually fire progress // events until it returns a status of SUCCEEDED or FAILED. - virtual void OnUninstallPackageProgress(const std::string& vm_name, - const std::string& container_name, + virtual void OnUninstallPackageProgress(const ContainerId& container_id, UninstallPackageProgressStatus status, int progress_percent) = 0; };
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.cc b/chrome/browser/chromeos/crostini/crostini_package_service.cc index 1a7173aa..b7eb5b4f 100644 --- a/chrome/browser/chromeos/crostini/crostini_package_service.cc +++ b/chrome/browser/chromeos/crostini/crostini_package_service.cc
@@ -249,8 +249,7 @@ } void CrostiniPackageService::OnInstallLinuxPackageProgress( - const std::string& vm_name, - const std::string& container_name, + const ContainerId& container_id, InstallLinuxPackageProgressStatus status, int progress_percent) { // Linux package install has two phases, downloading and installing, which we @@ -260,19 +259,16 @@ if (status == InstallLinuxPackageProgressStatus::INSTALLING) display_progress += 50; // Second phase - UpdatePackageOperationStatus(ContainerId(vm_name, container_name), - InstallStatusToOperationStatus(status), - display_progress); + UpdatePackageOperationStatus( + container_id, InstallStatusToOperationStatus(status), display_progress); } void CrostiniPackageService::OnUninstallPackageProgress( - const std::string& vm_name, - const std::string& container_name, + const ContainerId& container_id, UninstallPackageProgressStatus status, int progress_percent) { - UpdatePackageOperationStatus(ContainerId(vm_name, container_name), - UninstallStatusToOperationStatus(status), - progress_percent); + UpdatePackageOperationStatus( + container_id, UninstallStatusToOperationStatus(status), progress_percent); } void CrostiniPackageService::OnVmShutdown(const std::string& vm_name) {
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.h b/chrome/browser/chromeos/crostini/crostini_package_service.h index ef76b98..e3f6f6c7 100644 --- a/chrome/browser/chromeos/crostini/crostini_package_service.h +++ b/chrome/browser/chromeos/crostini/crostini_package_service.h
@@ -58,13 +58,11 @@ CrostiniManager::GetLinuxPackageInfoCallback callback); // LinuxPackageOperationProgressObserver: - void OnInstallLinuxPackageProgress(const std::string& vm_name, - const std::string& container_name, + void OnInstallLinuxPackageProgress(const ContainerId& container_id, InstallLinuxPackageProgressStatus status, int progress_percent) override; - void OnUninstallPackageProgress(const std::string& vm_name, - const std::string& container_name, + void OnUninstallPackageProgress(const ContainerId& container_id, UninstallPackageProgressStatus status, int progress_percent) override;
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc index 9ddae222..cbb5247 100644 --- a/chrome/browser/chromeos/crostini/crostini_util.cc +++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -470,6 +470,9 @@ std::string DefaultContainerUserNameForProfile(Profile* profile) { // Get rid of the @domain.name in the profile user name (an email address). std::string container_username = profile->GetProfileUserName(); + if (container_username.empty()) { + return kCrostiniDefaultUsername; + } if (container_username.find('@') != std::string::npos) { // gaia::CanonicalizeEmail CHECKs its argument contains'@'. container_username = gaia::CanonicalizeEmail(container_username);
diff --git a/chrome/browser/chromeos/crostini/crostini_util.h b/chrome/browser/chromeos/crostini/crostini_util.h index 872521c2..a3844dd5 100644 --- a/chrome/browser/chromeos/crostini/crostini_util.h +++ b/chrome/browser/chromeos/crostini/crostini_util.h
@@ -164,6 +164,7 @@ constexpr char kCrostiniDefaultVmName[] = "termina"; constexpr char kCrostiniDefaultContainerName[] = "penguin"; +constexpr char kCrostiniDefaultUsername[] = "emperor"; constexpr char kCrostiniCroshBuiltinAppId[] = "nkoccljplnhpfnfiajclkommnmllphnl"; // In order to be compatible with sync folder id must match standard.
diff --git a/chrome/browser/chromeos/first_run/drive_first_run_controller.cc b/chrome/browser/chromeos/first_run/drive_first_run_controller.cc index 5162378..cb30bba 100644 --- a/chrome/browser/chromeos/first_run/drive_first_run_controller.cc +++ b/chrome/browser/chromeos/first_run/drive_first_run_controller.cc
@@ -120,14 +120,16 @@ const base::string16& error_description) override; // content::WebContentsDelegate overrides: - bool ShouldCreateWebContents( - content::WebContents* web_contents, + bool IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) override; + content::WebContents* CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, @@ -230,54 +232,54 @@ } } -bool DriveWebContentsManager::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool DriveWebContentsManager::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { + const GURL& target_url) { if (window_container_type == content::mojom::WindowContainerType::NORMAL) - return true; + return false; // Check that the target URL is for the Drive app. const extensions::Extension* extension = extensions::ExtensionRegistry::Get(profile_) ->enabled_extensions().GetAppByURL(target_url); - if (!extension || extension->id() != app_id_) - return true; + return extension && extension->id() == app_id_; +} + +content::WebContents* DriveWebContentsManager::CreateCustomWebContents( + content::RenderFrameHost* opener, + content::SiteInstance* source_site_instance, + bool is_new_browsing_instance, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url, + const std::string& partition_id, + content::SessionStorageNamespace* session_storage_namespace) { // The background contents creation is normally done in Browser, but // because we're using a detached WebContents, we need to do it ourselves. BackgroundContentsService* background_contents_service = BackgroundContentsServiceFactory::GetForProfile(profile_); - // Prevent redirection if background contents already exists. - if (background_contents_service->GetAppBackgroundContents(app_id_)) { - return false; + // Only redirect if background contents does not yet exists. + if (!background_contents_service->GetAppBackgroundContents(app_id_)) { + // drive_first_run/app/manifest.json sets allow_js_access to false and + // therefore we are creating a new SiteInstance (and thus a new renderer + // process) here, so we must use MSG_ROUTING_NONE and we cannot pass the + // opener (similarly to how allow_js_access:false is handled in + // Browser::MaybeCreateBackgroundContents). + BackgroundContents* contents = + background_contents_service->CreateBackgroundContents( + content::SiteInstance::Create(profile_), nullptr, true, frame_name, + app_id_, partition_id, session_storage_namespace); + contents->web_contents()->GetController().LoadURL( + target_url, content::Referrer(), ui::PAGE_TRANSITION_LINK, + std::string()); } - // drive_first_run/app/manifest.json sets allow_js_access to false and - // therefore we are creating a new SiteInstance (and thus a new renderer - // process) here, so we must use MSG_ROUTING_NONE and we cannot pass the - // opener (similarily to how allow_js_access:false is handled in - // Browser::MaybeCreateBackgroundContents). - BackgroundContents* contents = - background_contents_service->CreateBackgroundContents( - content::SiteInstance::Create(profile_), nullptr, MSG_ROUTING_NONE, - MSG_ROUTING_NONE, MSG_ROUTING_NONE, frame_name, app_id_, partition_id, - session_storage_namespace); - contents->web_contents()->GetController().LoadURL( - target_url, content::Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); - - // Return false as we already created the WebContents here. - return false; + return nullptr; } void DriveWebContentsManager::OnBackgroundContentsOpened(
diff --git a/chrome/browser/chromeos/login/ui/login_web_dialog.cc b/chrome/browser/chromeos/login/ui/login_web_dialog.cc index 406554f9..86bdbd0 100644 --- a/chrome/browser/chromeos/login/ui/login_web_dialog.cc +++ b/chrome/browser/chromeos/login/ui/login_web_dialog.cc
@@ -164,8 +164,8 @@ return (source && !chrome::FindBrowserWithWebContents(source)); } -bool LoginWebDialog::HandleShouldCreateWebContents() { - return false; +bool LoginWebDialog::HandleShouldOverrideWebContentsCreation() { + return true; } std::vector<ui::Accelerator> LoginWebDialog::GetAccelerators() {
diff --git a/chrome/browser/chromeos/login/ui/login_web_dialog.h b/chrome/browser/chromeos/login/ui/login_web_dialog.h index 571ba7c..245cb63 100644 --- a/chrome/browser/chromeos/login/ui/login_web_dialog.h +++ b/chrome/browser/chromeos/login/ui/login_web_dialog.h
@@ -81,7 +81,7 @@ bool HandleOpenURLFromTab(content::WebContents* source, const content::OpenURLParams& params, content::WebContents** out_new_contents) override; - bool HandleShouldCreateWebContents() override; + bool HandleShouldOverrideWebContentsCreation() override; std::vector<ui::Accelerator> GetAccelerators() override; bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
diff --git a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc index d0b10f9d..45b8231 100644 --- a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc +++ b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
@@ -10,12 +10,12 @@ #include <string> #include <vector> -#include "base/memory/fake_memory_pressure_monitor.h" #include "base/run_loop.h" #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" #include "base/timer/mock_timer.h" +#include "base/util/memory_pressure/fake_memory_pressure_monitor.h" #include "chrome/browser/chromeos/resource_reporter/resource_reporter.h" #include "chrome/browser/task_manager/test_task_manager.h" #include "content/public/test/browser_task_environment.h" @@ -140,12 +140,12 @@ return ResourceReporter::GetInstance(); } - base::test::FakeMemoryPressureMonitor* monitor() { return &monitor_; } + util::test::FakeMemoryPressureMonitor* monitor() { return &monitor_; } private: content::BrowserTaskEnvironment task_environment_; - base::test::FakeMemoryPressureMonitor monitor_; + util::test::FakeMemoryPressureMonitor monitor_; DummyTaskManager task_manager_;
diff --git a/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc b/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc index 28b64b8..270ffa8 100644 --- a/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc +++ b/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc
@@ -48,15 +48,12 @@ } // namespace NetBiosClient::NetBiosClient(network::mojom::NetworkContext* network_context) - : bind_address_(net::IPAddress::IPv4AllZeros(), 0 /* port */), - listener_binding_(this) { + : bind_address_(net::IPAddress::IPv4AllZeros(), 0 /* port */) { DCHECK(network_context); - network::mojom::UDPSocketListenerPtr rec_int_ptr; - listener_binding_.Bind(mojo::MakeRequest(&rec_int_ptr)); - - network_context->CreateUDPSocket(server_socket_.BindNewPipeAndPassReceiver(), - std::move(rec_int_ptr)); + network_context->CreateUDPSocket( + server_socket_.BindNewPipeAndPassReceiver(), + listener_receiver_.BindNewPipeAndPassRemote()); } NetBiosClient::~NetBiosClient() = default;
diff --git a/chrome/browser/chromeos/smb_client/discovery/netbios_client.h b/chrome/browser/chromeos/smb_client/discovery/netbios_client.h index cfc66f6..314f62c 100644 --- a/chrome/browser/chromeos/smb_client/discovery/netbios_client.h +++ b/chrome/browser/chromeos/smb_client/discovery/netbios_client.h
@@ -11,7 +11,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/chromeos/smb_client/discovery/netbios_client_interface.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/mojom/udp_socket.mojom.h" @@ -108,7 +108,7 @@ NetBiosResponseCallback callback_; std::unique_ptr<FirewallHole> firewall_hole_; mojo::Remote<network::mojom::UDPSocket> server_socket_; - mojo::Binding<network::mojom::UDPSocketListener> listener_binding_; + mojo::Receiver<network::mojom::UDPSocketListener> listener_receiver_{this}; DISALLOW_COPY_AND_ASSIGN(NetBiosClient); };
diff --git a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc index 970f8db..8ed88c0 100644 --- a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc +++ b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
@@ -15,8 +15,6 @@ #include "components/dom_distiller/core/distiller.h" #include "components/dom_distiller/core/dom_distiller_store.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "components/leveldb_proto/public/proto_database.h" -#include "components/leveldb_proto/public/proto_database_provider.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -64,16 +62,7 @@ base::FilePath database_dir( context->GetPath().Append(FILE_PATH_LITERAL("Articles"))); - leveldb_proto::ProtoDatabaseProvider* db_provider = - content::BrowserContext::GetDefaultStoragePartition(profile) - ->GetProtoDatabaseProvider(); - - auto db = db_provider->GetDB<ArticleEntry>( - leveldb_proto::ProtoDbType::DOM_DISTILLER_STORE, database_dir, - background_task_runner); - - std::unique_ptr<DomDistillerStore> dom_distiller_store( - new DomDistillerStore(std::move(db))); + auto dom_distiller_store = std::make_unique<DomDistillerStore>(); std::unique_ptr<DistillerPageFactory> distiller_page_factory( new DistillerPageWebContentsFactory(context));
diff --git a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc index 2e610d7..4e35444 100644 --- a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc +++ b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
@@ -30,13 +30,11 @@ #include "components/dom_distiller/core/dom_distiller_service.h" #include "components/dom_distiller/core/dom_distiller_store.h" #include "components/dom_distiller/core/dom_distiller_switches.h" -#include "components/dom_distiller/core/dom_distiller_test_util.h" #include "components/dom_distiller/core/fake_distiller.h" #include "components/dom_distiller/core/fake_distiller_page.h" #include "components/dom_distiller/core/task_tracker.h" #include "components/dom_distiller/core/url_constants.h" #include "components/dom_distiller/core/url_utils.h" -#include "components/leveldb_proto/testing/fake_db.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/url_data_source.h" @@ -51,12 +49,10 @@ namespace dom_distiller { -using leveldb_proto::test::FakeDB; using test::FakeDistiller; using test::MockDistillerFactory; using test::MockDistillerPage; using test::MockDistillerPageFactory; -using test::util::CreateStoreWithFakeDB; using testing::HasSubstr; using testing::Not; @@ -88,10 +84,6 @@ "window.domAutomationController.send(" "typeof distiller == 'object')"; -void AddEntry(const ArticleEntry& e, FakeDB<ArticleEntry>::EntryMap* map) { - (*map)[e.entry_id()] = e; -} - ArticleEntry CreateEntry(const std::string& entry_id, const std::string& page_url) { ArticleEntry entry; @@ -124,30 +116,22 @@ if (!DistillerJavaScriptWorldIdIsSet()) { SetDistillerJavaScriptWorldId(content::ISOLATED_WORLD_ID_CONTENT_END); } - database_model_ = new FakeDB<ArticleEntry>::EntryMap; } - void TearDownOnMainThread() override { delete database_model_; } - void SetUpCommandLine(base::CommandLine* command_line) override { command_line->AppendSwitch(switches::kEnableDomDistiller); } - static std::unique_ptr<KeyedService> Build(content::BrowserContext* context) { - FakeDB<ArticleEntry>* fake_db = new FakeDB<ArticleEntry>(database_model_); - distiller_factory_ = new MockDistillerFactory(); - MockDistillerPageFactory* distiller_page_factory_ = - new MockDistillerPageFactory(); - std::unique_ptr<DomDistillerContextKeyedService> service( - new DomDistillerContextKeyedService( - std::unique_ptr<DomDistillerStoreInterface>(CreateStoreWithFakeDB( - fake_db, FakeDB<ArticleEntry>::EntryMap())), - std::unique_ptr<DistillerFactory>(distiller_factory_), - std::unique_ptr<DistillerPageFactory>(distiller_page_factory_), - std::unique_ptr<DistilledPagePrefs>(new DistilledPagePrefs( - Profile::FromBrowserContext(context)->GetPrefs())))); - fake_db->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); - fake_db->LoadCallback(true); + std::unique_ptr<KeyedService> Build(content::BrowserContext* context) { + auto distiller_factory = std::make_unique<MockDistillerFactory>(); + distiller_factory_ = distiller_factory.get(); + auto distiller_page_factory = std::make_unique<MockDistillerPageFactory>(); + auto* distiller_page_factory_raw = distiller_page_factory.get(); + auto service = std::make_unique<DomDistillerContextKeyedService>( + std::make_unique<DomDistillerStore>(store_model_), + std::move(distiller_factory), std::move(distiller_page_factory), + std::make_unique<DistilledPagePrefs>( + Profile::FromBrowserContext(context)->GetPrefs())); if (expect_distillation_) { // There will only be destillation of an article if the database contains // the article. @@ -157,7 +141,7 @@ } if (expect_distiller_page_) { MockDistillerPage* distiller_page = new MockDistillerPage(); - EXPECT_CALL(*distiller_page_factory_, CreateDistillerPageImpl()) + EXPECT_CALL(*distiller_page_factory_raw, CreateDistillerPageImpl()) .WillOnce(testing::Return(distiller_page)); } return std::move(service); @@ -167,19 +151,13 @@ const std::string& expected_mime_type); void ViewSingleDistilledPageAndExpectErrorPage(const GURL& url); void PrefTest(bool is_error_page); - // Database entries. - static FakeDB<ArticleEntry>::EntryMap* database_model_; - static bool expect_distillation_; - static bool expect_distiller_page_; - static MockDistillerFactory* distiller_factory_; -}; -FakeDB<ArticleEntry>::EntryMap* - DomDistillerViewerSourceBrowserTest::database_model_; -bool DomDistillerViewerSourceBrowserTest::expect_distillation_ = false; -bool DomDistillerViewerSourceBrowserTest::expect_distiller_page_ = false; -MockDistillerFactory* DomDistillerViewerSourceBrowserTest::distiller_factory_ = - NULL; + // Database entries. + std::vector<ArticleEntry> store_model_; + bool expect_distillation_ = false; + bool expect_distiller_page_ = false; + MockDistillerFactory* distiller_factory_ = nullptr; +}; // The DomDistillerViewerSource renders untrusted content, so ensure no bindings // are enabled when the article exists in the database. @@ -187,7 +165,7 @@ NoWebUIBindingsArticleExists) { // Ensure there is one item in the database, which will trigger distillation. const ArticleEntry entry = CreateEntry("DISTILLED", "http://example.com/1"); - AddEntry(entry, database_model_); + store_model_.push_back(entry); expect_distillation_ = true; expect_distiller_page_ = true; const GURL url = url_utils::GetDistillerViewUrlFromEntryId( @@ -225,8 +203,10 @@ const std::string& expected_mime_type) { // Ensure the correct factory is used for the DomDistillerService. dom_distiller::DomDistillerServiceFactory::GetInstance() - ->SetTestingFactoryAndUse(browser()->profile(), - base::BindRepeating(&Build)); + ->SetTestingFactoryAndUse( + browser()->profile(), + base::BindRepeating(&DomDistillerViewerSourceBrowserTest::Build, + base::Unretained(this))); // Navigate to a URL which the source should respond to. ui_test_utils::NavigateToURL(browser(), url); @@ -321,8 +301,10 @@ IN_PROC_BROWSER_TEST_F(DomDistillerViewerSourceBrowserTest, EarlyTemplateLoad) { dom_distiller::DomDistillerServiceFactory::GetInstance() - ->SetTestingFactoryAndUse(browser()->profile(), - base::BindRepeating(&Build)); + ->SetTestingFactoryAndUse( + browser()->profile(), + base::BindRepeating(&DomDistillerViewerSourceBrowserTest::Build, + base::Unretained(this))); scoped_refptr<content::MessageLoopRunner> distillation_done_runner = new content::MessageLoopRunner; @@ -439,8 +421,10 @@ expect_distillation_ = false; expect_distiller_page_ = true; dom_distiller::DomDistillerServiceFactory::GetInstance() - ->SetTestingFactoryAndUse(browser()->profile(), - base::BindRepeating(&Build)); + ->SetTestingFactoryAndUse( + browser()->profile(), + base::BindRepeating(&DomDistillerViewerSourceBrowserTest::Build, + base::Unretained(this))); scoped_refptr<content::MessageLoopRunner> distillation_done_runner = new content::MessageLoopRunner;
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc index 8277212..b18d3db 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -94,11 +94,6 @@ #include "chrome/browser/ui/browser_finder.h" #endif -#if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/drive/download_handler.h" -#include "chrome/browser/chromeos/drive/file_system_util.h" -#endif - #if BUILDFLAG(ENABLE_EXTENSIONS) #include "chrome/browser/extensions/api/downloads/downloads_api.h" #include "chrome/browser/extensions/crx_installer.h" @@ -161,24 +156,10 @@ // Returns a path in the form that that is expected by platform_util::OpenItem / // platform_util::ShowItemInFolder / DownloadTargetDeterminer. // -// DownloadItems corresponding to Drive downloads use a temporary file as the -// target path. The paths returned by DownloadItem::GetFullPath() / -// GetTargetFilePath() refer to this temporary file. This function looks up the -// corresponding path in Drive for these downloads. -// // How the platform path is determined is based on PlatformDownloadPathType. base::FilePath GetPlatformDownloadPath(Profile* profile, const DownloadItem* download, PlatformDownloadPathType path_type) { -#if defined(OS_CHROMEOS) - // Drive downloads always return the target path for all types. - drive::DownloadHandler* drive_download_handler = - drive::DownloadHandler::GetForProfile(profile); - if (drive_download_handler && - drive_download_handler->IsDriveDownload(download)) - return drive_download_handler->GetTargetPath(download); -#endif - if (path_type == PLATFORM_TARGET_PATH) return download->GetTargetFilePath(); return download->GetFullPath(); @@ -624,15 +605,10 @@ void ChromeDownloadManagerDelegate::GetSaveDir( content::BrowserContext* browser_context, base::FilePath* website_save_dir, - base::FilePath* download_save_dir, - bool* skip_dir_check) { + base::FilePath* download_save_dir) { *website_save_dir = download_prefs_->SaveFilePath(); DCHECK(!website_save_dir->empty()); *download_save_dir = download_prefs_->DownloadPath(); - *skip_dir_check = false; -#if defined(OS_CHROMEOS) - *skip_dir_check = drive::util::IsUnderDriveMountPoint(*website_save_dir); -#endif } void ChromeDownloadManagerDelegate::ChooseSavePath( @@ -775,16 +751,6 @@ void ChromeDownloadManagerDelegate::CheckForFileExistence( DownloadItem* download, content::CheckForFileExistenceCallback callback) { -#if defined(OS_CHROMEOS) - drive::DownloadHandler* drive_download_handler = - drive::DownloadHandler::GetForProfile(profile_); - if (drive_download_handler && - drive_download_handler->IsDriveDownload(download)) { - drive_download_handler->CheckForFileExistence(download, - std::move(callback)); - return; - } -#endif base::PostTaskAndReplyWithResult( disk_access_task_runner_.get(), FROM_HERE, base::BindOnce(&base::PathExists, download->GetTargetFilePath()), @@ -850,12 +816,7 @@ const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!virtual_path.empty()); -#if defined(OS_CHROMEOS) - if (drive::util::IsUnderDriveMountPoint(virtual_path)) { - callback.Run(PathValidationResult::SUCCESS, virtual_path); - return; - } -#endif + base::FilePath document_dir; base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &document_dir); DownloadPathReservationTracker::GetReservedPath( @@ -1095,15 +1056,6 @@ const base::FilePath& virtual_path, const DownloadTargetDeterminerDelegate::LocalPathCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); -#if defined(OS_CHROMEOS) - drive::DownloadHandler* drive_download_handler = - drive::DownloadHandler::GetForProfile(profile_); - if (drive_download_handler) { - drive_download_handler->SubstituteDriveDownloadPath( - virtual_path, download, callback); - return; - } -#endif callback.Run(virtual_path); }
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h index b3fd28d..23eabf48 100644 --- a/chrome/browser/download/chrome_download_manager_delegate.h +++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -101,8 +101,7 @@ content::WebContents* web_contents) override; void GetSaveDir(content::BrowserContext* browser_context, base::FilePath* website_save_dir, - base::FilePath* download_save_dir, - bool* skip_dir_check) override; + base::FilePath* download_save_dir) override; void ChooseSavePath( content::WebContents* web_contents, const base::FilePath& suggested_path,
diff --git a/chrome/browser/download/drag_download_item_aura.cc b/chrome/browser/download/drag_download_item_aura.cc index d88c068..8b26fda 100644 --- a/chrome/browser/download/drag_download_item_aura.cc +++ b/chrome/browser/download/drag_download_item_aura.cc
@@ -25,7 +25,6 @@ #include "url/gurl.h" #if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/drive/download_handler.h" #include "content/public/browser/download_item_utils.h" #endif @@ -48,16 +47,6 @@ *views::Widget::GetTopLevelWidgetForNativeView(view), data.get()); base::FilePath full_path = download->GetTargetFilePath(); -#if defined(OS_CHROMEOS) - // Overwrite |full_path| with drive cache file path when appropriate. - Profile* profile = Profile::FromBrowserContext( - content::DownloadItemUtils::GetBrowserContext(download)); - drive::DownloadHandler* drive_download_handler = - drive::DownloadHandler::GetForProfile(profile); - if (drive_download_handler && - drive_download_handler->IsDriveDownload(download)) - full_path = drive_download_handler->GetCacheFilePath(download); -#endif std::vector<ui::FileInfo> file_infos; file_infos.push_back( ui::FileInfo(full_path, download->GetFileNameToReportUser()));
diff --git a/chrome/browser/download/save_package_file_picker.cc b/chrome/browser/download/save_package_file_picker.cc index 3ece211..7a2612f8 100644 --- a/chrome/browser/download/save_package_file_picker.cc +++ b/chrome/browser/download/save_package_file_picker.cc
@@ -32,11 +32,6 @@ #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" -#if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/drive/download_handler.h" -#include "chrome/browser/chromeos/drive/file_system_util.h" -#endif - using content::RenderProcessHost; using content::SavePageType; using content::WebContents; @@ -51,29 +46,6 @@ ChromeDownloadManagerDelegate::DisableSafeBrowsing(download); } -#if defined(OS_CHROMEOS) -void OnSavePackageDownloadCreatedChromeOS(Profile* profile, - const base::FilePath& drive_path, - download::DownloadItem* download) { - drive::DownloadHandler::GetForProfile(profile)->SetDownloadParams( - drive_path, download); - OnSavePackageDownloadCreated(download); -} - -// Trampoline callback between SubstituteDriveDownloadPath() and |callback|. -void ContinueSettingUpDriveDownload( - const content::SavePackagePathPickedCallback& callback, - content::SavePageType save_type, - Profile* profile, - const base::FilePath& drive_path, - const base::FilePath& drive_tmp_download_path) { - if (drive_tmp_download_path.empty()) // Substitution failed. - return; - callback.Run(drive_tmp_download_path, save_type, base::Bind( - &OnSavePackageDownloadCreatedChromeOS, profile, drive_path)); -} -#endif - // Adds "Webpage, HTML Only" type to FileTypeInfo. void AddHtmlOnlyFileTypeInfo( ui::SelectFileDialog::FileTypeInfo* file_type_info, @@ -291,27 +263,6 @@ download_prefs_->SetSaveFilePath(path_copy.DirName()); -#if defined(OS_CHROMEOS) - if (drive::util::IsUnderDriveMountPoint(path_copy)) { - // Here's a map to the callback chain: - // SubstituteDriveDownloadPath -> - // ContinueSettingUpDriveDownload -> - // callback_ = SavePackage::OnPathPicked -> - // download_created_callback = OnSavePackageDownloadCreatedChromeOS - Profile* profile = Profile::FromBrowserContext( - process->GetBrowserContext()); - drive::DownloadHandler* drive_download_handler = - drive::DownloadHandler::GetForProfile(profile); - drive_download_handler->SubstituteDriveDownloadPath( - path_copy, NULL, base::Bind(&ContinueSettingUpDriveDownload, - callback_, - save_type, - profile, - path_copy)); - return; - } -#endif - callback_.Run(path_copy, save_type, base::Bind(&OnSavePackageDownloadCreated)); }
diff --git a/chrome/browser/extensions/api/socket/udp_socket_unittest.cc b/chrome/browser/extensions/api/socket/udp_socket_unittest.cc index 6a81aa8..e25c6ddb 100644 --- a/chrome/browser/extensions/api/socket/udp_socket_unittest.cc +++ b/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
@@ -19,6 +19,7 @@ #include "chrome/test/base/browser_with_test_window_test.h" #include "content/public/browser/storage_partition.h" #include "extensions/browser/api/socket/udp_socket.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/io_buffer.h" #include "net/base/ip_address.h" @@ -39,13 +40,14 @@ content::BrowserContext::GetDefaultStoragePartition(profile()) ->GetNetworkContext(); mojo::PendingRemote<network::mojom::UDPSocket> socket; - network::mojom::UDPSocketListenerPtr listener_ptr; - network::mojom::UDPSocketListenerRequest listener_request = - mojo::MakeRequest(&listener_ptr); + mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote; + mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver = + listener_remote.InitWithNewPipeAndPassReceiver(); network_context->CreateUDPSocket(socket.InitWithNewPipeAndPassReceiver(), - std::move(listener_ptr)); - return std::make_unique<UDPSocket>( - std::move(socket), std::move(listener_request), "abcdefghijklmnopqrst"); + std::move(listener_remote)); + return std::make_unique<UDPSocket>(std::move(socket), + std::move(listener_receiver), + "abcdefghijklmnopqrst"); } };
diff --git a/chrome/browser/media/offscreen_tab.cc b/chrome/browser/media/offscreen_tab.cc index dd0e28e9..ea8024c 100644 --- a/chrome/browser/media/offscreen_tab.cc +++ b/chrome/browser/media/offscreen_tab.cc
@@ -280,24 +280,16 @@ return false; } -bool OffscreenTab::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool OffscreenTab::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { - DCHECK_EQ(offscreen_tab_web_contents_.get(), web_contents); + const GURL& target_url) { // Disallow creating separate WebContentses. The WebContents implementation // uses this to spawn new windows/tabs, which is also not allowed for // offscreen tabs. - return false; + return true; } bool OffscreenTab::EmbedsFullscreenWidget() {
diff --git a/chrome/browser/media/offscreen_tab.h b/chrome/browser/media/offscreen_tab.h index 77991a3..e3d8a35 100644 --- a/chrome/browser/media/offscreen_tab.h +++ b/chrome/browser/media/offscreen_tab.h
@@ -101,19 +101,12 @@ bool CanDragEnter(content::WebContents* source, const content::DropData& data, blink::WebDragOperationsMask operations_allowed) final; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) final; + const GURL& target_url) final; bool EmbedsFullscreenWidget() final; void EnterFullscreenModeForTab( content::WebContents* contents,
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc index 21f0fac7..2594366 100644 --- a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc +++ b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc
@@ -6,16 +6,15 @@ #include <utility> +#include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/completion_once_callback.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "mojo/public/cpp/bindings/interface_request.h" - namespace media_router { NetworkServiceAsyncPacketSender::NetworkServiceAsyncPacketSender( network::mojom::NetworkContext* network_context) { network_context->CreateUDPSocket(socket_.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); } NetworkServiceAsyncPacketSender::NetworkServiceAsyncPacketSender(
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index fd85cbb..59281c0 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -557,7 +557,7 @@ } base::TimeDelta ChromeMetricsServiceClient::GetStandardUploadInterval() { - return metrics::GetUploadInterval(); + return metrics::GetUploadInterval(metrics::ShouldUseCellularUploadInterval()); } void ChromeMetricsServiceClient::OnPluginLoadingError( @@ -999,7 +999,7 @@ } bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() { - return metrics::IsCellularLogicEnabled(); + return metrics::ShouldUseCellularUploadInterval(); } void ChromeMetricsServiceClient::OnHistoryDeleted() {
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc index b43fa8e..49e35c1 100644 --- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc +++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -102,12 +102,16 @@ case optimization_guide::OptimizationTargetDecision::kPageLoadMatches: return GetOptimizationGuideDecisionFromOptimizationTypeDecision( optimization_type_decision); + case optimization_guide::OptimizationTargetDecision:: + kModelNotAvailableOnClient: + return optimization_guide::OptimizationGuideDecision::kFalse; default: return optimization_guide::OptimizationGuideDecision::kUnknown; } static_assert( optimization_guide::OptimizationTargetDecision::kMaxValue == - optimization_guide::OptimizationTargetDecision::kPageLoadMatches, + optimization_guide::OptimizationTargetDecision:: + kModelNotAvailableOnClient, "This function should be updated when a new OptimizationTargetDecision " "is added"); }
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.cc b/chrome/browser/optimization_guide/prediction/prediction_manager.cc new file mode 100644 index 0000000..57a9690 --- /dev/null +++ b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
@@ -0,0 +1,199 @@ +// Copyright 2019 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/optimization_guide/prediction/prediction_manager.h" + +#include <memory> +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/containers/flat_set.h" +#include "base/metrics/histogram_macros.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/engagement/site_engagement_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h" +#include "chrome/browser/optimization_guide/prediction/prediction_model.h" +#include "chrome/browser/profiles/profile.h" +#include "components/optimization_guide/optimization_guide_decider.h" +#include "components/optimization_guide/optimization_guide_enums.h" +#include "content/public/browser/navigation_handle.h" + +namespace optimization_guide { + +PredictionManager::PredictionManager() : session_fcp_() { + g_browser_process->network_quality_tracker() + ->AddEffectiveConnectionTypeObserver(this); +} + +PredictionManager::~PredictionManager() { + g_browser_process->network_quality_tracker() + ->RemoveEffectiveConnectionTypeObserver(this); +} + +void PredictionManager::UpdateFCPSessionStatistics(base::TimeDelta fcp) { + previous_load_fcp_ms_ = static_cast<float>(fcp.InMilliseconds()); + session_fcp_.AddSample(*previous_load_fcp_ms_); +} + +void PredictionManager::RegisterOptimizationTargets( + const std::vector<proto::OptimizationTarget>& optimization_targets) { + SEQUENCE_CHECKER(sequence_checker_); + + for (const auto& optimization_target : optimization_targets) { + if (optimization_target == proto::OPTIMIZATION_TARGET_UNKNOWN) + continue; + if (registered_optimization_targets_.find(optimization_target) != + registered_optimization_targets_.end()) { + continue; + } + registered_optimization_targets_.insert(optimization_target); + } + // TODO(crbug/1001194): If the HintCacheStore is available/ready, ask it to + // start loading the registered models. +} + +base::Optional<float> PredictionManager::GetValueForClientFeature( + const std::string& model_feature, + content::NavigationHandle* navigation_handle) const { + SEQUENCE_CHECKER(sequence_checker_); + + proto::ClientModelFeature client_model_feature; + if (!proto::ClientModelFeature_Parse(model_feature, &client_model_feature)) + return base::nullopt; + + switch (client_model_feature) { + case proto::CLIENT_MODEL_FEATURE_UNKNOWN: { + return base::nullopt; + } + case proto::CLIENT_MODEL_FEATURE_EFFECTIVE_CONNECTION_TYPE: { + return static_cast<float>(current_effective_connection_type_); + } + case proto::CLIENT_MODEL_FEATURE_PAGE_TRANSITION: { + return static_cast<float>(navigation_handle->GetPageTransition()); + } + case proto::CLIENT_MODEL_FEATURE_SITE_ENGAGEMENT_SCORE: { + Profile* profile = Profile::FromBrowserContext( + navigation_handle->GetWebContents()->GetBrowserContext()); + SiteEngagementService* engagement_service = + SiteEngagementService::Get(profile); + // Precision loss is acceptable/expected for prediction models. + return static_cast<float>( + engagement_service->GetScore(navigation_handle->GetURL())); + } + case proto::CLIENT_MODEL_FEATURE_SAME_ORIGIN_NAVIGATION: { + return static_cast<float>(url::IsSameOriginWith( + navigation_handle->GetURL(), navigation_handle->GetPreviousURL())); + } + case proto::CLIENT_MODEL_FEATURE_FIRST_CONTENTFUL_PAINT_SESSION_MEAN: { + return session_fcp_.GetMean(); + } + case proto:: + CLIENT_MODEL_FEATURE_FIRST_CONTENTFUL_PAINT_SESSION_STANDARD_DEVIATION: { + return session_fcp_.GetStdDev(); + } + case proto:: + CLIENT_MODEL_FEATURE_FIRST_CONTENTFUL_PAINT_PREVIOUS_PAGE_LOAD: { + return previous_load_fcp_ms_.value_or(0.0); + } + default: { + return base::nullopt; + } + } +} + +base::flat_map<std::string, float> PredictionManager::BuildFeatureMap( + content::NavigationHandle* navigation_handle, + const base::flat_set<std::string>& model_features) const { + SEQUENCE_CHECKER(sequence_checker_); + base::flat_map<std::string, float> feature_map; + if (model_features.size() == 0) + return feature_map; + + const base::flat_map<std::string, float>* host_model_features = nullptr; + + std::string host = navigation_handle->GetURL().host(); + auto it = host_model_features_map_.find(host); + if (it != host_model_features_map_.end()) + host_model_features = &(it->second); + + UMA_HISTOGRAM_BOOLEAN( + "OptimizationGuide.PredictionManager.HasHostModelFeaturesForHost", + host_model_features != nullptr); + + // If the feature is not implemented by the client, it is assumed that it is a + // host model feature we have in the map. If it is not in either, a default is + // created for it. This ensures that the prediction model will have values for + // every feature that it requires to be evaluated. + for (const auto& model_feature : model_features) { + base::Optional<float> value = + GetValueForClientFeature(model_feature, navigation_handle); + if (value) { + feature_map[model_feature] = *value; + continue; + } + if (!host_model_features || !host_model_features->contains(model_feature)) { + feature_map[model_feature] = 0.0; + continue; + } + feature_map[model_feature] = + host_model_features->find(model_feature)->second; + } + return feature_map; +} + +OptimizationTargetDecision PredictionManager::ShouldTargetNavigation( + content::NavigationHandle* navigation_handle, + proto::OptimizationTarget optimization_target) const { + SEQUENCE_CHECKER(sequence_checker_); + DCHECK(navigation_handle->GetURL().SchemeIsHTTPOrHTTPS()); + + // TODO(crbug/1001194): Add histogram to record that the optimization target + // was not registered but was requested. + if (!registered_optimization_targets_.contains(optimization_target)) + return OptimizationTargetDecision::kUnknown; + + auto it = optimization_target_prediction_model_map_.find(optimization_target); + if (it == optimization_target_prediction_model_map_.end()) { + // TODO(crbug/1001194): Check the store to see if there is a model + // available. There will also be a check with metrics on if the model was + // available in the but not loaded. + return OptimizationTargetDecision::kModelNotAvailableOnClient; + } + PredictionModel* prediction_model = it->second.get(); + + base::flat_map<std::string, float> feature_map = + BuildFeatureMap(navigation_handle, prediction_model->GetModelFeatures()); + + return prediction_model->Predict(feature_map); +} + +void PredictionManager::OnEffectiveConnectionTypeChanged( + net::EffectiveConnectionType effective_connection_type) { + SEQUENCE_CHECKER(sequence_checker_); + current_effective_connection_type_ = effective_connection_type; +} + +void PredictionManager::SeedPredictionModelForTesting( + proto::OptimizationTarget optimization_target, + std::unique_ptr<PredictionModel> prediction_model) { + registered_optimization_targets_.insert(optimization_target); + optimization_target_prediction_model_map_[optimization_target] = + std::move(prediction_model); +} + +void PredictionManager::SeedHostModelFeaturesMapForTesting( + const std::string& host, + base::flat_map<std::string, float> host_model_features) { + host_model_features_map_[host] = host_model_features; +} + +PredictionModel* PredictionManager::GetPredictionModelForTesting( + proto::OptimizationTarget optimization_target) const { + auto it = optimization_target_prediction_model_map_.find(optimization_target); + if (it != optimization_target_prediction_model_map_.end()) + return it->second.get(); + return nullptr; +} + +} // namespace optimization_guide
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.h b/chrome/browser/optimization_guide/prediction/prediction_manager.h new file mode 100644 index 0000000..d51bb60 --- /dev/null +++ b/chrome/browser/optimization_guide/prediction/prediction_manager.h
@@ -0,0 +1,127 @@ +// Copyright 2019 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_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MANAGER_H_ +#define CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MANAGER_H_ + +#include <memory> +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/containers/flat_set.h" +#include "base/macros.h" +#include "base/sequence_checker.h" +#include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h" +#include "components/optimization_guide/optimization_guide_enums.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "services/network/public/cpp/network_quality_tracker.h" +#include "url/origin.h" + +namespace content { +class NavigationHandle; +} // namespace content + +namespace optimization_guide { + +enum class OptimizationGuideDecision; +class PredictionModel; + +// A PredictionManager supported by the optimization guide that makes an +// OptimizationTargetDecision by evaluating the corresponding prediction model +// for an OptimizationTarget. +class PredictionManager + : public network::NetworkQualityTracker::EffectiveConnectionTypeObserver { + public: + PredictionManager(); + ~PredictionManager() override; + + // Registers the optimization targets that may have ShouldTargetNavigtation + // requested by consumers of the Optimization Guide. + void RegisterOptimizationTargets( + const std::vector<proto::OptimizationTarget>& optimization_targets); + + // Determines if the navigation matches the critieria for + // |optimization_target|. Returns kUnknown if a PredictionModel for the + // optimization target is not registered and kModelNotAvailableOnClient if the + // if model for the optimization target is not currently on the client. + OptimizationTargetDecision ShouldTargetNavigation( + content::NavigationHandle* navigation_handle, + proto::OptimizationTarget optimization_target) const; + + // Updates |session_fcp_| and |previous_fcp_| with |fcp|. + void UpdateFCPSessionStatistics(base::TimeDelta fcp); + + // network::NetworkQualityTracker::EffectiveConnectionTypeObserver + // implementation: + void OnEffectiveConnectionTypeChanged( + net::EffectiveConnectionType type) override; + + protected: + // Adds a prediction model for an optimization target into + // |optimization_target_prediction_model_map_| for testing. + void SeedPredictionModelForTesting( + proto::OptimizationTarget optimization_target, + std::unique_ptr<PredictionModel> prediction_model); + + // Adds host model features for a host into the |host_model_features_map_| + // for testing. + void SeedHostModelFeaturesMapForTesting( + const std::string& host, + base::flat_map<std::string, float> host_model_features); + + // Returns the prediction model for the optimization target used by this + // PredictionManager for testing. + PredictionModel* GetPredictionModelForTesting( + proto::OptimizationTarget optimization_target) const; + + private: + // Constructs and returns a map containing the current feature values for the + // requested set of model features. + base::flat_map<std::string, float> BuildFeatureMap( + content::NavigationHandle* navigation_handle, + const base::flat_set<std::string>& model_features) const; + + // Calculates and returns the current value for the client feature specified + // by |model_feature|. Returns nullopt if the client does not support the + // model feature. + base::Optional<float> GetValueForClientFeature( + const std::string& model_feature, + content::NavigationHandle* navigation_handle) const; + + // A map of optimization target to the prediction model capable of making + // an optimization target decision for it. + base::flat_map<proto::OptimizationTarget, std::unique_ptr<PredictionModel>> + optimization_target_prediction_model_map_; + + // The set of optimization targets that have been registered with the + // prediction manager. + base::flat_set<proto::OptimizationTarget> registered_optimization_targets_; + + // A map of host to host model features known to the prediction manager. + // + // TODO(crbug/1001194): When loading features for the map, the size should be + // restricted. + base::flat_map<std::string, base::flat_map<std::string, float>> + host_model_features_map_; + + // The current session's FCP statistics for HTTP/HTTPS navigations. + OptimizationGuideSessionStatistic session_fcp_; + + // A float representation of the time to FCP of the previous HTTP/HTTPS page + // load. This is nullopt when no previous page load exists (the first page + // load of a session). + base::Optional<float> previous_load_fcp_ms_; + + // The current estimate of the EffectiveConnectionType. + net::EffectiveConnectionType current_effective_connection_type_ = + net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; + + SEQUENCE_CHECKER(sequence_checker_); + + DISALLOW_COPY_AND_ASSIGN(PredictionManager); +}; + +} // namespace optimization_guide + +#endif // CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MANAGER_H_
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc new file mode 100644 index 0000000..2184c60a --- /dev/null +++ b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
@@ -0,0 +1,271 @@ +// Copyright 2019 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/optimization_guide/prediction/prediction_manager.h" + +#include <memory> + +#include "base/test/metrics/histogram_tester.h" +#include "base/time/time.h" +#include "chrome/browser/optimization_guide/prediction/prediction_model.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "content/public/test/mock_navigation_handle.h" +#include "content/public/test/web_contents_tester.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/page_transition_types.h" + +namespace optimization_guide { + +std::unique_ptr<proto::PredictionModel> CreateTestPredictionModel() { + std::unique_ptr<optimization_guide::proto::PredictionModel> prediction_model = + std::make_unique<optimization_guide::proto::PredictionModel>(); + + optimization_guide::proto::ModelInfo* model_info = + prediction_model->mutable_model_info(); + model_info->set_version(1); + model_info->add_supported_model_features( + proto::CLIENT_MODEL_FEATURE_EFFECTIVE_CONNECTION_TYPE); + return prediction_model; +} + +class TestPredictionModel : public PredictionModel { + public: + TestPredictionModel(std::unique_ptr<proto::PredictionModel> prediction_model, + const base::flat_set<std::string>& host_model_features) + : PredictionModel(std::move(prediction_model), host_model_features) {} + ~TestPredictionModel() override = default; + + optimization_guide::OptimizationTargetDecision Predict( + const base::flat_map<std::string, float>& model_features) override { + // Check to make sure the all model_features were provided. + for (const auto& model_feature : GetModelFeatures()) { + if (!model_features.contains(model_feature)) + return OptimizationTargetDecision::kUnknown; + } + model_evaluated_ = true; + return OptimizationTargetDecision::kPageLoadMatches; + } + + bool WasModelEvaluated() { return model_evaluated_; } + + void ResetModelEvaluationState() { model_evaluated_ = false; } + + private: + bool ValidatePredictionModel() const override { return true; } + + bool model_evaluated_ = false; +}; + +class TestPredictionManager : public PredictionManager { + public: + TestPredictionManager() = default; + ~TestPredictionManager() override = default; + + void SetPredictionModel(proto::OptimizationTarget optimization_target, + std::unique_ptr<PredictionModel> prediction_model) { + SeedPredictionModelForTesting(optimization_target, + std::move(prediction_model)); + } + + void SetHostModelFeatures( + const std::string& host, + base::flat_map<std::string, float> host_model_features) { + SeedHostModelFeaturesMapForTesting(host, host_model_features); + } + + PredictionModel* GetPredictionModel( + proto::OptimizationTarget optimization_target) const { + return GetPredictionModelForTesting(optimization_target); + } +}; + +class PredictionManagerTest + : public ChromeRenderViewHostTestHarness, + public testing::WithParamInterface<proto::ClientModelFeature> { + public: + PredictionManagerTest() = default; + ~PredictionManagerTest() override = default; + + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + prediction_manager_ = std::make_unique<TestPredictionManager>(); + } + + TestPredictionManager* prediction_manager() { + return prediction_manager_.get(); + } + + bool IsSameOriginNavigationFeature() { + return GetParam() == proto::CLIENT_MODEL_FEATURE_SAME_ORIGIN_NAVIGATION; + } + + void TearDown() override { ChromeRenderViewHostTestHarness::TearDown(); } + + private: + std::unique_ptr<TestPredictionManager> prediction_manager_; + DISALLOW_COPY_AND_ASSIGN(PredictionManagerTest); +}; + +TEST_F(PredictionManagerTest, OptimizationTargetNotRegisteredForNavigation) { + content::MockNavigationHandle navigation_handle; + navigation_handle.set_url(GURL("https://foo.com")); + + prediction_manager()->RegisterOptimizationTargets( + {proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD}); + EXPECT_EQ(OptimizationTargetDecision::kUnknown, + prediction_manager()->ShouldTargetNavigation( + &navigation_handle, proto::OPTIMIZATION_TARGET_UNKNOWN)); +} + +TEST_F(PredictionManagerTest, + NoPredictionModelForRegisteredOptimizationTarget) { + content::MockNavigationHandle navigation_handle; + navigation_handle.set_url(GURL("https://foo.com")); + + prediction_manager()->RegisterOptimizationTargets( + {proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD}); + EXPECT_EQ( + OptimizationTargetDecision::kModelNotAvailableOnClient, + prediction_manager()->ShouldTargetNavigation( + &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); +} + +TEST_F(PredictionManagerTest, EvaluatePredictionModel) { + content::MockNavigationHandle navigation_handle; + navigation_handle.set_url(GURL("https://foo.com")); + + std::unique_ptr<TestPredictionModel> prediction_model = + std::make_unique<TestPredictionModel>(CreateTestPredictionModel(), + base::flat_set<std::string>()); + prediction_manager()->SetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, + std::move(prediction_model)); + + EXPECT_EQ( + OptimizationTargetDecision::kPageLoadMatches, + prediction_manager()->ShouldTargetNavigation( + &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + TestPredictionModel* test_prediction_model = + static_cast<TestPredictionModel*>( + prediction_manager()->GetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + EXPECT_TRUE(test_prediction_model); + EXPECT_TRUE(test_prediction_model->WasModelEvaluated()); +} + +TEST_F(PredictionManagerTest, HasHostModelFeaturesForHost) { + base::HistogramTester histogram_tester; + content::MockNavigationHandle navigation_handle; + navigation_handle.set_url(GURL("https://foo.com")); + + std::unique_ptr<TestPredictionModel> prediction_model = + std::make_unique<TestPredictionModel>( + CreateTestPredictionModel(), + base::flat_set<std::string>({{"host_feat1"}})); + prediction_manager()->SetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, + std::move(prediction_model)); + + prediction_manager()->SetHostModelFeatures(navigation_handle.GetURL().host(), + {{"host_feat1", 1.0}}); + + EXPECT_EQ( + OptimizationTargetDecision::kPageLoadMatches, + prediction_manager()->ShouldTargetNavigation( + &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + TestPredictionModel* test_prediction_model = + static_cast<TestPredictionModel*>( + prediction_manager()->GetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + EXPECT_TRUE(test_prediction_model); + EXPECT_TRUE(test_prediction_model->WasModelEvaluated()); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PredictionManager." + "HasHostModelFeaturesForHost", + true, 1); +} + +TEST_F(PredictionManagerTest, NoHostModelFeaturesForHost) { + base::HistogramTester histogram_tester; + content::MockNavigationHandle navigation_handle; + navigation_handle.set_url(GURL("https://foo.com")); + + std::unique_ptr<TestPredictionModel> prediction_model = + std::make_unique<TestPredictionModel>( + CreateTestPredictionModel(), + base::flat_set<std::string>({{"host_feat1"}})); + prediction_manager()->SetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, + std::move(prediction_model)); + + prediction_manager()->UpdateFCPSessionStatistics( + base::TimeDelta::FromMilliseconds(1000.0)); + EXPECT_EQ( + OptimizationTargetDecision::kPageLoadMatches, + prediction_manager()->ShouldTargetNavigation( + &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + TestPredictionModel* test_prediction_model = + static_cast<TestPredictionModel*>( + prediction_manager()->GetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + EXPECT_TRUE(test_prediction_model); + EXPECT_TRUE(test_prediction_model->WasModelEvaluated()); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PredictionManager." + "HasHostModelFeaturesForHost", + false, 1); +} + +TEST_P(PredictionManagerTest, ClientFeature) { + base::HistogramTester histogram_tester; + content::MockNavigationHandle navigation_handle(web_contents()); + GURL previous_url = GURL("https://foo.com"); + navigation_handle.set_url(previous_url); + navigation_handle.set_page_transition( + ui::PageTransition::PAGE_TRANSITION_RELOAD); + ON_CALL(navigation_handle, GetPreviousURL()) + .WillByDefault(testing::ReturnRef(previous_url)); + + if (IsSameOriginNavigationFeature()) { + EXPECT_CALL(navigation_handle, GetPreviousURL()).Times(1); + } + + std::unique_ptr<proto::PredictionModel> model = CreateTestPredictionModel(); + model->mutable_model_info()->clear_supported_model_features(); + model->mutable_model_info()->add_supported_model_features(GetParam()); + + std::unique_ptr<TestPredictionModel> prediction_model = + std::make_unique<TestPredictionModel>(std::move(model), + base::flat_set<std::string>({{}})); + + prediction_manager()->SetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, + std::move(prediction_model)); + + EXPECT_EQ( + OptimizationTargetDecision::kPageLoadMatches, + prediction_manager()->ShouldTargetNavigation( + &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + TestPredictionModel* test_prediction_model = + static_cast<TestPredictionModel*>( + prediction_manager()->GetPredictionModel( + proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD)); + + EXPECT_TRUE(test_prediction_model); + EXPECT_TRUE(test_prediction_model->WasModelEvaluated()); +} + +INSTANTIATE_TEST_SUITE_P(ClientFeature, + PredictionManagerTest, + testing::Range(proto::ClientModelFeature_MIN, + proto::ClientModelFeature_MAX)); + +} // namespace optimization_guide
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc index 39a76ab..2418f97 100644 --- a/chrome/browser/permissions/permission_request_manager.cc +++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -375,8 +375,14 @@ if (!view_) return; - if (!is_reshow) + if (!is_reshow) { PermissionUmaUtil::PermissionPromptShown(requests_); + + if (ShouldShowQuietPermissionPrompt()) { + base::RecordAction(base::UserMetricsAction( + "Notifications.Quiet.PermissionRequestShown")); + } + } NotifyBubbleAdded(); // If in testing mode, automatically respond to the bubble that was shown.
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index bf5a1e4..8a90ffb 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc
@@ -112,24 +112,17 @@ std::move(callback).Run(false); } - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - SessionStorageNamespace* session_storage_namespace) override { + const GURL& target_url) override { // Since we don't want to permit child windows that would have a // window.opener property, terminate prerendering. prerender_contents_->Destroy(FINAL_STATUS_CREATE_NEW_WINDOW); // Cancel the popup. - return false; + return true; } bool OnGoToEntryOffset(int offset) override {
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc index ff119f5a..79a7799 100644 --- a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc +++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
@@ -18,6 +18,7 @@ #include "content/public/browser/network_service_instance.h" #include "content/public/browser/storage_partition.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/address_family.h" #include "net/base/ip_address.h" #include "net/base/network_interfaces.h" @@ -65,13 +66,13 @@ void CreateUDPSocketOnUIThread( content::BrowserContext* profile, mojo::PendingReceiver<network::mojom::UDPSocket> receiver, - network::mojom::UDPSocketListenerPtr listener_ptr) { + mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); network::mojom::NetworkContext* network_context = content::BrowserContext::GetDefaultStoragePartition(profile) ->GetNetworkContext(); network_context->CreateUDPSocket(std::move(receiver), - std::move(listener_ptr)); + std::move(listener_remote)); } } // namespace @@ -110,8 +111,7 @@ base::RepeatingClosure on_traffic_detected) : profile_(profile), on_traffic_detected_(on_traffic_detected), - restart_attempts_(kMaxRestartAttempts), - listener_binding_(this) { + restart_attempts_(kMaxRestartAttempts) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); } @@ -150,14 +150,10 @@ void PrivetTrafficDetector::Helper::Bind() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - network::mojom::UDPSocketListenerPtr listener_ptr; - network::mojom::UDPSocketListenerRequest listener_request = - mojo::MakeRequest(&listener_ptr); - listener_binding_.Bind(std::move(listener_request)); base::PostTask(FROM_HERE, {content::BrowserThread::UI}, base::BindOnce(&CreateUDPSocketOnUIThread, profile_, socket_.BindNewPipeAndPassReceiver(), - std::move(listener_ptr))); + listener_receiver_.BindNewPipeAndPassRemote())); network::mojom::UDPSocketOptionsPtr socket_options = network::mojom::UDPSocketOptions::New(); @@ -240,7 +236,7 @@ void PrivetTrafficDetector::Helper::ResetConnection() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); socket_.reset(); - listener_binding_.Close(); + listener_receiver_.reset(); } void PrivetTrafficDetector::Helper::OnReceived(
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.h b/chrome/browser/printing/cloud_print/privet_traffic_detector.h index 56e3f9c..65c613f 100644 --- a/chrome/browser/printing/cloud_print/privet_traffic_detector.h +++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
@@ -9,7 +9,7 @@ #include "base/callback.h" #include "base/macros.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/ip_endpoint.h" #include "net/base/network_interfaces.h" @@ -84,7 +84,7 @@ // Implementation of socket listener callback. // Initialized on the UI thread, but only accessed on the IO thread. - mojo::Binding<network::mojom::UDPSocketListener> listener_binding_; + mojo::Receiver<network::mojom::UDPSocketListener> listener_receiver_{this}; base::WeakPtrFactory<Helper> weak_ptr_factory_{this};
diff --git a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc index c01fcfc..162b40f 100644 --- a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
@@ -6,12 +6,12 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/feature_list.h" -#include "base/memory/fake_memory_pressure_monitor.h" #include "base/memory/memory_pressure_listener.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" +#include "base/util/memory_pressure/fake_memory_pressure_monitor.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/devtools/devtools_window_testing.h" @@ -315,7 +315,7 @@ GetWebContentsAt(index)); } - base::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_; + util::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_; base::SimpleTestTickClock test_clock_; ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing_; base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/chrome/browser/resources/pdf/controller.js b/chrome/browser/resources/pdf/controller.js index 943ec96..ea790f3 100644 --- a/chrome/browser/resources/pdf/controller.js +++ b/chrome/browser/resources/pdf/controller.js
@@ -223,7 +223,7 @@ * @param {!HTMLEmbedElement} plugin * @param {!Viewport} viewport * @param {function():boolean} getIsUserInitiatedCallback - * @param {function():!Promise} getLoadedCallback + * @param {function():?Promise} getLoadedCallback */ constructor(plugin, viewport, getIsUserInitiatedCallback, getLoadedCallback) { super(); @@ -237,7 +237,7 @@ /** @private {!function():boolean} */ this.getIsUserInitiatedCallback_ = getIsUserInitiatedCallback; - /** @private {!function():!Promise} */ + /** @private {!function():?Promise} */ this.getLoadedCallback_ = getLoadedCallback; /** @private {!Map<string, PromiseResolver>} */
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js index 5e53a46e..4c990dd 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.js +++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -152,7 +152,10 @@ this.delayedScriptingMessages_ = []; /** @private {!PromiseResolver} */ - this.loaded_ = new PromiseResolver(); + this.loaded_; + + /** @private {boolean} */ + this.initialLoadComplete_ = false; /** @private {boolean} */ this.isPrintPreview_ = location.origin === 'chrome://print'; @@ -775,11 +778,12 @@ } /** - * @return {!Promise} Resolved when the load state reaches LOADED, rejects on - * FAILED. + * @return {?Promise} Resolved when the load state reaches LOADED, + * rejects on FAILED. Returns null if no promise has been created, which + * is the case for initial load of the PDF. */ get loaded() { - return this.loaded_.promise; + return this.loaded_ ? this.loaded_.promise : null; } /** @return {!Viewport} The viewport. Used for testing. */ @@ -802,17 +806,20 @@ if (this.loadState_ == loadState) { return; } + assert( + loadState == LoadState.LOADING || this.loadState_ == LoadState.LOADING); + this.loadState_ = loadState; + if (!this.initialLoadComplete_) { + this.initialLoadComplete_ = true; + return; + } if (loadState == LoadState.SUCCESS) { - assert(this.loadState_ == LoadState.LOADING); this.loaded_.resolve(); } else if (loadState == LoadState.FAILED) { - assert(this.loadState_ == LoadState.LOADING); this.loaded_.reject(); } else { - assert(loadState == LoadState.LOADING); this.loaded_ = new PromiseResolver(); } - this.loadState_ = loadState; } /**
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index d22da162..8ce24d1 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -13,13 +13,13 @@ #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/macros.h" -#include "base/memory/fake_memory_pressure_monitor.h" #include "base/process/launch.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind_test_util.h" #include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "base/time/time.h" +#include "base/util/memory_pressure/fake_memory_pressure_monitor.h" #include "build/build_config.h" #include "chrome/browser/defaults.h" #include "chrome/browser/first_run/first_run.h" @@ -234,7 +234,7 @@ const BrowserList* active_browser_list_ = nullptr; private: - base::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_; + util::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_; }; // Activates the smart restore behaviour and tracks the loading of tabs.
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc index 45f75c1..b92d70963 100644 --- a/chrome/browser/signin/signin_ui_util.cc +++ b/chrome/browser/signin/signin_ui_util.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback.h" +#include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" @@ -14,11 +15,13 @@ #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" #include "components/signin/public/base/signin_pref_names.h" @@ -233,6 +236,30 @@ #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) +base::string16 GetShortProfileIdentityToDisplay( + const ProfileAttributesEntry& profile_attributes_entry, + Profile* profile) { + DCHECK(profile); + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + CoreAccountInfo core_info = + identity_manager->GetUnconsentedPrimaryAccountInfo(); + // If there's no unconsented primary account, simply return the name of the + // profile according to profile attributes. + if (core_info.IsEmpty()) + return profile_attributes_entry.GetName(); + + base::Optional<AccountInfo> extended_info = + identity_manager + ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId( + core_info.account_id); + // If there's no given name available, return the user email. + if (!extended_info.has_value() || extended_info->given_name.empty()) + return base::UTF8ToUTF16(core_info.email); + + return base::UTF8ToUTF16(extended_info->given_name); +} + std::string GetAllowedDomain(std::string signin_pattern) { std::vector<std::string> splitted_signin_pattern = base::SplitString( signin_pattern, "@", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); @@ -260,4 +287,30 @@ return domain; } +bool ShouldShowIdentityOnOpeningProfile( + const ProfileAttributesStorage& profile_attributes_storage, + Profile* profile) { + DCHECK(profile); + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile); + DCHECK(identity_manager->AreRefreshTokensLoaded()); + // Wait with the potential positive response until refresh tokens are loaded + // so that we never show it twice on startup. + // TODO(crbug.com/1009441): Make it only appear once per profile + // instantiation (currently it appears for every new window which have their + // own instance of AvatarToolbarButton). + if (!base::FeatureList::IsEnabled( + features::kAnimatedAvatarButtonOnOpeningProfile)) { + return false; + } + + // Show the user identity for users with multiple profiles. + if (profile_attributes_storage.GetNumberOfProfiles() > 1) { + return true; + } + + // Show the user identity for users with multiple signed-in accounts. + return identity_manager->GetAccountsWithRefreshTokens().size() > 1; +} + } // namespace signin_ui_util
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h index 993ea52b..156f0b1 100644 --- a/chrome/browser/signin/signin_ui_util.h +++ b/chrome/browser/signin/signin_ui_util.h
@@ -18,6 +18,8 @@ struct AccountInfo; class Browser; class Profile; +class ProfileAttributesEntry; +class ProfileAttributesStorage; // Utility functions to gather status information from the various signed in // services and construct messages suitable for showing in UI. @@ -63,6 +65,15 @@ #endif +// Returns the short user identity to display for |profile|. It is based on the +// current unconsented primary account (if exists). +// TODO(crbug.com/1012179): Move this logic into ProfileAttributesEntry once +// AvatarToolbarButton becomes an observer of ProfileAttributesStorage and thus +// ProfileAttributesEntry is up-to-date when AvatarToolbarButton needs it. +base::string16 GetShortProfileIdentityToDisplay( + const ProfileAttributesEntry& profile_attributes_entry, + Profile* profile); + // Returns the domain of the policy value of RestrictSigninToPattern. Returns // an empty string if the policy is not set or can not be parsed. The parser // only supports the policy value that matches [^@]+@[a-zA-Z0-9\-.]+(\\E)?\$?$. @@ -90,6 +101,13 @@ } // namespace internal #endif +// Returns whether Chrome should show the identity of the user (using a brief +// animation) on opening a profile. IdentityManager's refresh tokens must be +// loaded when this function gets called. +bool ShouldShowIdentityOnOpeningProfile( + const ProfileAttributesStorage& profile_attributes_storage, + Profile* profile); + } // namespace signin_ui_util #endif // CHROME_BROWSER_SIGNIN_SIGNIN_UI_UTIL_H_
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc index ca97561f..8a42342 100644 --- a/chrome/browser/signin/signin_ui_util_unittest.cc +++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -9,11 +9,15 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/user_action_tester.h" #include "build/buildflag.h" +#include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/signin/scoped_account_consistency.h" #include "chrome/browser/signin/signin_promo.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/test/base/browser_with_test_window_test.h" +#include "chrome/test/base/testing_profile_manager.h" +#include "components/account_id/account_id.h" #include "components/google/core/common/google_util.h" #include "components/signin/public/base/signin_buildflags.h" #include "components/signin/public/identity_manager/account_info.h" @@ -52,8 +56,12 @@ #if BUILDFLAG(ENABLE_DICE_SUPPORT) namespace { + const char kMainEmail[] = "main_email@example.com"; const char kMainGaiaID[] = "main_gaia_id"; +const char kSecondaryEmail[] = "secondary_email@example.com"; +const char kSecondaryGaiaID[] = "secondary_gaia_id"; + class SigninUiUtilTestBrowserWindow : public TestBrowserWindow { public: SigninUiUtilTestBrowserWindow() = default; @@ -76,6 +84,7 @@ DISALLOW_COPY_AND_ASSIGN(SigninUiUtilTestBrowserWindow); }; + } // namespace class DiceSigninUiUtilTest : public BrowserWithTestWindowTest { @@ -498,4 +507,59 @@ } #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) +TEST_F(DiceSigninUiUtilTest, + ShouldShowIdentityOnOpeningProfile_ReturnsTrueForMultiProfiles) { + const char kSecondProfile[] = "SecondProfile"; + const base::FilePath profile_path = + profile_manager()->profiles_dir().AppendASCII(kSecondProfile); + profile_manager()->profile_attributes_storage()->AddProfile( + profile_path, base::ASCIIToUTF16(kSecondProfile), std::string(), + base::string16(), false, 0, std::string(), EmptyAccountId()); + + EXPECT_TRUE(ShouldShowIdentityOnOpeningProfile( + *profile_manager()->profile_attributes_storage(), profile())); +} + +TEST_F(DiceSigninUiUtilTest, + ShouldShowIdentityOnOpeningProfile_ReturnsTrueForMultiSignin) { + GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount( + kMainGaiaID, kMainEmail, "refresh_token", false, + signin_metrics::SourceForRefreshTokenOperation::kUnknown); + GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount( + kSecondaryEmail, kSecondaryGaiaID, "refresh_token", false, + signin_metrics::SourceForRefreshTokenOperation::kUnknown); + + EXPECT_TRUE(ShouldShowIdentityOnOpeningProfile( + *profile_manager()->profile_attributes_storage(), profile())); +} + +TEST_F( + DiceSigninUiUtilTest, + ShouldShowIdentityOnOpeningProfile_ReturnsFalseForSingleProfileSingleSignin) { + GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount( + kMainGaiaID, kMainEmail, "refresh_token", false, + signin_metrics::SourceForRefreshTokenOperation::kUnknown); + + EXPECT_FALSE(ShouldShowIdentityOnOpeningProfile( + *profile_manager()->profile_attributes_storage(), profile())); +} + +TEST_F(DiceSigninUiUtilTest, + ShouldShowIdentityOnOpeningProfile_ReturnsFalseForFeatureDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature( + features::kAnimatedAvatarButtonOnOpeningProfile); + + // Do the same setup that makes the previous test return true. + GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount( + kMainGaiaID, kMainEmail, "refresh_token", false, + signin_metrics::SourceForRefreshTokenOperation::kUnknown); + GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount( + kSecondaryEmail, kSecondaryGaiaID, "refresh_token", false, + signin_metrics::SourceForRefreshTokenOperation::kUnknown); + + EXPECT_FALSE(ShouldShowIdentityOnOpeningProfile( + *profile_manager()->profile_attributes_storage(), profile())); +} + } // namespace signin_ui_util
diff --git a/chrome/browser/task_manager/providers/service_worker_task_provider.cc b/chrome/browser/task_manager/providers/service_worker_task_provider.cc index ad8afe5..19ac0c0 100644 --- a/chrome/browser/task_manager/providers/service_worker_task_provider.cc +++ b/chrome/browser/task_manager/providers/service_worker_task_provider.cc
@@ -46,45 +46,47 @@ } } -void ServiceWorkerTaskProvider::OnVersionRunningStatusChanged( +void ServiceWorkerTaskProvider::OnVersionStartedRunning( content::ServiceWorkerContext* context, int64_t version_id, - bool is_running) { + const GURL& scope, + int process_id, + const GURL& script_url) { DCHECK_CURRENTLY_ON(BrowserThread::UI); const ServiceWorkerTaskKey key(context, version_id); -#if DCHECK_IS_ON() - if (is_running) { - DCHECK(!base::Contains(service_worker_task_map_, key) && - !base::Contains(tasks_to_be_created_, key)); - } else { - DCHECK(base::Contains(service_worker_task_map_, key) || - base::Contains(tasks_to_be_created_, key)); + DCHECK(!base::Contains(service_worker_task_map_, key) && + !base::Contains(tasks_to_be_created_, key)); + + tasks_to_be_created_.emplace(key); + + // Create a new task since the service worker is running now. + context->GetServiceWorkerRunningInfo( + version_id, + base::BindOnce( + &ServiceWorkerTaskProvider::OnDidGetServiceWorkerRunningInfo, + weak_ptr_factory_.GetWeakPtr())); +} +void ServiceWorkerTaskProvider::OnVersionStoppedRunning( + content::ServiceWorkerContext* context, + int64_t version_id) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + const ServiceWorkerTaskKey key(context, version_id); + + DCHECK(base::Contains(service_worker_task_map_, key) || + base::Contains(tasks_to_be_created_, key)); + + auto iter = tasks_to_be_created_.find(key); + + // If the task is not created yet, erase it from |tasks_to_be_created_|. + if (iter != tasks_to_be_created_.end()) { + tasks_to_be_created_.erase(iter); + return; } -#endif // DCHECK_IS_ON() - if (is_running) { - tasks_to_be_created_.emplace(key); - - // Create a new task since the service worker is running now. - context->GetServiceWorkerRunningInfo( - version_id, - base::BindOnce( - &ServiceWorkerTaskProvider::OnDidGetServiceWorkerRunningInfo, - weak_ptr_factory_.GetWeakPtr())); - } else { - auto iter = tasks_to_be_created_.find(key); - - // If the task is not created yet, erase it from |tasks_to_be_created_|. - if (iter != tasks_to_be_created_.end()) { - tasks_to_be_created_.erase(iter); - return; - } - - // Since the task has been created and the service worker is not running - // any longer, delete it. - DeleteTask(context, version_id); - } + // Since the task has been created and the service worker is not running + // any longer, delete it. + DeleteTask(context, version_id); } void ServiceWorkerTaskProvider::OnDestruct(
diff --git a/chrome/browser/task_manager/providers/service_worker_task_provider.h b/chrome/browser/task_manager/providers/service_worker_task_provider.h index f9032ad..bf2d3dd5b 100644 --- a/chrome/browser/task_manager/providers/service_worker_task_provider.h +++ b/chrome/browser/task_manager/providers/service_worker_task_provider.h
@@ -44,9 +44,13 @@ const content::NotificationDetails& details) override; // content::ServiceWorkerContextObserver: - void OnVersionRunningStatusChanged(content::ServiceWorkerContext* context, - int64_t version_id, - bool is_running) override; + void OnVersionStartedRunning(content::ServiceWorkerContext* context, + int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) override; + void OnVersionStoppedRunning(content::ServiceWorkerContext* context, + int64_t version_id) override; void OnDestruct(content::ServiceWorkerContext* context) override; private:
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc index bded51ff..996b6f3 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc +++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -4,12 +4,16 @@ #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#include <map> #include <memory> #include <string> +#include <tuple> #include <utility> #include "base/json/json_writer.h" #include "base/metrics/histogram_macros.h" +#include "base/no_destructor.h" +#include "base/observer_list.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" @@ -18,13 +22,13 @@ #include "base/synchronization/waitable_event.h" #include "base/values.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/arc/arc_migration_guide_notification.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h" #include "chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h" #include "chrome/browser/ui/ash/launcher/arc_shelf_spinner_item_controller.h" #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" @@ -38,6 +42,11 @@ #include "components/arc/session/arc_bridge_service.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" +#include "content/public/browser/notification_service.h" +#include "content/public/browser/notification_source.h" #include "ui/aura/window.h" #include "ui/display/display.h" #include "ui/display/screen.h" @@ -100,6 +109,52 @@ ui::EF_FORWARD_MOUSE_BUTTON | ui::EF_FROM_TOUCH)) != 0; } +using AppLaunchObserverMap = + std::map<content::BrowserContext*, base::ObserverList<AppLaunchObserver>>; + +AppLaunchObserverMap* GetAppLaunchObserverMap(); + +content::NotificationObserver* GetNotificationObserver() { + class ProfileDestroyedObserver : public content::NotificationObserver { + public: + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override { + if (type == chrome::NOTIFICATION_PROFILE_DESTROYED) { + GetAppLaunchObserverMap()->erase( + content::Source<Profile>(source).ptr()); + } + } + }; + static base::NoDestructor<ProfileDestroyedObserver> observer; + return observer.get(); +} + +AppLaunchObserverMap* GetAppLaunchObserverMap() { + static base::NoDestructor< + std::map<content::BrowserContext*, base::ObserverList<AppLaunchObserver>>> + instance; + static base::NoDestructor<content::NotificationRegistrar> registrar; + if (!registrar->IsRegistered( + GetNotificationObserver(), chrome::NOTIFICATION_PROFILE_DESTROYED, + content::NotificationService::AllBrowserContextsAndSources())) { + registrar->Add( + GetNotificationObserver(), chrome::NOTIFICATION_PROFILE_DESTROYED, + content::NotificationService::AllBrowserContextsAndSources()); + } + return instance.get(); +} + +void NotifyAppLaunchObservers(content::BrowserContext* context, + const ArcAppListPrefs::AppInfo& app_info) { + AppLaunchObserverMap* const map = GetAppLaunchObserverMap(); + auto it = map->find(context); + if (it != map->end()) { + for (auto& observer : it->second) + observer.OnAppLaunchRequested(app_info); + } +} + bool Launch(content::BrowserContext* context, const std::string& app_id, const base::Optional<std::string>& intent, @@ -144,7 +199,7 @@ // Unthrottle the ARC instance before launching an ARC app. This is done // to minimize lag on an app launch. - SetArcCpuRestriction(false /* do_restrict */); + NotifyAppLaunchObservers(context, *app_info); if (app_info->shortcut || intent.has_value()) { const std::string intent_uri = intent.value_or(app_info->intent_uri); @@ -331,7 +386,7 @@ // default to avoid slowing down Chrome's user session restoration. // However, the restriction should be lifted once the user explicitly // tries to launch an ARC app. - SetArcCpuRestriction(false /* do_restrict */); + NotifyAppLaunchObservers(context, *app_info); } prefs->SetLastLaunchTime(app_id); return true; @@ -655,6 +710,23 @@ return app_info->sticky; } +void AddAppLaunchObserver(content::BrowserContext* context, + AppLaunchObserver* observer) { + AppLaunchObserverMap* const map = GetAppLaunchObserverMap(); + auto result = + map->emplace(std::piecewise_construct, std::forward_as_tuple(context), + std::forward_as_tuple()); + result.first->second.AddObserver(observer); +} + +void RemoveAppLaunchObserver(content::BrowserContext* context, + AppLaunchObserver* observer) { + AppLaunchObserverMap* const map = GetAppLaunchObserverMap(); + auto it = map->find(context); + if (it != map->end()) + it->second.RemoveObserver(observer); +} + Intent::Intent() = default; Intent::~Intent() = default;
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.h b/chrome/browser/ui/app_list/arc/arc_app_utils.h index 90ae13e..88b1662e 100644 --- a/chrome/browser/ui/app_list/arc/arc_app_utils.h +++ b/chrome/browser/ui/app_list/arc/arc_app_utils.h
@@ -11,7 +11,9 @@ #include <vector> #include "base/macros.h" +#include "base/observer_list_types.h" #include "base/optional.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "components/arc/metrics/arc_metrics_constants.h" #include "components/arc/mojom/app.mojom.h" @@ -86,6 +88,13 @@ DISALLOW_COPY_AND_ASSIGN(Intent); }; +// Observes ARC app launches. +class AppLaunchObserver : public base::CheckedObserver { + public: + // Called when an app launch is requested + virtual void OnAppLaunchRequested(const ArcAppListPrefs::AppInfo& app_info) {} +}; + // Checks if a given app should be hidden in launcher. bool ShouldShowInLauncher(const std::string& app_id); @@ -199,6 +208,11 @@ // move to the App Service: (https://crbug.com/948408). bool IsArcAppSticky(const std::string& app_id, Profile* profile); +// Add/remove an observer to be notified of app launches. +void AddAppLaunchObserver(content::BrowserContext* context, + AppLaunchObserver* observer); +void RemoveAppLaunchObserver(content::BrowserContext* context, + AppLaunchObserver* observer); } // namespace arc #endif // CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_UTILS_H_
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc index cd826d9d..4af64d7 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
@@ -59,20 +59,13 @@ return false; } - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override { - return false; + const GURL& target_url) override { + return true; } void SetContentsBounds(content::WebContents* source,
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index a86a546f..3cdada94 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1608,30 +1608,34 @@ std::make_unique<RepostFormWarningController>(source), source); } -bool Browser::ShouldCreateWebContents( - content::WebContents* web_contents, +bool Browser::IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) { + return window_container_type == + content::mojom::WindowContainerType::BACKGROUND && + ShouldCreateBackgroundContents(source_site_instance, opener_url, + frame_name); +} + +WebContents* Browser::CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) { - if ((window_container_type != - content::mojom::WindowContainerType::BACKGROUND) || - !ShouldCreateBackgroundContents(source_site_instance, opener_url, - frame_name)) - return true; - - CreateBackgroundContents(source_site_instance, opener, opener_url, route_id, - main_frame_route_id, main_frame_widget_route_id, - frame_name, target_url, partition_id, - session_storage_namespace); - return false; + BackgroundContents* background_contents = CreateBackgroundContents( + source_site_instance, opener, opener_url, is_new_browsing_instance, + frame_name, target_url, partition_id, session_storage_namespace); + if (background_contents) { + return background_contents->web_contents(); + } + return nullptr; } void Browser::WebContentsCreated(WebContents* source_contents, @@ -2853,9 +2857,7 @@ content::SiteInstance* source_site_instance, content::RenderFrameHost* opener, const GURL& opener_url, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, + bool is_new_browsing_instance, const std::string& frame_name, const GURL& target_url, const std::string& partition_id, @@ -2883,9 +2885,8 @@ // Passed all the checks, so this should be created as a BackgroundContents. if (allow_js_access) { return service->CreateBackgroundContents( - source_site_instance, opener, route_id, main_frame_route_id, - main_frame_widget_route_id, frame_name, extension->id(), partition_id, - session_storage_namespace); + source_site_instance, opener, is_new_browsing_instance, frame_name, + extension->id(), partition_id, session_storage_namespace); } // If script access is not allowed, create the the background contents in a @@ -2894,8 +2895,8 @@ // process. BackgroundContents* contents = service->CreateBackgroundContents( content::SiteInstance::Create(source_site_instance->GetBrowserContext()), - nullptr, MSG_ROUTING_NONE, MSG_ROUTING_NONE, MSG_ROUTING_NONE, frame_name, - extension->id(), partition_id, session_storage_namespace); + nullptr, is_new_browsing_instance, frame_name, extension->id(), + partition_id, session_storage_namespace); // When a separate process is used, the original renderer cannot access the // new window later, thus we need to navigate the window now.
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 3f131a82..9c57ba6e 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -707,14 +707,16 @@ bool* proceed_to_fire_unload) override; bool ShouldFocusLocationBarByDefault(content::WebContents* source) override; void ShowRepostFormWarningDialog(content::WebContents* source) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, + bool IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) override; + content::WebContents* CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, @@ -1002,9 +1004,7 @@ content::SiteInstance* source_site_instance, content::RenderFrameHost* opener, const GURL& opener_url, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, + bool is_new_browsing_instance, const std::string& frame_name, const GURL& target_url, const std::string& partition_id,
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc index ab10db3e1..4639f10 100644 --- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc +++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -29,6 +29,7 @@ #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h" #include "chrome/browser/media/webrtc/system_media_capture_permissions_mac.h" +#include "chrome/browser/permissions/permission_features.h" #include "chrome/browser/permissions/permission_request_manager.h" #include "chrome/browser/permissions/permission_uma_util.h" #include "chrome/browser/permissions/permission_util.h" @@ -1629,6 +1630,16 @@ set_done_button_text(l10n_util::GetStringUTF16( IDS_NOTIFICATIONS_QUIET_PERMISSION_BUBBLE_ALLOW_BUTTON)); set_show_learn_more(false); + + if (QuietNotificationsPromptConfig::UIFlavorToUse() == + QuietNotificationsPromptConfig::UIFlavor::ANIMATED_ICON) { + base::RecordAction( + base::UserMetricsAction("Notifications.Quiet.AnimatedIconClicked")); + } else if (QuietNotificationsPromptConfig::UIFlavorToUse() == + QuietNotificationsPromptConfig::UIFlavor::STATIC_ICON) { + base::RecordAction( + base::UserMetricsAction("Notifications.Quiet.StaticIconClicked")); + } } ContentSettingNotificationsBubbleModel:: @@ -1642,12 +1653,18 @@ void ContentSettingNotificationsBubbleModel::OnManageButtonClicked() { if (delegate()) delegate()->ShowContentSettingsPage(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); + + base::RecordAction( + base::UserMetricsAction("Notifications.Quiet.ManageClicked")); } void ContentSettingNotificationsBubbleModel::OnDoneButtonClicked() { PermissionRequestManager* manager = PermissionRequestManager::FromWebContents(web_contents()); manager->Accept(); + + base::RecordAction( + base::UserMetricsAction("Notifications.Quiet.ShowForSiteClicked")); } // ContentSettingBubbleModel ---------------------------------------------------
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc b/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc index 1a5ce1d..03ae005 100644 --- a/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc +++ b/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc
@@ -195,22 +195,14 @@ std::move(callback).Run(false); } -bool PresentationReceiverWindowController::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool PresentationReceiverWindowController::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { - DCHECK_EQ(web_contents_.get(), web_contents); + const GURL& target_url) { // Disallow creating separate WebContentses. The WebContents implementation // uses this to spawn new windows/tabs, which is also not allowed for // local presentations. - return false; + return true; }
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_controller.h b/chrome/browser/ui/media_router/presentation_receiver_window_controller.h index 039725f..611c041 100644 --- a/chrome/browser/ui/media_router/presentation_receiver_window_controller.h +++ b/chrome/browser/ui/media_router/presentation_receiver_window_controller.h
@@ -93,19 +93,12 @@ void CanDownload(const GURL& url, const std::string& request_method, base::OnceCallback<void(bool)> callback) final; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) final; + const GURL& target_url) override; // The profile used for the presentation. std::unique_ptr<IndependentOTRProfileManager::OTRProfileRegistration>
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index 711e6d5..682f1e59 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -10,6 +10,16 @@ // https://crbug.com/967317 const base::Feature kAnimatedAvatarButton{"AnimatedAvatarButton", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables an animated avatar button on the sign-in trigger. This feature is +// guarded by kAnimatedAvatarButton and serves as a kill-switch. See +// https://crbug.com/967317 +const base::Feature kAnimatedAvatarButtonOnSignIn{ + "AnimatedAvatarButtonOnSignIn", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enables an animated avatar button on the open-profile/startup trigger. This +// feature is guarded by kAnimatedAvatarButton and serves as a kill-switch. See +// https://crbug.com/967317 +const base::Feature kAnimatedAvatarButtonOnOpeningProfile{ + "AnimatedAvatarButtonOnOpeningProfile", base::FEATURE_ENABLED_BY_DEFAULT}; // Enables showing the EV certificate details in the Page Info bubble. const base::Feature kEvDetailsInPageInfo{"EvDetailsInPageInfo",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 0f8c0ff9..f31445a 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -18,6 +18,8 @@ // alongside the definition of their values in the .cc file. extern const base::Feature kAnimatedAvatarButton; +extern const base::Feature kAnimatedAvatarButtonOnSignIn; +extern const base::Feature kAnimatedAvatarButtonOnOpeningProfile; extern const base::Feature kEvDetailsInPageInfo;
diff --git a/chrome/browser/ui/views/frame/browser_root_view.cc b/chrome/browser/ui/views/frame/browser_root_view.cc index 000ce05..e7f241e 100644 --- a/chrome/browser/ui/views/frame/browser_root_view.cc +++ b/chrome/browser/ui/views/frame/browser_root_view.cc
@@ -106,14 +106,7 @@ views::Widget* widget) : views::internal::RootView(widget), browser_view_(browser_view) {} -BrowserRootView::~BrowserRootView() { - // It's possible to destroy the browser while a drop is active. In this case, - // |drop_info_| will be non-null, but its |target| likely points to an - // already-deleted child. Clear the target so ~DropInfo() will not try and - // notify it of the drag ending. http://crbug.com/1001942 - if (drop_info_) - drop_info_->target = nullptr; -} +BrowserRootView::~BrowserRootView() = default; bool BrowserRootView::GetDropFormats( int* formats,
diff --git a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc index 455a659..1446241 100644 --- a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
@@ -49,19 +49,3 @@ EXPECT_NE(ui::DragDropTypes::DRAG_NONE, root_view->OnDragUpdated(event)); EXPECT_NE(ui::DragDropTypes::DRAG_NONE, root_view->OnPerformDrop(event)); } - -// Clear drop target when the widget is being destroyed. -// http://crbug.com/1001942 -IN_PROC_BROWSER_TEST_F(BrowserRootViewBrowserTest, ClearDropTarget) { - ui::OSExchangeData data; - data.SetURL(GURL("http://www.chromium.org/"), base::string16()); - ui::DropTargetEvent event(data, gfx::PointF(), gfx::PointF(), - ui::DragDropTypes::DRAG_COPY); - - BrowserRootView* root_view = browser_root_view(); - root_view->OnDragUpdated(event); - - // Calling this will cause segmentation fault if |root_view| doesn't clear - // the target. - root_view->GetWidget()->Close(); -}
diff --git a/chrome/browser/ui/views/hover_button.cc b/chrome/browser/ui/views/hover_button.cc index 66f7540..ce6288c 100644 --- a/chrome/browser/ui/views/hover_button.cc +++ b/chrome/browser/ui/views/hover_button.cc
@@ -282,11 +282,10 @@ views::Button::KeyClickAction HoverButton::GetKeyClickActionForEvent( const ui::KeyEvent& event) { if (event.key_code() == ui::VKEY_RETURN) { - // As the hover button is presented in the user menu, it triggers an - // |CLICK_ON_KEY_PRESS| action every time the user clicks on enter on all - // platforms (it ignores the value of - // |PlatformStyle::kReturnClicksFocusedControl|. - return CLICK_ON_KEY_PRESS; + // As the hover button is presented in the user menu, it triggers a + // kOnKeyPress action every time the user clicks on enter on all platforms. + // (it ignores the value of PlatformStyle::kReturnClicksFocusedControl) + return KeyClickAction::kOnKeyPress; } return LabelButton::GetKeyClickActionForEvent(event); }
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc index 1229da5..df6eacd9 100644 --- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc +++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -146,7 +146,7 @@ bool ContentSettingImageView::OnKeyPressed(const ui::KeyEvent& event) { // Pause animation so that the icon does not shrink and deselect while the // user is attempting to press it using key commands. - if (GetKeyClickActionForEvent(event) == KeyClickAction::CLICK_ON_KEY_RELEASE) + if (GetKeyClickActionForEvent(event) == KeyClickAction::kOnKeyRelease) PauseAnimation(); return Button::OnKeyPressed(event); }
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc index 6c925bf..adddf255 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -42,17 +42,20 @@ namespace { -constexpr base::TimeDelta kEmailExpansionDuration = +constexpr base::TimeDelta kIdentityAnimationDuration = base::TimeDelta::FromSeconds(3); constexpr base::TimeDelta kAvatarHighlightAnimationDuration = base::TimeDelta::FromSeconds(2); +ProfileAttributesStorage& GetProfileAttributesStorage() { + return g_browser_process->profile_manager()->GetProfileAttributesStorage(); +} + ProfileAttributesEntry* GetProfileAttributesEntry(Profile* profile) { ProfileAttributesEntry* entry; - if (!g_browser_process->profile_manager() - ->GetProfileAttributesStorage() - .GetProfileAttributesWithPath(profile->GetPath(), &entry)) { + if (!GetProfileAttributesStorage().GetProfileAttributesWithPath( + profile->GetPath(), &entry)) { return nullptr; } return entry; @@ -65,9 +68,7 @@ return true; return entry.GetAvatarIconIndex() == 0 && - g_browser_process->profile_manager() - ->GetProfileAttributesStorage() - .GetNumberOfProfiles() == 1; + GetProfileAttributesStorage().GetNumberOfProfiles() == 1; } int GetIconSizeForNonTouchUi() { @@ -88,8 +89,7 @@ #endif // !defined(OS_CHROMEOS) browser_(browser), profile_(browser_->profile()) { - profile_observer_.Add( - &g_browser_process->profile_manager()->GetProfileAttributesStorage()); + profile_observer_.Add(&GetProfileAttributesStorage()); State state = GetState(); if (state == State::kIncognitoProfile) { @@ -98,7 +98,9 @@ signin::IdentityManager* identity_manager = IdentityManagerFactory::GetForProfile(profile_); identity_manager_observer_.Add(identity_manager); - SetUserEmail(identity_manager->GetUnconsentedPrimaryAccountInfo().email); + + if (identity_manager->AreRefreshTokensLoaded()) + OnRefreshTokensLoaded(); } // Activate on press for left-mouse-button only to mimic other MenuButtons @@ -127,7 +129,7 @@ if (base::FeatureList::IsEnabled(features::kAnimatedAvatarButton)) { // For consistency with identity representation, we need to have the avatar - // on the left and the (potential) user-name / email on the right. + // on the left and the (potential) user name on the right. SetHorizontalAlignment(gfx::ALIGN_LEFT); } @@ -149,8 +151,8 @@ void AvatarToolbarButton::UpdateIcon() { // If widget isn't set, the button doesn't have access to the theme provider // to set colors. Defer updating until AddedToWidget(). This may get called as - // a result of SetUserEmail() called from the constructor when the button is - // not yet added to the ToolbarView's hierarchy. + // a result of OnUserIdentityChanged() called from the constructor when the + // button is not yet added to the ToolbarView's hierarchy. if (!GetWidget()) return; gfx::Image gaia_image = GetGaiaImage(); @@ -158,9 +160,9 @@ // TODO(crbug.com/990286): Get rid of this logic completely when we cache the // Google account image in the profile cache and thus it is always available. - if (waiting_for_image_to_show_user_email_ && !gaia_image.IsEmpty()) { - waiting_for_image_to_show_user_email_ = false; - ExpandToShowEmail(); + if (identity_animation_state_ == IdentityAnimationState::kWaitingForImage && + !gaia_image.IsEmpty()) { + ShowIdentityAnimation(); } } @@ -187,8 +189,9 @@ } break; } - case State::kAnimatedSignIn: { - text = base::UTF8ToUTF16(*user_email_); + case State::kAnimatedUserIdentity: { + text = signin_ui_util::GetShortProfileIdentityToDisplay( + *GetProfileAttributesEntry(profile_), profile_); break; } case State::kHighlightAnimation: @@ -248,8 +251,10 @@ void AvatarToolbarButton::NotifyClick(const ui::Event& event) { Button::NotifyClick(event); - if (should_reset_user_email_when_no_longer_hovered_or_focused_) - ResetUserEmailWhenNotHoveredOrFocused(); + if (identity_animation_state_ == + IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) { + HideIdentityAnimationWhenNotHoveredOrFocused(); + } // TODO(bsep): Other toolbar buttons have ToolbarView as a listener and let it // call ExecuteCommandWithDisposition on their behalf. Unfortunately, it's not // possible to plumb IsKeyEvent through, so this has to be a special case. @@ -260,14 +265,18 @@ } void AvatarToolbarButton::OnMouseExited(const ui::MouseEvent& event) { - if (should_reset_user_email_when_no_longer_hovered_or_focused_) - ResetUserEmailWhenNotHoveredOrFocused(); + if (identity_animation_state_ == + IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) { + HideIdentityAnimationWhenNotHoveredOrFocused(); + } ToolbarButton::OnMouseExited(event); } void AvatarToolbarButton::OnBlur() { - if (should_reset_user_email_when_no_longer_hovered_or_focused_) - ResetUserEmailWhenNotHoveredOrFocused(); + if (identity_animation_state_ == + IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) { + HideIdentityAnimationWhenNotHoveredOrFocused(); + } ToolbarButton::OnBlur(); } @@ -328,7 +337,18 @@ void AvatarToolbarButton::OnUnconsentedPrimaryAccountChanged( const CoreAccountInfo& unconsented_primary_account_info) { - SetUserEmail(unconsented_primary_account_info.email); + if (!base::FeatureList::IsEnabled(features::kAnimatedAvatarButtonOnSignIn)) + return; + OnUserIdentityChanged(unconsented_primary_account_info); +} + +void AvatarToolbarButton::OnRefreshTokensLoaded() { + if (!signin_ui_util::ShouldShowIdentityOnOpeningProfile( + GetProfileAttributesStorage(), profile_)) { + return; + } + OnUserIdentityChanged(IdentityManagerFactory::GetForProfile(profile_) + ->GetUnconsentedPrimaryAccountInfo()); } void AvatarToolbarButton::OnAccountsInCookieUpdated( @@ -356,9 +376,10 @@ ShowAvatarHighlightAnimation(); } -void AvatarToolbarButton::ExpandToShowEmail() { - DCHECK(user_email_.has_value()); - DCHECK(!waiting_for_image_to_show_user_email_); +void AvatarToolbarButton::ShowIdentityAnimation() { + DCHECK_EQ(identity_animation_state_, + IdentityAnimationState::kWaitingForImage); + identity_animation_state_ = IdentityAnimationState::kShowing; UpdateText(); @@ -366,30 +387,30 @@ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce( - &AvatarToolbarButton::ResetUserEmailWhenNotHoveredOrFocused, + &AvatarToolbarButton::HideIdentityAnimationWhenNotHoveredOrFocused, weak_ptr_factory_.GetWeakPtr()), - kEmailExpansionDuration); + kIdentityAnimationDuration); } -void AvatarToolbarButton::ResetUserEmailWhenNotHoveredOrFocused() { +void AvatarToolbarButton::HideIdentityAnimationWhenNotHoveredOrFocused() { // No-op if it has been reset already. - if (!user_email_) + if (identity_animation_state_ == IdentityAnimationState::kNotShowing) return; // Keep email visible while hovering or being focused. if (IsMouseHovered() || HasFocus()) { // TODO(crbug.com/967317): Include also the case when some other button from // the parent container is shown and hovered / focused. - should_reset_user_email_when_no_longer_hovered_or_focused_ = true; + identity_animation_state_ = + IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused; return; } - should_reset_user_email_when_no_longer_hovered_or_focused_ = false; - ResetUserEmail(); + HideIdentityAnimation(); } -void AvatarToolbarButton::ResetUserEmail() { - DCHECK(user_email_.has_value()); - user_email_ = base::nullopt; +void AvatarToolbarButton::HideIdentityAnimation() { + DCHECK_NE(identity_animation_state_, IdentityAnimationState::kNotShowing); + identity_animation_state_ = IdentityAnimationState::kNotShowing; // Update the text to the pre-shown state. This also makes sure that we now // reflect changes that happened while the identity pill was shown. @@ -404,8 +425,9 @@ return l10n_util::GetStringUTF16(IDS_GUEST_PROFILE_NAME); case State::kGenericProfile: return l10n_util::GetStringUTF16(IDS_GENERIC_USER_AVATAR_LABEL); - case State::kAnimatedSignIn: - return base::UTF8ToUTF16(*user_email_); + case State::kAnimatedUserIdentity: + return signin_ui_util::GetShortProfileIdentityToDisplay( + *GetProfileAttributesEntry(profile_), profile_); case State::kSyncError: return l10n_util::GetStringFUTF16(IDS_AVATAR_BUTTON_SYNC_ERROR_TOOLTIP, GetProfileName()); @@ -445,7 +467,7 @@ case State::kGenericProfile: return gfx::CreateVectorIcon(kUserAccountAvatarIcon, icon_size, icon_color); - case State::kAnimatedSignIn: + case State::kAnimatedUserIdentity: case State::kHighlightAnimation: case State::kSyncError: case State::kSyncPaused: @@ -520,8 +542,11 @@ return State::kGenericProfile; } - if (user_email_.has_value() && !waiting_for_image_to_show_user_email_) - return State::kAnimatedSignIn; + if (identity_animation_state_ == IdentityAnimationState::kShowing || + identity_animation_state_ == + IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) { + return State::kAnimatedUserIdentity; + } if (highlight_animation_visible_) return State::kHighlightAnimation; @@ -553,16 +578,16 @@ SetLayoutInsetDelta(layout_insets); } -void AvatarToolbarButton::SetUserEmail(const std::string& user_email) { +void AvatarToolbarButton::OnUserIdentityChanged( + const CoreAccountInfo& user_identity) { if (!base::FeatureList::IsEnabled(features::kAnimatedAvatarButton) || - user_email.empty()) { + user_identity.IsEmpty()) { return; } - user_email_ = user_email; // If we already have a gaia image, the pill will be immediately // displayed by UpdateIcon(). - waiting_for_image_to_show_user_email_ = true; + identity_animation_state_ = IdentityAnimationState::kWaitingForImage; UpdateIcon(); }
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h index 6b156d26..308d550 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
@@ -49,12 +49,19 @@ kGuestSession, kGenericProfile, kHighlightAnimation, - kAnimatedSignIn, + kAnimatedUserIdentity, kSyncPaused, kSyncError, kNormal }; + enum class IdentityAnimationState { + kNotShowing, + kWaitingForImage, + kShowing, + kShowingUntilNoLongerHoveredOrFocused + }; + // ToolbarButton: void NotifyClick(const ui::Event& event) override; void OnMouseExited(const ui::MouseEvent& event) override; @@ -83,6 +90,7 @@ // Needed if the first sync promo account should be displayed. void OnUnconsentedPrimaryAccountChanged( const CoreAccountInfo& unconsented_primary_account_info) override; + void OnRefreshTokensLoaded() override; void OnAccountsInCookieUpdated( const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info, const GoogleServiceAuthError& error) override; @@ -95,9 +103,9 @@ // autofill::PersonalDataManagerObserver: void OnCreditCardSaved() override; - void ExpandToShowEmail(); - void ResetUserEmailWhenNotHoveredOrFocused(); - void ResetUserEmail(); + void ShowIdentityAnimation(); + void HideIdentityAnimationWhenNotHoveredOrFocused(); + void HideIdentityAnimation(); base::string16 GetAvatarTooltipText() const; base::string16 GetProfileName() const; @@ -107,8 +115,8 @@ void SetInsets(); - // Sets |user_email_| and initiates showing the email (if non-empty). - void SetUserEmail(const std::string& user_email); + // Initiates showing the identity |user_identity| (if non-empty). + void OnUserIdentityChanged(const CoreAccountInfo& user_identity); void ShowHighlightAnimation(); void HideHighlightAnimation(); @@ -129,13 +137,8 @@ // paused/error state. bool autofill_icon_visible_ = false; - // The user email that we're currently showing in an animation or empty if no - // animation is in progress. - base::Optional<std::string> user_email_; - // We cannot show the animation before we fetch the new avatar. - bool waiting_for_image_to_show_user_email_ = false; - // We cannot hide the animation when the button is hovered or focused. - bool should_reset_user_email_when_no_longer_hovered_or_focused_ = false; + IdentityAnimationState identity_animation_state_ = + IdentityAnimationState::kNotShowing; ScopedObserver<ProfileAttributesStorage, ProfileAttributesStorage::Observer> profile_observer_{this};
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index 0190235..440dd30 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -318,7 +318,7 @@ } void ProfileMenuViewBase::SetSyncInfo(const base::string16& description, - const base::string16& link_text, + const base::string16& clickable_text, base::RepeatingClosure action) { constexpr int kVerticalPadding = 8; @@ -340,15 +340,14 @@ label->SetBorder(views::CreateEmptyBorder(gfx::Insets(0, kMenuEdgeMargin))); } - views::Link* link = sync_info_container_->AddChildView( - std::make_unique<views::Link>(link_text)); - link->SetHorizontalAlignment(gfx::ALIGN_CENTER); - link->set_listener(this); - link->SetBorder(views::CreateEmptyBorder(/*top=*/0, /*left=*/kMenuEdgeMargin, - /*bottom=*/kVerticalPadding, - /*right=*/kMenuEdgeMargin)); + views::Button* button = sync_info_container_->AddChildView( + views::MdTextButton::CreateSecondaryUiBlueButton(this, clickable_text)); + button->SetProperty( + views::kMarginsKey, + gfx::Insets(/*top=*/0, /*left=*/kMenuEdgeMargin, + /*bottom=*/kVerticalPadding, /*right=*/kMenuEdgeMargin)); - RegisterClickAction(link, std::move(action)); + RegisterClickAction(button, std::move(action)); } void ProfileMenuViewBase::AddShortcutFeatureButton(
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.h b/chrome/browser/ui/views/profiles/profile_menu_view_base.h index b2321d7..a24a098 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.h +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.h
@@ -100,7 +100,7 @@ const base::string16& title, const base::string16& subtitle = base::string16()); void SetSyncInfo(const base::string16& description, - const base::string16& link_text, + const base::string16& clickable_text, base::RepeatingClosure action); void AddShortcutFeatureButton(const gfx::ImageSkia& icon, const base::string16& text,
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc index 493e9e50..496e453 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -874,8 +874,9 @@ ProfileMenuClickTest_WithUnconsentedPrimaryAccount::kOrderedActionableItems []; +// TODO(crbug.com/1012167): Flaky. IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_WithUnconsentedPrimaryAccount, - SetupAndRunTest) { + DISABLED_SetupAndRunTest) { signin::MakeAccountAvailableWithCookies(identity_manager(), &test_url_loader_factory_, "user@example.com", "gaia_id"); @@ -927,7 +928,9 @@ constexpr ProfileMenuView::ActionableItem ProfileMenuClickTest_GuestProfile::kOrderedActionableItems[]; -IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_GuestProfile, SetupAndRunTest) { +// TODO(crbug.com/1012167): Flaky. +IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_GuestProfile, + DISABLED_SetupAndRunTest) { profiles::SwitchToGuestProfile(ProfileManager::CreateCallback()); ui_test_utils::WaitForBrowserToOpen(); Profile* guest = g_browser_process->profile_manager()->GetProfileByPath( @@ -972,7 +975,9 @@ constexpr ProfileMenuView::ActionableItem ProfileMenuClickTest_IncognitoProfile::kOrderedActionableItems[]; -IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_IncognitoProfile, SetupAndRunTest) { +// TODO(crbug.com/1012167): Flaky. +IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_IncognitoProfile, + DISABLED_SetupAndRunTest) { SetTargetBrowser(CreateIncognitoBrowser(browser()->profile())); RunTest();
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc index 91d51116..15e6ac4 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -292,6 +292,10 @@ TabStripModel::CLOSE_CREATE_HISTORICAL_TAB); } +void BrowserTabStripController::MoveTab(int start_index, int final_index) { + model_->MoveWebContentsAt(start_index, final_index, false); +} + void BrowserTabStripController::ShowContextMenuForTab( Tab* tab, const gfx::Point& p,
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h index 2118a35..2937577 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -61,6 +61,7 @@ void AddSelectionFromAnchorTo(int model_index) override; bool BeforeCloseTab(int model_index, CloseTabSource source) override; void CloseTab(int model_index, CloseTabSource source) override; + void MoveTab(int start_index, int final_index) override; void ShowContextMenuForTab(Tab* tab, const gfx::Point& p, ui::MenuSourceType source_type) override;
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h index 86e3c56..6761bbd 100644 --- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -23,7 +23,6 @@ void AddTab(int index, bool is_active); void AddPinnedTab(int index, bool is_active); - void MoveTab(int from_index, int to_index); void RemoveTab(int index); void MoveTabIntoGroup(int index, base::Optional<TabGroupId> new_group); @@ -46,6 +45,7 @@ void AddSelectionFromAnchorTo(int index) override; bool BeforeCloseTab(int index, CloseTabSource source) override; void CloseTab(int index, CloseTabSource source) override; + void MoveTab(int from_index, int to_index) override; void ShowContextMenuForTab(Tab* tab, const gfx::Point& p, ui::MenuSourceType source_type) override;
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc index 3e46226d..7c649aa 100644 --- a/chrome/browser/ui/views/tabs/tab.cc +++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -412,6 +412,29 @@ return true; } + if (event.type() == ui::ET_KEY_PRESSED && + (event.flags() & ui::EF_CONTROL_DOWN)) { + if (event.flags() & ui::EF_SHIFT_DOWN) { + if (event.key_code() == ui::VKEY_RIGHT) { + controller()->MoveTabLast(this); + return true; + } + if (event.key_code() == ui::VKEY_LEFT) { + controller()->MoveTabFirst(this); + return true; + } + } else { + if (event.key_code() == ui::VKEY_RIGHT) { + controller()->MoveTabRight(this); + return true; + } + if (event.key_code() == ui::VKEY_LEFT) { + controller()->MoveTabLeft(this); + return true; + } + } + } + return false; }
diff --git a/chrome/browser/ui/views/tabs/tab_controller.h b/chrome/browser/ui/views/tabs/tab_controller.h index f342729..8fbea38 100644 --- a/chrome/browser/ui/views/tabs/tab_controller.h +++ b/chrome/browser/ui/views/tabs/tab_controller.h
@@ -55,6 +55,25 @@ // Closes the tab. virtual void CloseTab(Tab* tab, CloseTabSource source) = 0; + // Attempts to move the specified tab to the right. + virtual void MoveTabRight(Tab* tab) = 0; + + // Attempts to move the specified tab to the left. + virtual void MoveTabLeft(Tab* tab) = 0; + + // Attempts to move the specified tab to the beginning of the tabstrip (or the + // beginning of the unpinned tab region if the tab is not pinned). + virtual void MoveTabFirst(Tab* tab) = 0; + + // Attempts to move the specified tab to the end of the tabstrip (or the end + // of the pinned tab region if the tab is pinned). + virtual void MoveTabLast(Tab* tab) = 0; + + // Shows a context menu for the tab at the specified point in screen coords. + virtual void ShowContextMenuForTab(Tab* tab, + const gfx::Point& p, + ui::MenuSourceType source_type) = 0; + // Returns whether |tab| is the active tab. The active tab is the one whose // content is shown in the browser. virtual bool IsActiveTab(const Tab* tab) const = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index e4129e70..d8ab19a 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -1471,6 +1471,64 @@ controller_->CloseTab(model_index, source); } +void TabStrip::MoveTabLeft(Tab* tab) { + MoveTabRelative(tab, -1); +} + +void TabStrip::MoveTabRight(Tab* tab) { + MoveTabRelative(tab, 1); +} + +void TabStrip::MoveTabFirst(Tab* tab) { + if (tab->closing()) + return; + + const int start_index = GetModelIndexOfTab(tab); + if (!IsValidModelIndex(start_index)) + return; + + int target_index = 0; + if (!controller_->IsTabPinned(start_index)) { + while (target_index < start_index && controller_->IsTabPinned(target_index)) + ++target_index; + } + + if (target_index == start_index || !IsValidModelIndex(target_index)) + return; + + controller_->MoveTab(start_index, target_index); +} + +void TabStrip::MoveTabLast(Tab* tab) { + if (tab->closing()) + return; + + const int start_index = GetModelIndexOfTab(tab); + if (!IsValidModelIndex(start_index)) + return; + + int target_index; + if (controller_->IsTabPinned(start_index)) { + int temp_index = start_index + 1; + while (temp_index < tab_count() && controller_->IsTabPinned(temp_index)) + ++temp_index; + target_index = temp_index - 1; + } else { + target_index = tab_count() - 1; + } + + if (target_index == start_index || !IsValidModelIndex(target_index)) + return; + + controller_->MoveTab(start_index, target_index); +} + +void TabStrip::ShowContextMenuForTab(Tab* tab, + const gfx::Point& p, + ui::MenuSourceType source_type) { + controller_->ShowContextMenuForTab(tab, p, source_type); +} + bool TabStrip::IsActiveTab(const Tab* tab) const { int model_index = GetModelIndexOfTab(tab); return IsValidModelIndex(model_index) && @@ -2573,6 +2631,24 @@ separator_color_ = get_blend(inactive_fg, kTabSeparatorContrast).color; } +void TabStrip::MoveTabRelative(Tab* tab, int offset) { + DCHECK_NE(offset, 0); + const int start_index = GetModelIndexOfTab(tab); + const int target_index = start_index + offset; + + if (tab->closing()) + return; + + if (!IsValidModelIndex(start_index) || !IsValidModelIndex(target_index)) + return; + + if (controller_->IsTabPinned(start_index) != + controller_->IsTabPinned(target_index)) + return; + + controller_->MoveTab(start_index, target_index); +} + void TabStrip::ResizeLayoutTabs() { // We've been called back after the TabStrip has been emptied out (probably // just prior to the window being destroyed). We need to do nothing here or
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h index a09afc05..c78603a5 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.h +++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -243,6 +243,13 @@ void ToggleSelected(Tab* tab) override; void AddSelectionFromAnchorTo(Tab* tab) override; void CloseTab(Tab* tab, CloseTabSource source) override; + void MoveTabLeft(Tab* tab) override; + void MoveTabRight(Tab* tab) override; + void MoveTabFirst(Tab* tab) override; + void MoveTabLast(Tab* tab) override; + void ShowContextMenuForTab(Tab* tab, + const gfx::Point& p, + ui::MenuSourceType source_type) override; bool IsActiveTab(const Tab* tab) const override; bool IsTabSelected(const Tab* tab) const override; bool IsTabPinned(const Tab* tab) const override; @@ -463,6 +470,10 @@ // Computes and stores values derived from contrast ratios. void UpdateContrastRatioValues(); + // Determines whether a tab can be moved by |offset| positions and moves it if + // possible. + void MoveTabRelative(Tab* tab, int offset); + // -- Tab Resize Layout ----------------------------------------------------- // Perform an animated resize-relayout of the TabStrip immediately.
diff --git a/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc b/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc index e0d82e6..b486ace 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ui/views/tabs/tab_strip.h" +#include <vector> + #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/tabs/tab_group_id.h" @@ -27,6 +29,21 @@ tab_strip_model()->AddToNewGroup({tab_index}); return tab_strip_model()->GetTabGroupForTab(tab_index).value(); } + + std::vector<content::WebContents*> GetWebContentses() { + std::vector<content::WebContents*> contentses; + for (int i = 0; i < tab_strip()->tab_count(); ++i) + contentses.push_back(tab_strip_model()->GetWebContentsAt(i)); + return contentses; + } + + std::vector<content::WebContents*> GetWebContentsesInOrder( + const std::vector<int>& order) { + std::vector<content::WebContents*> contentses; + for (int i = 0; i < tab_strip()->tab_count(); ++i) + contentses.push_back(tab_strip_model()->GetWebContentsAt(order[i])); + return contentses; + } }; // Regression test for crbug.com/983961. @@ -53,3 +70,192 @@ EXPECT_EQ(groups.size(), 1U); EXPECT_EQ(groups[0], group); } + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLeft_Success) { + AppendTab(); + AppendTab(); + + const auto expected = GetWebContentsesInOrder({1, 0, 2}); + tab_strip()->MoveTabLeft(tab_strip()->tab_at(1)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, + MoveTabLeft_Failure_EdgeOfTabstrip) { + AppendTab(); + AppendTab(); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabLeft(tab_strip()->tab_at(0)); + // No change expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLeft_Failure_Pinned) { + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabLeft(tab_strip()->tab_at(1)); + // No change expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabRight_Success) { + AppendTab(); + AppendTab(); + + const auto expected = GetWebContentsesInOrder({1, 0, 2}); + tab_strip()->MoveTabRight(tab_strip()->tab_at(0)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, + MoveTabRight_Failure_EdgeOfTabstrip) { + AppendTab(); + AppendTab(); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabRight(tab_strip()->tab_at(2)); + // No change expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabRight_Failure_Pinned) { + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabRight(tab_strip()->tab_at(0)); + // No change expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_NoPinnedTabs_Success) { + AppendTab(); + AppendTab(); + AppendTab(); + + const auto expected = GetWebContentsesInOrder({2, 0, 1, 3}); + tab_strip()->MoveTabFirst(tab_strip()->tab_at(2)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_PinnedTabs_Success) { + AppendTab(); + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + + const auto expected = GetWebContentsesInOrder({0, 2, 1, 3}); + tab_strip()->MoveTabFirst(tab_strip()->tab_at(2)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_NoPinnedTabs_Failure) { + AppendTab(); + AppendTab(); + AppendTab(); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabFirst(tab_strip()->tab_at(0)); + // No changes expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_PinnedTabs_Failure) { + AppendTab(); + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabFirst(tab_strip()->tab_at(1)); + // No changes expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, + MoveTabFirst_MovePinnedTab_Success) { + AppendTab(); + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + tab_strip_model()->SetTabPinned(1, true); + tab_strip_model()->SetTabPinned(2, true); + + const auto expected = GetWebContentsesInOrder({2, 0, 1, 3}); + tab_strip()->MoveTabFirst(tab_strip()->tab_at(2)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_NoPinnedTabs_Success) { + AppendTab(); + AppendTab(); + + const auto expected = GetWebContentsesInOrder({1, 2, 0}); + tab_strip()->MoveTabLast(tab_strip()->tab_at(0)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_MovePinnedTab_Success) { + AppendTab(); + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + tab_strip_model()->SetTabPinned(1, true); + tab_strip_model()->SetTabPinned(2, true); + + const auto expected = GetWebContentsesInOrder({0, 2, 1, 3}); + tab_strip()->MoveTabLast(tab_strip()->tab_at(1)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_AllPinnedTabs_Success) { + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + tab_strip_model()->SetTabPinned(1, true); + tab_strip_model()->SetTabPinned(2, true); + + const auto expected = GetWebContentsesInOrder({0, 2, 1}); + tab_strip()->MoveTabLast(tab_strip()->tab_at(1)); + EXPECT_EQ(expected, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_NoPinnedTabs_Failure) { + AppendTab(); + AppendTab(); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabLast(tab_strip()->tab_at(2)); + // No changes expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_PinnedTabs_Failure) { + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + tab_strip_model()->SetTabPinned(1, true); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabLast(tab_strip()->tab_at(1)); + // No changes expected. + EXPECT_EQ(contentses, GetWebContentses()); +} + +IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_AllPinnedTabs_Failure) { + AppendTab(); + AppendTab(); + tab_strip_model()->SetTabPinned(0, true); + tab_strip_model()->SetTabPinned(1, true); + tab_strip_model()->SetTabPinned(2, true); + + const auto contentses = GetWebContentses(); + tab_strip()->MoveTabLast(tab_strip()->tab_at(2)); + // No changes expected. + EXPECT_EQ(contentses, GetWebContentses()); +}
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h index 7d424a3..1dc2b5c3 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_controller.h +++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -78,6 +78,10 @@ // Closes the tab at the specified index in the model. virtual void CloseTab(int index, CloseTabSource source) = 0; + // Moves the tab at |start_index| so that it is now at |final_index|, sliding + // any tabs in between left or right as appropriate. + virtual void MoveTab(int start_index, int final_index) = 0; + // Shows a context menu for the tab at the specified point in screen coords. virtual void ShowContextMenuForTab(Tab* tab, const gfx::Point& p,
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc index 525400c2..5c50c26 100644 --- a/chrome/browser/ui/views/tabs/tab_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -56,6 +56,13 @@ void ToggleSelected(Tab* tab) override {} void AddSelectionFromAnchorTo(Tab* tab) override {} void CloseTab(Tab* tab, CloseTabSource source) override {} + void MoveTabRight(Tab* tab) override {} + void MoveTabLeft(Tab* tab) override {} + void MoveTabFirst(Tab* tab) override {} + void MoveTabLast(Tab* tab) override {} + void ShowContextMenuForTab(Tab* tab, + const gfx::Point& p, + ui::MenuSourceType source_type) override {} bool IsActiveTab(const Tab* tab) const override { return active_tab_; } bool IsTabSelected(const Tab* tab) const override { return false; } bool IsTabPinned(const Tab* tab) const override { return false; }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.cc b/chrome/browser/ui/views/toolbar/toolbar_button.cc index a1601c4..9747a962 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_button.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_button.cc
@@ -394,6 +394,12 @@ .color; } +// static +SkColor ToolbarButton::GetDefaultBorderColor(views::View* host_view) { + return SkColorSetA(GetToolbarInkDropBaseColor(host_view), + kToolbarButtonBackgroundAlpha); +} + bool ToolbarButton::ShouldShowMenu() { return model_ != nullptr; } @@ -552,11 +558,7 @@ if (highlight_color_) { border_color = *highlight_color_; } else { - // TODO(crbug.com/967317): Update to match mocks. If - // !color_utils::IsDark(..COLOR_TOOLBAR), return black with 30% alpha. - // Otherwise, consider returning GetDefaultTextColor(), instead. - border_color = parent_->GetThemeProvider()->GetColor( - ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); + border_color = ToolbarButton::GetDefaultBorderColor(parent_); } return FadeWithAnimation(border_color, highlight_color_animation_); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.h b/chrome/browser/ui/views/toolbar/toolbar_button.h index 0ec14781..db507c8 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_button.h +++ b/chrome/browser/ui/views/toolbar/toolbar_button.h
@@ -114,6 +114,10 @@ SkColor dark_extreme, SkColor light_extreme); + // Returns the default border color used for toolbar buttons (when having a + // highlight text, see SetHighlight()). + static SkColor GetDefaultBorderColor(views::View* host_view); + protected: // Returns if menu should be shown. Override this to change default behavior. virtual bool ShouldShowMenu();
diff --git a/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc index 42d9fd02d5..26fa472 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/browser/ui/views/toolbar/toolbar_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" #include "ui/native_theme/native_theme.h" #include "ui/views/background.h" @@ -124,12 +125,13 @@ void ToolbarIconContainerView::SetHighlightBorder() { const float highlight_value = highlight_animation_.GetCurrentValue(); if (highlight_value > 0.0f) { + SkColor border_color = ToolbarButton::GetDefaultBorderColor(this); SetBorder(views::CreateRoundedRectBorder( 1, ChromeLayoutProvider::Get()->GetCornerRadiusMetric( views::EMPHASIS_MAXIMUM, size()), - SkColorSetA(GetToolbarInkDropBaseColor(this), - highlight_value * kToolbarButtonBackgroundAlpha))); + SkColorSetA(border_color, + SkColorGetA(border_color) * highlight_value))); } else { SetBorder(nullptr); }
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_manager.h b/chrome/browser/ui/web_applications/web_app_dialog_manager.h index caa4ac4..f3f5c9b 100644 --- a/chrome/browser/ui/web_applications/web_app_dialog_manager.h +++ b/chrome/browser/ui/web_applications/web_app_dialog_manager.h
@@ -50,7 +50,7 @@ base::flat_set<std::unique_ptr<DialogInstance>, base::UniquePtrComparator> dialogs_; - Profile* profile_; + Profile* const profile_; DISALLOW_COPY_AND_ASSIGN(WebAppDialogManager); };
diff --git a/chrome/browser/ui/web_applications/web_app_metrics.h b/chrome/browser/ui/web_applications/web_app_metrics.h index 30646298..fbbd0947 100644 --- a/chrome/browser/ui/web_applications/web_app_metrics.h +++ b/chrome/browser/ui/web_applications/web_app_metrics.h
@@ -45,7 +45,7 @@ static constexpr int kNumUserInstalledAppsNotCounted = -1; int num_user_installed_apps_ = kNumUserInstalledAppsNotCounted; - Profile* profile_; + Profile* const profile_; base::WeakPtrFactory<WebAppMetrics> weak_ptr_factory_{this};
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h index ce0baa1..72d3071b 100644 --- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h +++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
@@ -61,7 +61,7 @@ std::unique_ptr<WebAppDialogManager> dialog_manager_; - Profile* profile_; + Profile* const profile_; std::map<AppId, std::vector<base::OnceClosure>> windows_closed_requests_map_; std::map<AppId, size_t> num_windows_for_apps_map_;
diff --git a/chrome/browser/vr/testapp/vr_testapp.cc b/chrome/browser/vr/testapp/vr_testapp.cc index f4929f5..0a6209b0 100644 --- a/chrome/browser/vr/testapp/vr_testapp.cc +++ b/chrome/browser/vr/testapp/vr_testapp.cc
@@ -32,7 +32,7 @@ #include "ui/ozone/public/cursor_factory_ozone.h" #include "ui/ozone/public/ozone_gpu_test_helper.h" #include "ui/ozone/public/ozone_platform.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/platform_window_init_properties.h" @@ -166,7 +166,7 @@ std::unique_ptr<vr::GlRenderer> renderer_; // Window-related state. - std::unique_ptr<ui::PlatformWindow> platform_window_; + std::unique_ptr<ui::PlatformWindowBase> platform_window_; gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget; base::WeakPtrFactory<AppWindow> weak_ptr_factory_;
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h index 6a7c5c18..e07758d 100644 --- a/chrome/browser/web_applications/components/app_registrar.h +++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -112,7 +112,7 @@ void NotifyAppRegistrarShutdown(); private: - Profile* profile_; + Profile* const profile_; base::ObserverList<AppRegistrarObserver, /*check_empty=*/true> observers_; };
diff --git a/chrome/browser/web_applications/components/app_registry_controller.h b/chrome/browser/web_applications/components/app_registry_controller.h index feeb536..7f61c94 100644 --- a/chrome/browser/web_applications/components/app_registry_controller.h +++ b/chrome/browser/web_applications/components/app_registry_controller.h
@@ -47,7 +47,7 @@ Profile* profile() const { return profile_; } private: - Profile* profile_; + Profile* const profile_; }; } // namespace web_app
diff --git a/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h b/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h index c871a08..b85a2f2 100644 --- a/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h +++ b/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h
@@ -60,7 +60,7 @@ bool IsPlaceholderApp(const AppId& app_id) const; private: - PrefService* pref_service_; + PrefService* const pref_service_; DISALLOW_COPY_AND_ASSIGN(ExternallyInstalledWebAppPrefs); };
diff --git a/chrome/browser/web_applications/components/install_manager.h b/chrome/browser/web_applications/components/install_manager.h index 4a760f0..f1d60d8 100644 --- a/chrome/browser/web_applications/components/install_manager.h +++ b/chrome/browser/web_applications/components/install_manager.h
@@ -136,7 +136,7 @@ InstallFinalizer* finalizer() { return finalizer_; } private: - Profile* profile_; + Profile* const profile_; WebAppUrlLoader url_loader_; AppRegistrar* registrar_ = nullptr;
diff --git a/chrome/browser/web_applications/components/web_app_icon_downloader.h b/chrome/browser/web_applications/components/web_app_icon_downloader.h index a02c0b1..95234d0 100644 --- a/chrome/browser/web_applications/components/web_app_icon_downloader.h +++ b/chrome/browser/web_applications/components/web_app_icon_downloader.h
@@ -103,7 +103,7 @@ WebAppIconDownloaderCallback callback_; // The histogram name to log individual fetch results under. - std::string https_status_code_class_histogram_name_; + const std::string https_status_code_class_histogram_name_; base::WeakPtrFactory<WebAppIconDownloader> weak_ptr_factory_{this};
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.h b/chrome/browser/web_applications/components/web_app_shortcut_mac.h index 7f888b0..e51de625 100644 --- a/chrome/browser/web_applications/components/web_app_shortcut_mac.h +++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
@@ -148,10 +148,10 @@ // Path to the data directory for this app. For example: // ~/Library/Application Support/Chromium/Default/Web Applications/_crx_abc/ - base::FilePath app_data_dir_; + const base::FilePath app_data_dir_; // Information about the app. Owned by the caller of the constructor. - const ShortcutInfo* info_; + const ShortcutInfo* const info_; DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreator); };
diff --git a/chrome/browser/web_applications/pending_app_install_task.h b/chrome/browser/web_applications/pending_app_install_task.h index 385fb7a9..9441c93 100644 --- a/chrome/browser/web_applications/pending_app_install_task.h +++ b/chrome/browser/web_applications/pending_app_install_task.h
@@ -86,10 +86,10 @@ const AppId& app_id, InstallResultCode code); - Profile* profile_; - AppRegistrar* registrar_; - InstallFinalizer* install_finalizer_; - WebAppUiManager* ui_manager_; + Profile* const profile_; + AppRegistrar* const registrar_; + InstallFinalizer* const install_finalizer_; + WebAppUiManager* const ui_manager_; ExternallyInstalledWebAppPrefs externally_installed_app_prefs_;
diff --git a/chrome/browser/web_applications/system_web_app_manager.h b/chrome/browser/web_applications/system_web_app_manager.h index 8256343..1609222 100644 --- a/chrome/browser/web_applications/system_web_app_manager.h +++ b/chrome/browser/web_applications/system_web_app_manager.h
@@ -139,7 +139,7 @@ base::flat_map<AppId, SystemAppType> app_id_to_app_type_; - PrefService* pref_service_; + PrefService* const pref_service_; // Used to install, uninstall, and update apps. Should outlive this class. PendingAppManager* pending_app_manager_ = nullptr;
diff --git a/chrome/browser/web_applications/web_app_database.h b/chrome/browser/web_applications/web_app_database.h index 26c5291..b86c7c1 100644 --- a/chrome/browser/web_applications/web_app_database.h +++ b/chrome/browser/web_applications/web_app_database.h
@@ -79,7 +79,7 @@ std::unique_ptr<syncer::ModelTypeStore> store_; std::unique_ptr<syncer::ModelTypeStore::WriteBatch> write_batch_; - AbstractWebAppDatabaseFactory* database_factory_; + AbstractWebAppDatabaseFactory* const database_factory_; ReportErrorCallback error_callback_; // Database is opened if store is created and all data read.
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.h b/chrome/browser/web_applications/web_app_install_finalizer.h index 1dd26c7..206b38a 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.h +++ b/chrome/browser/web_applications/web_app_install_finalizer.h
@@ -51,7 +51,7 @@ const AppId& app_id, bool success); - WebAppSyncBridge* sync_bridge_; + WebAppSyncBridge* const sync_bridge_; WebAppIconManager* const icon_manager_; base::WeakPtrFactory<WebAppInstallFinalizer> weak_ptr_factory_{this};
diff --git a/chrome/browser/web_applications/web_app_install_task.h b/chrome/browser/web_applications/web_app_install_task.h index c6713d5..8045411d 100644 --- a/chrome/browser/web_applications/web_app_install_task.h +++ b/chrome/browser/web_applications/web_app_install_task.h
@@ -171,7 +171,7 @@ std::unique_ptr<WebAppDataRetriever> data_retriever_; InstallFinalizer* install_finalizer_; - Profile* profile_; + Profile* const profile_; base::WeakPtrFactory<WebAppInstallTask> weak_ptr_factory_{this};
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h index dc9cf986..99bc02a 100644 --- a/chrome/browser/web_applications/web_app_provider.h +++ b/chrome/browser/web_applications/web_app_provider.h
@@ -129,7 +129,7 @@ base::OneShotEvent on_registry_ready_; - Profile* profile_; + Profile* const profile_; // Ensures that ConnectSubsystems() is not called after Start(). bool started_ = false;
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index d10dbaf..bf3f0993 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -86,7 +86,7 @@ const_iterator end() const; private: - const WebAppRegistrar* registrar_; + const WebAppRegistrar* const registrar_; #if DCHECK_IS_ON() const size_t mutations_count_; #endif
diff --git a/chrome/browser/web_applications/web_app_registry_update.h b/chrome/browser/web_applications/web_app_registry_update.h index 423e6c8f..41d379bb 100644 --- a/chrome/browser/web_applications/web_app_registry_update.h +++ b/chrome/browser/web_applications/web_app_registry_update.h
@@ -58,7 +58,7 @@ private: std::unique_ptr<RegistryUpdateData> update_data_; - WebAppRegistrarMutable* mutable_registrar_; + WebAppRegistrarMutable* const mutable_registrar_; DISALLOW_COPY_AND_ASSIGN(WebAppRegistryUpdate); }; @@ -74,7 +74,7 @@ private: std::unique_ptr<WebAppRegistryUpdate> update_; - WebAppSyncBridge* sync_bridge_; + WebAppSyncBridge* const sync_bridge_; DISALLOW_COPY_AND_ASSIGN(ScopedRegistryUpdate); };
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.h b/chrome/browser/web_applications/web_app_sync_bridge.h index 8464151..d150e1b 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.h +++ b/chrome/browser/web_applications/web_app_sync_bridge.h
@@ -89,7 +89,7 @@ std::string GetStorageKey(const syncer::EntityData& entity_data) override; std::unique_ptr<WebAppDatabase> database_; - WebAppRegistrarMutable* registrar_; + WebAppRegistrarMutable* const registrar_; bool is_in_update_ = false;
diff --git a/chrome/common/apps/platform_apps/chrome_apps_messages.h b/chrome/common/apps/platform_apps/chrome_apps_messages.h index 3169f24c9..f8138b4 100644 --- a/chrome/common/apps/platform_apps/chrome_apps_messages.h +++ b/chrome/common/apps/platform_apps/chrome_apps_messages.h
@@ -8,8 +8,6 @@ #include "chrome/common/apps/platform_apps/media_galleries_permission_data.h" #include "ipc/ipc_message_macros.h" -#define IPC_MESSAGE_START ChromeAppsMsgStart - IPC_STRUCT_TRAITS_BEGIN(chrome_apps::MediaGalleriesPermissionData) IPC_STRUCT_TRAITS_MEMBER(permission()) IPC_STRUCT_TRAITS_END()
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e37561a..5614ae1 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -653,6 +653,7 @@ "//base", "//base:i18n", "//base/test:test_support", + "//base/util/memory_pressure:test_support", "//build:branding_buildflags", "//chrome:browser_tests_pak", "//chrome:packed_resources", @@ -3052,6 +3053,7 @@ "../browser/optimization_guide/optimization_guide_session_statistic_unittest.cc", "../browser/optimization_guide/optimization_guide_top_host_provider_unittest.cc", "../browser/optimization_guide/prediction/decision_tree_prediction_model_unittest.cc", + "../browser/optimization_guide/prediction/prediction_manager_unittest.cc", "../browser/optimization_guide/prediction/prediction_model_fetcher_unittest.cc", "../browser/optimization_guide/prediction/prediction_model_unittest.cc", "../browser/page_load_metrics/metrics_web_contents_observer_unittest.cc", @@ -3444,6 +3446,7 @@ ":test_support_unit", "//base:base_stack_sampling_profiler_test_util", "//base/test:test_support", + "//base/util/memory_pressure:test_support", "//chrome:browser_dependencies", "//chrome:child_dependencies", "//chrome:resources",
diff --git a/chrome/test/data/pdf/annotations_feature_disabled_test.js b/chrome/test/data/pdf/annotations_feature_disabled_test.js index 82851ed..422e574 100644 --- a/chrome/test/data/pdf/annotations_feature_disabled_test.js +++ b/chrome/test/data/pdf/annotations_feature_disabled_test.js
@@ -12,4 +12,8 @@ } chrome.test.succeed(); }, + function testPromiseNotCreated() { + chrome.test.assertEq(null, viewer.loaded); + chrome.test.succeed(); + }, ]);
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc index 71782c3..3f418f3 100644 --- a/chrome/test/ppapi/ppapi_browsertest.cc +++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -1058,14 +1058,15 @@ FailureType failure_type, network::mojom::NetworkContext* network_context, mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver, - network::mojom::UDPSocketListenerPtr socket_listener) + mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener) : failure_type_(failure_type), receiver_(this, std::move(socket_receiver)) { if (failure_type == FailureType::kDropListenerPipeOnConstruction) socket_listener.reset(); - socket_listener_ = std::move(socket_listener); + else + socket_listener_.Bind(std::move(socket_listener)); network_context->CreateUDPSocket( - wrapped_socket_.BindNewPipeAndPassReceiver(), nullptr); + wrapped_socket_.BindNewPipeAndPassReceiver(), mojo::NullRemote()); receiver_.set_disconnect_handler( base::BindOnce(&WrappedUDPSocket::Close, base::Unretained(this))); wrapped_socket_.set_disconnect_handler( @@ -1173,7 +1174,7 @@ mojo::Remote<network::mojom::UDPSocket> wrapped_socket_; // Only populated on certain read FailureTypes. - network::mojom::UDPSocketListenerPtr socket_listener_; + mojo::Remote<network::mojom::UDPSocketListener> socket_listener_; DISALLOW_COPY_AND_ASSIGN(WrappedUDPSocket); }; @@ -1182,7 +1183,7 @@ WrappedUDPSocket::FailureType failure_type, network::mojom::NetworkContext* network_context, mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver, - network::mojom::UDPSocketListenerPtr socket_listener) { + mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener) { // This will delete itself when one of its Mojo pipes is closed. new WrappedUDPSocket(failure_type, network_context, std::move(socket_receiver), std::move(socket_listener));
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java index d0b1c0c8..45f3829 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java
@@ -19,7 +19,7 @@ @SuppressLint("HardwareIds") @CalledByNative - private static String getSerialNumber() { + public static String getSerialNumber() { if (!Build.SERIAL.equals(Build.UNKNOWN)) return Build.SERIAL; return CastSerialGenerator.getGeneratedSerial(); }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 72356e04..13aa39a3 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -12574.0.0 \ No newline at end of file +12575.0.0 \ No newline at end of file
diff --git a/chromeos/components/sync_wifi/BUILD.gn b/chromeos/components/sync_wifi/BUILD.gn index f8072c0..73071af6 100644 --- a/chromeos/components/sync_wifi/BUILD.gn +++ b/chromeos/components/sync_wifi/BUILD.gn
@@ -27,18 +27,32 @@ ] } +source_set("test_support") { + testonly = true + sources = [ + "test_data_generator.cc", + "test_data_generator.h", + ] + deps = [ + ":sync_wifi", + "//base/test:test_support", + "//components/sync:test_support", + ] +} + source_set("unit_tests") { testonly = true sources = [ "network_identifier_unittest.cc", "pending_network_configuration_tracker_impl_unittest.cc", - "test_specifics_generator.h", "wifi_configuration_bridge_unittest.cc", ] deps = [ ":sync_wifi", + ":test_support", "//base/test:test_support", - "//chromeos/network:network", + "//chromeos/dbus/shill:test_support", + "//chromeos/network:test_support", "//components/sync:test_support", "//components/sync_preferences:test_support", "//testing/gtest",
diff --git a/chromeos/components/sync_wifi/network_identifier_unittest.cc b/chromeos/components/sync_wifi/network_identifier_unittest.cc index d43d4422..5cd9411 100644 --- a/chromeos/components/sync_wifi/network_identifier_unittest.cc +++ b/chromeos/components/sync_wifi/network_identifier_unittest.cc
@@ -8,7 +8,7 @@ #include "base/strings/string_number_conversions.h" #include "chromeos/components/sync_wifi/network_identifier.h" -#include "chromeos/components/sync_wifi/test_specifics_generator.h" +#include "chromeos/components/sync_wifi/test_data_generator.h" #include "chromeos/network/network_state.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" @@ -28,10 +28,12 @@ }; TEST_F(NetworkIdentifierTest, FromProto) { + NetworkIdentifier expected_id(kHexSsid, shill::kSecurityPsk); NetworkIdentifier id = - NetworkIdentifier::FromProto(CreateSpecifics(kHexSsid)); + NetworkIdentifier::FromProto(GenerateTestWifiSpecifics(expected_id)); EXPECT_EQ(kHexSsid, id.hex_ssid()); EXPECT_EQ(shill::kSecurityPsk, id.security_type()); + EXPECT_EQ(expected_id, id); } TEST_F(NetworkIdentifierTest, FromNetwork) {
diff --git a/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc b/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc index 0a4fa4c..5fc1f68 100644 --- a/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc +++ b/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/optional.h" #include "chromeos/components/sync_wifi/pending_network_configuration_tracker_impl.h" -#include "chromeos/components/sync_wifi/test_specifics_generator.h" +#include "chromeos/components/sync_wifi/test_data_generator.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" @@ -80,115 +80,121 @@ ASSERT_EQ(serialized_specifics_wants, serialized_specifics_has); } + const NetworkIdentifier& fred_network_id() const { return fred_network_id_; } + + const NetworkIdentifier& mango_network_id() const { + return mango_network_id_; + } + private: std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> test_pref_service_; std::unique_ptr<PendingNetworkConfigurationTrackerImpl> tracker_; + + const NetworkIdentifier fred_network_id_ = GeneratePskNetworkId(kFredSsid); + const NetworkIdentifier mango_network_id_ = GeneratePskNetworkId(kMangoSsid); + DISALLOW_COPY_AND_ASSIGN(PendingNetworkConfigurationTrackerImplTest); }; TEST_F(PendingNetworkConfigurationTrackerImplTest, TestMarkComplete) { - NetworkIdentifier id(kFredSsid, shill::kSecurityPsk); - tracker()->TrackPendingUpdate(kChangeGuid1, id, + tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), /*specifics=*/base::nullopt); - AssertTrackerHasMatchingUpdate(kChangeGuid1, id); + AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id()); EXPECT_EQ(1u, GetPref()->DictSize()); - EXPECT_TRUE(DoesPrefContainPendingUpdate(id, kChangeGuid1)); - tracker()->MarkComplete(kChangeGuid1, id); - EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, id)); + EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_network_id(), kChangeGuid1)); + tracker()->MarkComplete(kChangeGuid1, fred_network_id()); + EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, fred_network_id())); EXPECT_EQ(0u, GetPref()->DictSize()); } TEST_F(PendingNetworkConfigurationTrackerImplTest, TestTwoChangesSameNetwork) { - NetworkIdentifier id(kFredSsid, shill::kSecurityPsk); - tracker()->TrackPendingUpdate(kChangeGuid1, id, + tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), /*specifics=*/base::nullopt); - tracker()->IncrementCompletedAttempts(kChangeGuid1, id); - AssertTrackerHasMatchingUpdate(kChangeGuid1, id, + tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id()); + AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id(), /*completed_attempts=*/1); EXPECT_EQ(1u, GetPref()->DictSize()); - EXPECT_EQ( - 1, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts()); + EXPECT_EQ(1, tracker() + ->GetPendingUpdate(kChangeGuid1, fred_network_id()) + ->completed_attempts()); - tracker()->TrackPendingUpdate(kChangeGuid2, id, + tracker()->TrackPendingUpdate(kChangeGuid2, fred_network_id(), /*specifics=*/base::nullopt); - EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, id)); - AssertTrackerHasMatchingUpdate(kChangeGuid2, id); - EXPECT_EQ( - 0, tracker()->GetPendingUpdate(kChangeGuid2, id)->completed_attempts()); + EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, fred_network_id())); + AssertTrackerHasMatchingUpdate(kChangeGuid2, fred_network_id()); + EXPECT_EQ(0, tracker() + ->GetPendingUpdate(kChangeGuid2, fred_network_id()) + ->completed_attempts()); EXPECT_EQ(1u, GetPref()->DictSize()); } TEST_F(PendingNetworkConfigurationTrackerImplTest, TestTwoChangesDifferentNetworks) { - NetworkIdentifier fred_id(kFredSsid, shill::kSecurityPsk); - NetworkIdentifier mango_id(kMangoSsid, shill::kSecurityPsk); - tracker()->TrackPendingUpdate(kChangeGuid1, fred_id, + tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), /*specifics=*/base::nullopt); - AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_id); - EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_id, kChangeGuid1)); + AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id()); + EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_network_id(), kChangeGuid1)); EXPECT_EQ(1u, GetPref()->DictSize()); - tracker()->TrackPendingUpdate(kChangeGuid2, mango_id, + tracker()->TrackPendingUpdate(kChangeGuid2, mango_network_id(), /*specifics=*/base::nullopt); - AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_id); - AssertTrackerHasMatchingUpdate(kChangeGuid2, mango_id); - EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_id, kChangeGuid1)); - EXPECT_TRUE(DoesPrefContainPendingUpdate(mango_id, kChangeGuid2)); + AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id()); + AssertTrackerHasMatchingUpdate(kChangeGuid2, mango_network_id()); + EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_network_id(), kChangeGuid1)); + EXPECT_TRUE(DoesPrefContainPendingUpdate(mango_network_id(), kChangeGuid2)); EXPECT_EQ(2u, GetPref()->DictSize()); } TEST_F(PendingNetworkConfigurationTrackerImplTest, TestGetPendingUpdates) { - NetworkIdentifier fred_id(kFredSsid, shill::kSecurityPsk); - NetworkIdentifier mango_id(kMangoSsid, shill::kSecurityPsk); - tracker()->TrackPendingUpdate(kChangeGuid1, fred_id, + tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), /*specifics=*/base::nullopt); - tracker()->TrackPendingUpdate(kChangeGuid2, mango_id, + tracker()->TrackPendingUpdate(kChangeGuid2, mango_network_id(), /*specifics=*/base::nullopt); std::vector<PendingNetworkConfigurationUpdate> list = tracker()->GetPendingUpdates(); EXPECT_EQ(2u, list.size()); EXPECT_EQ(kChangeGuid1, list[0].change_guid()); - EXPECT_EQ(fred_id, list[0].id()); + EXPECT_EQ(fred_network_id(), list[0].id()); EXPECT_EQ(kChangeGuid2, list[1].change_guid()); - EXPECT_EQ(mango_id, list[1].id()); + EXPECT_EQ(mango_network_id(), list[1].id()); - tracker()->MarkComplete(kChangeGuid1, fred_id); + tracker()->MarkComplete(kChangeGuid1, fred_network_id()); list = tracker()->GetPendingUpdates(); EXPECT_EQ(1u, list.size()); EXPECT_EQ(kChangeGuid2, list[0].change_guid()); - EXPECT_EQ(mango_id, list[0].id()); + EXPECT_EQ(mango_network_id(), list[0].id()); } TEST_F(PendingNetworkConfigurationTrackerImplTest, TestGetPendingUpdate) { sync_pb::WifiConfigurationSpecificsData specifics = - CreateSpecifics(kFredSsid); - NetworkIdentifier fred_id(kFredSsid, shill::kSecurityPsk); - NetworkIdentifier mango_id(kMangoSsid, shill::kSecurityPsk); - tracker()->TrackPendingUpdate(kChangeGuid1, fred_id, specifics); + GenerateTestWifiSpecifics(fred_network_id()); + tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), specifics); - AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_id, + AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id(), /*completed_attempts=*/0, specifics); - EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid2, mango_id)); + EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid2, mango_network_id())); } TEST_F(PendingNetworkConfigurationTrackerImplTest, TestRetryCounting) { - NetworkIdentifier id(kFredSsid, shill::kSecurityPsk); - tracker()->TrackPendingUpdate(kChangeGuid1, id, + tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), /*specifics=*/base::nullopt); - AssertTrackerHasMatchingUpdate(kChangeGuid1, id); + AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id()); EXPECT_EQ(1u, GetPref()->DictSize()); - EXPECT_EQ( - 0, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts()); - tracker()->IncrementCompletedAttempts(kChangeGuid1, id); - tracker()->IncrementCompletedAttempts(kChangeGuid1, id); - tracker()->IncrementCompletedAttempts(kChangeGuid1, id); - EXPECT_EQ( - 3, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts()); - tracker()->IncrementCompletedAttempts(kChangeGuid1, id); - tracker()->IncrementCompletedAttempts(kChangeGuid1, id); - EXPECT_EQ( - 5, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts()); + EXPECT_EQ(0, tracker() + ->GetPendingUpdate(kChangeGuid1, fred_network_id()) + ->completed_attempts()); + tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id()); + tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id()); + tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id()); + EXPECT_EQ(3, tracker() + ->GetPendingUpdate(kChangeGuid1, fred_network_id()) + ->completed_attempts()); + tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id()); + tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id()); + EXPECT_EQ(5, tracker() + ->GetPendingUpdate(kChangeGuid1, fred_network_id()) + ->completed_attempts()); } } // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/test_data_generator.cc b/chromeos/components/sync_wifi/test_data_generator.cc new file mode 100644 index 0000000..5ef91b8 --- /dev/null +++ b/chromeos/components/sync_wifi/test_data_generator.cc
@@ -0,0 +1,44 @@ +// Copyright 2019 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/strings/string_number_conversions.h" +#include "chromeos/components/sync_wifi/network_identifier.h" +#include "components/sync/protocol/wifi_configuration_specifics.pb.h" +#include "third_party/cros_system_api/dbus/shill/dbus-constants.h" + +namespace sync_wifi { + +NetworkIdentifier GeneratePskNetworkId(const std::string& ssid) { + return NetworkIdentifier(base::HexEncode(ssid.data(), ssid.size()), + shill::kSecurityPsk); +} + +sync_pb::WifiConfigurationSpecificsData GenerateTestWifiSpecifics( + const NetworkIdentifier& id) { + sync_pb::WifiConfigurationSpecificsData specifics; + specifics.set_hex_ssid(id.hex_ssid()); + + if (id.security_type() == shill::kSecurityPsk) { + specifics.set_security_type( + sync_pb::WifiConfigurationSpecificsData::SECURITY_TYPE_PSK); + } else if (id.security_type() == shill::kSecurityWep) { + specifics.set_security_type( + sync_pb::WifiConfigurationSpecificsData::SECURITY_TYPE_WEP); + } else { + NOTREACHED(); + } + specifics.set_passphrase("password"); + specifics.set_automatically_connect( + sync_pb::WifiConfigurationSpecificsData::AUTOMATICALLY_CONNECT_ENABLED); + specifics.set_is_preferred( + sync_pb::WifiConfigurationSpecificsData::IS_PREFERRED_ENABLED); + specifics.set_metered( + sync_pb::WifiConfigurationSpecificsData::METERED_OPTION_AUTO); + specifics.mutable_proxy_configuration()->set_proxy_option( + sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration:: + PROXY_OPTION_DISABLED); + return specifics; +} + +} // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/test_data_generator.h b/chromeos/components/sync_wifi/test_data_generator.h new file mode 100644 index 0000000..328c2d24 --- /dev/null +++ b/chromeos/components/sync_wifi/test_data_generator.h
@@ -0,0 +1,24 @@ +// Copyright 2019 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_SYNC_WIFI_TEST_DATA_GENERATOR_H_ +#define CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_DATA_GENERATOR_H_ + +#include "components/sync/protocol/wifi_configuration_specifics.pb.h" + +namespace sync_wifi { + +class NetworkIdentifier; + +// Creates a NetworkIdentifier with PSK security for the given |ssid|. +NetworkIdentifier GeneratePskNetworkId(const std::string& ssid); + +// Creates a proto with default values and sets the hex_ssid and security_type +// based on the input |id|. +sync_pb::WifiConfigurationSpecificsData GenerateTestWifiSpecifics( + const NetworkIdentifier& id); + +} // namespace sync_wifi + +#endif // CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_DATA_GENERATOR_H_
diff --git a/chromeos/components/sync_wifi/test_specifics_generator.h b/chromeos/components/sync_wifi/test_specifics_generator.h deleted file mode 100644 index 4823931..0000000 --- a/chromeos/components/sync_wifi/test_specifics_generator.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2019 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/sync/protocol/wifi_configuration_specifics.pb.h" - -#ifndef CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_SPECIFICS_GENERATOR_H_ -#define CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_SPECIFICS_GENERATOR_H_ - -namespace sync_wifi { - -namespace { - -sync_pb::WifiConfigurationSpecificsData CreateSpecifics( - const std::string& ssid) { - sync_pb::WifiConfigurationSpecificsData specifics; - specifics.set_hex_ssid(ssid); - specifics.set_security_type( - sync_pb::WifiConfigurationSpecificsData::SECURITY_TYPE_PSK); - specifics.set_passphrase("password"); - specifics.set_automatically_connect( - sync_pb::WifiConfigurationSpecificsData::AUTOMATICALLY_CONNECT_ENABLED); - specifics.set_is_preferred( - sync_pb::WifiConfigurationSpecificsData::IS_PREFERRED_ENABLED); - specifics.set_metered( - sync_pb::WifiConfigurationSpecificsData::METERED_OPTION_AUTO); - sync_pb::WifiConfigurationSpecificsData_ProxyConfiguration proxy_config; - proxy_config.set_proxy_option(sync_pb::WifiConfigurationSpecificsData:: - ProxyConfiguration::PROXY_OPTION_DISABLED); - specifics.mutable_proxy_configuration()->CopyFrom(proxy_config); - return specifics; -} - -} // namespace - -} // namespace sync_wifi - -#endif // CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_SPECIFICS_GENERATOR_H_
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc index 99e872c..35adc7a 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc
@@ -189,12 +189,12 @@ weak_ptr_factory_.GetWeakPtr())); } -std::vector<std::string> WifiConfigurationBridge::GetAllSsidsForTesting() { - std::vector<std::string> ssids; +std::vector<NetworkIdentifier> WifiConfigurationBridge::GetAllIdsForTesting() { + std::vector<NetworkIdentifier> ids; for (const auto& entry : entries_) - ssids.push_back(entry.second.hex_ssid()); + ids.push_back(NetworkIdentifier::FromProto(entry.second)); - return ssids; + return ids; } } // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.h b/chromeos/components/sync_wifi/wifi_configuration_bridge.h index f7fe8d95..0877aec9 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge.h +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.h
@@ -50,7 +50,7 @@ std::string GetStorageKey(const syncer::EntityData& entity_data) override; // Comes from |entries_| the in-memory map. - std::vector<std::string> GetAllSsidsForTesting(); + std::vector<NetworkIdentifier> GetAllIdsForTesting(); private: void Commit(std::unique_ptr<syncer::ModelTypeStore::WriteBatch> batch);
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc index bc59519..6f6d707 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
@@ -13,7 +13,7 @@ #include "base/test/task_environment.h" #include "chromeos/components/sync_wifi/network_identifier.h" #include "chromeos/components/sync_wifi/synced_network_updater.h" -#include "chromeos/components/sync_wifi/test_specifics_generator.h" +#include "chromeos/components/sync_wifi/test_data_generator.h" #include "components/sync/model/entity_change.h" #include "components/sync/model/metadata_batch.h" #include "components/sync/model/mock_model_type_change_processor.h" @@ -51,20 +51,19 @@ return entity_data; } -bool VectorContainsString(std::vector<std::string> v, std::string s) { - return std::find(v.begin(), v.end(), s) != v.end(); +bool ProtoVectorContainsId( + const std::vector<sync_pb::WifiConfigurationSpecificsData>& protos, + NetworkIdentifier id) { + return std::find_if( + protos.begin(), protos.end(), + [&id](const sync_pb::WifiConfigurationSpecificsData& specifics) { + return NetworkIdentifier::FromProto(specifics) == id; + }) != protos.end(); } -bool VectorContainsSsid( - const std::vector<sync_pb::WifiConfigurationSpecificsData>& v, - std::string s) { - for (sync_pb::WifiConfigurationSpecificsData specifics : v) { - if (specifics.hex_ssid() == s) - return true; - } - return false; -} - +// Implementation of SyncedNetworkUpdater. This class takes add/update/delete +// network requests and stores them in its internal data structures without +// actually updating anything external. class TestSyncedNetworkUpdater : public SyncedNetworkUpdater { public: TestSyncedNetworkUpdater() = default; @@ -134,6 +133,10 @@ return synced_network_updater_.get(); } + const NetworkIdentifier& woof_network_id() const { return woof_network_id_; } + + const NetworkIdentifier& meow_network_id() const { return meow_network_id_; } + private: base::test::TaskEnvironment task_environment_; @@ -145,79 +148,89 @@ std::unique_ptr<TestSyncedNetworkUpdater> synced_network_updater_; + const NetworkIdentifier woof_network_id_ = GeneratePskNetworkId(kSsidWoof); + + const NetworkIdentifier meow_network_id_ = GeneratePskNetworkId(kSsidMeow); + DISALLOW_COPY_AND_ASSIGN(WifiConfigurationBridgeTest); }; TEST_F(WifiConfigurationBridgeTest, InitWithTwoNetworksFromServer) { syncer::EntityChangeList remote_input; - WifiConfigurationSpecificsData entry1 = CreateSpecifics(kSsidMeow); - WifiConfigurationSpecificsData entry2 = CreateSpecifics(kSsidWoof); + WifiConfigurationSpecificsData entry1 = + GenerateTestWifiSpecifics(meow_network_id()); + WifiConfigurationSpecificsData entry2 = + GenerateTestWifiSpecifics(woof_network_id()); remote_input.push_back(syncer::EntityChange::CreateAdd( - kSsidMeow, GenerateWifiEntityData(entry1))); + meow_network_id().SerializeToString(), GenerateWifiEntityData(entry1))); remote_input.push_back(syncer::EntityChange::CreateAdd( - kSsidWoof, GenerateWifiEntityData(entry2))); + woof_network_id().SerializeToString(), GenerateWifiEntityData(entry2))); bridge()->MergeSyncData( std::make_unique<syncer::InMemoryMetadataChangeList>(), std::move(remote_input)); - std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting(); - EXPECT_EQ(2u, ssids.size()); - EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow)); - EXPECT_TRUE(VectorContainsString(ssids, kSsidWoof)); + std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting(); + EXPECT_EQ(2u, ids.size()); + EXPECT_TRUE(base::Contains(ids, meow_network_id())); + EXPECT_TRUE(base::Contains(ids, woof_network_id())); const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks = synced_network_updater()->add_or_update_calls(); EXPECT_EQ(2u, networks.size()); - EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow)); - EXPECT_TRUE(VectorContainsSsid(networks, kSsidWoof)); + EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id())); + EXPECT_TRUE(ProtoVectorContainsId(networks, woof_network_id())); } TEST_F(WifiConfigurationBridgeTest, ApplySyncChangesAddTwoSpecifics) { - const WifiConfigurationSpecificsData specifics1 = CreateSpecifics(kSsidMeow); - const WifiConfigurationSpecificsData specifics2 = CreateSpecifics(kSsidWoof); + const WifiConfigurationSpecificsData specifics1 = + GenerateTestWifiSpecifics(meow_network_id()); + const WifiConfigurationSpecificsData specifics2 = + GenerateTestWifiSpecifics(woof_network_id()); base::Optional<syncer::ModelError> error = bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), CreateEntityAddList({specifics1, specifics2})); EXPECT_FALSE(error); - std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting(); - EXPECT_EQ(2u, ssids.size()); - EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow)); - EXPECT_TRUE(VectorContainsString(ssids, kSsidWoof)); + std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting(); + EXPECT_EQ(2u, ids.size()); + EXPECT_TRUE(base::Contains(ids, meow_network_id())); + EXPECT_TRUE(base::Contains(ids, woof_network_id())); const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks = synced_network_updater()->add_or_update_calls(); EXPECT_EQ(2u, networks.size()); - EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow)); - EXPECT_TRUE(VectorContainsSsid(networks, kSsidWoof)); + EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id())); + EXPECT_TRUE(ProtoVectorContainsId(networks, woof_network_id())); } TEST_F(WifiConfigurationBridgeTest, ApplySyncChangesOneAdd) { - WifiConfigurationSpecificsData entry = CreateSpecifics(kSsidMeow); + WifiConfigurationSpecificsData entry = + GenerateTestWifiSpecifics(meow_network_id()); syncer::EntityChangeList add_changes; add_changes.push_back(syncer::EntityChange::CreateAdd( - kSsidMeow, GenerateWifiEntityData(entry))); + meow_network_id().SerializeToString(), GenerateWifiEntityData(entry))); bridge()->ApplySyncChanges( std::make_unique<syncer::InMemoryMetadataChangeList>(), std::move(add_changes)); - std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting(); - EXPECT_EQ(1u, ssids.size()); - EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow)); + std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting(); + EXPECT_EQ(1u, ids.size()); + EXPECT_TRUE(base::Contains(ids, meow_network_id())); const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks = synced_network_updater()->add_or_update_calls(); EXPECT_EQ(1u, networks.size()); - EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow)); + EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id())); } TEST_F(WifiConfigurationBridgeTest, ApplySyncChangesOneDeletion) { - WifiConfigurationSpecificsData entry = CreateSpecifics(kSsidMeow); + WifiConfigurationSpecificsData entry = + GenerateTestWifiSpecifics(meow_network_id()); NetworkIdentifier id = NetworkIdentifier::FromProto(entry); syncer::EntityChangeList add_changes; @@ -227,14 +240,14 @@ bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), std::move(add_changes)); - std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting(); - EXPECT_EQ(1u, ssids.size()); - EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow)); + std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting(); + EXPECT_EQ(1u, ids.size()); + EXPECT_TRUE(base::Contains(ids, meow_network_id())); const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks = synced_network_updater()->add_or_update_calls(); EXPECT_EQ(1u, networks.size()); - EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow)); + EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id())); syncer::EntityChangeList delete_changes; delete_changes.push_back( @@ -242,7 +255,7 @@ bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(), std::move(delete_changes)); - EXPECT_TRUE(bridge()->GetAllSsidsForTesting().empty()); + EXPECT_TRUE(bridge()->GetAllIdsForTesting().empty()); const std::vector<NetworkIdentifier>& removed_networks = synced_network_updater()->remove_calls();
diff --git a/chromeos/dbus/concierge_client.cc b/chromeos/dbus/concierge_client.cc index 5220b44..13a37a87 100644 --- a/chromeos/dbus/concierge_client.cc +++ b/chromeos/dbus/concierge_client.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/location.h" -#include "base/observer_list.h" #include "base/threading/thread_task_runner_handle.h" #include "dbus/bus.h" #include "dbus/message.h" @@ -26,6 +25,14 @@ ~ConciergeClientImpl() override = default; + void AddObserver(Observer* observer) override { + observer_list_.AddObserver(observer); + } + + void RemoveObserver(Observer* observer) override { + observer_list_.RemoveObserver(observer); + } + void AddVmObserver(VmObserver* observer) override { vm_observer_list_.AddObserver(observer); } @@ -224,6 +231,9 @@ LOG(ERROR) << "Unable to get dbus proxy for " << concierge::kVmConciergeServiceName; } + concierge_proxy_->SetNameOwnerChangedCallback( + base::BindRepeating(&ConciergeClientImpl::NameOwnerChangedReceived, + weak_ptr_factory_.GetWeakPtr())); concierge_proxy_->ConnectToSignal( concierge::kVmConciergeInterface, concierge::kVmStartedSignal, base::BindRepeating(&ConciergeClientImpl::OnVmStartedSignal, @@ -291,6 +301,17 @@ std::move(callback).Run(std::move(reponse_proto)); } + void NameOwnerChangedReceived(const std::string& old_owner, + const std::string& new_owner) { + const bool restarted = !new_owner.empty(); + for (auto& observer : observer_list_) { + if (restarted) + observer.ConciergeServiceRestarted(); + else + observer.ConciergeServiceStopped(); + } + } + void OnVmStartedSignal(dbus::Signal* signal) { DCHECK_EQ(signal->GetInterface(), concierge::kVmConciergeInterface); DCHECK_EQ(signal->GetMember(), concierge::kVmStartedSignal); @@ -375,6 +396,7 @@ dbus::ObjectProxy* concierge_proxy_ = nullptr; + base::ObserverList<Observer> observer_list_; base::ObserverList<VmObserver>::Unchecked vm_observer_list_; base::ObserverList<ContainerObserver>::Unchecked container_observer_list_; base::ObserverList<DiskImageObserver>::Unchecked disk_image_observer_list_;
diff --git a/chromeos/dbus/concierge_client.h b/chromeos/dbus/concierge_client.h index 7982e4f6..3c1e2f84 100644 --- a/chromeos/dbus/concierge_client.h +++ b/chromeos/dbus/concierge_client.h
@@ -9,6 +9,7 @@ #include "base/component_export.h" #include "base/files/scoped_file.h" +#include "base/observer_list.h" #include "chromeos/dbus/concierge/service.pb.h" #include "chromeos/dbus/dbus_client.h" #include "chromeos/dbus/dbus_method_call_status.h" @@ -20,6 +21,15 @@ // start and stop VMs, as well as for disk image management. class COMPONENT_EXPORT(CHROMEOS_DBUS) ConciergeClient : public DBusClient { public: + // Used for observing Concierge service itself. + class Observer : public base::CheckedObserver { + public: + // Called when Concierge service exits. + virtual void ConciergeServiceStopped() = 0; + // Called when Concierge service is either started or restarted. + virtual void ConciergeServiceRestarted() = 0; + }; + // Used for observing VMs starting and stopping. class VmObserver { public: @@ -63,6 +73,11 @@ virtual ~DiskImageObserver() = default; }; + // Adds an observer for monitoring Concierge service. + virtual void AddObserver(Observer* observer) = 0; + // Removes an observer if added. + virtual void RemoveObserver(Observer* observer) = 0; + // Adds an observer for VM start and stop. virtual void AddVmObserver(VmObserver* observer) = 0; // Removes an observer if added.
diff --git a/chromeos/dbus/fake_concierge_client.cc b/chromeos/dbus/fake_concierge_client.cc index 6adf915..9f1da684 100644 --- a/chromeos/dbus/fake_concierge_client.cc +++ b/chromeos/dbus/fake_concierge_client.cc
@@ -18,6 +18,14 @@ } FakeConciergeClient::~FakeConciergeClient() = default; +void FakeConciergeClient::AddObserver(Observer* observer) { + observer_list_.AddObserver(observer); +} + +void FakeConciergeClient::RemoveObserver(Observer* observer) { + observer_list_.RemoveObserver(observer); +} + void FakeConciergeClient::AddVmObserver(VmObserver* observer) { vm_observer_list_.AddObserver(observer); }
diff --git a/chromeos/dbus/fake_concierge_client.h b/chromeos/dbus/fake_concierge_client.h index 5baf99e..8a169f6 100644 --- a/chromeos/dbus/fake_concierge_client.h +++ b/chromeos/dbus/fake_concierge_client.h
@@ -22,6 +22,8 @@ ~FakeConciergeClient() override; // ConciergeClient: + void AddObserver(Observer* observer) override; + void RemoveObserver(Observer* observer) override; void AddVmObserver(VmObserver* observer) override; void RemoveVmObserver(VmObserver* observer) override; void AddContainerObserver(ContainerObserver* observer) override; @@ -277,6 +279,8 @@ std::vector<vm_tools::concierge::DiskImageStatusResponse> disk_image_status_signals_; + base::ObserverList<Observer> observer_list_; + base::ObserverList<VmObserver>::Unchecked vm_observer_list_; base::ObserverList<ContainerObserver>::Unchecked container_observer_list_;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index 4d18717..5738c94 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -1168,27 +1168,7 @@ if (assistant_state()->arc_play_store_enabled().has_value()) SetArcPlayStoreEnabled(assistant_state()->arc_play_store_enabled().value()); - if (assistant::features::IsAlarmTimerManagerEnabled()) { - RegisterAlarmsTimersListener(); - } -} - -void AssistantManagerServiceImpl::OnTimerSoundingStarted() { - if (assistant::features::IsAlarmTimerManagerEnabled()) - return; - - ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnTimerSoundingStarted); - if (assistant_alarm_timer_controller()) - assistant_alarm_timer_controller()->OnTimerSoundingStarted(); -} - -void AssistantManagerServiceImpl::OnTimerSoundingFinished() { - if (assistant::features::IsAlarmTimerManagerEnabled()) - return; - - ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnTimerSoundingFinished); - if (assistant_alarm_timer_controller()) - assistant_alarm_timer_controller()->OnTimerSoundingFinished(); + RegisterAlarmsTimersListener(); } void AssistantManagerServiceImpl::OnAndroidAppListRefreshed(
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index dd0747c..3aa5c20 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -190,8 +190,6 @@ // assistant_client::DeviceStateListener overrides: void OnStartFinished() override; - void OnTimerSoundingStarted() override; - void OnTimerSoundingFinished() override; // mojom::AppListEventSubscriber overrides: void OnAndroidAppListRefreshed(
diff --git a/chromeos/services/assistant/public/features.cc b/chromeos/services/assistant/public/features.cc index feb43c5..588eee7a 100644 --- a/chromeos/services/assistant/public/features.cc +++ b/chromeos/services/assistant/public/features.cc
@@ -55,19 +55,10 @@ const base::Feature kEnableStereoAudioInput{"AssistantEnableStereoAudioInput", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kTimerNotification{"ChromeOSAssistantTimerNotification", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kEnableTextQueriesWithClientDiscourseContext{ "AssistantEnableTextQueriesWithClientDiscourseContext", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kTimerTicks{"ChromeOSAssistantTimerTicks", - base::FEATURE_ENABLED_BY_DEFAULT}; - -const base::Feature kEnableAssistantAlarmTimerManager{ - "EnableAssistantAlarmTimerManager", base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kEnablePowerManager{"ChromeOSAssistantEnablePowerManager", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -94,10 +85,6 @@ kAssistantProactiveSuggestionsTimeoutThresholdMillis.Get()); } -bool IsAlarmTimerManagerEnabled() { - return base::FeatureList::IsEnabled(kEnableAssistantAlarmTimerManager); -} - bool IsAppSupportEnabled() { return base::FeatureList::IsEnabled( assistant::features::kAssistantAppSupport); @@ -153,17 +140,6 @@ base::FeatureList::IsEnabled(kAssistantAudioEraser); } -bool IsTimerNotificationEnabled() { - return base::FeatureList::IsEnabled(kTimerNotification); -} - -bool IsTimerTicksEnabled() { - // The timer ticks feature is dependent on new notification add/remove logic - // that is tied to new events delivered from the AlarmTimerManager API. - return IsAlarmTimerManagerEnabled() && - base::FeatureList::IsEnabled(kTimerTicks); -} - bool IsWarmerWelcomeEnabled() { return base::FeatureList::IsEnabled(kAssistantWarmerWelcomeFeature); }
diff --git a/chromeos/services/assistant/public/features.h b/chromeos/services/assistant/public/features.h index 60cc77f..5a37623 100644 --- a/chromeos/services/assistant/public/features.h +++ b/chromeos/services/assistant/public/features.h
@@ -77,14 +77,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnableStereoAudioInput; -// Enables timer notifications. -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) -extern const base::Feature kTimerNotification; - -// Enables Assistant alarm timer manager integration. -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) -extern const base::Feature kEnableAssistantAlarmTimerManager; - // Enables power management features i.e. Wake locks and wake up alarms. COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnablePowerManager; @@ -93,14 +85,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnableTextQueriesWithClientDiscourseContext; -// Enables timer ticks. This feature causes alarms/timers tracked by the -// AssistantAlarmTimerController to tick at a fixed interval, delivering updates -// to AssistantAlarmTimerModelObservers of time remaining/elapsed since expiry. -// When enabled in conjunction with |kTimerNotification|, Assistant alarm/timer -// notifications will be updated at each tick. -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) -extern const base::Feature kTimerTicks; - COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) int GetProactiveSuggestionsMaxWidth(); @@ -110,8 +94,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) base::TimeDelta GetProactiveSuggestionsTimeoutThreshold(); -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAlarmTimerManagerEnabled(); - COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAppSupportEnabled(); COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAudioEraserEnabled(); @@ -143,10 +125,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsStereoAudioInputEnabled(); -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsTimerNotificationEnabled(); - -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsTimerTicksEnabled(); - COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsWarmerWelcomeEnabled(); } // namespace features
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc index 3468381..38d6fb9 100644 --- a/chromeos/services/assistant/service.cc +++ b/chromeos/services/assistant/service.cc
@@ -476,11 +476,9 @@ BindAssistant(remote_for_controller.InitWithNewPipeAndPassReceiver()); assistant_controller_->SetAssistant(std::move(remote_for_controller)); - if (features::IsTimerNotificationEnabled()) { - // Bind to the AssistantAlarmTimerController in ash. - client_->RequestAssistantAlarmTimerController( - assistant_alarm_timer_controller_.BindNewPipeAndPassReceiver()); - } + // Bind to the AssistantAlarmTimerController in ash. + client_->RequestAssistantAlarmTimerController( + assistant_alarm_timer_controller_.BindNewPipeAndPassReceiver()); // Bind to the AssistantNotificationController in ash. client_->RequestAssistantNotificationController(
diff --git a/components/arc/video_accelerator/arc_video_accelerator_util.cc b/components/arc/video_accelerator/arc_video_accelerator_util.cc index 3e463f3d..0faa20a 100644 --- a/components/arc/video_accelerator/arc_video_accelerator_util.cc +++ b/components/arc/video_accelerator/arc_video_accelerator_util.cc
@@ -4,82 +4,17 @@ #include "components/arc/video_accelerator/arc_video_accelerator_util.h" -#include <sys/types.h> -#include <unistd.h> - #include "base/files/file_util.h" #include "base/files/platform_file.h" #include "base/numerics/checked_math.h" #include "base/numerics/safe_conversions.h" #include "media/base/video_frame.h" +#include "media/gpu/buffer_validation.h" #include "media/gpu/macros.h" #include "mojo/public/cpp/system/platform_handle.h" namespace arc { -namespace { - -bool VerifyGpuMemoryBufferHandle(media::VideoPixelFormat pixel_format, - const gfx::Size& coded_size, - const gfx::GpuMemoryBufferHandle& gmb_handle) { - if (gmb_handle.type != gfx::NATIVE_PIXMAP) { - VLOGF(1) << "Unexpected GpuMemoryBufferType: " << gmb_handle.type; - return false; - } - - const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format); - if (num_planes != gmb_handle.native_pixmap_handle.planes.size() || - num_planes == 0) { - VLOGF(1) << "Invalid number of dmabuf planes passed: " - << gmb_handle.native_pixmap_handle.planes.size() - << ", expected: " << num_planes; - return false; - } - - // Strides monotonically decrease. - for (size_t i = 1; i < num_planes; i++) { - if (gmb_handle.native_pixmap_handle.planes[i - 1].stride < - gmb_handle.native_pixmap_handle.planes[i].stride) { - return false; - } - } - - for (size_t i = 0; i < num_planes; i++) { - const auto& plane = gmb_handle.native_pixmap_handle.planes[i]; - DVLOGF(4) << "Plane " << i << ", offset: " << plane.offset - << ", stride: " << plane.stride; - - size_t file_size_in_bytes; - if (!plane.fd.is_valid() || - !GetFileSize(plane.fd.get(), &file_size_in_bytes)) - return false; - - size_t plane_height = - media::VideoFrame::Rows(i, pixel_format, coded_size.height()); - base::CheckedNumeric<size_t> min_plane_size = - base::CheckMul(plane.stride, plane_height); - if (!min_plane_size.IsValid() || min_plane_size.ValueOrDie() > plane.size) { - VLOGF(1) << "Invalid strides/sizes"; - return false; - } - - // Check |offset| + (the size of a plane) on each plane is not larger than - // |file_size_in_bytes|. This ensures we don't access out of a buffer - // referred by |fd|. - base::CheckedNumeric<size_t> min_buffer_size = - base::CheckAdd(plane.offset, plane.size); - if (!min_buffer_size.IsValid() || - min_buffer_size.ValueOrDie() > file_size_in_bytes) { - VLOGF(1) << "Invalid strides/offsets"; - return false; - } - } - - return true; -} - -} // namespace - base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle) { if (!handle.is_valid()) { VLOGF(1) << "Handle is invalid"; @@ -97,31 +32,6 @@ return base::ScopedFD(platform_file); } -bool GetFileSize(const int fd, size_t* size) { - if (fd < 0) { - VLOGF(1) << "Invalid file descriptor"; - return false; - } - - off_t fd_size = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); - if (fd_size < 0u) { - VPLOGF(1) << "Fail to find the size of fd"; - return false; - } - - if (!base::IsValueInRangeForNumericType<size_t>(fd_size)) { - VLOGF(1) << "fd_size is out of range of size_t" - << ", size=" << size - << ", size_t max=" << std::numeric_limits<size_t>::max() - << ", size_t min=" << std::numeric_limits<size_t>::min(); - return false; - } - - *size = static_cast<size_t>(fd_size); - return true; -} - std::vector<base::ScopedFD> DuplicateFD(base::ScopedFD fd, size_t num_fds) { if (!fd.is_valid()) { VLOGF(1) << "Input fd is not valid"; @@ -204,8 +114,9 @@ stride, offset, size, std::move(scoped_fds[i])); } - if (!VerifyGpuMemoryBufferHandle(pixel_format, coded_size, gmb_handle)) + if (!media::VerifyGpuMemoryBufferHandle(pixel_format, coded_size, gmb_handle)) return base::nullopt; + return gmb_handle; }
diff --git a/components/arc/video_accelerator/arc_video_accelerator_util.h b/components/arc/video_accelerator/arc_video_accelerator_util.h index d832c08..28d6730f 100644 --- a/components/arc/video_accelerator/arc_video_accelerator_util.h +++ b/components/arc/video_accelerator/arc_video_accelerator_util.h
@@ -23,9 +23,6 @@ // Returns invalid ScopedFD on failure. base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle); -// Return the file size of |fd| in bytes. -bool GetFileSize(const int fd, size_t* size); - // Return a list of duplicated |fd|. The size of list is |num_fds|. Return an // empty list if duplicatation fails. std::vector<base::ScopedFD> DuplicateFD(base::ScopedFD fd, size_t num_fds);
diff --git a/components/arc/video_accelerator/decoder_buffer.cc b/components/arc/video_accelerator/decoder_buffer.cc index e06bd23c..9ad9a72 100644 --- a/components/arc/video_accelerator/decoder_buffer.cc +++ b/components/arc/video_accelerator/decoder_buffer.cc
@@ -11,6 +11,7 @@ #include "base/unguessable_token.h" #include "components/arc/video_accelerator/arc_video_accelerator_util.h" #include "media/base/decoder_buffer.h" +#include "media/gpu/buffer_validation.h" namespace arc { @@ -52,7 +53,8 @@ } size_t file_size = 0; - if (!GetFileSize(handle_fd.get(), &file_size) || file_size < required_size) { + if (!media::GetFileSize(handle_fd.get(), &file_size) || + file_size < required_size) { VLOG(1) << "File size(" << file_size << ") is smaller than required size(" << required_size << ")."; return nullptr;
diff --git a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc index ba07a3dc..fdb58e3 100644 --- a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc +++ b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
@@ -13,6 +13,7 @@ #include "components/arc/video_accelerator/protected_buffer_manager.h" #include "media/base/video_frame.h" #include "media/base/video_types.h" +#include "media/gpu/buffer_validation.h" #include "media/gpu/gpu_video_decode_accelerator_factory.h" #include "media/gpu/macros.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -370,7 +371,7 @@ } } else { size_t handle_size; - if (!GetFileSize(handle_fd.get(), &handle_size)) { + if (!media::GetFileSize(handle_fd.get(), &handle_size)) { client_->NotifyError( mojom::VideoDecodeAccelerator::Result::INVALID_ARGUMENT); return;
diff --git a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc index 1e51c700..8641d543 100644 --- a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc +++ b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
@@ -17,6 +17,7 @@ #include "media/base/color_plane_layout.h" #include "media/base/format_utils.h" #include "media/base/video_types.h" +#include "media/gpu/buffer_validation.h" #include "media/gpu/gpu_video_encode_accelerator_factory.h" #include "media/gpu/macros.h" #include "mojo/public/cpp/bindings/strong_binding.h" @@ -330,7 +331,7 @@ } size_t shmem_size; - if (!GetFileSize(fd.get(), &shmem_size)) { + if (!media::GetFileSize(fd.get(), &shmem_size)) { client_->NotifyError(Error::kInvalidArgumentError); return; }
diff --git a/components/autofill/core/common/form_data.cc b/components/autofill/core/common/form_data.cc index 4df9e97..8f7ab442 100644 --- a/components/autofill/core/common/form_data.cc +++ b/components/autofill/core/common/form_data.cc
@@ -70,15 +70,21 @@ } // namespace FormData::FormData() = default; + FormData::FormData(const FormData&) = default; + FormData& FormData::operator=(const FormData&) = default; + FormData::FormData(FormData&&) = default; + FormData& FormData::operator=(FormData&&) = default; + FormData::~FormData() = default; bool FormData::SameFormAs(const FormData& form) const { - if (name != form.name || url != form.url || action != form.action || - is_form_tag != form.is_form_tag || + if (name != form.name || id_attribute != form.id_attribute || + name_attribute != form.name_attribute || url != form.url || + action != form.action || is_form_tag != form.is_form_tag || is_formless_checkout != form.is_formless_checkout || fields.size() != form.fields.size()) return false; @@ -90,8 +96,9 @@ } bool FormData::SimilarFormAs(const FormData& form) const { - if (name != form.name || url != form.url || action != form.action || - is_form_tag != form.is_form_tag || + if (name != form.name || id_attribute != form.id_attribute || + name_attribute != form.name_attribute || url != form.url || + action != form.action || is_form_tag != form.is_form_tag || is_formless_checkout != form.is_formless_checkout || fields.size() != form.fields.size()) return false; @@ -103,7 +110,9 @@ } bool FormData::DynamicallySameFormAs(const FormData& form) const { - if (name != form.name || fields.size() != form.fields.size()) + if (name != form.name || id_attribute != form.id_attribute || + name_attribute != form.name_attribute || + fields.size() != form.fields.size()) return false; for (size_t i = 0; i < fields.size(); ++i) { if (!fields[i].DynamicallySameFieldAs(form.fields[i])) @@ -113,7 +122,9 @@ } bool FormData::operator==(const FormData& form) const { - return name == form.name && url == form.url && action == form.action && + return name == form.name && id_attribute == form.id_attribute && + name_attribute == form.name_attribute && url == form.url && + action == form.action && unique_renderer_id == form.unique_renderer_id && submission_event == form.submission_event && is_form_tag == form.is_form_tag && @@ -127,10 +138,11 @@ } bool FormData::operator<(const FormData& form) const { - return std::tie(name, url, action, is_form_tag, is_formless_checkout, - fields) < std::tie(form.name, form.url, form.action, - form.is_form_tag, - form.is_formless_checkout, form.fields); + return std::tie(name, id_attribute, name_attribute, url, action, is_form_tag, + is_formless_checkout, fields) < + std::tie(form.name, form.id_attribute, form.name_attribute, form.url, + form.action, form.is_form_tag, form.is_formless_checkout, + form.fields); } std::ostream& operator<<(std::ostream& os, const FormData& form) {
diff --git a/components/autofill/core/common/form_data_predictions.cc b/components/autofill/core/common/form_data_predictions.cc index 9c71a97..bc97e87 100644 --- a/components/autofill/core/common/form_data_predictions.cc +++ b/components/autofill/core/common/form_data_predictions.cc
@@ -6,23 +6,24 @@ namespace autofill { -FormDataPredictions::FormDataPredictions() { -} +FormDataPredictions::FormDataPredictions() = default; -FormDataPredictions::FormDataPredictions(const FormDataPredictions& other) - : data(other.data), - signature(other.signature), - fields(other.fields) { -} +FormDataPredictions::FormDataPredictions(const FormDataPredictions&) = default; -FormDataPredictions::~FormDataPredictions() { -} +FormDataPredictions& FormDataPredictions::operator=( + const FormDataPredictions&) = default; + +FormDataPredictions::FormDataPredictions(FormDataPredictions&&) = default; + +FormDataPredictions& FormDataPredictions::operator=(FormDataPredictions&&) = + default; + +FormDataPredictions::~FormDataPredictions() = default; bool FormDataPredictions::operator==( const FormDataPredictions& predictions) const { return (data.SameFormAs(predictions.data) && - signature == predictions.signature && - fields == predictions.fields); + signature == predictions.signature && fields == predictions.fields); } bool FormDataPredictions::operator!=(
diff --git a/components/autofill/core/common/form_data_predictions.h b/components/autofill/core/common/form_data_predictions.h index 164778a5..cc5f9cf 100644 --- a/components/autofill/core/common/form_data_predictions.h +++ b/components/autofill/core/common/form_data_predictions.h
@@ -23,7 +23,10 @@ std::vector<FormFieldDataPredictions> fields; FormDataPredictions(); - FormDataPredictions(const FormDataPredictions& other); + FormDataPredictions(const FormDataPredictions&); + FormDataPredictions& operator=(const FormDataPredictions&); + FormDataPredictions(FormDataPredictions&&); + FormDataPredictions& operator=(FormDataPredictions&&); ~FormDataPredictions(); // Added for the sake of testing.
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc index fd68782..1a804330 100644 --- a/components/autofill/core/common/form_field_data.cc +++ b/components/autofill/core/common/form_field_data.cc
@@ -144,7 +144,13 @@ FormFieldData::FormFieldData() = default; -FormFieldData::FormFieldData(const FormFieldData& other) = default; +FormFieldData::FormFieldData(const FormFieldData&) = default; + +FormFieldData& FormFieldData::operator=(const FormFieldData&) = default; + +FormFieldData::FormFieldData(FormFieldData&&) = default; + +FormFieldData& FormFieldData::operator=(FormFieldData&&) = default; FormFieldData::~FormFieldData() = default;
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h index c343c454..605f9e0 100644 --- a/components/autofill/core/common/form_field_data.h +++ b/components/autofill/core/common/form_field_data.h
@@ -18,7 +18,7 @@ namespace base { class Pickle; class PickleIterator; -} +} // namespace base namespace autofill { @@ -61,7 +61,10 @@ std::numeric_limits<uint32_t>::max(); FormFieldData(); - FormFieldData(const FormFieldData& other); + FormFieldData(const FormFieldData&); + FormFieldData& operator=(const FormFieldData&); + FormFieldData(FormFieldData&&); + FormFieldData& operator=(FormFieldData&&); ~FormFieldData(); // Returns true if two form fields are the same, not counting the value.
diff --git a/components/autofill/core/common/form_field_data_predictions.cc b/components/autofill/core/common/form_field_data_predictions.cc index 9109fcfd..46e8bd2 100644 --- a/components/autofill/core/common/form_field_data_predictions.cc +++ b/components/autofill/core/common/form_field_data_predictions.cc
@@ -6,21 +6,21 @@ namespace autofill { -FormFieldDataPredictions::FormFieldDataPredictions() { -} +FormFieldDataPredictions::FormFieldDataPredictions() = default; FormFieldDataPredictions::FormFieldDataPredictions( - const FormFieldDataPredictions& other) - : field(other.field), - signature(other.signature), - heuristic_type(other.heuristic_type), - server_type(other.server_type), - overall_type(other.overall_type), - parseable_name(other.parseable_name), - section(other.section) {} + const FormFieldDataPredictions&) = default; -FormFieldDataPredictions::~FormFieldDataPredictions() { -} +FormFieldDataPredictions& FormFieldDataPredictions::operator=( + const FormFieldDataPredictions&) = default; + +FormFieldDataPredictions::FormFieldDataPredictions(FormFieldDataPredictions&&) = + default; + +FormFieldDataPredictions& FormFieldDataPredictions::operator=( + FormFieldDataPredictions&&) = default; + +FormFieldDataPredictions::~FormFieldDataPredictions() = default; bool FormFieldDataPredictions::operator==( const FormFieldDataPredictions& predictions) const {
diff --git a/components/autofill/core/common/form_field_data_predictions.h b/components/autofill/core/common/form_field_data_predictions.h index baeb68b..1792ddc 100644 --- a/components/autofill/core/common/form_field_data_predictions.h +++ b/components/autofill/core/common/form_field_data_predictions.h
@@ -15,7 +15,10 @@ // Stores information about a field in a form. struct FormFieldDataPredictions { FormFieldDataPredictions(); - FormFieldDataPredictions(const FormFieldDataPredictions& other); + FormFieldDataPredictions(const FormFieldDataPredictions&); + FormFieldDataPredictions& operator=(const FormFieldDataPredictions&); + FormFieldDataPredictions(FormFieldDataPredictions&&); + FormFieldDataPredictions& operator=(FormFieldDataPredictions&&); ~FormFieldDataPredictions(); FormFieldData field;
diff --git a/components/autofill/core/common/password_form_fill_data.cc b/components/autofill/core/common/password_form_fill_data.cc index db08ce0..360a7156 100644 --- a/components/autofill/core/common/password_form_fill_data.cc +++ b/components/autofill/core/common/password_form_fill_data.cc
@@ -75,7 +75,15 @@ } } -PasswordFormFillData::PasswordFormFillData(const PasswordFormFillData& other) = +PasswordFormFillData::PasswordFormFillData(const PasswordFormFillData&) = + default; + +PasswordFormFillData& PasswordFormFillData::operator=( + const PasswordFormFillData&) = default; + +PasswordFormFillData::PasswordFormFillData(PasswordFormFillData&&) = default; + +PasswordFormFillData& PasswordFormFillData::operator=(PasswordFormFillData&&) = default; PasswordFormFillData::~PasswordFormFillData() = default;
diff --git a/components/autofill/core/common/password_form_fill_data.h b/components/autofill/core/common/password_form_fill_data.h index dfe6586f..8b3061e 100644 --- a/components/autofill/core/common/password_form_fill_data.h +++ b/components/autofill/core/common/password_form_fill_data.h
@@ -38,8 +38,10 @@ const PasswordForm& preferred_match, bool wait_for_username); - PasswordFormFillData(const PasswordFormFillData& other); - + PasswordFormFillData(const PasswordFormFillData&); + PasswordFormFillData& operator=(const PasswordFormFillData&); + PasswordFormFillData(PasswordFormFillData&&); + PasswordFormFillData& operator=(PasswordFormFillData&&); ~PasswordFormFillData(); // If |has_renderer_ids| == true then |form_renderer_id| contains the unique @@ -89,7 +91,6 @@ // TODO(https://crbug.com/831123): Remove this field when old parsing is // removed and filling by renderer ids is by default. bool has_renderer_ids = false; - }; // If |data.wait_for_username| is set, the renderer does not need to receive
diff --git a/components/dom_distiller/core/BUILD.gn b/components/dom_distiller/core/BUILD.gn index 215a0309b..7d6ac95 100644 --- a/components/dom_distiller/core/BUILD.gn +++ b/components/dom_distiller/core/BUILD.gn
@@ -88,8 +88,6 @@ static_library("test_support") { testonly = true sources = [ - "dom_distiller_test_util.cc", - "dom_distiller_test_util.h", "fake_distiller.cc", "fake_distiller.h", "fake_distiller_page.cc", @@ -133,7 +131,6 @@ "dom_distiller_model_unittest.cc", "dom_distiller_request_view_base_unittest.cc", "dom_distiller_service_unittest.cc", - "dom_distiller_store_unittest.cc", "page_features_unittest.cc", "task_tracker_unittest.cc", "url_utils_unittest.cc",
diff --git a/components/dom_distiller/core/dom_distiller_service_unittest.cc b/components/dom_distiller/core/dom_distiller_service_unittest.cc index c88a344..bb9c859 100644 --- a/components/dom_distiller/core/dom_distiller_service_unittest.cc +++ b/components/dom_distiller/core/dom_distiller_service_unittest.cc
@@ -15,15 +15,12 @@ #include "components/dom_distiller/core/distilled_page_prefs.h" #include "components/dom_distiller/core/dom_distiller_model.h" #include "components/dom_distiller/core/dom_distiller_store.h" -#include "components/dom_distiller/core/dom_distiller_test_util.h" #include "components/dom_distiller/core/fake_distiller.h" #include "components/dom_distiller/core/fake_distiller_page.h" #include "components/dom_distiller/core/task_tracker.h" -#include "components/leveldb_proto/testing/fake_db.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -using leveldb_proto::test::FakeDB; using testing::_; using testing::Invoke; using testing::Return; @@ -75,9 +72,7 @@ ArticleEntry entry; entry.set_entry_id(kTestEntryId); entry.add_pages()->set_url("http://www.example.com/p1"); - db_model_[kTestEntryId] = entry; - FakeDB<ArticleEntry>* fake_db = new FakeDB<ArticleEntry>(&db_model_); - store_ = test::util::CreateStoreWithFakeDB(fake_db, db_model_); + store_ = new DomDistillerStore({entry}); distiller_factory_ = new MockDistillerFactory(); distiller_page_factory_ = new MockDistillerPageFactory(); service_.reset(new DomDistillerService( @@ -85,8 +80,6 @@ std::unique_ptr<DistillerFactory>(distiller_factory_), std::unique_ptr<DistillerPageFactory>(distiller_page_factory_), std::unique_ptr<DistilledPagePrefs>())); - fake_db->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); - fake_db->LoadCallback(true); } void TearDown() override { @@ -103,7 +96,6 @@ MockDistillerFactory* distiller_factory_; MockDistillerPageFactory* distiller_page_factory_; std::unique_ptr<DomDistillerService> service_; - FakeDB<ArticleEntry>::EntryMap db_model_; }; TEST_F(DomDistillerServiceTest, TestViewEntry) {
diff --git a/components/dom_distiller/core/dom_distiller_store.cc b/components/dom_distiller/core/dom_distiller_store.cc index d187df2b..4f37d22 100644 --- a/components/dom_distiller/core/dom_distiller_store.cc +++ b/components/dom_distiller/core/dom_distiller_store.cc
@@ -8,35 +8,13 @@ #include <utility> -#include "base/bind.h" -#include "base/location.h" -#include "base/logging.h" -#include "components/dom_distiller/core/article_entry.h" -#include "components/sync/model/sync_change.h" - -using leveldb_proto::ProtoDatabase; -using syncer::SyncChange; -using syncer::SyncChangeList; -using syncer::SyncDataList; - namespace dom_distiller { -DomDistillerStore::DomDistillerStore( - std::unique_ptr<ProtoDatabase<ArticleEntry>> database) - : database_(std::move(database)), database_loaded_(false) { - database_->Init(base::BindOnce(&DomDistillerStore::OnDatabaseInit, - weak_ptr_factory_.GetWeakPtr())); -} +DomDistillerStore::DomDistillerStore() {} DomDistillerStore::DomDistillerStore( - std::unique_ptr<ProtoDatabase<ArticleEntry>> database, const std::vector<ArticleEntry>& initial_data) - : database_(std::move(database)), - database_loaded_(false), - model_(initial_data) { - database_->Init(base::BindOnce(&DomDistillerStore::OnDatabaseInit, - weak_ptr_factory_.GetWeakPtr())); -} + : model_(initial_data) {} DomDistillerStore::~DomDistillerStore() {} @@ -53,86 +31,4 @@ return model_.GetEntries(); } -void DomDistillerStore::OnDatabaseInit( - leveldb_proto::Enums::InitStatus status) { - if (status != leveldb_proto::Enums::InitStatus::kOK) { - DVLOG(1) << "DOM Distiller database init failed."; - database_.reset(); - return; - } - database_->LoadEntries(base::BindOnce(&DomDistillerStore::OnDatabaseLoad, - weak_ptr_factory_.GetWeakPtr())); -} - -void DomDistillerStore::OnDatabaseLoad(bool success, - std::unique_ptr<EntryVector> entries) { - if (!success) { - DVLOG(1) << "DOM Distiller database load failed."; - database_.reset(); - return; - } - database_loaded_ = true; - - SyncDataList data; - for (auto it = entries->begin(); it != entries->end(); ++it) { - data.push_back(CreateLocalData(*it)); - } - SyncChangeList changes_applied; - SyncChangeList database_changes_needed; - MergeDataWithModel(data, &changes_applied, &database_changes_needed); - ApplyChangesToDatabase(database_changes_needed); -} - -void DomDistillerStore::OnDatabaseSave(bool success) { - if (!success) { - DVLOG(1) << "DOM Distiller database save failed." - << " Disabling modifications and sync."; - database_.reset(); - database_loaded_ = false; - } -} - -bool DomDistillerStore::ApplyChangesToDatabase( - const SyncChangeList& change_list) { - if (!database_loaded_) { - return false; - } - if (change_list.empty()) { - return true; - } - std::unique_ptr<ProtoDatabase<ArticleEntry>::KeyEntryVector> entries_to_save( - new ProtoDatabase<ArticleEntry>::KeyEntryVector()); - std::unique_ptr<std::vector<std::string>> keys_to_remove( - new std::vector<std::string>()); - - for (auto it = change_list.begin(); it != change_list.end(); ++it) { - if (it->change_type() == SyncChange::ACTION_DELETE) { - ArticleEntry entry = GetEntryFromChange(*it); - keys_to_remove->push_back(entry.entry_id()); - } else { - ArticleEntry entry = GetEntryFromChange(*it); - entries_to_save->push_back(std::make_pair(entry.entry_id(), entry)); - } - } - database_->UpdateEntries(std::move(entries_to_save), - std::move(keys_to_remove), - base::BindOnce(&DomDistillerStore::OnDatabaseSave, - weak_ptr_factory_.GetWeakPtr())); - return true; -} - -void DomDistillerStore::MergeDataWithModel(const SyncDataList& data, - SyncChangeList* changes_applied, - SyncChangeList* changes_missing) { - // TODO(cjhopman): This naive merge algorithm could cause flip-flopping - // between database/sync of multiple clients. - DCHECK(changes_applied); - DCHECK(changes_missing); - - SyncChangeList changes_to_apply; - model_.CalculateChangesForMerge(data, &changes_to_apply, changes_missing); - model_.ApplyChangesToModel(changes_to_apply, changes_applied, - changes_missing); -} - } // namespace dom_distiller
diff --git a/components/dom_distiller/core/dom_distiller_store.h b/components/dom_distiller/core/dom_distiller_store.h index 1c6cab8..a548c426 100644 --- a/components/dom_distiller/core/dom_distiller_store.h +++ b/components/dom_distiller/core/dom_distiller_store.h
@@ -9,12 +9,8 @@ #include <vector> #include "base/macros.h" -#include "base/memory/weak_ptr.h" #include "components/dom_distiller/core/article_entry.h" #include "components/dom_distiller/core/dom_distiller_model.h" -#include "components/leveldb_proto/public/proto_database.h" -#include "components/sync/model/sync_change.h" -#include "components/sync/model/sync_data.h" #include "url/gurl.h" namespace dom_distiller { @@ -51,17 +47,10 @@ // TODO(cjhopman): Support deleting entries. class DomDistillerStore : public DomDistillerStoreInterface { public: - typedef std::vector<ArticleEntry> EntryVector; + DomDistillerStore(); - // Creates storage using the given database for local storage. - DomDistillerStore( - std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>> database); - - // Creates storage using the given database for local storage. Initializes the - // internal model to |initial_model|. - DomDistillerStore( - std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>> database, - const std::vector<ArticleEntry>& initial_data); + // Initializes the internal model to |initial_model|. + DomDistillerStore(const std::vector<ArticleEntry>& initial_data); ~DomDistillerStore() override; @@ -70,23 +59,8 @@ std::vector<ArticleEntry> GetEntries() const override; private: - void OnDatabaseInit(leveldb_proto::Enums::InitStatus status); - void OnDatabaseLoad(bool success, std::unique_ptr<EntryVector> entries); - void OnDatabaseSave(bool success); - - void MergeDataWithModel(const syncer::SyncDataList& data, - syncer::SyncChangeList* changes_applied, - syncer::SyncChangeList* changes_missing); - - bool ApplyChangesToDatabase(const syncer::SyncChangeList& change_list); - - std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>> database_; - bool database_loaded_; - DomDistillerModel model_; - base::WeakPtrFactory<DomDistillerStore> weak_ptr_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(DomDistillerStore); };
diff --git a/components/dom_distiller/core/dom_distiller_store_unittest.cc b/components/dom_distiller/core/dom_distiller_store_unittest.cc deleted file mode 100644 index 1733891..0000000 --- a/components/dom_distiller/core/dom_distiller_store_unittest.cc +++ /dev/null
@@ -1,176 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/dom_distiller/core/dom_distiller_store.h" - -#include <stdint.h> - -#include <memory> -#include <utility> - -#include "base/bind.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/memory/ptr_util.h" -#include "base/run_loop.h" -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "components/dom_distiller/core/article_entry.h" -#include "components/dom_distiller/core/dom_distiller_test_util.h" -#include "components/leveldb_proto/testing/fake_db.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using base::Time; -using leveldb_proto::test::FakeDB; -using testing::_; -using testing::AssertionFailure; -using testing::AssertionResult; -using testing::AssertionSuccess; -using testing::SaveArgPointee; - -namespace dom_distiller { - -namespace { - -typedef std::map<std::string, ArticleEntry> EntryMap; - -void AddEntry(const ArticleEntry& e, EntryMap* map) { - (*map)[e.entry_id()] = e; -} - -ArticleEntry CreateEntry(const std::string& entry_id, - const std::string& page_url1, - const std::string& page_url2, - const std::string& page_url3) { - ArticleEntry entry; - entry.set_entry_id(entry_id); - if (!page_url1.empty()) { - ArticleEntryPage* page = entry.add_pages(); - page->set_url(page_url1); - } - if (!page_url2.empty()) { - ArticleEntryPage* page = entry.add_pages(); - page->set_url(page_url2); - } - if (!page_url3.empty()) { - ArticleEntryPage* page = entry.add_pages(); - page->set_url(page_url3); - } - return entry; -} - -ArticleEntry GetSampleEntry(int id) { - static ArticleEntry entries[] = { - CreateEntry("entry0", "example.com/1", "example.com/2", "example.com/3"), - CreateEntry("entry1", "example.com/1", "", ""), - CreateEntry("entry2", "example.com/p1", "example.com/p2", ""), - CreateEntry("entry3", "example.com/something/all", "", ""), - CreateEntry("entry4", "example.com/somethingelse/1", "", ""), - CreateEntry("entry5", "rock.example.com/p1", "rock.example.com/p2", ""), - CreateEntry("entry7", "example.com/entry7/1", "example.com/entry7/2", ""), - CreateEntry("entry8", "example.com/entry8/1", "", ""), - CreateEntry("entry9", "example.com/entry9/all", "", ""), - }; - EXPECT_LT(id, 9); - return entries[id % 9]; -} - -} // namespace - -class DomDistillerStoreTest : public testing::Test { - public: - void SetUp() override { - db_model_.clear(); - store_model_.clear(); - } - - void TearDown() override { - store_.reset(); - fake_db_ = nullptr; - } - - // Creates a simple DomDistillerStore initialized with |store_model_| and - // with a FakeDB backed by |db_model_|. - void CreateStore() { - fake_db_ = new FakeDB<ArticleEntry>(&db_model_); - store_.reset(test::util::CreateStoreWithFakeDB(fake_db_, store_model_)); - } - - protected: - base::test::SingleThreadTaskEnvironment task_environment_; - - EntryMap db_model_; - FakeDB<ArticleEntry>::EntryMap store_model_; - - std::unique_ptr<DomDistillerStore> store_; - - // Both owned by |store_|. - FakeDB<ArticleEntry>* fake_db_; -}; - -AssertionResult AreEntriesEqual(const DomDistillerStore::EntryVector& entries, - EntryMap expected_entries) { - if (entries.size() != expected_entries.size()) - return AssertionFailure() << "Expected " << expected_entries.size() - << " entries but found " << entries.size(); - - for (auto it = entries.begin(); it != entries.end(); ++it) { - auto expected_it = expected_entries.find(it->entry_id()); - if (expected_it == expected_entries.end()) { - return AssertionFailure() - << "Found unexpected entry with id <" << it->entry_id() << ">"; - } - if (!AreEntriesEqual(expected_it->second, *it)) { - return AssertionFailure() - << "Mismatched entry with id <" << it->entry_id() << ">"; - } - expected_entries.erase(expected_it); - } - return AssertionSuccess(); -} - -AssertionResult AreEntryMapsEqual(const EntryMap& left, const EntryMap& right) { - DomDistillerStore::EntryVector entries; - for (auto it = left.begin(); it != left.end(); ++it) { - entries.push_back(it->second); - } - return AreEntriesEqual(entries, right); -} - -TEST_F(DomDistillerStoreTest, TestDatabaseLoad) { - AddEntry(GetSampleEntry(0), &db_model_); - AddEntry(GetSampleEntry(1), &db_model_); - AddEntry(GetSampleEntry(2), &db_model_); - - CreateStore(); - - fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); - - fake_db_->LoadCallback(true); - EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), db_model_)); -} - -TEST_F(DomDistillerStoreTest, TestDatabaseLoadMerge) { - AddEntry(GetSampleEntry(0), &db_model_); - AddEntry(GetSampleEntry(1), &db_model_); - AddEntry(GetSampleEntry(2), &db_model_); - - AddEntry(GetSampleEntry(2), &store_model_); - AddEntry(GetSampleEntry(3), &store_model_); - AddEntry(GetSampleEntry(4), &store_model_); - - EntryMap expected_model(db_model_); - AddEntry(GetSampleEntry(3), &expected_model); - AddEntry(GetSampleEntry(4), &expected_model); - - CreateStore(); - fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); - fake_db_->LoadCallback(true); - - EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model)); - EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model)); -} - -} // namespace dom_distiller
diff --git a/components/dom_distiller/core/dom_distiller_test_util.cc b/components/dom_distiller/core/dom_distiller_test_util.cc deleted file mode 100644 index 83199cd..0000000 --- a/components/dom_distiller/core/dom_distiller_test_util.cc +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/dom_distiller/core/dom_distiller_test_util.h" - -#include "components/dom_distiller/core/dom_distiller_store.h" -#include "components/dom_distiller/core/fake_distiller.h" - -using leveldb_proto::test::FakeDB; - -namespace dom_distiller { -namespace test { -namespace util { - -namespace { - -std::vector<ArticleEntry> EntryMapToList( - const FakeDB<ArticleEntry>::EntryMap& entries) { - std::vector<ArticleEntry> entry_list; - for (auto it = entries.begin(); it != entries.end(); ++it) { - entry_list.push_back(it->second); - } - return entry_list; -} -} // namespace - -// static -DomDistillerStore* CreateStoreWithFakeDB( - FakeDB<ArticleEntry>* fake_db, - const FakeDB<ArticleEntry>::EntryMap& store_model) { - return new DomDistillerStore( - std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>>(fake_db), - EntryMapToList(store_model)); -} - -} // namespace util -} // namespace test -} // namespace dom_distiller
diff --git a/components/dom_distiller/core/dom_distiller_test_util.h b/components/dom_distiller/core/dom_distiller_test_util.h deleted file mode 100644 index 4c94a93..0000000 --- a/components/dom_distiller/core/dom_distiller_test_util.h +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_TEST_UTIL_H_ -#define COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_TEST_UTIL_H_ - -#include <vector> - -#include "components/dom_distiller/core/article_entry.h" -#include "components/leveldb_proto/testing/fake_db.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace dom_distiller { - -class DomDistillerStore; - -namespace test { -namespace util { - -// Creates a simple DomDistillerStore backed by |fake_db| and initialized -// with |store_model|. -DomDistillerStore* CreateStoreWithFakeDB( - leveldb_proto::test::FakeDB<ArticleEntry>* fake_db, - const leveldb_proto::test::FakeDB<ArticleEntry>::EntryMap& store_model); - -} // namespace util -} // namespace test -} // namespace dom_distiller - -#endif // COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_TEST_UTIL_H_
diff --git a/components/dom_distiller/core/viewer_unittest.cc b/components/dom_distiller/core/viewer_unittest.cc index cf1c9cd6..9e7a238 100644 --- a/components/dom_distiller/core/viewer_unittest.cc +++ b/components/dom_distiller/core/viewer_unittest.cc
@@ -6,11 +6,11 @@ #include "components/dom_distiller/core/distilled_page_prefs.h" #include "components/dom_distiller/core/dom_distiller_service.h" -#include "components/dom_distiller/core/dom_distiller_test_util.h" #include "components/dom_distiller/core/task_tracker.h" #include "components/dom_distiller/core/url_constants.h" #include "components/dom_distiller/core/url_utils.h" #include "net/base/url_util.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/url_util.h"
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc index 227c8fe..d85a15ab 100644 --- a/components/dom_distiller/standalone/content_extractor_browsertest.cc +++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -127,25 +127,11 @@ std::unique_ptr<DomDistillerService> CreateDomDistillerService( content::BrowserContext* context, sync_preferences::TestingPrefServiceSyncable* pref_service, - const base::FilePath& db_path, const FileToUrlMap& file_to_url_map) { - scoped_refptr<base::SequencedTaskRunner> background_task_runner = - base::CreateSequencedTaskRunner({base::ThreadPool(), base::MayBlock()}); - // Setting up PrefService for DistilledPagePrefs. DistilledPagePrefs::RegisterProfilePrefs(pref_service->registry()); - auto* db_provider = - content::BrowserContext::GetDefaultStoragePartition(context) - ->GetProtoDatabaseProvider(); - - // TODO(cjhopman): use an in-memory database instead of an on-disk one with - // temporary directory. - auto db = db_provider->GetDB<ArticleEntry>( - leveldb_proto::ProtoDbType::DOM_DISTILLER_STORE, db_path, - background_task_runner); - - auto dom_distiller_store = std::make_unique<DomDistillerStore>(std::move(db)); + auto dom_distiller_store = std::make_unique<DomDistillerStore>(); auto distiller_page_factory = std::make_unique<DistillerPageWebContentsFactory>(context); @@ -338,7 +324,6 @@ if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kDisableDnsSwitch)) { EnableDNSLookupForThisTest(); } - CHECK(db_dir_.CreateUniqueTempDir()); AddComponentsTestResources(); } @@ -359,7 +344,7 @@ std::make_unique<sync_preferences::TestingPrefServiceSyncable>(); service_ = CreateDomDistillerService(context, pref_service_.get(), - db_dir_.GetPath(), file_to_url_map); + file_to_url_map); PumpQueue(); } @@ -435,7 +420,6 @@ size_t max_tasks_; size_t next_request_; - base::ScopedTempDir db_dir_; std::unique_ptr<net::ScopedDefaultHostResolverProc> mock_host_resolver_override_; std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
diff --git a/components/download/internal/common/download_file_impl.cc b/components/download/internal/common/download_file_impl.cc index 890efd89..a8376fd 100644 --- a/components/download/internal/common/download_file_impl.cc +++ b/components/download/internal/common/download_file_impl.cc
@@ -59,11 +59,10 @@ DownloadFileImpl::SourceStream::SourceStream( int64_t offset, - int64_t length, int64_t starting_file_write_offset, std::unique_ptr<InputStream> stream) : offset_(offset), - length_(length), + length_(DownloadSaveInfo::kLengthFullContent), starting_file_write_offset_(starting_file_write_offset), bytes_read_(0), bytes_written_(0), @@ -72,11 +71,6 @@ input_stream_(std::move(stream)) { CHECK_LE(offset_, starting_file_write_offset_); CHECK_GE(offset_, 0); - DCHECK(length <= 0 || length >= starting_file_write_offset - offset) - << "Not enough for content validation. offset = " << offset - << ", length = " << length - << " , starting_file_write_offset = " << starting_file_write_offset - << "."; } DownloadFileImpl::SourceStream::~SourceStream() = default; @@ -176,8 +170,8 @@ download_id); source_streams_[save_info_->offset] = std::make_unique<SourceStream>( - save_info_->offset, save_info_->length, - save_info_->GetStartingFileWriteOffset(), std::move(stream)); + save_info_->offset, save_info_->GetStartingFileWriteOffset(), + std::move(stream)); DETACH_FROM_SEQUENCE(sequence_checker_); } @@ -243,8 +237,7 @@ } void DownloadFileImpl::AddInputStream(std::unique_ptr<InputStream> stream, - int64_t offset, - int64_t length) { + int64_t offset) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // UI thread may not be notified about completion and detach download file, @@ -255,7 +248,7 @@ } DCHECK(source_streams_.find(offset) == source_streams_.end()); source_streams_[offset] = - std::make_unique<SourceStream>(offset, length, offset, std::move(stream)); + std::make_unique<SourceStream>(offset, offset, std::move(stream)); OnSourceStreamAdded(source_streams_[offset].get()); }
diff --git a/components/download/internal/common/download_file_unittest.cc b/components/download/internal/common/download_file_unittest.cc index a2a5883..0dac1e1 100644 --- a/components/download/internal/common/download_file_unittest.cc +++ b/components/download/internal/common/download_file_unittest.cc
@@ -438,7 +438,7 @@ // 1. RegisterCallback: Must called twice. One to set the callback, the // other to release the stream. // 2. Read: If filled with N buffer, called (N+1) times, where the last Read - // call doesn't read any data but returns STRAM_COMPLETE. + // call doesn't read any data but returns STREAM_COMPLETE. // The stream may terminate in the middle and less Read calls are expected. // 3. GetStatus: Only called if the stream is completed and last Read call // returns STREAM_COMPLETE. @@ -997,8 +997,8 @@ // Activate the streams. download_file_->AddInputStream( - std::unique_ptr<MockInputStream>(additional_streams_[0]), stream_0_length, - DownloadSaveInfo::kLengthFullContent); + std::unique_ptr<MockInputStream>(additional_streams_[0]), + stream_0_length); sink_callback_.Run(MOJO_RESULT_OK); base::RunLoop().RunUntilIdle(); @@ -1039,12 +1039,12 @@ EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _)); // Activate all the streams. - download_file_->AddInputStream( - std::unique_ptr<MockInputStream>(additional_streams_[0]), stream_0_length, - stream_1_length); - download_file_->AddInputStream( + download_file_->AddInputStream( std::unique_ptr<MockInputStream>(additional_streams_[1]), - stream_0_length + stream_1_length, DownloadSaveInfo::kLengthFullContent); + stream_0_length + stream_1_length); + download_file_->AddInputStream( + std::unique_ptr<MockInputStream>(additional_streams_[0]), + stream_0_length); sink_callback_.Run(MOJO_RESULT_OK); base::RunLoop().RunUntilIdle(); @@ -1085,7 +1085,7 @@ additional_streams_[0] = new StrictMock<MockInputStream>(); download_file_->AddInputStream( std::unique_ptr<MockInputStream>(additional_streams_[0]), - stream_0_length - 1, DownloadSaveInfo::kLengthFullContent); + stream_0_length - 1); base::RunLoop().RunUntilIdle(); SourceStreamTestData stream_data_0(0, stream_0_length, true); @@ -1127,7 +1127,7 @@ download_file_->AddInputStream( std::unique_ptr<MockInputStream>(additional_streams_[0]), - strlen(kTestData1), DownloadSaveInfo::kLengthFullContent); + strlen(kTestData1)); // The stream should get terminated and reset the callback. EXPECT_TRUE(sink_callback_.is_null()); @@ -1169,8 +1169,7 @@ .RetiresOnSaturation(); int64_t offset = strlen(kTestData1) + strlen(kTestData2); download_file_->AddInputStream( - std::unique_ptr<MockInputStream>(additional_streams_[0]), offset, - DownloadSaveInfo::kLengthFullContent); + std::unique_ptr<MockInputStream>(additional_streams_[0]), offset); base::RunLoop().RunUntilIdle(); // First stream reads the 3rd chunk and writes it to disk.
diff --git a/components/download/internal/common/download_job.cc b/components/download/internal/common/download_job.cc index 04861ab..d27f240 100644 --- a/components/download/internal/common/download_job.cc +++ b/components/download/internal/common/download_job.cc
@@ -76,8 +76,7 @@ } bool DownloadJob::AddInputStream(std::unique_ptr<InputStream> stream, - int64_t offset, - int64_t length) { + int64_t offset) { DownloadFile* download_file = download_item_->GetDownloadFile(); if (!download_file) { CancelRequestWithOffset(offset); @@ -90,7 +89,7 @@ GetDownloadTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&DownloadFile::AddInputStream, base::Unretained(download_file), - std::move(stream), offset, length)); + std::move(stream), offset)); return true; }
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc index 023f695..0a595eb 100644 --- a/components/download/internal/common/download_utils.cc +++ b/components/download/internal/common/download_utils.cc
@@ -177,15 +177,8 @@ return result; // The caller is expecting a partial response. - if (save_info && (save_info->offset > 0 || save_info->length > 0)) { + if (save_info && save_info->offset > 0) { if (http_headers.response_code() != net::HTTP_PARTIAL_CONTENT) { - // Server should send partial content when "If-Match" or - // "If-Unmodified-Since" check passes, and the range request header has - // last byte position. e.g. "Range:bytes=50-99". - if (save_info->length != DownloadSaveInfo::kLengthFullContent && - !fetch_error_body) - return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; - // Requested a partial range, but received the entire response, when // the range request header is "Range:bytes={offset}-". // The response can be HTTP 200 or other error code when @@ -204,9 +197,7 @@ return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT; DCHECK_GE(first_byte, 0); - if (first_byte != save_info->offset || - (save_info->length > 0 && - last_byte != save_info->offset + save_info->length - 1)) { + if (first_byte != save_info->offset) { // The server returned a different range than the one we requested. Assume // the server doesn't support range request. return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE; @@ -337,8 +328,7 @@ std::unique_ptr<net::HttpRequestHeaders> GetAdditionalRequestHeaders( DownloadUrlParameters* params) { auto headers = std::make_unique<net::HttpRequestHeaders>(); - if (params->offset() == 0 && - params->length() == DownloadSaveInfo::kLengthFullContent) { + if (params->offset() == 0) { AppendExtraHeaders(headers.get(), params); return headers; } @@ -361,10 +351,7 @@ // Add "Range" header. std::string range_header = - (params->length() == DownloadSaveInfo::kLengthFullContent) - ? base::StringPrintf("bytes=%" PRId64 "-", params->offset()) - : base::StringPrintf("bytes=%" PRId64 "-%" PRId64, params->offset(), - params->offset() + params->length() - 1); + base::StringPrintf("bytes=%" PRId64 "-", params->offset()); headers->SetHeader(net::HttpRequestHeaders::kRange, range_header); // Add "If-Range" headers.
diff --git a/components/download/internal/common/download_worker.cc b/components/download/internal/common/download_worker.cc index b1e9792..6efc94d6 100644 --- a/components/download/internal/common/download_worker.cc +++ b/components/download/internal/common/download_worker.cc
@@ -68,11 +68,9 @@ } // namespace DownloadWorker::DownloadWorker(DownloadWorker::Delegate* delegate, - int64_t offset, - int64_t length) + int64_t offset) : delegate_(delegate), offset_(offset), - length_(length), is_paused_(false), is_canceled_(false), url_download_handler_(nullptr, base::OnTaskRunnerDeleter(nullptr)) {
diff --git a/components/download/internal/common/download_worker.h b/components/download/internal/common/download_worker.h index d560f0d..28e5b05f 100644 --- a/components/download/internal/common/download_worker.h +++ b/components/download/internal/common/download_worker.h
@@ -38,13 +38,10 @@ std::unique_ptr<DownloadCreateInfo> download_create_info) = 0; }; - DownloadWorker(DownloadWorker::Delegate* delegate, - int64_t offset, - int64_t length); + DownloadWorker(DownloadWorker::Delegate* delegate, int64_t offset); virtual ~DownloadWorker(); int64_t offset() const { return offset_; } - int64_t length() const { return length_; } // Send network request to ask for a download. void SendRequest(std::unique_ptr<DownloadUrlParameters> params, @@ -74,9 +71,6 @@ // The starting position of the content for this worker to download. int64_t offset_; - // The length of the request. May be 0 to fetch to the end of the file. - int64_t length_; - // States of the worker. bool is_paused_; bool is_canceled_;
diff --git a/components/download/internal/common/parallel_download_job.cc b/components/download/internal/common/parallel_download_job.cc index a2e1e42..9b92831 100644 --- a/components/download/internal/common/parallel_download_job.cc +++ b/components/download/internal/common/parallel_download_job.cc
@@ -128,8 +128,8 @@ // If server returns a wrong range, abort the parallel request. bool success = download_create_info->offset == worker->offset(); if (success) { - success = DownloadJob::AddInputStream(std::move(input_stream), - worker->offset(), worker->length()); + success = + DownloadJob::AddInputStream(std::move(input_stream), worker->offset()); } RecordParallelDownloadAddStreamSuccess( @@ -236,15 +236,14 @@ // All parallel requests are half open, which sends request headers like // "Range:50-". // If server rejects a certain request, others should take over. - CreateRequest(it->offset, DownloadSaveInfo::kLengthFullContent); + CreateRequest(it->offset); } } -void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) { +void ParallelDownloadJob::CreateRequest(int64_t offset) { DCHECK(download_item_); - DCHECK_EQ(DownloadSaveInfo::kLengthFullContent, length); - auto worker = std::make_unique<DownloadWorker>(this, offset, length); + auto worker = std::make_unique<DownloadWorker>(this, offset); net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("parallel_download_job", R"( @@ -277,10 +276,6 @@ download_params->set_etag(download_item_->GetETag()); download_params->set_offset(offset); - // Setting the length will result in range request to fetch a slice of the - // file. - download_params->set_length(length); - // Subsequent range requests don't need the "If-Range" header. download_params->set_use_if_range(false);
diff --git a/components/download/internal/common/parallel_download_job.h b/components/download/internal/common/parallel_download_job.h index e502805..564a885 100644 --- a/components/download/internal/common/parallel_download_job.h +++ b/components/download/internal/common/parallel_download_job.h
@@ -88,9 +88,8 @@ void ForkSubRequests(const DownloadItem::ReceivedSlices& slices_to_download); // Create one range request, virtual for testing. Range request will start - // from |offset| to |length|. Range request will be half open, e.g. - // "Range:50-" if |length| is 0. - virtual void CreateRequest(int64_t offset, int64_t length); + // from |offset| and will be half open. + virtual void CreateRequest(int64_t offset); // Information about the initial request when download is started. int64_t initial_request_offset_;
diff --git a/components/download/internal/common/parallel_download_job_unittest.cc b/components/download/internal/common/parallel_download_job_unittest.cc index 7909c2e..f6faf8d 100644 --- a/components/download/internal/common/parallel_download_job_unittest.cc +++ b/components/download/internal/common/parallel_download_job_unittest.cc
@@ -67,8 +67,8 @@ min_slice_size_(min_slice_size), min_remaining_time_(min_remaining_time) {} - void CreateRequest(int64_t offset, int64_t length) override { - auto worker = std::make_unique<DownloadWorker>(this, offset, length); + void CreateRequest(int64_t offset) override { + auto worker = std::make_unique<DownloadWorker>(this, offset); DCHECK(workers_.find(offset) == workers_.end()); workers_[offset] = std::move(worker); @@ -155,7 +155,6 @@ void VerifyWorker(int64_t offset, int64_t length) const { EXPECT_TRUE(job_->workers_.find(offset) != job_->workers_.end()); EXPECT_EQ(offset, job_->workers_[offset]->offset()); - EXPECT_EQ(length, job_->workers_[offset]->length()); } void OnFileInitialized(DownloadInterruptReason result, int64_t bytes_wasted) {
diff --git a/components/download/internal/common/parallel_download_utils_unittest.cc b/components/download/internal/common/parallel_download_utils_unittest.cc index b0c8462..8672f93 100644 --- a/components/download/internal/common/parallel_download_utils_unittest.cc +++ b/components/download/internal/common/parallel_download_utils_unittest.cc
@@ -37,14 +37,12 @@ // Creates a source stream to test. std::unique_ptr<DownloadFileImpl::SourceStream> CreateSourceStream( - int64_t offset, - int64_t length) { + int64_t offset) { input_stream_ = new StrictMock<MockInputStream>(); EXPECT_CALL(*input_stream_, GetCompletionStatus()) .WillRepeatedly(Return(DOWNLOAD_INTERRUPT_REASON_NONE)); return std::make_unique<DownloadFileImpl::SourceStream>( - offset, length, offset, - std::unique_ptr<MockInputStream>(input_stream_)); + offset, offset, std::unique_ptr<MockInputStream>(input_stream_)); } protected: @@ -140,15 +138,14 @@ // Create a stream that will work on byte range "100-". const int kErrorStreamOffset = 100; - auto error_stream = CreateSourceStream(kErrorStreamOffset, - DownloadSaveInfo::kLengthFullContent); + auto error_stream = CreateSourceStream(kErrorStreamOffset); error_stream->set_finished(true); // Get starting offset of preceding stream. int64_t preceding_offset = GetParam(); EXPECT_LT(preceding_offset, kErrorStreamOffset); - auto preceding_stream = CreateSourceStream( - preceding_offset, DownloadSaveInfo::kLengthFullContent); + auto preceding_stream = CreateSourceStream(preceding_offset); + // Half open preceding stream can always recover the error for later streams. EXPECT_FALSE(preceding_stream->is_finished()); EXPECT_EQ(0u, preceding_stream->bytes_written()); EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); @@ -170,88 +167,74 @@ preceding_stream->OnBytesConsumed(1000u, 1000u); EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); - // Now capped the length of preceding stream with different values. - preceding_stream = CreateSourceStream(preceding_offset, - kErrorStreamOffset - preceding_offset); - // Since preceding stream can't reach the first byte of the error stream, it - // will fail. + int64_t bytes_consumed = kErrorStreamOffset - preceding_offset - 1; + // Half open successfully finished preceding stream should always be + // able to recover error, even if it is not reaching the error offset as the + // error stream might be requesting something our of range. + preceding_stream = CreateSourceStream(preceding_offset); preceding_stream->set_finished(false); - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->set_finished(true); - int64_t bytes_consumed = kErrorStreamOffset - preceding_offset; preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed); - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + preceding_stream->OnBytesConsumed(1, 1); + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); - // Inject an error results in failure, even if data written exceeds the first - // byte of error stream. - EXPECT_CALL(*input_stream_, GetCompletionStatus()) - .WillRepeatedly(Return(DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE)); - preceding_stream->OnBytesConsumed(1000u, 1000u); - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); - - // Make preceding stream can reach the first byte of error stream. - preceding_stream = CreateSourceStream( - preceding_offset, kErrorStreamOffset - preceding_offset + 1); - // Since the error stream is half opened, no matter what it should fail. - preceding_stream->set_finished(false); + // If the preceding stream is truncated, it should never be able to recover + // a half open stream. + preceding_stream = CreateSourceStream(preceding_offset); + preceding_stream->TruncateLengthWithWrittenDataBlock(kErrorStreamOffset, 1); + EXPECT_EQ(preceding_stream->length(), kErrorStreamOffset - preceding_offset); EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->set_finished(true); + EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed); EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->OnBytesConsumed(1, 1); EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); - - // Preceding stream that never download data won't recover the error stream. - preceding_stream = CreateSourceStream(preceding_offset, -1); - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); } // Verify recovery for length capped error stream. -// Since the error stream length is capped, assume the previous stream length -// is also capped or the previous stream is finished due to error like http -// 404. TEST_P(ParallelDownloadUtilsRecoverErrorTest, RecoverErrorForLengthCappedErrorStream) { // Create a stream that will work on byte range "100-150". const int kErrorStreamLength = 50; - auto error_stream = - CreateSourceStream(kErrorStreamOffset, kErrorStreamLength); + auto error_stream = CreateSourceStream(kErrorStreamOffset); + error_stream->TruncateLengthWithWrittenDataBlock( + kErrorStreamOffset + kErrorStreamLength, 1); + EXPECT_EQ(error_stream->length(), 50); error_stream->set_finished(true); // Get starting offset of preceding stream. const int64_t preceding_offset = GetParam(); EXPECT_LT(preceding_offset, kErrorStreamOffset); - // Create preceding stream capped before starting offset of error stream. - auto preceding_stream = CreateSourceStream( - preceding_offset, kErrorStreamOffset - preceding_offset); + // Create an half open preceding stream. + auto preceding_stream = CreateSourceStream(preceding_offset); EXPECT_FALSE(preceding_stream->is_finished()); EXPECT_EQ(0u, preceding_stream->bytes_written()); - // Since the preceding stream can never reach the starting offset, for an - // unfinished stream, we rely on length instead of bytes written. - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + // Since the preceding stream can reach the starting offset, it should be able + // to recover the error stream.. + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); int64_t bytes_consumed = kErrorStreamOffset - preceding_offset; preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed); - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->OnBytesConsumed(kErrorStreamLength - 1, kErrorStreamLength - 1); - EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->OnBytesConsumed(1, 1); - - // Create preceding stream that can reach the upper bound of error stream. - // Since it's unfinished, it potentially can take over error stream's work - // even if no data is written. - preceding_stream = CreateSourceStream( - preceding_offset, - kErrorStreamOffset - preceding_offset + kErrorStreamLength); - EXPECT_FALSE(preceding_stream->is_finished()); - EXPECT_EQ(0u, preceding_stream->bytes_written()); EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); - // Finished preceding stream only checks data written. - preceding_stream = CreateSourceStream(preceding_offset, 1); + // If preceding stream is truncated after error stream, checks data written. + preceding_stream = CreateSourceStream(preceding_offset); + preceding_stream->TruncateLengthWithWrittenDataBlock( + kErrorStreamOffset + kErrorStreamLength, 1); + EXPECT_EQ(preceding_stream->length(), + kErrorStreamOffset + kErrorStreamLength - preceding_offset); + EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->set_finished(true); + EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed); EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); preceding_stream->OnBytesConsumed(kErrorStreamLength - 1, @@ -266,8 +249,17 @@ .WillRepeatedly(Return(DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE)); EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); - // Preceding stream that never download data won't recover the error stream. - preceding_stream = CreateSourceStream(preceding_offset, -1); + // If preceding stream is truncated before or in the middle of error stream, + // it should not recover the error stream when it reaches its length. + preceding_stream = CreateSourceStream(preceding_offset); + preceding_stream->TruncateLengthWithWrittenDataBlock(kErrorStreamOffset + 1, + 1); + EXPECT_EQ(preceding_stream->length(), + kErrorStreamOffset + 1 - preceding_offset); + EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + preceding_stream->set_finished(true); + EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); + preceding_stream->OnBytesConsumed(bytes_consumed + 1, bytes_consumed + 1); EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get())); }
diff --git a/components/download/public/common/download_file.h b/components/download/public/common/download_file.h index 7f81cfb..9392942 100644 --- a/components/download/public/common/download_file.h +++ b/components/download/public/common/download_file.h
@@ -72,8 +72,7 @@ // Add an input stream to write into a slice of the file, used for // parallel download. virtual void AddInputStream(std::unique_ptr<InputStream> stream, - int64_t offset, - int64_t length) = 0; + int64_t offset) = 0; // Rename the download file to |full_path|. If that file exists // |full_path| will be uniquified by suffixing " (<number>)" to the
diff --git a/components/download/public/common/download_file_impl.h b/components/download/public/common/download_file_impl.h index 4f6c60c..3c4d5d62 100644 --- a/components/download/public/common/download_file_impl.h +++ b/components/download/public/common/download_file_impl.h
@@ -60,8 +60,7 @@ const DownloadItem::ReceivedSlices& received_slices, bool is_parallelizable) override; void AddInputStream(std::unique_ptr<InputStream> stream, - int64_t offset, - int64_t length) override; + int64_t offset) override; void RenameAndUniquify(const base::FilePath& full_path, const RenameCompletionCallback& callback) override; void RenameAndAnnotate( @@ -102,7 +101,6 @@ class COMPONENTS_DOWNLOAD_EXPORT SourceStream { public: SourceStream(int64_t offset, - int64_t length, int64_t starting_file_write_offset, std::unique_ptr<InputStream> stream); ~SourceStream();
diff --git a/components/download/public/common/download_job.h b/components/download/public/common/download_job.h index a4348310..42d5609 100644 --- a/components/download/public/common/download_job.h +++ b/components/download/public/common/download_job.h
@@ -64,9 +64,7 @@ // Add an input stream to the download sink. Return false if we start to // destroy download file. - bool AddInputStream(std::unique_ptr<InputStream> stream, - int64_t offset, - int64_t length); + bool AddInputStream(std::unique_ptr<InputStream> stream, int64_t offset); DownloadItem* download_item_;
diff --git a/components/download/public/common/download_save_info.h b/components/download/public/common/download_save_info.h index 9f249c7..f2e0043 100644 --- a/components/download/public/common/download_save_info.h +++ b/components/download/public/common/download_save_info.h
@@ -56,12 +56,6 @@ // used for validation purpose. int64_t file_offset = -1; - // The number of the bytes to download from |offset|. - // Ask to retrieve segment of the download file when length is greater than 0. - // Request the rest of the file starting from |offset|, when length is - // |kLengthFullContent|. - int64_t length = kLengthFullContent; - // The state of the hash. If specified, this hash state must indicate the // state of the partial file for the first |offset| bytes. std::unique_ptr<crypto::SecureHash> hash_state;
diff --git a/components/download/public/common/download_url_parameters.h b/components/download/public/common/download_url_parameters.h index 5f8d490..bf4d01902 100644 --- a/components/download/public/common/download_url_parameters.h +++ b/components/download/public/common/download_url_parameters.h
@@ -172,15 +172,8 @@ // If |offset| is non-zero, then a byte range request will be issued to fetch // the range of bytes starting at |offset|. - // Use |set_length| to specify the last byte position, or the range - // request will be "Range:bytes={offset}-" to retrieve the rest of the file. void set_offset(int64_t offset) { save_info_.offset = offset; } - // When |length| > 0, the range of bytes will be from - // |save_info_.offset| to |save_info_.offset| + |length| - 1. - // See |DownloadSaveInfo.length|. - void set_length(int64_t length) { save_info_.length = length; } - // Sets the offset to start writing to the file. If set, The data received // before |file_offset| are discarded or are used for validation purpose. void set_file_offset(int64_t file_offset) { @@ -302,7 +295,6 @@ return save_info_.suggested_name; } int64_t offset() const { return save_info_.offset; } - int64_t length() const { return save_info_.length; } const std::string& hash_of_partial_file() const { return save_info_.hash_of_partial_file; }
diff --git a/components/download/public/common/mock_download_file.cc b/components/download/public/common/mock_download_file.cc index 4d24d9e..601f4fe 100644 --- a/components/download/public/common/mock_download_file.cc +++ b/components/download/public/common/mock_download_file.cc
@@ -32,11 +32,10 @@ MockDownloadFile::~MockDownloadFile() {} void MockDownloadFile::AddInputStream(std::unique_ptr<InputStream> input_stream, - int64_t offset, - int64_t length) { + int64_t offset) { // Gmock currently can't mock method that takes move-only parameters, // delegate the EXPECT_CALL count to |DoAddByteStream|. - DoAddInputStream(input_stream.get(), offset, length); + DoAddInputStream(input_stream.get(), offset); } } // namespace download
diff --git a/components/download/public/common/mock_download_file.h b/components/download/public/common/mock_download_file.h index 585223e4..917e534 100644 --- a/components/download/public/common/mock_download_file.h +++ b/components/download/public/common/mock_download_file.h
@@ -35,10 +35,9 @@ const DownloadItem::ReceivedSlices& received_slices, bool is_parallelizable)); void AddInputStream(std::unique_ptr<InputStream> input_stream, - int64_t offset, - int64_t length) override; - MOCK_METHOD3(DoAddInputStream, - void(InputStream* input_stream, int64_t offset, int64_t length)); + int64_t offset) override; + MOCK_METHOD2(DoAddInputStream, + void(InputStream* input_stream, int64_t offset)); MOCK_METHOD2(OnResponseCompleted, void(int64_t offset, DownloadInterruptReason status)); MOCK_METHOD2(AppendDataToFile,
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.cc b/components/embedder_support/android/delegate/web_contents_delegate_android.cc index 3ba63a18..5316b981 100644 --- a/components/embedder_support/android/delegate/web_contents_delegate_android.cc +++ b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
@@ -189,27 +189,20 @@ Java_WebContentsDelegateAndroid_rendererResponsive(env, obj); } -bool WebContentsDelegateAndroid::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool WebContentsDelegateAndroid::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { + const GURL& target_url) { JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); if (obj.is_null()) - return true; + return false; ScopedJavaLocalRef<jstring> java_url = ConvertUTF8ToJavaString(env, target_url.spec()); - return Java_WebContentsDelegateAndroid_shouldCreateWebContents(env, obj, - java_url); + return !Java_WebContentsDelegateAndroid_shouldCreateWebContents(env, obj, + java_url); } void WebContentsDelegateAndroid::WebContentsCreated(
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.h b/components/embedder_support/android/delegate/web_contents_delegate_android.h index 62ccbc2..3127006a 100644 --- a/components/embedder_support/android/delegate/web_contents_delegate_android.h +++ b/components/embedder_support/android/delegate/web_contents_delegate_android.h
@@ -76,19 +76,12 @@ const std::string& frame_name, const GURL& target_url, content::WebContents* new_contents) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override; + const GURL& target_url) override; void CloseContents(content::WebContents* source) override; void SetContentsBounds(content::WebContents* source, const gfx::Rect& bounds) override;
diff --git a/components/leveldb_proto/public/shared_proto_database_client_list.h b/components/leveldb_proto/public/shared_proto_database_client_list.h index 63bff8a..b8aa746 100644 --- a/components/leveldb_proto/public/shared_proto_database_client_list.h +++ b/components/leveldb_proto/public/shared_proto_database_client_list.h
@@ -65,6 +65,7 @@ // Add any obsolete databases in this list so that, if the data is no longer // needed. constexpr ProtoDbType kObsoleteSharedProtoDbTypeClients[] = { + ProtoDbType::DOM_DISTILLER_STORE, ProtoDbType::LAST, // Marks the end of list. };
diff --git a/components/metrics/net/cellular_logic_helper.cc b/components/metrics/net/cellular_logic_helper.cc index 8fcedc3..9f66d11 100644 --- a/components/metrics/net/cellular_logic_helper.cc +++ b/components/metrics/net/cellular_logic_helper.cc
@@ -28,17 +28,15 @@ } // namespace -base::TimeDelta GetUploadInterval() { +base::TimeDelta GetUploadInterval(bool use_cellular_upload_interval) { #if defined(OS_ANDROID) || defined(OS_IOS) - if (IsCellularLogicEnabled()) + if (use_cellular_upload_interval) return base::TimeDelta::FromSeconds(kStandardUploadIntervalCellularSeconds); #endif return base::TimeDelta::FromSeconds(kStandardUploadIntervalSeconds); } -// Returns true if current connection type is cellular and cellular logic is -// enabled. -bool IsCellularLogicEnabled() { +bool ShouldUseCellularUploadInterval() { if (!kDefaultCellularLogicEnabled) return false;
diff --git a/components/metrics/net/cellular_logic_helper.h b/components/metrics/net/cellular_logic_helper.h index b5c7061c..3ff2178 100644 --- a/components/metrics/net/cellular_logic_helper.h +++ b/components/metrics/net/cellular_logic_helper.h
@@ -9,12 +9,16 @@ namespace metrics { -// Returns UMA log upload interval based on OS and ongoing cellular experiment. -base::TimeDelta GetUploadInterval(); +// Returns UMA log upload interval based on OS. If +// |use_cellular_upload_interval| is true, this returns an interval suitable for +// metered cellular connections. Otherwise, this returns an interval suitable +// for unmetered (ex. WiFi) connections. +base::TimeDelta GetUploadInterval(bool use_cellular_upload_interval); -// Returns true if current connection type is cellular and user is assigned to -// experimental group for enabled cellular uploads. -bool IsCellularLogicEnabled(); +// Returns true if current connection type is cellular and the platform supports +// using a separate interval for cellular connections (at the moment, this is +// supported for OS_ANDROID and OS_IOS). +bool ShouldUseCellularUploadInterval(); } // namespace metrics
diff --git a/components/mirroring/service/fake_network_service.cc b/components/mirroring/service/fake_network_service.cc index 6b9794b4..97f36ac6 100644 --- a/components/mirroring/service/fake_network_service.cc +++ b/components/mirroring/service/fake_network_service.cc
@@ -12,7 +12,7 @@ MockUdpSocket::MockUdpSocket( mojo::PendingReceiver<network::mojom::UDPSocket> receiver, - network::mojom::UDPSocketListenerPtr listener) + mojo::PendingRemote<network::mojom::UDPSocketListener> listener) : receiver_(this, std::move(receiver)), listener_(std::move(listener)) {} MockUdpSocket::~MockUdpSocket() {} @@ -60,7 +60,7 @@ void MockNetworkContext::CreateUDPSocket( mojo::PendingReceiver<network::mojom::UDPSocket> receiver, - network::mojom::UDPSocketListenerPtr listener) { + mojo::PendingRemote<network::mojom::UDPSocketListener> listener) { udp_socket_ = std::make_unique<MockUdpSocket>(std::move(receiver), std::move(listener)); OnUDPSocketCreated();
diff --git a/components/mirroring/service/fake_network_service.h b/components/mirroring/service/fake_network_service.h index bd3a10d..d8ef20b 100644 --- a/components/mirroring/service/fake_network_service.h +++ b/components/mirroring/service/fake_network_service.h
@@ -8,7 +8,9 @@ #include "base/callback.h" #include "media/cast/net/cast_transport_defines.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/udp_socket.mojom.h" #include "services/network/test/test_network_context.h" #include "testing/gmock/include/gmock/gmock.h" @@ -18,8 +20,9 @@ class MockUdpSocket final : public network::mojom::UDPSocket { public: - MockUdpSocket(mojo::PendingReceiver<network::mojom::UDPSocket> receiver, - network::mojom::UDPSocketListenerPtr listener); + MockUdpSocket( + mojo::PendingReceiver<network::mojom::UDPSocket> receiver, + mojo::PendingRemote<network::mojom::UDPSocketListener> listener); ~MockUdpSocket() override; MOCK_METHOD0(OnSend, void()); @@ -59,7 +62,7 @@ private: mojo::Receiver<network::mojom::UDPSocket> receiver_; - network::mojom::UDPSocketListenerPtr listener_; + mojo::Remote<network::mojom::UDPSocketListener> listener_; std::unique_ptr<media::cast::Packet> sending_packet_; int num_ask_for_receive_ = 0; @@ -77,7 +80,7 @@ // network::mojom::NetworkContext implementation: void CreateUDPSocket( mojo::PendingReceiver<network::mojom::UDPSocket> receiver, - network::mojom::UDPSocketListenerPtr listener) override; + mojo::PendingRemote<network::mojom::UDPSocketListener> listener) override; void CreateURLLoaderFactory( network::mojom::URLLoaderFactoryRequest request, network::mojom::URLLoaderFactoryParamsPtr params) override;
diff --git a/components/mirroring/service/udp_socket_client.cc b/components/mirroring/service/udp_socket_client.cc index d7b6a57..3c8e19f 100644 --- a/components/mirroring/service/udp_socket_client.cc +++ b/components/mirroring/service/udp_socket_client.cc
@@ -53,7 +53,6 @@ : remote_endpoint_(remote_endpoint), network_context_(context), error_callback_(std::move(error_callback)), - binding_(this), bytes_sent_(0), allow_sending_(false), num_packets_pending_receive_(0) { @@ -105,10 +104,8 @@ const media::cast::PacketReceiverCallbackWithStatus& packet_receiver) { DVLOG(1) << __func__; packet_receiver_callback_ = packet_receiver; - network::mojom::UDPSocketListenerPtr udp_socket_listener; - binding_.Bind(mojo::MakeRequest(&udp_socket_listener)); network_context_->CreateUDPSocket(udp_socket_.BindNewPipeAndPassReceiver(), - std::move(udp_socket_listener)); + receiver_.BindNewPipeAndPassRemote()); network::mojom::UDPSocketOptionsPtr options; udp_socket_->Connect(remote_endpoint_, std::move(options), base::BindOnce(&UdpSocketClient::OnSocketConnected, @@ -140,8 +137,8 @@ void UdpSocketClient::StopReceiving() { packet_receiver_callback_.Reset(); - if (binding_.is_bound()) - binding_.Close(); + if (receiver_.is_bound()) + receiver_.reset(); if (udp_socket_.is_bound()) udp_socket_.reset(); num_packets_pending_receive_ = 0;
diff --git a/components/mirroring/service/udp_socket_client.h b/components/mirroring/service/udp_socket_client.h index 7cbd8195..7618cac4 100644 --- a/components/mirroring/service/udp_socket_client.h +++ b/components/mirroring/service/udp_socket_client.h
@@ -8,7 +8,7 @@ #include "base/callback.h" #include "base/component_export.h" #include "media/cast/net/cast_transport_config.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/ip_endpoint.h" #include "services/network/public/mojom/network_service.mojom.h" @@ -60,7 +60,7 @@ network::mojom::NetworkContext* const network_context_; base::OnceClosure error_callback_; - mojo::Binding<network::mojom::UDPSocketListener> binding_; + mojo::Receiver<network::mojom::UDPSocketListener> receiver_{this}; // The callback to deliver the received packets to the packet parser. Set // when StartReceiving() is called.
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js index c8072fd..bfc275d 100644 --- a/components/neterror/resources/offline.js +++ b/components/neterror/resources/offline.js
@@ -1618,6 +1618,7 @@ this.spritePos = spritePos; this.xPos = 0; this.yPos = 0; + this.xInitialPos = 0; // Position when on the ground. this.groundYPos = 0; this.currentFrame = 0; @@ -1630,7 +1631,6 @@ this.config = Trex.config; // Current status. this.status = Trex.status.WAITING; - this.jumping = false; this.ducking = false; this.jumpVelocity = 0; @@ -1779,6 +1779,7 @@ if (this.playingIntro && this.xPos < this.config.START_X_POS) { this.xPos += Math.round((this.config.START_X_POS / this.config.INTRO_DURATION) * deltaTime); + this.xInitialPos = this.xPos; } if (this.status == Trex.status.WAITING) { @@ -1957,6 +1958,7 @@ * Reset the t-rex to running at start of game. */ reset: function() { + this.xPos = this.xInitialPos; this.yPos = this.groundYPos; this.jumpVelocity = 0; this.jumping = false;
diff --git a/components/offline_pages/content/background_loader/background_loader_contents.cc b/components/offline_pages/content/background_loader/background_loader_contents.cc index b0b86f1..030e61f 100644 --- a/components/offline_pages/content/background_loader/background_loader_contents.cc +++ b/components/offline_pages/content/background_loader/background_loader_contents.cc
@@ -76,21 +76,14 @@ } } -bool BackgroundLoaderContents::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool BackgroundLoaderContents::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { + const GURL& target_url) { // Background pages should not create other webcontents/tabs. - return false; + return true; } void BackgroundLoaderContents::AddNewContents(
diff --git a/components/offline_pages/content/background_loader/background_loader_contents.h b/components/offline_pages/content/background_loader/background_loader_contents.h index 77638f0..cac688e 100644 --- a/components/offline_pages/content/background_loader/background_loader_contents.h +++ b/components/offline_pages/content/background_loader/background_loader_contents.h
@@ -56,19 +56,12 @@ const std::string& request_method, base::OnceCallback<void(bool)> callback) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override; + const GURL& target_url) override; void AddNewContents(content::WebContents* source, std::unique_ptr<content::WebContents> new_contents,
diff --git a/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc b/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc index 7e22d0e..0a0aec9 100644 --- a/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc +++ b/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc
@@ -134,14 +134,11 @@ } TEST_F(BackgroundLoaderContentsTest, ShouldNotCreateWebContents) { - ASSERT_FALSE(contents()->ShouldCreateWebContents( - nullptr /* contents */, nullptr /* opener */, - nullptr /* source_site_instance */, 0 /* route_id */, - 0 /* main_frame_route_id */, 0 /* main_frame_widget_route_id */, + ASSERT_TRUE(contents()->IsWebContentsCreationOverridden( + nullptr /* source_site_instance */, content::mojom::WindowContainerType::NORMAL /* window_container_type */, GURL() /* opener_url */, "foo" /* frame_name */, - GURL::EmptyGURL() /* target_url */, "bar" /* partition_id */, - nullptr /* session_storage_namespace */)); + GURL::EmptyGURL() /* target_url */)); } TEST_F(BackgroundLoaderContentsTest, ShouldNotAddNewContents) {
diff --git a/components/optimization_guide/optimization_guide_enums.h b/components/optimization_guide/optimization_guide_enums.h index b00303d..9423c6c 100644 --- a/components/optimization_guide/optimization_guide_enums.h +++ b/components/optimization_guide/optimization_guide_enums.h
@@ -52,9 +52,11 @@ kPageLoadDoesNotMatch, // The page load matches the optimization target. kPageLoadMatches, - + // The model needed to make the target decision was not available on the + // client. + kModelNotAvailableOnClient, // Add new values above this line. - kMaxValue = kPageLoadMatches, + kMaxValue = kModelNotAvailableOnClient, }; } // namespace optimization_guide
diff --git a/components/previews/content/previews_decider_impl.cc b/components/previews/content/previews_decider_impl.cc index f1685267..cda604e 100644 --- a/components/previews/content/previews_decider_impl.cc +++ b/components/previews/content/previews_decider_impl.cc
@@ -323,21 +323,21 @@ } passed_reasons->push_back(PreviewsEligibilityReason::DEVICE_OFFLINE); - // If the optimization type does not require optimization hints, determine + // If the optimization type is not a commit-time preview, determine // the ECT network triggering condition here. - if (!ShouldCheckOptimizationHints(type)) { + if (!IsCommitTimePreview(type)) { if (effective_connection_type_ > previews::params::GetECTThresholdForPreview(type)) { return PreviewsEligibilityReason::NETWORK_NOT_SLOW; } passed_reasons->push_back(PreviewsEligibilityReason::NETWORK_NOT_SLOW); - } - if (effective_connection_type_ > params::GetSessionMaxECTThreshold()) { - return PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION; + if (effective_connection_type_ > params::GetSessionMaxECTThreshold()) { + return PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION; + } + passed_reasons->push_back( + PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION); } - passed_reasons->push_back( - PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION); } if (is_reload) {
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc index 19c3d8f0..d1423bf 100644 --- a/components/sync/driver/profile_sync_service.cc +++ b/components/sync/driver/profile_sync_service.cc
@@ -859,7 +859,8 @@ initial_types, debug_info_listener, &data_type_controllers_, user_settings_.get(), engine_.get(), this); - crypto_.SetSyncEngine(engine_.get()); + crypto_.SetSyncEngine(GetAuthenticatedAccountInfo().account_id, + engine_.get()); // Auto-start means IsFirstSetupComplete gets set automatically. if (start_behavior_ == AUTO_START &&
diff --git a/components/sync/driver/sync_service_crypto.cc b/components/sync/driver/sync_service_crypto.cc index 6faacdc..78029e7a 100644 --- a/components/sync/driver/sync_service_crypto.cc +++ b/components/sync/driver/sync_service_crypto.cc
@@ -284,8 +284,11 @@ } void SyncServiceCrypto::AddTrustedVaultDecryptionKeys( + const CoreAccountId& account_id, const std::vector<std::string>& keys) { - state_.engine->AddTrustedVaultDecryptionKeys(keys); + if (state_.engine && state_.account_id == account_id) { + state_.engine->AddTrustedVaultDecryptionKeys(keys); + } } PassphraseType SyncServiceCrypto::GetPassphraseType() const { @@ -433,6 +436,13 @@ notify_observers_.Run(); } +void SyncServiceCrypto::SetSyncEngine(const CoreAccountId& account_id, + SyncEngine* engine) { + DCHECK(engine); + state_.account_id = account_id; + state_.engine = engine; +} + std::unique_ptr<SyncEncryptionHandler::Observer> SyncServiceCrypto::GetEncryptionObserverProxy() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/sync/driver/sync_service_crypto.h b/components/sync/driver/sync_service_crypto.h index f996c11..786a3ce 100644 --- a/components/sync/driver/sync_service_crypto.h +++ b/components/sync/driver/sync_service_crypto.h
@@ -16,6 +16,7 @@ #include "components/sync/engine/configure_reason.h" #include "components/sync/engine/sync_encryption_handler.h" #include "components/sync/engine/sync_engine.h" +#include "google_apis/gaia/core_account_id.h" namespace syncer { @@ -43,7 +44,8 @@ bool IsEncryptEverythingEnabled() const; void SetEncryptionPassphrase(const std::string& passphrase); bool SetDecryptionPassphrase(const std::string& passphrase); - void AddTrustedVaultDecryptionKeys(const std::vector<std::string>& keys); + void AddTrustedVaultDecryptionKeys(const CoreAccountId& account_id, + const std::vector<std::string>& keys); // Returns the actual passphrase type being used for encryption. PassphraseType GetPassphraseType() const; @@ -70,7 +72,7 @@ base::Time passphrase_time) override; // Used to provide the engine when it is initialized. - void SetSyncEngine(SyncEngine* engine) { state_.engine = engine; } + void SetSyncEngine(const CoreAccountId& account_id, SyncEngine* engine); // Creates a proxy observer object that will post calls to this thread. std::unique_ptr<SyncEncryptionHandler::Observer> GetEncryptionObserverProxy(); @@ -105,6 +107,9 @@ // Not-null when the engine is initialized. SyncEngine* engine = nullptr; + // Populated when the engine is initialized. + CoreAccountId account_id; + RequiredUserAction required_user_action = RequiredUserAction::kNone; // The current set of encrypted types. Always a superset of
diff --git a/components/sync/driver/sync_user_settings.h b/components/sync/driver/sync_user_settings.h index 7d0332f9..efa0b6c3 100644 --- a/components/sync/driver/sync_user_settings.h +++ b/components/sync/driver/sync_user_settings.h
@@ -15,6 +15,8 @@ #include "components/sync/base/user_selectable_type.h" #include "components/sync/driver/data_type_encryption_handler.h" +struct CoreAccountId; + namespace syncer { // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser @@ -118,6 +120,7 @@ // TRUSTED_VAULT_PASSPHRASE: it provides new decryption keys that could // allow decrypting pending Nigori keys. virtual void AddTrustedVaultDecryptionKeys( + const CoreAccountId& account_id, const std::vector<std::string>& keys) = 0; };
diff --git a/components/sync/driver/sync_user_settings_impl.cc b/components/sync/driver/sync_user_settings_impl.cc index b77ef212..d336fa95 100644 --- a/components/sync/driver/sync_user_settings_impl.cc +++ b/components/sync/driver/sync_user_settings_impl.cc
@@ -171,9 +171,10 @@ } void SyncUserSettingsImpl::AddTrustedVaultDecryptionKeys( + const CoreAccountId& account_id, const std::vector<std::string>& keys) { DVLOG(1) << "Adding trusted vault decryption keys."; - crypto_->AddTrustedVaultDecryptionKeys(keys); + crypto_->AddTrustedVaultDecryptionKeys(account_id, keys); } void SyncUserSettingsImpl::SetSyncRequestedIfNotSetExplicitly() {
diff --git a/components/sync/driver/sync_user_settings_impl.h b/components/sync/driver/sync_user_settings_impl.h index e689df9..c18c6b4 100644 --- a/components/sync/driver/sync_user_settings_impl.h +++ b/components/sync/driver/sync_user_settings_impl.h
@@ -14,6 +14,8 @@ #include "components/sync/driver/sync_type_preference_provider.h" #include "components/sync/driver/sync_user_settings.h" +struct CoreAccountId; + namespace syncer { class SyncPrefs; @@ -63,6 +65,7 @@ void SetEncryptionPassphrase(const std::string& passphrase) override; bool SetDecryptionPassphrase(const std::string& passphrase) override; void AddTrustedVaultDecryptionKeys( + const CoreAccountId& account_id, const std::vector<std::string>& keys) override; void SetSyncRequestedIfNotSetExplicitly();
diff --git a/components/sync/driver/sync_user_settings_mock.h b/components/sync/driver/sync_user_settings_mock.h index bd279f2..7ab5cf6 100644 --- a/components/sync/driver/sync_user_settings_mock.h +++ b/components/sync/driver/sync_user_settings_mock.h
@@ -9,6 +9,7 @@ #include <vector> #include "components/sync/driver/sync_user_settings.h" +#include "google_apis/gaia/core_account_id.h" #include "testing/gmock/include/gmock/gmock.h" namespace syncer { @@ -47,8 +48,8 @@ MOCK_METHOD1(SetEncryptionPassphrase, void(const std::string&)); MOCK_METHOD1(SetDecryptionPassphrase, bool(const std::string&)); - MOCK_METHOD1(AddTrustedVaultDecryptionKeys, - void(const std::vector<std::string>&)); + MOCK_METHOD2(AddTrustedVaultDecryptionKeys, + void(const CoreAccountId&, const std::vector<std::string>&)); }; } // namespace syncer
diff --git a/components/sync/driver/test_sync_user_settings.cc b/components/sync/driver/test_sync_user_settings.cc index 3335da8..a5e45d69 100644 --- a/components/sync/driver/test_sync_user_settings.cc +++ b/components/sync/driver/test_sync_user_settings.cc
@@ -153,6 +153,7 @@ } void TestSyncUserSettings::AddTrustedVaultDecryptionKeys( + const CoreAccountId& account_id, const std::vector<std::string>& keys) {} void TestSyncUserSettings::SetFirstSetupComplete() {
diff --git a/components/sync/driver/test_sync_user_settings.h b/components/sync/driver/test_sync_user_settings.h index d79639df..3c0fd09 100644 --- a/components/sync/driver/test_sync_user_settings.h +++ b/components/sync/driver/test_sync_user_settings.h
@@ -10,6 +10,8 @@ #include "components/sync/driver/sync_user_settings.h" +struct CoreAccountId; + namespace syncer { class TestSyncService; @@ -52,6 +54,7 @@ void SetEncryptionPassphrase(const std::string& passphrase) override; bool SetDecryptionPassphrase(const std::string& passphrase) override; void AddTrustedVaultDecryptionKeys( + const CoreAccountId& account_id, const std::vector<std::string>& keys) override; void SetFirstSetupComplete();
diff --git a/components/viz/demo/demo_main.cc b/components/viz/demo/demo_main.cc index d4ab1be..e40e9eb 100644 --- a/components/viz/demo/demo_main.cc +++ b/components/viz/demo/demo_main.cc
@@ -17,7 +17,7 @@ #include "mojo/core/embedder/embedder.h" #include "mojo/core/embedder/scoped_ipc_support.h" #include "ui/events/platform/platform_event_source.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/platform_window_init_properties.h" @@ -110,7 +110,7 @@ } private: - std::unique_ptr<ui::PlatformWindow> CreatePlatformWindow( + std::unique_ptr<ui::PlatformWindowBase> CreatePlatformWindow( const gfx::Rect& bounds) { ui::PlatformWindowInitProperties props(bounds); #if defined(USE_OZONE) @@ -178,7 +178,7 @@ std::unique_ptr<demo::DemoHost> host_; std::unique_ptr<demo::DemoService> service_; - std::unique_ptr<ui::PlatformWindow> platform_window_; + std::unique_ptr<ui::PlatformWindowBase> platform_window_; gfx::AcceleratedWidget widget_; DISALLOW_COPY_AND_ASSIGN(DemoWindow);
diff --git a/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc b/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc index e71d6a9..e002109 100644 --- a/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc +++ b/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc
@@ -21,7 +21,7 @@ #include "ui/ozone/public/platform_window_surface.h" #include "ui/ozone/public/surface_factory_ozone.h" #include "ui/ozone/public/surface_ozone_canvas.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/platform_window_init_properties.h"
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index 01a9482..21c26f2d 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "base/metrics/metrics_hashes.h" #include "base/task/post_task.h" #include "base/test/bind_test_util.h" #include "base/test/scoped_feature_list.h" @@ -86,14 +87,7 @@ void ExpectOutcome(BackForwardCacheMetrics::HistoryNavigationOutcome outcome, base::Location location) { base::HistogramBase::Sample sample = base::HistogramBase::Sample(outcome); - auto it = std::find_if( - expected_outcomes_.begin(), expected_outcomes_.end(), - [sample](const base::Bucket& bucket) { return bucket.min == sample; }); - if (it == expected_outcomes_.end()) { - expected_outcomes_.push_back(base::Bucket(sample, 1)); - } else { - it->count++; - } + AddSampleToBuckets(&expected_outcomes_, sample); EXPECT_EQ(expected_outcomes_, histogram_tester_.GetAllSamples( @@ -108,11 +102,37 @@ << location.ToString(); } + void ExpectDisabledWithReason(const std::string& reason, + base::Location location) { + base::HistogramBase::Sample sample = + base::HistogramBase::Sample(base::HashMetricName(reason)); + AddSampleToBuckets(&expected_disabled_reasons_, sample); + + EXPECT_EQ(expected_disabled_reasons_, + histogram_tester_.GetAllSamples( + "BackForwardCache.HistoryNavigationOutcome." + "DisabledForRenderFrameHostReason")) + << location.ToString(); + } + private: + void AddSampleToBuckets(std::vector<base::Bucket>* buckets, + base::HistogramBase::Sample sample) { + auto it = std::find_if( + buckets->begin(), buckets->end(), + [sample](const base::Bucket& bucket) { return bucket.min == sample; }); + if (it == buckets->end()) { + buckets->push_back(base::Bucket(sample, 1)); + } else { + it->count++; + } + } + base::test::ScopedFeatureList feature_list_; base::HistogramTester histogram_tester_; std::vector<base::Bucket> expected_outcomes_; + std::vector<base::Bucket> expected_disabled_reasons_; }; // Match RenderFrameHostImpl* that are in the BackForwardCache. @@ -2377,11 +2397,17 @@ web_contents() ->GetController() .GetBackForwardCache() - .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(), "test"); + .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(), + "DisabledByBackForwardCacheBrowserTest"); // 2) Navigate to B. EXPECT_TRUE(NavigateToURL(shell(), url_b)); EXPECT_TRUE(delete_observer_rfh_a.deleted()); + + // 3) Go back to A. + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ExpectDisabledWithReason("DisabledByBackForwardCacheBrowserTest", FROM_HERE); } IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, @@ -2400,7 +2426,8 @@ web_contents() ->GetController() .GetBackForwardCache() - .DisableForRenderFrameHost(rfh_a_id, "test"); + .DisableForRenderFrameHost(rfh_a_id, + "DisabledByBackForwardCacheBrowserTest"); // 2) Navigate to B. EXPECT_TRUE(NavigateToURL(shell(), url_b)); @@ -2410,7 +2437,13 @@ web_contents() ->GetController() .GetBackForwardCache() - .DisableForRenderFrameHost(rfh_a_id, "test"); + .DisableForRenderFrameHost(rfh_a_id, + "DisabledByBackForwardCacheBrowserTest"); + + // 3) Go back to A. + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ExpectDisabledWithReason("DisabledByBackForwardCacheBrowserTest", FROM_HERE); } IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, @@ -2437,6 +2470,8 @@ IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, DisableBackForwardEvictsIfAlreadyInCache) { + base::HistogramTester histogram_tester; + ASSERT_TRUE(embedded_test_server()->Start()); const GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html")); const GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html")); @@ -2456,10 +2491,16 @@ web_contents() ->GetController() .GetBackForwardCache() - .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(), "test"); + .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(), + "DisabledByBackForwardCacheBrowserTest"); EXPECT_TRUE(rfh_a->is_evicted_from_back_forward_cache()); delete_observer_rfh_a.WaitUntilDeleted(); + + // 3) Go back to A. + web_contents()->GetController().GoBack(); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + ExpectDisabledWithReason("DisabledByBackForwardCacheBrowserTest", FROM_HERE); } // Confirm that same-document navigation and not history-navigation does not
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 51e7d8fc..f5c6728 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -58,6 +58,7 @@ #include "third_party/blink/public/mojom/sms/sms_receiver.mojom.h" #include "third_party/blink/public/mojom/speech/speech_recognizer.mojom.h" #include "third_party/blink/public/mojom/speech/speech_synthesis.mojom.h" +#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h" #include "third_party/blink/public/mojom/wake_lock/wake_lock.mojom.h" #include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom.h" #include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h" @@ -181,6 +182,9 @@ &RenderFrameHostImpl::BindSmsReceiverReceiver, base::Unretained(host))); } + map->Add<blink::mojom::WebUsbService>(base::BindRepeating( + &RenderFrameHostImpl::CreateWebUsbService, base::Unretained(host))); + map->Add<blink::mojom::LockManager>(base::BindRepeating( &RenderFrameHostImpl::CreateLockManager, base::Unretained(host))); @@ -307,6 +311,8 @@ map->Add<blink::mojom::SmsReceiver>(base::BindRepeating( &DedicatedWorkerHost::BindSmsReceiverReceiver, base::Unretained(host))); } + map->Add<blink::mojom::WebUsbService>(base::BindRepeating( + &DedicatedWorkerHost::CreateWebUsbService, base::Unretained(host))); map->Add<media::mojom::VideoDecodePerfHistory>( base::BindRepeating(&DedicatedWorkerHost::BindVideoDecodePerfHistory, base::Unretained(host)));
diff --git a/content/browser/content_service_delegate_impl.cc b/content/browser/content_service_delegate_impl.cc index f792a5e..37692e762 100644 --- a/content/browser/content_service_delegate_impl.cc +++ b/content/browser/content_service_delegate_impl.cc
@@ -104,25 +104,18 @@ } // WebContentsDelegate: - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override { + const GURL& target_url) override { // This method is invoked when attempting to open links in a new tab, e.g.: // <a href="https://www.google.com/" target="_blank">Link</a> client_->DidSuppressNavigation(target_url, WindowOpenDisposition::NEW_FOREGROUND_TAB, /*from_user_gesture=*/true); - return false; + return true; } WebContents* OpenURLFromTab(WebContents* source,
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index eb4b7547..bd94ac13 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -527,9 +527,8 @@ #else if (delegate_) { base::FilePath website_save_directory; // Unused - bool skip_dir_check = false; // Unused delegate_->GetSaveDir(GetBrowserContext(), &website_save_directory, - &default_download_directory, &skip_dir_check); + &default_download_directory); } #endif if (default_download_directory.empty()) {
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index cf1e3383..9fb209b 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -91,8 +91,8 @@ MOCK_METHOD2(ShouldOpenDownload, bool(download::DownloadItem*, const DownloadOpenDelayedCallback&)); - MOCK_METHOD4(GetSaveDir, void(BrowserContext*, - base::FilePath*, base::FilePath*, bool*)); + MOCK_METHOD3(GetSaveDir, + void(BrowserContext*, base::FilePath*, base::FilePath*)); MOCK_METHOD5(ChooseSavePath, void( WebContents*, const base::FilePath&, const base::FilePath::StringType&, bool, const SavePackagePathPickedCallback&)); @@ -599,7 +599,7 @@ #if !defined(USE_X11) // Doing nothing will set the default download directory to null. - EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _)); + EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _)); #endif EXPECT_CALL(GetMockDownloadManagerDelegate(), ApplicationClientIdForFileScanning()) @@ -635,7 +635,7 @@ #if !defined(USE_X11) // Doing nothing will set the default download directory to null. - EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _)); + EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _)); #endif EXPECT_CALL(GetMockDownloadManagerDelegate(), ApplicationClientIdForFileScanning())
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index 46ca3cec..e6b08b0 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc
@@ -1240,12 +1240,10 @@ // need before calling to it. base::FilePath website_save_dir; base::FilePath download_save_dir; - bool skip_dir_check = false; auto* delegate = download_manager_->GetDelegate(); if (delegate) { - delegate->GetSaveDir( - web_contents()->GetBrowserContext(), &website_save_dir, - &download_save_dir, &skip_dir_check); + delegate->GetSaveDir(web_contents()->GetBrowserContext(), &website_save_dir, + &download_save_dir); } std::string mime_type = web_contents()->GetContentsMimeType(); bool can_save_as_complete = CanSaveAsComplete(mime_type); @@ -1253,7 +1251,7 @@ download::GetDownloadTaskRunner().get(), FROM_HERE, base::Bind(&SavePackage::CreateDirectoryOnFileThread, title_, page_url_, can_save_as_complete, mime_type, website_save_dir, - download_save_dir, skip_dir_check), + download_save_dir), base::Bind(&SavePackage::ContinueGetSaveInfo, this, can_save_as_complete)); } @@ -1265,8 +1263,7 @@ bool can_save_as_complete, const std::string& mime_type, const base::FilePath& website_save_dir, - const base::FilePath& download_save_dir, - bool skip_dir_check) { + const base::FilePath& download_save_dir) { DCHECK(download::GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); base::FilePath suggested_filename = filename_generation::GenerateFilename( @@ -1274,8 +1271,7 @@ base::FilePath save_dir; // If the default html/websites save folder doesn't exist... - // We skip the directory check for gdata directories on ChromeOS. - if (!skip_dir_check && !base::DirectoryExists(website_save_dir)) { + if (!base::DirectoryExists(website_save_dir)) { // If the default download dir doesn't exist, create it. if (!base::DirectoryExists(download_save_dir)) { bool res = base::CreateDirectory(download_save_dir);
diff --git a/content/browser/download/save_package.h b/content/browser/download/save_package.h index c3385f8..742fd2f 100644 --- a/content/browser/download/save_package.h +++ b/content/browser/download/save_package.h
@@ -305,8 +305,7 @@ bool can_save_as_complete, const std::string& mime_type, const base::FilePath& website_save_dir, - const base::FilePath& download_save_dir, - bool skip_dir_check); + const base::FilePath& download_save_dir); void ContinueGetSaveInfo(bool can_save_as_complete, const base::FilePath& suggested_path); void OnPathPicked(
diff --git a/content/browser/download/save_package_browsertest.cc b/content/browser/download/save_package_browsertest.cc index 69dee7f5..0007dac 100644 --- a/content/browser/download/save_package_browsertest.cc +++ b/content/browser/download/save_package_browsertest.cc
@@ -38,11 +38,9 @@ void GetSaveDir(BrowserContext* context, base::FilePath* website_save_dir, - base::FilePath* download_save_dir, - bool* skip_dir_check) override { + base::FilePath* download_save_dir) override { *website_save_dir = download_dir_; *download_save_dir = download_dir_; - *skip_dir_check = false; } bool ShouldCompleteDownload(download::DownloadItem* download,
diff --git a/content/browser/frame_host/back_forward_cache_impl.cc b/content/browser/frame_host/back_forward_cache_impl.cc index 35f7041..20a3d33 100644 --- a/content/browser/frame_host/back_forward_cache_impl.cc +++ b/content/browser/frame_host/back_forward_cache_impl.cc
@@ -413,8 +413,16 @@ g_bfcache_disabled_test_observer->OnDisabledForFrameWithReason(id, reason); auto* rfh = RenderFrameHostImpl::FromID(id); - if (rfh) + if (rfh) { rfh->DisallowBackForwardCache(); + + RenderFrameHostImpl* frame = rfh; + while (frame->GetParent()) + frame = frame->GetParent(); + + if (BackForwardCacheMetrics* metrics = frame->GetBackForwardCacheMetrics()) + metrics->MarkDisableForRenderFrameHost(reason); + } } void BackForwardCacheImpl::DisableForTesting(DisableForTestingReason reason) {
diff --git a/content/browser/frame_host/back_forward_cache_metrics.cc b/content/browser/frame_host/back_forward_cache_metrics.cc index 9b20ac30..45fdb9af 100644 --- a/content/browser/frame_host/back_forward_cache_metrics.cc +++ b/content/browser/frame_host/back_forward_cache_metrics.cc
@@ -5,6 +5,8 @@ #include "content/browser/frame_host/back_forward_cache_metrics.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/metrics_hashes.h" +#include "base/metrics/sparse_histogram.h" #include "content/browser/frame_host/navigation_entry_impl.h" #include "content/browser/frame_host/navigation_request.h" #include "content/public/browser/browser_thread.h" @@ -98,18 +100,9 @@ navigation->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK; if (navigation->IsInMainFrame() && !navigation->IsSameDocument() && is_history_navigation) { - // TODO(hajimehoshi): Use kNotCachedDueToExperimentCondition if the - // experiment condition does not match. - HistoryNavigationOutcome outcome = HistoryNavigationOutcome::kNotCached; - if (navigation->is_served_from_back_forward_cache()) - outcome = HistoryNavigationOutcome::kRestored; - if (evicted_ || last_committed_main_frame_navigation_id_ == -1) { - DCHECK(!navigation->is_served_from_back_forward_cache()); - outcome = HistoryNavigationOutcome::kEvicted; - } - UMA_HISTOGRAM_ENUMERATION("BackForwardCache.HistoryNavigationOutcome", - outcome, HistoryNavigationOutcome::kMaxValue); + RecordMetricsForHistoryNavigationCommit(navigation); evicted_ = false; + disallowed_reasons_.clear(); } if (last_committed_main_frame_navigation_id_ != -1 && @@ -189,4 +182,38 @@ evicted_ = true; } +void BackForwardCacheMetrics::MarkDisableForRenderFrameHost( + const base::StringPiece& reason) { + disallowed_reasons_.push_back(reason.as_string()); +} + +void BackForwardCacheMetrics::RecordMetricsForHistoryNavigationCommit( + NavigationRequest* navigation) { + // TODO(hajimehoshi): Use kNotCachedDueToExperimentCondition if the + // experiment condition does not match. + HistoryNavigationOutcome outcome = HistoryNavigationOutcome::kNotCached; + if (navigation->is_served_from_back_forward_cache()) + outcome = HistoryNavigationOutcome::kRestored; + if (evicted_ || last_committed_main_frame_navigation_id_ == -1) { + DCHECK(!navigation->is_served_from_back_forward_cache()); + outcome = HistoryNavigationOutcome::kEvicted; + } + UMA_HISTOGRAM_ENUMERATION("BackForwardCache.HistoryNavigationOutcome", + outcome, HistoryNavigationOutcome::kMaxValue); + + for (const std::string& reason : disallowed_reasons_) { + // Use SparseHistogram instead of other simple macros for metrics. It is + // because the reasons are represented as strings, and it was impossible to + // define an enum values. + base::HistogramBase* histogram = base::SparseHistogram::FactoryGet( + "BackForwardCache.HistoryNavigationOutcome." + "DisabledForRenderFrameHostReason", + base::HistogramBase::kUmaTargetedHistogramFlag); + // Adopts the lower 32 bits as a signed integer from unsigned 64 bits + // integer. + histogram->Add(base::HistogramBase::Sample( + static_cast<int32_t>(base::HashMetricName(reason)))); + } +} + } // namespace content
diff --git a/content/browser/frame_host/back_forward_cache_metrics.h b/content/browser/frame_host/back_forward_cache_metrics.h index 29aa5d2..820e064d 100644 --- a/content/browser/frame_host/back_forward_cache_metrics.h +++ b/content/browser/frame_host/back_forward_cache_metrics.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/optional.h" +#include "base/strings/string_piece.h" #include "base/time/tick_clock.h" #include "base/time/time.h" #include "content/common/content_export.h" @@ -96,6 +97,9 @@ // TODO(hajimehoshi): Add the parameter representing the reason. void MarkEvictedFromBackForwardCache(); + // Marks the frame disabled the back forward cache with the reason. + void MarkDisableForRenderFrameHost(const base::StringPiece& reason); + // Injects a clock for mocking time. // Should be called only from the UI thread. CONTENT_EXPORT static void OverrideTimeForTesting(base::TickClock* clock); @@ -112,6 +116,8 @@ void CollectFeatureUsageFromSubtree(RenderFrameHostImpl* rfh, const url::Origin& main_frame_origin); + void RecordMetricsForHistoryNavigationCommit(NavigationRequest* navigation); + // Main frame document sequence number that identifies all NavigationEntries // this metrics object is associated with. const int64_t document_sequence_number_; @@ -136,6 +142,7 @@ base::Optional<base::TimeTicks> navigated_away_from_main_document_timestamp_; bool evicted_ = false; + std::vector<std::string> disallowed_reasons_; DISALLOW_COPY_AND_ASSIGN(BackForwardCacheMetrics); };
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index ec254065..9e0df57 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -4203,8 +4203,9 @@ cloned_namespace.get()); if (is_new_browsing_instance || !new_window) { - // Opener suppressed or Javascript access disabled. Never tell the renderer - // about the new window. + // Opener suppressed, Javascript access disabled, or delegate did not + // provide a handle to any windows it created. In these cases, never tell + // the renderer about the new window. std::move(callback).Run(mojom::CreateNewWindowStatus::kIgnore, nullptr); return; } @@ -4223,8 +4224,8 @@ if (main_frame->waiting_for_init_) { // Need to check |waiting_for_init_| as some paths inside CreateNewWindow - // call above (namely, if WebContentsDelegate::ShouldCreateWebContents - // returns false) will resume requests by calling RenderFrameHostImpl::Init. + // call above (eg if WebContentsDelegate::IsWebContentsCreationOverridden() + // returns true) will resume requests by calling RenderFrameHostImpl::Init. main_frame->frame_->BlockRequests(); } @@ -4436,9 +4437,6 @@ } } - registry_->AddInterface(base::BindRepeating( - &RenderFrameHostImpl::CreateWebUsbService, base::Unretained(this))); - registry_->AddInterface<media::mojom::InterfaceFactory>( base::Bind(&RenderFrameHostImpl::BindMediaInterfaceFactoryRequest, base::Unretained(this)));
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 05b5ee08..5706d3a1 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -1133,6 +1133,10 @@ void BindSmsReceiverReceiver( mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver); + // Creates connections to WebUSB interfaces bound to this frame. + void CreateWebUsbService( + mojo::PendingReceiver<blink::mojom::WebUsbService> receiver); + // https://mikewest.github.io/corpp/#initialize-embedder-policy-for-global network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy() const { @@ -1170,6 +1174,10 @@ return appcache_handle_.get(); } + // Returns the BackForwardCacheMetrics associated with the last + // NavigationEntry this RenderFrameHostImpl committed. + BackForwardCacheMetrics* GetBackForwardCacheMetrics(); + base::WeakPtr<RenderFrameHostImpl> GetWeakPtr(); protected: @@ -1604,10 +1612,6 @@ void DeleteWebBluetoothService( WebBluetoothServiceImpl* web_bluetooth_service); - // Creates connections to WebUSB interfaces bound to this frame. - void CreateWebUsbService( - mojo::PendingReceiver<blink::mojom::WebUsbService> receiver); - void CreateAudioInputStreamFactory( mojo::PendingReceiver<mojom::RendererAudioInputStreamFactory> receiver); void CreateAudioOutputStreamFactory( @@ -1897,10 +1901,6 @@ // and ineligible for caching. void MaybeEvictFromBackForwardCache(); - // Returns the BackForwardCacheMetrics associated with the last - // NavigationEntry this RenderFrameHostImpl committed. - BackForwardCacheMetrics* GetBackForwardCacheMetrics(); - // Helper for handling download-related IPCs. void DownloadUrl( const GURL& url,
diff --git a/content/browser/loader/source_stream_to_data_pipe.cc b/content/browser/loader/source_stream_to_data_pipe.cc index 42793d7..d9b8c51 100644 --- a/content/browser/loader/source_stream_to_data_pipe.cc +++ b/content/browser/loader/source_stream_to_data_pipe.cc
@@ -11,11 +11,9 @@ SourceStreamToDataPipe::SourceStreamToDataPipe( std::unique_ptr<net::SourceStream> source, - mojo::ScopedDataPipeProducerHandle dest, - base::OnceCallback<void(int)> completion_callback) + mojo::ScopedDataPipeProducerHandle dest) : source_(std::move(source)), dest_(std::move(dest)), - completion_callback_(std::move(completion_callback)), writable_handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL, base::SequencedTaskRunnerHandle::Get()) { @@ -27,7 +25,9 @@ SourceStreamToDataPipe::~SourceStreamToDataPipe() = default; -void SourceStreamToDataPipe::Start() { +void SourceStreamToDataPipe::Start( + base::OnceCallback<void(int)> completion_callback) { + completion_callback_ = std::move(completion_callback); ReadMore(); }
diff --git a/content/browser/loader/source_stream_to_data_pipe.h b/content/browser/loader/source_stream_to_data_pipe.h index f909755a..899b802 100644 --- a/content/browser/loader/source_stream_to_data_pipe.h +++ b/content/browser/loader/source_stream_to_data_pipe.h
@@ -24,12 +24,11 @@ public: // Reads out the data from |source| and write into |dest|. SourceStreamToDataPipe(std::unique_ptr<net::SourceStream> source, - mojo::ScopedDataPipeProducerHandle dest, - base::OnceCallback<void(int)> completion_callback); + mojo::ScopedDataPipeProducerHandle dest); ~SourceStreamToDataPipe(); // Start reading the source. - void Start(); + void Start(base::OnceCallback<void(int)> completion_callback); int64_t TransferredBytes() const { return transferred_bytes_; } private:
diff --git a/content/browser/loader/source_stream_to_data_pipe_unittest.cc b/content/browser/loader/source_stream_to_data_pipe_unittest.cc index 5086c72..cac914a 100644 --- a/content/browser/loader/source_stream_to_data_pipe_unittest.cc +++ b/content/browser/loader/source_stream_to_data_pipe_unittest.cc
@@ -63,9 +63,12 @@ &consumer_end_)); adapter_ = std::make_unique<SourceStreamToDataPipe>( - std::move(source), std::move(producer_end), - base::BindOnce(&SourceStreamToDataPipeTest::FinishedReading, - base::Unretained(this))); + std::move(source), std::move(producer_end)); + } + + base::OnceCallback<void(int)> callback() { + return base::BindOnce(&SourceStreamToDataPipeTest::FinishedReading, + base::Unretained(this)); } void CompleteReadsIfAsync() { @@ -142,7 +145,7 @@ TEST_P(SourceStreamToDataPipeTest, EmptyStream) { Init(); source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode); - adapter()->Start(); + adapter()->Start(callback()); std::string output; EXPECT_EQ(ReadPipe(&output), net::OK); @@ -156,7 +159,7 @@ source()->AddReadResult(message, sizeof(message) - 1, net::OK, GetParam().mode); source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode); - adapter()->Start(); + adapter()->Start(callback()); std::string output; EXPECT_EQ(ReadPipe(&output), net::OK); @@ -170,7 +173,7 @@ source()->AddReadResult(message, sizeof(message) - 1, net::OK, GetParam().mode); source()->AddReadResult(nullptr, 0, net::ERR_FAILED, GetParam().mode); - adapter()->Start(); + adapter()->Start(callback()); std::string output; EXPECT_EQ(ReadPipe(&output), net::ERR_FAILED); @@ -183,7 +186,7 @@ Init(); source()->AddReadResult(message, sizeof(message) - 1, net::OK, GetParam().mode); - adapter()->Start(); + adapter()->Start(callback()); CloseConsumerHandle(); CompleteReadsIfAsync();
diff --git a/content/browser/media/capture/web_contents_audio_input_stream.cc b/content/browser/media/capture/web_contents_audio_input_stream.cc index 9acca58..26b35f6 100644 --- a/content/browser/media/capture/web_contents_audio_input_stream.cc +++ b/content/browser/media/capture/web_contents_audio_input_stream.cc
@@ -385,7 +385,7 @@ return new WebContentsAudioInputStream( media_id.render_process_id, media_id.main_render_frame_id, - audio_mirroring_manager, new WebContentsTracker(false), + audio_mirroring_manager, new WebContentsTracker(), new media::VirtualAudioInputStream( params, worker_task_runner, media::VirtualAudioInputStream::AfterCloseCallback()),
diff --git a/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc b/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc index 1dcf4f6..0469f64 100644 --- a/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc +++ b/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc
@@ -77,8 +77,7 @@ class MockWebContentsTracker : public WebContentsTracker { public: - MockWebContentsTracker() : WebContentsTracker(false) {} - + MockWebContentsTracker() = default; MOCK_METHOD3(Start, void(int render_process_id, int render_frame_id, const ChangeCallback& callback));
diff --git a/content/browser/media/capture/web_contents_tracker.cc b/content/browser/media/capture/web_contents_tracker.cc index 9a62779d..e88e0fc 100644 --- a/content/browser/media/capture/web_contents_tracker.cc +++ b/content/browser/media/capture/web_contents_tracker.cc
@@ -15,9 +15,7 @@ namespace content { -WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwhv) - : track_fullscreen_rwhv_(track_fullscreen_rwhv), - last_target_view_(nullptr) {} +WebContentsTracker::WebContentsTracker() : last_target_view_(nullptr) {} WebContentsTracker::~WebContentsTracker() { // Likely unintentional BUG if Stop() was not called before this point. @@ -64,11 +62,6 @@ if (!wc) return nullptr; - if (track_fullscreen_rwhv_) { - if (auto* view = wc->GetFullscreenRenderWidgetHostView()) - return view; - } - if (auto* view = wc->GetRenderWidgetHostView()) { // Make sure the RWHV is still associated with a RWH before considering the // view "alive." This is because a null RWH indicates the RWHV has had its
diff --git a/content/browser/media/capture/web_contents_tracker.h b/content/browser/media/capture/web_contents_tracker.h index 0805772..e306cb99 100644 --- a/content/browser/media/capture/web_contents_tracker.h +++ b/content/browser/media/capture/web_contents_tracker.h
@@ -33,11 +33,7 @@ : public base::RefCountedThreadSafe<WebContentsTracker>, public WebContentsObserver { public: - // If |track_fullscreen_rwhv| is true, the ChangeCallback will be run when a - // WebContents shows/destroys a fullscreen RenderWidgetHostView. If false, - // fullscreen events are ignored. Normally, specify true for video capture and - // false for audio capture. - explicit WebContentsTracker(bool track_fullscreen_rwhv); + WebContentsTracker(); // Callback to indicate a new RenderWidgetHostView should be targeted for // capture. This is also invoked with false to indicate tracking will not @@ -116,10 +112,6 @@ void DidShowFullscreenWidget() final; void DidDestroyFullscreenWidget() final; - // If true, the client is interested in the showing/destruction of fullscreen - // RenderWidgetHostViews. - const bool track_fullscreen_rwhv_; - // Pointer to the RenderWidgetHostView provided in the last run of // |callback_|. This is used to eliminate duplicate callback runs. RenderWidgetHostView* last_target_view_;
diff --git a/content/browser/network_service_restart_browsertest.cc b/content/browser/network_service_restart_browsertest.cc index 7eb1e913..94b43ac 100644 --- a/content/browser/network_service_restart_browsertest.cc +++ b/content/browser/network_service_restart_browsertest.cc
@@ -130,30 +130,24 @@ class ServiceWorkerStatusObserver : public ServiceWorkerContextCoreObserver { public: - void WaitForState(EmbeddedWorkerStatus expected_status) { - for (const auto& status : statuses_in_past_) { - if (status == expected_status) - return; - } + void WaitForStopped() { + if (stopped_) + return; - expected_status_ = expected_status; base::RunLoop loop; callback_ = loop.QuitClosure(); loop.Run(); } private: - void OnRunningStateChanged(int64_t version_id, - EmbeddedWorkerStatus running_status) override { - statuses_in_past_.push_back(running_status); - if (expected_status_.has_value() && - running_status == expected_status_.value()) { + void OnStopped(int64_t version_id) override { + stopped_ = true; + + if (callback_) std::move(callback_).Run(); - } } - base::Optional<EmbeddedWorkerStatus> expected_status_; - std::vector<EmbeddedWorkerStatus> statuses_in_past_; + bool stopped_ = false; base::OnceClosure callback_; }; @@ -802,7 +796,7 @@ partition->FlushNetworkInterfaceForTesting(); // Service worker should be stopped when network service crashes. - observer.WaitForState(EmbeddedWorkerStatus::STOPPED); + observer.WaitForStopped(); // Fetch from the controlled page again. EXPECT_EQ("Echo", EvalJs(shell(), script)); @@ -845,7 +839,7 @@ partition->FlushNetworkInterfaceForTesting(); // Service worker should be stopped when network service crashes. - observer.WaitForState(EmbeddedWorkerStatus::STOPPED); + observer.WaitForStopped(); // Fetch from the controlled page again. EXPECT_EQ("Echo", EvalJs(shell(), script)); @@ -889,7 +883,7 @@ partition->FlushNetworkInterfaceForTesting(); // Service worker should be stopped when network service crashes. - observer.WaitForState(EmbeddedWorkerStatus::STOPPED); + observer.WaitForStopped(); // Fetch from the controlled page again. EXPECT_EQ("Echo", EvalJs(shell(), script)); @@ -928,7 +922,7 @@ partition->FlushNetworkInterfaceForTesting(); // Service worker should be stopped when network service crashes. - observer.WaitForState(EmbeddedWorkerStatus::STOPPED); + observer.WaitForStopped(); // Fetch from the service worker again. EXPECT_EQ("Echo", EvalJs(shell(), script));
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc index eaca3258..0f465dfe 100644 --- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc +++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
@@ -92,12 +92,7 @@ render_process_id_(0), render_frame_id_(0), is_potentially_secure_plugin_context_( - host->IsPotentiallySecurePluginContext(instance)), - binding_(this) -#if defined(OS_CHROMEOS) - -#endif // defined(OS_CHROMEOS) -{ + host->IsPotentiallySecurePluginContext(instance)) { ++g_num_udp_filter_instances; DCHECK(host); @@ -110,7 +105,7 @@ PepperUDPSocketMessageFilter::~PepperUDPSocketMessageFilter() { DCHECK(closed_); DCHECK(!socket_); - DCHECK(!binding_); + DCHECK(!receiver_.is_bound()); --g_num_udp_filter_instances; } @@ -384,12 +379,12 @@ if (!render_frame_host) return PP_ERROR_NOACCESS; - network::mojom::UDPSocketListenerPtr udp_socket_listener; + mojo::PendingRemote<network::mojom::UDPSocketListener> udp_socket_listener; // Avoid binding the listener until the socket has been successfully Bound (in // a socket sense), to avoid providing read data to the caller until it has // been told that the socket was bound. - network::mojom::UDPSocketListenerRequest listener_request = - mojo::MakeRequest(&udp_socket_listener); + mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver = + udp_socket_listener.InitWithNewPipeAndPassReceiver(); SiteInstance* site_instance = render_frame_host->GetSiteInstance(); network::mojom::NetworkContext* network_context = @@ -416,7 +411,7 @@ socket_->Bind(end_point, std::move(udp_socket_options), base::BindOnce(&PepperUDPSocketMessageFilter::DoBindCallback, base::Unretained(this), - std::move(listener_request), reply_context)); + std::move(listener_receiver), reply_context)); return PP_OK_COMPLETIONPENDING; } @@ -428,9 +423,9 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(context); - // Check |binding_| instead of |socket_| because |binding_| is only set + // Check |receiver_| instead of |socket_| because |receiver_| is only set // after the Bind() call completes. - if (closed_ || !binding_) + if (closed_ || !receiver_.is_bound()) return PP_ERROR_FAILED; SocketPermissionRequest request = @@ -492,7 +487,7 @@ UDPSocketResourceConstants::kPluginReceiveBufferSlots) { // If the pipe was closed, but the consumer has not yet closed the UDP // socket, keep the read buffer filled with errors. - if (!binding_) { + if (!receiver_.is_bound()) { PepperUDPSocketMessageFilter::SendRecvFromError(PP_ERROR_FAILED); return PP_OK; } @@ -555,7 +550,7 @@ } void PepperUDPSocketMessageFilter::DoBindCallback( - network::mojom::UDPSocketListenerRequest listener_request, + mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver, const ppapi::host::ReplyMessageContext& context, int result, const base::Optional<net::IPEndPoint>& local_addr_out) { @@ -579,15 +574,15 @@ *local_addr_out, base::BindRepeating(&PepperUDPSocketMessageFilter::OnFirewallHoleOpened, firewall_hole_weak_ptr_factory_.GetWeakPtr(), - base::Passed(std::move(listener_request)), context, + base::Passed(std::move(listener_receiver)), context, net_address)); #else // !defined(OS_CHROMEOS) - OnBindComplete(std::move(listener_request), context, net_address); + OnBindComplete(std::move(listener_receiver), context, net_address); #endif // !defined(OS_CHROMEOS) } void PepperUDPSocketMessageFilter::OnBindComplete( - network::mojom::UDPSocketListenerRequest listener_request, + mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver, const ppapi::host::ReplyMessageContext& context, const PP_NetAddress_Private& net_address) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -595,8 +590,8 @@ SendBindReply(context, PP_OK, net_address); - binding_.Bind(std::move(listener_request)); - binding_.set_connection_error_handler(base::BindOnce( + receiver_.Bind(std::move(listener_receiver)); + receiver_.set_disconnect_handler(base::BindOnce( &PepperUDPSocketMessageFilter::PipeClosed, base::Unretained(this))); socket_.set_disconnect_handler(base::BindOnce( &PepperUDPSocketMessageFilter::PipeClosed, base::Unretained(this))); @@ -605,7 +600,7 @@ #if defined(OS_CHROMEOS) void PepperUDPSocketMessageFilter::OnFirewallHoleOpened( - network::mojom::UDPSocketListenerRequest listener_request, + mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver, const ppapi::host::ReplyMessageContext& context, const PP_NetAddress_Private& net_address, std::unique_ptr<chromeos::FirewallHole> hole) { @@ -614,7 +609,7 @@ LOG_IF(WARNING, !hole.get()) << "Firewall hole could not be opened."; firewall_hole_.reset(hole.release()); - OnBindComplete(std::move(listener_request), context, net_address); + OnBindComplete(std::move(listener_receiver), context, net_address); } #endif // defined(OS_CHROMEOS) @@ -636,7 +631,7 @@ void PepperUDPSocketMessageFilter::Close() { DCHECK_CURRENTLY_ON(BrowserThread::UI); socket_.reset(); - binding_.Close(); + receiver_.reset(); closed_ = true; }
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h index bf7e052..ca0eb1e 100644 --- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h +++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
@@ -21,8 +21,9 @@ #include "build/build_config.h" #include "content/common/content_export.h" #include "content/public/common/process_type.h" -#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" @@ -69,7 +70,7 @@ using CreateUDPSocketCallback = base::RepeatingCallback<void( network::mojom::NetworkContext* network_context, mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver, - network::mojom::UDPSocketListenerPtr socket_listener)>; + mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener)>; static void SetCreateUDPSocketCallbackForTesting( const CreateUDPSocketCallback* create_udp_socket_callback); @@ -127,16 +128,19 @@ int32_t OnMsgLeaveGroup(const ppapi::host::HostMessageContext* context, const PP_NetAddress_Private& addr); - void DoBindCallback(network::mojom::UDPSocketListenerRequest listener_request, + void DoBindCallback(mojo::PendingReceiver<network::mojom::UDPSocketListener> + listener_receiver, const ppapi::host::ReplyMessageContext& context, int result, const base::Optional<net::IPEndPoint>& local_addr_out); - void OnBindComplete(network::mojom::UDPSocketListenerRequest listener_request, + void OnBindComplete(mojo::PendingReceiver<network::mojom::UDPSocketListener> + listener_receiver, const ppapi::host::ReplyMessageContext& context, const PP_NetAddress_Private& net_address); #if defined(OS_CHROMEOS) void OnFirewallHoleOpened( - network::mojom::UDPSocketListenerRequest listener_request, + mojo::PendingReceiver<network::mojom::UDPSocketListener> + listener_receiver, const ppapi::host::ReplyMessageContext& context, const PP_NetAddress_Private& net_address, std::unique_ptr<chromeos::FirewallHole> hole); @@ -217,7 +221,7 @@ // Binding late avoids receiving data when still setting up the socket. Closed // in Close() and on Mojo pipe errors. Must only be accessed (and destroyed) // on UI thread. - mojo::Binding<network::mojom::UDPSocketListener> binding_; + mojo::Receiver<network::mojom::UDPSocketListener> receiver_{this}; #if defined(OS_CHROMEOS) std::unique_ptr<chromeos::FirewallHole,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index a02393b..85d02697 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3146,6 +3146,7 @@ switches::kUseGpuInTests, switches::kUseMobileUserAgent, switches::kV, + switches::kVideoCaptureUseGpuMemoryBuffer, switches::kVideoThreads, switches::kVideoUnderflowThresholdMs, switches::kVModule,
diff --git a/content/browser/resources/service_worker/serviceworker_internals.js b/content/browser/resources/service_worker/serviceworker_internals.js index 05eb06a..626f37f 100644 --- a/content/browser/resources/service_worker/serviceworker_internals.js +++ b/content/browser/resources/service_worker/serviceworker_internals.js
@@ -192,7 +192,7 @@ } } - function onRunningStateChanged(partition_id, version_id) { + function onRunningStateChanged() { update(); }
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index 7b552b3..dc28d77 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc
@@ -618,6 +618,9 @@ // deprecated. IN_PROC_BROWSER_TEST_F(CorsExploitBrowserTest, OriginHeaderSpoofViaHtmlImports) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + blink::features::kHtmlImportsRequestInitiatorLock); std::string victim_path = "/victim/secret.json"; net::test_server::ControllableHttpResponse victim_response( embedded_test_server(), victim_path, false);
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index 61679b2..765c1e8 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -3007,16 +3007,16 @@ run_loop_.Run(); } - void OnVersionRunningStatusChanged(content::ServiceWorkerContext* context, - int64_t version_id, - bool is_running) override { - if (is_running) { - EXPECT_EQ(context_, context); - version_id_ = version_id; + void OnVersionStartedRunning(content::ServiceWorkerContext* context, + int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) override { + EXPECT_EQ(context_, context); + version_id_ = version_id; - if (run_loop_.running()) - run_loop_.Quit(); - } + if (run_loop_.running()) + run_loop_.Quit(); } private:
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc index 881dade..34c11cc6 100644 --- a/content/browser/service_worker/service_worker_context_core.cc +++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -606,15 +606,18 @@ } void ServiceWorkerContextCore::RemoveLiveVersion(int64_t id) { - if (live_versions_[id]->running_status() != EmbeddedWorkerStatus::STOPPED) { + auto it = live_versions_.find(id); + DCHECK(it != live_versions_.end()); + ServiceWorkerVersion* version = it->second; + + if (version->running_status() != EmbeddedWorkerStatus::STOPPED) { // Notify all observers that this live version is stopped, as it will // be removed from |live_versions_|. - observer_list_->Notify( - FROM_HERE, &ServiceWorkerContextCoreObserver::OnRunningStateChanged, id, - EmbeddedWorkerStatus::STOPPED); + observer_list_->Notify(FROM_HERE, + &ServiceWorkerContextCoreObserver::OnStopped, id); } - live_versions_.erase(id); + live_versions_.erase(it); } std::vector<ServiceWorkerRegistrationInfo> @@ -750,9 +753,29 @@ if (!version->context()) return; - observer_list_->Notify( - FROM_HERE, &ServiceWorkerContextCoreObserver::OnRunningStateChanged, - version->version_id(), version->running_status()); + switch (version->running_status()) { + case EmbeddedWorkerStatus::STOPPED: + observer_list_->Notify(FROM_HERE, + &ServiceWorkerContextCoreObserver::OnStopped, + version->version_id()); + break; + case EmbeddedWorkerStatus::STARTING: + observer_list_->Notify(FROM_HERE, + &ServiceWorkerContextCoreObserver::OnStarting, + version->version_id()); + break; + case EmbeddedWorkerStatus::RUNNING: + observer_list_->Notify( + FROM_HERE, &ServiceWorkerContextCoreObserver::OnStarted, + version->version_id(), version->scope(), + version->embedded_worker()->process_id(), version->script_url()); + break; + case EmbeddedWorkerStatus::STOPPING: + observer_list_->Notify(FROM_HERE, + &ServiceWorkerContextCoreObserver::OnStopping, + version->version_id()); + break; + } } void ServiceWorkerContextCore::OnVersionStateChanged(
diff --git a/content/browser/service_worker/service_worker_context_core_observer.h b/content/browser/service_worker/service_worker_context_core_observer.h index 50edd986..e5e8bd9 100644 --- a/content/browser/service_worker/service_worker_context_core_observer.h +++ b/content/browser/service_worker/service_worker_context_core_observer.h
@@ -46,8 +46,13 @@ virtual void OnNewLiveRegistration(int64_t registration_id, const GURL& scope) {} virtual void OnNewLiveVersion(const ServiceWorkerVersionInfo& version_info) {} - virtual void OnRunningStateChanged(int64_t version_id, - EmbeddedWorkerStatus running_status) {} + virtual void OnStarting(int64_t version_id) {} + virtual void OnStarted(int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) {} + virtual void OnStopping(int64_t version_id) {} + virtual void OnStopped(int64_t version_id) {} // Called when the context core is about to be deleted. After this is called, // method calls on this observer will be for a new context core, possibly // reusing version/registration IDs previously seen. So this method gives the
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc index f8fb56e..7959901b 100644 --- a/content/browser/service_worker/service_worker_context_unittest.cc +++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -248,7 +248,8 @@ VersionActivated, VersionRedundant, NoControllees, - VersionRunningStatusChanged, + VersionStartedRunning, + VersionStoppedRunning, Destruct }; struct EventLog { @@ -310,13 +311,22 @@ events_.push_back(log); } - void OnVersionRunningStatusChanged(content::ServiceWorkerContext* context, - int64_t version_id, - bool is_running) override { + void OnVersionStartedRunning(content::ServiceWorkerContext* context, + int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) override { EventLog log; - log.type = EventType::VersionRunningStatusChanged; + log.type = EventType::VersionStartedRunning; log.version_id = version_id; - log.is_running = is_running; + events_.push_back(log); + } + + void OnVersionStoppedRunning(content::ServiceWorkerContext* context, + int64_t version_id) override { + EventLog log; + log.type = EventType::VersionStoppedRunning; + log.version_id = version_id; events_.push_back(log); } @@ -470,7 +480,8 @@ EXPECT_EQ(2l, observer.events()[0].version_id); } -// Make sure OnVersionRunningStatusChanged is called on observer. +// Make sure OnVersionStartedRunning and OnVersionStoppedRunning are called on +// observer. TEST_F(ServiceWorkerContextTest, OnVersionRunningStatusChangedObserver) { GURL scope("https://www.example.com/"); GURL script_url("https://www.example.com/service_worker.js"); @@ -492,13 +503,18 @@ // Filter the events to be verified. for (auto event : observer.events()) { if (event.type == TestServiceWorkerContextObserver::EventType:: - VersionRunningStatusChanged) + VersionStartedRunning || + event.type == TestServiceWorkerContextObserver::EventType:: + VersionStoppedRunning) { events.push_back(event); + } } ASSERT_EQ(2u, events.size()); - EXPECT_EQ(true, events[0].is_running); - EXPECT_EQ(false, events[1].is_running); + EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionStartedRunning, + events[0].type); + EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionStoppedRunning, + events[1].type); EXPECT_EQ(events[0].version_id, events[1].version_id); }
diff --git a/content/browser/service_worker/service_worker_context_watcher.cc b/content/browser/service_worker/service_worker_context_watcher.cc index d6e1e92..1c458426 100644 --- a/content/browser/service_worker/service_worker_context_watcher.cc +++ b/content/browser/service_worker/service_worker_context_watcher.cc
@@ -34,7 +34,7 @@ WorkerRegistrationUpdatedCallback registration_callback, WorkerVersionUpdatedCallback version_callback, WorkerErrorReportedCallback error_callback) - : context_(context), + : context_(std::move(context)), registration_callback_(std::move(registration_callback)), version_callback_(std::move(version_callback)), error_callback_(std::move(error_callback)) { @@ -233,20 +233,23 @@ version_info_map_[version_id] = std::move(version); } -void ServiceWorkerContextWatcher::OnRunningStateChanged( - int64_t version_id, - content::EmbeddedWorkerStatus running_status) { - DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); - auto it = version_info_map_.find(version_id); - if (it == version_info_map_.end()) - return; - ServiceWorkerVersionInfo* version = it->second.get(); - if (version->running_status == running_status) - return; - version->running_status = running_status; - SendVersionInfo(*version); - if (IsStoppedAndRedundant(*version)) - version_info_map_.erase(version_id); +void ServiceWorkerContextWatcher::OnStarting(int64_t version_id) { + OnRunningStateChanged(version_id, EmbeddedWorkerStatus::STARTING); +} + +void ServiceWorkerContextWatcher::OnStarted(int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) { + OnRunningStateChanged(version_id, EmbeddedWorkerStatus::RUNNING); +} + +void ServiceWorkerContextWatcher::OnStopping(int64_t version_id) { + OnRunningStateChanged(version_id, EmbeddedWorkerStatus::STOPPING); +} + +void ServiceWorkerContextWatcher::OnStopped(int64_t version_id) { + OnRunningStateChanged(version_id, EmbeddedWorkerStatus::STOPPED); } void ServiceWorkerContextWatcher::OnVersionStateChanged( @@ -375,4 +378,20 @@ ServiceWorkerRegistrationInfo::IS_DELETED); } +void ServiceWorkerContextWatcher::OnRunningStateChanged( + int64_t version_id, + EmbeddedWorkerStatus running_status) { + DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); + auto it = version_info_map_.find(version_id); + if (it == version_info_map_.end()) + return; + ServiceWorkerVersionInfo* version = it->second.get(); + if (version->running_status == running_status) + return; + version->running_status = running_status; + SendVersionInfo(*version); + if (IsStoppedAndRedundant(*version)) + version_info_map_.erase(version_id); +} + } // namespace content
diff --git a/content/browser/service_worker/service_worker_context_watcher.h b/content/browser/service_worker/service_worker_context_watcher.h index e921b80..bb05c08 100644 --- a/content/browser/service_worker/service_worker_context_watcher.h +++ b/content/browser/service_worker/service_worker_context_watcher.h
@@ -84,8 +84,13 @@ void OnNewLiveRegistration(int64_t registration_id, const GURL& scope) override; void OnNewLiveVersion(const ServiceWorkerVersionInfo& version_info) override; - void OnRunningStateChanged(int64_t version_id, - EmbeddedWorkerStatus running_status) override; + void OnStarting(int64_t version_id) override; + void OnStarted(int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) override; + void OnStopping(int64_t version_id) override; + void OnStopped(int64_t version_id) override; void OnVersionStateChanged(int64_t version_id, const GURL& scope, ServiceWorkerVersion::Status status) override; @@ -112,6 +117,9 @@ void OnRegistrationDeleted(int64_t registration_id, const GURL& scope) override; + void OnRunningStateChanged(int64_t version_id, + EmbeddedWorkerStatus running_status); + std::unordered_map<int64_t, std::unique_ptr<ServiceWorkerVersionInfo>> version_info_map_; scoped_refptr<ServiceWorkerContextWrapper> context_;
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index b00b996..6e974b6 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -374,43 +374,28 @@ observer.OnNoControllees(version_id, scope); } -void ServiceWorkerContextWrapper::OnRunningStateChanged( - int64_t version_id, - EmbeddedWorkerStatus running_status) { +void ServiceWorkerContextWrapper::OnStarted(int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // When |running_status| is RUNNING/STOPPING, the service - // worker is doing some actual tasks, so we consider the service worker is - // in a running status. - // - // Although the service work does have some tasks being processed in the stage - // of STARTING, some resources of it may have not been allocated yet, - // e.g. process id. If STARTING is considered as running, then the observer of - // ServiceWorkerContextWrapper may get the unexpected information of this - // service worker after being notified due to the absence of the resoureces. - // - // TODO(minggang): Create a new observer to listen to the events when the - // process of the service worker is allocated/released, instead of using the - // running status of the embedded worker. - if (running_status == EmbeddedWorkerStatus::RUNNING) { - bool inserted = running_service_workers_.emplace(version_id).second; - DCHECK(inserted); - for (auto& observer : observer_list_) { - observer.OnVersionRunningStatusChanged(this, version_id, - true /* is_running */); - } - return; + bool inserted = running_service_workers_.emplace(version_id).second; + DCHECK(inserted); + for (auto& observer : observer_list_) { + observer.OnVersionStartedRunning(this, version_id, scope, process_id, + script_url); } +} - if (running_service_workers_.find(version_id) != - running_service_workers_.end() && - running_status == EmbeddedWorkerStatus::STOPPED) { - size_t removed = running_service_workers_.erase(version_id); - DCHECK_EQ(removed, 1u); - for (auto& observer : observer_list_) { - observer.OnVersionRunningStatusChanged(this, version_id, - false /* is_running */); - } +void ServiceWorkerContextWrapper::OnStopped(int64_t version_id) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + auto it = running_service_workers_.find(version_id); + if (it != running_service_workers_.end()) { + running_service_workers_.erase(it); + for (auto& observer : observer_list_) + observer.OnVersionStoppedRunning(this, version_id); } } @@ -419,8 +404,7 @@ for (int version_id : running_service_workers_) { for (auto& observer : observer_list_) { - observer.OnVersionRunningStatusChanged(this, version_id, - false /* is_running */); + observer.OnVersionStoppedRunning(this, version_id); } } running_service_workers_.clear();
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index d20ab19f..a1148924 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -123,8 +123,11 @@ void OnReportConsoleMessage(int64_t version_id, const ConsoleMessage& message) override; void OnNoControllees(int64_t version_id, const GURL& scope) override; - void OnRunningStateChanged(int64_t version_id, - EmbeddedWorkerStatus running_status) override; + void OnStarted(int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) override; + void OnStopped(int64_t version_id) override; void OnDeleteAndStartOver() override; void OnVersionStateChanged(int64_t version_id, const GURL& scope,
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc index 5d47fb53..8b5df1c 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -457,31 +457,31 @@ version_(std::move(version)), resource_type_(resource_type), prepare_callback_(std::move(prepare_callback)), - fetch_callback_(std::move(fetch_callback)), - did_complete_(false) { + fetch_callback_(std::move(fetch_callback)) { DCHECK(!request_->blob); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN1( - "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent", this, - "event_type", ServiceWorkerMetrics::EventTypeToString(GetEventType())); + TRACE_EVENT_WITH_FLOW1( + "ServiceWorker", + "ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher", + TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_OUT, "event_type", + ServiceWorkerMetrics::EventTypeToString(GetEventType())); } ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() { - if (!did_complete_) { - TRACE_EVENT_NESTABLE_ASYNC_END0( - "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent", - this); - } + TRACE_EVENT_WITH_FLOW0( + "ServiceWorker", + "ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher", + TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_IN); } void ServiceWorkerFetchDispatcher::Run() { DCHECK(version_->status() == ServiceWorkerVersion::ACTIVATING || version_->status() == ServiceWorkerVersion::ACTIVATED) << version_->status(); + TRACE_EVENT_WITH_FLOW0("ServiceWorker", "ServiceWorkerFetchDispatcher::Run", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); if (version_->status() == ServiceWorkerVersion::ACTIVATING) { - TRACE_EVENT_NESTABLE_ASYNC_BEGIN0( - "ServiceWorker", "ServiceWorkerFetchDispatcher::WaitForActivation", - this); version_->RegisterStatusChangeCallback( base::BindOnce(&ServiceWorkerFetchDispatcher::DidWaitForActivation, weak_factory_.GetWeakPtr())); @@ -491,12 +491,19 @@ } void ServiceWorkerFetchDispatcher::DidWaitForActivation() { - TRACE_EVENT_NESTABLE_ASYNC_END0( - "ServiceWorker", "ServiceWorkerFetchDispatcher::WaitForActivation", this); + TRACE_EVENT_WITH_FLOW0("ServiceWorker", + "ServiceWorkerFetchDispatcher::DidWaitForActivation", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); StartWorker(); } void ServiceWorkerFetchDispatcher::StartWorker() { + TRACE_EVENT_WITH_FLOW0("ServiceWorker", + "ServiceWorkerFetchDispatcher::StartWorker", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); + // We might be REDUNDANT if a new worker started activating and kicked us out // before we could finish activation. if (version_->status() != ServiceWorkerVersion::ACTIVATED) { @@ -510,8 +517,6 @@ return; } - TRACE_EVENT_NESTABLE_ASYNC_BEGIN0( - "ServiceWorker", "ServiceWorkerFetchDispatcher::StartWorker", this); version_->RunAfterStartWorker( GetEventType(), base::BindOnce(&ServiceWorkerFetchDispatcher::DidStartWorker, @@ -520,9 +525,11 @@ void ServiceWorkerFetchDispatcher::DidStartWorker( blink::ServiceWorkerStatusCode status) { - TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", - "ServiceWorkerFetchDispatcher::StartWorker", - this, "status", status); + TRACE_EVENT_WITH_FLOW0("ServiceWorker", + "ServiceWorkerFetchDispatcher::DidStartWorker", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); + if (status != blink::ServiceWorkerStatusCode::kOk) { DidFail(status); return; @@ -533,6 +540,10 @@ void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) << "Worker stopped too soon after it was started."; + TRACE_EVENT_WITH_FLOW0("ServiceWorker", + "ServiceWorkerFetchDispatcher::DispatchFetchEvent", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); // Grant the service worker's process access to files in the request body. if (request_->body) { @@ -543,8 +554,6 @@ // Run callback to say that the fetch event will be dispatched. DCHECK(prepare_callback_); std::move(prepare_callback_).Run(); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN0( - "ServiceWorker", "ServiceWorkerFetchDispatcher::FetchEvent", this); // Set up for receiving the response. mojo::PendingRemote<blink::mojom::ServiceWorkerFetchResponseCallback> @@ -591,15 +600,16 @@ void ServiceWorkerFetchDispatcher::DidFailToDispatch( std::unique_ptr<ResponseCallback> response_callback, blink::ServiceWorkerStatusCode status) { - TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", - "ServiceWorkerFetchDispatcher::FetchEvent", - this, "status", status); DidFail(status); } void ServiceWorkerFetchDispatcher::DidFail( blink::ServiceWorkerStatusCode status) { DCHECK_NE(blink::ServiceWorkerStatusCode::kOk, status); + TRACE_EVENT_WITH_FLOW1( + "ServiceWorker", "ServiceWorkerFetchDispatcher::DidFail", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "status", status); Complete(status, FetchEventResult::kShouldFallback, blink::mojom::FetchAPIResponse::New(), nullptr /* body_as_stream */, nullptr /* timing */); @@ -611,8 +621,10 @@ blink::mojom::FetchAPIResponsePtr response, blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream, blink::mojom::ServiceWorkerFetchEventTimingPtr timing) { - TRACE_EVENT_NESTABLE_ASYNC_END0( - "ServiceWorker", "ServiceWorkerFetchDispatcher::FetchEvent", this); + TRACE_EVENT_WITH_FLOW0("ServiceWorker", + "ServiceWorkerFetchDispatcher::DidFinish", + TRACE_ID_LOCAL(this), + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); Complete(blink::ServiceWorkerStatusCode::kOk, fetch_result, std::move(response), std::move(body_as_stream), std::move(timing)); } @@ -625,10 +637,6 @@ blink::mojom::ServiceWorkerFetchEventTimingPtr timing) { DCHECK(fetch_callback_); - did_complete_ = true; - TRACE_EVENT_NESTABLE_ASYNC_END1( - "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent", this, - "result", fetch_result); std::move(fetch_callback_) .Run(status, fetch_result, std::move(response), std::move(body_as_stream), std::move(timing), version_);
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.h b/content/browser/service_worker/service_worker_fetch_dispatcher.h index 5cebdd7..551d67b 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.h +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.h
@@ -114,7 +114,6 @@ const ResourceType resource_type_; base::OnceClosure prepare_callback_; FetchCallback fetch_callback_; - bool did_complete_; scoped_refptr<URLLoaderAssets> url_loader_assets_;
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc index e7fb99c..a08b10c5 100644 --- a/content/browser/service_worker/service_worker_internals_ui.cc +++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -250,12 +250,28 @@ : partition_id_(partition_id), web_ui_(web_ui) {} ~PartitionObserver() override {} // ServiceWorkerContextCoreObserver overrides: - void OnRunningStateChanged(int64_t version_id, - EmbeddedWorkerStatus) override { + void OnStarting(int64_t version_id) override { DCHECK_CURRENTLY_ON(BrowserThread::UI); web_ui_->CallJavascriptFunctionUnsafe( - "serviceworker.onRunningStateChanged", Value(partition_id_), - Value(base::NumberToString(version_id))); + "serviceworker.onRunningStateChanged"); + } + void OnStarted(int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) override { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + web_ui_->CallJavascriptFunctionUnsafe( + "serviceworker.onRunningStateChanged"); + } + void OnStopping(int64_t version_id) override { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + web_ui_->CallJavascriptFunctionUnsafe( + "serviceworker.onRunningStateChanged"); + } + void OnStopped(int64_t version_id) override { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + web_ui_->CallJavascriptFunctionUnsafe( + "serviceworker.onRunningStateChanged"); } void OnVersionStateChanged(int64_t version_id, const GURL& scope,
diff --git a/content/browser/site_per_process_unload_browsertest.cc b/content/browser/site_per_process_unload_browsertest.cc index 1a51200a..566c4a5 100644 --- a/content/browser/site_per_process_unload_browsertest.cc +++ b/content/browser/site_per_process_unload_browsertest.cc
@@ -21,6 +21,7 @@ #include "base/test/test_timeouts.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" +#include "build/build_config.h" #include "content/browser/frame_host/cross_process_frame_connector.h" #include "content/browser/frame_host/frame_tree.h" #include "content/browser/frame_host/navigation_controller_impl.h" @@ -378,7 +379,14 @@ // B2 A2 // | // C3 -IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, UnloadHandlerSubframes) { +// TODO(crbug.com/1012185): Flaky timeouts on Linux and Mac. +#if defined(OS_LINUX) || defined(OS_MACOSX) +#define MAYBE_UnloadHandlerSubframes DISABLED_UnloadHandlerSubframes +#else +#define MAYBE_UnloadHandlerSubframes UnloadHandlerSubframes +#endif +IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, + MAYBE_UnloadHandlerSubframes) { GURL main_url(embedded_test_server()->GetURL( "a.com", "/cross_site_iframe_factory.html?a(b(c(b),c(a(c))),d)")); EXPECT_TRUE(NavigateToURL(shell(), main_url));
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 3d447fd..91c9a1c 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2824,39 +2824,14 @@ static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace); CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context)); - // TODO(crbug.com/545684): Move these closer to usage after cleaning up the - // ShouldCreateWebContents() interface to not need the raw ID numbers. - int render_view_route_id = MSG_ROUTING_NONE; - int main_frame_route_id = MSG_ROUTING_NONE; - int main_frame_widget_route_id = MSG_ROUTING_NONE; - if (!is_new_browsing_instance) { - render_view_route_id = opener->GetProcess()->GetNextRoutingID(); - main_frame_route_id = opener->GetProcess()->GetNextRoutingID(); - main_frame_widget_route_id = opener->GetProcess()->GetNextRoutingID(); - } - - if (delegate_ && - !delegate_->ShouldCreateWebContents( - this, opener, source_site_instance, render_view_route_id, - main_frame_route_id, main_frame_widget_route_id, - params.window_container_type, opener->GetLastCommittedURL(), - params.frame_name, params.target_url, partition_id, - session_storage_namespace)) { - // Note: even though we're not creating a WebContents here, it could have - // been created by the embedder so ensure that the RenderFrameHost is - // properly initialized. - // It's safe to only target the frame because the render process will not - // have a chance to create more frames at this point. - RenderFrameHostImpl* rfh = - RenderFrameHostImpl::FromID(render_process_id, main_frame_route_id); - if (rfh) { - // TODO(crbug.com/545684): It's super surprising that - // ShouldCreateWebContents() is actually a way to allow - // BackgroundWebContents to intercede and provide a completely different - // webcontents. Fix that API. - return rfh->delegate(); - } - return nullptr; + if (delegate_ && delegate_->IsWebContentsCreationOverridden( + source_site_instance, params.window_container_type, + opener->GetLastCommittedURL(), params.frame_name, + params.target_url)) { + return static_cast<WebContentsImpl*>(delegate_->CreateCustomWebContents( + opener, source_site_instance, is_new_browsing_instance, + opener->GetLastCommittedURL(), params.frame_name, params.target_url, + partition_id, session_storage_namespace)); } bool renderer_started_hidden = @@ -2878,9 +2853,22 @@ // the opener's process will not given the routing IDs for the new // objects. create_params.renderer_initiated_creation = !is_new_browsing_instance; - create_params.routing_id = render_view_route_id; - create_params.main_frame_routing_id = main_frame_route_id; - create_params.main_frame_widget_routing_id = main_frame_widget_route_id; + + // If |is_new_browsing_instance| is true, defer routing_id allocation + // to the WebContentsImpl::Create() call. This is required because with + // a new browsing instance, WebContentsImpl::Create() may elect a different + // SiteInstance from |site_instance| (which happens if |site_instance| is + // nullptr for example). + // + // TODO(ajwong): This routing id allocation should be pushed down further + // into WebContentsImpl::Create(). + if (!is_new_browsing_instance) { + create_params.routing_id = opener->GetProcess()->GetNextRoutingID(); + create_params.main_frame_routing_id = + opener->GetProcess()->GetNextRoutingID(); + create_params.main_frame_widget_routing_id = + opener->GetProcess()->GetNextRoutingID(); + } std::unique_ptr<WebContentsImpl> new_contents; if (!is_guest) { @@ -2924,8 +2912,9 @@ // TODO(ajwong): This should be keyed off the RenderFrame routing id or the // FrameTreeNode id instead of the routing id of the Widget for the main // frame. https://crbug.com/545684 - DCHECK_NE(MSG_ROUTING_NONE, main_frame_widget_route_id); - GlobalRoutingID id(render_process_id, main_frame_widget_route_id); + DCHECK_NE(MSG_ROUTING_NONE, create_params.main_frame_routing_id); + GlobalRoutingID id(render_process_id, + create_params.main_frame_widget_routing_id); pending_contents_[id] = std::move(new_contents); AddDestructionObserver(new_contents_impl); }
diff --git a/content/browser/web_package/signed_exchange_loader.cc b/content/browser/web_package/signed_exchange_loader.cc index 9fa3f45..78798b3c 100644 --- a/content/browser/web_package/signed_exchange_loader.cc +++ b/content/browser/web_package/signed_exchange_loader.cc
@@ -300,9 +300,7 @@ } pending_body_consumer_ = std::move(consumer_handle); body_data_pipe_adapter_ = std::make_unique<SourceStreamToDataPipe>( - std::move(payload_stream), std::move(producer_handle), - base::BindOnce(&SignedExchangeLoader::FinishReadingBody, - base::Unretained(this))); + std::move(payload_stream), std::move(producer_handle)); StartReadingBody(); } @@ -337,7 +335,8 @@ // Start reading. client_->OnStartLoadingResponseBody(std::move(pending_body_consumer_)); - body_data_pipe_adapter_->Start(); + body_data_pipe_adapter_->Start(base::BindOnce( + &SignedExchangeLoader::FinishReadingBody, base::Unretained(this))); } void SignedExchangeLoader::FinishReadingBody(int result) {
diff --git a/content/browser/worker_host/dedicated_worker_host.h b/content/browser/worker_host/dedicated_worker_host.h index c2a8be3..d35c23e 100644 --- a/content/browser/worker_host/dedicated_worker_host.h +++ b/content/browser/worker_host/dedicated_worker_host.h
@@ -84,6 +84,8 @@ mojo::PendingReceiver<blink::mojom::IDBFactory> receiver); void BindSmsReceiverReceiver( mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver); + void CreateWebUsbService( + mojo::PendingReceiver<blink::mojom::WebUsbService> receiver); #if !defined(OS_ANDROID) void BindSerialService( @@ -148,9 +150,6 @@ RenderFrameHostImpl* render_frame_host, bool* bypass_redirect_checks); - void CreateWebUsbService( - mojo::PendingReceiver<blink::mojom::WebUsbService> receiver); - void CreateWebSocketConnector( mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver);
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h index c31444d..0d31d88 100644 --- a/content/common/resource_messages.h +++ b/content/common/resource_messages.h
@@ -29,10 +29,6 @@ #endif // INTERNAL_CONTENT_COMMON_RESOURCE_MESSAGES_H_ -#define IPC_MESSAGE_START ResourceMsgStart -#undef IPC_MESSAGE_EXPORT -#define IPC_MESSAGE_EXPORT CONTENT_EXPORT - IPC_ENUM_TRAITS_MAX_VALUE(blink::WebMixedContentContextType, blink::WebMixedContentContextType::kLast)
diff --git a/content/public/app/content_browser_manifest.cc b/content/public/app/content_browser_manifest.cc index ac188a6e..d73d0ea 100644 --- a/content/public/app/content_browser_manifest.cc +++ b/content/public/app/content_browser_manifest.cc
@@ -179,7 +179,6 @@ "blink.mojom.NativeFileSystemManager", "blink.mojom.NotificationService", "blink.mojom.QuotaDispatcherHost", - "blink.mojom.WebUsbService", "blink.mojom.WebSocketConnector"}) .ExposeInterfaceFilterCapability_Deprecated( "navigation:service_worker", "renderer", @@ -212,7 +211,6 @@ "blink.mojom.SharedWorkerConnector", "blink.mojom.TextSuggestionHost", "blink.mojom.UnhandledTapNotifier", - "blink.mojom.WebUsbService", "content.mojom.BrowserTarget", "content.mojom.InputInjector", "content.mojom.RendererAudioInputStreamFactory",
diff --git a/content/public/browser/download_manager_delegate.h b/content/public/browser/download_manager_delegate.h index ff0f7d0f..c2f4214b 100644 --- a/content/public/browser/download_manager_delegate.h +++ b/content/public/browser/download_manager_delegate.h
@@ -138,8 +138,7 @@ // Retrieve the directories to save html pages and downloads to. virtual void GetSaveDir(BrowserContext* browser_context, base::FilePath* website_save_dir, - base::FilePath* download_save_dir, - bool* skip_dir_check) {} + base::FilePath* download_save_dir) {} // Asks the user for the path to save a page. The delegate calls the callback // to give the answer.
diff --git a/content/public/browser/service_worker_context_observer.h b/content/public/browser/service_worker_context_observer.h index ea0f8d3..6bafdd0 100644 --- a/content/public/browser/service_worker_context_observer.h +++ b/content/public/browser/service_worker_context_observer.h
@@ -38,15 +38,21 @@ // Called when the service worker with id |version_id| starts or stops // running. // - // This function is currently only called after a worker finishes + // These functions are currently only called after a worker finishes // starting/stopping or the version is destroyed before finishing // stopping. That is, a worker in the process of starting is not yet - // considered running, even if it's executing JavaScript. See TODO in - // ServiceWorkerContextWrapper::OnRunningStateChanged. - virtual void OnVersionRunningStatusChanged( - content::ServiceWorkerContext* context, - int64_t version_id, - bool is_running) {} + // considered running, even if it's executing JavaScript. + // + // TODO(minggang): Create a new observer to listen to the events when the + // process of the service worker is allocated/released, instead of using the + // running status of the embedded worker. + virtual void OnVersionStartedRunning(ServiceWorkerContext* context, + int64_t version_id, + const GURL& scope, + int process_id, + const GURL& script_url) {} + virtual void OnVersionStoppedRunning(ServiceWorkerContext* context, + int64_t version_id) {} // Called when there are no more controllees for the service worker with id // |version_id|. @@ -58,7 +64,7 @@ const ConsoleMessage& message) {} // Called when |context| is destroyed. Observers must no longer use |context|. - virtual void OnDestruct(content::ServiceWorkerContext* context) {} + virtual void OnDestruct(ServiceWorkerContext* context) {} protected: virtual ~ServiceWorkerContextObserver() {}
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc index d868e5cc..1f046dd 100644 --- a/content/public/browser/web_contents_delegate.cc +++ b/content/public/browser/web_contents_delegate.cc
@@ -119,20 +119,25 @@ return true; } -bool WebContentsDelegate::ShouldCreateWebContents( - WebContents* web_contents, +bool WebContentsDelegate::IsWebContentsCreationOverridden( + SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) { + return false; +} + +WebContents* WebContentsDelegate::CreateCustomWebContents( RenderFrameHost* opener, SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, const std::string& partition_id, SessionStorageNamespace* session_storage_namespace) { - return true; + return nullptr; } JavaScriptDialogManager* WebContentsDelegate::GetJavaScriptDialogManager(
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index b0f8fe9..dd9fcc80 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -57,7 +57,6 @@ class FileSelectListener; class JavaScriptDialogManager; class RenderFrameHost; -class RenderProcessHost; class RenderWidgetHost; class SessionStorageNamespace; class SiteInstance; @@ -298,35 +297,30 @@ virtual bool OnGoToEntryOffset(int offset); // Allows delegate to control whether a new WebContents can be created by - // |web_contents|. + // the WebContents itself. // - // The route ID parameters passed to this method are associated with the - // |source_site_instance|'s RenderProcessHost. They may also be - // MSG_ROUTING_NONE. If they are valid, they correspond to a trio of - // RenderView, RenderFrame, and RenderWidget objects that have been created in - // the renderer, but not yet assigned a WebContents, RenderViewHost, - // RenderFrameHost, or RenderWidgetHost. + // If an delegate returns true, it can optionally also override + // CreateCustomWebContents() below to provide their own WebContents. + virtual bool IsWebContentsCreationOverridden( + SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url); + + // Allow delegate to creates a custom WebContents when + // WebContents::CreateNewWindow() is called. This function is only called + // when IsWebContentsCreationOverridden() returns true. // - // The return value is interpreted as follows: - // - // Return true: |web_contents| should create a WebContents. - // Return false: |web_contents| should not create a WebContents. The - // provisionally-created RenderView (if it exists) in the renderer - // process will be destroyed, UNLESS the delegate, during this method, - // itself creates a WebContents using |source_site_instance|, - // |route_id|, |main_frame_route_id|, and |main_frame_widget_route_id| - // as creation parameters. If this happens, the delegate assumes - // ownership of the corresponding RenderView, etc. |web_contents| will - // detect that this has happened by looking for the existence of a - // RenderViewHost in |source_site_instance| with |route_id|. - virtual bool ShouldCreateWebContents( - WebContents* web_contents, + // In general, a delegate should return a pointer to a created WebContents + // so that the opener can be given a references to it as appropriate. + // Returning nullptr also makes sense if the delegate wishes to suppress + // all window creation, or if the delegate wants to ensure the opener + // cannot get a reference effectively creating a new browsing instance. + virtual WebContents* CreateCustomWebContents( RenderFrameHost* opener, SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url,
diff --git a/content/public/test/ppapi_test_utils.h b/content/public/test/ppapi_test_utils.h index f0ff0c3..bfde4be 100644 --- a/content/public/test/ppapi_test_utils.h +++ b/content/public/test/ppapi_test_utils.h
@@ -9,6 +9,7 @@ #include "base/compiler_specific.h" #include "base/files/file_path.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/udp_socket.mojom.h" namespace base { @@ -50,7 +51,7 @@ using CreateUDPSocketCallback = base::RepeatingCallback<void( network::mojom::NetworkContext* network_context, mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver, - network::mojom::UDPSocketListenerPtr socket_listener)>; + mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener)>; // Sets a NetworkContext to be used by the Pepper TCP classes for testing. // Passed in NetworkContext must remain valid until the method is called again
diff --git a/content/public/test/service_worker_test_helpers.cc b/content/public/test/service_worker_test_helpers.cc index 50fd97f6..18ba6915 100644 --- a/content/public/test/service_worker_test_helpers.cc +++ b/content/public/test/service_worker_test_helpers.cc
@@ -55,10 +55,9 @@ } // ServiceWorkerContextCoreObserver: - void OnRunningStateChanged(int64_t version_id, - EmbeddedWorkerStatus status) override { + void OnStopped(int64_t version_id) override { DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); - if (version_id != version_id_ || status != EmbeddedWorkerStatus::STOPPED) + if (version_id != version_id_) return; std::move(stopped_callback_).Run(); }
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 3bd9cb1..6191caaf 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -35,6 +35,10 @@ [ mac ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Skip ] [ linux ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Skip ] +# TODO(crbug.com/1011653): re-enable these tests after ANGLE roll. +crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc [ Skip ] +crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc1 [ Skip ] + # Disabling all multiview checks temporarily while ANGLE side changes # get merged in. crbug.com/864524 [ win ] WebglExtension_OVR_multiview2 [ Skip ]
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 9ba7f41..2509827 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
@@ -42,6 +42,10 @@ crbug.com/808744 [ android ] WebglExtension_EXT_disjoint_timer_query [ Skip ] crbug.com/849576 [ no-passthrough ] WebglExtension_KHR_parallel_shader_compile [ Skip ] +# TODO(crbug.com/1011653): re-enable these tests after ANGLE roll. +crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc [ Skip ] +crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc1 [ Skip ] + # Extensions not available under D3D9 [ win d3d9 ] WebglExtension_EXT_sRGB [ Failure ] crbug.com/867718 [ win d3d9 ] WebglExtension_EXT_disjoint_timer_query [ Failure ]
diff --git a/extensions/browser/api/socket/socket_api.cc b/extensions/browser/api/socket/socket_api.cc index 7424290..94dc48ce 100644 --- a/extensions/browser/api/socket/socket_api.cc +++ b/extensions/browser/api/socket/socket_api.cc
@@ -241,12 +241,13 @@ case extensions::api::socket::SOCKET_TYPE_UDP: { socket_type_ = kSocketTypeUDP; - network::mojom::UDPSocketListenerPtr listener_ptr; - socket_listener_request_ = mojo::MakeRequest(&listener_ptr); + mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote; + socket_listener_receiver_ = + listener_remote.InitWithNewPipeAndPassReceiver(); content::BrowserContext::GetDefaultStoragePartition(browser_context()) ->GetNetworkContext() ->CreateUDPSocket(socket_.InitWithNewPipeAndPassReceiver(), - std::move(listener_ptr)); + std::move(listener_remote)); break; } case extensions::api::socket::SOCKET_TYPE_NONE: @@ -263,7 +264,7 @@ socket = new TCPSocket(browser_context(), extension_->id()); } else if (socket_type_ == kSocketTypeUDP) { socket = - new UDPSocket(std::move(socket_), std::move(socket_listener_request_), + new UDPSocket(std::move(socket_), std::move(socket_listener_receiver_), extension_->id()); } DCHECK(socket);
diff --git a/extensions/browser/api/socket/socket_api.h b/extensions/browser/api/socket/socket_api.h index 2280d8f..1657ac6 100644 --- a/extensions/browser/api/socket/socket_api.h +++ b/extensions/browser/api/socket/socket_api.h
@@ -22,6 +22,7 @@ #include "extensions/browser/extension_function.h" #include "extensions/common/api/socket.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/address_list.h" #include "net/base/network_change_notifier.h" @@ -197,7 +198,8 @@ // These two fields are only applicable if |socket_type_| is UDP. mojo::PendingRemote<network::mojom::UDPSocket> socket_; - network::mojom::UDPSocketListenerRequest socket_listener_request_; + mojo::PendingReceiver<network::mojom::UDPSocketListener> + socket_listener_receiver_; std::unique_ptr<api::socket::Create::Params> params_; SocketType socket_type_;
diff --git a/extensions/browser/api/sockets_udp/sockets_udp_api.cc b/extensions/browser/api/sockets_udp/sockets_udp_api.cc index 6bd1419..aedfe02e 100644 --- a/extensions/browser/api/sockets_udp/sockets_udp_api.cc +++ b/extensions/browser/api/sockets_udp/sockets_udp_api.cc
@@ -96,18 +96,18 @@ params_ = sockets_udp::Create::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params_.get()); - network::mojom::UDPSocketListenerPtr listener_ptr; - socket_listener_request_ = mojo::MakeRequest(&listener_ptr); + mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote; + socket_listener_receiver_ = listener_remote.InitWithNewPipeAndPassReceiver(); content::BrowserContext::GetDefaultStoragePartition(browser_context()) ->GetNetworkContext() ->CreateUDPSocket(socket_.InitWithNewPipeAndPassReceiver(), - std::move(listener_ptr)); + std::move(listener_remote)); return true; } void SocketsUdpCreateFunction::Work() { ResumableUDPSocket* socket = new ResumableUDPSocket( - std::move(socket_), std::move(socket_listener_request_), + std::move(socket_), std::move(socket_listener_receiver_), extension_->id()); sockets_udp::SocketProperties* properties = params_->properties.get();
diff --git a/extensions/browser/api/sockets_udp/sockets_udp_api.h b/extensions/browser/api/sockets_udp/sockets_udp_api.h index 128676a..ad9b06f2 100644 --- a/extensions/browser/api/sockets_udp/sockets_udp_api.h +++ b/extensions/browser/api/sockets_udp/sockets_udp_api.h
@@ -10,6 +10,7 @@ #include "base/gtest_prod_util.h" #include "extensions/browser/api/socket/socket_api.h" #include "extensions/common/api/sockets_udp.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" namespace extensions { @@ -59,7 +60,8 @@ FRIEND_TEST_ALL_PREFIXES(SocketsUdpUnitTest, Create); mojo::PendingRemote<network::mojom::UDPSocket> socket_; - network::mojom::UDPSocketListenerRequest socket_listener_request_; + mojo::PendingReceiver<network::mojom::UDPSocketListener> + socket_listener_receiver_; std::unique_ptr<sockets_udp::Create::Params> params_; };
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.cc b/extensions/browser/guest_view/extension_options/extension_options_guest.cc index 0890def7..bfe998a 100644 --- a/extensions/browser/guest_view/extension_options/extension_options_guest.cc +++ b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
@@ -207,24 +207,29 @@ return extension_options_guest_delegate_->HandleContextMenu(params); } -bool ExtensionOptionsGuest::ShouldCreateWebContents( - content::WebContents* web_contents, +bool ExtensionOptionsGuest::IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) { + // This method handles opening links from within the guest. Since this guest + // view is used for displaying embedded extension options, we want any + // external links to be opened in a new tab, not in a new guest view so we + // override creation. + return true; +} + +WebContents* ExtensionOptionsGuest::CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_renderer_initiated, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, const std::string& partition_id, content::SessionStorageNamespace* session_storage_namespace) { - // This method handles opening links from within the guest. Since this guest - // view is used for displaying embedded extension options, we want any - // external links to be opened in a new tab, not in a new guest view. - // Therefore we just open the URL in a new tab, and since we aren't handling - // the new web contents, we return false. + // To get links out of the guest view, we just open the URL in a new tab. // TODO(ericzeng): Open the tab in the background if the click was a // ctrl-click or middle mouse button click if (extension_options_guest_delegate_) { @@ -233,7 +238,11 @@ WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, false)); } - return false; + + // Returning nullptr here ensures that the guest-view can never get a + // reference to the new WebContents. It effectively forces a new browsing + // instance for all popups from an extensions guest. + return nullptr; } void ExtensionOptionsGuest::DidFinishNavigation(
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.h b/extensions/browser/guest_view/extension_options/extension_options_guest.h index bdeb2d5..3378cb2 100644 --- a/extensions/browser/guest_view/extension_options/extension_options_guest.h +++ b/extensions/browser/guest_view/extension_options/extension_options_guest.h
@@ -50,14 +50,16 @@ void CloseContents(content::WebContents* source) final; bool HandleContextMenu(content::RenderFrameHost* render_frame_host, const content::ContextMenuParams& params) final; - bool ShouldCreateWebContents( - content::WebContents* web_contents, + bool IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) final; + content::WebContents* CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url,
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc index 78cfe84..af060f3 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
@@ -391,14 +391,19 @@ return is_guest_fullscreen_; } -bool MimeHandlerViewGuest::ShouldCreateWebContents( - content::WebContents* web_contents, +bool MimeHandlerViewGuest::IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) { + return true; +} + +content::WebContents* MimeHandlerViewGuest::CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_renderer_initiated, const GURL& opener_url, const std::string& frame_name, const GURL& target_url, @@ -414,7 +419,7 @@ auto* delegate = embedder_web_contents()->GetDelegate(); if (delegate) delegate->OpenURLFromTab(embedder_web_contents(), open_params); - return false; + return nullptr; } bool MimeHandlerViewGuest::SetFullscreenState(bool is_fullscreen) {
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h index a608b0f3..14c969b9 100644 --- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h +++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
@@ -147,14 +147,16 @@ void ExitFullscreenModeForTab(content::WebContents*) override; bool IsFullscreenForTabOrPending( const content::WebContents* web_contents) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, + bool IsWebContentsCreationOverridden( + content::SiteInstance* source_site_instance, + content::mojom::WindowContainerType window_container_type, + const GURL& opener_url, + const std::string& frame_name, + const GURL& target_url) override; + content::WebContents* CreateCustomWebContents( content::RenderFrameHost* opener, content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, - content::mojom::WindowContainerType window_container_type, + bool is_new_browsing_instance, const GURL& opener_url, const std::string& frame_name, const GURL& target_url,
diff --git a/fuchsia/engine/browser/frame_impl.cc b/fuchsia/engine/browser/frame_impl.cc index 0e17d7a..b1f3ae5 100644 --- a/fuchsia/engine/browser/frame_impl.cc +++ b/fuchsia/engine/browser/frame_impl.cc
@@ -300,27 +300,18 @@ } } -bool FrameImpl::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool FrameImpl::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { + const GURL& target_url) { // Specify a generous upper bound for unacknowledged popup windows, so that we // can catch bad client behavior while not interfering with normal operation. constexpr size_t kMaxPendingWebContentsCount = 10; - DCHECK_EQ(web_contents, web_contents_.get()); - if (!popup_listener_) - return false; + return true; if (pending_popups_.size() >= kMaxPendingWebContentsCount) { // The content is producing popups faster than the embedder can process @@ -328,10 +319,10 @@ LOG(WARNING) << "Too many pending popups, ignoring request."; // Don't produce a WebContents for this popup. - return false; + return true; } - return true; + return false; } void FrameImpl::AddNewContents(
diff --git a/fuchsia/engine/browser/frame_impl.h b/fuchsia/engine/browser/frame_impl.h index 45c3abd..6e7f8c6 100644 --- a/fuchsia/engine/browser/frame_impl.h +++ b/fuchsia/engine/browser/frame_impl.h
@@ -141,19 +141,12 @@ const base::string16& message, int32_t line_no, const base::string16& source_id) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override; + const GURL& target_url) override; void WebContentsCreated(content::WebContents* source_contents, int opener_render_process_id, int opener_render_frame_id,
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_compressed_texture_etc.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_compressed_texture_etc.txt deleted file mode 100644 index cea65c6..0000000 --- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_compressed_texture_etc.txt +++ /dev/null
@@ -1,72 +0,0 @@ -Name - - CHROMIUM_compressed_texture_etc - -Name Strings - - GL_CHROMIUM_compressed_texture_etc - -Version - - Last Modifed Date: September 19, 2016 - -Dependencies - - OpenGL ES 2.0 is required. - -Overview - - This extension exposes the OpenGL ES 3.0 core compressed texture - formats in OpenGL ES 2.0. - -New Procedures and Functions - - None - -New Tokens - - Accepted by the <internalformat> parameter of CompressedTexImage2D and the - <format> parameter of CompressedTexSubImage2D: - - COMPRESSED_R11_EAC 0x9270 - COMPRESSED_SIGNED_R11_EAC 0x9271 - COMPRESSED_RG11_EAC 0x9272 - COMPRESSED_SIGNED_RG11_EAC 0x9273 - COMPRESSED_RGB8_ETC2 0x9274 - COMPRESSED_SRGB8_ETC2 0x9275 - COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 - COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 - COMPRESSED_RGBA8_ETC2_EAC 0x9278 - COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 - - Querying COMPRESSED_TEXTURE_FORMATS will include these new formats. - -New Procedures and Functions - - None. - -Errors - - The error INVALID_VALUE is generated if the <internalformat> parameter of - CompressedTexImage2D or the <format> parameter of CompressedTexSubImage2D is - COMPRESSED_R11_EAC, COMPRESSED_SIGNED_R11_EAC, COMPRESSED_RGB8_ETC2, - COMPRESSED_SRGB8_ETC2, COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 or - COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, and imageSize is not - - floor((width + 3) / 4) * floor((height + 3) / 4) * 8 - - The error INVALID_VALUE is generated if the <internalformat> parameter of - CompressedTexImage2D or the <format> paremeter of CompressedTexSubImage2D is - COMPRESSED_RG11_EAC, COMPRESSED_SIGNED_RG11_EAC, COMPRESSED_RGBA8_ETC2_EAC, - or COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, and imageSize is not - - floor((width + 3) / 4) * floor((height + 3) / 4) * 16 - - -New State - - None. - -Revision History - - 9/19/2016 First revision
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index f16cdc4..a737820a 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc
@@ -1060,12 +1060,12 @@ validators_.texture_internal_format_storage.AddValue(GL_ETC1_RGB8_OES); } - // Expose GL_CHROMIUM_compressed_texture_etc when ANGLE exposes it directly or + // Expose GL_ANGLE_compressed_texture_etc when ANGLE exposes it directly or // running on top of a non-ANGLE ES driver. We assume that this implies native // support of these formats. - if (gfx::HasExtension(extensions, "GL_CHROMIUM_compressed_texture_etc") || + if (gfx::HasExtension(extensions, "GL_ANGLE_compressed_texture_etc") || (gl_version_info_->is_es3 && !gl_version_info_->is_angle)) { - AddExtensionString("GL_CHROMIUM_compressed_texture_etc"); + AddExtensionString("GL_ANGLE_compressed_texture_etc"); validators_.UpdateETCCompressedTextureFormats(); }
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc index 9245613..0865a9b 100644 --- a/gpu/command_buffer/service/feature_info_unittest.cc +++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -468,11 +468,11 @@ GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT)); } -TEST_P(FeatureInfoTest, InitializeCHROMIUM_compressed_texture_etc) { +TEST_P(FeatureInfoTest, InitializeANGLE_compressed_texture_etc) { SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0"); EXPECT_TRUE(gfx::HasExtension(info_->extensions(), - "GL_CHROMIUM_compressed_texture_etc")); + "GL_ANGLE_compressed_texture_etc")); EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( GL_COMPRESSED_R11_EAC)); EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
diff --git a/gpu/vulkan/demo/vulkan_demo.h b/gpu/vulkan/demo/vulkan_demo.h index 3d8cd19..e1ca7307 100644 --- a/gpu/vulkan/demo/vulkan_demo.h +++ b/gpu/vulkan/demo/vulkan_demo.h
@@ -12,7 +12,7 @@ #include "gpu/vulkan/vulkan_swap_chain.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "ui/gfx/geometry/size.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" class SkCanvas; @@ -66,7 +66,7 @@ scoped_refptr<viz::VulkanContextProvider> vulkan_context_provider_; gfx::AcceleratedWidget accelerated_widget_ = gfx::kNullAcceleratedWidget; std::unique_ptr<ui::PlatformEventSource> event_source_; - std::unique_ptr<ui::PlatformWindow> window_; + std::unique_ptr<ui::PlatformWindowBase> window_; std::unique_ptr<VulkanSurface> vulkan_surface_; base::Optional<VulkanSwapChain::ScopedWrite> scoped_write_; sk_sp<SkSurface> sk_surface_;
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc index c0ff8fa6..86f4d81 100644 --- a/headless/lib/browser/headless_web_contents_impl.cc +++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -177,22 +177,15 @@ return target; } - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override { - return !headless_web_contents_->browser_context() - ->options() - ->block_new_web_contents(); + const GURL& target_url) override { + return headless_web_contents_->browser_context() + ->options() + ->block_new_web_contents(); } private:
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn index d457830..a2e1ebf 100644 --- a/ios/chrome/browser/metrics/BUILD.gn +++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -240,6 +240,7 @@ "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/settings", + "//ios/chrome/browser/ui/settings/google_services", "//ios/chrome/browser/ui/toolbar/buttons", "//ios/chrome/browser/ui/toolbar/public", "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm index 618a85b..415d973 100644 --- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm +++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -215,7 +215,7 @@ } base::TimeDelta IOSChromeMetricsServiceClient::GetStandardUploadInterval() { - return metrics::GetUploadInterval(); + return metrics::GetUploadInterval(metrics::ShouldUseCellularUploadInterval()); } void IOSChromeMetricsServiceClient::OnRendererProcessCrash() {
diff --git a/ios/chrome/browser/metrics/ukm_egtest.mm b/ios/chrome/browser/metrics/ukm_egtest.mm index 6ad1ae6..a60de87 100644 --- a/ios/chrome/browser/metrics/ukm_egtest.mm +++ b/ios/chrome/browser/metrics/ukm_egtest.mm
@@ -18,6 +18,7 @@ #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h" #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h" +#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h" #include "ios/chrome/browser/ui/util/ui_util.h" #include "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/app/chrome_test_util.h" @@ -343,7 +344,7 @@ YES)] usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 200) onElementWithMatcher:grey_accessibilityID( - @"google_services_settings_view_controller")] + kGoogleServicesSettingsViewIdentifier)] performAction:chrome_test_util::TurnSettingsSwitchOn(NO)]; } else {
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn index f524d082..74dcd98 100644 --- a/ios/chrome/browser/ui/authentication/BUILD.gn +++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -60,6 +60,7 @@ "//ios/chrome/browser/ui/signin_interaction/public", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/unified_consent", + "//ios/chrome/browser/web_state_list", "//ios/chrome/common", "//ios/chrome/common/colors", "//ios/chrome/common/ui_util",
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm index 711fb5d1..1eec6d2 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -18,6 +18,7 @@ #include "components/signin/public/identity_manager/identity_manager.h" #include "components/strings/grit/components_strings.h" #include "google_apis/gaia/gaia_auth_util.h" +#include "google_apis/gaia/gaia_urls.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/signin/authentication_service.h" #include "ios/chrome/browser/signin/authentication_service_factory.h" @@ -26,15 +27,19 @@ #include "ios/chrome/browser/sync/sync_setup_service.h" #include "ios/chrome/browser/sync/sync_setup_service_factory.h" #include "ios/chrome/browser/system_flags.h" +#include "ios/chrome/browser/tabs/tab_model.h" +#import "ios/chrome/browser/tabs/tab_model_list.h" #include "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" #import "ios/chrome/browser/ui/commands/browsing_data_commands.h" #import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" +#import "ios/chrome/browser/web_state_list/web_state_list.h" #include "ios/chrome/grit/ios_chromium_strings.h" #include "ios/chrome/grit/ios_strings.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" +#import "ios/web/public/web_state.h" #include "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -283,12 +288,46 @@ DCHECK(!AuthenticationServiceFactory::GetForBrowserState(browserState) ->IsAuthenticated()); + // Workaround for crbug.com/1003578 + // + // During the Chrome sign-in flow, if the user chooses to clear the cookies + // when switching their primary account, then the following actions take + // place (in the following order): + // 1. All cookies are cleared. + // 2. The user is signed in to Chrome (aka the primary account set) + // 2.a. All requests to Gaia page will include Mirror header. + // 2.b. Account reconcilor will rebuild the Gaia cookies having the Chrome + // primary account as the Gaia default web account. + // + // The Gaia sign-in webpage monitors changes to its cookies and reloads the + // page whenever they change. Reloading the webpage while the cookies are + // cleared and just before they are rebuilt seems to confuse WKWebView that + // ends up with a nil URL, which in turns translates in about:blank URL shown + // in the Omnibox. + // + // This CL works around this issue by waiting for 1 second between steps 1 + // and 2 above to allow the WKWebView to initiate the reload after the + // cookies are cleared. + WebStateList* webStateList = + TabModelList::GetLastActiveTabModelForChromeBrowserState(browserState) + .webStateList; + web::WebState* activeWebState = webStateList->GetActiveWebState(); + bool activeWebStateHasGaiaOrigin = + activeWebState && (activeWebState->GetVisibleURL().GetOrigin() == + GaiaUrls::GetInstance()->gaia_url()); + int64_t dispatchDelaySecs = activeWebStateHasGaiaOrigin ? 1 : 0; + [dispatcher removeBrowsingDataForBrowserState:browserState timePeriod:browsing_data::TimePeriod::ALL_TIME removeMask:BrowsingDataRemoveMask::REMOVE_ALL completionBlock:^{ - [_delegate didClearData]; + dispatch_after( + dispatch_time(DISPATCH_TIME_NOW, + dispatchDelaySecs * NSEC_PER_SEC), + dispatch_get_main_queue(), ^{ + [_delegate didClearData]; + }); }]; }
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm index 9920202..e412146 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
@@ -11,6 +11,7 @@ #import "ios/chrome/browser/tabs/tab_model.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h" #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h" +#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h" #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #include "ios/chrome/grit/ios_chromium_strings.h" @@ -137,7 +138,7 @@ [ChromeEarlGreyUI openSettingsMenu]; [ChromeEarlGreyUI tapSettingsMenuButton:GoogleServicesSettingsButton()]; self.scrollViewMatcher = - grey_accessibilityID(@"google_services_settings_view_controller"); + grey_accessibilityID(kGoogleServicesSettingsViewIdentifier); [[EarlGrey selectElementWithMatcher:self.scrollViewMatcher] assertWithMatcher:grey_notNil()]; }
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h index 95cb9d6..9685b1c 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h
@@ -13,6 +13,8 @@ @protocol GoogleServicesSettingsServiceDelegate; @protocol GoogleServicesSettingsViewControllerModelDelegate; +extern NSString* const kGoogleServicesSettingsViewIdentifier; + // Delegate for presentation events related to // GoogleServicesSettingsViewController. @protocol GoogleServicesSettingsViewControllerPresentationDelegate <NSObject>
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm index c62ba9d..665d938 100644 --- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm
@@ -16,12 +16,16 @@ #error "This file requires ARC support." #endif +// Accessibility identifier for the Google services settings table view. +NSString* const kGoogleServicesSettingsViewIdentifier = + @"google_services_settings_view_controller"; + @implementation GoogleServicesSettingsViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView.accessibilityIdentifier = - @"google_services_settings_view_controller"; + kGoogleServicesSettingsViewIdentifier; self.title = l10n_util::GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_TITLE); }
diff --git a/ios/chrome/browser/ui/signin_interaction/BUILD.gn b/ios/chrome/browser/ui/signin_interaction/BUILD.gn index 1eb25a2..a67bf66 100644 --- a/ios/chrome/browser/ui/signin_interaction/BUILD.gn +++ b/ios/chrome/browser/ui/signin_interaction/BUILD.gn
@@ -69,6 +69,7 @@ "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant", "//ios/chrome/browser/ui/recent_tabs:recent_tabs_ui_constants", "//ios/chrome/browser/ui/settings", + "//ios/chrome/browser/ui/settings/google_services", "//ios/chrome/browser/ui/table_view/cells", "//ios/chrome/browser/ui/util", "//ios/chrome/browser/web_state_list",
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm index cdf3361..e357bf4 100644 --- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm +++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm
@@ -6,6 +6,7 @@ #import <XCTest/XCTest.h> #import "base/ios/block_types.h" +#include "base/ios/ios_util.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" #include "base/test/scoped_feature_list.h" @@ -20,6 +21,7 @@ #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_constants.h" +#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h" #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.h" #include "ios/chrome/browser/ui/util/ui_util.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" @@ -30,7 +32,9 @@ #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h" #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h" +#import "ios/testing/earl_grey/matchers.h" #import "ios/web/public/web_state.h" +#include "ui/base/l10n/l10n_util_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -41,6 +45,8 @@ using chrome_test_util::SecondarySignInButton; using chrome_test_util::SettingsDoneButton; using chrome_test_util::SyncSettingsConfirmButton; +using l10n_util::GetNSString; +using testing::ButtonWithAccessibilityLabel; typedef NS_ENUM(NSInteger, OpenSigninMethod) { OpenSigninMethodFromSettings, @@ -367,16 +373,36 @@ tapSettingsLink:YES]; } -#pragma mark - Utils - -// Starts the sign-in workflow, and simulates opening an URL from another app. -// |openSigninMethod| is the way to start the sign-in. -// |tapSettingsLink| if YES, the setting link is tapped before opening the URL. -- (void)assertOpenURLWhenSigninFromView:(OpenSigninMethod)openSigninMethod - tapSettingsLink:(BOOL)tapSettingsLink { +// Verifies that advanced sign-in shows an alert dialog when being swiped to +// dismiss. +- (void)testSwipeDownToCancelAdvancedSignin { + if (!base::ios::IsRunningOnOrLater(13, 0, 0)) { + EARL_GREY_TEST_SKIPPED(@"Test disabled on iOS 12 and lower."); + } ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1]; ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( identity); + [self openSigninFromView:OpenSigninMethodFromSettings tapSettingsLink:YES]; + + [[EarlGrey + selectElementWithMatcher:grey_accessibilityID( + kGoogleServicesSettingsViewIdentifier)] + performAction:grey_swipeFastInDirection(kGREYDirectionDown)]; + [[EarlGrey + selectElementWithMatcher: + ButtonWithAccessibilityLabel(GetNSString( + IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON))] + performAction:grey_tap()]; + [SigninEarlGreyUtils checkSignedOut]; +} + +#pragma mark - Utils + +// Opens sign-in view. +// |openSigninMethod| is the way to start the sign-in. +// |tapSettingsLink| if YES, the setting link is tapped before opening the URL. +- (void)openSigninFromView:(OpenSigninMethod)openSigninMethod + tapSettingsLink:(BOOL)tapSettingsLink { switch (openSigninMethod) { case OpenSigninMethodFromSettings: [ChromeEarlGreyUI openSettingsMenu]; @@ -409,6 +435,17 @@ [SigninEarlGreyUI tapSettingsLink]; } [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; +} + +// Starts the sign-in workflow, and simulates opening an URL from another app. +// |openSigninMethod| is the way to start the sign-in. +// |tapSettingsLink| if YES, the setting link is tapped before opening the URL. +- (void)assertOpenURLWhenSigninFromView:(OpenSigninMethod)openSigninMethod + tapSettingsLink:(BOOL)tapSettingsLink { + ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1]; + ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity( + identity); + [self openSigninFromView:openSigninMethod tapSettingsLink:tapSettingsLink]; // Open the URL as if it was opened from another app. UIApplication* application = UIApplication.sharedApplication; id<UIApplicationDelegate> applicationDelegate = application.delegate;
diff --git a/ios/web_view/tools/build.py b/ios/web_view/tools/build.py index f66fbe6..c876d0e 100755 --- a/ios/web_view/tools/build.py +++ b/ios/web_view/tools/build.py
@@ -223,9 +223,6 @@ extra_gn_options += 'ios_web_view_include_cronet=false ' if options.enable_sync: extra_gn_options += 'ios_web_view_enable_sync=true ' - # Used to differentiate //ios/web_view from //ios/chrome in the user agent - # product string passed to sync servers. - extra_gn_options += 'sync_user_agent_product="ChromeWebView" ' else: extra_gn_options += 'ios_web_view_enable_sync=false ' if options.enable_autofill:
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h index 83460bdd..f69f0072 100644 --- a/ipc/ipc_message_start.h +++ b/ipc/ipc_message_start.h
@@ -24,7 +24,6 @@ GpuChannelMsgStart, MediaMsgStart, PpapiMsgStart, - ResourceMsgStart, ChromeMsgStart, DragMsgStart, PrintMsgStart, @@ -36,9 +35,7 @@ ChromotingMsgStart, BrowserPluginMsgStart, AndroidWebViewMsgStart, - MediaPlayerMsgStart, PeerConnectionTrackerMsgStart, - WebRtcLoggingMsgStart, NaClHostMsgStart, EncryptedMediaMsgStart, CastMsgStart, @@ -47,20 +44,13 @@ OzoneGpuMsgStart, WebTestMsgStart, NetworkHintsMsgStart, - CastMediaMsgStart, - SyncCompositorMsgStart, ExtensionsGuestViewMsgStart, GuestViewMsgStart, - // Note: CastCryptoMsgStart and CastChannelMsgStart reserved for Chromecast - // internal code. Contact gunsch@ before changing/removing. - CastCryptoMsgStart, - CastChannelMsgStart, IPCTestMsgStart, MediaPlayerDelegateMsgStart, SurfaceViewManagerMsgStart, ExtensionWorkerMsgStart, SubresourceFilterMsgStart, - ChromeAppsMsgStart, UnfreezableFrameMsgStart, LastIPCMsgStart // Must come last. };
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc index c16a96c..db34a38c 100644 --- a/media/filters/fuchsia/fuchsia_video_decoder.cc +++ b/media/filters/fuchsia/fuchsia_video_decoder.cc
@@ -154,6 +154,11 @@ DISALLOW_COPY_AND_ASSIGN(OutputMailbox); }; +struct InputDecoderPacket { + StreamProcessorHelper::IoPacket packet; + bool used_for_current_stream = true; +}; + } // namespace class FuchsiaVideoDecoder : public VideoDecoder, @@ -277,8 +282,7 @@ std::unique_ptr<SysmemBufferPool::Creator> input_buffer_collection_creator_; std::unique_ptr<SysmemBufferPool> input_buffer_collection_; size_t num_input_buffers_ = 0; - base::flat_map<size_t, StreamProcessorHelper::IoPacket> - in_flight_input_packets_; + base::flat_map<size_t, InputDecoderPacket> in_flight_input_packets_; // Output buffers for |decoder_|. fuchsia::media::VideoUncompressedFormat output_format_; @@ -339,7 +343,7 @@ output_cb_ = output_cb; container_pixel_aspect_ratio_ = config.GetPixelAspectRatio(); - // If we already have |decoder_| that was initializes for the same codec then + // If we already have |decoder_| that was initialized for the same codec then // keep using it. if (decoder_ && current_codec_ == config.codec()) { bool have_decryptor = decryptor_ != nullptr; @@ -515,6 +519,7 @@ void FuchsiaVideoDecoder::OnDecryptorError() { OnError(); } + void FuchsiaVideoDecoder::OnDecryptorNoKey() { NOTIMPLEMENTED(); OnError(); @@ -638,7 +643,8 @@ DCHECK(in_flight_input_packets_.find(packet.index()) == in_flight_input_packets_.end()); - in_flight_input_packets_.insert_or_assign(packet.index(), std::move(packet)); + in_flight_input_packets_.insert_or_assign( + packet.index(), InputDecoderPacket{std::move(packet)}); } void FuchsiaVideoDecoder::ProcessEndOfStream() { @@ -668,15 +674,17 @@ return; } - // Call DecodeCB if this was a last packet for a Decode request. - bool call_decode_callback = it->second.unit_end(); + // Call DecodeCB if this was a last packet for a Decode() request. Ignore + // packets from a previous stream. + bool call_decode_callback = + it->second.packet.unit_end() && it->second.used_for_current_stream; { // The packet should be destroyed only after it's removed from // |in_flight_input_packets_|. Otherwise SysmemBufferWriter may call // SendInputPacket() while the packet is still in // |in_flight_input_packets_|. - auto packet = std::move(it->second); + auto packet = std::move(it->second.packet); in_flight_input_packets_.erase(it); } @@ -955,7 +963,9 @@ if (decryptor_) decryptor_->Reset(); - in_flight_input_packets_.clear(); + for (auto& packet : in_flight_input_packets_) { + packet.second.used_for_current_stream = false; + } auto weak_this = weak_this_; @@ -1019,6 +1029,7 @@ } void FuchsiaVideoDecoder::ReleaseInputBuffers() { + in_flight_input_packets_.clear(); input_writer_queue_.ResetBuffers(); input_buffer_collection_creator_.reset(); input_buffer_collection_.reset();
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index a9e3996b..3b62b3c5 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -242,6 +242,8 @@ defines = [ "MEDIA_GPU_IMPLEMENTATION" ] sources = [ "accelerated_video_decoder.h", + "buffer_validation.cc", + "buffer_validation.h", "codec_picture.cc", "codec_picture.h", "gpu_video_decode_accelerator_helpers.cc",
diff --git a/media/gpu/buffer_validation.cc b/media/gpu/buffer_validation.cc new file mode 100644 index 0000000..ad278642 --- /dev/null +++ b/media/gpu/buffer_validation.cc
@@ -0,0 +1,114 @@ +// Copyright 2019 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 "media/gpu/buffer_validation.h" + +#include "base/numerics/checked_math.h" +#include "base/numerics/safe_conversions.h" +#include "build/build_config.h" +#include "media/base/video_frame.h" +#include "media/gpu/macros.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/gpu_memory_buffer.h" + +#if defined(OS_LINUX) +#include <sys/types.h> +#include <unistd.h> +#endif // defined(OS_LINUX) + +namespace media { + +bool GetFileSize(const int fd, size_t* size) { +#if defined(OS_LINUX) + if (fd < 0) { + VLOGF(1) << "Invalid file descriptor"; + return false; + } + + off_t fd_size = lseek(fd, 0, SEEK_END); + lseek(fd, 0, SEEK_SET); + if (fd_size < 0u) { + VPLOGF(1) << "Fail to find the size of fd"; + return false; + } + + if (!base::IsValueInRangeForNumericType<size_t>(fd_size)) { + VLOGF(1) << "fd_size is out of range of size_t" + << ", size=" << size + << ", size_t max=" << std::numeric_limits<size_t>::max() + << ", size_t min=" << std::numeric_limits<size_t>::min(); + return false; + } + + *size = static_cast<size_t>(fd_size); + return true; +#else + NOTIMPLEMENTED(); + return false; +#endif // defined(OS_LINUX) +} + +bool VerifyGpuMemoryBufferHandle(media::VideoPixelFormat pixel_format, + const gfx::Size& coded_size, + const gfx::GpuMemoryBufferHandle& gmb_handle) { + if (gmb_handle.type != gfx::NATIVE_PIXMAP) { + VLOGF(1) << "Unexpected GpuMemoryBufferType: " << gmb_handle.type; + return false; + } +#if defined(OS_LINUX) + const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format); + if (num_planes != gmb_handle.native_pixmap_handle.planes.size() || + num_planes == 0) { + VLOGF(1) << "Invalid number of dmabuf planes passed: " + << gmb_handle.native_pixmap_handle.planes.size() + << ", expected: " << num_planes; + return false; + } + + // Strides monotonically decrease. + for (size_t i = 1; i < num_planes; i++) { + if (gmb_handle.native_pixmap_handle.planes[i - 1].stride < + gmb_handle.native_pixmap_handle.planes[i].stride) { + return false; + } + } + + for (size_t i = 0; i < num_planes; i++) { + const auto& plane = gmb_handle.native_pixmap_handle.planes[i]; + DVLOGF(4) << "Plane " << i << ", offset: " << plane.offset + << ", stride: " << plane.stride; + + size_t file_size_in_bytes; + if (!plane.fd.is_valid() || + !GetFileSize(plane.fd.get(), &file_size_in_bytes)) + return false; + + size_t plane_height = + media::VideoFrame::Rows(i, pixel_format, coded_size.height()); + base::CheckedNumeric<size_t> min_plane_size = + base::CheckMul(plane.stride, plane_height); + if (!min_plane_size.IsValid() || min_plane_size.ValueOrDie() > plane.size) { + VLOGF(1) << "Invalid strides/sizes"; + return false; + } + + // Check |offset| + (the size of a plane) on each plane is not larger than + // |file_size_in_bytes|. This ensures we don't access out of a buffer + // referred by |fd|. + base::CheckedNumeric<size_t> min_buffer_size = + base::CheckAdd(plane.offset, plane.size); + if (!min_buffer_size.IsValid() || + min_buffer_size.ValueOrDie() > file_size_in_bytes) { + VLOGF(1) << "Invalid strides/offsets"; + return false; + } + } + return true; +#else + NOTIMPLEMENTED(); + return false; +#endif // defined(OS_LINUX) +} + +} // namespace media
diff --git a/media/gpu/buffer_validation.h b/media/gpu/buffer_validation.h new file mode 100644 index 0000000..cf7b623 --- /dev/null +++ b/media/gpu/buffer_validation.h
@@ -0,0 +1,27 @@ +// Copyright 2019 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 MEDIA_GPU_BUFFER_VALIDATION_H_ +#define MEDIA_GPU_BUFFER_VALIDATION_H_ + +#include "media/base/video_types.h" +#include "media/gpu/media_gpu_export.h" + +namespace gfx { +class Size; +struct GpuMemoryBufferHandle; +} // namespace gfx + +namespace media { +// Gets the file size of |fd| and writes in |size|. Returns false on failure. +MEDIA_GPU_EXPORT bool GetFileSize(const int fd, size_t* size); + +// Verifies if GpuMemoryBufferHandle is valid. +MEDIA_GPU_EXPORT bool VerifyGpuMemoryBufferHandle( + media::VideoPixelFormat pixel_format, + const gfx::Size& coded_size, + const gfx::GpuMemoryBufferHandle& gmb_handle); + +} // namespace media +#endif // MEDIA_GPU_BUFFER_VALIDATION_H_
diff --git a/media/gpu/linux/platform_video_frame_pool.h b/media/gpu/linux/platform_video_frame_pool.h index dea062c0..5cfa17a 100644 --- a/media/gpu/linux/platform_video_frame_pool.h +++ b/media/gpu/linux/platform_video_frame_pool.h
@@ -90,10 +90,6 @@ EXCLUSIVE_LOCKS_REQUIRED(lock_); bool IsExhausted_Locked() EXCLUSIVE_LOCKS_REQUIRED(lock_); - // Purges the stale frame. This method is executed periodically on - // |parent_task_runner_|. - void PurgeStaleFrames(); - // The function used to allocate new frames. const CreateFrameCB create_frame_cb_;
diff --git a/media/gpu/linux/platform_video_frame_utils.cc b/media/gpu/linux/platform_video_frame_utils.cc index 4c060197..51821579 100644 --- a/media/gpu/linux/platform_video_frame_utils.cc +++ b/media/gpu/linux/platform_video_frame_utils.cc
@@ -12,6 +12,7 @@ #include "media/base/format_utils.h" #include "media/base/scopedfd_helper.h" #include "media/base/video_frame_layout.h" +#include "media/gpu/buffer_validation.h" #include "media/gpu/macros.h" #include "ui/gfx/gpu_memory_buffer.h" #include "ui/gfx/linux/native_pixmap_dmabuf.h" @@ -126,7 +127,6 @@ case VideoFrame::STORAGE_GPU_MEMORY_BUFFER: handle = video_frame->GetGpuMemoryBuffer()->CloneHandle(); break; -#if defined(OS_LINUX) case VideoFrame::STORAGE_DMABUFS: { handle.type = gfx::NATIVE_PIXMAP; std::vector<base::ScopedFD> duped_fds = @@ -139,12 +139,16 @@ handle.native_pixmap_handle.planes.emplace_back( plane.stride, plane.offset, plane.size, std::move(duped_fds[i])); } -#endif // defined(OS_LINUX) } break; default: NOTREACHED() << "Unsupported storage type: " << video_frame->storage_type(); } + if (!handle.is_null() && handle.type == gfx::NATIVE_PIXMAP && + !VerifyGpuMemoryBufferHandle(video_frame->format(), + video_frame->coded_size(), handle)) { + VLOGF(1) << "Created GpuMemoryBufferHandle is invalid"; + } return handle; }
diff --git a/media/gpu/test/image.cc b/media/gpu/test/image.cc index 3a8de93e..da34a24 100644 --- a/media/gpu/test/image.cc +++ b/media/gpu/test/image.cc
@@ -59,8 +59,8 @@ Image::~Image() {} bool Image::Load() { - DCHECK(!file_path_.empty()); - DCHECK(!IsLoaded()); + CHECK(!file_path_.empty()); + CHECK(!IsLoaded()); ResolveTestFilePath(&file_path_);
diff --git a/media/gpu/test/video_frame_file_writer.cc b/media/gpu/test/video_frame_file_writer.cc index 163a6473..1f1bd792 100644 --- a/media/gpu/test/video_frame_file_writer.cc +++ b/media/gpu/test/video_frame_file_writer.cc
@@ -34,7 +34,7 @@ VideoFrameFileWriter::~VideoFrameFileWriter() { base::AutoLock auto_lock(frame_writer_lock_); - DCHECK_EQ(0u, num_frames_writing_); + CHECK_EQ(0u, num_frames_writing_); frame_writer_thread_.Stop(); } @@ -147,7 +147,7 @@ scoped_refptr<const VideoFrame> video_frame, const base::FilePath& filename) { DCHECK_CALLED_ON_VALID_SEQUENCE(writer_thread_sequence_checker_); - DCHECK(video_frame_mapper_); + CHECK(video_frame_mapper_); auto mapped_frame = video_frame; #if defined(OS_CHROMEOS) @@ -189,7 +189,7 @@ scoped_refptr<const VideoFrame> video_frame, const base::FilePath& filename) { DCHECK_CALLED_ON_VALID_SEQUENCE(writer_thread_sequence_checker_); - DCHECK(video_frame_mapper_); + CHECK(video_frame_mapper_); auto mapped_frame = video_frame; #if defined(OS_CHROMEOS)
diff --git a/media/gpu/test/video_frame_helpers.cc b/media/gpu/test/video_frame_helpers.cc index 31aa838f3..a844e53 100644 --- a/media/gpu/test/video_frame_helpers.cc +++ b/media/gpu/test/video_frame_helpers.cc
@@ -288,11 +288,11 @@ } scoped_refptr<const VideoFrame> CreateVideoFrameFromImage(const Image& image) { - DCHECK(image.IsLoaded()); + CHECK(image.IsLoaded()); const auto format = image.PixelFormat(); const auto& visible_size = image.Size(); // Loaded image data must be tight. - DCHECK_EQ(image.DataSize(), VideoFrame::AllocationSize(format, visible_size)); + CHECK_EQ(image.DataSize(), VideoFrame::AllocationSize(format, visible_size)); // Create planes for layout. We cannot use WrapExternalData() because it // calls GetDefaultLayout() and it supports only a few pixel formats.
diff --git a/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc index 7b193c4..b967a50 100644 --- a/media/gpu/test/video_frame_validator.cc +++ b/media/gpu/test/video_frame_validator.cc
@@ -65,7 +65,7 @@ void VideoFrameValidator::Destroy() { frame_validator_thread_.Stop(); base::AutoLock auto_lock(frame_validator_lock_); - DCHECK_EQ(0u, num_frames_validating_); + CHECK_EQ(0u, num_frames_validating_); } std::vector<VideoFrameValidator::MismatchedFrameInfo>
diff --git a/media/gpu/test/video_player/frame_renderer_dummy.cc b/media/gpu/test/video_player/frame_renderer_dummy.cc index 149c901..2669f644 100644 --- a/media/gpu/test/video_player/frame_renderer_dummy.cc +++ b/media/gpu/test/video_player/frame_renderer_dummy.cc
@@ -69,7 +69,7 @@ renderer_thread_.Stop(); base::AutoLock auto_lock(renderer_lock_); - DCHECK(pending_frames_.empty()); + CHECK(pending_frames_.empty()); } bool FrameRendererDummy::AcquireGLContext() { @@ -135,7 +135,7 @@ // TODO(dstaessens): Remove this function when allocate mode is deprecated. base::Optional<VideoFrameLayout> layout = CreateVideoFrameLayout(pixel_format, size); - DCHECK(layout); + CHECK(layout); return VideoFrame::WrapExternalDataWithLayout(*layout, gfx::Rect(size), size, nullptr, 0, base::TimeDelta()); }
diff --git a/media/gpu/test/video_player/frame_renderer_thumbnail.cc b/media/gpu/test/video_player/frame_renderer_thumbnail.cc index c6edff93..700411d 100644 --- a/media/gpu/test/video_player/frame_renderer_thumbnail.cc +++ b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
@@ -261,7 +261,7 @@ void FrameRendererThumbnail::DestroyTask(base::WaitableEvent* done) { DCHECK_CALLED_ON_VALID_SEQUENCE(renderer_sequence_checker_); - DCHECK(mailbox_texture_map_.empty()); + CHECK(mailbox_texture_map_.empty()); DestroyThumbnailImageTask();
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc index e8bf41ba..06851df2 100644 --- a/media/gpu/test/video_player/test_vda_video_decoder.cc +++ b/media/gpu/test/video_player/test_vda_video_decoder.cc
@@ -230,7 +230,7 @@ #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) handle = CreateGpuMemoryBufferHandle(video_frame.get()); - DCHECK(!handle.is_null()); + CHECK(!handle.is_null()); #else NOTREACHED(); #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) @@ -305,7 +305,7 @@ video_frame->natural_size(), video_frame->timestamp()); } - DCHECK(wrapped_video_frame); + CHECK(wrapped_video_frame); // Flag that the video frame was decoded in a power efficient way. wrapped_video_frame->metadata()->SetBoolean( @@ -327,7 +327,7 @@ // Called when a picture buffer is ready to be re-used. void TestVDAVideoDecoder::ReusePictureBufferTask(int32_t picture_buffer_id) { DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_); - DCHECK(decoder_); + CHECK(decoder_); DVLOGF(4) << "Picture buffer ID: " << picture_buffer_id; // Notify the decoder the picture buffer can be reused. The decoder will only @@ -351,14 +351,14 @@ void TestVDAVideoDecoder::NotifyFlushDone() { DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_); - DCHECK(flush_cb_); + CHECK(flush_cb_); std::move(flush_cb_).Run(DecodeStatus::OK); } void TestVDAVideoDecoder::NotifyResetDone() { DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_); - DCHECK(reset_cb_); + CHECK(reset_cb_); std::move(reset_cb_).Run(); }
diff --git a/media/gpu/test/video_player/video.cc b/media/gpu/test/video_player/video.cc index 8167820c..e99ef86 100644 --- a/media/gpu/test/video_player/video.cc +++ b/media/gpu/test/video_player/video.cc
@@ -33,8 +33,8 @@ bool Video::Load() { // TODO(dstaessens@) Investigate reusing existing infrastructure such as // DecoderBuffer. - DCHECK(!file_path_.empty()); - DCHECK(data_.empty()); + CHECK(!file_path_.empty()); + CHECK(data_.empty()); base::Optional<base::FilePath> resolved_path = ResolveFilePath(file_path_); if (!resolved_path) {
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc index 65f38cbf..b290a07e 100644 --- a/media/gpu/test/video_player/video_decoder_client.cc +++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -81,8 +81,8 @@ bool VideoDecoderClient::CreateDecoder() { DCHECK_CALLED_ON_VALID_SEQUENCE(video_player_sequence_checker_); - DCHECK(!decoder_client_thread_.IsRunning()); - DCHECK(event_cb_ && frame_renderer_); + CHECK(!decoder_client_thread_.IsRunning()); + CHECK(event_cb_ && frame_renderer_); if (!decoder_client_thread_.Start()) { VLOGF(1) << "Failed to start decoder thread"; @@ -126,7 +126,7 @@ void VideoDecoderClient::Initialize(const Video* video) { DCHECK_CALLED_ON_VALID_SEQUENCE(video_player_sequence_checker_); - DCHECK(video); + CHECK(video); base::WaitableEvent done; decoder_client_thread_.task_runner()->PostTask( @@ -159,7 +159,7 @@ void VideoDecoderClient::CreateDecoderTask(bool* success, base::WaitableEvent* done) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK_EQ(decoder_client_state_, VideoDecoderClientState::kUninitialized); + CHECK_EQ(decoder_client_state_, VideoDecoderClientState::kUninitialized); LOG_ASSERT(!decoder_) << "Can't create decoder: already created"; if (decoder_client_config_.use_vd) { @@ -189,8 +189,8 @@ void VideoDecoderClient::InitializeDecoderTask(const Video* video, base::WaitableEvent* done) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized || - decoder_client_state_ == VideoDecoderClientState::kIdle); + CHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized || + decoder_client_state_ == VideoDecoderClientState::kIdle); LOG_ASSERT(decoder_) << "Can't initialize decoder: not created yet"; LOG_ASSERT(video); @@ -213,15 +213,15 @@ decoder_->Initialize(config, false, nullptr, std::move(init_cb), output_cb, WaitingCB()); - DCHECK_LE(decoder_client_config_.max_outstanding_decode_requests, - static_cast<size_t>(decoder_->GetMaxDecodeRequests())); + CHECK_LE(decoder_client_config_.max_outstanding_decode_requests, + static_cast<size_t>(decoder_->GetMaxDecodeRequests())); done->Signal(); } void VideoDecoderClient::DestroyDecoderTask(base::WaitableEvent* done) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK_EQ(0u, num_outstanding_decode_requests_); + CHECK_EQ(0u, num_outstanding_decode_requests_); DVLOGF(4); // Invalidate all scheduled tasks. @@ -324,8 +324,8 @@ void VideoDecoderClient::DecoderInitializedTask(bool status) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized || - decoder_client_state_ == VideoDecoderClientState::kIdle); + CHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized || + decoder_client_state_ == VideoDecoderClientState::kIdle); LOG_ASSERT(status) << "Initializing decoder failed"; decoder_client_state_ = VideoDecoderClientState::kIdle; @@ -334,7 +334,7 @@ void VideoDecoderClient::DecodeDoneTask(media::DecodeStatus status) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK_NE(VideoDecoderClientState::kIdle, decoder_client_state_); + CHECK_NE(VideoDecoderClientState::kIdle, decoder_client_state_); LOG_ASSERT(status != media::DecodeStatus::ABORTED || decoder_client_state_ == VideoDecoderClientState::kResetting); DVLOGF(4); @@ -366,7 +366,7 @@ void VideoDecoderClient::FlushDoneTask(media::DecodeStatus status) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK_EQ(0u, num_outstanding_decode_requests_); + CHECK_EQ(0u, num_outstanding_decode_requests_); // Send an EOS frame to the renderer, so it can reset any internal state it // might keep in preparation of the next stream of video frames. @@ -377,7 +377,7 @@ void VideoDecoderClient::ResetDoneTask() { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_); - DCHECK_EQ(0u, num_outstanding_decode_requests_); + CHECK_EQ(0u, num_outstanding_decode_requests_); // We finished resetting to a different point in the stream, so we should // update the frame index. Currently only resetting to the start of the stream
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc index e55ee1a..8438f3e 100644 --- a/media/gpu/test/video_player/video_player.cc +++ b/media/gpu/test/video_player/video_player.cc
@@ -47,8 +47,8 @@ std::unique_ptr<FrameRenderer> frame_renderer, std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(video_player_state_, VideoPlayerState::kUninitialized); - DCHECK(frame_renderer); + CHECK_EQ(video_player_state_, VideoPlayerState::kUninitialized); + CHECK(frame_renderer); DVLOGF(4); EventCallback event_cb = @@ -66,7 +66,7 @@ void VideoPlayer::Destroy() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_NE(video_player_state_, VideoPlayerState::kDestroyed); + CHECK_NE(video_player_state_, VideoPlayerState::kDestroyed); DVLOGF(4); decoder_client_.reset(); @@ -82,9 +82,9 @@ bool VideoPlayer::Initialize(const Video* video) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(video_player_state_ == VideoPlayerState::kUninitialized || - video_player_state_ == VideoPlayerState::kIdle); - DCHECK(video); + CHECK(video_player_state_ == VideoPlayerState::kUninitialized || + video_player_state_ == VideoPlayerState::kIdle); + CHECK(video); DVLOGF(4); decoder_client_->Initialize(video); @@ -100,7 +100,7 @@ void VideoPlayer::Play() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(video_player_state_, VideoPlayerState::kIdle); + CHECK_EQ(video_player_state_, VideoPlayerState::kIdle); DVLOGF(4); // Play until the end of the video. @@ -109,8 +109,8 @@ void VideoPlayer::PlayUntil(VideoPlayerEvent event, size_t event_count) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(video_player_state_, VideoPlayerState::kIdle); - DCHECK(video_); + CHECK_EQ(video_player_state_, VideoPlayerState::kIdle); + CHECK(video_); DVLOGF(4); // Start decoding the video. @@ -156,7 +156,7 @@ bool VideoPlayer::WaitForEvent(VideoPlayerEvent event, size_t times) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_GE(times, 1u); + CHECK_GE(times, 1u); DVLOGF(4) << "Event ID: " << static_cast<size_t>(event); base::TimeDelta time_waiting;
diff --git a/media/gpu/test/video_player/video_player_test_environment.cc b/media/gpu/test/video_player/video_player_test_environment.cc index 11715f8..c77f2be3 100644 --- a/media/gpu/test/video_player/video_player_test_environment.cc +++ b/media/gpu/test/video_player/video_player_test_environment.cc
@@ -72,7 +72,7 @@ #endif // defined(OS_CHROMEOS) // VideoDecoders always require import mode to be supported. - DCHECK(!use_vd_ || import_supported_); + CHECK(!use_vd_ || import_supported_); } const media::test::Video* VideoPlayerTestEnvironment::Video() const {
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc index 64e33c7..7d4dd26b 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -1442,12 +1442,6 @@ NOTIFY_ERROR(PLATFORM_FAILURE); return; } - - // Put us in kIdle to allow further event processing. - // ProcessPendingEventsIfNeeded() will put us back into kDecoding after all - // other pending events are processed successfully. - state_ = kIdle; - ProcessPendingEventsIfNeeded(); } void V4L2SliceVideoDecodeAccelerator::CreateGLImageFor( @@ -1613,6 +1607,18 @@ } DCHECK_EQ(gl_image_size_.width(), adjusted_coded_width); + // Put us in kIdle to allow further event processing. + // ProcessPendingEventsIfNeeded() will put us back into kDecoding after all + // other pending events are processed successfully. + if (state_ == kAwaitingPictureBuffers) { + state_ = kIdle; + decoder_thread_.task_runner()->PostTask( + FROM_HERE, + base::BindOnce( + &V4L2SliceVideoDecodeAccelerator::ProcessPendingEventsIfNeeded, + base::Unretained(this))); + } + // If in import mode, build output_frame from the passed DMABUF FDs. if (output_mode_ == Config::OutputMode::IMPORT) { DCHECK_EQ(gl_image_planes_count_, passed_dmabuf_fds.size());
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index f569a8d6..e9f2bce 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -399,9 +399,14 @@ base::BindRepeating(&VaapiVideoEncodeAccelerator::RecycleVASurfaceID, base::Unretained(this))); + // In native input mode, an input surface is needed only if scaling + // is not required. Since we cannot find the necessity of the scaling here, + // we allocate input surfaces always, which is redundant. + // + // TODO(hiroh): Think about moving this surface creation in the first + // Encode(). va_surfaces_per_video_frame_ = - kNumSurfacesForOutputPicture + - (native_input_mode_ ? 0 : kNumSurfacesPerInputVideoFrame); + kNumSurfacesForOutputPicture + kNumSurfacesPerInputVideoFrame; if (!vaapi_wrapper_->CreateContextAndSurfaces( kVaSurfaceFormat, aligned_input_size_, @@ -583,12 +588,46 @@ return nullptr; } } else { + if (aligned_input_size_ != frame->coded_size()) { + NOTIFY_ERROR(kPlatformFailureError, + "Expected frame size: " << aligned_input_size_.ToString() + << ", but got: " + << frame->coded_size().ToString()); + return nullptr; + } input_surface = new VASurface(available_va_surface_ids_.back(), aligned_input_size_, kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_)); available_va_surface_ids_.pop_back(); } + if (aligned_input_size_ != + gfx::Size(frame->stride(0), frame->coded_size().height())) { + // Do scaling. Here the buffer size contained in |input_surface| is + // |frame->coded_size()|. + if (!vpp_vaapi_wrapper_) { + vpp_vaapi_wrapper_ = + VaapiWrapper::Create(VaapiWrapper::kVideoProcess, VAProfileNone, + base::Bind(&ReportToUMA, VAAPI_ERROR)); + if (!vpp_vaapi_wrapper_) { + NOTIFY_ERROR(kPlatformFailureError, + "Failed to initialize VppVaapiWrapper"); + return nullptr; + } + } + scoped_refptr<VASurface> scaled_surface = + new VASurface(available_va_surface_ids_.back(), aligned_input_size_, + kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_)); + available_va_surface_ids_.pop_back(); + // Scale frame->coded_size() -> |aligned_input_size_| here. + vpp_vaapi_wrapper_->BlitSurface(input_surface, scaled_surface); + // We can destroy the original |input_surface| because the buffer is alive + // as long as |frame| is alive. + input_surface = std::move(scaled_surface); + } + + // Here, the size contained in |input_surface| is |aligned_input_size_| + // regardless of scaling. scoped_refptr<VASurface> reconstructed_surface = new VASurface(available_va_surface_ids_.back(), aligned_input_size_, kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_));
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h index 0bc19a2f..8ba3d9d 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
@@ -206,6 +206,10 @@ std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_; base::WeakPtr<Client> client_; + // VaapiWrapper for VPP (Video Pre Processing). This is used for scale down + // for the picture send to vaapi encoder. + scoped_refptr<VaapiWrapper> vpp_vaapi_wrapper_; + // WeakPtr to post from the encoder thread back to the ChildThread, as it may // outlive this. Posting from the ChildThread using base::Unretained(this) // to the encoder thread is safe, because |this| always outlives the encoder
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc index 03d2d30..a8eb4ee 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -89,7 +89,8 @@ if (!encoder_) return; - if (frame->coded_size() != input_coded_size_) { + if (frame->coded_size() != input_coded_size_ && + frame->storage_type() != media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER) { DLOG(ERROR) << __func__ << " wrong input coded size, expected " << input_coded_size_.ToString() << ", got " << frame->coded_size().ToString();
diff --git a/mojo/public/tools/fuzzers/fuzz.mojom b/mojo/public/tools/fuzzers/fuzz.mojom index 53c8ac6a..c045fd3 100644 --- a/mojo/public/tools/fuzzers/fuzz.mojom +++ b/mojo/public/tools/fuzzers/fuzz.mojom
@@ -1,3 +1,7 @@ +// Copyright 2019 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 fuzz.mojom; [Extensible] @@ -63,6 +67,7 @@ Ping(); }; +// A comprehensive Mojo interface used for fuzzing message dispatch and validation. interface FuzzInterface { FuzzBasic(); FuzzBasicResp() => (); @@ -74,5 +79,5 @@ [Sync] FuzzArgsSyncResp(FuzzStruct a, FuzzStruct? b) => (); - FuzzAssociated(associated FuzzDummyInterface& request); + FuzzAssociated(pending_associated_receiver<FuzzDummyInterface> receiver); };
diff --git a/mojo/public/tools/fuzzers/fuzz_impl.cc b/mojo/public/tools/fuzzers/fuzz_impl.cc index d3b1012..23816fd 100644 --- a/mojo/public/tools/fuzzers/fuzz_impl.cc +++ b/mojo/public/tools/fuzzers/fuzz_impl.cc
@@ -38,8 +38,8 @@ } void FuzzImpl::FuzzAssociated( - fuzz::mojom::FuzzDummyInterfaceAssociatedRequest req) { - associated_bindings_.AddBinding(this, std::move(req)); + mojo::PendingAssociatedReceiver<fuzz::mojom::FuzzDummyInterface> receiver) { + associated_receivers_.Add(this, std::move(receiver)); } void FuzzImpl::Ping() {}
diff --git a/mojo/public/tools/fuzzers/fuzz_impl.h b/mojo/public/tools/fuzzers/fuzz_impl.h index d63a707..d8f7f566 100644 --- a/mojo/public/tools/fuzzers/fuzz_impl.h +++ b/mojo/public/tools/fuzzers/fuzz_impl.h
@@ -5,8 +5,9 @@ #ifndef MOJO_PUBLIC_TOOLS_FUZZERS_FUZZ_IMPL_H_ #define MOJO_PUBLIC_TOOLS_FUZZERS_FUZZ_IMPL_H_ -#include "mojo/public/cpp/bindings/associated_binding_set.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "mojo/public/tools/fuzzers/fuzz.mojom.h" class FuzzImpl : public fuzz::mojom::FuzzInterface, @@ -30,7 +31,8 @@ FuzzArgsSyncRespCallback callback) override; void FuzzAssociated( - fuzz::mojom::FuzzDummyInterfaceAssociatedRequest req) override; + mojo::PendingAssociatedReceiver<fuzz::mojom::FuzzDummyInterface> receiver) + override; // fuzz::mojom::FuzzDummyInterface: void Ping() override; @@ -39,7 +41,7 @@ mojo::Binding<FuzzInterface> binding_; private: - mojo::AssociatedBindingSet<FuzzDummyInterface> associated_bindings_; + mojo::AssociatedReceiverSet<FuzzDummyInterface> associated_receivers_; }; #endif // MOJO_PUBLIC_TOOLS_FUZZERS_FUZZ_IMPL_H_
diff --git a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc index 412ec5a..5981b6d 100644 --- a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc +++ b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
@@ -13,6 +13,7 @@ #include "base/task/single_thread_task_executor.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "mojo/core/embedder/embedder.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/tools/fuzzers/fuzz.mojom.h" #include "mojo/public/tools/fuzzers/fuzz_impl.h" @@ -225,7 +226,7 @@ * supplied directory. */ void DumpMessages(std::string output_directory) { fuzz::mojom::FuzzInterfacePtr fuzz; - fuzz::mojom::FuzzDummyInterfaceAssociatedPtr dummy; + mojo::AssociatedRemote<fuzz::mojom::FuzzDummyInterface> dummy; /* Create the impl and add a MessageDumper to the filter chain. */ env->impl = std::make_unique<FuzzImpl>(MakeRequest(&fuzz)); @@ -247,7 +248,7 @@ GetPopulatedFuzzStruct(), base::Bind(FuzzCallback)); fuzz->FuzzArgsSyncResp(fuzz::mojom::FuzzStruct::New(), GetPopulatedFuzzStruct(), base::Bind(FuzzCallback)); - fuzz->FuzzAssociated(MakeRequest(&dummy)); + fuzz->FuzzAssociated(dummy.BindNewEndpointAndPassReceiver()); dummy->Ping(); }
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index 86e25a6..ee9b0b3 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -951,10 +951,10 @@ const HostCache::Entry& results, bool secure) = 0; - // Called when the first of two jobs succeeds. If the first completed - // transaction fails, this is not called. Also not called when the DnsTask - // only needs to run one transaction. - virtual void OnFirstDnsTransactionComplete() = 0; + // Called when a job succeeds and there are more transactions needed. If + // the current completed transaction fails, this is not called. Also not + // called when the DnsTask only needs to run one transaction. + virtual void OnIntermediateTransactionComplete() = 0; virtual RequestPriority priority() const = 0; @@ -974,7 +974,6 @@ const base::TickClock* tick_clock) : client_(client), hostname_(hostname), - query_type_(query_type), request_context_(request_context), secure_(secure), secure_dns_mode_(secure_dns_mode), @@ -989,34 +988,39 @@ else DCHECK(client_->CanUseInsecureDnsTransactions()); + if (query_type != DnsQueryType::UNSPECIFIED) { + transactions_needed_.push(query_type); + } else { + transactions_needed_.push(DnsQueryType::A); + transactions_needed_.push(DnsQueryType::AAAA); + } + num_needed_transactions_ = transactions_needed_.size(); + DCHECK(delegate_); } - bool needs_two_transactions() const { - return query_type_ == DnsQueryType::UNSPECIFIED; - } + // The number of transactions required for the specified query type. Does not + // change as transactions are completed. + int num_needed_transactions() const { return num_needed_transactions_; } bool needs_another_transaction() const { - return needs_two_transactions() && !transaction2_; + return !transactions_needed_.empty(); } bool secure() const { return secure_; } - void StartFirstTransaction() { - DCHECK_EQ(0u, num_completed_transactions_); - DCHECK(!transaction1_); - - net_log_.BeginEvent(NetLogEventType::HOST_RESOLVER_IMPL_DNS_TASK); - transaction1_ = CreateTransaction(query_type_ == DnsQueryType::UNSPECIFIED - ? DnsQueryType::A - : query_type_); - transaction1_->Start(); - } - - void StartSecondTransaction() { + void StartNextTransaction() { DCHECK(needs_another_transaction()); - transaction2_ = CreateTransaction(DnsQueryType::AAAA); - transaction2_->Start(); + + if (transactions_started_.empty()) + net_log_.BeginEvent(NetLogEventType::HOST_RESOLVER_IMPL_DNS_TASK); + + DnsQueryType type = transactions_needed_.front(); + transactions_needed_.pop(); + + std::unique_ptr<DnsTransaction> transaction = CreateTransaction(type); + transaction->Start(); + transactions_started_.insert(std::move(transaction)); } private: @@ -1082,8 +1086,8 @@ // Merge results with saved results from previous transactions. if (saved_results_) { - DCHECK(needs_two_transactions()); - DCHECK_GE(1u, num_completed_transactions_); + DCHECK_LE(2, num_needed_transactions()); + DCHECK_LT(num_completed_transactions_, num_needed_transactions()); switch (dns_query_type) { case DnsQueryType::A: @@ -1107,9 +1111,9 @@ // If not all transactions are complete, the task cannot yet be completed // and the results so far must be saved to merge with additional results. ++num_completed_transactions_; - if (needs_two_transactions() && num_completed_transactions_ == 1) { + if (num_completed_transactions_ < num_needed_transactions()) { saved_results_ = std::move(results); - delegate_->OnFirstDnsTransactionComplete(); + delegate_->OnIntermediateTransactionComplete(); return; } @@ -1390,7 +1394,6 @@ DnsClient* client_; std::string hostname_; - const DnsQueryType query_type_; URLRequestContext* const request_context_; // Whether lookups in this DnsTask should occur using DoH or plaintext. @@ -1401,10 +1404,10 @@ Delegate* delegate_; const NetLogWithSource net_log_; - std::unique_ptr<DnsTransaction> transaction1_; - std::unique_ptr<DnsTransaction> transaction2_; - - unsigned num_completed_transactions_; + base::queue<DnsQueryType> transactions_needed_; + base::flat_set<std::unique_ptr<DnsTransaction>> transactions_started_; + int num_needed_transactions_; + int num_completed_transactions_; // Result from previously completed transactions. Only set if a transaction // has completed while others are still in progress. @@ -1776,18 +1779,21 @@ void KillDnsTask() { if (dns_task_) { - if (dispatcher_) - ReduceToOneJobSlot(); + if (dispatcher_) { + while (num_occupied_job_slots_ > 1 || is_queued()) { + ReduceByOneJobSlot(); + } + } dns_task_.reset(); } } - // Reduce the number of job slots occupied and queued in the dispatcher - // to one. If the second Job slot is queued in the dispatcher, cancels the - // queued job. Otherwise, the second Job has been started by the - // PrioritizedDispatcher, so signals it is complete. - void ReduceToOneJobSlot() { - DCHECK_GE(num_occupied_job_slots_, 1u); + // Reduce the number of job slots occupied and queued in the dispatcher by + // one. If the next Job slot is queued in the dispatcher, cancels the queued + // job. Otherwise, the next Job has been started by the PrioritizedDispatcher, + // so signals it is complete. + void ReduceByOneJobSlot() { + DCHECK_GE(num_occupied_job_slots_, 1); DCHECK(dispatcher_); if (is_queued()) { dispatcher_->Cancel(handle_); @@ -1795,8 +1801,9 @@ } else if (num_occupied_job_slots_ > 1) { dispatcher_->OnJobFinished(); --num_occupied_job_slots_; + } else { + NOTREACHED(); } - DCHECK_EQ(1u, num_occupied_job_slots_); } void UpdatePriority() { @@ -1806,13 +1813,19 @@ // PriorityDispatch::Job: void Start() override { - DCHECK_LE(num_occupied_job_slots_, 1u); - handle_.Reset(); ++num_occupied_job_slots_; - if (num_occupied_job_slots_ == 2) { - StartSecondDnsTransaction(); + if (num_occupied_job_slots_ >= 2) { + if (!dns_task_) { + dispatcher_->OnJobFinished(); + return; + } + DCHECK(dns_task_); + StartNextDnsTransaction(); + if (dns_task_->needs_another_transaction()) { + Schedule(true); + } return; } @@ -1828,7 +1841,7 @@ // PrioritizedDispatcher with tighter limits. void StartProcTask() { DCHECK(dispatcher_); - DCHECK_EQ(1u, num_occupied_job_slots_); + DCHECK_EQ(1, num_occupied_job_slots_); DCHECK(IsAddressType(query_type_)); proc_task_ = std::make_unique<ProcTask>( @@ -1897,30 +1910,30 @@ void StartDnsTask(bool secure) { DCHECK_EQ(secure, !dispatcher_); - DCHECK_EQ(dispatcher_ ? 1u : 0, num_occupied_job_slots_); + DCHECK_EQ(dispatcher_ ? 1 : 0, num_occupied_job_slots_); DCHECK(!resolver_->HaveTestProcOverride()); // Need to create the task even if we're going to post a failure instead of // running it, as a "started" job needs a task to be properly cleaned up. dns_task_.reset(new DnsTask(resolver_->dns_client_.get(), hostname_, query_type_, request_context_, secure, secure_dns_mode_, this, net_log_, tick_clock_)); - dns_task_->StartFirstTransaction(); + dns_task_->StartNextTransaction(); // Schedule a second transaction, if needed. DoH queries can bypass the - // dispatcher and start immediately. - if (dns_task_->needs_two_transactions()) { - if (secure) - dns_task_->StartSecondTransaction(); - else - Schedule(true); + // dispatcher and start all of their transactions immediately. + if (secure) { + while (dns_task_->needs_another_transaction()) + dns_task_->StartNextTransaction(); + } else if (dns_task_->needs_another_transaction()) { + Schedule(true); } } - void StartSecondDnsTransaction() { + void StartNextDnsTransaction() { DCHECK_EQ(dns_task_->secure(), !dispatcher_); DCHECK(!dispatcher_ || num_occupied_job_slots_ >= 1); DCHECK(dns_task_); - DCHECK(dns_task_->needs_two_transactions()); - dns_task_->StartSecondTransaction(); + DCHECK(dns_task_->needs_another_transaction()); + dns_task_->StartNextTransaction(); } // Called if DnsTask fails. It is posted from StartDnsTask, so Job may be @@ -2004,18 +2017,28 @@ CompleteRequests(results, bounded_ttl, true /* allow_cache */, secure); } - void OnFirstDnsTransactionComplete() override { - DCHECK(dns_task_->needs_two_transactions()); + void OnIntermediateTransactionComplete() override { + DCHECK_LE(2, dns_task_->num_needed_transactions()); DCHECK_EQ(dns_task_->needs_another_transaction(), is_queued()); - // No longer need to occupy two dispatcher slots. - if (dispatcher_) - ReduceToOneJobSlot(); - // We already have a job slot at the dispatcher, so if the second - // transaction hasn't started, reuse it now instead of waiting in the queue - // for the second slot. - if (dns_task_->needs_another_transaction()) - dns_task_->StartSecondTransaction(); + if (dispatcher_) { + // We already have a job slot at the dispatcher, so if the next + // transaction hasn't started, reuse it now instead of waiting in the + // queue for another slot. + if (!dns_task_->needs_another_transaction()) { + // The DnsTask has no more transactions, so we can relinquish this slot. + DCHECK(!is_queued()); + ReduceByOneJobSlot(); + } else { + dns_task_->StartNextTransaction(); + if (!dns_task_->needs_another_transaction() && is_queued()) { + dispatcher_->Cancel(handle_); + handle_.Reset(); + } + } + } else if (dns_task_->needs_another_transaction()) { + dns_task_->StartNextTransaction(); + } } void StartMdnsTask() { @@ -2189,7 +2212,7 @@ if (dispatcher_) { // Signal dispatcher that a slot has opened. - DCHECK_EQ(1u, num_occupied_job_slots_); + DCHECK_EQ(1, num_occupied_job_slots_); dispatcher_->OnJobFinished(); } } else if (is_queued()) { @@ -2314,7 +2337,7 @@ // Number of slots occupied by this Job in |dispatcher_|. Should be 0 when // the job is not registered with any dispatcher. - unsigned num_occupied_job_slots_; + int num_occupied_job_slots_; // The dispatcher with which this Job is currently registered. Is nullptr if // not registered with any dispatcher.
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index ab836bf..fa00348 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -5727,7 +5727,6 @@ { "name": "detoxsinutritie.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "deuxsolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "devopsconnected.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "diegerbers.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dighans.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "digitalnonplus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dipconsultants.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -5806,7 +5805,6 @@ { "name": "fikt.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "finfev.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "firebird.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "fireorbit.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fischers.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "flamingkeys.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "flocktofedora.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -5820,7 +5818,6 @@ { "name": "fritzrepair.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "frly.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "frogatto.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "frontmin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "funderburg.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "furry.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "futuretechnologi.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6285,7 +6282,6 @@ { "name": "septakkordeon.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seq.tf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "serverco.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "servercode.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sharepic.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shaunwheelhou.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shibe.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6331,7 +6327,6 @@ { "name": "stefanovski.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sternplastic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stoianlawfirm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "storefrontify.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "strobeto.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "studenttravel.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "studyhub.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6407,7 +6402,6 @@ { "name": "tsumi.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tty.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tuvalie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ty2u.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "uat-activesg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ukrgadget.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "unexpected.nu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6872,7 +6866,6 @@ { "name": "noop.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "noxlogic.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nsweb.solutions", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nutrienti.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nyyu.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "obsydian.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oceandns.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8268,7 +8261,6 @@ { "name": "arlen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arnesolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arrowgrove.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "artisanhd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "artistnetwork.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arubasunsetbeach.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arvid.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8603,7 +8595,6 @@ { "name": "datenreiter.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "david-corry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "davidgouveia.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "davidhunter.scot", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dccoffeeproducts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dckd.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dcmt.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10640,7 +10631,6 @@ { "name": "bunaken.asia", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "canadianchristianity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cablemod.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "buildsaver.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "caps.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "casovi.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "catarsisvr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11643,7 +11633,6 @@ { "name": "bchep.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "befundup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "besixdouze.world", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "binaryfigments.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "binderapp.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biophysik-ssl.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitfasching.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13098,7 +13087,6 @@ { "name": "kuschku.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kwok.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kyliehunt.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "kyy.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kzjnet.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "l2guru.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "la-cave-a-nodo.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14066,7 +14054,6 @@ { "name": "berasavocate.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "anastasia-shamara.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bettertest.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "benjaminjurke.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aymericlagier.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "borderlinegroup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "awaremi-tai.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14142,7 +14129,6 @@ { "name": "biteoftech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "budger.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "buffaloautomation.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bytesunlimited.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cheazey.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bueltge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "businessimmigration-eu.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14263,7 +14249,6 @@ { "name": "darkcores.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "danielkoster.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cvtparking.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dataskydd.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "conflux.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "brain-e.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "danielhochleitner.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14360,7 +14345,6 @@ { "name": "eam-gmbh.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "connect.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ecos-ev.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "eimanavicius.lt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dhome.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ericisaweso.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "entourneebeetle.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -15970,7 +15954,6 @@ { "name": "ebiografias.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dronexpertos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "doyoulyft.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "craigbates.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dwtm.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "eduard-dopler.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "eglek.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -17065,7 +17048,6 @@ { "name": "andymoore.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "anivar.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "amphibo.ly", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "amsportuk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "armandsdiscount.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "alrait.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "agatheetraphael.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -17954,7 +17936,6 @@ { "name": "isthefieldcontrolsystemdown.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "integralblue.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jackrusselterrier.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "irmtrudjurke.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "internaldh.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ikulist.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "it-fernau.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -18106,7 +18087,6 @@ { "name": "laureltv.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lampegiganten.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lapolla.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "late.am", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gorf.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "krizevackapajdasija.hr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kontakthuman.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -18761,7 +18741,6 @@ { "name": "socialprize.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sikevux.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sh-heppelmann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "shishkin.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sifreuret.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "snowplane.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seogeek.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -21474,7 +21453,6 @@ { "name": "treatprostatewithhifu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tulsameetingroom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ugo.ninja", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "timeauction.hk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tremoureux.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "topanlage.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ultimate-garcinia-plus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22154,7 +22132,6 @@ { "name": "inceptionradionetwork.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "infinitioflynnwoodparts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "infopagina.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "informaticapremium.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "inglesnarede.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "inobun.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "internetaanbieders.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22788,7 +22765,6 @@ { "name": "21x9.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "24-7.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "256k.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "25reinyan25.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "2c-b.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "2c-d.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "2c-e.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23839,7 +23815,6 @@ { "name": "facealacrise.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "facesnf.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fairviewmotel-simcoe.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "falkhusemann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "falkus.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fame-agency.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "familyreal.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23928,7 +23903,6 @@ { "name": "fossgruppen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fotostravestisbr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fourwheelpartloanssimple.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "foxquill.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fr33tux.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fragilesolar.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "franchini.email", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25443,7 +25417,6 @@ { "name": "rijnmondeg.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rile5.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rimcountrymuseum.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "rioshop.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "risingsun.red", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rivaforum.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "riversideradio.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -25887,7 +25860,6 @@ { "name": "theblackknightsings.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thebte.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thecarolingconnection.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "thecloudrevolution.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thedrinks.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "theeducationdirectory.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "theelitebuzz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -26750,7 +26722,6 @@ { "name": "bikerebel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bobkoetsier.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bjtxl.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bookingready.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bookmakersfreebets.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitwrought.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bnin.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32358,7 +32329,6 @@ { "name": "viladochurrasco.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "visitkangaroovalley.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vitra-vcare.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "vividlumen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vwsoft.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "webbx.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "webless.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32424,7 +32394,6 @@ { "name": "atelierssud.swiss", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "august.black", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "autozane.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "avidcruiser.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aviv.nyc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ayatk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "badai.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -32796,7 +32765,6 @@ { "name": "renascentia.asia", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "report-incident.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "restoruns.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "rivercruiseadvisor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "robinflikkema.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "roeldevries.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rosesciences.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -33859,7 +33827,6 @@ { "name": "juergenspecht.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "juliaoantiguidades.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "juniperroots.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "jurke.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "justbelieverecovery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "justzz.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "juventusmania1897.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -35187,7 +35154,6 @@ { "name": "qualtrics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "quasarelectronics.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ra.co.ke", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "rabotaescort.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "radicaloptimism.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ratebridge.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "real-digital.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -36402,7 +36368,6 @@ { "name": "novecity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oakparkelectrical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "obud.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ocsr.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "octothorpe.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "officefundays.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ogrodywstudniach.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -38739,8 +38704,6 @@ { "name": "alibababee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allenosgood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allenscaravans.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "allgrass.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "allgrass.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allgreenturf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allincoin.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alljamin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40802,7 +40765,6 @@ { "name": "joefixit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johansf.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jollygoodspudz.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jondowdle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jrabasco.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jsbevents.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jsblights.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40904,7 +40866,6 @@ { "name": "mycuco.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mydentalplan.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mydna.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "myotopie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myperfecthome.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myrewardspoints.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myvitalhealthsolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48990,7 +48951,6 @@ { "name": "ibwc.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icake.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ignitedlocal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "incigma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "incompliance.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inevitavelbrasil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infosimmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49418,7 +49378,6 @@ { "name": "distillery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diytechguides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dmcglobaltravel.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dmitry.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dnlr.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dnscrypt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doceamoraviverbem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51565,7 +51524,6 @@ { "name": "usweme.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "utterberry.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uw1008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uxp-it.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uziregister.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valcardiesel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valentin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52084,7 +52042,6 @@ { "name": "plutiedev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pmheart.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "politicachubut.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "polska-robota.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "potzwonen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "poundwholesale.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "powerplaywashers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53477,7 +53434,6 @@ { "name": "sellorbuy.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "semdynamics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sennase.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "seohouston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sexymassageoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sfaparish.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sgs-systems.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56440,7 +56396,6 @@ { "name": "sgs.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shadowping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shampoo63.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shattered-souls.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shippercenter.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "showersnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shtaketniki.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56656,7 +56611,6 @@ { "name": "wba.or.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wcrca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wcsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "web-thinker.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webnetforce.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webstart.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wedg.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57024,7 +56978,6 @@ { "name": "corscanplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "couplay.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coworking-luzern.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cpap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cpgarmor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cpsq.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crackers4cheese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60018,13 +59971,11 @@ { "name": "estefan.dyndns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "estonia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eternalflame.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ethanchin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eurorecambios24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exadime.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "explorebigideas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "expmind.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "express1040.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eyejobs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "facai666.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "facai888.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "facarospauls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61713,11 +61664,6 @@ { "name": "blogit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "briograce.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buck-hydro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "burakogun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "burakogun.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "burakogun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "burakogun.net.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "burakogun.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burzum.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cabanactf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "camping-le-pasquier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61763,7 +61709,6 @@ { "name": "dpsg-hohenlinden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drros.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dubstep.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "e-webos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eallion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eblog.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "educacionvirtual.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62898,7 +62843,6 @@ { "name": "cycledownunder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cynicaloptimist.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daddyfinger.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dan-nixon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daniel-milnes.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daniel.domains", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daop.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63666,7 +63610,6 @@ { "name": "yuvaindia.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeiw.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zhl123.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zinglix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zocial.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zoptiks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0xff.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64879,7 +64822,6 @@ { "name": "danieljball.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dansaunders.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davidzeegers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dawgtag.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dazzit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deavel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deavel.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65327,7 +65269,6 @@ { "name": "apunkt.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aquaterm72.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arctic.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ardia.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arena-lemgo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arjanenthijs.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artofhomeorganizing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65366,7 +65307,6 @@ { "name": "berlin-cuisine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "betor.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bevedo.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bewished.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beyerm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beyondordinarylife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bfkcloud.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65785,7 +65725,6 @@ { "name": "ks5000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks88.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ksoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kumbayops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kumpulannamabayi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kunvn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kupferschmids.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66572,7 +66511,6 @@ { "name": "gobytedesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goldsteinlawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grabatt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "grandworldnghiduong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hapimiennam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "happychungus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "harms.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66655,7 +66593,6 @@ { "name": "mindofmedia.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mistine.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mistine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mobasuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mobydog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moneylance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mongolie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -67242,7 +67179,6 @@ { "name": "k819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaioken.bar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kandofu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kevinschreuder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kiczela.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kjfaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klev.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -67298,7 +67234,6 @@ { "name": "mhurologytriad.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "midi-ctes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mikemooresales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "miniwolke.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minmaxgame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mistinecn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mm4447761.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70095,7 +70030,6 @@ { "name": "werkenbijsherpa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wervingenselectieamsterdam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wikibuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "winterparkphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "workingon.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wowin58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wowin88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70675,7 +70609,6 @@ { "name": "acceptancerecoverycenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "activephoto.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adrian2023.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "advancedpestspecialists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ag600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ag800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ag978.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70807,7 +70740,6 @@ { "name": "giaoxudongtri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glexia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gobiz.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "goldenhostmyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gordyf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "habbstars.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hallaminternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70831,7 +70763,6 @@ { "name": "idealize.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilc666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ime-a-tolerancia-eredmenye.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "imedia.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imediamyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imediasingapore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immivest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70902,7 +70833,6 @@ { "name": "k8dc17.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "k8md01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "k8md12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kebhanamyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kf-59.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kf0000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kf388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -70993,7 +70923,6 @@ { "name": "noop.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "notablepeeps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "o98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "okmyanmartravels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ommcitalflex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onetwosweetatelier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "orchardnh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72097,7 +72026,6 @@ { "name": "ender.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enter.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ergonova.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "erodvd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "est-keyman.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "etaxigraz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eternalparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72635,24 +72563,6 @@ { "name": "8230d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8809ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8830ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "886666z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "88btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918ddk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918ui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72697,7 +72607,6 @@ { "name": "athens-limousines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autocadperfmon.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aviasalon.spb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bandeiraimoveisitu.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bankapp.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bazqux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72719,7 +72628,6 @@ { "name": "btt6262a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buysoft.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "byfeldt.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "c886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cadastroloteamento.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "calendriergn.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "careerdirectionsltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72856,7 +72764,6 @@ { "name": "jeroendev.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jigsawplanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "josegdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "k886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kanis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kartikmohta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kashbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72945,7 +72852,6 @@ { "name": "mrnathanpowell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysasiedzi.bialystok.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myunicornshops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nclf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "negativeentropy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "negocios-imatore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72985,7 +72891,6 @@ { "name": "pro-clean.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "profession.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pvpheroes.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "q886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qttransformation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quantumcrypto.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "raydolap.web.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73003,7 +72908,6 @@ { "name": "rt1314.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rupostel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ryanfamily.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "s886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safarimasaimara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saletzki.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samandej.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73062,7 +72966,6 @@ { "name": "tuzagtcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twoguyswhoblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tytocare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "u886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uboratz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uix.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ultrasdesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73113,18 +73016,9 @@ { "name": "xtremecoatingtechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xyloefarmoges.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y0bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y1992.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y2212.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y2232.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y2242.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y2252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y2272.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y2bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y3343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y3353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y3bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y4bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y5545.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y5bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y6bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y7bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73417,7 +73311,6 @@ { "name": "buhex.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burbankdental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "calbertsen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "californialemonlaw.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "canavilage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "capillary.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cargoguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73585,7 +73478,6 @@ { "name": "kb8892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb9494.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kidonng.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kieskundig.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kimkhisaigon.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kinderopvangthuis.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73930,11 +73822,7 @@ { "name": "0123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0138365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0139365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "0165365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "0175365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "0185365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "018663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "0195365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "038456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "038663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0393ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73942,11 +73830,6 @@ { "name": "0393hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0393ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "03region.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "040552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "041552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "042552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "046552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "049552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "050.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "050a1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "050a2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73954,8 +73837,6 @@ { "name": "050a4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "050a5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "050a6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "051552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "054552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "065l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0681a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0681b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73981,15 +73862,11 @@ { "name": "0681x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0681y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0681z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "068552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "068663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "071552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0737399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "078663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "083832.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "084552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "085851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100pudov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100visits.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "107996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74006,31 +73883,8 @@ { "name": "123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "123seo.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "12n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "131365ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "131365qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "142552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "146552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "146773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "148663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1517598.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1517668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1517669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1517883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1517886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1517889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "154552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "16-qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "16qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "16region.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74075,8 +73929,6 @@ { "name": "2288bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "22b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "23454048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "241552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "242552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "246773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2484811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "24848168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74137,7 +73989,6 @@ { "name": "2evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2kvn.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2lovebirdsblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "3004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3006789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "30n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "317811111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74181,7 +74032,6 @@ { "name": "3178ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3178xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3178yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "3265623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "333b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3344985.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "335a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74189,7 +74039,6 @@ { "name": "33n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "348663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "351365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "3539783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "360365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "36588801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365888012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74216,18 +74065,6 @@ { "name": "3659867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3659980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eiv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365eiw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365nnn.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365nnnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365r.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365rr.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365xxx.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365y0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365y00.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365y1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74246,7 +74083,6 @@ { "name": "365y99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365ypw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "365zg.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365zzz.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "37987.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "380111000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "380111111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74258,7 +74094,6 @@ { "name": "380111777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "380111888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3809955.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "382228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3837b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3837c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3837d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74284,7 +74119,6 @@ { "name": "3837y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3837z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "38irkutsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "391231.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "392365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3957b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3957c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74336,7 +74170,6 @@ { "name": "3w-solutions.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4001365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4002365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4025360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4025361.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4025362.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74412,15 +74245,6 @@ { "name": "40n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "416365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "418663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233331.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233332.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233334.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233335.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233336.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "4233339.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "426773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4345.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "436773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74433,13 +74257,11 @@ { "name": "458663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "476773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "486773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "497552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "498663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4best.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4dillusion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4tgw34.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "500wordessay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5017503.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5055990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74484,55 +74306,11 @@ { "name": "55ks.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "55n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "56784048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5898657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "59759vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "59759z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981644.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981667.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5981844.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5981h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5981m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "59859h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "59859j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "59859k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74542,10 +74320,7 @@ { "name": "598877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "59rus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5ilg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "6004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "60n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "611121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "611125.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "611165.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "611195.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "616675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74614,7 +74389,6 @@ { "name": "6396hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6396iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6396jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "657843.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "66321aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "66321bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "66321cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74681,21 +74455,13 @@ { "name": "67894048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "67y7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6863070.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "7004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "70365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "70n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "71365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "733575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "73365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "74365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "755243.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755246.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755249.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755274.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755284.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "755294.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "755a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "76365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "769k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74846,16 +74612,12 @@ { "name": "940365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "946773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "96002.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "961705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "96678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "966ty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "97736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "97737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "97738.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "97739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "9836952.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "988316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "9977432.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9988551.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9988959.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "99994048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75041,19 +74803,7 @@ { "name": "b1111.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b3333.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b36512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36513.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36516.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36517.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b36520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b538.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b58365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b58appb58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75082,10 +74832,6 @@ { "name": "b83ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b83jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b83kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b88aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b88cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b88dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b88ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b89ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b89gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b89hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75846,7 +75592,6 @@ { "name": "hyhy98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "i36588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i7sas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iamwill.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76033,7 +75778,6 @@ { "name": "kylie-pomada.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kyrylych.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "l30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "l3l365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "la-paco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "labandadelamente.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lablnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76334,7 +76078,6 @@ { "name": "omretreats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "one-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlineautodealered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "onurerhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ooo-santal.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "operanavigation.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "opncld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77083,21 +76826,12 @@ { "name": "v55510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v55520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v55530.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v55565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v55569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v55580.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v55590.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v55593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v55v55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v6021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v6170.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v6350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v6506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v66233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v66255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v66557.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v66615.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v66618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v66619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v66629.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77108,14 +76842,9 @@ { "name": "v700a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v700b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v88299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v88511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v88559.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v88656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v88799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v9285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v9286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v9289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v9812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v9820.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v9821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v9823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77326,30 +77055,6 @@ { "name": "xucha.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xx6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y09a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09app.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "y09x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y3650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y36500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77548,9 +77253,6 @@ { "name": "zsoltbereczki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zumberak.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zverskij-site.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zzzz365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "015ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "031ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "050ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "05am8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1080.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77583,7 +77285,6 @@ { "name": "52062z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5536z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5539z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "5981688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5goglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "65131a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "65131c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77716,7 +77417,6 @@ { "name": "agaveandpine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agks02.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrodronechile.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agweili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aimare-web.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "airmash.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ajaxtime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77804,7 +77504,6 @@ { "name": "b70661.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b70663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b70664.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b70665.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b70771.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b70772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b70773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78217,7 +77916,6 @@ { "name": "inlt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "innovationgarage.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "input.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "inspiringfuture.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "integ.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "integsystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "interminsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78309,8 +78007,6 @@ { "name": "krossakorven.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "krovatka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks05.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks19.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks410.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kudinilam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kulthist.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78568,14 +78264,6 @@ { "name": "myresidence.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myreviews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mystore24.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888-qieji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888599.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n88890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888duchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888go.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "n888ok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nadjabenaissa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nadoske.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79297,7 +78985,6 @@ { "name": "w668899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w668989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w66hao.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w6808.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w682w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w6863.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w7355.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79323,7 +79010,6 @@ { "name": "websiteguider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "websitemarketers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webtaxi.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "weili.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weili1111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weili1120.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weili1121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79331,7 +79017,6 @@ { "name": "weili1123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weili1127.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weili1128.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "weili8888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weili88888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weilibet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weilibet.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79350,7 +79035,6 @@ { "name": "wiskundeonderzoek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wispmaeksmusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wl511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl971.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl972.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79807,7 +79491,6 @@ { "name": "dogandoganay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "domainstaff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dominictaylor.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "domsoty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dondiabolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dracula.city", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "druzya.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79907,7 +79590,6 @@ { "name": "jw66.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kajabutik.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kamagraerektion.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kf2000.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kocka.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kocka.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kp0808.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80147,10 +79829,6 @@ { "name": "yugodi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yy366.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yzh8.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8920.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8921.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeroanarchy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zerobajt.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeusec.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80254,7 +79932,6 @@ { "name": "cyberforensics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d88.cn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "d8846.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d8855.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d8877.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d88agent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80382,7 +80059,6 @@ { "name": "kasperstad.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kassarsoap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "katcr.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kf200.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "khojhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kireilign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klocast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80392,7 +80068,6 @@ { "name": "kodomo.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koflegend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "krillz.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks36.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks6807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks6812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks6815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80648,8 +80323,6 @@ { "name": "yolocast.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourpocketbook.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yspa.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8926.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeilenwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zenideen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeta.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81053,10 +80726,8 @@ { "name": "z-cert.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z3u5.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "z8950.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zombmage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zoohaus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "04d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "111plus.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "168fff.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "281ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81139,7 +80810,6 @@ { "name": "descargar-apk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desentupidorademais.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desheng28.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "diananeves.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ds138.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dtinel.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dylnuge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81265,7 +80935,6 @@ { "name": "lideradigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lighthouseglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lilianejuchli.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "linuxhub.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "locksmithfourways24-7.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loli.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lonelypawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81717,7 +81386,6 @@ { "name": "myinsuranceauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myinsurancelife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myinsurancesource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mylifeinsurancerates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myndighetermeddnssec.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myndighetermedipv6.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myroofandhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82290,7 +81958,6 @@ { "name": "roisu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roopakvenkatakrishnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rotamap.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "roxxz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "roys.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rrbts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "run4gameplay.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82811,7 +82478,6 @@ { "name": "parfumerie-de-grasse.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parkeerbordenhuren.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paroisses-theix-surzur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "passa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pcdbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pfonks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "piektraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83303,7 +82969,6 @@ { "name": "modelspoorprojecten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modernautorepairs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mont-thabor.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "morrellllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mountainutilities.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mraag.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mrvnt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83317,7 +82982,6 @@ { "name": "noahenco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nocloud.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nogradhont.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nspireoutreach.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "objectif-securite.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "officezoneonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "okkhor52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83720,7 +83384,6 @@ { "name": "agendo.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahsyg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aiva.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alan.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alarelleimpresiones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alko-centr.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allbestcbdoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84023,7 +83686,6 @@ { "name": "m4all.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "m51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "madisoncountyhelps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "manuelpinto.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mariage-protestant.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "martinboerhof.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masstercurssos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84876,14 +84538,6 @@ { "name": "iosprivacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isigmaonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "j00228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j70101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j70102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j70103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j70104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j70105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j7051.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j7052.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "j7053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jaimesotelo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jamestown.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jebengotai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84894,7 +84548,6 @@ { "name": "jtl-connect.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jtl-pos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kappershuis-meppel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kb88dc29.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kettlemetalbbq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kidsphysiotherapy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kingnutrition.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84961,43 +84614,10 @@ { "name": "murmu.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myinjuryattorney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mythoughtmachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n16.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n18.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n29.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n32.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n37.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n48.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n56.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n69.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n78.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888131.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n88828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888292.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888378.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888459.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888689.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n888909.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "n98.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "naidonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nccfa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nei.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nemzetizaszlok.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ngonkitchen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "novonegoc.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nr-sputnik.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nutrizionista.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85137,7 +84757,6 @@ { "name": "v700cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v700dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v700w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "v88522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "v9037.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valx.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vandommelenart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85209,7 +84828,6 @@ { "name": "xn--80accdc8alelmbe9n.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--80aeczhjbkbcw0bk0h.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--80akcnmdfaffwoxl7h.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xp16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xs00228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y68aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "y68cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85239,6 +84857,600 @@ { "name": "zaledia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zijemvedu.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ziledelaultimagafaavioricai.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2017c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "222111.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "233ss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2712aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658880000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888001.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888002.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888003.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888004.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888005.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888009.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658880123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658881111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658881234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658882222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658882345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658883333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658883456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658884444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658884567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658885555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658885678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658886789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658888888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658889999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970yes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6617365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6627365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6629365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6666sb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602014.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602016.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602018.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086011.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086055.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "86086099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8888209.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "889vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "889vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "889vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8914499.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "93cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "about-ti.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adomicilio.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advancedurologyswla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aecis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afrikmag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agencytsunami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airline-economy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ajs5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akerboom.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akerboom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphasib.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "americans.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amymabel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andrey1p.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anna-dance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apalancamiento.trade", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aravatul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arcadio.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arno-klein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arno-klein.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arnoklein.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arnoklein.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artc.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arx-libertatis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asianwebcams.webcam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asmarketero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asperger-ag.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atheit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aufwecken.dynu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoglass.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avancen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avisofi-credit-immobilier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0hr.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99011.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99055.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9912.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99218.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99418.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9954.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9961.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9976.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b99918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bairuo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baiurl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bekolite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benjamin-mary.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44401.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44402.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44403.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44405.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44406.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44407.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44409.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet44410.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bienhacerlimpiezas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bionezis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blaargh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bloggingtipsfornewblogger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bongocams.webcam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "botsiah.fail", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breizh.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bryandesrosiers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bureaugoodwork.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buriramradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buyplaytix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "byrnesagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cakesbyzoey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cargosapiens.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carpet---cleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casaasia.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casaasia.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdemi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cedric-bour.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "censys.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centraldoencanador.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centurion-consulting.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "certisoncologysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chainge-re.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "change-coaching-gmbh.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chicjrajeevalochana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chmc.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chris-siedler.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "citationranker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ckpl.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cldejessey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clean-mailbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cncn.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colombianas.webcam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compassleaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connectme.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conservativenewsandviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consteval.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "constexpr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "constinit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consultinghero.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "contact.inc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cooljv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "craft-beer.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crafters.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "craftsandsweets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crtalleres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuir-lipari.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cvo-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberpcforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d4designstudios.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d4designstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dafassl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darkhunter.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "davidje13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dbb.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dearstackexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "debarras-diogene.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decarrouseloss.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "delosgaia.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deltna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deped.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deshobi.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "desklite.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diamgroup.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digirechnung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digital-eastside.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dilibel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "divup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diyibo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "docupaymentuat.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domeindns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "donpanda.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dottore.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ds.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dscharrer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dtcp8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dtnx.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dyxe.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dyxe.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "earlybetter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eazyproject.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ebooknetworking.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eco-repair.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "editionsnoiretrouge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eficsolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elitedns.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elvendrim.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emoxie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "endbox.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enghost.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erichoekstra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erichoekstra.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erkiss.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "errolstambler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "essays.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "euroexpres.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exploithe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eyedesignuniversity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eziwine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88qin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip106.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip19.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip20.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip21.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip23.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f88vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f8cp3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f8cp6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fabslabour.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "facemd.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fh999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fhyl789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fhyl888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fidoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fitequilibrio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flatfix.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "foreignxchange.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freddieleeman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freelancebest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freevst.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frsra.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fryergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fx-rating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gampa.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geluleminceur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "genealogiegazet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gentoocn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghostsupreme.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gluhov-ss.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gotowebsites.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "graficasantana.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenpark.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenpathscience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grupog2i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hackingvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hairfitwolvega.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hardcoen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hasst.schule", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hif88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hitsbola.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "houseofpertijs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hrpage.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "igap.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ikaria.com.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilgiornaledelticino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imiix.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inflatiecalculator.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "influencerchampions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infoprosnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inkbunny.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "innovum.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "instagc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "institutointersistemico.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internetzonei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "interstateremovalists.sydney", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inu.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "investigatore.torino.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itvaatlik.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ixit.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jaisiam.co.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jamesusandra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "janeymac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jasminlive.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jesusthegoodshepherd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jonglvab.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "journalof.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js636.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js638.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js6868.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juliaknightly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "justimports.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jyoba.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kas.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kbst.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kelis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "key-form.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keysso.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kjkmail.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klikacc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kneppe.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "knulla.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "knulle.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koef.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kolkinn.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kpntdolive.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kraftpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kunzesoftware.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kupriy-coach.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuretru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kycisrael.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lanzalex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latinoramarecords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "le-fumoir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lesptitstutos.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lg2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liborburda.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lightyear.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liypoi.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lms-luch.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lojapos.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lomaem-nsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "londonlegaltranslation.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "londonseedcentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lostandfound.mu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loxal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lucyhancock.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ludofantasy.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "macha.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maephorncurry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maisvitaminas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maisy.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mandilabeachhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manitaggarwal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marjonruns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvin.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvnet.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maydn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbardot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meayne.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meditarenargentina.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megapixelweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megapixelweb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megatravel.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "menthiere.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mijngiftshop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mindmusic.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mispromo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miss.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mizoey.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mooremetrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mountaintree.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mpoonamchandpearls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "musthinsider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "my-sex-cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mywindscreen.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nbclinic.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neilsonmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nfl.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ng911services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nickkallis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nicolettajennings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nicoobank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nielsbohr.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nilahue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nlpdiscovery.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nobreinox.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nrthcdn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nutextonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nyan.kim", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nyerjanegroval.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "obra.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ohbabybean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ok7779.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ondiet.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlysim.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oumyshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "overwatchss.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oxfordbio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p4g.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paguponku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paiementdp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paradigma-med.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "partenopei.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pazerandepstein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pbwebdev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "personadecoded.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pfstaging.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pimichi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pixelumin3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pizza-calzone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pjax.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "points-pote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poolvilla-margarita.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pornleg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "postmistress.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pragma-solution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "premium-computer.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "previousmagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prodampro.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "profritual.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psychiatrie-ricany.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "puntaprop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pytradebot.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qnected.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quatulo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quik.legal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qurplus.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rabbitcallcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ravelin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redmoon.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redworks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "referat.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "referat.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renanoliveira.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "restaurantedonono.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "revampweb-staging.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "revistasomos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rexfinland.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rfid-schutz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ripp-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "romanian.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rotate4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "royalaubar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruvinroshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rw2.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rythm.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saiyans.com.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saledump.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salonderecepcionessjl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salto.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sarkaariseva.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scenari-community.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scenari.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scenari.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sdebitati.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seishinchuo-lawoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sendzik.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sex-sex-cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shahzaibm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shoemakerywc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shokureach.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "signaturechannel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simonssh.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slc.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sleep-go.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sm.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "socaliente.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soccers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sockfetish.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softwarepara.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soulcraft-cracked.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "southpointcollision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spacehighways.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spiritualites.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sportticino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "st42.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stacktrace.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stamboomgids.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sth.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stopyhrdinu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "storiesbysign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stripe.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stripecdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stronku-gaming.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stroyka-iz-brusa.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "studio678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sukherchador.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "svtr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sydneychillies.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sztoriboljeles.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t39.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t3hty.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techaraby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "televotia.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "temp.hopto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thebasicstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thefestivals.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theo-andreou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theorioncorrelation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thetwistedrabbit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thomasecookedds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thundercloud.onthewifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timacdonald.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timeless-spirit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tixel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tls.blue", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toddexler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "todotecnohoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toorl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "torrentgalaxy.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toudum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tupeuxpastest.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tussier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twtr.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ubezpieczenia-poznan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uborka-812.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ukriate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ultimateappreviews.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "upholsterycleanerslondon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urkult.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "username.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "usjunkyardsnearme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uv.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v05666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v06999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v12555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v67555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v68777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v700ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v76555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v78555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veg.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verbmaestro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vertretungsplan.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "videolabsinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vinhodragao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visuri.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voidancerecords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vostok-zapad54.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voyagewonders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs106.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs107.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs601.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs603.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs680.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vz.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w3app.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wajs1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wajs2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waterheaterirvingtx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "watthasawang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wbuhs.ac.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webkam-sex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webshaped.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "websitecyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weeklydcoupgen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weldotherm.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "werxus.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whiteeagleca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wibness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wikileaks.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "williamvds.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "winckelmann2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woodwo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wossl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wtfbryan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wulala.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xahbspl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xprometheus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ya.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yachtfolio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yanik.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yeswecan.co.bw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ygm.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yl8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yugodi.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yvb.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zalure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zdenekpasek.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zenassociates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc index 9150434..6eb8e53 100644 --- a/net/quic/quic_connection_logger.cc +++ b/net/quic/quic_connection_logger.cc
@@ -51,7 +51,8 @@ quic::TransmissionType transmission_type, quic::QuicTime sent_time) { base::Value dict(base::Value::Type::DICTIONARY); - dict.SetIntKey("transmission_type", transmission_type); + dict.SetStringKey("transmission_type", + quic::TransmissionTypeToString(transmission_type)); dict.SetKey("packet_number", NetLogNumberValue(serialized_packet.packet_number.ToUint64())); dict.SetIntKey("size", serialized_packet.encrypted_length); @@ -77,7 +78,8 @@ quic::TransmissionType transmission_type, quic::QuicTime detection_time) { base::Value dict(base::Value::Type::DICTIONARY); - dict.SetIntKey("transmission_type", transmission_type); + dict.SetStringKey("transmission_type", + quic::TransmissionTypeToString(transmission_type)); dict.SetKey("packet_number", NetLogNumberValue(packet_number.ToUint64())); dict.SetKey("detection_time_us", NetLogNumberValue(detection_time.ToDebuggingValue()));
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 64c7e8b..4321c306 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -997,7 +997,7 @@ void NetworkContext::CreateUDPSocket( mojo::PendingReceiver<mojom::UDPSocket> receiver, - mojom::UDPSocketListenerPtr listener) { + mojo::PendingRemote<mojom::UDPSocketListener> listener) { socket_factory_->CreateUDPSocket(std::move(receiver), std::move(listener)); }
diff --git a/services/network/network_context.h b/services/network/network_context.h index 859d673..29d9c39 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -242,8 +242,9 @@ void GetExpectCTState(const std::string& domain, GetExpectCTStateCallback callback) override; #endif // BUILDFLAG(IS_CT_SUPPORTED) - void CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver, - mojom::UDPSocketListenerPtr listener) override; + void CreateUDPSocket( + mojo::PendingReceiver<mojom::UDPSocket> receiver, + mojo::PendingRemote<mojom::UDPSocketListener> listener) override; void CreateTCPServerSocket( const net::IPEndPoint& local_addr, uint32_t backlog,
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc index b2fdbe5..de293093 100644 --- a/services/network/network_context_unittest.cc +++ b/services/network/network_context_unittest.cc
@@ -2384,21 +2384,20 @@ // Create a server socket to listen for incoming datagrams. test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr listener_interface_ptr; - listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); mojo::Remote<mojom::UDPSocket> server_socket; - network_context->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(), - std::move(listener_interface_ptr)); + network_context->CreateUDPSocket( + server_socket.BindNewPipeAndPassReceiver(), + listener_receiver.BindNewPipeAndPassRemote()); test::UDPSocketTestHelper helper(&server_socket); ASSERT_EQ(net::OK, helper.BindSync(server_addr, nullptr, &server_addr)); // Create a client socket to send datagrams. mojo::Remote<mojom::UDPSocket> client_socket; network_context->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket);
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom index 8632b57..20b2a70 100644 --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom
@@ -939,7 +939,7 @@ // Any sockets that are created but are yet to be destroyed will be destroyed // when NetworkContext goes away. CreateUDPSocket(pending_receiver<UDPSocket> receiver, - UDPSocketListener? listener); + pending_remote<UDPSocketListener>? listener); // Creates a TCP server socket that listens on |local_addr|. The socket // created can only be used for the purpose specified in |traffic_annotation|,
diff --git a/services/network/socket_factory.cc b/services/network/socket_factory.cc index 0131efc..6e4475df 100644 --- a/services/network/socket_factory.cc +++ b/services/network/socket_factory.cc
@@ -42,7 +42,7 @@ void SocketFactory::CreateUDPSocket( mojo::PendingReceiver<mojom::UDPSocket> receiver, - mojom::UDPSocketListenerPtr listener) { + mojo::PendingRemote<mojom::UDPSocketListener> listener) { udp_socket_receivers_.Add( std::make_unique<UDPSocket>(std::move(listener), net_log_), std::move(receiver));
diff --git a/services/network/socket_factory.h b/services/network/socket_factory.h index 5a22a29..7c70eb0 100644 --- a/services/network/socket_factory.h +++ b/services/network/socket_factory.h
@@ -11,6 +11,7 @@ #include "base/component_export.h" #include "base/macros.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/strong_binding_set.h" #include "mojo/public/cpp/bindings/unique_receiver_set.h" #include "net/socket/ssl_client_socket.h" @@ -45,7 +46,7 @@ // These all correspond to the NetworkContext methods of the same name. void CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver, - mojom::UDPSocketListenerPtr listener); + mojo::PendingRemote<mojom::UDPSocketListener> listener); void CreateTCPServerSocket( const net::IPEndPoint& local_addr, int backlog,
diff --git a/services/network/test/test_network_context.h b/services/network/test/test_network_context.h index 77028b4..978d40f7 100644 --- a/services/network/test/test_network_context.h +++ b/services/network/test/test_network_context.h
@@ -13,6 +13,7 @@ #include "base/optional.h" #include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/address_list.h" #include "net/base/ip_endpoint.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -120,8 +121,9 @@ void GetExpectCTState(const std::string& domain, GetExpectCTStateCallback callback) override {} #endif // BUILDFLAG(IS_CT_SUPPORTED) - void CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver, - mojom::UDPSocketListenerPtr listener) override {} + void CreateUDPSocket( + mojo::PendingReceiver<mojom::UDPSocket> receiver, + mojo::PendingRemote<mojom::UDPSocketListener> listener) override {} void CreateTCPServerSocket( const net::IPEndPoint& local_addr, uint32_t backlog,
diff --git a/services/network/udp_socket.cc b/services/network/udp_socket.cc index 2fefb8f..4c66a285 100644 --- a/services/network/udp_socket.cc +++ b/services/network/udp_socket.cc
@@ -153,7 +153,8 @@ UDPSocket::PendingSendRequest::~PendingSendRequest() {} -UDPSocket::UDPSocket(mojom::UDPSocketListenerPtr listener, net::NetLog* net_log) +UDPSocket::UDPSocket(mojo::PendingRemote<mojom::UDPSocketListener> listener, + net::NetLog* net_log) : net_log_(net_log), is_bound_(false), is_connected_(false),
diff --git a/services/network/udp_socket.h b/services/network/udp_socket.h index 55a0a0a..f5edb2c 100644 --- a/services/network/udp_socket.h +++ b/services/network/udp_socket.h
@@ -13,6 +13,8 @@ #include "base/containers/span.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/address_family.h" #include "net/base/completion_once_callback.h" #include "net/base/ip_endpoint.h" @@ -71,7 +73,8 @@ net::CompletionOnceCallback callback) = 0; }; - UDPSocket(mojom::UDPSocketListenerPtr listener, net::NetLog* net_log); + UDPSocket(mojo::PendingRemote<mojom::UDPSocketListener> listener, + net::NetLog* net_log); ~UDPSocket() override; // UDPSocket implementation. @@ -147,7 +150,7 @@ bool is_connected_; // The interface which gets data from fulfilled receive requests. - mojom::UDPSocketListenerPtr listener_; + mojo::Remote<mojom::UDPSocketListener> listener_; std::unique_ptr<SocketWrapper> wrapped_socket_;
diff --git a/services/network/udp_socket_unittest.cc b/services/network/udp_socket_unittest.cc index 02c0506c2..f6cc0b9 100644 --- a/services/network/udp_socket_unittest.cc +++ b/services/network/udp_socket_unittest.cc
@@ -16,7 +16,8 @@ #include "base/run_loop.h" #include "base/test/task_environment.h" #include "build/build_config.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "net/base/net_errors.h" #include "net/socket/udp_socket.h" #include "net/traffic_annotation/network_traffic_annotation.h" @@ -216,7 +217,7 @@ TEST_F(UDPSocketTest, Settings) { mojo::Remote<mojom::UDPSocket> socket_remote; factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint server_addr; net::IPEndPoint any_port(GetLocalHostWithAnyPort()); @@ -235,7 +236,7 @@ TEST_F(UDPSocketTest, TestSendWithBind) { mojo::Remote<mojom::UDPSocket> socket_remote; factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); @@ -254,13 +255,11 @@ TEST_F(UDPSocketTest, TestSendToWithConnect) { // Create a server socket to listen for incoming datagrams. test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr listener_interface_ptr; - listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); mojo::Remote<mojom::UDPSocket> server_socket; factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(), - std::move(listener_interface_ptr)); + listener_receiver.BindNewPipeAndPassRemote()); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -269,7 +268,7 @@ // Create a client socket to send datagrams. mojo::Remote<mojom::UDPSocket> client_socket; factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -285,7 +284,7 @@ TEST_F(UDPSocketTest, TestUnexpectedSequences) { mojo::Remote<mojom::UDPSocket> socket_remote; factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); test::UDPSocketTestHelper helper(&socket_remote); net::IPEndPoint local_addr(GetLocalHostWithAnyPort()); @@ -316,7 +315,7 @@ // ERR_IO_PENDING, udp_socket.cc doesn't free the send buffer. TEST_F(UDPSocketTest, TestBufferValid) { mojo::Remote<mojom::UDPSocket> socket_remote; - UDPSocket impl(nullptr /*listener*/, nullptr /*net_log*/); + UDPSocket impl(mojo::NullRemote() /*listener*/, nullptr /*net_log*/); mojo::Receiver<mojom::UDPSocket> receiver(&impl); receiver.Bind(socket_remote.BindNewPipeAndPassReceiver()); @@ -356,7 +355,7 @@ // ERR_INSUFFICIENT_RESOURCES is returned appropriately. TEST_F(UDPSocketTest, TestInsufficientResources) { mojo::Remote<mojom::UDPSocket> socket_remote; - UDPSocket impl(nullptr /*listener*/, nullptr /*net_log*/); + UDPSocket impl(mojo::NullRemote() /*listener*/, nullptr /*net_log*/); mojo::Receiver<mojom::UDPSocket> receiver(&impl); receiver.Bind(socket_remote.BindNewPipeAndPassReceiver()); @@ -400,12 +399,11 @@ TEST_F(UDPSocketTest, TestReceiveMoreOverflow) { // Create a server socket to listen for incoming datagrams. test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr listener_interface_ptr; - listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); mojo::Remote<mojom::UDPSocket> server_socket; - UDPSocket impl(std::move(listener_interface_ptr), nullptr /*net_log*/); + UDPSocket impl(listener_receiver.BindNewPipeAndPassRemote(), + nullptr /*net_log*/); mojo::Receiver<mojom::UDPSocket> receiver(&impl); receiver.Bind(server_socket.BindNewPipeAndPassReceiver()); @@ -424,13 +422,11 @@ TEST_F(UDPSocketTest, TestReadSend) { // Create a server socket to listen for incoming datagrams. test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr listener_interface_ptr; - listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); mojo::Remote<mojom::UDPSocket> server_socket; factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(), - std::move(listener_interface_ptr)); + listener_receiver.BindNewPipeAndPassRemote()); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -439,7 +435,7 @@ // Create a client socket to send datagrams. mojo::Remote<mojom::UDPSocket> client_socket; factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -495,7 +491,7 @@ // Create a server socket to send data. mojo::Remote<mojom::UDPSocket> server_socket; factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -503,13 +499,11 @@ // Create a client socket to send datagrams. test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr client_listener_ptr; - listener_binding.Bind(mojo::MakeRequest(&client_listener_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); mojo::Remote<mojom::UDPSocket> client_socket; factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(), - std::move(client_listener_ptr)); + listener_receiver.BindNewPipeAndPassRemote()); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -561,13 +555,11 @@ TEST_F(UDPSocketTest, TestReceiveMoreWithBufferSize) { // Create a server socket to listen for incoming datagrams. test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr listener_interface_ptr; - listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); mojo::Remote<mojom::UDPSocket> server_socket; factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(), - std::move(listener_interface_ptr)); + listener_receiver.BindNewPipeAndPassRemote()); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -576,7 +568,7 @@ // Create a client socket to send datagrams. mojo::Remote<mojom::UDPSocket> client_socket; factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint client_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper client_helper(&client_socket); ASSERT_EQ(net::OK, @@ -613,7 +605,7 @@ TEST_F(UDPSocketTest, TestSendToInvalidAddress) { mojo::Remote<mojom::UDPSocket> server_socket; factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); test::UDPSocketTestHelper helper(&server_socket); @@ -640,12 +632,11 @@ // 0 byte payload. TEST_F(UDPSocketTest, TestReadZeroByte) { test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - mojom::UDPSocketListenerPtr listener_interface_ptr; - listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); mojo::Remote<mojom::UDPSocket> socket_remote; - UDPSocket impl(std::move(listener_interface_ptr), nullptr /*net_log*/); + UDPSocket impl(listener_receiver.BindNewPipeAndPassRemote(), + nullptr /*net_log*/); mojo::Receiver<mojom::UDPSocket> receiver(&impl); receiver.Bind(socket_remote.BindNewPipeAndPassReceiver()); @@ -680,12 +671,10 @@ net::IPAddress group_ip; EXPECT_TRUE(group_ip.AssignFromIPLiteral(kGroup)); mojo::Remote<mojom::UDPSocket> socket_remote; - mojom::UDPSocketListenerPtr listener_ptr; test::UDPSocketListenerImpl listener; - mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener); - listener_binding.Bind(mojo::MakeRequest(&listener_ptr)); + mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener); factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(), - std::move(listener_ptr)); + listener_receiver.BindNewPipeAndPassRemote()); test::UDPSocketTestHelper helper(&socket_remote); @@ -724,7 +713,7 @@ // Create a second socket to send a packet to multicast group. mojo::Remote<mojom::UDPSocket> second_socket_remote; factory()->CreateUDPSocket(second_socket_remote.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); test::UDPSocketTestHelper second_socket_helper(&second_socket_remote); net::IPEndPoint second_socket_address(bind_ip_address, 0); ASSERT_EQ(net::OK, @@ -757,7 +746,7 @@ TEST_F(UDPSocketTest, ErrorHappensDuringSocketOptionsConfiguration) { mojo::Remote<mojom::UDPSocket> server_socket_remote; factory()->CreateUDPSocket(server_socket_remote.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); test::UDPSocketTestHelper server_helper(&server_socket_remote); net::IPEndPoint server_addr(GetLocalHostWithAnyPort()); ASSERT_EQ(net::OK, @@ -765,7 +754,7 @@ mojo::Remote<mojom::UDPSocket> socket_remote; factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(), - nullptr); + mojo::NullRemote()); test::UDPSocketTestHelper helper(&socket_remote); // Invalid options.
diff --git a/services/test/user_id/user_id_service.cc b/services/test/user_id/user_id_service.cc index a07d7aba..0f564430 100644 --- a/services/test/user_id/user_id_service.cc +++ b/services/test/user_id/user_id_service.cc
@@ -9,8 +9,8 @@ UserIdService::UserIdService(service_manager::mojom::ServiceRequest request) : service_binding_(this, std::move(request)) { - registry_.AddInterface<mojom::UserId>( - base::Bind(&UserIdService::BindUserIdRequest, base::Unretained(this))); + registry_.AddInterface<mojom::UserId>(base::BindRepeating( + &UserIdService::BindUserIdRequest, base::Unretained(this))); } UserIdService::~UserIdService() = default;
diff --git a/services/tracing/public/cpp/traced_process.cc b/services/tracing/public/cpp/traced_process.cc index 56b9f602..b94f322 100644 --- a/services/tracing/public/cpp/traced_process.cc +++ b/services/tracing/public/cpp/traced_process.cc
@@ -16,10 +16,10 @@ // static void TracedProcess::OnTracedProcessRequest( - mojom::TracedProcessRequest request) { + mojo::PendingReceiver<mojom::TracedProcess> receiver) { #if !defined(OS_NACL) && !defined(OS_IOS) tracing::TracedProcessImpl::GetInstance()->OnTracedProcessRequest( - std::move(request)); + std::move(receiver)); #endif }
diff --git a/services/tracing/public/cpp/traced_process.h b/services/tracing/public/cpp/traced_process.h index 94f586b..25146d4 100644 --- a/services/tracing/public/cpp/traced_process.h +++ b/services/tracing/public/cpp/traced_process.h
@@ -11,7 +11,8 @@ class TracedProcess { public: - static void OnTracedProcessRequest(mojom::TracedProcessRequest request); + static void OnTracedProcessRequest( + mojo::PendingReceiver<mojom::TracedProcess> receiver); }; } // namespace tracing
diff --git a/services/tracing/public/cpp/traced_process_impl.cc b/services/tracing/public/cpp/traced_process_impl.cc index 707343e38..2d9734700 100644 --- a/services/tracing/public/cpp/traced_process_impl.cc +++ b/services/tracing/public/cpp/traced_process_impl.cc
@@ -22,7 +22,7 @@ return traced_process.get(); } -TracedProcessImpl::TracedProcessImpl() : binding_(this) { +TracedProcessImpl::TracedProcessImpl() { DETACH_FROM_SEQUENCE(sequence_checker_); } @@ -31,29 +31,29 @@ // OnTracedProcessRequest can be called concurrently from // multiple threads, as we get one call per service. void TracedProcessImpl::OnTracedProcessRequest( - mojom::TracedProcessRequest request) { + mojo::PendingReceiver<mojom::TracedProcess> receiver) { if (task_runner_ && !task_runner_->RunsTasksInCurrentSequence()) { task_runner_->PostTask( FROM_HERE, base::BindOnce(&TracedProcessImpl::OnTracedProcessRequest, - base::Unretained(this), std::move(request))); + base::Unretained(this), std::move(receiver))); return; } // We only need one binding per process. base::AutoLock lock(lock_); - if (binding_.is_bound()) { + if (receiver_.is_bound()) { return; } DETACH_FROM_SEQUENCE(sequence_checker_); - binding_.Bind(std::move(request)); + receiver_.Bind(std::move(receiver)); } // SetTaskRunner must be called before we start receiving // any OnTracedProcessRequest calls. void TracedProcessImpl::SetTaskRunner( scoped_refptr<base::SequencedTaskRunner> task_runner) { - DCHECK(!binding_.is_bound()); + DCHECK(!receiver_.is_bound()); DCHECK(!task_runner_); task_runner_ = task_runner; } @@ -100,7 +100,7 @@ // again. base::AutoLock lock(traced_process->lock_); traced_process->agent_registry_.reset(); - traced_process->binding_.Close(); + traced_process->receiver_.reset(); }, base::Unretained(this)));
diff --git a/services/tracing/public/cpp/traced_process_impl.h b/services/tracing/public/cpp/traced_process_impl.h index 946d3b87..da7e382 100644 --- a/services/tracing/public/cpp/traced_process_impl.h +++ b/services/tracing/public/cpp/traced_process_impl.h
@@ -29,7 +29,8 @@ public: static TracedProcessImpl* GetInstance(); - void OnTracedProcessRequest(mojom::TracedProcessRequest request); + void OnTracedProcessRequest( + mojo::PendingReceiver<mojom::TracedProcess> receiver); // Set which taskrunner to bind any incoming requests on. void SetTaskRunner(scoped_refptr<base::SequencedTaskRunner> task_runner); @@ -54,7 +55,7 @@ base::Lock lock_; std::set<BaseAgent*> agents_; mojo::Remote<tracing::mojom::AgentRegistry> agent_registry_; - mojo::Binding<tracing::mojom::TracedProcess> binding_; + mojo::Receiver<tracing::mojom::TracedProcess> receiver_{this}; scoped_refptr<base::SequencedTaskRunner> task_runner_; SEQUENCE_CHECKER(sequence_checker_);
diff --git a/storage/browser/test/mock_blob_util.h b/storage/browser/test/mock_blob_util.h index a985ec22..8c3adb7c 100644 --- a/storage/browser/test/mock_blob_util.h +++ b/storage/browser/test/mock_blob_util.h
@@ -5,6 +5,7 @@ #ifndef STORAGE_BROWSER_TEST_MOCK_BLOB_UTIL_H_ #define STORAGE_BROWSER_TEST_MOCK_BLOB_UTIL_H_ +#include <memory> #include <string> #include "base/macros.h"
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index cca2d337..873d84b7 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2623,6 +2623,23 @@ ] } ], + "ForceDiceMigration": [ + { + "platforms": [ + "windows", + "mac", + "linux" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ForceDiceMigration" + ] + } + ] + } + ], "FreezeBackgroundTabOnNetworkIdle": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index f323616..6e5d810 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -400,7 +400,7 @@ base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kHtmlImportsRequestInitiatorLock{ - "HtmlImportsRequestInitiatorLock", base::FEATURE_ENABLED_BY_DEFAULT}; + "HtmlImportsRequestInitiatorLock", base::FEATURE_DISABLED_BY_DEFAULT}; } // namespace features } // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index be39a00..78e31941 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -1581,8 +1581,8 @@ *element); continue; } - DCHECK(!element->NeedsStyleRecalc()); - DCHECK(!element->ChildNeedsStyleRecalc()); + DCHECK(!element->NeedsStyleRecalc()); + DCHECK(!element->ChildNeedsStyleRecalc()); if (Node* first_child = LayoutTreeBuilderTraversal::FirstChild(*element)) first_child->MarkAncestorsWithChildNeedsReattachLayoutTree(); }
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index 318d3f97..1f4f17e 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -69,6 +69,10 @@ DocumentLifecycle::LifecycleUpdateReason::kTest); } + Node* GetStyleRecalcRoot() { + return GetStyleEngine().style_recalc_root_.GetRootNode(); + } + private: std::unique_ptr<DummyPageHolder> dummy_page_holder_; }; @@ -2256,4 +2260,21 @@ EXPECT_TRUE(GetStyleEngine().NeedsLayoutTreeRebuild()); } +TEST_F(StyleEngineTest, ForceReattachLayoutTreeStyleRecalcRoot) { + GetDocument().body()->SetInnerHTMLFromString(R"HTML( + <div id="outer"> + <div id="inner"></div> + </div> + )HTML"); + UpdateAllLifecyclePhases(); + + Element* outer = GetDocument().getElementById("outer"); + Element* inner = GetDocument().getElementById("inner"); + + outer->SetForceReattachLayoutTree(); + inner->SetInlineStyleProperty(CSSPropertyID::kColor, "blue"); + + EXPECT_EQ(outer, GetStyleRecalcRoot()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_recalc_root.cc b/third_party/blink/renderer/core/css/style_recalc_root.cc index 69d8004a..c94c76e 100644 --- a/third_party/blink/renderer/core/css/style_recalc_root.cc +++ b/third_party/blink/renderer/core/css/style_recalc_root.cc
@@ -45,7 +45,7 @@ #endif // DCHECK_IS_ON() bool StyleRecalcRoot::IsDirty(const Node& node) const { - return node.NeedsStyleRecalc(); + return node.IsDirtyForStyleRecalc(); } void StyleRecalcRoot::ClearChildDirtyForAncestors(ContainerNode& parent) const {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 431079a..f8ddaaf8 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2944,8 +2944,9 @@ } } else if (auto* slot = ToHTMLSlotElementIfSupportsAssignmentOrNull(this)) { slot->RecalcStyleForSlotChildren(child_change); - } else if (auto* insertion_point = DynamicTo<V0InsertionPoint>(this)) { - insertion_point->RecalcStyleForInsertionPointChildren(child_change); + } else if (IsActiveV0InsertionPoint(*this)) { + To<V0InsertionPoint>(this)->RecalcStyleForInsertionPointChildren( + child_change); } else { RecalcDescendantStyles(child_change); }
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc index 4b4d6a6..0f60dfa 100644 --- a/third_party/blink/renderer/core/dom/node.cc +++ b/third_party/blink/renderer/core/dom/node.cc
@@ -1209,13 +1209,13 @@ void Node::MarkAncestorsWithChildNeedsStyleRecalc() { ContainerNode* ancestor = GetStyleRecalcParent(); - bool parent_dirty = ancestor && ancestor->NeedsStyleRecalc(); + bool parent_dirty = ancestor && ancestor->IsDirtyForStyleRecalc(); for (; ancestor && !ancestor->ChildNeedsStyleRecalc(); ancestor = ancestor->GetStyleRecalcParent()) { if (!ancestor->isConnected()) return; ancestor->SetChildNeedsStyleRecalc(); - if (ancestor->NeedsStyleRecalc()) + if (ancestor->IsDirtyForStyleRecalc()) break; // If we reach a locked ancestor, we should abort since the ancestor marking // will be done when the lock is committed.
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h index 7493a2f..3772c430 100644 --- a/third_party/blink/renderer/core/dom/node.h +++ b/third_party/blink/renderer/core/dom/node.h
@@ -497,6 +497,10 @@ return GetFlag(kForceReattachLayoutTree); } + bool IsDirtyForStyleRecalc() const { + return NeedsStyleRecalc() || GetForceReattachLayoutTree(); + } + bool NeedsDistributionRecalc() const; bool ChildNeedsDistributionRecalc() const {
diff --git a/third_party/blink/renderer/core/events/touch_event_test.cc b/third_party/blink/renderer/core/events/touch_event_test.cc index 71d5b0ee2..ef62cd7 100644 --- a/third_party/blink/renderer/core/events/touch_event_test.cc +++ b/third_party/blink/renderer/core/events/touch_event_test.cc
@@ -7,6 +7,7 @@ #include "base/time/time.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/renderer/core/frame/frame_console.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/loader/empty_clients.h"
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css index a47d3db7..1ba883d 100644 --- a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css +++ b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
@@ -253,6 +253,7 @@ .month-button.selected, .week-number-cell.selected { background-color: Highlight; + color: Window; } .day-cell.highlighted.today, @@ -260,6 +261,7 @@ .month-button.today { background-color: Highlight; border: 2px solid Window !important; + color: Window; } .day-cell.selected.today,
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index dcf0685f..4f68e18c 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2054,6 +2054,7 @@ overlay_scrollbar_clip_behavior); rect.size.height -= scrollable_area->HorizontalScrollbarHeight( overlay_scrollbar_clip_behavior); + rect.size.ClampNegativeToZero(); } }
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc index a5d5157..d75037a4 100644 --- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc +++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/loader/loader_factory_for_frame.h" #include "base/single_thread_task_runner.h" +#include "services/network/public/mojom/url_loader_factory.mojom-blink.h" #include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" #include "third_party/blink/public/platform/platform.h"
diff --git a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc index 65a616b..088efc2 100644 --- a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc +++ b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink.h" #include "services/network/public/mojom/referrer_policy.mojom-blink.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
diff --git a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc index d65e705..483df84 100644 --- a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc +++ b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
@@ -7,6 +7,7 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" +#include "services/network/public/mojom/url_loader_factory.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h"
diff --git a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h index 88df341..a0fb7fc6 100644 --- a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h +++ b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_PREFETCHED_SIGNED_EXCHANGE_MANAGER_H_ #include "base/macros.h" -#include "services/network/public/mojom/url_loader_factory.mojom-blink.h" +#include "services/network/public/mojom/url_loader_factory.mojom-blink-forward.h" #include "third_party/blink/public/web/web_navigation_params.h" #include "third_party/blink/renderer/core/loader/preload_helper.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
diff --git a/third_party/blink/renderer/core/loader/worker_fetch_context.h b/third_party/blink/renderer/core/loader/worker_fetch_context.h index b71d3919b..2b19280 100644 --- a/third_party/blink/renderer/core/loader/worker_fetch_context.h +++ b/third_party/blink/renderer/core/loader/worker_fetch_context.h
@@ -7,8 +7,8 @@ #include <memory> #include "base/single_thread_task_runner.h" -#include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h" -#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-blink.h" +#include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/loader/base_fetch_context.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h index a0b1cf8..aff7c9a 100644 --- a/third_party/blink/renderer/core/page/chrome_client.h +++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -32,7 +32,7 @@ #include "cc/trees/paint_holding_commit_trigger.h" #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h" #include "third_party/blink/public/common/feature_policy/feature_policy.h" -#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" +#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h" #include "third_party/blink/public/platform/blame_context.h" #include "third_party/blink/public/platform/web_drag_operation.h" #include "third_party/blink/public/platform/web_focus_type.h"
diff --git a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h index 4587ec3..69f964c 100644 --- a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h +++ b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_FETCH_CLIENT_SETTINGS_OBJECT_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_FETCH_CLIENT_SETTINGS_OBJECT_IMPL_H_ -#include "services/network/public/mojom/referrer_policy.mojom-blink.h" +#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/member.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h"
diff --git a/third_party/blink/renderer/core/script/import_map.cc b/third_party/blink/renderer/core/script/import_map.cc index 8183804..5788ae64 100644 --- a/third_party/blink/renderer/core/script/import_map.cc +++ b/third_party/blink/renderer/core/script/import_map.cc
@@ -18,6 +18,19 @@ #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" +// We implement two variants of specs: +// - When |support_builtin_modules| is false, import maps without built-in +// module & fallback supports are implemented. +// This follows the ToT spec https://wicg.github.io/import-maps/, which is +// marked by <spec> tags. +// - When |support_builtin_modules| is true, import maps with built-in module & +// fallback supports are implemented. +// This basically follows the spec before +// https://github.com/WICG/import-maps/pull/176, which is marked as +// [Spec w/ Built-in]. +// This is needed for the fallback mechanism for built-in modules, which was +// temporarily removed from the spec but is still implemented behind the flag. + namespace blink { namespace { @@ -76,7 +89,7 @@ } } -// Step 3.3 of +// Step 2.4-2.7 of // <specdef // href="https://wicg.github.io/import-maps/#sort-and-normalize-a-specifier-map"> KURL NormalizeValue(const String& key, @@ -84,19 +97,19 @@ const KURL& base_url, bool support_builtin_modules, ConsoleLogger& logger) { - // <spec step="3.3.2">Let addressURL be the result of parsing a URL-like - // import specifier given potentialAddress and baseURL.</spec> + // <spec step="2.4">Let addressURL be the result of parsing a URL-like import + // specifier given value and baseURL.</spec> ParsedSpecifier value = ParsedSpecifier::Create(value_string, base_url, support_builtin_modules); switch (value.GetType()) { case ParsedSpecifier::Type::kInvalid: - // <spec step="3.3.3">If addressURL is null, then:</spec> + // <spec step="2.5">If addressURL is null, then:</spec> // - // <spec step="3.3.3.1">Report a warning to the console that the address - // was invalid.</spec> + // <spec step="2.5.1">Report a warning to the console that the address was + // invalid.</spec> AddIgnoredValueMessage(logger, key, "Invalid URL: " + value_string); - // <spec step="3.3.1.2">Continue.</spec> + // <spec step="2.5.2">Continue.</spec> return NullURL(); case ParsedSpecifier::Type::kBare: @@ -104,10 +117,10 @@ return NullURL(); case ParsedSpecifier::Type::kURL: - // <spec step="3.3.4">If specifierKey ends with U+002F (/), and the + // <spec step="2.6">If specifierKey ends with U+002F (/), and the // serialization of addressURL does not end with U+002F (/), then:</spec> if (key.EndsWith("/") && !value.GetUrl().GetString().EndsWith("/")) { - // <spec step="3.3.4.1">Report a warning to the console that an invalid + // <spec step="2.6.1">Report a warning to the console that an invalid // address was given for the specifier key specifierKey; since // specifierKey ended in a slash, so must the address.</spec> AddIgnoredValueMessage( @@ -115,12 +128,10 @@ "Since specifierKey ended in a slash, so must the address: " + value_string); - // <spec step="3.3.4.2">Continue.</spec> + // <spec step="2.6.2">Continue.</spec> return NullURL(); } - // <spec step="3.3.5">Append addressURL to - // validNormalizedAddresses.</spec> return value.GetUrl(); } } @@ -201,22 +212,24 @@ // <spec step="6.2">Set sortedAndNormalizedScopes to the result of sorting // and normalizing scopes given parsed["scopes"] and baseURL.</spec> - // <specdef + // <specdef label="sort-and-normalize-scopes" // href="https://wicg.github.io/import-maps/#sort-and-normalize-scopes"> - // <spec step="1">Let normalized be an empty map.</spec> + // <spec label="sort-and-normalize-scopes" step="1">Let normalized be an + // empty map.</spec> ScopeType normalized; - // <spec step="2">For each scopePrefix -> potentialSpecifierMap of - // originalMap,</spec> + // <spec label="sort-and-normalize-scopes" step="2">For each scopePrefix → + // potentialSpecifierMap of originalMap,</spec> for (wtf_size_t i = 0; i < scopes->size(); ++i) { const JSONObject::Entry& entry = scopes->at(i); JSONObject* specifier_map = scopes->GetJSONObject(entry.first); if (!specifier_map) { - // <spec step="2.1">If potentialSpecifierMap is not a map, then throw a - // TypeError indicating that the value of the scope with prefix - // scopePrefix must be a JSON object.</spec> + // <spec label="sort-and-normalize-scopes" step="2.1">If + // potentialSpecifierMap is not a map, then throw a TypeError indicating + // that the value of the scope with prefix scopePrefix must be a JSON + // object.</spec> *error_to_rethrow = modulator.CreateTypeError( "Failed to parse import map: the value of the scope with prefix " "\"" + @@ -224,37 +237,40 @@ return MakeGarbageCollected<ImportMap>(); } - // <spec step="2.2">Let scopePrefixURL be the result of parsing - // scopePrefix with baseURL as the base URL.</spec> + // <spec label="sort-and-normalize-scopes" step="2.2">Let scopePrefixURL + // be the result of parsing scopePrefix with baseURL as the base + // URL.</spec> const KURL prefix_url(base_url, entry.first); - // <spec step="2.3">If scopePrefixURL is failure, then:</spec> + // <spec label="sort-and-normalize-scopes" step="2.3">If scopePrefixURL is + // failure, then:</spec> if (!prefix_url.IsValid()) { - // <spec step="2.3.1">Report a warning to the console that the scope - // prefix URL was not parseable.</spec> + // <spec label="sort-and-normalize-scopes" step="2.3.1">Report a warning + // to the console that the scope prefix URL was not parseable.</spec> logger.AddConsoleMessage( mojom::ConsoleMessageSource::kOther, mojom::ConsoleMessageLevel::kWarning, "Ignored scope \"" + entry.first + "\": not parsable as a URL."); - // <spec step="2.3.2">Continue.</spec> + // <spec label="sort-and-normalize-scopes" step="2.3.2">Continue.</spec> continue; } - // <spec step="2.5">Let normalizedScopePrefix be the serialization of - // scopePrefixURL.</spec> + // <spec label="sort-and-normalize-scopes" step="2.5">Let + // normalizedScopePrefix be the serialization of scopePrefixURL.</spec> // - // <spec step="2.6">Set normalized[normalizedScopePrefix] to the result of - // sorting and normalizing a specifier map given potentialSpecifierMap and + // <spec label="sort-and-normalize-scopes" step="2.6">Set + // normalized[normalizedScopePrefix] to the result of sorting and + // normalizing a specifier map given potentialSpecifierMap and // baseURL.</spec> sorted_and_normalized_scopes.push_back(std::make_pair( prefix_url.GetString(), SortAndNormalizeSpecifierMap(specifier_map, base_url, support_builtin_modules, logger))); } - // <spec step="3">Return the result of sorting normalized, with an entry a - // being less than an entry b if b's key is code unit less than a's - // key.</spec> + // <spec label="sort-and-normalize-scopes" step="3">Return the result of + // sorting normalized, with an entry a being less than an entry b if a’s key + // is longer or code unit less than b’s key.</spec> std::sort(sorted_and_normalized_scopes.begin(), sorted_and_normalized_scopes.end(), [](const ScopeEntryType& a, const ScopeEntryType& b) { @@ -283,8 +299,7 @@ // <spec step="1">Let normalized be an empty map.</spec> SpecifierMap normalized; - // <spec step="2">First, normalize all entries so that their values are lists. - // For each specifierKey → value of originalMap,</spec> + // <spec step="2">For each specifierKey → value of originalMap,</spec> for (wtf_size_t i = 0; i < imports->size(); ++i) { const JSONObject::Entry& entry = imports->at(i); @@ -300,25 +315,28 @@ Vector<KURL> values; switch (entry.second->GetType()) { case JSONValue::ValueType::kTypeNull: - // <spec step="2.4">Otherwise, if value is null, then set - // normalized[normalizedSpecifierKey] to a new empty list.</spec> + // [Spec w/ Built-in] Otherwise, if value is null, then set + // normalized[normalizedSpecifierKey] to a new empty list. break; case JSONValue::ValueType::kTypeBoolean: case JSONValue::ValueType::kTypeInteger: case JSONValue::ValueType::kTypeDouble: case JSONValue::ValueType::kTypeObject: - // <spec step="2.6">Otherwise, report a warning to the console that - // addresses must be strings, arrays, or null.</spec> + // <spec step="2.3">If value is not a string, then:</spec> + // + // <spec step="2.3.1">Report a warning to the console that addresses + // must be strings.</spec> AddIgnoredValueMessage(logger, entry.first, "Invalid value type."); + // <spec step="2.3.2">Continue.</spec> + // // By continuing here, we leave |normalized[normalized_specifier_key]| // unset, and continue processing. continue; case JSONValue::ValueType::kTypeString: { - // <spec step="2.3">If value is a string, then set - // normalized[normalizedSpecifierKey] to «value».</spec> + // Steps 2.4-2.6 are implemented in NormalizeValue(). String value_string; if (!imports->GetString(entry.first, &value_string)) { AddIgnoredValueMessage(logger, entry.first, @@ -328,16 +346,15 @@ KURL value = NormalizeValue(entry.first, value_string, base_url, support_builtin_modules, logger); - // <spec step="3.3.5">Append addressURL to - // validNormalizedAddresses.</spec> + // <spec step="2.7">Set normalized[specifierKey] to addressURL.</spec> if (value.IsValid()) values.push_back(value); break; } case JSONValue::ValueType::kTypeArray: { - // <spec step="2.5">Otherwise, if value is a list, then set - // normalized[normalizedSpecifierKey] to value.</spec> + // [Spec w/ Built-in] Otherwise, if value is a list, then set + // normalized[normalizedSpecifierKey] to value. JSONArray* array = imports->GetArray(entry.first); if (!array) { AddIgnoredValueMessage(logger, entry.first, @@ -345,25 +362,21 @@ break; } - // <spec step="3.3">For each potentialAddress of - // potentialAddresses,</spec> + // <spec step="2">For each specifierKey → value of ...</spec> for (wtf_size_t j = 0; j < array->size(); ++j) { - // <spec step="3.3.1">If potentialAddress is not a string, - // then:</spec> + // <spec step="2.3">If value is not a string, then:</spec> String value_string; if (!array->at(j)->AsString(&value_string)) { - // <spec step="3.3.1.1">Report a warning to the console that the - // contents of address arrays must be strings.</spec> + // <spec step="2.3.1">Report a warning to the console that addresses + // must be strings.</spec> AddIgnoredValueMessage(logger, entry.first, "Non-string in the value."); - // <spec step="3.3.1.2">Continue.</spec> + // <spec step="2.3.2">Continue.</spec> continue; } KURL value = NormalizeValue(entry.first, value_string, base_url, support_builtin_modules, logger); - // <spec step="3.3.5">Append addressURL to - // validNormalizedAddresses.</spec> if (value.IsValid()) values.push_back(value); } @@ -390,8 +403,7 @@ } } - // <spec step="3.4">Set normalized[specifierKey] to - // validNormalizedAddresses.</spec> + // <spec step="2.7">Set normalized[specifierKey] to addressURL.</spec> normalized.Set(normalized_specifier_key, values); } @@ -420,7 +432,7 @@ // https://github.com/WICG/import-maps/issues/102 base::Optional<MatchResult> best_match; - // <spec step="1">For each specifierKey → addresses of specifierMap,</spec> + // <spec step="1">For each specifierKey → address of specifierMap,</spec> for (auto it = specifier_map.begin(); it != specifier_map.end(); ++it) { // <spec step="1.2">If specifierKey ends with U+002F (/) and // normalizedSpecifier starts with specifierKey, then:</spec> @@ -461,7 +473,7 @@ String* debug_message) const { DCHECK(debug_message); - // <spec step="8">For each scopePrefix -> scopeImports of importMap's + // <spec step="8">For each scopePrefix → scopeImports of importMap’s // scopes,</spec> for (const auto& entry : scopes_) { // <spec step="8.1">If scopePrefix is baseURLString, or if scopePrefix ends @@ -497,7 +509,7 @@ DCHECK(debug_message); const String key = parsed_specifier.GetImportMapKeyString(); - // <spec step="1.1">If specifierKey is normalizedSpecifier, then:</spec> + // <spec step="1.1">If specifierKey is normalizedSpecifier, then ...</spec> MatchResult exact = specifier_map.find(key); if (exact != specifier_map.end()) { return ResolveImportsMatchInternal(key, exact, debug_message); @@ -519,36 +531,23 @@ const String& key, const MatchResult& matched, String* debug_message) const { - // <spec step="1.2.2.1">Let afterPrefix be the portion of normalizedSpecifier - // after the initial specifierKey prefix.</spec> - // - // <spec step="1.2.3.1">Let afterPrefix be the portion of normalizedSpecifier + // <spec step="1.2.1">Let afterPrefix be the portion of normalizedSpecifier // after the initial specifierKey prefix.</spec> const String after_prefix = key.Substring(matched->key.length()); - // <spec step="1.1.3">If addresses’s size is 2, and addresses[0]'s scheme is - // "std", and addresses[1]'s scheme is not "std", then:</spec> - // - // <spec step="1.2.3">If addresses’s size is 2, and addresses[0]'s scheme is - // "std", and addresses[1]'s scheme is not "std", then:</spec> - // - // TODO(hiroshige): Add these checks here. Currently they are checked at - // parsing. - for (const KURL& value : matched->value) { - // <spec step="1.2.2.3">Let url be the result of parsing the concatenation - // of the serialization of addresses[0] with afterPrefix.</spec> + // <spec step="1.1">If specifierKey is normalizedSpecifier, then return + // address.</spec> // - // <spec step="1.2.3.3">Let url0 be the result of parsing the concatenation - // of the serialization of addresses[0] with afterPrefix; similarly, let - // url1 be the result of parsing the concatenation of the serialization of - // addresses[1] with afterPrefix.</spec> + // <spec step="1.2">If specifierKey ends with U+002F (/) and + // normalizedSpecifier starts with specifierKey, then:</spec> // - // TODO(hiroshige): Update this according to the spec. + // <spec step="1.2.3">Let url be the result of parsing afterPrefix relative + // to the base URL address.</spec> const KURL url = after_prefix.IsEmpty() ? value : KURL(value, after_prefix); - // <spec step="1.2.3.5">Return url0, if moduleMap[url0] exists; otherwise, - // return url1.</spec> + // [Spec w/ Built-in] Return url0, if moduleMap[url0] exists; otherwise, + // return url1. // // Note: Here we filter out non-existing built-in modules in all cases. if (!support_builtin_modules_ || @@ -557,12 +556,16 @@ *debug_message = "Import Map: \"" + key + "\" matches with \"" + matched->key + "\" and is mapped to " + url.ElidedString(); + + // <spec step="1.2.4">If url is failure, then return null.</spec> + // + // <spec step="1.2.5">Return url.</spec> return url; } } - // <spec step="1.1.1">If addresses’s size is 0, then throw a TypeError - // indicating that normalizedSpecifier was mapped to no addresses.</spec> + // [Spec w/ Built-in] If addresses’s size is 0, then throw a TypeError + // indicating that normalizedSpecifier was mapped to no addresses. *debug_message = "Import Map: \"" + key + "\" matches with \"" + matched->key + "\" but fails to be mapped (no viable URLs)"; return NullURL();
diff --git a/third_party/blink/renderer/core/script/modulator.h b/third_party/blink/renderer/core/script/modulator.h index 04d5c75..39b6255 100644 --- a/third_party/blink/renderer/core/script/modulator.h +++ b/third_party/blink/renderer/core/script/modulator.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_MODULATOR_H_ #include "base/single_thread_task_runner.h" -#include "services/network/public/mojom/referrer_policy.mojom-blink.h" +#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/bindings/core/v8/module_record.h" #include "third_party/blink/renderer/bindings/core/v8/sanitize_script_errors.h"
diff --git a/third_party/blink/renderer/core/script/pending_script.h b/third_party/blink/renderer/core/script/pending_script.h index 2b58285..8ba0a5d 100644 --- a/third_party/blink/renderer/core/script/pending_script.h +++ b/third_party/blink/renderer/core/script/pending_script.h
@@ -27,7 +27,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_PENDING_SCRIPT_H_ #include "base/macros.h" -#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" +#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h" #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/script/script.h"
diff --git a/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs b/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs index 2d520284..b9a67e4 100644 --- a/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs +++ b/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs
@@ -320,18 +320,8 @@ */ #unlock = element => { - if (element.style.contentSize === undefined) { - // TODO(crbug.com/1001293) delete the old code-path. - element.displayLock.commit().catch(reason => { - // Only warn if the unlocked failed and we should be revealed. - if (this.#revealed.has(element)) { - this.#logLockingError('Commit', reason, element); - } - }); - } else { - element.removeAttribute('rendersubtree'); - element.style.contentSize = ''; - } + element.removeAttribute('rendersubtree'); + element.style.contentSize = ''; } /** @@ -343,24 +333,8 @@ element => { this.#revealed.delete(element); const size = this.#sizeManager.getHopefulSize(element); - if (element.style.contentSize === undefined) { - // TODO(crbug.com/1001293) delete the old code-path. - element.displayLock - .acquire({ - timeout: Infinity, - activatable: true, - size: [LOCKED_WIDTH_PX, size], - }) - .catch(reason => { - // Only warn if the lock failed and we should be locked. - if (!this.#revealed.has(element)) { - this.#logLockingError('Acquire', reason, element); - } - }); - } else { - element.setAttribute('rendersubtree', 'invisible activatable'); - element.style.contentSize = `${LOCKED_WIDTH_PX}px ${size}px`; - } + element.setAttribute('rendersubtree', 'invisible activatable'); + element.style.contentSize = `${LOCKED_WIDTH_PX}px ${size}px`; } /**
diff --git a/third_party/blink/renderer/core/script/script_loader.h b/third_party/blink/renderer/core/script/script_loader.h index c0cbbaf9..22b6838 100644 --- a/third_party/blink/renderer/core/script/script_loader.h +++ b/third_party/blink/renderer/core/script/script_loader.h
@@ -21,7 +21,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_SCRIPT_LOADER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_SCRIPT_LOADER_H_ -#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" +#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/bindings/core/v8/script_source_location_type.h" #include "third_party/blink/renderer/core/core_export.h"
diff --git a/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h index 6e0d088..f00a018a 100644 --- a/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h +++ b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h
@@ -9,7 +9,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" -#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom-blink.h" #include "third_party/blink/renderer/core/testing/test_document_interface_broker.h"
diff --git a/third_party/blink/renderer/core/workers/abstract_worker.h b/third_party/blink/renderer/core/workers/abstract_worker.h index 7b21022..aa6cd7d 100644 --- a/third_party/blink/renderer/core/workers/abstract_worker.h +++ b/third_party/blink/renderer/core/workers/abstract_worker.h
@@ -31,7 +31,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_ABSTRACT_WORKER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_ABSTRACT_WORKER_H_ -#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" +#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_listener.h" #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc index 73c8c4b..b0d498d 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -12,6 +12,7 @@ #include "services/service_manager/public/mojom/interface_provider.mojom-blink.h" #include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h" #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom-blink.h" #include "third_party/blink/public/platform/web_content_settings_client.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.h b/third_party/blink/renderer/core/workers/dedicated_worker.h index 72d5bbc..a3291d7dec 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker.h +++ b/third_party/blink/renderer/core/workers/dedicated_worker.h
@@ -7,7 +7,7 @@ #include <memory> #include "base/memory/scoped_refptr.h" -#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h" +#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_dedicated_worker.h" #include "third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc index e662ef7a..8f2775e 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -280,9 +280,17 @@ // Step 12. "If the algorithm asynchronously completes with null, then:" if (classic_script_loader->Failed()) { // Step 12.1. "Queue a task to fire an event named error at worker." - // Step 12.2. "Run the environment discarding steps for inside settings." - // Step 12.3. "Return." + // DidFailToFetchClassicScript() will asynchronously fire the event. ReportingProxy().DidFailToFetchClassicScript(); + + // Step 12.2. "Run the environment discarding steps for inside settings." + // Do nothing because the HTML spec doesn't define these steps for web + // workers. + + // Schedule worker termination. + close(); + + // Step 12.3. "Return." return; } ReportingProxy().DidFetchScript();
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h index 0347fe0d..c43b26d5 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h +++ b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h
@@ -9,8 +9,8 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/optional.h" -#include "services/network/public/mojom/referrer_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/messaging/transferable_message.mojom-blink.h" +#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/messaging/transferable_message.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/messaging/message_port.h" #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
diff --git a/third_party/blink/renderer/core/workers/global_scope_creation_params.cc b/third_party/blink/renderer/core/workers/global_scope_creation_params.cc index 27cabe55..0ad228d9 100644 --- a/third_party/blink/renderer/core/workers/global_scope_creation_params.cc +++ b/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
@@ -8,6 +8,7 @@ #include "base/feature_list.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" #include "third_party/blink/renderer/platform/network/content_security_policy_parsers.h" namespace blink {
diff --git a/third_party/blink/renderer/core/workers/global_scope_creation_params.h b/third_party/blink/renderer/core/workers/global_scope_creation_params.h index b77a367..6b3e731 100644 --- a/third_party/blink/renderer/core/workers/global_scope_creation_params.h +++ b/third_party/blink/renderer/core/workers/global_scope_creation_params.h
@@ -9,12 +9,12 @@ #include "base/macros.h" #include "base/optional.h" #include "base/unguessable_token.h" -#include "services/network/public/mojom/ip_address_space.mojom-blink.h" -#include "services/network/public/mojom/referrer_policy.mojom-blink.h" -#include "services/service_manager/public/mojom/interface_provider.mojom-blink.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" +#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h" +#include "services/service_manager/public/mojom/interface_provider.mojom-blink-forward.h" #include "third_party/blink/public/common/feature_policy/feature_policy.h" -#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h" -#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" +#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_content_settings_client.h" #include "third_party/blink/public/platform/web_worker_fetch_context.h" #include "third_party/blink/renderer/bindings/core/v8/v8_cache_options.h"
diff --git a/third_party/blink/renderer/core/workers/installed_scripts_manager.cc b/third_party/blink/renderer/core/workers/installed_scripts_manager.cc index ecc4c90..3925620 100644 --- a/third_party/blink/renderer/core/workers/installed_scripts_manager.cc +++ b/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/workers/installed_scripts_manager.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h" #include "third_party/blink/renderer/platform/network/http_names.h"
diff --git a/third_party/blink/renderer/core/workers/installed_scripts_manager.h b/third_party/blink/renderer/core/workers/installed_scripts_manager.h index 7f21620..bdb32e3d 100644 --- a/third_party/blink/renderer/core/workers/installed_scripts_manager.h +++ b/third_party/blink/renderer/core/workers/installed_scripts_manager.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_INSTALLED_SCRIPTS_MANAGER_H_ #include "base/optional.h" -#include "services/network/public/mojom/ip_address_space.mojom-blink.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/network/content_security_policy_response_headers.h" #include "third_party/blink/renderer/platform/network/http_header_map.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker.cc b/third_party/blink/renderer/core/workers/shared_worker.cc index 55a4189..9b69f968 100644 --- a/third_party/blink/renderer/core/workers/shared_worker.cc +++ b/third_party/blink/renderer/core/workers/shared_worker.cc
@@ -33,6 +33,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/common/blob/blob_utils.h" +#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/public_url_manager.h" #include "third_party/blink/renderer/core/messaging/message_channel.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc index fea6b94..1214ae54 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc +++ b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
@@ -36,6 +36,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/common/messaging/message_port_channel.h" +#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h" #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom-blink.h" #include "third_party/blink/public/mojom/worker/shared_worker_info.mojom-blink.h" #include "third_party/blink/public/platform/web_content_security_policy.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_client_holder.h b/third_party/blink/renderer/core/workers/shared_worker_client_holder.h index 5153e2c..af9da612 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_client_holder.h +++ b/third_party/blink/renderer/core/workers/shared_worker_client_holder.h
@@ -38,8 +38,8 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/unique_receiver_set.h" -#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h" -#include "third_party/blink/public/mojom/worker/shared_worker_client.mojom-blink.h" +#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/worker/shared_worker_client.mojom-blink-forward.h" #include "third_party/blink/public/mojom/worker/shared_worker_connector.mojom-blink.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc index 5e67fd0a..05990b0 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc +++ b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc
@@ -6,6 +6,7 @@ #include <memory> #include <utility> +#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h" namespace blink {
diff --git a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h index 856298fd..4c343ab 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h +++ b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h
@@ -7,7 +7,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h" +#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_content_settings_client.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
diff --git a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h index ffa5aa4..a6136d72 100644 --- a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h +++ b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_THREADED_MESSAGING_PROXY_BASE_H_ #include "base/optional.h" -#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" +#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/web_feature_forward.h" #include "third_party/blink/renderer/core/workers/parent_execution_context_task_runners.h"
diff --git a/third_party/blink/renderer/core/workers/worker_classic_script_loader.h b/third_party/blink/renderer/core/workers/worker_classic_script_loader.h index 44b1c01e..7574f30 100644 --- a/third_party/blink/renderer/core/workers/worker_classic_script_loader.h +++ b/third_party/blink/renderer/core/workers/worker_classic_script_loader.h
@@ -31,7 +31,7 @@ #include <memory> #include "base/memory/scoped_refptr.h" #include "services/network/public/mojom/fetch_api.mojom-blink-forward.h" -#include "services/network/public/mojom/ip_address_space.mojom-blink.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/loader/threadable_loader.h"
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h index 22f96807..f11a137e 100644 --- a/third_party/blink/renderer/core/workers/worker_global_scope.h +++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -29,11 +29,11 @@ #include <memory> #include "services/network/public/mojom/fetch_api.mojom-blink-forward.h" -#include "services/network/public/mojom/ip_address_space.mojom-blink.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" #include "services/service_manager/public/cpp/interface_provider.h" -#include "services/service_manager/public/mojom/interface_provider.mojom-blink.h" +#include "services/service_manager/public/mojom/interface_provider.mojom-blink-forward.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" -#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h" +#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/frame_request_callback_collection.h"
diff --git a/third_party/blink/renderer/core/workers/worker_module_tree_client.cc b/third_party/blink/renderer/core/workers/worker_module_tree_client.cc index 09c770c..7bd745d 100644 --- a/third_party/blink/renderer/core/workers/worker_module_tree_client.cc +++ b/third_party/blink/renderer/core/workers/worker_module_tree_client.cc
@@ -26,10 +26,20 @@ blink::WorkerReportingProxy& worker_reporting_proxy = worker_global_scope->ReportingProxy(); + // Step 12. "If the algorithm asynchronously completes with null, then:" if (!module_script) { - // Step 12: "If the algorithm asynchronously completes with null, queue - // a task to fire an event named error at worker, and return." + // Step 12.1. "Queue a task to fire an event named error at worker." + // DidFailToFetchModuleScript() will asynchronously fire the event. worker_reporting_proxy.DidFailToFetchModuleScript(); + + // Step 12.2. "Run the environment discarding steps for inside settings." + // Do nothing because the HTML spec doesn't define these steps for web + // workers. + + // Schedule worker termination. + worker_global_scope->close(); + + // Step 12.3. "Return." return; } worker_reporting_proxy.DidFetchScript();
diff --git a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h index d40ede8..dfedeec0 100644 --- a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h +++ b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
@@ -32,7 +32,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_WORKER_REPORTING_PROXY_H_ #include <memory> -#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" +#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/web_feature_forward.h"
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h index cbb54419..e537c41 100644 --- a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h +++ b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/synchronization/waitable_event.h" -#include "services/network/public/mojom/ip_address_space.mojom-blink.h" +#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/bindings/core/v8/v8_cache_options.h"
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worklet_global_scope.cc index 5e09dc10..8076e3c 100644 --- a/third_party/blink/renderer/core/workers/worklet_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
@@ -228,13 +228,11 @@ // moduleURLRecord, moduleResponsesMap, credentialOptions, outsideSettings, // and insideSettings when it asynchronously completes." - Modulator* modulator = Modulator::From(ScriptController()->GetScriptState()); - // Step 3 to 5 are implemented in // WorkletModuleTreeClient::NotifyModuleTreeLoadFinished. - WorkletModuleTreeClient* client = - MakeGarbageCollected<WorkletModuleTreeClient>( - modulator, std::move(outside_settings_task_runner), pending_tasks); + auto* client = MakeGarbageCollected<WorkletModuleTreeClient>( + ScriptController()->GetScriptState(), + std::move(outside_settings_task_runner), pending_tasks); // TODO(nhiroki): Pass an appropriate destination defined in each worklet // spec (e.g., "paint worklet", "audio worklet") (https://crbug.com/843980,
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 7cda3b9..00c0eaf 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
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/workers/worklet_module_tree_client.h" #include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/core/script/module_script.h" #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h" #include "third_party/blink/renderer/core/workers/worklet_global_scope.h" @@ -14,10 +15,10 @@ namespace blink { WorkletModuleTreeClient::WorkletModuleTreeClient( - Modulator* modulator, + ScriptState* script_state, scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner, WorkletPendingTasks* pending_tasks) - : modulator_(modulator), + : script_state_(script_state), outside_settings_task_runner_(std::move(outside_settings_task_runner)), pending_tasks_(pending_tasks) {} @@ -29,45 +30,57 @@ // TODO(nhiroki): Call reporting proxy functions appropriately (e.g., // DidFailToFetchModuleScript(), WillEvaluateModuleScript()). - if (!module_script) { - // Step 3: "If script is null, then queue a task on outsideSettings's - // responsible event loop to run these steps:" - // The steps are implemented in WorkletPendingTasks::Abort(). - PostCrossThreadTask( - *outside_settings_task_runner_, FROM_HERE, - CrossThreadBindOnce(&WorkletPendingTasks::Abort, - WrapCrossThreadPersistent(pending_tasks_.Get()))); - return; - } - // "Note: Specifically, if a script fails to parse or fails to load over the // network, it will reject the promise. If the script throws an error while // first evaluating the promise it will resolve as classes may have been // registered correctly." // https://drafts.css-houdini.org/worklets/#fetch-a-worklet-script // - // When a network failure happens, |module_script| should be nullptr and the - // case should already be handled above. - // - // Check whether a syntax error happens. - if (module_script->HasErrorToRethrow()) { + // When a network failure happens, |module_script| should be nullptr, and the + // case will be handled by the step 3. + // When a parse failure happens, |module_script| has an error to rethrow, and + // the case will be handled by the step 4. + + // Step 3: "If script is null, then queue a task on outsideSettings's + // responsible event loop to run these steps:" + if (!module_script) { + // Null |error_to_rethrow| will be replaced with AbortError. PostCrossThreadTask( *outside_settings_task_runner_, FROM_HERE, CrossThreadBindOnce(&WorkletPendingTasks::Abort, - WrapCrossThreadPersistent(pending_tasks_.Get()))); + WrapCrossThreadPersistent(pending_tasks_.Get()), + /*error_to_rethrow=*/nullptr)); return; } - // Step 4: "Run a module script given script." - ScriptValue error = modulator_->ExecuteModule( - module_script, Modulator::CaptureEvalErrorFlag::kReport); + // Step 4: "If script's error to rethrow is not null, then queue a task on + // outsideSettings's responsible event loop given script's error to rethrow to + // run these steps: + if (module_script->HasErrorToRethrow()) { + ScriptState::Scope scope(script_state_); + PostCrossThreadTask( + *outside_settings_task_runner_, FROM_HERE, + CrossThreadBindOnce( + &WorkletPendingTasks::Abort, + WrapCrossThreadPersistent(pending_tasks_.Get()), + SerializedScriptValue::SerializeAndSwallowExceptions( + script_state_->GetIsolate(), + module_script->CreateErrorToRethrow().V8Value()))); + return; + } - WorkletGlobalScope* global_scope = To<WorkletGlobalScope>( - ExecutionContext::From(modulator_->GetScriptState())); + // Step 5: "Run a module script given script." + ScriptValue error = + Modulator::From(script_state_) + ->ExecuteModule(module_script, + Modulator::CaptureEvalErrorFlag::kReport); + + auto* global_scope = + To<WorkletGlobalScope>(ExecutionContext::From(script_state_)); global_scope->ReportingProxy().DidEvaluateModuleScript(error.IsEmpty()); - // Step 5: "Queue a task on outsideSettings's responsible event loop to run + // Step 6: "Queue a task on outsideSettings's responsible event loop to run // these steps:" // The steps are implemented in WorkletPendingTasks::DecrementCounter(). PostCrossThreadTask( @@ -77,7 +90,7 @@ } void WorkletModuleTreeClient::Trace(blink::Visitor* visitor) { - visitor->Trace(modulator_); + visitor->Trace(script_state_); ModuleTreeClient::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/workers/worklet_module_tree_client.h b/third_party/blink/renderer/core/workers/worklet_module_tree_client.h index 371e044..deb69727 100644 --- a/third_party/blink/renderer/core/workers/worklet_module_tree_client.h +++ b/third_party/blink/renderer/core/workers/worklet_module_tree_client.h
@@ -13,12 +13,13 @@ namespace blink { class ModuleScript; +class ScriptState; // A ModuleTreeClient that lives on the worklet context's thread. class WorkletModuleTreeClient final : public ModuleTreeClient { public: WorkletModuleTreeClient( - Modulator*, + ScriptState*, scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner, WorkletPendingTasks*); @@ -28,7 +29,7 @@ void Trace(blink::Visitor*) override; private: - Member<Modulator> modulator_; + Member<ScriptState> script_state_; scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner_; CrossThreadPersistent<WorkletPendingTasks> pending_tasks_; };
diff --git a/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc b/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc index 6bf787cc..2b967c9 100644 --- a/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc +++ b/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/workers/worklet_pending_tasks.h" +#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/workers/worklet.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -22,18 +23,35 @@ counter_ = counter; } -void WorkletPendingTasks::Abort() { +void WorkletPendingTasks::Abort( + scoped_refptr<SerializedScriptValue> error_to_rethrow) { DCHECK(IsMainThread()); + // This function can be called from the following steps. See + // WorkletModuleTreeClient::NotifyModuleTreeLoadFinished(). + // // Step 3: "If script is null, then queue a task on outsideSettings's // responsible event loop to run these steps:" // 1: "If pendingTaskStruct's counter is not -1, then run these steps:" // 1: "Set pendingTaskStruct's counter to -1." // 2: "Reject promise with an "AbortError" DOMException." + // + // Step 4: "If script's error to rethrow is not null, then queue a task on + // outsideSettings's responsible event loop given script's error to rethrow to + // run these steps: + // 1: "If pendingTaskStruct's counter is not -1, then run these steps:" + // 1: "Set pendingTaskStruct's counter to -1." + // 2: "Reject promise with error to rethrow." if (counter_ != -1) { counter_ = -1; worklet_->FinishPendingTasks(this); - resolver_->Reject( - MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError)); + if (error_to_rethrow) { + ScriptState::Scope scope(resolver_->GetScriptState()); + resolver_->Reject(error_to_rethrow->Deserialize( + resolver_->GetScriptState()->GetIsolate())); + } else { + resolver_->Reject( + MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError)); + } } }
diff --git a/third_party/blink/renderer/core/workers/worklet_pending_tasks.h b/third_party/blink/renderer/core/workers/worklet_pending_tasks.h index c511d14..8fcfa79 100644 --- a/third_party/blink/renderer/core/workers/worklet_pending_tasks.h +++ b/third_party/blink/renderer/core/workers/worklet_pending_tasks.h
@@ -11,6 +11,7 @@ namespace blink { +class SerializedScriptValue; class Worklet; // Implementation of the "pending tasks struct": @@ -31,7 +32,7 @@ void InitializeCounter(int counter); // Sets |counter_| to -1 and rejects the promise. - void Abort(); + void Abort(scoped_refptr<SerializedScriptValue> error_to_rethrow); // Decrements |counter_| and resolves the promise if the counter becomes 0. void DecrementCounter();
diff --git a/third_party/blink/renderer/devtools/OWNERS b/third_party/blink/renderer/devtools/OWNERS index bd5734f..f49aea9 100644 --- a/third_party/blink/renderer/devtools/OWNERS +++ b/third_party/blink/renderer/devtools/OWNERS
@@ -1,8 +1,11 @@ +aerotwist@chromium.org +bmeurer@chromium.org dgozman@chromium.org -pfeldman@chromium.org -lushnikov@chromium.org einbinder@chromium.org +lomitch@microsoft.com luoe@chromium.org +lushnikov@chromium.org +pfeldman@chromium.org yangguo@chromium.org per-file BUILD.gn=*
diff --git a/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js b/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js index 59919119..afc8e748 100644 --- a/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js +++ b/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
@@ -273,13 +273,13 @@ /** * @param {!SDK.TracingModel.Event} event - * @return {!{title: string, category: !Timeline.TimelineCategory}} + * @return {!Timeline.TimelineRecordStyle} */ static eventStyle(event) { const eventStyles = Timeline.TimelineUIUtils._initEventStyles(); if (event.hasCategory(TimelineModel.TimelineModel.Category.Console) || event.hasCategory(TimelineModel.TimelineModel.Category.UserTiming)) { - return {title: event.name, category: Timeline.TimelineUIUtils.categories()['scripting']}; + return new Timeline.TimelineRecordStyle(event.name, Timeline.TimelineUIUtils.categories()['scripting']); } if (event.hasCategory(TimelineModel.TimelineModel.Category.LatencyInfo)) { @@ -288,7 +288,8 @@ const inputEventType = event.name.startsWith(prefix) ? event.name.substr(prefix.length) : event.name; const displayName = Timeline.TimelineUIUtils.inputEventDisplayName( /** @type {!TimelineModel.TimelineIRModel.InputEvents} */ (inputEventType)); - return {title: displayName || inputEventType, category: Timeline.TimelineUIUtils.categories()['scripting']}; + return new Timeline.TimelineRecordStyle( + displayName || inputEventType, Timeline.TimelineUIUtils.categories()['scripting']); } let result = eventStyles[event.name]; if (!result) { @@ -2051,19 +2052,16 @@ } }; -/** - * @unrestricted - */ Timeline.TimelineRecordStyle = class { /** * @param {string} title * @param {!Timeline.TimelineCategory} category * @param {boolean=} hidden */ - constructor(title, category, hidden) { + constructor(title, category, hidden = false) { this.title = title; this.category = category; - this.hidden = !!hidden; + this.hidden = hidden; } };
diff --git a/third_party/blink/renderer/modules/accessibility/DEPS b/third_party/blink/renderer/modules/accessibility/DEPS index 44011c4a..7f78b77 100644 --- a/third_party/blink/renderer/modules/accessibility/DEPS +++ b/third_party/blink/renderer/modules/accessibility/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+mojo/public/cpp/bindings/binding.h", "+ui/accessibility/ax_enums.mojom-blink.h", + "+ui/accessibility/ax_enums.mojom-blink-forward.h", "-third_party/blink/renderer/modules", "+third_party/blink/renderer/modules/accessibility", "+third_party/blink/renderer/modules/media_controls",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 2ca263cb..c387aae9 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -36,7 +36,7 @@ #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h" -#include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink.h" +#include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink-forward.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache_base.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" @@ -45,7 +45,7 @@ #include "third_party/blink/renderer/platform/wtf/hash_map.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/vector.h" -#include "ui/accessibility/ax_enums.mojom-blink.h" +#include "ui/accessibility/ax_enums.mojom-blink-forward.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h index 5f50663e..d41ace1 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_H_ -#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink.h" +#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/modules/service_worker/extendable_event.h" #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h index 7e5aba3..8a491c15 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_UPDATE_UI_EVENT_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_UPDATE_UI_EVENT_H_ -#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink.h" +#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/modules/background_fetch/background_fetch_event.h" #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth.h b/third_party/blink/renderer/modules/bluetooth/bluetooth.h index 237111f..2162844 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth.h +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth.h
@@ -8,7 +8,7 @@ #include "mojo/public/cpp/bindings/associated_receiver_set.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/core/page/page_visibility_observer.h" #include "third_party/blink/renderer/modules/bluetooth/bluetooth_device.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h index 985e4b43..8daeae6 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_DEVICE_H_ #include <memory> -#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.h" #include "third_party/blink/renderer/modules/event_target_modules.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc index a4027a7..842bc68 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/bluetooth/bluetooth_error.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/platform/heap/heap.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h index a884500..2a6ba1e1 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_ERROR_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_ERROR_H_ -#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h index 7bd75f2..fbe7df6 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_H_ #include "mojo/public/cpp/bindings/associated_receiver_set.h" -#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h index 9feec686..4b351c0c 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_REMOTE_GATT_SERVICE_H_ #include <memory> -#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h" +#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/modules/v8/string_or_unsigned_long.h" #include "third_party/blink/renderer/modules/bluetooth/bluetooth_device.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.h b/third_party/blink/renderer/modules/cache_storage/cache_storage.h index e636871..f09b31e0 100644 --- a/third_party/blink/renderer/modules/cache_storage/cache_storage.h +++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/optional.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h" +#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc index 50fdf34..1d8e4d8b 100644 --- a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc +++ b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
@@ -35,6 +35,7 @@ #include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/mojom/referrer_policy.mojom-blink.h" +#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h" #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom-blink.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h"
diff --git a/third_party/blink/renderer/modules/hid/DEPS b/third_party/blink/renderer/modules/hid/DEPS index 98e4a1c..003ec94 100644 --- a/third_party/blink/renderer/modules/hid/DEPS +++ b/third_party/blink/renderer/modules/hid/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+mojo/public/cpp/bindings", "+services/device/public/mojom/hid.mojom-blink.h", + "+services/device/public/mojom/hid.mojom-blink-forward.h", ]
diff --git a/third_party/blink/renderer/modules/hid/hid.h b/third_party/blink/renderer/modules/hid/hid.h index efeccf9..8bc43fa 100644 --- a/third_party/blink/renderer/modules/hid/hid.h +++ b/third_party/blink/renderer/modules/hid/hid.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_H_ #include "mojo/public/cpp/bindings/remote.h" -#include "services/device/public/mojom/hid.mojom-blink.h" +#include "services/device/public/mojom/hid.mojom-blink-forward.h" #include "third_party/blink/public/mojom/hid/hid.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_collection_info.cc b/third_party/blink/renderer/modules/hid/hid_collection_info.cc index c95e753..e46dd0e 100644 --- a/third_party/blink/renderer/modules/hid/hid_collection_info.cc +++ b/third_party/blink/renderer/modules/hid/hid_collection_info.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/hid/hid_collection_info.h" +#include "services/device/public/mojom/hid.mojom-blink.h" #include "third_party/blink/renderer/modules/hid/hid_report_info.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/hid/hid_collection_info.h b/third_party/blink/renderer/modules/hid/hid_collection_info.h index 5883758..aada3a6 100644 --- a/third_party/blink/renderer/modules/hid/hid_collection_info.h +++ b/third_party/blink/renderer/modules/hid/hid_collection_info.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_COLLECTION_INFO_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_COLLECTION_INFO_H_ -#include "services/device/public/mojom/hid.mojom-blink.h" +#include "services/device/public/mojom/hid.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_device.h b/third_party/blink/renderer/modules/hid/hid_device.h index f419c3c..3c6eaf79 100644 --- a/third_party/blink/renderer/modules/hid/hid_device.h +++ b/third_party/blink/renderer/modules/hid/hid_device.h
@@ -8,7 +8,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" -#include "services/device/public/mojom/hid.mojom-blink.h" +#include "services/device/public/mojom/hid.mojom-blink-forward.h" #include "third_party/blink/public/mojom/hid/hid.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_report_info.cc b/third_party/blink/renderer/modules/hid/hid_report_info.cc index a10eb44..672a73c 100644 --- a/third_party/blink/renderer/modules/hid/hid_report_info.cc +++ b/third_party/blink/renderer/modules/hid/hid_report_info.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/hid/hid_report_info.h" +#include "services/device/public/mojom/hid.mojom-blink.h" #include "third_party/blink/renderer/modules/hid/hid_report_item.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/hid/hid_report_info.h b/third_party/blink/renderer/modules/hid/hid_report_info.h index e7b0d3ca..05e8847 100644 --- a/third_party/blink/renderer/modules/hid/hid_report_info.h +++ b/third_party/blink/renderer/modules/hid/hid_report_info.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_INFO_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_INFO_H_ -#include "services/device/public/mojom/hid.mojom-blink.h" +#include "services/device/public/mojom/hid.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_report_item.cc b/third_party/blink/renderer/modules/hid/hid_report_item.cc index a8e98ee3..514b4c2f 100644 --- a/third_party/blink/renderer/modules/hid/hid_report_item.cc +++ b/third_party/blink/renderer/modules/hid/hid_report_item.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/modules/hid/hid_report_item.h" +#include "services/device/public/mojom/hid.mojom-blink.h" + namespace blink { namespace {
diff --git a/third_party/blink/renderer/modules/hid/hid_report_item.h b/third_party/blink/renderer/modules/hid/hid_report_item.h index 63085652..223e351a 100644 --- a/third_party/blink/renderer/modules/hid/hid_report_item.h +++ b/third_party/blink/renderer/modules/hid/hid_report_item.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_ITEM_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_ITEM_H_ -#include "services/device/public/mojom/hid.mojom-blink.h" +#include "services/device/public/mojom/hid.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
diff --git a/third_party/blink/renderer/modules/idle/idle_detector.h b/third_party/blink/renderer/modules/idle/idle_detector.h index 95786de..5ad49150 100644 --- a/third_party/blink/renderer/modules/idle/idle_detector.h +++ b/third_party/blink/renderer/modules/idle/idle_detector.h
@@ -8,7 +8,7 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/idle/idle_manager.mojom-blink.h" +#include "third_party/blink/public/mojom/idle/idle_manager.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h b/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h index 1bb3321..eef1acfd 100644 --- a/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h +++ b/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h
@@ -10,7 +10,7 @@ #include "base/callback.h" #include "base/macros.h" -#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" +#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/public/web/web_associated_url_loader_options.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/imagecapture/DEPS b/third_party/blink/renderer/modules/imagecapture/DEPS index 8328eae..d9f3687 100644 --- a/third_party/blink/renderer/modules/imagecapture/DEPS +++ b/third_party/blink/renderer/modules/imagecapture/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+media/capture/mojom/image_capture.mojom-blink.h", + "+media/capture/mojom/image_capture.mojom-blink-forward.h", "+media/base", "+skia/ext/platform_canvas.h",
diff --git a/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h b/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h index f1c0095d..314509c5 100644 --- a/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h +++ b/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_PHOTO_CAPABILITIES_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_PHOTO_CAPABILITIES_H_ -#include "media/capture/mojom/image_capture.mojom-blink.h" +#include "media/capture/mojom/image_capture.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/imagecapture/media_settings_range.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_index.h b/third_party/blink/renderer/modules/indexeddb/idb_index.h index 0c09700a..0d628fc 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_index.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_index.h
@@ -27,7 +27,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_INDEX_H_ #include "third_party/blink/public/common/indexeddb/web_idb_types.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/indexeddb/idb_cursor.h" #include "third_party/blink/renderer/modules/indexeddb/idb_key_path.h" #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_observation.h b/third_party/blink/renderer/modules/indexeddb/idb_observation.h index 831fae9..bc668d0ea 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_observation.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_observation.h
@@ -8,7 +8,7 @@ #include <memory> #include "third_party/blink/public/common/indexeddb/web_idb_types.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.h b/third_party/blink/renderer/modules/indexeddb/idb_request.h index d3f1132..48a337ea 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_request.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_request.h
@@ -34,7 +34,7 @@ #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/common/indexeddb/web_idb_types.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_blob_info.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h index 11fd9efb..f73fb13 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
@@ -29,7 +29,7 @@ #include <memory> #include "third_party/blink/public/common/indexeddb/web_idb_types.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/core/dom/dom_string_list.h" #include "third_party/blink/renderer/core/dom/events/event_listener.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h index 850b3fc..3f803a7 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
@@ -28,7 +28,7 @@ #include "base/optional.h" #include "third_party/blink/public/common/indexeddb/web_idb_types.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/modules/event_modules.h" #include "third_party/blink/renderer/modules/indexeddb/idb_any.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h index 118199a7d..c89042a 100644 --- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h +++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
@@ -9,7 +9,7 @@ #include "base/optional.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "testing/gmock/include/gmock/gmock.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/public/platform/web_blob_info.h" #include "third_party/blink/public/web/web_heap.h" #include "third_party/blink/renderer/modules/indexeddb/idb_database_error.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h index aca1e9a..a1e3449 100644 --- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h +++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h
@@ -9,7 +9,7 @@ #include <memory> #include "mojo/public/cpp/bindings/pending_associated_receiver.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/indexeddb/idb_key_path.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h index bc23ccee01..aaec596 100644 --- a/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h +++ b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
@@ -9,7 +9,7 @@ #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h" #include "third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h index a1a0fb6..9638494 100644 --- a/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h +++ b/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h
@@ -30,7 +30,7 @@ #include <memory> #include "mojo/public/cpp/bindings/pending_associated_receiver.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h" #include "third_party/blink/renderer/modules/modules_export.h"
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc index 444834b..5f30971 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc
@@ -12,7 +12,7 @@ WebGLRenderingContextBase* context) : WebGLExtension(context) { context->ExtensionsUtil()->EnsureExtensionEnabled( - "GL_CHROMIUM_compressed_texture_etc"); + "GL_ANGLE_compressed_texture_etc"); context->AddCompressedTextureFormat(GL_COMPRESSED_R11_EAC); context->AddCompressedTextureFormat(GL_COMPRESSED_SIGNED_R11_EAC); context->AddCompressedTextureFormat(GL_COMPRESSED_RGB8_ETC2); @@ -38,8 +38,7 @@ bool WebGLCompressedTextureETC::Supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensions_util = context->ExtensionsUtil(); - return extensions_util->SupportsExtension( - "GL_CHROMIUM_compressed_texture_etc"); + return extensions_util->SupportsExtension("GL_ANGLE_compressed_texture_etc"); } const char* WebGLCompressedTextureETC::ExtensionName() {
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc index b6a167c..af1fb2a 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc +++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
@@ -711,7 +711,7 @@ char* entry_point_ptr = entry_point_keepalive.get(); memcpy(entry_point_ptr, entry_point.c_str(), byte_size); - DawnPipelineStageDescriptor dawn_stage = {}; + DawnProgrammableStageDescriptor dawn_stage = {}; dawn_stage.module = webgpu_stage->module()->GetHandle(); dawn_stage.entryPoint = entry_point_ptr;
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h index e6592f7c..7411163 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h +++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h
@@ -45,7 +45,7 @@ DawnOrigin3D AsDawnType(const UnsignedLongSequenceOrGPUOrigin3DDict*); using OwnedProgrammableStageDescriptor = - std::tuple<DawnPipelineStageDescriptor, std::unique_ptr<char[]>>; + std::tuple<DawnProgrammableStageDescriptor, std::unique_ptr<char[]>>; OwnedProgrammableStageDescriptor AsDawnType( const GPUProgrammableStageDescriptor*);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h index 01924b00..5c922e7 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h
@@ -14,7 +14,6 @@ public: // gpu_buffer_usage.idl - static constexpr uint32_t kNone = 0; static constexpr uint32_t kMapRead = 1; static constexpr uint32_t kMapWrite = 2; static constexpr uint32_t kCopySrc = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl index e664b348..b49cc104 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl
@@ -8,7 +8,6 @@ [ RuntimeEnabled=WebGPU ] interface GPUBufferUsage { - const GPUBufferUsageFlags NONE = 0; const GPUBufferUsageFlags MAP_READ = 1; const GPUBufferUsageFlags MAP_WRITE = 2; const GPUBufferUsageFlags COPY_SRC = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_color_write.h b/third_party/blink/renderer/modules/webgpu/gpu_color_write.h index 429220b..4df070ed6 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_color_write.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_color_write.h
@@ -14,7 +14,6 @@ public: // gpu_color_write.idl - static constexpr uint32_t kNone = 0; static constexpr uint32_t kRed = 1; static constexpr uint32_t kGreen = 2; static constexpr uint32_t kBlue = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl b/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl index 0c79c6d..a71fbafd 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl
@@ -8,7 +8,6 @@ [ RuntimeEnabled=WebGPU ] interface GPUColorWrite { - const GPUColorWriteFlags NONE = 0; const GPUColorWriteFlags RED = 1; const GPUColorWriteFlags GREEN = 2; const GPUColorWriteFlags BLUE = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h index 6ab71b9..07b6649 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h
@@ -14,7 +14,6 @@ public: // gpu_shader_stage.idl - static constexpr uint32_t kNone = 0; static constexpr uint32_t kVertex = 1; static constexpr uint32_t kFragment = 2; static constexpr uint32_t kCompute = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl index 54fd4163..546221e2 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl
@@ -8,7 +8,6 @@ [ RuntimeEnabled=WebGPU ] interface GPUShaderStage { - const GPUShaderStageFlags NONE = 0; const GPUShaderStageFlags VERTEX = 1; const GPUShaderStageFlags FRAGMENT = 2; const GPUShaderStageFlags COMPUTE = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h index 30ec2618..4455467 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h
@@ -14,7 +14,6 @@ public: // gpu_texture_usage.idl - static constexpr uint32_t kNone = 0; static constexpr uint32_t kCopySrc = 1; static constexpr uint32_t kCopyDst = 2; static constexpr uint32_t kSampled = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl index 4fe824d..d8139ba 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl
@@ -8,7 +8,6 @@ [ RuntimeEnabled=WebGPU ] interface GPUTextureUsage { - const GPUTextureUsageFlags NONE = 0; const GPUTextureUsageFlags COPY_SRC = 1; const GPUTextureUsageFlags COPY_DST = 2; const GPUTextureUsageFlags SAMPLED = 4;
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream.cc b/third_party/blink/renderer/modules/websockets/websocket_stream.cc index 053fb14..c33cdbc2 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_stream.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
@@ -468,8 +468,6 @@ return; common_.SetState(WebSocketCommon::kOpen); was_ever_connected_ = true; - // Don't read all of a huge initial message before read() has been called. - channel_->ApplyBackpressure(); auto* connection = MakeGarbageCollected<WebSocketConnection>(); connection->setProtocol(subprotocol); connection->setExtensions(extensions); @@ -599,6 +597,9 @@ DVLOG(1) << "WebSocketStream " << this << " Connect() url=" << url << " options=" << options; + // Don't read all of a huge initial message before read() has been called. + channel_->ApplyBackpressure(); + auto* signal = options->signal(); if (signal && signal->aborted()) { auto exception = V8ThrowDOMException::CreateOrEmpty(
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc b/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc index 554ed594..59527e2 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc
@@ -63,6 +63,9 @@ TEST_F(WebSocketStreamTest, ConstructWithBadURL) { V8TestingScope scope; auto& exception_state = scope.GetExceptionState(); + + EXPECT_CALL(Channel(), ApplyBackpressure()); + auto* stream = Create(scope.GetScriptState(), "bad-scheme:", exception_state); EXPECT_FALSE(stream); @@ -72,7 +75,7 @@ EXPECT_EQ( "The URL's scheme must be either 'ws' or 'wss'. 'bad-scheme' is not " "allowed.", - scope.GetExceptionState().Message()); + exception_state.Message()); } // Most coverage for bad constructor arguments is provided by @@ -84,6 +87,7 @@ { InSequence s; + EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/hoge"), String())) .WillOnce(Return(true)); } @@ -100,6 +104,7 @@ { InSequence s; + EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/chat"), String("chat0, chat1"))) .WillOnce(Return(true)); @@ -119,6 +124,7 @@ { InSequence s; + EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/chat"), String())) .WillOnce(Return(true)); EXPECT_CALL(Channel(), Disconnect()); @@ -143,10 +149,10 @@ { InSequence s; + EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/chat"), String("chat"))) .WillOnce(Return(true)); - EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(checkpoint, Call(1)); EXPECT_CALL(Channel(), Close(1001, String())); } @@ -172,9 +178,9 @@ { InSequence s; + EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/echo"), String())) .WillOnce(Return(true)); - EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Close(-1, String(""))); EXPECT_CALL(Channel(), Disconnect()); } @@ -195,6 +201,7 @@ { InSequence s; + EXPECT_CALL(Channel(), ApplyBackpressure()); EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/echo"), String())) .WillOnce(Return(true)); EXPECT_CALL(
diff --git a/third_party/blink/renderer/modules/webusb/usb.cc b/third_party/blink/renderer/modules/webusb/usb.cc index 2585c1b..cbe336a 100644 --- a/third_party/blink/renderer/modules/webusb/usb.cc +++ b/third_party/blink/renderer/modules/webusb/usb.cc
@@ -9,7 +9,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/device/public/mojom/usb_device.mojom-blink.h" #include "services/device/public/mojom/usb_enumeration_options.mojom-blink.h" -#include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" @@ -299,7 +299,7 @@ // See https://bit.ly/2S0zRAS for task types. auto task_runner = GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI); - GetExecutionContext()->GetInterfaceProvider()->GetInterface( + GetExecutionContext()->GetBrowserInterfaceBroker().GetInterface( service_.BindNewPipeAndPassReceiver(task_runner)); service_.set_disconnect_handler( WTF::Bind(&USB::OnServiceConnectionError, WrapWeakPersistent(this)));
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 645b54b6..76b82656 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -728,6 +728,10 @@ "fonts/web_font_typeface_factory.h", "fonts/win/dwrite_font_format_support.cc", "fonts/win/dwrite_font_format_support.h", + "fonts/win/fallback_family_style_cache_win.cc", + "fonts/win/fallback_family_style_cache_win.h", + "fonts/win/fallback_lru_cache_win.cc", + "fonts/win/fallback_lru_cache_win.h", "fonts/win/font_cache_skia_win.cc", "fonts/win/font_fallback_win.cc", "fonts/win/font_fallback_win.h", @@ -1867,6 +1871,7 @@ if (is_win) { sources += [ "text/locale_win_test.cc" ] + sources += [ "fonts/win/fallback_lru_cache_win_test.cc" ] } else if (is_mac) { sources += [ "fonts/opentype/open_type_caps_support_test.mm",
diff --git a/third_party/blink/renderer/platform/DEPS b/third_party/blink/renderer/platform/DEPS index cbc4b78..9a37cb5 100644 --- a/third_party/blink/renderer/platform/DEPS +++ b/third_party/blink/renderer/platform/DEPS
@@ -6,6 +6,7 @@ "+base/bind.h", "+base/bind_helpers.h", "+base/bit_cast.h", + "+base/command_line.h", "+base/compiler_specific.h", "+base/cpu.h", "+base/feature_list.h",
diff --git a/third_party/blink/renderer/platform/fonts/font_cache.h b/third_party/blink/renderer/platform/fonts/font_cache.h index be25d9e..4025c77 100644 --- a/third_party/blink/renderer/platform/fonts/font_cache.h +++ b/third_party/blink/renderer/platform/fonts/font_cache.h
@@ -60,6 +60,7 @@ #if defined(OS_WIN) #include "third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom-blink.h" +#include "third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h" #endif class SkString; @@ -356,6 +357,7 @@ // to ensure it's not happening in the production from the crash log. bool is_test_font_mgr_ = false; mojo::Remote<mojom::blink::DWriteFontProxy> service_; + std::unique_ptr<FallbackFamilyStyleCache> fallback_params_cache_; #endif // defined(OS_WIN) #if defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc new file mode 100644 index 0000000..a563a8007 --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc
@@ -0,0 +1,91 @@ +// Copyright 2019 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/platform/fonts/win/fallback_family_style_cache_win.h" + +#include "third_party/blink/renderer/platform/fonts/font_platform_data.h" + +namespace blink { + +namespace { + +const wtf_size_t kMaxCacheSlots = 16; + +String makeCacheKey(FontDescription::GenericFamilyType generic_family, + String bcp47_language_tag, + FontFallbackPriority fallback_priority) { + StringBuilder cache_key; + cache_key.Append(bcp47_language_tag); + cache_key.AppendNumber( + static_cast< + std::underlying_type<FontDescription::GenericFamilyType>::type>( + generic_family)); + cache_key.AppendNumber( + static_cast<std::underlying_type<FontFallbackPriority>::type>( + fallback_priority)); + return cache_key.ToString(); +} + +void getFallbackFamilyAndStyle(SkTypeface* typeface, + String* fallback_family, + SkFontStyle* fallback_style) { + SkString family; + typeface->getFamilyName(&family); + *fallback_family = family.c_str(); + + *fallback_style = typeface->fontStyle(); +} +} // namespace + +FallbackFamilyStyleCache::FallbackFamilyStyleCache() + : recent_fallback_fonts_(kMaxCacheSlots) {} + +void FallbackFamilyStyleCache::Put( + FontDescription::GenericFamilyType generic_family, + String bcp47_language_tag, + FontFallbackPriority fallback_priority, + SkTypeface* typeface) { + String cache_key = + makeCacheKey(generic_family, bcp47_language_tag, fallback_priority); + + FallbackLruCache::TypefaceVector* existing_typefaces = + recent_fallback_fonts_.Get(cache_key); + if (existing_typefaces) { + existing_typefaces->insert(0, sk_ref_sp(typeface)); + } else { + FallbackLruCache::TypefaceVector typefaces; + typefaces.push_back(sk_ref_sp(typeface)); + recent_fallback_fonts_.Put(std::move(cache_key), std::move(typefaces)); + } +} + +void FallbackFamilyStyleCache::Get( + FontDescription::GenericFamilyType generic_family, + String bcp47_language_tag, + FontFallbackPriority fallback_priority, + UChar32 character, + String* fallback_family, + SkFontStyle* fallback_style) { + FallbackLruCache::TypefaceVector* typefaces = recent_fallback_fonts_.Get( + makeCacheKey(generic_family, bcp47_language_tag, fallback_priority)); + if (!typefaces) + return; + + for (wtf_size_t i = 0; i < typefaces->size(); ++i) { + sk_sp<SkTypeface>& typeface = typefaces->at(i); + if (typeface->unicharToGlyph(character)) { + getFallbackFamilyAndStyle(typeface.get(), fallback_family, + fallback_style); + sk_sp<SkTypeface> tmp_typeface(typeface); + // For the vector of typefaces for this specific language tag, since this + // SkTypeface had a glyph, move it to the beginning to accelerate + // subsequent lookups. + typefaces->EraseAt(i); + typefaces->insert(0, std::move(tmp_typeface)); + return; + } + } +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h new file mode 100644 index 0000000..5e8f86eb --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h
@@ -0,0 +1,56 @@ +// Copyright 2019 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_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_ + +#include "third_party/blink/renderer/platform/fonts/font_description.h" +#include "third_party/blink/renderer/platform/fonts/font_fallback_priority.h" +#include "third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h" +#include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/core/SkTypeface.h" + +namespace blink { + +class FallbackFamilyStyleCache { + USING_FAST_MALLOC(FallbackFamilyStyleCache); + + public: + FallbackFamilyStyleCache(); + + // Places a SkTypeface object in the cache for specified language tag and + // fallback priority, taking a reference on SkTypeface. Adds the |SkTypeface| + // to the beginning of a list of typefaces if previous |SkTypefaces| objects + // where added for this set of parameters. Note, the internal list of + // typefaces for a language tag and fallback priority is not checked for + // duplicates when adding a |typeface| object. + void Put(FontDescription::GenericFamilyType generic_family, + String bcp47_language_tag, + FontFallbackPriority fallback_priority, + SkTypeface* typeface); + + // Fetches a |fallback_family| and |fallback_style| for a given language tag, + // fallback priority and codepoint. Checks the internal cache for whether a + // fallback font with glyph coverage for |character| is available for the + // given parameters, then returns its family name and style. + void Get(FontDescription::GenericFamilyType generic_family, + String bcp47_language_tag, + FontFallbackPriority fallback_priority, + UChar32 character, + String* fallback_family, + SkFontStyle* fallback_style); + + // Empties the internal cache, deleting keys and unrefing the typefaces that + // were placed in the cache. + void Clear(); + + private: + DISALLOW_COPY_AND_ASSIGN(FallbackFamilyStyleCache); + + FallbackLruCache recent_fallback_fonts_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.cc b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.cc new file mode 100644 index 0000000..37b6a15 --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.cc
@@ -0,0 +1,57 @@ +// Copyright 2019 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/platform/fonts/win/fallback_lru_cache_win.h" + +#include "third_party/blink/renderer/platform/wtf/text/string_hash.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +FallbackLruCache::FallbackLruCache(size_t max_size) : max_size_(max_size) { + DCHECK_GT(max_size_, 0u); +} + +FallbackLruCache::TypefaceVector* FallbackLruCache::Get(const String& key) { + HashMapType::iterator find_result = map_.find(key); + if (find_result == map_.end()) + return nullptr; + + // Move result to beginning of list. + KeyListNode* node = find_result->value.ListNode(); + ordering_.Remove(node); + ordering_.Push(node); + return find_result->value.value(); +} + +void FallbackLruCache::Put(String&& key, TypefaceVector&& arg) { + HashMapType::iterator find_result = map_.find(key); + if (find_result != map_.end()) { + ordering_.Remove(find_result->value.ListNode()); + map_.erase(find_result); + } + + if (map_.size() >= max_size_) { + RemoveLeastRecentlyUsed(); + } + + std::unique_ptr<KeyListNode> list_node = std::make_unique<KeyListNode>(key); + HashMapType::AddResult add_result = map_.insert( + std::move(key), MappedWithListNode(std::move(arg), std::move(list_node))); + DCHECK(add_result.is_new_entry); + ordering_.Push(add_result.stored_value->value.ListNode()); +} + +void FallbackLruCache::Clear() { + map_.clear(); + ordering_.Clear(); +} + +void FallbackLruCache::RemoveLeastRecentlyUsed() { + KeyListNode* tail = ordering_.Tail(); + ordering_.Remove(tail); + map_.erase(tail->key()); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h new file mode 100644 index 0000000..90048e3 --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h
@@ -0,0 +1,91 @@ +// Copyright 2019 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/platform/platform_export.h" +#include "third_party/blink/renderer/platform/wtf/doubly_linked_list.h" +#include "third_party/blink/renderer/platform/wtf/hash_map.h" +#include "third_party/blink/renderer/platform/wtf/hash_table_deleted_value_type.h" +#include "third_party/blink/renderer/platform/wtf/text/string_hash.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/core/SkTypeface.h" + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_LRU_CACHE_WIN_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_LRU_CACHE_WIN_H_ + +namespace blink { + +/* A LRU cache for storing a a vector of typefaces for a particular key string, + * which would usually be a locale plus potential additional parameters. Uses a + * HashMap for storage and access and a DoublyLinkedList for managing age of + * entries. TODO(https://crbug.com/1010925): Potentially move this to a generic + * LRU Cache implementation once we have such in WTF. */ +class PLATFORM_EXPORT FallbackLruCache { + USING_FAST_MALLOC(FallbackLruCache); + + public: + FallbackLruCache(size_t max_size); + + using TypefaceVector = Vector<sk_sp<SkTypeface>>; + + TypefaceVector* Get(const String& key); + void Put(String&& key, TypefaceVector&& arg); + + void Clear(); + + size_t size() const { return map_.size(); } + + private: + class KeyListNode final : public DoublyLinkedListNode<KeyListNode> { + USING_FAST_MALLOC(KeyListNode); + + public: + friend class DoublyLinkedListNode<KeyListNode>; + KeyListNode(const String& key) : key_(key) {} + + const String& key() const { return key_; } + + private: + String key_; + KeyListNode* prev_{nullptr}; + KeyListNode* next_{nullptr}; + }; + + class MappedWithListNode { + USING_FAST_MALLOC(MappedWithListNode); + + public: + MappedWithListNode(TypefaceVector&& mapped_arg, + std::unique_ptr<KeyListNode>&& list_node) + : mapped_value_(std::move(mapped_arg)), + list_node_(std::move(list_node)) {} + + MappedWithListNode(WTF::HashTableDeletedValueType) { + list_node_.reset(reinterpret_cast<KeyListNode*>(-1)); + } + + TypefaceVector* value() { return &mapped_value_; } + KeyListNode* ListNode() { return list_node_.get(); } + + private: + TypefaceVector mapped_value_; + std::unique_ptr<KeyListNode> list_node_; + }; + + void RemoveLeastRecentlyUsed(); + + using HashMapType = HashMap<String, + MappedWithListNode, + DefaultHash<String>::Hash, + HashTraits<String>, + SimpleClassHashTraits<MappedWithListNode>>; + + HashMapType map_; + DoublyLinkedList<KeyListNode> ordering_; + size_t max_size_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_LRU_CACHE_WIN_H_
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc new file mode 100644 index 0000000..92f78aa --- /dev/null +++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc
@@ -0,0 +1,97 @@ +// Copyright 2019 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/platform/fonts/win/fallback_lru_cache_win.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkFontMgr.h" +#include "third_party/skia/include/core/SkRefCnt.h" +#include "third_party/skia/include/core/SkTypeface.h" + +namespace { + +const char kHanSimplifiedLocale[] = "zh-Hans"; +const size_t kLruCacheTestSize = 5; +const char kFontFamilyNameArial[] = "Arial"; +const UChar32 kFirstCJKIdeograph = 0x4E00; +const UChar32 kSecondCJKIdeograph = kFirstCJKIdeograph + 1; + +sk_sp<SkTypeface> fallbackForLocale(String locale, UChar32 codepoint) { + sk_sp<SkFontMgr> font_mgr = SkFontMgr::RefDefault(); + std::string locale_string(locale.Ascii()); + const char* locale_char = locale_string.c_str(); + return sk_sp<SkTypeface>(font_mgr->matchFamilyStyleCharacter( + kFontFamilyNameArial, SkFontStyle(), &locale_char, 1, codepoint)); +} + +void fillCacheWithDummies(blink::FallbackLruCache& lru_cache, + const char* format_string, + size_t count) { + for (size_t i = 0; i < count; ++i) { + blink::FallbackLruCache::TypefaceVector dummy_typefaces; + dummy_typefaces.push_back( + SkTypeface::MakeFromName(kFontFamilyNameArial, SkFontStyle())); + lru_cache.Put(String::Format(format_string, i), std::move(dummy_typefaces)); + } +} + +} // namespace + +namespace blink { + +TEST(FallbackLruCacheTest, KeepChineseWhenFetched) { + // Put a Chinese font in the cache, add size - 1 more dummy fallback fonts so + // that the cache is full. Get() and verify typeface for Chinese to move them + // up to the top of the cache. Then fill again with size - 1 items and verify + // that Chinese is still in the cache. Then fill with # size items to evict + // the Chinese font and ensure it's gone. + FallbackLruCache lru_cache(kLruCacheTestSize); + EXPECT_EQ(lru_cache.size(), 0u); + FallbackLruCache::TypefaceVector fallback_typefaces_zh; + fallback_typefaces_zh.push_back( + fallbackForLocale(kHanSimplifiedLocale, kFirstCJKIdeograph)); + lru_cache.Put(kHanSimplifiedLocale, std::move(fallback_typefaces_zh)); + + EXPECT_EQ(lru_cache.size(), 1u); + + fillCacheWithDummies(lru_cache, "dummy_locale_%zu", kLruCacheTestSize - 1); + FallbackLruCache::TypefaceVector* chinese_typefaces = + lru_cache.Get(kHanSimplifiedLocale); + EXPECT_TRUE(chinese_typefaces); + EXPECT_TRUE(chinese_typefaces->at(0)->unicharToGlyph(0x4E01)); + EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); + + fillCacheWithDummies(lru_cache, "dummy_locale_2nd_%zu", + kLruCacheTestSize - 1); + chinese_typefaces = nullptr; + chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale); + EXPECT_TRUE(chinese_typefaces); + EXPECT_EQ(chinese_typefaces->size(), 1u); + EXPECT_TRUE(chinese_typefaces->at(0)->unicharToGlyph(kSecondCJKIdeograph)); + EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); + + fillCacheWithDummies(lru_cache, "dummy_locale_3rd_%zu", kLruCacheTestSize); + chinese_typefaces = nullptr; + chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale); + EXPECT_FALSE(chinese_typefaces); + EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); +} + +TEST(FallbackLruCacheTest, LargeFillAndClear) { + FallbackLruCache lru_cache(kLruCacheTestSize); + EXPECT_EQ(lru_cache.size(), 0u); + fillCacheWithDummies(lru_cache, "dummy_locale_%zu", 1000); + EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); + lru_cache.Clear(); + EXPECT_EQ(lru_cache.size(), 0u); +} + +TEST(FallbackLruCacheTest, KeyOverride) { + FallbackLruCache lru_cache(kLruCacheTestSize); + EXPECT_EQ(lru_cache.size(), 0u); + fillCacheWithDummies(lru_cache, "same_locale", 10); + EXPECT_EQ(lru_cache.size(), 1u); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc b/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc index 0f25432e..53273cd 100644 --- a/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc +++ b/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc
@@ -329,24 +329,36 @@ // character + language tag and call matchFamilyStyleCharacter on the browser // side, where we can do that. if (!use_skia_font_fallback_) { - EnsureServiceConnected(); - - // After Mojo IPC, on the browser side, this ultimately reaches - // Skia's matchFamilyStyleCharacter for Windows, which does not implement - // traversing the language tag stack but only processes the most important - // one, so we use FallbackLocaleForCharacter() to determine what locale to - // choose to achieve the best possible result. - String fallback_family; SkFontStyle fallback_style; - if (!GetOutOfProcessFallbackFamily( - codepoint, font_description.GenericFamily(), - fallback_locale->LocaleForSkFontMgr(), fallback_priority, service_, - &fallback_family, &fallback_style)) - return nullptr; - if (fallback_family.IsEmpty()) - return nullptr; + if (UNLIKELY(!fallback_params_cache_)) { + fallback_params_cache_ = std::make_unique<FallbackFamilyStyleCache>(); + } + + fallback_params_cache_->Get( + font_description.GenericFamily(), fallback_locale->LocaleForSkFontMgr(), + fallback_priority, codepoint, &fallback_family, &fallback_style); + bool result_from_cache = !fallback_family.IsNull(); + + if (!result_from_cache) { + EnsureServiceConnected(); + + // After Mojo IPC, on the browser side, this ultimately reaches + // Skia's matchFamilyStyleCharacter for Windows, which does not implement + // traversing the language tag stack but only processes the most important + // one, so we use FallbackLocaleForCharacter() to determine what locale to + // choose to achieve the best possible result. + + if (!GetOutOfProcessFallbackFamily( + codepoint, font_description.GenericFamily(), + fallback_locale->LocaleForSkFontMgr(), fallback_priority, + service_, &fallback_family, &fallback_style)) + return nullptr; + + if (fallback_family.IsEmpty()) + return nullptr; + } FontFaceCreationParams create_by_family((AtomicString(fallback_family))); FontDescription fallback_updated_font_description(font_description); @@ -355,6 +367,12 @@ fallback_updated_font_description, create_by_family); if (!data || !data->FontContainsCharacter(codepoint)) return nullptr; + + if (!result_from_cache) { + fallback_params_cache_->Put(font_description.GenericFamily(), + fallback_locale->LocaleForSkFontMgr(), + fallback_priority, data->Typeface()); + } return FontDataFromFontPlatformData(data, kDoNotRetain); } else { std::string family_name = font_description.Family().Family().Utf8();
diff --git a/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc b/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc index e33ef64..7ae4b5727 100644 --- a/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc +++ b/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc
@@ -5,7 +5,8 @@ #include <utility> #include "base/test/task_environment.h" -#include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/mojom/geometry.mojom-blink.h" #include "ui/gfx/geometry/mojom/geometry_traits_test_service.mojom-blink.h" @@ -21,9 +22,10 @@ GeometryStructTraitsTest() {} protected: - gfx::mojom::blink::GeometryTraitsTestServicePtr GetTraitsTestProxy() { - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy; - traits_test_bindings_.AddBinding(this, mojo::MakeRequest(&proxy)); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> + GetTraitsTestProxy() { + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy; + traits_test_receivers_.Add(this, proxy.BindNewPipeAndPassReceiver()); return proxy; } @@ -93,8 +95,8 @@ std::move(callback).Run(q); } - mojo::BindingSet<gfx::mojom::blink::GeometryTraitsTestService> - traits_test_bindings_; + mojo::ReceiverSet<gfx::mojom::blink::GeometryTraitsTestService> + traits_test_receivers_; base::test::TaskEnvironment task_environment_; @@ -107,7 +109,8 @@ const int32_t kWidth = 1234; const int32_t kHeight = 5678; WebSize input(kWidth, kHeight); - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy = + GetTraitsTestProxy(); WebSize output; proxy->EchoSize(input, &output); EXPECT_EQ(input, output); @@ -117,7 +120,8 @@ const float kX = 1234; const float kY = 5678; WebPoint input(kX, kY); - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy = + GetTraitsTestProxy(); WebPoint output; proxy->EchoPoint(input, &output); EXPECT_EQ(input, output); @@ -127,7 +131,8 @@ const float kX = 1.234; const float kY = 5.678; WebFloatPoint input(kX, kY); - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy = + GetTraitsTestProxy(); WebFloatPoint output; proxy->EchoPointF(input, &output); EXPECT_EQ(input, output); @@ -138,7 +143,8 @@ const float kY = 5.678; const float kZ = 9.098; WebFloatPoint3D input(kX, kY, kZ); - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy = + GetTraitsTestProxy(); WebFloatPoint3D output; proxy->EchoPoint3F(input, &output); EXPECT_EQ(input, output); @@ -150,7 +156,8 @@ const float kWidth = 3; const float kHeight = 4; WebRect input(kX, kY, kWidth, kHeight); - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy = + GetTraitsTestProxy(); WebRect output; proxy->EchoRect(input, &output); EXPECT_EQ(input, output); @@ -162,7 +169,8 @@ const float kWidth = 3.456; const float kHeight = 4.567; WebFloatRect input(kX, kY, kWidth, kHeight); - gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy = + GetTraitsTestProxy(); WebFloatRect output; proxy->EchoRectF(input, &output); EXPECT_EQ(input, output);
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc index 3167040..cd34c21 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -8,6 +8,9 @@ #include <memory> #include <vector> +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/command_line.h" #include "base/location.h" #include "base/logging.h" #include "base/memory/unsafe_shared_memory_region.h" @@ -22,6 +25,7 @@ #include "base/time/time.h" #include "media/base/bind_to_current_loop.h" #include "media/base/bitstream_buffer.h" +#include "media/base/media_switches.h" #include "media/base/video_bitrate_allocation.h" #include "media/base/video_frame.h" #include "media/base/video_util.h" @@ -211,6 +215,12 @@ // Perform encoding on an input frame from the input queue. void EncodeOneFrame(); + // Perform encoding on an input frame from the input queue using VEA native + // input mode. The input frame must be backed with GpuMemoryBuffer buffers. + void EncodeOneFrameWithNativeInput(); + + void CreateBlackGpuMemoryBufferFrame(const gfx::Size& natural_size); + // Notify that an input frame is finished for encoding. |index| is the index // of the completed frame in |input_buffers_|. void EncodeFrameFinished(int index); @@ -289,6 +299,13 @@ // encoder. int output_buffers_free_count_; + // Whether to send the frames to VEA as native buffer. Native buffer allows + // VEA to pass the buffer to the encoder directly without further processing. + bool use_native_input_; + + // A black GpuMemoryBuffer frame used when the video track is disabled. + scoped_refptr<media::VideoFrame> black_gmb_frame_; + // webrtc::VideoEncoder encode complete callback. webrtc::EncodedImageCallback* encoded_image_callback_; @@ -321,6 +338,7 @@ input_next_frame_(nullptr), input_next_frame_keyframe_(false), output_buffers_free_count_(0), + use_native_input_(false), encoded_image_callback_(nullptr), video_codec_type_(video_codec_type), video_content_type_(video_content_type), @@ -351,9 +369,21 @@ return; } input_visible_size_ = input_visible_size; + media::VideoPixelFormat pixel_format = media::PIXEL_FORMAT_I420; + auto storage_type = + media::VideoEncodeAccelerator::Config::StorageType::kShmem; + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kVideoCaptureUseGpuMemoryBuffer) && + video_content_type_ != webrtc::VideoContentType::SCREENSHARE) { + // Use import mode for camera when GpuMemoryBuffer-based video capture is + // enabled. + pixel_format = media::PIXEL_FORMAT_NV12; + storage_type = media::VideoEncodeAccelerator::Config::StorageType::kDmabuf; + use_native_input_ = true; + } const media::VideoEncodeAccelerator::Config config( - media::PIXEL_FORMAT_I420, input_visible_size_, profile, bitrate * 1000, - base::nullopt, base::nullopt, base::nullopt, base::nullopt, + pixel_format, input_visible_size_, profile, bitrate * 1000, base::nullopt, + base::nullopt, base::nullopt, storage_type, video_content_type_ == webrtc::VideoContentType::SCREENSHARE ? media::VideoEncodeAccelerator::Config::ContentType::kDisplay : media::VideoEncodeAccelerator::Config::ContentType::kCamera); @@ -382,10 +412,10 @@ } // If there are no free input and output buffers, drop the frame to avoid a - // deadlock. If there is a free input buffer, EncodeOneFrame will run and - // unblock Encode(). If there are no free input buffers but there is a free - // output buffer, EncodeFrameFinished will be called later to unblock - // Encode(). + // deadlock. If there is a free input buffer and |use_native_input_| is false, + // EncodeOneFrame will run and unblock Encode(). If there are no free input + // buffers but there is a free output buffer, EncodeFrameFinished will be + // called later to unblock Encode(). // // The caller of Encode() holds a webrtc lock. The deadlock happens when: // (1) Encode() is waiting for the frame to be encoded in EncodeOneFrame(). @@ -399,7 +429,8 @@ // buffers. Returning an error in Encode() is not fatal and WebRTC will just // continue. If this is a key frame, WebRTC will request a key frame again. // Besides, webrtc will drop a frame if Encode() blocks too long. - if (input_buffers_free_.IsEmpty() && output_buffers_free_count_ == 0) { + if (!use_native_input_ && input_buffers_free_.IsEmpty() && + output_buffers_free_count_ == 0) { DVLOG(2) << "Run out of input and output buffers. Drop the frame."; SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_ERROR); return; @@ -407,6 +438,13 @@ input_next_frame_ = input_frame; input_next_frame_keyframe_ = force_keyframe; + // If |use_native_input_| is true, then we always queue the frame to the + // encoder since no intermediate buffer is needed in RTCVideoEncoder. + if (use_native_input_) { + EncodeOneFrameWithNativeInput(); + return; + } + if (!input_buffers_free_.IsEmpty()) EncodeOneFrame(); } @@ -757,9 +795,97 @@ SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK); } +void RTCVideoEncoder::Impl::EncodeOneFrameWithNativeInput() { + DVLOG(3) << "Impl::EncodeOneFrameWithNativeInput()"; + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(input_next_frame_); + + // EncodeOneFrameWithNativeInput() may re-enter EncodeFrameFinished() if + // VEA::Encode() fails, we receive a VEA::NotifyError(), and the + // media::VideoFrame we pass to Encode() gets destroyed early. Handle this by + // resetting our input_next_frame_* state before we hand off the VideoFrame to + // the VEA. + const webrtc::VideoFrame* next_frame = input_next_frame_; + const bool next_frame_keyframe = input_next_frame_keyframe_; + input_next_frame_ = nullptr; + input_next_frame_keyframe_ = false; + + if (!video_encoder_) { + SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_ERROR); + return; + } + + scoped_refptr<media::VideoFrame> frame; + if (next_frame->video_frame_buffer()->type() != + webrtc::VideoFrameBuffer::Type::kNative) { + // If we get a non-native frame it's because the video track is disabled and + // WebRTC VideoBroadcaster replaces the camera frame with a black YUV frame. + if (!black_gmb_frame_) { + gfx::Size natural_size(next_frame->width(), next_frame->height()); + CreateBlackGpuMemoryBufferFrame(natural_size); + } + frame = media::VideoFrame::WrapVideoFrame( + black_gmb_frame_, black_gmb_frame_->format(), + black_gmb_frame_->visible_rect(), black_gmb_frame_->natural_size()); + frame->set_timestamp( + base::TimeDelta::FromMilliseconds(next_frame->ntp_time_ms())); + } else { + frame = static_cast<blink::WebRtcVideoFrameAdapter*>( + next_frame->video_frame_buffer().get()) + ->getMediaVideoFrame(); + } + DCHECK_EQ(frame->storage_type(), + media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER); + + constexpr int kDummyIndex = -1; + frame->AddDestructionObserver(media::BindToCurrentLoop(base::BindOnce( + &RTCVideoEncoder::Impl::EncodeFrameFinished, this, kDummyIndex))); + if (!failed_timestamp_match_) { + DCHECK(std::find_if(pending_timestamps_.begin(), pending_timestamps_.end(), + [&frame](const RTCTimestamps& entry) { + return entry.media_timestamp_ == frame->timestamp(); + }) == pending_timestamps_.end()); + pending_timestamps_.emplace_back(frame->timestamp(), + next_frame->timestamp(), + next_frame->render_time_ms()); + } + video_encoder_->Encode(frame, next_frame_keyframe); + SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK); +} + +void RTCVideoEncoder::Impl::CreateBlackGpuMemoryBufferFrame( + const gfx::Size& natural_size) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + + auto gmb = gpu_factories_->CreateGpuMemoryBuffer( + natural_size, gfx::BufferFormat::YUV_420_BIPLANAR, + gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE); + + // Fills the NV12 frame with YUV black (0x00, 0x80, 0x80). + const auto gmb_size = gmb->GetSize(); + gmb->Map(); + memset(static_cast<uint8_t*>(gmb->memory(0)), 0x0, + gmb->stride(0) * gmb_size.height()); + memset(static_cast<uint8_t*>(gmb->memory(1)), 0x80, + gmb->stride(1) * gmb_size.height()); + gmb->Unmap(); + + gpu::MailboxHolder empty_mailboxes[media::VideoFrame::kMaxPlanes]; + black_gmb_frame_ = media::VideoFrame::WrapExternalGpuMemoryBuffer( + gfx::Rect(gmb_size), natural_size, std::move(gmb), empty_mailboxes, + base::NullCallback(), base::TimeDelta()); +} + void RTCVideoEncoder::Impl::EncodeFrameFinished(int index) { DVLOG(3) << "Impl::EncodeFrameFinished(): index=" << index; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + + if (use_native_input_) { + if (input_next_frame_) + EncodeOneFrameWithNativeInput(); + return; + } + DCHECK_GE(index, 0); DCHECK_LT(index, static_cast<int>(input_buffers_.size())); input_buffers_free_.push_back(index);
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem new file mode 100644 index 0000000..7575ac9 --- /dev/null +++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem
@@ -0,0 +1,2329 @@ +crbug.com/982194 accessibility/adjacent-continuations-cause-assertion-failure.html [ Failure ] +crbug.com/982194 accessibility/aom-focus-action.html [ Crash ] +crbug.com/982194 accessibility/aria-combo-box-with-delay-add.html [ Crash ] +crbug.com/982194 accessibility/aria-combo-box-with-delay.html [ Crash ] +crbug.com/982194 accessibility/aria-combo-box.html [ Crash ] +crbug.com/982194 accessibility/aria-tables.html [ Failure ] +crbug.com/982194 accessibility/aria1.1-combo-box-with-delay.html [ Crash ] +crbug.com/982194 accessibility/aria1.1-combo-box.html [ Crash ] +crbug.com/982194 accessibility/bounds-calc.html [ Failure ] +crbug.com/982194 accessibility/canvas-fallback-content-2.html [ Crash ] +crbug.com/982194 accessibility/canvas-fallback-content.html [ Crash ] +crbug.com/982194 accessibility/click-event.html [ Timeout ] +crbug.com/982194 accessibility/dimensions-include-descendants.html [ Failure ] +crbug.com/982194 accessibility/disabled-controls-not-focusable.html [ Crash ] +crbug.com/982194 accessibility/ellipsis-text.html [ Failure ] +crbug.com/982194 accessibility/first-letter-text-transform-causes-crash.html [ Failure ] +crbug.com/982194 accessibility/first-letter-text-transform.html [ Failure ] +crbug.com/982194 accessibility/get-selection-images.html [ Crash ] +crbug.com/982194 accessibility/inline-text-bounds-for-range.html [ Failure ] +crbug.com/982194 accessibility/inline-text-change-style.html [ Failure ] +crbug.com/982194 accessibility/inline-text-changes.html [ Failure ] +crbug.com/982194 accessibility/inline-text-word-boundaries.html [ Failure ] +crbug.com/982194 accessibility/label-for-control-hittest.html [ Failure ] +crbug.com/982194 accessibility/listitem-presentation-inherited.html [ Failure ] +crbug.com/982194 accessibility/menu-list-open.html [ Crash ] +crbug.com/982194 accessibility/presentation-owned-elements.html [ Failure ] +crbug.com/982194 accessibility/role-attribute.html [ Failure ] +crbug.com/982194 accessibility/selection-affinity.html [ Failure ] +crbug.com/982194 accessibility/selection-change-notification-aria-textbox.html [ Crash ] +crbug.com/982194 accessibility/selection-change-notification-input.html [ Crash ] +crbug.com/982194 accessibility/selection-change-notification-statictext.html [ Crash ] +crbug.com/982194 accessibility/selection-change-notification-textarea.html [ Crash ] +crbug.com/982194 accessibility/selection-dom-events.html [ Crash ] +crbug.com/982194 accessibility/set-selection-child-offset.html [ Crash ] +crbug.com/982194 accessibility/set-selection-images.html [ Crash ] +crbug.com/982194 accessibility/set-selection-link.html [ Crash ] +crbug.com/982194 accessibility/table-header-column-row.html [ Failure ] +crbug.com/982194 accessibility/table-with-empty-thead-causes-crash.html [ Failure ] +crbug.com/982194 animations/inline-transform.html [ Failure ] +crbug.com/982194 animations/rotate-transform-equivalent.html [ Failure ] +crbug.com/982194 compositing/flex-composited-animated-table-row-background.html [ Failure ] +crbug.com/982194 compositing/geometry/fixed-in-composited.html [ Failure ] +crbug.com/982194 compositing/geometry/foreground-offset-change.html [ Failure ] +crbug.com/982194 compositing/geometry/limit-layer-bounds-opacity-transition.html [ Failure ] +crbug.com/982194 compositing/geometry/limit-layer-bounds-positioned.html [ Failure ] +crbug.com/982194 compositing/geometry/outline-change.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited-scrolled-late-noncomposite.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited-scrolled.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-composited-scrolled.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-composited.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-form-input-text.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-transformed.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-img.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline-squashing.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-pixel-transparent.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-background.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-cancel.html [ Failure ] +crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Failure Crash ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-margin.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-multi-line.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-nested.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-window-scroll.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-filter.html [ Failure ] +crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-squashing.html [ Failure ] +crbug.com/982194 compositing/iframes/crash-mouse-event.html [ Crash ] +crbug.com/982194 compositing/iframes/invisible-nested-iframe-hide.html [ Crash ] +crbug.com/982194 compositing/iframes/invisible-nested-iframe-show.html [ Crash ] +crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Crash ] +crbug.com/982194 compositing/layer-creation/fixed-position-out-of-view-positioning.html [ Crash ] +crbug.com/982194 compositing/overflow/ancestor-overflow.html [ Failure ] +crbug.com/982194 compositing/overflow/get-transform-from-non-box-container.html [ Failure ] +crbug.com/982194 compositing/overflow/overflow-scroll-with-negative-offset-translucent-outline.html [ Failure ] +crbug.com/982194 compositing/overflow/scroll-children-do-not-paint-comp-scroll-phase.html [ Failure ] +crbug.com/982194 compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Crash ] +crbug.com/982194 compositing/reflections/nested-reflection-animated.html [ Failure ] +crbug.com/982194 compositing/reflections/remove-reflection.html [ Crash ] +crbug.com/982194 compositing/squashing/no-squashing-into-another-clip-layer.html [ Failure ] +crbug.com/982194 compositing/squashing/selection-repaint-with-gaps.html [ Crash ] +crbug.com/982194 compositing/squashing/squash-above-fixed-2.html [ Crash ] +crbug.com/982194 compositing/squashing/squash-transform-repainting-child.html [ Failure ] +crbug.com/982194 compositing/squashing/squash-transform-repainting-transformed-child.html [ Failure ] +crbug.com/982194 compositing/squashing/vertical-writing-mode-squashed.html [ Failure ] +crbug.com/982194 compositing/video/video-neg-offset-outline.html [ Failure ] +crbug.com/982194 css1/basic/containment.html [ Failure ] +crbug.com/982194 css1/basic/contextual_selectors.html [ Failure ] +crbug.com/982194 css1/basic/id_as_selector.html [ Failure ] +crbug.com/982194 css1/box_properties/acid_test.html [ Failure ] +crbug.com/982194 css1/box_properties/border_bottom.html [ Failure ] +crbug.com/982194 css1/box_properties/border_left.html [ Failure ] +crbug.com/982194 css1/box_properties/border_right_inline.html [ Failure ] +crbug.com/982194 css1/box_properties/border_top.html [ Failure ] +crbug.com/982194 css1/box_properties/clear.html [ Failure ] +crbug.com/982194 css1/box_properties/clear_float.html [ Failure ] +crbug.com/982194 css1/box_properties/float_margin.html [ Failure ] +crbug.com/982194 css1/box_properties/float_on_text_elements.html [ Failure ] +crbug.com/982194 css1/box_properties/margin_left.html [ Failure ] +crbug.com/982194 css1/box_properties/margin_right.html [ Failure ] +crbug.com/982194 css1/box_properties/padding_left.html [ Failure ] +crbug.com/982194 css1/box_properties/padding_right.html [ Failure ] +crbug.com/982194 css1/cascade/cascade_order.html [ Failure ] +crbug.com/982194 css1/classification/display.html [ Failure ] +crbug.com/982194 css1/classification/list_style.html [ Failure ] +crbug.com/982194 css1/classification/list_style_image.html [ Failure ] +crbug.com/982194 css1/classification/list_style_position.html [ Failure ] +crbug.com/982194 css1/classification/list_style_type.html [ Failure ] +crbug.com/982194 css1/formatting_model/floating_elements.html [ Failure ] +crbug.com/982194 css1/formatting_model/inline_elements.html [ Failure ] +crbug.com/982194 css1/pseudo/anchor.html [ Failure ] +crbug.com/982194 css2.1/t040105-atkeyw-00-b.html [ Failure ] +crbug.com/982194 css2.1/t040105-import-10-b.html [ Failure ] +crbug.com/982194 css2.1/t0402-c71-fwd-parsing-02-f.html [ Failure ] +crbug.com/982194 css2.1/t040304-c64-uri-00-a-g.html [ Failure ] +crbug.com/982194 css2.1/t0505-c16-descendant-01-e.html [ Failure ] +crbug.com/982194 css2.1/t050803-c14-classes-00-e.html [ Failure ] +crbug.com/982194 css2.1/t0509-c15-ids-01-e.html [ Failure ] +crbug.com/982194 css2.1/t0510-c25-pseudo-elmnt-00-c.html [ Failure ] +crbug.com/982194 css2.1/t0603-c11-import-00-b.html [ Failure ] +crbug.com/982194 css2.1/t0805-c5518-brdr-t-01-e.html [ Failure ] +crbug.com/982194 css2.1/t0805-c5519-brdr-r-02-e.html [ Failure ] +crbug.com/982194 css2.1/t0805-c5520-brdr-b-01-e.html [ Failure ] +crbug.com/982194 css2.1/t0805-c5521-brdr-l-02-e.html [ Failure ] +crbug.com/982194 css2.1/t09-c5526c-display-00-e.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-00-d.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-01-d-g.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-02-c.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-03-c.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-04-c.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-fit-00-d.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-fit-01-d-g.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-wrap-00-e.html [ Failure ] +crbug.com/982194 css2.1/t0905-c414-flt-wrap-01-d-g.html [ Failure ] +crbug.com/982194 css2.1/t0905-c5525-fltcont-00-d-g.html [ Failure ] +crbug.com/982194 css2.1/t0905-c5525-fltinln-00-c-ag.html [ Failure ] +crbug.com/982194 css2.1/t0905-c5525-fltmrgn-00-c-ag.html [ Failure ] +crbug.com/982194 css2.1/t0905-c5525-fltwidth-01-c-g.html [ Failure ] +crbug.com/982194 css2.1/t0905-c5525-fltwidth-02-c-g.html [ Failure ] +crbug.com/982194 css2.1/t0905-c5525-fltwidth-03-c-g.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-00-d.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-01-b.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-02-d-g.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-03-b-g.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-ln-00-d.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-ln-01-d-g.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-ln-02-d.html [ Failure ] +crbug.com/982194 css2.1/t090501-c414-flt-ln-03-d.html [ Failure ] +crbug.com/982194 css2.1/t090501-c5525-flt-l-00-b-g.html [ Failure ] +crbug.com/982194 css2.1/t090501-c5525-flt-r-00-b-g.html [ Failure ] +crbug.com/982194 css2.1/t100801-c544-valgn-00-a-ag.html [ Failure ] +crbug.com/982194 css2.1/t100801-c544-valgn-03-d-agi.html [ Failure ] +crbug.com/982194 css2.1/t1205-c563-list-type-00-b.html [ Failure ] +crbug.com/982194 css2.1/t1205-c563-list-type-01-b.html [ Failure ] +crbug.com/982194 css2.1/t1205-c564-list-img-00-b-g.html [ Failure ] +crbug.com/982194 css2.1/20110323/at-import-006.htm [ Failure ] +crbug.com/982194 css2.1/20110323/eof-005.htm [ Failure ] +crbug.com/982194 css2.1/20110323/height-applies-to-010a.htm [ Failure ] +crbug.com/982194 css2.1/20110323/margin-applies-to-010.htm [ Failure ] +crbug.com/982194 css2.1/20110323/outline-color-001.htm [ Failure ] +crbug.com/982194 css2.1/20110323/outline-color-applies-to-007.htm [ Failure ] +crbug.com/982194 css2.1/20110323/outline-color-applies-to-008.htm [ Failure ] +crbug.com/982194 css2.1/20110323/outline-color-applies-to-009.htm [ Failure ] +crbug.com/982194 css2.1/20110323/outline-color-applies-to-012.htm [ Failure ] +crbug.com/982194 css2.1/20110323/outline-color-applies-to-015.htm [ Failure ] +crbug.com/982194 css2.1/20110323/overflow-applies-to-013.htm [ Failure ] +crbug.com/982194 css2.1/20110323/overflow-applies-to-014.htm [ Failure ] +crbug.com/982194 css3/tab-size-complex-path.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-crossfade-image-gradient.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-gif-color.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-gradient-color.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-gradient-gradient.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-gradient-image.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-image-color.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-image-image.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-image-svg.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-svg-color.html [ Failure ] +crbug.com/982194 css3/blending/background-blend-mode-tiled-gradient.html [ Failure ] +crbug.com/982194 css3/blending/effect-background-blend-mode-stacking.html [ Failure ] +crbug.com/982194 css3/blending/effect-background-blend-mode-tiled.html [ Failure ] +crbug.com/982194 css3/blending/effect-background-blend-mode.html [ Failure ] +crbug.com/982194 css3/blending/mix-blend-mode-has-ancestor-clipping-layer.html [ Failure ] +crbug.com/982194 css3/blending/mix-blend-mode-simple-text.html [ Failure ] +crbug.com/982194 css3/blending/mix-blend-mode-simple.html [ Failure ] +crbug.com/982194 css3/filters/filter-region.html [ Failure ] +crbug.com/982194 css3/filters/filtered-inline.html [ Failure ] +crbug.com/982194 css3/filters/nested-filters.html [ Failure ] +crbug.com/982194 css3/filters/null-effect-check.html [ Failure ] +crbug.com/982194 css3/flexbox/flexbox-baseline-margins.html [ Failure ] +crbug.com/982194 css3/flexbox/flexbox-baseline.html [ Failure ] +crbug.com/982194 css3/flexbox/multiline-shrink-to-fit.html [ Failure ] +crbug.com/982194 css3/flexbox/percentage-height-replaced-element.html [ Failure ] +crbug.com/982194 css3/masking/clip-path-reference-box-inline.html [ Failure ] +crbug.com/982194 css3/masking/clip-path-selection.html [ Crash ] +crbug.com/982194 css3/masking/inline-in-vertical-rl.html [ Failure ] +crbug.com/982194 css3/masking/mask-not-clipped.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-1.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-13.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-15.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-167.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-167a.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-22.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-28.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-28b.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-29.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-29b.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-38.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-3a.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-73.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-73b.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-74.html [ Failure ] +crbug.com/982194 css3/selectors3/html/css3-modsel-74b.html [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-1.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-13.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-15.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-167.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-167a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-22.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-28.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-28b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-29.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-29b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-3.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-38.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-3a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-73.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-73b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-74.xml [ Failure ] +crbug.com/982194 css3/selectors3/xhtml/css3-modsel-74b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-1.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-13.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-14.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-14c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-14d.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-14e.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-15.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-15b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-15c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-167.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-167a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-170.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-170a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-170b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-170c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-171.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-175a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-175c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-176.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-177b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-181.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-182.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-183.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184d.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184e.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-184f.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-18c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-22.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-27b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-28.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-28b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-29.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-29b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-3.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-35.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-38.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-3a.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-44c.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-47.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-51.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-52.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-53.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-54.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-55.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-56.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-59.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-60.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-64.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-73.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-73b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-74.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-74b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-80.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-86.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-87.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-87b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-88b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-89.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-90.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-90b.xml [ Failure ] +crbug.com/982194 css3/selectors3/xml/css3-modsel-d4.xml [ Failure ] +crbug.com/982194 custom-elements/form-validation-bubble-anchor.html [ Crash ] +crbug.com/982194 custom-elements/form-validation-bubble-appearance.html [ Failure ] +crbug.com/982194 dom/node/mutation-blur.html [ Crash ] +crbug.com/982194 editing/assert_selection.html [ Crash ] +crbug.com/982194 editing/caret/caret-direction-auto.html [ Crash ] +crbug.com/982194 editing/caret/caret_affinity_mouse_perturbation.html [ Crash ] +crbug.com/982194 editing/caret/selection-with-caret-type-progress.html [ Crash ] +crbug.com/982194 editing/deleting/460938.html [ Crash ] +crbug.com/982194 editing/deleting/delete-all-text-in-text-field-assertion.html [ Crash ] +crbug.com/982194 editing/deleting/delete-character-002.html [ Crash ] +crbug.com/982194 editing/deleting/delete-ligature-001.html [ Crash ] +crbug.com/982194 editing/deleting/move-nodes-001.html [ Failure ] +crbug.com/982194 editing/deleting/password-delete-contents.html [ Crash ] +crbug.com/982194 editing/execCommand/35791.html [ Crash ] +crbug.com/982194 editing/execCommand/clipboard-access-with-userGesture.html [ Crash ] +crbug.com/982194 editing/execCommand/delete-hidden-crash.html [ Crash ] +crbug.com/982194 editing/execCommand/delete-textarea-readonly-removed.html [ Crash ] +crbug.com/982194 editing/execCommand/dispatch-text-event-crash.html [ Crash ] +crbug.com/982194 editing/execCommand/findString-3.html [ Crash ] +crbug.com/982194 editing/execCommand/findString-diacriticals.html [ Crash ] +crbug.com/982194 editing/execCommand/insertNewLineInQuotedContent-outside-quote.html [ Crash ] +crbug.com/982194 editing/execCommand/queryCommandState-list.html [ Crash ] +crbug.com/982194 editing/input/div-first-child-rule-input.html [ Crash ] +crbug.com/982194 editing/input/div-first-child-rule-textarea.html [ Crash ] +crbug.com/982194 editing/input/editable-container-with-word-wrap-normal.html [ Crash ] +crbug.com/982194 editing/input/insert-wrapping-space-in-textarea.html [ Crash ] +crbug.com/982194 editing/input/keyboard-ctrl-enter-no-newline.html [ Crash ] +crbug.com/982194 editing/input/paste-text-ending-with-interchange-newline.html [ Crash ] +crbug.com/982194 editing/input/reveal-caret-of-transformed-input-scrollable-parent.html [ Crash ] +crbug.com/982194 editing/input/scroll-with-tab-to-input-regression.html [ Crash ] +crbug.com/982194 editing/input/setting-input-value-cancel-ime-composition.html [ Crash ] +crbug.com/982194 editing/input/textcontrol-doubleclick-at-end.html [ Crash ] +crbug.com/982194 editing/inserting/insert-character-in-overflow-crash.html [ Crash ] +crbug.com/982194 editing/inserting/insert-newline-into-dynamically-created-textarea.html [ Crash ] +crbug.com/982194 editing/inserting/insert-paragraph-empty-textarea.html [ Crash ] +crbug.com/982194 editing/inserting/insert-paragraph-selection-outside-contenteditable.html [ Crash ] +crbug.com/982194 editing/pasteboard/copy-crash.html [ Timeout ] +crbug.com/982194 editing/pasteboard/copy-cut-paste-keyevent.html [ Crash ] +crbug.com/982194 editing/pasteboard/copy-display-none.html [ Crash ] +crbug.com/982194 editing/pasteboard/copy-paste-white-space.html [ Crash ] +crbug.com/982194 editing/pasteboard/copy-summary-crash.html [ Crash ] +crbug.com/982194 editing/pasteboard/data-transfer-items-drag-drop-string.html [ Crash ] +crbug.com/663585 editing/pasteboard/data-transfer-items-image-png.html [ Pass Failure Crash ] +crbug.com/982194 editing/pasteboard/dataTransfer-setData-getData.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-copy-text.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-dead-frame.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-input-textarea.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-modifies-page.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-to-data-url.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-url-text.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-drop-url-with-style.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-image-in-about-blank-frame.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-image-to-contenteditable-in-iframe.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-list-item.html [ Crash ] +crbug.com/982194 editing/pasteboard/drag-prioritizes-draggable-container-over-image.html [ Crash ] +crbug.com/982194 editing/pasteboard/dragstart-contains-default-content.html [ Crash ] +crbug.com/982194 editing/pasteboard/drop-file-svg.html [ Timeout ] +crbug.com/982194 editing/pasteboard/drop-text-without-selection.html [ Crash ] +crbug.com/982194 editing/pasteboard/file-input-files-access.html [ Failure ] +crbug.com/982194 editing/pasteboard/files-during-page-drags.html [ Crash ] +crbug.com/982194 editing/pasteboard/mixed_editability.html [ Crash ] +crbug.com/982194 editing/pasteboard/no-clipboard-event-to-hidden-selection.html [ Crash ] +crbug.com/982194 editing/pasteboard/onpaste-text-html-types.html [ Crash ] +crbug.com/982194 editing/pasteboard/paste-plaintext-user-select-none.html [ Crash ] +crbug.com/982194 editing/pasteboard/paste-when-over-link.html [ Crash ] +crbug.com/982194 editing/pasteboard/paste-xml.xhtml [ Crash ] +crbug.com/982194 editing/pasteboard/pasteboard_with_unfocused_selection.html [ Crash ] +crbug.com/982194 editing/pasteboard/selection-paste-crash.html [ Crash ] +crbug.com/982194 editing/pasteboard/smart-drag-drop.html [ Crash ] +crbug.com/982194 editing/pasteboard/smart-paste-in-text-control.html [ Crash ] +crbug.com/982194 editing/pasteboard/smart_paste.html [ Crash ] +crbug.com/982194 editing/pasteboard/subframe-dragndrop-1.html [ Crash ] +crbug.com/982194 editing/pasteboard/text-selection.html [ Crash ] +crbug.com/982194 editing/selection/4402375.html [ Crash ] +crbug.com/982194 editing/selection/5131716-1.html [ Crash ] +crbug.com/982194 editing/selection/5136696.html [ Crash ] +crbug.com/982194 editing/selection/5209984.html [ Crash ] +crbug.com/982194 editing/selection/5232159.html [ Crash ] +crbug.com/982194 editing/selection/5354455-1.html [ Crash ] +crbug.com/982194 editing/selection/5714333.html [ Crash ] +crbug.com/982194 editing/selection/addRange-failures.html [ Crash ] +crbug.com/982194 editing/selection/addrange-crash.html [ Crash ] +crbug.com/982194 editing/selection/anchor-focus3.html [ Crash ] +crbug.com/982194 editing/selection/button-right-click.html [ Crash ] +crbug.com/982194 editing/selection/clear-selection.html [ Failure ] +crbug.com/982194 editing/selection/click-in-focusable-link-should-not-clear-selection.html [ Crash ] +crbug.com/982194 editing/selection/click-in-padding-with-multiple-line-boxes.html [ Crash ] +crbug.com/982194 editing/selection/click-on-anonymous-content-crash.html [ Crash ] +crbug.com/982194 editing/selection/collapseto_in_text_fields.html [ Crash ] +crbug.com/982194 editing/selection/commit-pending-selection-crash.html [ Crash ] +crbug.com/982194 editing/selection/containsNode.html [ Crash ] +crbug.com/982194 editing/selection/context-menu-on-text.html [ Crash ] +crbug.com/982194 editing/selection/context-menu-text-selection.html [ Crash ] +crbug.com/982194 editing/selection/continuations-with-move-caret-to-boundary.html [ Crash ] +crbug.com/982194 editing/selection/delete-word-granularity-text-control.html [ Crash ] +crbug.com/982194 editing/selection/deleteFromDocument-scoped-dispatch-event-crash.html [ Crash ] +crbug.com/982194 editing/selection/deletefromdocument-shadow-leak.html [ Crash ] +crbug.com/982194 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Crash ] +crbug.com/982194 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping.html [ Crash ] +crbug.com/982194 editing/selection/double_click_and_modify.html [ Crash ] +crbug.com/982194 editing/selection/doubleclick-whitespace-crash.html [ Crash ] +crbug.com/982194 editing/selection/doubleclick-whitespace-img-crash.html [ Crash ] +crbug.com/982194 editing/selection/doubleclick-whitespace.html [ Crash ] +crbug.com/982194 editing/selection/drag-drop-events.html [ Crash ] +crbug.com/982194 editing/selection/drag-drop-restore.html [ Crash ] +crbug.com/982194 editing/selection/drag-input-text-nested-in-draggable-element.html [ Failure ] +crbug.com/982194 editing/selection/drag-select-rapidly.html [ Crash ] +crbug.com/982194 editing/selection/drag-selection-nodes.html [ Crash ] +crbug.com/982194 editing/selection/drag-text-delay.html [ Crash ] +crbug.com/982194 editing/selection/drag-to-contenteditable-iframe.html [ Crash ] +crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Crash ] +crbug.com/982194 editing/selection/extend-by-line-anonymous-content-crash.html [ Crash ] +crbug.com/982194 editing/selection/extend-by-line-in-empty-document.html [ Crash ] +crbug.com/982194 editing/selection/extend-by-sentence-002.html [ Crash ] +crbug.com/982194 editing/selection/extend-over-file-input-by-drag-crash.html [ Crash ] +crbug.com/982194 editing/selection/extend-selection-after-double-click.html [ Crash ] +crbug.com/982194 editing/selection/extend.html [ Crash ] +crbug.com/982194 editing/selection/first-letter-mouse-select-full-text.html [ Crash ] +crbug.com/982194 editing/selection/first-letter-selection-crash.html [ Crash ] +crbug.com/982194 editing/selection/firstRect-crash.html [ Crash ] +crbug.com/982194 editing/selection/focus-and-display-none.html [ Crash ] +crbug.com/982194 editing/selection/focus-crash.html [ Crash ] +crbug.com/982194 editing/selection/home-inside-noneditable-table.html [ Crash ] +crbug.com/982194 editing/selection/inline-closest-leaf-child.html [ Crash ] +crbug.com/982194 editing/selection/japanese-lr-selection.html [ Crash ] +crbug.com/982194 editing/selection/last-empty-inline.html [ Crash ] +crbug.com/982194 editing/selection/legal-positions.html [ Crash ] +crbug.com/982194 editing/selection/line-wrap-1.html [ Crash ] +crbug.com/982194 editing/selection/line-wrap-2.html [ Crash ] +crbug.com/982194 editing/selection/longpress-selection-in-iframe-removed-crash.html [ Crash ] +crbug.com/982194 editing/selection/mixed-editability-10.html [ Crash ] +crbug.com/982194 editing/selection/modify-crash.html [ Crash ] +crbug.com/982194 editing/selection/move-into-empty-root-inline-box.html [ Crash ] +crbug.com/982194 editing/selection/move-node-in-selection-crash.html [ Crash ] +crbug.com/982194 editing/selection/move-paragraph-document-edges.html [ Crash ] +crbug.com/982194 editing/selection/offset-from-point-complex-scripts.html [ Failure ] +crbug.com/982194 editing/selection/offset-from-point.html [ Failure ] +crbug.com/591099 editing/selection/paint-hyphen.html [ Pass Failure Crash ] +crbug.com/982194 editing/selection/range-between-block-and-inline.html [ Crash ] +crbug.com/982194 editing/selection/readonly-disabled-hittest.html [ Crash ] +crbug.com/982194 editing/selection/readonly-disabled-text-selection.html [ Crash ] +crbug.com/982194 editing/selection/root-inlinebox-selected-children-crash.html [ Crash ] +crbug.com/982194 editing/selection/select-crash-001.html [ Crash ] +crbug.com/982194 editing/selection/select-crash-002.html [ Crash ] +crbug.com/982194 editing/selection/select-from-textfield-outwards.html [ Failure ] +crbug.com/982194 editing/selection/select-line-break-with-opposite-directionality.html [ Crash ] +crbug.com/982194 editing/selection/select-out-of-floated-contenteditable.html [ Crash ] +crbug.com/982194 editing/selection/select-out-of-floated-textarea.html [ Crash ] +crbug.com/982194 editing/selection/select-text-overflow-ellipsis-mixed-in-ltr.html [ Crash ] +crbug.com/982194 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2.html [ Crash ] +crbug.com/982194 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Crash ] +crbug.com/982194 editing/selection/select-text-overflow-ellipsis.html [ Crash ] +crbug.com/982194 editing/selection/selectNode.html [ Failure ] +crbug.com/982194 editing/selection/selectNodeContents.html [ Failure ] +crbug.com/982194 editing/selection/selectallchildren-crash.html [ Crash ] +crbug.com/982194 editing/selection/selection-after-split-text-node.html [ Crash ] +crbug.com/982194 editing/selection/selection-after-text-normalize.html [ Crash ] +crbug.com/982194 editing/selection/selection-background.html [ Crash ] +crbug.com/982194 editing/selection/selection-button-text.html [ Crash ] +crbug.com/982194 editing/selection/selection-exceptions.html [ Crash ] +crbug.com/982194 editing/selection/selection-modify-crash.html [ Crash ] +crbug.com/982194 editing/selection/shift-click.html [ Crash ] +crbug.com/982194 editing/selection/table-element-crash.html [ Crash ] +crbug.com/982194 editing/selection/thai-word-at-document-end.html [ Crash ] +crbug.com/982194 editing/selection/toString.html [ Crash ] +crbug.com/982194 editing/selection/transformed-selection-rects.html [ Crash ] +crbug.com/982194 editing/selection/undo-crash.html [ Crash ] +crbug.com/982194 editing/selection/user-select-all-with-shift.html [ Crash ] +crbug.com/982194 editing/selection/vertical-lr-replaced-selection.html [ Crash ] +crbug.com/982194 editing/selection/vertical-rl-replaced-selection.html [ Crash ] +crbug.com/982194 editing/selection/word-granularity.html [ Crash ] +crbug.com/982194 editing/selection/modify_extend/extend_by_word_002.html [ Crash ] +crbug.com/982194 editing/selection/modify_extend/extend_forward_line_crash.html [ Crash ] +crbug.com/245154 editing/selection/modify_move/move-by-character-brute-force.html [ Timeout Crash ] +crbug.com/982194 editing/selection/modify_move/move-by-word-visually-crash-test-1.html [ Crash ] +crbug.com/982194 editing/selection/modify_move/move-by-word-visually-crash-test-4.html [ Crash ] +crbug.com/24182 editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Timeout Crash ] +crbug.com/982194 editing/selection/modify_move/move_backward_line_import_crash.html [ Crash ] +crbug.com/982194 editing/selection/modify_move/move_by_sentence_boundary.html [ Crash ] +crbug.com/982194 editing/selection/modify_move/move_by_word_with_underscore.html [ Crash ] +crbug.com/982194 editing/selection/modify_move/move_page_down_inline_block_hang.html [ Crash ] +crbug.com/982194 editing/selection/mouse/click-left-of-rtl-wrapping-text.html [ Crash ] +crbug.com/982194 editing/selection/mouse/click-user-select-all-contenteditable.html [ Crash ] +crbug.com/982194 editing/selection/mouse/click-user-select-all-textarea.html [ Crash ] +crbug.com/982194 editing/selection/mouse/doubleclick-inline-first-last-contenteditable.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag-selects-culled-inlines.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag-user-select-all-textarea.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag_focus_node.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag_over_text_transform.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag_selects_bidi_image.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag_selects_rtl_inline_block.html [ Crash ] +crbug.com/982194 editing/selection/mouse/drag_user_select_none.html [ Crash ] +crbug.com/982194 editing/selection/mouse/expanding-selections.html [ Crash ] +crbug.com/982194 editing/selection/mouse/extend_by_word_with_base_is_end.html [ Crash ] +crbug.com/982194 editing/selection/mouse/mouse-selection-horizontal.html [ Crash ] +crbug.com/982194 editing/selection/mouse/mouse-selection-vertical-rl.html [ Crash ] +crbug.com/982194 editing/selection/mouse/overidden_user_select_in_dom_tree.html [ Failure ] +crbug.com/982194 editing/selection/mouse/overriden_user_select_in_shadow_tree.html [ Failure ] +crbug.com/982194 editing/selection/mouse/select_across_readonly_input.html [ Crash ] +crbug.com/982194 editing/selection/mouse/user-drag-element-and-user-select-none.html [ Failure ] +crbug.com/982194 editing/selection/select_all/select_all_details_crash.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_iframe.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_iframe_crash.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_in_contenteditable.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_readonly_textarea.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_textarea.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_user_select_none.html [ Crash ] +crbug.com/982194 editing/selection/select_all/select_all_with_unfocused_selection.html [ Crash ] +crbug.com/982194 editing/selection/set_base_and_extent/set_null.html [ Crash ] +crbug.com/982194 editing/selection/user-select/user-select-all.html [ Crash ] +crbug.com/982194 editing/shadow/505092-fieldset-is-not-ua-shadow-crash.html [ Crash ] +crbug.com/982194 editing/shadow/compare-positions-in-nested-shadow.html [ Crash ] +crbug.com/982194 editing/shadow/selection-across-shadows.html [ Crash ] +crbug.com/982194 editing/shadow/selection-after-remove-children.html [ Crash ] +crbug.com/982194 editing/shadow/selection-rangecount.html [ Crash ] +crbug.com/982194 editing/shadow/selection-shadow-mouse-drag.html [ Crash ] +crbug.com/982194 editing/shadow/shadow-selection-not-exported.html [ Crash ] +crbug.com/982194 editing/spelling/right-click-no-renderer-crash.html [ Crash ] +crbug.com/982194 editing/spelling/spellcheck-async-mutation.html [ Crash ] +crbug.com/982194 editing/spelling/spellcheck-input-search-crash.html [ Crash ] +crbug.com/982194 editing/spelling/spelling-changed-text.html [ Crash ] +crbug.com/982194 editing/style/apply-style-crash2.html [ Crash ] +crbug.com/982194 editing/style/text-indent.html [ Crash ] +crbug.com/982194 editing/text-iterator/backward-textiterator-first-letter-crash.html [ Crash ] +crbug.com/982194 editing/text-iterator/findString-restarts-at-last-position.html [ Crash ] +crbug.com/982194 editing/text-iterator/findString-selection-disabled.html [ Crash ] +crbug.com/982194 editing/text-iterator/findString-start-search-after-selection.html [ Crash ] +crbug.com/982194 editing/text-iterator/first_letter_find_string_crash.html [ Crash ] +crbug.com/982194 editing/text-iterator/selection-to-string-with-auto-fill.html [ Crash ] +crbug.com/982194 external/wpt/2dcontext/transformations/canvas_transformations_reset_001.html [ Failure ] +crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-002.html [ Crash ] +crbug.com/982194 external/wpt/contacts/contacts-select.https.window.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-004.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-5.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-001.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-002.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/intrinsic-size-float-and-line.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/new-fc-beside-adjoining-float-2.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/new-fc-beside-adjoining-float.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/new-fc-separates-from-float.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats/remove-block-between-inline-and-float.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/adjacent-floats-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/adjoining-float-before-clearance.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-float-006.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-float-008.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-float-009.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-inline-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/float-applies-to-009.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/float-non-replaced-height-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-004.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-009.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-029.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-030.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-031.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-040.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-114.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-122.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-123.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-124.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-133.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-134.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-136.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-139.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-141.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-144.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-146.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-004.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-013.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-015.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-016.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-027.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-035.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-037.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-038.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-046.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-049.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-057.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-068.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-070.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-082.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-090.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-092.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-093.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-103.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-104.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-129.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-bleed-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-bleed-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001g.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002i.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/blocks-013.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-004.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-013.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-015.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-023.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-026.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-027.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-034.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-035.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-037.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-038.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-045.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-049.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-067.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-068.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-070.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-078.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-081.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-082.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-090.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-092.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-093.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/inline-non-replaced-width-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/inline-non-replaced-width-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/inlines-013.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-005.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-013.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-016.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-037.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-038.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-057.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-059.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-060.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-068.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-070.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-079.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-090.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-092.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-012.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-026.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-027.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-038.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-045.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-056.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-059.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-070.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-071.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-078.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-082.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-089.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-092.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-100.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-101.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-008.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-027.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-028.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-032.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/positioning-float-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/positioning-float-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/text/bidi-span-002.html [ Failure ] +crbug.com/982194 external/wpt/css/CSS2/text/text-align-white-space-006.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-align/baseline-of-scrollable-1b.html [ Failure ] +crbug.com/982194 external/wpt/css/css-backgrounds/background-image-first-line.html [ Failure ] +crbug.com/982194 external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure ] +crbug.com/982194 external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Failure ] +crbug.com/982194 external/wpt/css/css-cascade/all-prop-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-011.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-012.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-024.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-047.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-cell-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-011.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-013.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-paint-table-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-contain/contain-size-056.html [ Failure ] +crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-none.html [ Failure ] +crbug.com/982194 external/wpt/css/css-display/display-contents-flex-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-display/display-contents-flex-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-display/display-contents-shadow-dom-1.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/css-flexbox-column-reverse-wrap-reverse.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/css-flexbox-column.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-flexitem-percentage-prescation.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-flow-010.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-vertical-align-effect.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-self-stretch.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-variable-zero-basis.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-none.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_nested-flex.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flexbox_order-abspos-space-around.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/percentage-heights-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/scrollbars-auto.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure ] +crbug.com/982194 external/wpt/css/css-flexbox/order/order-with-row-reverse.html [ Failure ] +crbug.com/982194 external/wpt/css/css-fonts/font-display/font-display.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-007.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-definition/fr-unit-with-percentage.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-auto-tracks.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-basic.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-inline-z-axis-ordering-overlapped-items-006.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-layout-z-order-b.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-first-letter-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-letter-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-letter-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-line-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-line-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-margins-no-collapse-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/placement/grid-layout-lines-shorthands.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/placement/grid-layout-lines.html [ Failure ] +crbug.com/982194 external/wpt/css/css-grid/placement/grid-layout-placement-shorthands.html [ Failure ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-fill-auto-001.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-list-item-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-overflow/overflow-inline-transform-relative.html [ Failure ] +crbug.com/982194 external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ] +crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-floats-004.html [ Failure ] +crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-position/position-sticky-input-box-gets-focused-after-scroll.html [ Crash ] +crbug.com/982194 external/wpt/css/css-position/position-sticky-writing-modes.html [ Failure ] +crbug.com/982194 external/wpt/css/css-position/static-position/htb-rtl-rtl.html [ Failure ] +crbug.com/982194 external/wpt/css/css-pseudo/first-letter-opacity-float-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ] +crbug.com/982194 external/wpt/css/css-scroll-anchoring/start-edge-in-block-layout-direction.html [ Failure ] +crbug.com/982194 external/wpt/css/css-scroll-anchoring/wrapped-text.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-005.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-007.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-008.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-014.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-016.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-017.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-022.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-010.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-012.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-014.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-016.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-017.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-018.html [ Failure ] +crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-019.html [ Failure ] +crbug.com/982194 external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-in-loose.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/line-break/line-break-anywhere-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-015.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-atomic-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-atomic-005.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-replaced-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-cluster-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/shaping/shaping-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/shaping/shaping-004.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/shaping/shaping-005.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/shaping/shaping-007.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/shaping/shaping_lig-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/text-align/text-align-last-empty-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/text-encoding/shaping-tatweel-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-shaping-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/white-space/seg-break-transformation-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-004.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-keep-all-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-keep-all-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-en-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-hi-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-ja-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-ja-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-ja-004.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-km-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-th-000.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-002.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-010.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-011.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-019.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-020.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-022.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-style-013.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/outline-style-014.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-012.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-020.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-027.html [ Failure ] +crbug.com/982194 external/wpt/css/css-ui/text-overflow-029.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-006.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-042.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-060.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-066.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-084.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-090.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-106.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-162.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-170.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-194.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-202.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-embed-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-embed-005.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-embed-009.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-isolate-override-009.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-normal-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-normal-004.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-normal-008.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-override-005.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-override-009.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-005.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-009.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-011.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-unset-008.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/bidi-unset-009.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/block-embed-001.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/block-embed-003.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/block-flow-direction-vrl-005.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/float-contiguous-vlr-007.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/float-lft-orthog-htb-in-vrl-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/float-vlr-005.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/float-vlr-007.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/float-vlr-013.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/float-vrl-010.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/horizontal-rule-vrl-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/line-box-direction-vlr-008.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/line-box-direction-vrl-005.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/line-box-direction-vrl-006.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/line-box-height-vlr-023.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/normal-flow-overconstrained-vrl-004.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001e.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001h.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001j.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001l.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001n.html [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/overconstrained-rel-pos-ltr-top-bottom-vrl-002.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/overconstrained-rel-pos-rtl-left-right-vrl-008.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vrl-006.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-010.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-018.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-023.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-018.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-024.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/text-indent-vrl-010.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/text-indent-vrl-014.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/vertical-alignment-003.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/vertical-alignment-005.xht [ Failure ] +crbug.com/982194 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/DOMRectList.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/elementFromPoint-dynamic-anon-box.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-htb-ltr.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-htb-rtl.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-rtl.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-svg-text.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-svg.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/getBoundingClientRect-empty-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/getClientRects-br-vrl-ltr.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/getClientRects-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-border-box.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-inline.html [ Failure ] +crbug.com/982194 external/wpt/css/cssom-view/scrollIntoView-svg-shape.html [ Failure ] +crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Failure ] +crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ] +crbug.com/982194 external/wpt/css/selectors/focus-within-display-none-001.html [ Crash ] +crbug.com/982194 external/wpt/css/selectors/selection-image-001.html [ Crash ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-justify-content-001.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-self-001.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-001.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-006.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-table.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-001.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-002.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-horiz-001.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-fieldset-horiz-001.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-iframe-horiz-001.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-img-horiz-001.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-textarea-horiz-001.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-003b.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-sizing-horiz-002.xhtml [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-002.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-035.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-048.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-054.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-001.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-034.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-035.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-017.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-020.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-025.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-002.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-006.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-020.html [ Failure ] +crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-021.html [ Failure ] +crbug.com/982194 external/wpt/custom-elements/reactions/Selection.html [ Crash ] +crbug.com/982194 external/wpt/dom/events/shadow-relatedTarget.html [ Crash ] +crbug.com/982194 external/wpt/dom/ranges/Range-mutations-appendData.html [ Crash ] +crbug.com/982194 external/wpt/dom/ranges/Range-mutations-insertBefore.html [ Crash ] +crbug.com/982194 external/wpt/dom/ranges/Range-mutations-insertData.html [ Crash ] +crbug.com/982194 external/wpt/dom/ranges/Range-mutations-splitText.html [ Crash ] +crbug.com/982194 external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ] +crbug.com/982194 external/wpt/element-timing/css-generated-text.html [ Timeout ] +crbug.com/982194 external/wpt/element-timing/fixed-id-identifier.html [ Timeout ] +crbug.com/982194 external/wpt/event-timing/buffered-flag.html [ Timeout ] +crbug.com/982194 external/wpt/event-timing/retrieve-firstInput.html [ Timeout ] +crbug.com/982194 external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash ] +crbug.com/982194 external/wpt/feature-policy/reporting/camera-report-only.https.html [ Failure ] +crbug.com/982194 external/wpt/feature-policy/reporting/fullscreen-report-only.html [ Failure ] +crbug.com/982194 external/wpt/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html [ Crash ] +crbug.com/852645 external/wpt/fullscreen/api/element-request-fullscreen-two-iframes-manual.html [ Failure Timeout Crash ] +crbug.com/982194 external/wpt/fullscreen/api/element-request-fullscreen.html [ Failure ] +crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-001a.html [ Failure ] +crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-006a.html [ Failure ] +crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-007b.html [ Failure ] +crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-007c.html [ Failure ] +crbug.com/982194 external/wpt/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html [ Crash ] +crbug.com/982194 external/wpt/html/semantics/forms/constraints/form-validation-reportValidity.html [ Crash ] +crbug.com/982194 external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html [ Crash ] +crbug.com/982194 external/wpt/html/semantics/selectors/pseudo-classes/focus-autofocus.html [ Crash ] +crbug.com/982194 external/wpt/html/user-activation/activation-thru-contextmenu-event-manual.html [ Crash ] +crbug.com/928838 external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html [ Failure Crash ] +crbug.com/982194 external/wpt/html/user-activation/no-activation-thru-escape-key-manual.html [ Crash ] +crbug.com/982194 http/tests/css/css-image-valued-shape.html [ Failure ] +crbug.com/982194 http/tests/devtools/command-line-api-inspect.js [ Crash ] +webkit.org/b/90488 http/tests/devtools/compiler-source-mapping-debug.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/console-resource-errors.js [ Crash ] +crbug.com/982194 http/tests/devtools/copy-network-request.js [ Crash ] +crbug.com/982194 http/tests/devtools/fragment.js [ Crash ] +crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Timeout Crash ] +crbug.com/831673 http/tests/devtools/reveal-objects.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/sourcemap-section-warning.js [ Crash ] +crbug.com/982194 http/tests/devtools/user-agent-setting-major-version.js [ Crash ] +crbug.com/982194 http/tests/devtools/user-metrics-perf.js [ Crash ] +crbug.com/982194 http/tests/devtools/a11y-axe-core/console-a11y-test.js [ Crash ] +crbug.com/1000336 http/tests/devtools/a11y-axe-core/devices-a11y-test.js [ Pass Failure Crash ] +crbug.com/982194 http/tests/devtools/a11y-axe-core/quick-open-a11y-test.js [ Crash ] +crbug.com/982194 http/tests/devtools/a11y-axe-core/performance/performance-pane-a11y-test.js [ Crash ] +crbug.com/982194 http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test.js [ Crash ] +crbug.com/982194 http/tests/devtools/a11y-axe-core/settings/emulated-device-a11y-test.js [ Crash ] +crbug.com/1000336 http/tests/devtools/a11y-axe-core/settings/geolocations-a11y-test.js [ Pass Failure Crash ] +crbug.com/1000336 http/tests/devtools/a11y-axe-core/sources/sources-editor-pane-a11y-test.js [ Pass Failure Crash ] +crbug.com/982194 http/tests/devtools/application-panel/resources-panel-websql.js [ Crash ] +crbug.com/982194 http/tests/devtools/components/linkifier.js [ Crash ] +crbug.com/982194 http/tests/devtools/components/widget-focus.js [ Crash ] +crbug.com/451577 http/tests/devtools/console/alert-toString-exception.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/argument-hints.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/command-line-api-getEventListeners.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/command-line-api.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-api-on-call-frame.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-assert.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-big-array.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-call-getter-on-proto.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-clear-function.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-clear.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-context-selector.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-copy-treeoutline.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-copy-truncated-text.js [ Timeout Crash ] +crbug.com/874695 crbug.com/869364 http/tests/devtools/console/console-correct-suggestions.js [ Pass Timeout Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-custom-formatters.js [ Timeout Crash ] +crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-dir-es6.js [ Pass Failure Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-dir-global.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-dir.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-dirxml.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-edit-expanded-tree.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-edit-property-value.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-error-on-call-frame.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-eval-object-literal.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-eval-scoped.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-eval-throw.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-expand-removed-node.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-external-array.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-focus.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-format-array-prototype.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-format-broken-unicode.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-format-collections.js [ Timeout Crash ] +crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-format-es6-2.js [ Pass Failure Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-format-es6.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-format-style-whitelist.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-functions.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-group-similar.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-last-result.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-link-to-snippet.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-linkify-message-location.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-links-in-errors-with-trace.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-links-on-messages-before-inspection.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-log-eval-syntax-error.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-log-linkify-stack-in-errors.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-log-object-with-getter.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-message-contains-async-stack.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-native-function.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-object-preview.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-pins.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-preserve-scroll.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-prompt-keyboard.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-proxy.js [ Timeout Crash ] +crbug.com/916975 crbug.com/451577 http/tests/devtools/console/console-repeat-count.js [ Pass Failure Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-retain-autocomplete-on-typing.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-revoke-error-in-worker.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-revoke-error.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-save-to-temp-var.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-search-reveals-messages.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-search.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-smart-enter.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-stack-overflow.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-substituted.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-tainted-globals.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-top-level-await.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-trim-long-traces.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-truncate-long-messages.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-uncaught-exception-in-eval.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-uncaught-exception.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-uncaught-promise-in-worker.js [ Timeout Crash ] +crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-viewport-control.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-viewport-indices.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-viewport-selection.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-viewport-stick-to-bottom-onload.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-viewport-stick-to-bottom.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-worker-nested-imports-syntax-error.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-xml-document.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/console-xpath.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/exception-objects.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/function-name-in-console-message-stack.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/nested-worker-eval-contains-stack.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/paintworklet-console-selector.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/shadow-element.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/worker-eval-contains-stack.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-clicking-messages.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-expand.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-links.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-navigation.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-runtime-result-below-prompt.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-stick-to-bottom-expand-object.js [ Timeout Crash ] +crbug.com/451577 http/tests/devtools/console/viewport-testing/console-stick-to-bottom-with-large-prompt.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/console-sidebar/console-filter-sidebar.js [ Crash ] +crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Crash ] +crbug.com/982194 http/tests/devtools/coverage/gutter-css.js [ Crash ] +crbug.com/982194 http/tests/devtools/coverage/gutter-html.js [ Crash ] +crbug.com/982194 http/tests/devtools/coverage/gutter-js.js [ Crash ] +crbug.com/982194 http/tests/devtools/coverage/multiple-instances-merge.js [ Crash ] +crbug.com/846471 http/tests/devtools/coverage/reveal-autoformat.js [ Pass Timeout Crash ] +crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-accessibility.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-block-indent.js [ Crash ] +crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Failure Timeout Crash ] +crbug.com/846982 crbug.com/874695 http/tests/devtools/editor/text-editor-formatter.js [ Pass Timeout Timeout Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-goto-matching-bracket.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-home-button.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-search-replace.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-selection-to-search.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-smart-braces.js [ Crash ] +crbug.com/982194 http/tests/devtools/editor/text-editor-toggle-tab-moves-focus.js [ Crash ] +crbug.com/749738 crbug.com/420008 http/tests/devtools/editor/text-editor-word-jumps.js [ Pass Timeout Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/elements-inspect-iframe-from-different-domain.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/elements-save-to-temp-var.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/elements-tab-stops.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/elements-treeoutline-copy.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-custom-framework.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/inspect-pseudo-element.js [ Failure ] +crbug.com/982194 http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/accessibility/autocomplete-attribute.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/css-variables/color-swatch.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/blur-while-edit-as-html.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-after-model-changed.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-3.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/edit-trimmed-attribute-value.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/edit/switch-panels-while-editing-as-html.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Failure ] +crbug.com/982194 http/tests/devtools/elements/styles/cancel-upon-invalid-property.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles/edit-css-with-source-url.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles/stylesheet-tracking.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles/undo-after-cancelled-editing.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles/undo-set-selector-text.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles/up-down-numerics-and-colors.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-invalid-selector.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-keyboard.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-with-style-after-body.js [ Crash ] +crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector-mark-matching.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/css-live-edit.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/edit-media-text.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/edit-name-with-trimmed-value.js [ Crash ] +crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/edit-resource-referred-by-multiple-styletags.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-inside-property.js [ Crash ] +crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-with-trimmed-url.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-2/metrics-box-sizing.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js [ Crash ] +crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Crash ] +crbug.com/994034 http/tests/devtools/elements/styles-3/styles-add-new-rule-colon.js [ Pass Failure Crash ] +crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Pass Failure Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-new-rule-to-stylesheet.js [ Crash ] +crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Pass Failure Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-3/styles-cancel-editing.js [ Crash ] +crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Pass Failure Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-3/styles-commit-editing.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-property-after-selector-edit.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js [ Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-4/styles-grid-template.js [ Crash ] +crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/styles-keyframes.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Crash ] +crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Pass Failure Timeout Crash ] +crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/undo-add-new-rule.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/elements/styles-4/undo-add-rule-crash.js [ Crash ] +crbug.com/941860 http/tests/devtools/extensions/extensions-events.js [ Timeout Crash ] +crbug.com/988298 http/tests/devtools/extensions/extensions-panel.js [ Pass Timeout Crash ] +crbug.com/246190 http/tests/devtools/indexeddb/resources-panel.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/network/async-xhr-json-mime-type.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-moved-to-storage.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-too-big-discarded.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/download.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/failed-request-preview.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/failed-request-response-mimetype.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/font-face.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/from-disk-cache-timing.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/har-content.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/har-post.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/html-preview-encoding.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/json-preview.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/load-resource-for-frontend.js [ Crash ] +crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Timeout Crash ] +crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/network/network-cachedresources-with-same-urls.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-choose-preview-view.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-close-request-view.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-columns-sorted.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-columns-visible.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-content-replacement-xhr.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-cyrillic-xhr.js [ Crash ] +crbug.com/762529 crbug.com/679833 http/tests/devtools/network/network-datareceived.js [ Failure Timeout Crash ] +crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Failure Crash ] +crbug.com/982194 http/tests/devtools/network/network-disable-cache-memory.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-disable-cache-xhrs.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-disabling-check-no-memory-leak.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-document-initiator.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-domain-filter.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-empty-xhr.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-eventsource.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-fetch-post-payload.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-fetch.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-filmstrip-overview-showing.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-filter-http-requests.js [ Crash ] +crbug.com/946699 http/tests/devtools/network/network-filter-service-worker.js [ Pass Timeout Crash ] +crbug.com/982194 http/tests/devtools/network/network-filter-updated-requests.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-filters-internals.js [ Crash ] +crbug.com/945629 http/tests/devtools/network/network-filters.js [ Pass Failure Timeout Crash ] +crbug.com/982194 http/tests/devtools/network/network-iframe-load-and-delete.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-image-404.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-imported-resource-content.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-initiator-chain.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-initiator-from-console.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-initiator.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-json-parser.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-log-service-worker-navigate.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-memory-cached-resource.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-prefetch.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-recording-after-reload-with-screenshots-enabled.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-request-parse-query-params.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-request-query-string.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-request-revision-content.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-request-type.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-search.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-status-non-http.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-timing.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-toggle-type-filter.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-update-calculator-for-all-requests.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-worker-fetch-blocked.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-worker-fetch-parallel.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-worker-fetch.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-async-double.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-async-response-type-blob.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-async.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-binary-content.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-data-received-async-response-type-blob.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-post-payload.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-body.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-method.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-replay.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-same-url-as-main-resource.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xhr-sync.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/network-xsl-content.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/oopif-content.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/parse-form-data.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/ping-response.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/ping.js [ Crash ] +crbug.com/962831 http/tests/devtools/network/preview-searchable.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/network/request-name-path.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/request-parameters-decoding.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/request-preview-uri-escaping.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/resource-priority.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/script-as-text-loading-long-url.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/script-as-text-loading-with-caret.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-script.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-stylesheet.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/warning-for-long-cookie.js [ Crash ] +crbug.com/982194 http/tests/devtools/network/waterfall-header-height-updates.js [ Crash ] +crbug.com/982194 http/tests/devtools/oopif/oopif-console-preserves-log-on-frame-navigation.js [ Crash ] +crbug.com/817167 crbug.com/874695 http/tests/devtools/oopif/oopif-cookies-refresh.js [ Pass Failure Timeout Timeout Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-external-change-breakpoints.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-go-to-file-dialog.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-merge-editor-tabs.js [ Crash ] +crbug.com/874695 http/tests/devtools/persistence/persistence-mimetype-on-rename.js [ Timeout Crash ] +crbug.com/981267 http/tests/devtools/persistence/persistence-move-breakpoints-on-reload.js [ Pass Failure Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-move-breakpoints.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-highlight.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-messages.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-switch-editor-tab.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-keeps-selected-tab.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-opens-filesystem-uisourcecode.js [ Crash ] +crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Crash ] +crbug.com/982194 http/tests/devtools/portals/portals-console.js [ Crash ] +crbug.com/450493 crbug.com/971262 http/tests/devtools/profiler/live-line-level-heap-profile.js [ Pass Timeout Timeout Crash ] +crbug.com/982194 http/tests/devtools/runtime/evaluate-timeout.js [ Crash ] +crbug.com/982194 http/tests/devtools/runtime/evaluate-without-side-effects.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/search-in-script.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/source-frame-replace-1.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/source-frame-replace-2.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/source-frame-replace-3.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/source-frame-search.js [ Crash ] +crbug.com/982194 http/tests/devtools/search/sources-search-scope.js [ Crash ] +crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Crash ] +crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch.js [ Crash ] +crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Pass Failure Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/autocomplete-css.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/autocomplete-general.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/autocomplete-hide-on-smart-brace.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/autocomplete-scss.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/bezier-swatch-position.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/color-swatch-position.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/compile-javascript.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/css-inline-sourcemap.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/css-outline-dialog.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/dont-diverge-script-evaluated-twice.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/inline-script-with-source-map.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/inspect-function.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/javascript-outline-dialog.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/pretty-print-css-1.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/pretty-print-javascript-5.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/sass-highlighter.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/snippet-module.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/snippet-overrides.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/source-code-diff.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/source-frame-toolbar-items.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/sources-panel-focus-editor-on-select.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/sources-pretty-print.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/anonymous-script-with-source-map-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts-fragment-id.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-completions-on-call-frame.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-minified-variables-evalution.js [ Timeout Crash ] +crbug.com/874695 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-minified-variables.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-identifiers.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-this.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/js-with-inline-stylesheets.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-breakpoints.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-original-content.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/live-edit.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/mutation-observer-suspend-while-paused.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/rethrow-error-from-bindings-crash.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/source-frame-breakpoint-decorations.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-indexed-db.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-post-message.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-promises.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-web-sql.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-xhrs.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await3.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-pause-on-exception.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-in-collected-function.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-manager-listeners-count.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap-dart.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-anonymous-script-with-two-targets.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-ui-source-frame.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-sidebar-pane.js [ Timeout Crash ] +crbug.com/874695 crbug.com/954319 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-in-multiple-workers.js [ Pass Timeout Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-navigation.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-restored-breakpoint.js [ Timeout Crash ] +crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-shifted-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-breakpoints-not-activated-on-reload.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-disable-add-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/disable-breakpoints.js [ Timeout Crash ] +crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/dynamic-scripts-breakpoints.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/inline-breakpoint-with-sourcemap.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/no-pause-on-disabled-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/possible-breakpoints.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/provisional-breakpoints.js [ Timeout Crash ] +crbug.com/450493 crbug.com/912793 http/tests/devtools/sources/debugger-breakpoints/restore-locations-for-breakpoint-with-broken-source-map.js [ Pass Failure Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/set-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/set-conditional-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/use-possible-breakpoints-to-resolve-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/xhr-breakpoints.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-console/debug-console-command.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-console/debugger-command-line-api.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-blackbox-by-source-code.js [ Timeout Crash ] +crbug.com/874695 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-break-program.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-step-in.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-step-into-skips-setTimeout.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-steppings.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-with-worker.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-change-variable.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused-throws.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-mute-exception.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-no-nested-pause.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-in-eval-script.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-in-internal.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-infinite-loop.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-exception.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-failed-assertion.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/eval-on-pause-blocked.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-inline-script.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-internal-script.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/set-return-value.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-pause/skip-pauses-until-reload.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-document-write.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-event-listener.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-inlined-scripts.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-document-write.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-over-document-write.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-over-inlined-scripts.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-through-promises.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-step/step-through-event-listeners.js [ Timeout Crash ] +crbug.com/916975 crbug.com/450493 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Pass Failure Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/callstack-placards-discarded.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/click-gutter-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/continue-to-location-markers-in-top-level-function.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/continue-to-location-markers.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/copy-stack-trace.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/custom-element-lifecycle-events.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-inline-values.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-save-to-temp-var.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/inline-scope-variables.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/monitor-console-command.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/popover-for-spread-operator.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-not-skipped.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-2.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-3.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-search.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/selected-call-frame-after-formatting-source.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-function-definition.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-generator-location.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/snippet-edit-breakpoint.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/source-frame.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/sources/debugger-ui/watch-expressions-panel-switch.js [ Timeout Crash ] +crbug.com/450493 http/tests/devtools/startup/sources/debugger/script-formatter-console.js [ Timeout Crash ] +crbug.com/874695 http/tests/devtools/sxg/sxg-cert-not-found.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash ] +crbug.com/851363 http/tests/devtools/sxg/sxg-prefetch-fail.js [ Pass Failure Crash ] +crbug.com/982194 http/tests/devtools/sxg/sxg-transfer-size.js [ Crash ] +crbug.com/420008 http/tests/devtools/tracing/console-timeline.js [ Timeout Crash ] +crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-no-url-end-to-end.js [ Timeout Crash ] +crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile.js [ Timeout Crash ] +crbug.com/420008 http/tests/devtools/tracing/timeline-network/timeline-network-resource-details.js [ Timeout Crash ] +crbug.com/420008 http/tests/devtools/tracing/timeline-time/timeline-usertiming.js [ Timeout Crash ] +crbug.com/982194 http/tests/devtools/unit/filtered-item-selection-dialog-filtering.js [ Crash ] +crbug.com/982194 http/tests/devtools/unit/text-prompt-hint.js [ Crash ] +crbug.com/982194 http/tests/download/default-encoding.html [ Crash ] +crbug.com/982194 http/tests/filesystem/input-display.html [ Timeout ] +crbug.com/982194 http/tests/inspector-protocol/target/target-expose-devtools-protocol.js [ Failure ] +crbug.com/982194 http/tests/local/fileapi/select-dragged-file-input.html [ Failure ] +crbug.com/982194 http/tests/local/formdata/form-data-with-unknown-file-extension.html [ Failure ] +crbug.com/982194 http/tests/local/formdata/send-form-data-with-filename.html [ Failure ] +crbug.com/982194 http/tests/local/formdata/upload-events.html [ Failure ] +crbug.com/982194 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Crash ] +crbug.com/982194 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Crash ] +crbug.com/982194 http/tests/media/autoplay/document-user-activation-feature-policy-same-origin.html [ Crash ] +crbug.com/982194 http/tests/media/autoplay/document-user-activation-navigation-click.html [ Crash ] +crbug.com/982194 http/tests/misc/acid2.html [ Failure ] +crbug.com/874695 http/tests/misc/drag-not-loaded-image.html [ Timeout Crash ] +crbug.com/982194 http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash ] +crbug.com/982194 http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Failure ] +crbug.com/982194 http/tests/misc/javascript-url-location-change.html [ Crash ] +crbug.com/982194 http/tests/misc/lock-renderer-for-middle-click-autoscroll.html [ Crash ] +crbug.com/982194 http/tests/misc/selectionAsMarkup.html [ Crash ] +crbug.com/982194 http/tests/navigation/anchor-frames-shifting-focus.html [ Crash ] +crbug.com/982194 http/tests/navigation/document-location-click-timeout.html [ Crash ] +crbug.com/982194 http/tests/navigation/document-location-click.html [ Crash ] +crbug.com/982194 http/tests/navigation/document-location-mouseover.html [ Timeout ] +crbug.com/982194 http/tests/navigation/javascriptlink-basic.html [ Crash ] +crbug.com/982194 http/tests/navigation/javascriptlink-frames.html [ Crash ] +crbug.com/982194 http/tests/navigation/javascriptlink-goback.html [ Crash ] +crbug.com/982194 http/tests/navigation/javascriptlink-subframeload.html [ Crash ] +crbug.com/982194 http/tests/navigation/no-referrer-reset.html [ Crash ] +crbug.com/982194 http/tests/navigation/no-referrer-same-window.html [ Crash ] +crbug.com/982194 http/tests/navigation/no-referrer-subframe.html [ Crash ] +crbug.com/982194 http/tests/navigation/no-referrer-target-blank.html [ Crash ] +crbug.com/982194 http/tests/navigation/parsed-iframe-dynamic-form-back-entry-user-gesture.html [ Crash ] +crbug.com/982194 http/tests/navigation/ping-cookie.html [ Crash ] +crbug.com/982194 http/tests/navigation/ping-cross-origin-from-https.html [ Crash ] +crbug.com/982194 http/tests/navigation/ping-cross-origin.html [ Crash ] +crbug.com/982194 http/tests/navigation/ping-same-origin.html [ Crash ] +crbug.com/982194 http/tests/navigation/post-with-modifier.html [ Crash ] +crbug.com/982194 http/tests/navigation/redirect-preserves-referrer.html [ Crash ] +crbug.com/982194 http/tests/navigation/same-document-scroll-position-restore.html [ Crash ] +crbug.com/982194 http/tests/notifications/serviceworker-notification-properties.html [ Timeout ] +crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Crash ] +crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Crash ] +crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Crash ] +crbug.com/982194 http/tests/security/cross-frame-access-selection.html [ Crash ] +crbug.com/982194 http/tests/security/drag-drop-different-origin.html [ Crash ] +crbug.com/982194 http/tests/security/drag-drop-same-unique-origin.html [ Crash ] +crbug.com/982194 http/tests/security/drag-over-remote-content-iframe.html [ Crash ] +crbug.com/982194 http/tests/security/referrer-policy-redirect-link.html [ Crash ] +crbug.com/982194 http/tests/security/referrer-policy-rel-noreferrer.html [ Crash ] +crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Crash ] +crbug.com/982194 http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Failure ] +crbug.com/982194 http/tests/security/cookies/third-party-cookie-blocking-user-action.html [ Crash ] +crbug.com/982194 http/tests/security/frameNavigation/sandbox-ALLOWED-top-navigation-with-two-flags.html [ Crash ] +crbug.com/982194 http/tests/security/frameNavigation/sandbox-ALLOWED-top-navigation-with-user-gesture.html [ Crash ] +crbug.com/982194 http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html [ Timeout ] +crbug.com/982194 http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html [ Timeout ] +crbug.com/982194 http/tests/security/frameNavigation/xss-ALLOWED-top-navigation-after-postMessage.html [ Timeout ] +crbug.com/982194 http/tests/security/frameNavigation/xss-DENIED-top-navigation-user-gesture-in-parent.html [ Crash ] +crbug.com/982194 http/tests/security/isolatedWorld/events.html [ Failure ] +crbug.com/982194 http/tests/security/isolatedWorld/userGestureEvents.html [ Timeout ] +crbug.com/982194 http/tests/security/listener/xss-window-onclick-addEventListener.html [ Crash ] +crbug.com/982194 http/tests/security/listener/xss-window-onclick-shortcut.html [ Crash ] +crbug.com/982194 http/tests/security/vibration/vibrate-in-same-origin-iframe-with-user-gesture-allowed.html [ Crash ] +crbug.com/982194 http/tests/security/vibration/vibrate-on-top-page-before-during-after-user-gesture.html [ Crash ] +crbug.com/982194 http/tests/uri/css-href.php [ Failure ] +crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/07.html [ Failure ] +crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/14.html [ Failure ] +crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/29.html [ Failure ] +crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/36.html [ Failure ] +crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/47.html [ Failure ] +crbug.com/982194 http/tests/xmlhttprequest/workers/shared-worker-close.html [ Crash ] +crbug.com/982194 virtual/android/fullscreen/enter-exit-full-screen-hover.html [ Timeout ] +crbug.com/982194 virtual/android/fullscreen/exit-full-screen-iframe.html [ Crash ] +crbug.com/982194 virtual/android/fullscreen/full-screen-iframe-allowed-nested.html [ Crash ] +crbug.com/982194 virtual/android/fullscreen/full-screen-iframe-allowed.html [ Crash ] +crbug.com/718155 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure Crash ] +crbug.com/982194 virtual/android/fullscreen/full-screen-iframe-ua-style.html [ Timeout ] +crbug.com/982194 virtual/android/fullscreen/full-screen-is-in-top-layer.html [ Timeout ] +crbug.com/982194 virtual/android/fullscreen/full-screen-placeholder.html [ Failure ] +crbug.com/982194 virtual/android/fullscreen/full-screen-ruleset-crash.html [ Crash ] +crbug.com/982194 virtual/android/fullscreen/full-screen-with-css-reference-filter.html [ Timeout ] +crbug.com/982194 virtual/android/fullscreen/keyboard-focus.html [ Crash ] +crbug.com/982194 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash ] +crbug.com/982194 virtual/android/fullscreen/rendering/overflow.html [ Crash ] +crbug.com/982194 virtual/android/rootscroller/keyboard-scroll-document-not-root-scroller.html [ Crash ] +crbug.com/982194 virtual/audio-service/http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ] +crbug.com/982194 virtual/audio-service/http/tests/media/video-frame-size-change.html [ Failure ] +crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-delegation.html [ Crash ] +crbug.com/987269 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Pass Failure Crash ] +crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-gesture.html [ Crash ] +crbug.com/987269 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Pass Failure Crash ] +crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-feature-policy-same-origin.html [ Crash ] +crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-navigation-click.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/audio-controls-rendering.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/audio-delete-while-slider-thumb-clicked.html [ Crash ] +crbug.com/874695 crbug.com/936165 virtual/audio-service/media/autoplay-muted.html [ Pass Timeout Timeout Crash ] +crbug.com/982194 virtual/audio-service/media/controls-layout-direction.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/media-controls-clone.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/media-document-audio-repaint.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/video-controls-attribute-fullscreen.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash ] +crbug.com/988248 virtual/audio-service/media/video-persistence.html [ Pass Failure Crash ] +crbug.com/982194 virtual/audio-service/media/video-prefixed-fullscreen.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/video-src-blob.html [ Timeout ] +crbug.com/982194 virtual/audio-service/media/autoplay/document-user-activation.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/autoplay/webaudio-audio-context-init.html [ Crash ] +crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Pass Failure Crash ] +crbug.com/982194 virtual/audio-service/media/autoplay/webaudio-node-start.html [ Crash ] +crbug.com/942951 virtual/audio-service/media/controls/controls-layout-in-different-size.html [ Timeout Crash ] +crbug.com/982194 virtual/audio-service/media/controls/overflow-menu-animation.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/controls/progress-bar-repaint-on-size-change.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/controls/resizing-changes-css-class.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/controls/toggle-class-with-state-fullscreen.html [ Crash ] +crbug.com/982194 virtual/audio-service/media/controls/volumechange-muted-attribute.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/picture-in-picture/detached-iframe.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/picture-in-picture/picture-in-picture-enabled.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/picture-in-picture/picture-in-picture-service-error.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/picture-in-picture/v2/detached-iframe.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/picture-in-picture/v2/request-picture-in-picture-twice.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/picture-in-picture/v2/request-picture-in-picture.html [ Failure ] +crbug.com/874695 virtual/audio-service/media/remoteplayback/prompt-twice-throws.html [ Timeout Timeout ] +crbug.com/982194 virtual/audio-service/media/track/track-cue-rendering-position-auto-rtl.html [ Failure ] +crbug.com/982194 virtual/audio-service/media/track/track-cue-rendering-position-auto.html [ Failure ] +crbug.com/982194 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Failure ] +crbug.com/982194 virtual/cascade/external/wpt/css/css-cascade/all-prop-001.html [ Failure ] +crbug.com/982194 virtual/cascade/external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ] +crbug.com/982194 virtual/cascade/external/wpt/css/css-paint-api/style-first-letter-pseudo.https.html [ Failure ] +crbug.com/982194 virtual/cascade/external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ] +Bug(none) virtual/composite-after-paint/compositing/geometry/outline-change.html [ Failure ] +Bug(none) virtual/composite-after-paint/compositing/gestures/gesture-tapHighlight-img.html [ Failure ] +Bug(none) virtual/composite-after-paint/paint/background/background-clip-text-inline.html [ Failure ] +Bug(none) virtual/composite-after-paint/paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure ] +Bug(none) virtual/composite-after-paint/paint/frames/frameset-with-stacking-contexts.html [ Failure ] +crbug.com/980290 virtual/composite-after-paint/scrollingcoordinator/non-fast-scrollable-visibility-change.html [ Failure Crash ] +crbug.com/982194 virtual/compositor_threaded_scrollbar_scrolling/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ] +crbug.com/982194 virtual/compositor_threaded_scrollbar_scrolling_hidpi_nozoomfordsf/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html [ Timeout ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-empty-list.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-one-row.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-two-rows.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-value-attribute.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-with-scrollbar.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-zoom125.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-zoom200.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-highlight.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/range/slider-vertical-no-shadow-root.html [ Crash ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic.html [ Failure ] +crbug.com/982194 virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/canvas-measure-bidi-text.html [ Failure ] +crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/canvas-text-ideographic-space.html [ Failure ] +crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Crash ] +crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash ] +crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/webgl-with-neg-outline-offset.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/55.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/alt-text-wrapping.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/color-profile-drag-image.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-webgl.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/content-url-image-with-alt-text-dynamic.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/drag-image.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/drag-pdf-as-image.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/drag-svg-image.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/exif-orientation-image-document.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/exif-orientation.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/image-change-src.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/image-hover-display-alt.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/image-in-map.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/image-map-multiple-xhtml.xhtml [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/image-map-multiple.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/imagemap-duplicate-outlines-crash.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/missing-image-border-zoom.html [ Failure ] +crbug.com/982194 virtual/exotic-color-space/images/server-side-imagemap.html [ Crash ] +crbug.com/982194 virtual/exotic-color-space/images/png-suite/test.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-avoids-document-and-body.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-button-negative-tabindex.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-checkbox-radio.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-disconnected-document.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-disconnected-editable.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-display-none-editable.html [ Failure ] +crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest-a11y.html [ Crash Failure ] +crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest.html [ Crash Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-escape-uninterested-focus.html [ Crash ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-focused-editable-blocks-movement.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit-a11y.html [ Timeout ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit.html [ Timeout ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state-on-click-a11y.html [ Timeout ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state-on-click.html [ Timeout ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state.html [ Crash ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-fully-contained-input.html [ Failure ] +crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-mouse-enter-leave.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Crash ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-01.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-02.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-03.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-04.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-05.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html [ Failure ] +crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure ] +crbug.com/982194 virtual/forced-colors/fast/css/forced-colors-mode/forced-colors-mode-15.html [ Crash ] +crbug.com/982194 virtual/forced-colors/fast/css/forced-colors-mode/backplate/forced-colors-mode-backplate-07.html [ Failure ] +crbug.com/982194 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure ] +crbug.com/982194 virtual/gpu/fast/canvas/canvas-pattern-video.html [ Failure ] +crbug.com/982194 virtual/gpu/fast/canvas/canvas-text-ideographic-space.html [ Failure ] +crbug.com/982194 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Crash ] +crbug.com/982194 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash ] +crbug.com/982194 virtual/gpu/fast/canvas/webgl/webgl-with-neg-outline-offset.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/55.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/alt-text-wrapping.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/color-profile-drag-image.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-webgl.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/content-url-image-with-alt-text.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/drag-image.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/drag-pdf-as-image.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/drag-svg-image.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/exif-orientation-image-document.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/exif-orientation.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/image-hover-display-alt.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/image-in-map.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/image-map-multiple-xhtml.xhtml [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/image-map-multiple.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/imagemap-duplicate-outlines-crash.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/missing-image-border-zoom.html [ Failure ] +crbug.com/982194 virtual/gpu-rasterization/images/server-side-imagemap.html [ Crash ] +crbug.com/982194 virtual/gpu-rasterization/images/png-suite/test.html [ Failure ] +crbug.com/982194 virtual/isolated_world_csp/http/tests/security/isolatedWorld/events.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/css3/flexbox/multiline-shrink-to-fit.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-layout-016.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-002.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-011.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-012.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-020.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-024.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-047.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-cell-001.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-cell-002.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-011.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-012.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-013.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-014.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-table-001.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-table-002.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-size-056.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/css-flexbox-column-wrap-reverse.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/css-flexbox-column-wrap.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/css-flexbox-column.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-box-wrap.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-flow-007.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-vertical-align-effect.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-1-unitless-basis.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-unitless-basis.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-unitless-basis.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-0-unitless.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-0.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-N-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-basis-shrink.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-initial-2.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-none.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-end.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-start.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-negative.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-only.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-only.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-auto.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-002.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-004.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-006.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-block-004.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/forms/fieldset/fieldset-disabled.html [ Crash ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/balance-breakafter-before-nested-block.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/composited-relpos-in-clipped.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/float-truncation.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/focus-outline.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/paginate-block-replaced.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/recursive-split-flow-crash.html [ Crash ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/relpos-inside-inline-block.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/table-multicolumn-caption.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-float-after-content-in-spanner.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-float-before-content-in-spanner.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/newmulticol/table-cell.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/vertical-lr/float-truncation.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/vertical-rl/float-truncation.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fragmentation/fragmented-table-cell.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fragmentation/single-line-cells-paginated-with-text.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fragmentation/table-row-page-break-collapsed-border.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/fragmentation/transformed-clip-before-second-column.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/printing/ellipsis-printing-style.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/printing/list-item-with-empty-first-line.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/printing/page-count-layout-overflow.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/printing/return-from-printing-mode.html [ Failure ] +crbug.com/982194 virtual/layout_ng_experimental/printing/css2.1/page-break-inside-000.html [ Failure ] +crbug.com/982194 virtual/main_thread_scrollbar_gestures/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/anchor-image-scrolled-x-y.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/attribute-listener-deletion-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-disabled-in-fix.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-iframe-no-scrolling.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-in-overflow-hidden-html.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-overflow-hidden-longhands.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-select-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-should-not-stop-on-keypress.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation-no-scroll-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation-overflow-hidden-body.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation-overflow-hidden-iframe-body.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-with-non-scrollable-parent.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/background-tab-on-ctrl-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/background-tab-on-submit-ctrl-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/before-unload-reloads.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/button-mouse-active.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/capture-on-target.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/check-defocus-event-order-when-triggered-by-mouse-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-after-mousedown-cancel.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-anchor-blur-refocus-window.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-anchor-refocus-window.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-checkbox-blur-refocus-window.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-checkbox-refocus-window.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-anchor-has-ring.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-anchor-no-ring.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-keydown-no-ring.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-svganchor-has-ring.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-over-descendant-elements.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-range-slider.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-svganchor-blur-refocus-window.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-svganchor-refocus-window.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-with-large-negative-text-indent.html [ Timeout ] +crbug.com/779170 virtual/mouseevent_fractional/fast/events/clientXY-in-zoom-and-scroll.html [ Failure Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-menu-key-shift-f10-modifiers.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-menu-key-shift-f10-prevent-default.html [ Failure ] +crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Pass Failure Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-nodrag.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-onmousedown-event.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/dispatch-mouse-events-to-window-always.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/display-none-on-focus-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/download-on-alt-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-and-drop-subframe-dataTransfer.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-and-drop-thresholds.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-dataTransferItemList-file-handling.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-dragend-detaches.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-image-filename.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Crash ] +crbug.com/346473 virtual/mouseevent_fractional/fast/events/drag-on-mouse-move-cancelled.html [ Failure Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-outside-window.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-remove-iframe-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-svg-image-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-text-with-clear.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/dragging-mouse-moves.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-fire-disconnected-shadow-dom-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-hit-testing-fallback-to-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled-inline-with-pseudo.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled_inline.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-trusted.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-view-toString.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/file-input-hidden-in-ondrop.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-change-assertion.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-change-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-change-crash2.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-click-on-non-mouse-focusable-element.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-event-source-device-from-mouse.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-event-source-device-from-touch.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/frame-click-clear-focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/frame-click-focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/frame-detached-in-mousedown.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/hit-test-counts.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/iframe-mousewheel.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/iframe-onmousemove.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/input-image-scrolled-x-y.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/keyboard-scroll-use-count.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/keydown-1.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/keypress-removed-node.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/max-tabindex-focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-document-pinch-zoom.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-document.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-position.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-reveal-focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-no-mouse-down.html [ Crash ] +crbug.com/851090 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-click-hyperlink.html [ Pass Failure Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-drag-scrollable-iframe-div.html [ Crash ] +crbug.com/891155 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-drag.html [ Pass Failure Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-in-iframe.html [ Crash ] +crbug.com/827209 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Pass Failure Timeout Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-modal-scrollable-iframe-div.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-nested-divs.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-panIcon.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-use-count.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-click-events-pseudo-element.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-click-events.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-cursor-multiframecur.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-cursor-style-change-iframe.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-drag-from-frame-to-other-frame.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-drag-from-frame.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-event-from-touch-source-device-event-sender.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-event-source-device-event-sender.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-events-on-textarea-resize.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-events-within-no-element.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-focus-imagemap.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-layerXY-scrolled.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-moved-remove-frame-crash.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-relative-position-zoomed.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-relative-position.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-up-preventDefault-dragstate.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseclick-target-and-positioning.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousedown-in-subframe-scrollbar.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousedown-inside-dragstart-should-not-cause-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseenter-mouseleave-on-drag.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousemove-after-drag-over-scrollbar.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousemove-to-resizer-changes-cursor.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-button.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-mouseout.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-mouseout2.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseup-outside-button.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseup-outside-document.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/new-tab-on-middle-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/node-event-anchor-lock.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/onblur-remove.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/onchange-click-hang.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/onchange-range-slider.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/onclick-list-marker.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/open-window-from-another-frame.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/page-scaled-mouse-click-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/page-scaled-mouse-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events-2.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-initiated-event.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-initiated-form-submit.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once-iframes.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once-two-events.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-pointerup-exactly-once.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-different-frames.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-fake-focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-fake-user-gesture.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-wrong-event.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-click-in-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers1.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers2.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers3.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers4.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers5.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers6.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-forwarded-gesture-blocked.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-forwarded-gesture.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/relative-offset-of-simulated-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup-deep.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup-insertback.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup-twice.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-with-shadow-in-drag.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-text-node-in-mouseup.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/reveal-link-when-focused.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/right-click-focus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/scroll-after-click-on-tab-index.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/scroll-div-with-prevent-default-in-subframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/scroll-to-anchor-in-overflow-hidden.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/select-onchange-mouse-released-outside.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selection-autoscroll-borderbelt.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectionchange-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-double-triple-clicks.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-drag-stylus.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-on-selectall.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-prevent-selection-on-right-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/sequential-focus-navigation-starting-point.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-click-user-select-none.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-no-drag-n-drop.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-image-triggers-drag-n-drop.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-disabled.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/standalone-image-drag-to-editable.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/update-hover-when-mouse-press.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/update-mouse-cursor-after-layout-change.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/update_hover_after_layout_change.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/window-events-bubble.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/window-events-bubble2.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/window-events-capture.html [ Crash ] +crbug.com/779170 virtual/mouseevent_fractional/fast/events/zoom-dblclick.html [ Failure Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/hr-timestamp/generated-events.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/inputevents/beforeinput-remove-iframe-crash.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/inputevents/input-event-event-listener.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/inputevents/inputevent-ime.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-node-remove.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-on-object.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-chorded-buttons.html [ Crash ] +crbug.com/722212 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-event-properties.html [ Pass Failure Timeout Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-haspointercapture.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-preventdefault.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-transition-events.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-updown-events.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouseevent_key_pressed.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-event-in-slop-region.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-preventdefault.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-in-slop-region.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-mouse-coords-in-zoom-and-scroll.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-pen-coords-in-zoom-and-scroll.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-long-press.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/page-scaled-touch-gesture-click.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-action-range-input-csp.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-action-range-input.html [ Timeout ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-before-pressing-spin-button.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-fractional-coordinates.html [ Failure ] +crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/touch-slider-no-js-touch-listener.html [ Timeout Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-slider.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/context-menu-on-two-finger-tap.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/double-tap-zoom-touch-action-none.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/focus-selectionchange-on-tap.html [ Crash ] +crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-click.html [ Timeout Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-dblclick.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-active-state-hidden-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-active-state-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-active-state.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-click-common-ancestor.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-div-removed.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-move.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-overlap.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-removed.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-scrollbar.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-scrolled.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-hover-clear.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-hover-state-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-near-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-on-hover-element.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-reset-selection-range.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-result.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-scrolled.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined-in-iframe.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-focuses-frame.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-on-draggable-element-in-iframe-triggers-drag.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-on-draggable-element-in-nested-iframes-triggers-drag.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-selects-word-when-touch-editing-enabled.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/right-click-gestures-set-cursor-at-correct-position.html [ Crash ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html [ Failure ] +crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/touch-gesture-scroll-iframe-past-extent.html [ Failure ] +crbug.com/982194 virtual/not-site-per-process/external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Timeout ] +crbug.com/902685 virtual/not-site-per-process/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Timeout Crash ] +crbug.com/982194 virtual/not-site-per-process/http/tests/local/drag-over-remote-content.html [ Crash ] +crbug.com/982194 virtual/not-site-per-process/http/tests/media/autoplay/webaudio-autoplay-iframe-with-gesture.html [ Crash ] +crbug.com/982194 virtual/not-site-per-process/http/tests/webaudio/autoplay-crossorigin.html [ Crash ] +crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/iframe.tentative.https.sub.html [ Timeout ] +crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/window-open.tentative.https.sub.html [ Timeout ] +crbug.com/982194 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/claim-shared-worker-fetch.https.html [ Crash ] +crbug.com/982194 virtual/omt-worker-fetch/external/wpt/workers/SharedWorker-detach-frame-in-error-event.html [ Crash ] +crbug.com/982194 virtual/omt-worker-fetch/fast/workers/chromium/close-context-messageport-crash.html [ Crash ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/ancestor-overflow.html [ Failure ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/composited-nested-sticky-deep.html [ Failure ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/get-transform-from-non-box-container.html [ Failure ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-with-negative-offset-translucent-outline.html [ Failure ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-children-do-not-paint-comp-scroll-phase.html [ Failure ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Crash ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ] +crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-middleclick-nopaste.html [ Crash ] +crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/drag-image.html [ Crash ] +crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ] +crbug.com/982194 virtual/scalefactor200/css3/filters/filter-region.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/css3/filters/filtered-inline.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/css3/filters/nested-filters.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/css3/filters/null-effect-check.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-003.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/css-generated-text.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/element-only-when-fully-active.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/first-letter-background.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/fixed-id-identifier.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/observe-text.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/text-with-display-style.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/first-letter-background.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/larger-image.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/larger-text.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/observe-text.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/text-with-display-style.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/drag-image.html [ Crash ] +crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ] +crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/css-generated-text.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/element-only-when-fully-active.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/first-letter-background.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/fixed-id-identifier.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/observe-text.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/text-with-display-style.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/first-letter-background.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/larger-image.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/larger-text.html [ Timeout ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/observe-text.html [ Failure ] +crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/text-with-display-style.html [ Failure ] +crbug.com/982194 virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ] +crbug.com/982194 virtual/scalefactor200withzoom/fast/hidpi/static/drag-image.html [ Crash ] +crbug.com/982194 virtual/scalefactor200withzoom/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-continuation.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/page-scaled-touch-gesture-click.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-action-range-input-csp.html [ Timeout ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-action-range-input.html [ Timeout ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-before-pressing-spin-button.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-fractional-coordinates.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-slider-no-js-touch-listener.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-slider.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/context-menu-on-two-finger-tap.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/double-tap-zoom-touch-action-none.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/focus-selectionchange-on-tap.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-click.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-dblclick.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-active-state-hidden-iframe.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-active-state-iframe.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-active-state.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-click-common-ancestor.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-div-removed.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-move.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-overlap.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-removed.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-scrollbar.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-scrolled.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-hover-clear.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-hover-state-iframe.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-near-iframe.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-on-hover-element.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-reset-selection-range.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-result.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-scrolled.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined-in-iframe.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-focuses-frame.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-on-draggable-element-in-iframe-triggers-drag.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-on-draggable-element-in-nested-iframes-triggers-drag.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-selects-word-when-touch-editing-enabled.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/right-click-gestures-set-cursor-at-correct-position.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/touch-gesture-scroll-iframe-past-extent.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/middleclick-autoscroll-use-count.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/scroll-over-resizer.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/hashtag-autoscroll.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scroll-into-view-ignores-invisible-selection.html [ Crash ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-overried-inherited-visibility-hidden.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-scrolling-yes.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-visibility-hidden-child.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbar-tickmarks-styled-after-onload.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbar-tickmarks-styled.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/wheel-scrolling-over-custom-scrollbar.html [ Failure ] +crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ] +crbug.com/902685 virtual/site-isolated-code-cache/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Timeout Crash ] +crbug.com/982194 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechSynthesis-speak-ownership.html [ Timeout ] +crbug.com/982194 virtual/stable/http/tests/navigation/anchor-frames-shifting-focus.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/document-location-click-timeout.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/document-location-mouseover.html [ Timeout ] +crbug.com/982194 virtual/stable/http/tests/navigation/javascriptlink-basic.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/javascriptlink-subframeload.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/no-referrer-reset.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/no-referrer-same-window.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/no-referrer-subframe.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/parsed-iframe-dynamic-form-back-entry-user-gesture.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin-from-https.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/post-with-modifier.html [ Crash ] +crbug.com/982194 virtual/stable/http/tests/navigation/same-document-scroll-position-restore.html [ Crash ] +crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-cert-not-found.js [ Crash ] +crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Timeout Crash ] +crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-fail.js [ Crash ] +crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash ] +crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation.js [ Crash ] +crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Pass Failure Crash ] +crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-transfer-size.js [ Crash ] +crbug.com/982194 virtual/sxg-with-network-service/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html [ Failure ] +crbug.com/982194 virtual/threaded/animations/inline-transform.html [ Failure ] +crbug.com/982194 virtual/threaded/animations/rotate-transform-equivalent.html [ Failure ] +crbug.com/982194 virtual/threaded/external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ] +crbug.com/982194 virtual/threaded/external/wpt/css/css-paint-api/style-first-letter-pseudo.https.html [ Failure ] +crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash ] +crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html [ Failure ] +crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html [ Failure ] +crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Failure ] +crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html [ Failure ] +crbug.com/243871 virtual/threaded/fast/scroll-behavior/scroll-over-resizer.html [ Timeout Failure ] +crbug.com/243871 virtual/threaded/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Timeout Crash ] +crbug.com/982194 virtual/threaded/fast/scrolling/hashtag-autoscroll.html [ Crash ] +crbug.com/982194 virtual/threaded/fast/scrolling/scroll-into-view-ignores-invisible-selection.html [ Crash ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-overried-inherited-visibility-hidden.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-scrolling-yes.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-visibility-hidden-child.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollbar-tickmarks-styled-after-onload.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollbar-tickmarks-styled.html [ Failure ] +crbug.com/982194 virtual/threaded/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ] +crbug.com/874695 virtual/threaded/http/tests/devtools/tracing/console-timeline.js [ Timeout Crash ] +crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-script-tag-1.js [ Timeout Failure ] +crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-dispatch.js [ Timeout Timeout ] +crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.js [ Timeout Failure ] +crbug.com/982194 virtual/threaded/printing/return-from-printing-mode.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/camera-report-only.https.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/fullscreen-report-only.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/microphone-report-only.https.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/picture-in-picture-report-only.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/picture-in-picture-reporting.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/serial-report-only.https.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/serial-reporting.https.html [ Failure ] +crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/usb-report-only.https.html [ Failure ] +crbug.com/982194 virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-generateCertificate.html [ Failure ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 7ace5fd7..94fd890 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -2058,6 +2058,8 @@ crbug.com/870173 external/wpt/fetch/metadata/appcache.tentative.https.sub.html [ WontFix ] crbug.com/870173 external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ] crbug.com/870173 external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ] +crbug.com/870173 external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ] +crbug.com/870173 external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ] crbug.com/870173 external/wpt/resource-timing/cors-preflight.any.html [ WontFix ] crbug.com/870173 external/wpt/resource-timing/cors-preflight.any.worker.html [ WontFix ] crbug.com/870173 http/tests/devtools/console-xhr-logging.js [ WontFix ] @@ -2074,6 +2076,8 @@ crbug.com/870173 mhtml/cid_in_html_resource.html [ WontFix ] crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ] crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ] +crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ] +crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ] crbug.com/870173 virtual/omt-worker-fetch/external/wpt/resource-timing/cors-preflight.any.html [ WontFix ] crbug.com/870173 virtual/omt-worker-fetch/external/wpt/resource-timing/cors-preflight.any.worker.html [ WontFix ] crbug.com/870173 virtual/omt-worker-fetch/http/tests/workers/worker-redirect.html [ WontFix ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index c331bc5..6b8e1a9 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -257,7 +257,6 @@ # Display locking failures crbug.com/955533 wpt_internal/display-lock/sizing/overflow-auto-with-overflow.html [ Failure ] -crbug.com/1011376 wpt_internal/virtual-scroller/full-scroll-500px.html [ Failure ] # MSAN failure crbug.com/996625 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Skip ] @@ -2074,11 +2073,6 @@ # Run these tests with under virtual/scalefactor... only. crbug.com/567837 fast/hidpi/static [ Skip ] -crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.html [ Failure Pass ] -crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.serviceworker.html [ Failure Pass ] -crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.sharedworker.html [ Failure Pass ] -crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.worker.html [ Failure Pass ] - # For win10, see crbug.com/955109 crbug.com/538697 [ Win Win10 ] virtual/threaded/printing/webgl-oversized-printing.html [ Failure Crash ] crbug.com/538697 [ Win ] printing/webgl-oversized-printing.html [ Failure Crash ] @@ -3094,8 +3088,6 @@ # Hit a DCHECK crbug.com/918664 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-table-1a.html [ Failure Pass ] -crbug.com/939181 external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Failure Crash ] -crbug.com/939181 virtual/not-site-per-process/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Failure Timeout ] # FontFace object failures detected by WPT test crbug.com/965409 external/wpt/css/css-font-loading/fontface-descriptor-updates.html [ Failure ] @@ -3120,6 +3112,12 @@ crbug.com/618969 external/wpt/css/css-grid/subgrid/ [ Skip ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html [ Failure ] +crbug.com/626703 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html [ Failure ] +crbug.com/626703 [ Win ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html [ Failure ] crbug.com/626703 [ Linux ] external/wpt/clear-site-data/storage.https.html [ Timeout ] crbug.com/626703 [ Mac ] external/wpt/clear-site-data/storage.https.html [ Timeout ] crbug.com/626703 [ Win ] external/wpt/clear-site-data/storage.https.html [ Timeout ] @@ -6140,7 +6138,7 @@ crbug.com/1003055 virtual/threaded/external/wpt/css/css-scroll-snap/scroll-target-snap-003.html [ Failure ] # Sheriff 2019-09-12 -crbug.com/1003268 [ Win10 Win7 ] fast/harness/internals-observe-gc.html [ Failure ] +crbug.com/1011515 [ Win7 ] fast/harness/internals-observe-gc.html [ Failure ] crbug.com/731018 [ Mac ] external/wpt/accelerometer/Accelerometer.https.html [ Pass Failure ] crbug.com/731018 [ Mac ] external/wpt/gyroscope/Gyroscope.https.html [ Pass Failure ] crbug.com/731018 [ Mac ] external/wpt/orientation-sensor/AbsoluteOrientationSensor.https.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index 92cd775..a9bc4c5 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -107253,6 +107253,30 @@ {} ] ], + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html": [ + [ + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html", + [ + [ + "/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html", + "==" + ] + ], + {} + ] + ], + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html": [ + [ + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html", + [ + [ + "/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/child-index-no-parent-01.html": [ [ "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/child-index-no-parent-01.html", @@ -138373,6 +138397,9 @@ "css/css-grid/parsing/grid-auto-flow-valid-expected.txt": [ [] ], + "css/css-grid/parsing/grid-shorthand-expected.txt": [ + [] + ], "css/css-grid/parsing/grid-template-columns-computed-nogrid-expected.txt": [ [] ], @@ -139741,6 +139768,9 @@ "css/css-multicol/parsing/column-fill-valid-expected.txt": [ [] ], + "css/css-multicol/parsing/column-rule-shorthand-expected.txt": [ + [] + ], "css/css-multicol/reference/multicol-basic-005-ref.xht": [ [] ], @@ -148717,6 +148747,9 @@ "css/motion/parsing/offset-path-parsing-valid-expected.txt": [ [] ], + "css/motion/parsing/offset-shorthand-expected.txt": [ + [] + ], "css/reference/META.yml": [ [] ], @@ -150160,6 +150193,9 @@ "css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/whitespace-present-1-ref.html": [ [] ], + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html": [ + [] + ], "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/OWNERS": [ [] ], @@ -180537,6 +180573,12 @@ {} ] ], + "2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html": [ + [ + "2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html", + {} + ] + ], "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html": [ [ "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html", @@ -208218,6 +208260,12 @@ {} ] ], + "css/css-grid/parsing/grid-shorthand.html": [ + [ + "css/css-grid/parsing/grid-shorthand.html", + {} + ] + ], "css/css-grid/parsing/grid-template-areas-computed.html": [ [ "css/css-grid/parsing/grid-template-areas-computed.html", @@ -209460,6 +209508,12 @@ {} ] ], + "css/css-multicol/parsing/column-rule-shorthand.html": [ + [ + "css/css-multicol/parsing/column-rule-shorthand.html", + {} + ] + ], "css/css-multicol/parsing/column-rule-style-computed.html": [ [ "css/css-multicol/parsing/column-rule-style-computed.html", @@ -220672,6 +220726,12 @@ {} ] ], + "css/motion/parsing/offset-shorthand.html": [ + [ + "css/motion/parsing/offset-shorthand.html", + {} + ] + ], "css/selectors/anplusb-selector-parsing.html": [ [ "css/selectors/anplusb-selector-parsing.html", @@ -329872,6 +329932,10 @@ "9f297cacdcd81bef7093f79ebed6992110dab4d7", "support" ], + "2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html": [ + "3d57d9f064bec7755a4f735e3fd12850109fcc15", + "testharness" + ], "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html": [ "a94cfdcd2d66fb667d458a4dff91532fbf3608de", "testharness" @@ -335277,7 +335341,7 @@ "support" ], "README.md": [ - "8c5b201818e388ea56b582d7f546bb4d67c31dd2", + "f728d502e17783c92114c904597eb3cc9b8c473a", "support" ], "WebCryptoAPI/META.yml": [ @@ -381332,6 +381396,14 @@ "d4dcdb12b177cf97c3aa030cbb19c2ce2ae6d25d", "testharness" ], + "css/css-grid/parsing/grid-shorthand-expected.txt": [ + "d2c4b0fd368779929161d94812987f4e675f2ea7", + "support" + ], + "css/css-grid/parsing/grid-shorthand.html": [ + "91995608dd9eda5cd8d99abe3454cd67e52e405b", + "testharness" + ], "css/css-grid/parsing/grid-template-areas-computed.html": [ "8290a40088311e7775f84ec33e6a46fc94c8dbe7", "testharness" @@ -386456,6 +386528,14 @@ "e9945ec77404f4d453eda7f7e90c771f993336ca", "testharness" ], + "css/css-multicol/parsing/column-rule-shorthand-expected.txt": [ + "27cda6e51dd918bb7f6414e172750eb973728a72", + "support" + ], + "css/css-multicol/parsing/column-rule-shorthand.html": [ + "68e7582fcc17cee92065b64c3ec8ecff2bb2a39b", + "testharness" + ], "css/css-multicol/parsing/column-rule-style-computed.html": [ "277750ef36334b27f4544ada61c092db77ebd9e2", "testharness" @@ -421704,6 +421784,14 @@ "048c246f16b6cdcd286c9fa4ac6d1ac8dbdfbcbf", "testharness" ], + "css/motion/parsing/offset-shorthand-expected.txt": [ + "740a2ecaa5678fc513cb38d4cb4fd85b44d6c089", + "support" + ], + "css/motion/parsing/offset-shorthand.html": [ + "611a394b8b17f5da5d75128a5be8acfba7e0fcbe", + "testharness" + ], "css/reference/META.yml": [ "0f0f7aa96a3d8d59be0a26eaf5c706ae82faf4e4", "support" @@ -423853,7 +423941,7 @@ "support" ], "css/support/shorthand-testcommon.js": [ - "3298113513fb1e34311a6e7f34dd2d20cfe0c870", + "ab1f3794c8dac2f1e067209fd766ec18858a5f45", "support" ], "css/support/square-purple.png": [ @@ -426952,6 +427040,18 @@ "70239a8e0853afad656f70cdba460dc3f10995fc", "reftest" ], + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html": [ + "0d1b1362873483fa1b900e2da3efe603648f791e", + "support" + ], + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html": [ + "f7ed6e3b342d6cd259b3df61a5445f83ab39b0f9", + "reftest" + ], + "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html": [ + "f02bf13a73cd0ee025bf3e3d6ae9215feadb12b4", + "reftest" + ], "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/OWNERS": [ "5e03d9bce08ec1c2c4d3a23b993e8f428c9e68db", "support" @@ -459845,7 +459945,7 @@ "testharness" ], "import-maps/imported/parsing-addresses.tentative-expected.txt": [ - "3e2db5767c43b8fa7feba87b33f565ca0af05942", + "7d869b436fbf4187e87cdfa3d974c2da13cbbe4e", "support" ], "import-maps/imported/parsing-addresses.tentative.html": [ @@ -459869,7 +459969,7 @@ "testharness" ], "import-maps/imported/parsing-specifier-keys.tentative-expected.txt": [ - "c07d36cd946a28473a7ad643cebb36b1386b2d63", + "2c08065917f153cdc7f2db72add9b8acb96b4f32", "support" ], "import-maps/imported/parsing-specifier-keys.tentative.html": [
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html new file mode 100644 index 0000000..3d57d9f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html
@@ -0,0 +1,61 @@ +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + function draw_and_read_image(img, should_throw) { + let c = document.createElement('canvas'); + document.body.appendChild(c); + let ctx = c.getContext('2d'); + ctx.drawImage(img, 0, 0); + + function get_image_data() { + ctx.getImageData(0, 0, 4, 4); + } + + if (should_throw) { + assert_throws_dom('SecurityError', get_image_data); + } else { + get_image_data(); + } + + document.body.removeChild(c); + } + + async_test(t => { + let img = new Image(); + img.src = "/images/green.png"; + img.crossOrigin = "anonymous"; + img.onload = t.step_func_done(() => { + draw_and_read_image(img, false); + }); + img.onerror = t.unreached_func(); + }, "Can get pixels of canvas with same origin image drawn"); + + async_test(t => { + let img = new Image(); + img.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/images/green.png?pipe=header(Access-Control-Allow-Origin,*)"; + img.crossOrigin = "anonymous"; + img.onload = t.step_func_done(() => { + draw_and_read_image(img, false); + }); + img.onerror = t.unreached_func(); + }, "Can get pixels of canvas with CORS enabled cross origin image drawn"); + + async_test(t => { + let img = new Image(); + img.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/images/green.png?pipe=header(Access-Control-Allow-Origin,*)"; + img.onload = t.step_func_done(() => { + draw_and_read_image(img, true); + }); + img.onerror = t.unreached_func(); + }, "Can't get pixels of canvas with CORS enabled cross origin image drawn from non-CORS element"); + + async_test(t => { + let img = new Image(); + img.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/images/green.png"; + + img.onload = t.step_func_done(() => { + draw_and_read_image(img, true); + }); + img.onerror = t.unreached_func(); + }, "Can't get pixels of canvas with non-CORS enabled cross origin image drawn"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/README.md b/third_party/blink/web_tests/external/wpt/README.md index 8c5b201..f728d502e 100644 --- a/third_party/blink/web_tests/external/wpt/README.md +++ b/third_party/blink/web_tests/external/wpt/README.md
@@ -118,7 +118,7 @@ http://web-platform.test:8000/tools/runner/index.html <br> https://web-platform.test:8443/tools/runner/index.html * -\**See [Trusting Root CA](#trusting-root-ca)* +\**See [Trusting Root CA](./tools/certs/README.md)* Running Tests Automatically ---------------------------
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html new file mode 100644 index 0000000..062edaf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title>The maximum value of scrollLeft shouldn't be affected by scrollbar when it's wider than scroller</title> +<meta charset="utf-8"> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollleft"> + +<div id="scroller" style="overflow: scroll; width: 5px;height: 300px;"> + <div style="width:100px; height: 1px"></div> +</div> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + test(function() { + scroller.scrollLeft = 1000; + assert_equals(scroller.scrollLeft, 100); + }, "Test the maxium value of scrollLeft"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html new file mode 100644 index 0000000..0d1b136 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>CSS Reference: String value of list-style-type</title> + <link rel="author" title="Xidorn Quan" href="mailto:quanxunzhen@gmail.com"> + <style> + ol, ul { list-style: none; } + li::before { + content: "# "; + font-variant-numeric: tabular-nums; + } + </style> +</head> +<body> + <ol start="-1"> + <li>item -1</li> + <li>item 0</li> + <li>item 1</li> + <li>item 2</li> + </ol> + <ul start="-1"> + <li>item -1</li> + <li>item 0</li> + <li>item 1</li> + <li>item 2</li> + </ul> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html new file mode 100644 index 0000000..f7ed6e3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>CSS Test: String value of list-style-type</title> + <link rel="author" title="Xidorn Quan" href="mailto:quanxunzhen@gmail.com"> + <link rel="help" href="https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-string"> + <link rel="match" href="list-style-type-string-001-ref.html"> + <style> + ol, ul { list-style-type: "# "; list-style-position: inside; } + </style> +</head> +<body> + <ol start="-1"> + <li>item -1</li> + <li>item 0</li> + <li>item 1</li> + <li>item 2</li> + </ol> + <ul start="-1"> + <li>item -1</li> + <li>item 0</li> + <li>item 1</li> + <li>item 2</li> + </ul> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html new file mode 100644 index 0000000..f02bf13 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>CSS Test: String value of list-style</title> + <link rel="author" title="Xidorn Quan" href="mailto:quanxunzhen@gmail.com"> + <link rel="help" href="https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-string"> + <link rel="match" href="list-style-type-string-001-ref.html"> + <style> + ol, ul { list-style: inside "# "; } + </style> +</head> +<body> + <ol start="-1"> + <li>item -1</li> + <li>item 0</li> + <li>item 1</li> + <li>item 2</li> + </ol> + <ul start="-1"> + <li>item -1</li> + <li>item 0</li> + <li>item 1</li> + <li>item 2</li> + </ul> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html index 1b5a576..3aa902c 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html
@@ -12,7 +12,6 @@ fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=appcache-manifest{{$id}}") .then(t.step_func(response => response.text())) .then(t.step_func_done(text => assert_header_equals(text, { - "dest": "", "site": "same-origin", "user": "", "mode": "no-cors"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html index bf895e9..aae61e0f 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html
@@ -16,7 +16,7 @@ let e = document.createElement('embed'); e.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"embed", "site":"same-origin", "user":"", "mode":"no-cors"}; + let expected = {"site":"same-origin", "user":"", "mode":"no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -35,7 +35,7 @@ let e = document.createElement('embed'); e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"embed", "site":"same-site", "user":"", "mode":"no-cors"}; + let expected = {"site":"same-site", "user":"", "mode":"no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -54,7 +54,7 @@ let e = document.createElement('embed'); e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"embed", "site":"cross-site", "user":"", "mode":"no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode":"no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html index 27dafc25d..1ab3de6 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html
@@ -13,7 +13,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "same-site", "user": "", "mode": "cors", @@ -30,7 +29,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "cross-site", "user": "", "mode": "cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html index 86edfd0..13016fe 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html
@@ -44,7 +44,7 @@ const text = await response.text(); // Verify presence of the expected Sec-Fetch-... request headers. - let expected = {"dest":"empty", "site":"same-origin", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-origin", "user":"", "mode": "no-cors"}; assert_header_equals(text, expected); }, 'Sec-Fetch headers after SW fallback'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html index d59348c2..d437157 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html
@@ -45,7 +45,7 @@ const text = await response.text(); // Verify presence of the expected Sec-Fetch-... request headers. - let expected = {"dest":"empty", "site":"same-origin", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-origin", "user":"", "mode": "no-cors"}; assert_header_equals(text, expected); }, 'Sec-Fetch headers after SW fallback'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html index 30042f8..72fb52ec 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html
@@ -9,7 +9,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "same-origin", "user": "", "mode": "cors", @@ -22,7 +21,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "same-site", "user": "", "mode": "cors", @@ -35,7 +33,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "cross-site", "user": "", "mode": "cors", @@ -49,7 +46,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "same-origin", "user": "", "mode": "same-origin", @@ -62,7 +58,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "same-origin", "user": "", "mode": "cors", @@ -75,7 +70,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "same-origin", "user": "", "mode": "no-cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html index a2d66d6..a14c2c5 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html
@@ -12,7 +12,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "cross-site", "user": "", "mode": "cors", @@ -27,7 +26,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "", "site": "", "user": "", "mode": "",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html index 07152e8..9064dd6 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html
@@ -46,7 +46,7 @@ promise_test(t => { return new Promise((resolve, reject) => { let key = "font-same-origin"; - let expected = {"dest":"font", "site":"same-origin", "user":"", "mode": "cors"}; + let expected = {"site":"same-origin", "user":"", "mode": "cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -58,7 +58,7 @@ promise_test(t => { return new Promise((resolve, reject) => { let key = "font-same-site"; - let expected = {"dest":"font", "site":"same-site", "user":"", "mode": "cors"}; + let expected = {"site":"same-site", "user":"", "mode": "cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -70,7 +70,7 @@ promise_test(t => { return new Promise((resolve, reject) => { let key = "font-cross-site"; - let expected = {"dest":"font", "site":"cross-site", "user":"", "mode": "cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html index ef8e74b..0d78ec06 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html
@@ -55,8 +55,7 @@ "back to same-origin-initiated navigation", same_origin_host, // report_host cross_site_host, // go_back_host - { "dest": "document", - "site": "same-origin", + { "site": "same-origin", "user": "", "mode": "navigate" }); @@ -64,8 +63,7 @@ "back to same-site-initiated navigation", same_site_host, // report_host cross_site_host, // go_back_host - { "dest": "document", - "site": "same-site", + { "site": "same-site", "user": "", "mode": "navigate" }); @@ -73,8 +71,7 @@ "back to cross-site-initiated navigation", cross_site_host, // report_host cross_site_host, // go_back_host - { "dest": "document", - "site": "cross-site", + { "site": "cross-site", "user": "", "mode": "navigate" });
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html index 7b89d8dc..b8f11c66 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html
@@ -42,42 +42,36 @@ } create_test("{{host}}:{{ports[https][0]}}", FORCED, { - "dest": "nested-document", "site": "same-origin", "user": "", "mode": "nested-navigate" }); create_test("{{hosts[][www]}}:{{ports[https][0]}}", FORCED, { - "dest": "nested-document", "site": "same-site", "user": "", "mode": "nested-navigate" }); create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", FORCED, { - "dest": "nested-document", "site": "cross-site", "user": "", "mode": "nested-navigate" }); create_test("{{host}}:{{ports[https][0]}}", USER, { - "dest": "nested-document", "site": "same-origin", "user": "?1", "mode": "nested-navigate" }); create_test("{{hosts[][www]}}:{{ports[https][0]}}", USER, { - "dest": "nested-document", "site": "same-site", "user": "?1", "mode": "nested-navigate" }); create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", USER, { - "dest": "nested-document", "site": "cross-site", "user": "?1", "mode": "nested-navigate"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html index 418e2a2d..c5469f4 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html
@@ -12,7 +12,6 @@ return; assert_header_equals(e.data, { - "dest": "", "site": "", "user": "", "mode": "", @@ -31,7 +30,6 @@ return; assert_header_equals(e.data, { - "dest": "", "site": "", "user": "", "mode": "", @@ -50,7 +48,6 @@ return; assert_header_equals(e.data, { - "dest": "", "site": "", "user": "", "mode": "", @@ -69,7 +66,6 @@ return; assert_header_equals(e.data, { - "dest": "nested-document", "site": "cross-site", "user": "", "mode": "nested-navigate",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html index c3248f6..ced6f984 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html
@@ -13,13 +13,11 @@ .then(result => { headers = result.headers; got = { - "dest": headers["sec-fetch-dest"], "mode": headers["sec-fetch-mode"], "site": headers["sec-fetch-site"], "user": headers["sec-fetch-user"] }; assert_header_equals(got, { - "dest": "image", "site": "same-origin", // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way // that `image.py` encodes data. @@ -35,13 +33,11 @@ .then(result => { headers = result.headers; got = { - "dest": headers["sec-fetch-dest"], "mode": headers["sec-fetch-mode"], "site": headers["sec-fetch-site"], "user": headers["sec-fetch-user"] }; assert_header_equals(got, { - "dest": "image", "site": "same-site", // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way // that `image.py` encodes data. @@ -57,13 +53,11 @@ .then(result => { headers = result.headers; got = { - "dest": headers["sec-fetch-dest"], "mode": headers["sec-fetch-mode"], "site": headers["sec-fetch-site"], "user": headers["sec-fetch-user"] }; assert_header_equals(got, { - "dest": "image", "site": "cross-site", // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way // that `image.py` encodes data.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html index 50857ae..1c2ce953 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html
@@ -6,13 +6,11 @@ <script> test(t => { let expected = { - "dest": "document", "mode": "navigate", "site": "none", }; let actual = { - "dest": "{{headers[sec-fetch-dest]}}", "mode": "{{headers[sec-fetch-mode]}}", "site": "{{headers[sec-fetch-site]}}", // Skipping `Sec-Fetch-User`, as the test harness isn't consistent here.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html index 40ef308..cf1c260 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html
@@ -16,7 +16,7 @@ let e = document.createElement('object'); e.data = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"object", "site":"same-origin", "user":"", "mode":"no-cors"}; + let expected = {"site":"same-origin", "user":"", "mode":"no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -35,7 +35,7 @@ let e = document.createElement('object'); e.data = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"object", "site":"same-site", "user":"", "mode":"no-cors"}; + let expected = {"site":"same-site", "user":"", "mode":"no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -54,7 +54,7 @@ let e = document.createElement('object'); e.data = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"object", "site":"cross-site", "user":"", "mode":"no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode":"no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html index 50f0037..ee24b5ec 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html
@@ -25,22 +25,18 @@ } create_test("{{host}}:{{ports[https][0]}}", { - // TODO(mkwst): 'document' seems right, I guess? Perhaps a portal-specific destination would be better? - "dest": "document", "site": "same-origin", "user": "", "mode": "nested-navigate" }); create_test("{{hosts[][www]}}:{{ports[https][0]}}", { - "dest": "document", "site": "same-site", "user": "", "mode": "nested-navigate" }); create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", { - "dest": "document", "site": "cross-site", "user": "", "mode": "nested-navigate"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html index 1902b9b..30966f872 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html
@@ -30,7 +30,7 @@ }, `<link rel='prefetch' href='https://${host}/...'>`); } - create_test("{{host}}:{{ports[https][0]}}", {"dest":"empty", "site":"same-origin", "user":"", "mode": "cors"}); - create_test("{{hosts[][www]}}:{{ports[https][0]}}", {"dest":"empty", "site":"same-site", "user":"", "mode": "cors"}); - create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {"dest":"empty", "site":"cross-site", "user":"", "mode": "cors"}); + create_test("{{host}}:{{ports[https][0]}}", {"site":"same-origin", "user":"", "mode": "cors"}); + create_test("{{hosts[][www]}}:{{ports[https][0]}}", {"site":"same-site", "user":"", "mode": "cors"}); + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {"site":"cross-site", "user":"", "mode": "cors"}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html index 9dbcad32..e8c541e 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html
@@ -44,8 +44,8 @@ ]; as_tests.forEach(item => { - create_test("{{host}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"same-origin", "user":"", "mode": "cors"}); - create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"same-site", "user":"", "mode": "cors"}); - create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"cross-site", "user":"", "mode": "cors"}); + create_test("{{host}}:{{ports[https][0]}}", item[0], {"site":"same-origin", "user":"", "mode": "cors"}); + create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], {"site":"same-site", "user":"", "mode": "cors"}); + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], {"site":"cross-site", "user":"", "mode": "cors"}); }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html index 4747ebf36..0874273e 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html
@@ -15,7 +15,7 @@ let e = document.createElement('img'); e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) @@ -41,7 +41,7 @@ let e = document.createElement('img'); e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) @@ -67,7 +67,7 @@ let e = document.createElement('img'); e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text())
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html index 8120e76..efff1cd 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html
@@ -17,7 +17,7 @@ e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// cross-site "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin - let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html index a15e681..e7774f6b 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
@@ -19,7 +19,7 @@ <div id="fontTest">Downgraded then upgraded font</div> <script> let nonce = "{{$id}}"; - let expected = { "dest": "", "site": "cross-site", "user": "", "mode": "cors" }; + let expected = { "site": "cross-site", "user": "", "mode": "cors" }; // Validate various scenarios handle a request that redirects from https => http // correctly and avoids disclosure of any Sec- headers. @@ -43,7 +43,6 @@ .then(result => { headers = result.headers; got = { - "dest": headers["sec-fetch-dest"], "mode": headers["sec-fetch-mode"], "site": headers["sec-fetch-site"], "user": headers["sec-fetch-user"] @@ -51,7 +50,6 @@ assert_header_equals(got, { // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way // that `image.py` encodes data. - "dest": undefined, "site": "cross-site", "user": undefined, "mode": "cors", @@ -63,7 +61,7 @@ <script> test(t => { t.add_cleanup(_ => { header = null; }); - assert_header_equals(header, { "dest": "", "site": "cross-site", "user": "", "mode": "no-cors" }); + assert_header_equals(header, { "site": "cross-site", "user": "", "mode": "no-cors" }); }, "Https downgrade-upgrade script => No headers"); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html index 8c65095..b1df738 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html
@@ -17,7 +17,7 @@ e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-site "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin - let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html index 6ba5b94..c7e1721 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html
@@ -19,7 +19,7 @@ <div id="fontTest">Upgraded font</div> <script> let nonce = "{{$id}}"; - let expected = { "dest": "", "site": "cross-site", "user": "", "mode": "cors" }; + let expected = { "site": "cross-site", "user": "", "mode": "cors" }; // Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers. RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected); @@ -42,7 +42,6 @@ .then(result => { headers = result.headers; got = { - "dest": headers["sec-fetch-dest"], "mode": headers["sec-fetch-mode"], "site": headers["sec-fetch-site"], "user": headers["sec-fetch-user"] @@ -50,7 +49,6 @@ assert_header_equals(got, { // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way // that `image.py` encodes data. - "dest": undefined, "site": "cross-site", "user": undefined, "mode": "cors", @@ -63,7 +61,7 @@ <script> test(t => { t.add_cleanup(_ => { header = null; }); - assert_header_equals(header, { "dest": "", "site": "cross-site", "user": "", "mode": "no-cors" }); + assert_header_equals(header, { "site": "cross-site", "user": "", "mode": "no-cors" }); }, "Http upgrade script => No headers"); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html index 54e48e0c..eee21da 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html
@@ -19,7 +19,7 @@ <div id="fontTest">Downgraded font</div> <script> let nonce = token(); - let expected = { "dest": "", "site": "", "user": "", "mode": "" }; + let expected = { "site": "", "user": "", "mode": "" }; // Validate various scenarios handle a request that redirects from https => http correctly and avoids disclosure of any Sec- headers. RunCommonRedirectTests("Https downgrade", downgradeRedirectTo, expected); @@ -42,7 +42,6 @@ .then(result => { headers = result.headers; got = { - "dest": headers["sec-fetch-dest"], "mode": headers["sec-fetch-mode"], "site": headers["sec-fetch-site"], "user": headers["sec-fetch-user"] @@ -50,7 +49,6 @@ assert_header_equals(got, { // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way // that `image.py` encodes data. - "dest": undefined, "site": undefined, "user": undefined, "mode": undefined, @@ -62,7 +60,7 @@ <script> test(t => { t.add_cleanup(_ => { header = null; }); - assert_header_equals(header, { "dest": "", "site": "cross-site", "user": "", "mode": "no-cors" }); + assert_header_equals(header, { "site": "cross-site", "user": "", "mode": "no-cors" }); }, "Https downgrade script => No headers"); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html index b88429c5..a31d2d39 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html
@@ -15,7 +15,7 @@ let e = document.createElement('img'); e.src = "/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"same-origin", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-origin", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) @@ -42,7 +42,7 @@ let e = document.createElement('img'); e.src = "/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) @@ -69,7 +69,7 @@ let e = document.createElement('img'); e.src = "/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html index 795e418..f342b1c2 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html
@@ -15,7 +15,7 @@ let e = document.createElement('img'); e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) @@ -42,7 +42,7 @@ let e = document.createElement('img'); e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) @@ -69,7 +69,7 @@ let e = document.createElement('img'); e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; - let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; e.onload = e => { fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html index 8209fd17..821c56f58 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html
@@ -22,9 +22,9 @@ document.addEventListener("securitypolicyviolation", (e) => { counter++; if (counter == 3) { - generate_test({"dest":"report", "site":"same-origin", "user":"", "mode": "no-cors"}, "same-origin"); - generate_test({"dest":"report", "site":"same-site", "user":"", "mode": "no-cors"}, "same-site"); - generate_test({"dest":"report", "site":"cross-site", "user":"", "mode": "no-cors"}, "cross-site"); + generate_test({"site":"same-origin", "user":"", "mode": "no-cors"}, "same-origin"); + generate_test({"site":"same-site", "user":"", "mode": "no-cors"}, "same-site"); + generate_test({"site":"cross-site", "user":"", "mode": "no-cors"}, "cross-site"); done(); }
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js index 9425246..eac176a 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js
@@ -2,15 +2,72 @@ return tag ? `${tag}: ${text}`: text; } +/** + * @param {object} value + * @param {object} expected + * @param {string} tag + **/ function assert_header_equals(value, expected, tag) { if (typeof(value) === "string"){ assert_not_equals(value, "No header has been recorded"); value = JSON.parse(value); } - assert_equals(value.dest, expected.dest, wrap_by_tag(tag, "dest")); assert_equals(value.mode, expected.mode, wrap_by_tag(tag, "mode")); assert_equals(value.site, expected.site, wrap_by_tag(tag, "site")); if (expected.hasOwnProperty("user")) assert_equals(value.user, expected.user, wrap_by_tag(tag, "user")); } + +/** + * @param {string} header + * @param {object} value + * @param {string} expected + * @param {string} tag + **/ +function assert_header(header, value, expected, tag) { + if (typeof(value) === "string"){ + assert_not_equals(value, "No header has been recorded"); + value = JSON.parse(value); + } + + assert_equals(value[header], expected, wrap_by_tag(tag, header)); +} + +/** + * + * @param {object} value + * @param {string} expected + * @param {string} tag + **/ +function assert_header_dest_equals(value, expected, tag) { + assert_header("dest", value, expected, tag); +} + +/** + * Test fetch record-header.py + * @param {string} key + * @param {string} expected + * @param {function} assert + * @return {Promise<string | never>} + */ +function fetch_record_header(key, expected, assert) { + return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(response => response.text()) + .then(text => assert(text, expected)) +} + +/** + * + * @param {string} key + * @param {string} expected + * @param {function} assert + * @param {function} resolve + * @param {function} reject + * @return {Promise<any>} + */ +function fetch_record_header_with_catch(key, expected, assert, resolve, reject) { + return fetch_record_header(key, expected, assert, resolve) + .then(_ => resolve()) + .catch(e => reject(e)); +}
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html index f877b50..d5a1096e 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html
@@ -10,7 +10,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "script", "site": "same-origin", "user": "", "mode": "no-cors", @@ -25,7 +24,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "script", "site": "same-site", "user": "", "mode": "no-cors", @@ -40,7 +38,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "script", "site": "cross-site", "user": "", "mode": "no-cors", @@ -55,7 +52,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "script", "site": "same-origin", "user": "", "mode": "cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html index 66b82126..b1361516 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html
@@ -10,7 +10,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "", "site": "", "user": "", "mode": "", @@ -25,7 +24,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "", "site": "", "user": "", "mode": "", @@ -40,7 +38,6 @@ t.add_cleanup(_ => { header = null; }); assert_header_equals(header, { - "dest": "", "site": "", "user": "", "mode": "",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html new file mode 100644 index 0000000..469001e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html manifest="/fetch/metadata/resources/record-header.py?file=appcache-manifest{{$id:uuid()}}"> +<meta name="timeout" content="long"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + async_test(t => { + window.applicationCache.oncached = window.applicationCache.onnoupdate = window.applicationCache.onerror = t.step_func(e => { + fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=appcache-manifest{{$id}}") + .then(t.step_func(response => response.text())) + .then(t.step_func_done(text => assert_header_dest_equals(text, ""))) + .catch(t.unreached_func("Fetching and verifying the results should succeed.")); +}); +}, "Appcache!"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html new file mode 100644 index 0000000..d880dee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<meta charset="utf-8"/> +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "embed-same-origin" + nonce; + + let e = document.createElement('embed'); + e.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "embed", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin embed"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "embed-same-site" + nonce; + + let e = document.createElement('embed'); + e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "embed", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Site embed"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "embed-cross-site" + nonce; + + let e = document.createElement('embed'); + e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "embed", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Cross-Site embed"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html new file mode 100644 index 0000000..63d53e8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script> + // Site + promise_test(t => { + return fetch("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", + { + mode: "cors", + headers: { 'x-test': 'testing' } + }) + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "Same-site fetch with preflight"); + + promise_test(t => { + return fetch("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", + { + mode: "cors", + headers: { 'x-test': 'testing' } + }) + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "Cross-site fetch with preflight"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html new file mode 100644 index 0000000..d234157 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<!-- + This test verifies presence of Sec-Fetch-... request headers on a request + handled by a service worker - this test covers the scenario when the service + worker doesn't do anything and the request falls back to the network. +--> +<meta charset="utf-8"/> +<link rel="author" href="lukasza@chromium.org" title="Lukasz Anforowicz"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> +<script src=/common/utils.js></script> +<script> + const nonce = token(); + const key = "fetch-via-serviceworker--fallback--" + nonce; + + promise_test(async function(t) { + const SCOPE = '/fetch/metadata/resources/fetch-via-serviceworker--fallback--frame.html'; + const SCRIPT = '/fetch/metadata/resources/fetch-via-serviceworker--fallback--sw.js'; + const URL = '/fetch/metadata/resources/record-header.py?file=' + key; + const RETRIEVAL_URL = "/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key; + + const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE); + t.add_cleanup(async () => { + if (reg) + await reg.unregister(); + }); + + await wait_for_state(t, reg.installing, 'activated'); + + const frame = await with_iframe(SCOPE); + t.add_cleanup(async () => { + if (frame) + frame.remove(); + }); + + // Trigger a fetch that 1) will go through the service worker and 2) will + // fetch a special URL that records request headers. + await frame.contentWindow.fetch(URL, {mode:'no-cors'}); + + // Retrieve the request headers that have been recorded in the previous step. + const response = await fetch(RETRIEVAL_URL); + const text = await response.text(); + + // Verify presence of the expected Sec-Fetch-... request headers. + assert_header_dest_equals(text, "empty"); + }, 'Sec-Fetch headers after SW fallback'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html new file mode 100644 index 0000000..f70ae8b9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<!-- + This test verifies presence of Sec-Fetch-... request headers on a request + handled by a service worker - this test covers the scenario when the service + worker responds to the `fetch` event with: + event.respondWith(fetch(event.request)); +--> +<meta charset="utf-8"/> +<link rel="author" href="lukasza@chromium.org" title="Lukasz Anforowicz"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> +<script src=/common/utils.js></script> +<script> + const nonce = token(); + const key = "fetch-via-serviceworker--respondWith--" + nonce; + + promise_test(async function(t) { + const SCOPE = '/fetch/metadata/resources/fetch-via-serviceworker--respondWith--frame.html'; + const SCRIPT = '/fetch/metadata/resources/fetch-via-serviceworker--respondWith--sw.js'; + const URL = '/fetch/metadata/resources/record-header.py?file=' + key; + const RETRIEVAL_URL = "/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key; + + const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE); + t.add_cleanup(async () => { + if (reg) + await reg.unregister(); + }); + + await wait_for_state(t, reg.installing, 'activated'); + + const frame = await with_iframe(SCOPE); + t.add_cleanup(async () => { + if (frame) + frame.remove(); + }); + + // Trigger a fetch that 1) will go through the service worker and 2) will + // fetch a special URL that records request headers. + await frame.contentWindow.fetch(URL, {mode:'no-cors'}); + + // Retrieve the request headers that have been recorder in the previous step. + const response = await fetch(RETRIEVAL_URL); + const text = await response.text(); + + // Verify presence of the expected Sec-Fetch-... request headers. + assert_header_dest_equals(text, "empty"); + }, 'Sec-Fetch headers after SW fallback'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html new file mode 100644 index 0000000..99f8191d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script> + // Site + promise_test(t => { + return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "Same-origin fetch"); + + promise_test(t => { + return fetch("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "Same-site fetch"); + + promise_test(t => { + return fetch("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "Cross-site fetch"); + + // Mode + promise_test(t => { + return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", {mode: "same-origin"}) + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "Same-origin mode"); + + promise_test(t => { + return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", {mode: "cors"}) + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "CORS mode"); + + promise_test(t => { + return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", {mode: "no-cors"}) + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "no-CORS mode"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html new file mode 100644 index 0000000..cf6c797 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html
@@ -0,0 +1,23 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script> + // http -> https should see `Sec-Fetch-Site: cross-site`. + // This is a regression test for + // https://github.com/w3c/webappsec-fetch-metadata/issues/34 + promise_test(t => { + assert_equals(location.protocol, "http:"); + return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "empty")); + }, "http->https fetch (cross-scheme => cross-site)"); + + // http -> http should see no `Sec-Fetch-Site`. + promise_test(t => { + assert_equals(location.protocol, "http:"); + return fetch("/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => assert_header_dest_equals(j, "")); + }, "http->http fetch (non-trustworthy destination => no metadata)"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html new file mode 100644 index 0000000..bc892db --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<body> + <div id="test1">1</div> + <div id="test2">2</div> + <div id="test3">3</div> + <!-- Same-Origin request --> + <style> + @font-face { + font-family: myFirstFont; + src: url(https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=font-same-origin); + } + #test1 { + font-family: myFirstFont; + } + </style> + + <!-- Same-Site request --> + <style> + @font-face { + font-family: mySecondFont; + src: url(https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=font-same-site); + } + #test2 { + font-family: mySecondFont; + } + </style> + + <!-- Cross-Site request --> + <style> + @font-face { + font-family: myThirdFont; + src: url(https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=font-cross-site); + } + #test3 { + font-family: myThirdFont; + } + </style> +</body> +<script> + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-same-origin"; + fetch_record_header_with_catch(key, "font", assert_header_dest_equals, resolve, reject); + }); + }, "Same-Origin font"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-same-site"; + fetch_record_header_with_catch(key, "font", assert_header_dest_equals, resolve, reject); + }); + }, "Same-Site font"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-cross-site"; + fetch_record_header_with_catch(key, "font", assert_header_dest_equals, resolve, reject); + }); + }, "Cross-Site font"); + + }); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html new file mode 100644 index 0000000..55e03a2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html
@@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script> + +// Test that correct `Sec-Fetch-Site` (and other `Sec-Fetch-...` request +/// headers) are used in navigations triggered by |history.back()|. +function add_test(description, report_host, go_back_host, expectation) { + async_test(t => { + // STEP1: Navigate a new window to report_host/post-to-owner.py + const url_suffix = '/fetch/metadata/resources/post-to-owner.py' + const url = `https://${report_host}${url_suffix}`; + const w = window.open(url, '_blank'); + + var msg_counter = 0; + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + msg_counter = msg_counter + 1; + if (msg_counter == 1) { + // STEP2: Verify the headers (this is a sanity check that the same + // headers are used here and in STEP5). + assert_header_dest_equals(e.data, expectation); + + // STEP3: Go to go_back_host/go-back.html (postponing this via + // step_timeout ensures that go-back.html will get a separate + // history entry - otherwise it might be treated as a client-side + // redirect and we might end up with nowhere to go back to). + t.step_timeout(() => { + const url_suffix = '/fetch/metadata/resources/go-back.html' + const url = `https://${go_back_host}${url_suffix}`; + w.location = url; + }); + + // STEP4 (elsewhere - inside go-back.html): Call history.back(). + } else if (msg_counter == 2) { + // STEP5: Verify the headers (this is the main verification and focus + // of the test). + assert_header_dest_equals(e.data, expectation); + + // STEP6: Finish the test. + t.done(); + } + })); + }, description); +} + +const same_origin_host = "{{host}}:{{ports[https][0]}}"; +const same_site_host = "{{hosts[][www]}}:{{ports[https][0]}}"; +const cross_site_host = "{{hosts[alt][www]}}:{{ports[https][0]}}"; + +add_test( + "back to same-origin-initiated navigation", + same_origin_host, // report_host + cross_site_host, // go_back_host + "document"); + +add_test( + "back to same-site-initiated navigation", + same_site_host, // report_host + cross_site_host, // go_back_host + "document"); + +add_test( + "back to cross-site-initiated navigation", + cross_site_host, // report_host + cross_site_host, // go_back_host + "document"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html new file mode 100644 index 0000000..ed9cfa0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> +<script> + const USER = true; + const FORCED = false; + + function create_test(host, user_activated, expectations) { + async_test(t => { + let i = document.createElement('iframe'); + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) + return; + + assert_header_dest_equals(e.data, expectations); + t.done(); + })); + + let url = `https://${host}/fetch/metadata/resources/post-to-owner.py`; + if (user_activated == FORCED) { + i.src = url; + document.body.appendChild(i); + } else if (user_activated == USER) { + let uuid = token(); + i.name = uuid; + let a = document.createElement('a'); + a.href = url; + a.target = uuid; + a.text = "This is a link!"; + + document.body.appendChild(i); + document.body.appendChild(a); + + test_driver.click(a); + } + }, `{{host}} -> ${host} iframe: ${user_activated ? "user-activated" : "forced"}`); + } + + create_test("{{host}}:{{ports[https][0]}}", FORCED, "nested-document"); + + create_test("{{hosts[][www]}}:{{ports[https][0]}}", FORCED, "nested-document"); + + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", FORCED, "nested-document"); + + create_test("{{host}}:{{ports[https][0]}}", USER, "nested-document"); + + create_test("{{hosts[][www]}}:{{ports[https][0]}}", USER, "nested-document"); + + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", USER, "nested-document"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html new file mode 100644 index 0000000..d90a414 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html
@@ -0,0 +1,62 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<body> +<script> + async_test(t => { + let i = document.createElement('iframe'); + i.src = "http://{{host}}:{{ports[http][0]}}/fetch/metadata/resources/post-to-owner.py"; + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) + return; + + assert_header_dest_equals(e.data, ""); + t.done(); + })); + + document.body.appendChild(i); + }, "Non-secure same-origin iframe => No headers"); + + async_test(t => { + let i = document.createElement('iframe'); + i.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/fetch/metadata/resources/post-to-owner.py"; + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) + return; + + assert_header_dest_equals(e.data, ""); + t.done(); + })); + + document.body.appendChild(i); + }, "Non-secure same-site iframe => No headers"); + + async_test(t => { + let i = document.createElement('iframe'); + i.src = "http://{{hosts[alt][www]}}:{{ports[http][0]}}/fetch/metadata/resources/post-to-owner.py"; + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) + return; + + assert_header_dest_equals(e.data, ""); + t.done(); + })); + + document.body.appendChild(i); + }, "Non-secure cross-site iframe => No headers."); + + async_test(t => { + let i = document.createElement('iframe'); + i.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"; + window.addEventListener('message', t.step_func(e => { + if (e.source != i.contentWindow) + return; + + assert_header_dest_equals(e.data, "nested-document"); + t.done(); + })); + + document.body.appendChild(i); + }, "Secure, cross-site (cross-scheme, same-host) iframe"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html new file mode 100644 index 0000000..f6b84b1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/common/security-features/resources/common.sub.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<body> +<script> + // These tests reuse the `referrer-policy` infrastructure to load images that + // encode their request headers in their pixels. Fun stuff! + promise_test(() => + requestViaImage( + "https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py") + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"] + }; + assert_header_dest_equals(got, "image"); + }), + "Same-origin image"); + + promise_test(() => + requestViaImage( + "https://{{hosts[][www]}}:{{ports[https][0]}}/common/security-features/subresource/image.py") + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"] + }; + assert_header_dest_equals(got, "image"); + }), + "Same-site image"); + + promise_test(() => + requestViaImage( + "https://{{hosts[alt][www]}}:{{ports[https][0]}}/common/security-features/subresource/image.py") + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"] + }; + assert_header_dest_equals(got, "image"); + }), + "Cross-site image"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/navigation.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/navigation.https.sub.html new file mode 100644 index 0000000..3ab843d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/navigation.https.sub.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script> + test(t => { + let actual = { + "dest": "{{headers[sec-fetch-dest]}}" + }; + + assert_header_dest_equals(actual, "document"); + }, "This page's top-level navigation."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html new file mode 100644 index 0000000..29db5111 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<meta charset="utf-8"/> +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "object-same-origin" + nonce; + + let e = document.createElement('object'); + e.data = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "object", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin object"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "object-same-site" + nonce; + + let e = document.createElement('object'); + e.data = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "object", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Site object"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "object-cross-site" + nonce; + + let e = document.createElement('object'); + e.data = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "object", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Cross-Site object"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html new file mode 100644 index 0000000..ad9e8fd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> +<script> + const USER = true; + const FORCED = false; + + function create_test(host, expectation) { + async_test(t => { + let p = document.createElement('portal'); + p.addEventListener('message', t.step_func(e => { + assert_header_dest_equals(e.data, expectation); + t.done(); + })); + + let url = `https://${host}/fetch/metadata/resources/post-to-owner.py`; + p.src = url; + document.body.appendChild(p); + }, `{{host}} -> ${host} portal`); + } + + // TODO(mkwst): 'document' seems right, I guess? Perhaps a portal-specific destination would be better? + create_test("{{host}}:{{ports[https][0]}}", "document"); + + create_test("{{hosts[][www]}}:{{ports[https][0]}}", "document"); + + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", "document"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html new file mode 100644 index 0000000..be495ba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + test(t => { + assert_true(document.createElement('link').relList.supports('prefetch')); + }, "Browser supports prefetch."); + + function create_test(host, expected) { + async_test(t => { + let nonce = token(); + let key = "prefetch" + nonce; + + let e = document.createElement('link'); + e.rel = "prefetch"; + e.href = `https://${host}/fetch/metadata/resources/record-header.py?file=${key}`; + e.setAttribute("crossorigin", "crossorigin"); + e.onload = t.step_func(e => { + fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(t.step_func(response => response.text())) + .then(t.step_func_done(text => assert_header_dest_equals(text, expected))) + .catch(t.unreached_func("Fetching and verifying the results should succeed.")); + }); + e.onerror = t.unreached_func(); + + document.head.appendChild(e); + }, `<link rel='prefetch' href='https://${host}/...'>`); + } + + create_test("{{host}}:{{ports[https][0]}}", "empty"); + create_test("{{hosts[][www]}}:{{ports[https][0]}}", "empty"); + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", "empty"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html new file mode 100644 index 0000000..2c82abb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + test(t => { + assert_true(document.createElement('link').relList.supports('preload')); + }, "Browser supports preload."); + + function create_test(host, as, expected) { + async_test(t => { + let nonce = "{{uuid()}}"; + let key = as + nonce; + + let e = document.createElement('link'); + e.rel = "preload"; + e.href = `https://${host}/fetch/metadata/resources/record-header.py?file=${key}`; + e.setAttribute("crossorigin", "crossorigin"); + if (as !== undefined) { + e.setAttribute("as", as); + } + e.onload = e.onerror = t.step_func_done(e => { + fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) + .then(t.step_func(response => response.text())) + .then(t.step_func(text => assert_header_dest_equals(text, expected))) + .then(t.step_func_done(_ => resolve())) + .catch(t.unreached_func()); + }); + + document.head.appendChild(e); + }, `<link rel='preload' as='${as}' href='https://${host}/...'>`); + } + + let as_tests = [ + [ "fetch", "empty" ], + [ "font", "font" ], + [ "image", "image" ], + [ "script", "script" ], + [ "style", "style" ], + [ "track", "track" ], + ]; + + as_tests.forEach(item => { + create_test("{{host}}:{{ports[https][0]}}", item[0], item[1]); + create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], item[1]); + create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], item[1]); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html new file mode 100644 index 0000000..ea13cc8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html
@@ -0,0 +1,62 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-cross-site-same-origin" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Cross-Site -> Same-Origin redirect"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-cross-site-same-site" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Cross-Site -> Same-Site redirect"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-cross-site-cross-site" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Cross-Site -> Cross-Site redirect"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html new file mode 100644 index 0000000..e74ce0c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-multiple-cross-site" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin + "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// cross-site + "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin -> Cross-Site -> Same-Origin redirect"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html new file mode 100644 index 0000000..78ee10d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/fetch/metadata/resources/redirectTestHelper.sub.js></script> +<script src=/common/security-features/resources/common.sub.js></script> +<script src=/common/utils.js></script> +<style> + @font-face { + font-family: myDowngradeUpgradeFont; + src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fmetadata%252Fresources%252Frecord-header.py%253Ffile%253Dfont-https-downgrade-upgrade{{$id:uuid()}}); + } + #fontTest { + font-family: myDowngradeUpgradeFont; + } +</style> +<body> + <div id="fontTest">Downgraded then upgraded font</div> + <script> + let nonce = "{{$id}}"; + + // Validate various scenarios handle a request that redirects from https => http + // correctly and avoids disclosure of any Sec- headers. + RunCommonRedirectTests("Https downgrade-upgrade", MultipleRedirectTo, expected); + + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-https-downgrade-upgrade{{$id}}"; + return fetch_record_header_with_catch(key, "", assert_header_dest_equals, resolve, reject); + }); + }, "Https downgrade-upgrade font => No headers"); + }); + + promise_test(() => { + return requestViaImage(secureRedirectURL + encodeURIComponent(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py"))) + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"] + }; + // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way + // that `image.py` encodes data. + assert_header_dest_equals(got, undefined); + }); + }, "Https downgrade-upgrade image => No headers"); +</script> +<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fmetadata%252Fresources%252Fecho-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + assert_header_dest_equals(header, ""); + }, "Https downgrade-upgrade script => No headers"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html new file mode 100644 index 0000000..90a476684 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-multiple-same-site" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin + "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-site + "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin + + e.onload = e => { + return fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + return fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin -> Same-Site -> Same-Origin redirect"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html new file mode 100644 index 0000000..a31efcb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/fetch/metadata/resources/redirectTestHelper.sub.js></script> +<script src=/common/security-features/resources/common.sub.js></script> +<script src=/common/utils.js></script> +<style> + @font-face { + font-family: myUpgradedFont; + src: url(http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fmetadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-upgrade{{$id:uuid()}}); + } + #fontTest { + font-family: myUpgradedFont; + } +</style> +<body> + <div id="fontTest">Upgraded font</div> + <script> + let nonce = "{{$id}}"; + + // Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers. + RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected); + + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-https-upgrade{{$id}}"; + fetch_record_header_with_catch(key, "", assert_header_dest_equals, resolve, reject); + }); + }, "Http upgrade font => No headers"); + }); + + promise_test(() => { + return requestViaImage(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py")) + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"] + }; + // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way + // that `image.py` encodes data. + assert_header_dest_equals(got, undefined); + }); + }, "Http upgrade image => No headers"); +</script> + +<script src="http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fmetadata%2Fresources%2Fecho-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + assert_header_dest_equals(header, ""); + }, "Http upgrade script => No headers"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub-expected.txt new file mode 100644 index 0000000..f6bcb6a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL redirect-https-downgrade Uncaught SyntaxError: Unexpected token 'return' +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html new file mode 100644 index 0000000..425753cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/fetch/metadata/resources/redirectTestHelper.sub.js></script> +<script src=/common/security-features/resources/common.sub.js></script> +<script src=/common/utils.js></script> +<style> + @font-face { + font-family: myDowngradedFont; + src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fmetadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-downgrade); + } + #fontTest { + font-family: myDowngradedFont; + } +</style> +<body> + <div id="fontTest">Downgraded font</div> + <script> + let nonce = token(); + + // Validate various scenarios handle a request that redirects from https => http correctly and avoids disclosure of any Sec- headers. + RunCommonRedirectTests("Https downgrade", downgradeRedirectTo, expected); + + document.fonts.ready.then(function () { + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "font-https-downgrade"; + fetch_record_header_with_catch(key, "", assert_header_dest_equals, resolve, reject); + }); + }, "Https downgrade font => No headers"); + }); + + promise_test(() => + return requestViaImage(secureRedirectURL + encodeURIComponent("http://{{host}}:{{ports[http][0]}}/common/security-features/subresource/image.py")) + .then(result => { + headers = result.headers; + got = { + "dest": headers["sec-fetch-dest"] + }; + // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way + // that `image.py` encodes data. + assert_header_dest_equals(got, undefined); + }), "Https downgrade image => No headers"); +</script> + +<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fmetadata%2Fresources%2Fecho-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + assert_header_dest_equals(header, ""); + }, "Https downgrade script => No headers"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html new file mode 100644 index 0000000..9b8b44b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html
@@ -0,0 +1,65 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-same-origin-same-origin" + nonce; + + let e = document.createElement('img'); + e.src = "/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin -> Same-Origin redirect"); + +promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-same-origin-same-site" + nonce; + + let e = document.createElement('img'); + e.src = "/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin -> Same-Site redirect"); + +promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-same-origin-cross-site" + nonce; + + let e = document.createElement('img'); + e.src = "/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin -> Cross-Site redirect"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html new file mode 100644 index 0000000..2f12fe0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html
@@ -0,0 +1,65 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-same-site-same-origin" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Site -> Same-Origin redirect"); + +promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-same-site-same-site" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Site -> Same-Site redirect"); + +promise_test(t => { + return new Promise((resolve, reject) => { + let key = "redirect-same-site-cross-site" + nonce; + + let e = document.createElement('img'); + e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + + e.onload = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + e.onerror = e => { + fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Site -> Cross-Site redirect"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html new file mode 100644 index 0000000..d3cb7e1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<link id="style" href="https://foo.bar" rel="stylesheet"> +<body></body> +<script> + setup({ explicit_done: true }); + function generate_test(expected, name) { + async_test(t => { + t.step_timeout(_ => { + return fetch_record_header("report-" + name, expected, assert_header_dest_equals) + .then(_ => t.done()); + }, 1000); + }, name + " report"); + } + + let counter = 0; + document.addEventListener("securitypolicyviolation", (e) => { + counter++; + if (counter == 3) { + generate_test("report", "same-origin"); + generate_test("report", "same-site"); + generate_test("report", "cross-site"); + + done(); + } + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers new file mode 100644 index 0000000..1ec5df7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers
@@ -0,0 +1,3 @@ +Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri /fetch/metadata/resources/record-header.py?file=report-same-origin +Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=report-same-site +Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=report-cross-site
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html new file mode 100644 index 0000000..18e8be78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html
@@ -0,0 +1,44 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> + +<!-- Same-origin script --> +<script src="https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, "script"); + }, "Same-origin script"); +</script> + +<!-- Same-site script --> +<script src="https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, "script"); + }, "Same-site script"); +</script> + +<!-- Cross-site script --> +<script src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, "script"); + }, "Cross-site script"); +</script> + +<!-- Same-origin script, CORS mode --> +<script src="https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py" crossorigin="anonymous"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, "script"); + }, "Same-origin CORS script"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.sub.html new file mode 100644 index 0000000..0512dc6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.sub.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> + +<!-- Same-origin script --> +<script src="http://{{host}}:{{ports[http][0]}}/fetch/metadata/resources/echo-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, ""); + }, "Non-secure same-origin script => No headers"); +</script> + +<!-- Same-site script --> +<script src="http://{{hosts[][www]}}:{{ports[http][0]}}/fetch/metadata/resources/echo-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, ""); + }, "Non-secure same-site script => No headers"); +</script> + +<!-- Cross-site script --> +<script src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/fetch/metadata/resources/echo-as-script.py"></script> +<script> + test(t => { + t.add_cleanup(_ => { header = null; }); + + assert_header_dest_equals(header, ""); + }, "Non-secure cross-site script => No headers"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html new file mode 100644 index 0000000..1faee65 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<!-- + This test verifies presence of Sec-Fetch-... request headers on a request + that fetches the service worker script itself (i.e. the script at the URL + passed as an argument to navigator.serviceWorker.register). +--> +<meta charset="utf-8"/> +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> + <script> + promise_test(async t => { + const nonce = token(); + const key = "serviceworker-same-origin" + nonce; + + // Register a service worker and check the request header. + const registration = await navigator.serviceWorker.register('https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=' + key); + t.add_cleanup(() => registration.unregister()); + await retrieve_and_assert_headers(key, 'Register service worker'); + + // Trigger an update check and check the request header again. + await registration.update(); + await retrieve_and_assert_headers(key, 'Update service worker'); + }, 'metadata for service worker scripts'); + + async function retrieve_and_assert_headers(key, tag) { + const response = await fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) + const text = await response.text(); + assert_header_dest_equals(text, "serviceworker", tag); + } + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html new file mode 100644 index 0000000..882572c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<script> + let nonce = token(); + let key = "sharedworker-same-origin" + nonce; + + // TESTS // + if (window.Worker) { + + // Same-Origin test + var sharedWorker = new SharedWorker('/fetch/metadata/resources/record-header.py?file=' + key); + sharedWorker.port.start(); + + sharedWorker.onerror = function(){ + test_same_origin(); + } + sharedWorker.port.onmessage = function(e) { + test_same_origin(); + } + sharedWorker.port.postMessage("Ready"); + } + + function test_same_origin(){ + promise_test(t => { + return new Promise((resolve, reject) => { + fetch_record_header_with_catch(key, "sharedworker", assert_header_dest_equals, resolve, reject); + }) + }, "Same-Origin sharedworker") + } +</script> +<body></body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html new file mode 100644 index 0000000..ed30c81c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body></body> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "style-same-origin" + nonce; + + let e = document.createElement('link'); + e.rel = "stylesheet"; + e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin style"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "style-same-site" + nonce; + + let e = document.createElement('link'); + e.rel = "stylesheet"; + e.href = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Site style"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "style-cross-site" + nonce; + + let e = document.createElement('link'); + e.rel = "stylesheet"; + e.href = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.onload = e => { + fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Cross-Site style"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "style-same-origin-cors" + nonce; + + let e = document.createElement('link'); + e.rel = "stylesheet"; + e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + e.crossOrigin = "anonymous"; + e.onload = e => { + fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject); + }; + + document.body.appendChild(e); + }) + }, "Same-Origin, cors style"); +</script> +</html> +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html new file mode 100644 index 0000000..09e927f1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html
@@ -0,0 +1,88 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> +</body> +<script> + let nonce = token(); + + function createVideoElement() { + let el = document.createElement('video'); + el.src = "/media/movie_5.mp4"; + el.setAttribute("controls", ""); + el.setAttribute("crossorigin", ""); + return el; + } + + function createTrack() { + let el = document.createElement("track"); + el.setAttribute("default", ""); + el.setAttribute("kind", "captions"); + el.setAttribute("srclang", "en"); + return el; + } + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "track-same-origin" + nonce; + let video = createVideoElement(); + let el = createTrack(); + el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + el.onload = t.step_func(_ => { + fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject); + }); + video.appendChild(el); + document.body.appendChild(video); + }); + }, "Same-Origin track"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "track-same-site" + nonce; + let video = createVideoElement(); + let el = createTrack(); + el.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + el.onload = t.step_func(_ => { + fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject); + }); + video.appendChild(el); + document.body.appendChild(video); + }); + }, "Same-Site track"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "track-cross-site" + nonce; + let video = createVideoElement(); + let el = createTrack(); + el.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + el.onload = t.step_func(_ => { + fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject); + }); + video.appendChild(el); + document.body.appendChild(video); + }); + }, "Cross-Site track"); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "track-same-origin-cors" + nonce; + let video = createVideoElement(); + + // Unset `crossorigin` to change the CORS mode: + video.crossOrigin = undefined; + + let el = createTrack(); + el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; + el.onload = t.step_func(_ => { + fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject); + }); + video.appendChild(el); + document.body.appendChild(video); + }); + }, "Same-Origin, CORS track"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html new file mode 100644 index 0000000..283b928 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script> + // Site + promise_test(t => { + return fetch("https://{{host}}.:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => { + assert_header_dest_equals(j, "empty"); + }); + }, "Fetching a resource from the same origin, but spelled with a trailing dot."); + + promise_test(t => { + return fetch("https://{{hosts[][www]}}.:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => { + assert_header_dest_equals(j, "empty"); + }); + }, "Fetching a resource from the same site, but spelled with a trailing dot."); + + promise_test(t => { + return fetch("https://{{hosts[alt][www]}}.:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py") + .then(r => r.json()) + .then(j => { + assert_header_dest_equals(j, "empty"); + }); + }, "Fetching a resource from a cross-site host, spelled with a trailing dot."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html new file mode 100644 index 0000000..a702fb83 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html
@@ -0,0 +1,58 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<body> +<script> + // The test + // 1. Creates a same-origin iframe + // 2. Adds to the iframe an unload handler that will + // trigger a request to <unload_request_url>/.../record-header.py... + // 3. Navigate the iframe to a cross-origin url (to data: url) + // 4. Waits until the request goes through + // 5. Verifies Sec-Fetch-Site request header of the request. + // + // This is a regression test for https://crbug.com/986577. + function create_test(unload_request_origin, expectation) { + async_test(t => { + // STEP 1: Create an iframe. + let nonce = token(); + let key = "unload-test-" + nonce; + let url = unload_request_origin + + "/fetch/metadata/resources/record-header.py?file=" + key; + let i = document.createElement('iframe'); + i.src = '/fetch/metadata/resources/unload-with-beacon.html'; + i.onload = () => { + // STEP 2: Ask the iframe to add an unload handler. + i.contentWindow.postMessage(url, '*'); + }; + window.addEventListener('message', e => { + // STEP 3: Navigate the iframe away + i.contentWindow.location = 'data:text/html,DONE'; + }); + document.body.appendChild(i); + + // STEPS 4 and 5: Wait for the beacon to go through and verify + // the request headers. + function wait_and_verify() { + t.step_timeout(() => { + let callback_method = text => t.step(() => { + if (text == "No header has been recorded") { + wait_and_verify(); + return; + } + assert_header_dest_equals(text, expectation); + t.done(); + }); + fetch_record_header(key, expectation, callback_method); + }, 200); + } + wait_and_verify(); + }, "Fetch from an unload handler"); + } + + create_test("https://{{host}}:{{ports[https][0]}}", "empty"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html new file mode 100644 index 0000000..650ba6a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html
@@ -0,0 +1,154 @@ +<!DOCTYPE html> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<body> +<script> + // Forced navigations: + async_test(t => { + let w = window.open("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + t.done(); + })); + }, "Same-origin window, forced"); + + async_test(t => { + let w = window.open("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + t.done(); + })); + }, "Same-site window, forced"); + + async_test(t => { + let w = window.open("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + t.done(); + })); + }, "Cross-site window, forced"); + + async_test(t => { + let w = window.open("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + let messages = 0; + window.addEventListener('message', t.step_func(e => { + messages++; + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + + if (messages == 1) { + w.location.reload(); + } else { + t.done(); + } + })); + }, "Same-origin window, forced, reloaded"); + + async_test(t => { + let w = window.open("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + let messages = 0; + window.addEventListener('message', t.step_func(e => { + messages++; + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + + if (messages == 1) { + w.location.reload(); + } else { + t.done(); + } + })); + }, "Same-site window, forced, reloaded"); + + async_test(t => { + let w = window.open("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + let messages = 0; + window.addEventListener('message', t.step_func(e => { + messages++; + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + + if (messages == 1) { + w.location.reload(); + } else { + t.done(); + } + })); + }, "Cross-site window, forced, reloaded"); + + // User-activated navigations: + async_test(t => { + let b = document.createElement('button'); + b.onclick = t.step_func(_ => { + let w = window.open("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + t.done(); + })); + }); + document.body.appendChild(b); + test_driver.click(b); + }, "Same-origin window, user-activated"); + + async_test(t => { + let b = document.createElement('button'); + b.onclick = t.step_func(_ => { + let w = window.open("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + t.done(); + })); + }); + document.body.appendChild(b); + test_driver.click(b); + }, "Same-site window, user-activated"); + + async_test(t => { + let b = document.createElement('button'); + b.onclick = t.step_func(_ => { + let w = window.open("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py"); + t.add_cleanup(_ => w.close()); + window.addEventListener('message', t.step_func(e => { + if (e.source != w) + return; + + assert_header_dest_equals(e.data, "document"); + t.done(); + })); + }); + document.body.appendChild(b); + test_driver.click(b); + }, "Cross-site window, user-activated"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html new file mode 100644 index 0000000..8e40fb6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<script> + let nonce = token(); + + promise_test(t => { + return new Promise((resolve, reject) => { + let key = "worker-same-origin" + nonce; + let w = new Worker("/fetch/metadata/resources/record-header.py?file=" + key); + w.onmessage = e => { + fetch_record_header_with_catch(key, "worker", assert_header_dest_equals, resolve, reject); + }; + }); + }, "Same-Origin worker"); +</script> +<body></body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub-expected.txt new file mode 100644 index 0000000..be26fdf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +PASS Same-Origin xslt +FAIL Same-site xslt assert_not_equals: got disallowed value "No header has been recorded" +FAIL Cross-site xslt assert_not_equals: got disallowed value "No header has been recorded" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html new file mode 100644 index 0000000..df44514f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> + +<link rel="author" href="mtrzos@google.com" title="Maciek Trzos"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/fetch/metadata/resources/helper.js></script> +<script src=/common/utils.js></script> +<script> + // Open a window with XML document which loads resources via <?xml-stylesheet/> tag + let nonce = token(); + let w = window.open("/fetch/metadata/resources/xslt-test.sub.xml?token=" + nonce); + window.addEventListener('message', function(e) { + if (e.source != w) + return; + + promise_test(t => { + return fetch_record_header("xslt-same-origin" + nonce, "xslt", assert_header_dest_equals); + }, "Same-Origin xslt"); + + promise_test(t => { + return fetch_record_header("xslt-same-site" + nonce, "xslt", assert_header_dest_equals); + }, "Same-site xslt"); + + promise_test(t => { + return fetch_record_header("xslt-cross-site" + nonce, "xslt", assert_header_dest_equals); + }, "Cross-site xslt"); + + w.close(); + }); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html index 6fdb37a7f..1fbdee4 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html
@@ -27,8 +27,8 @@ }, 'metadata for service worker scripts'); async function retrieve_and_assert_headers(key, tag) { - let expected = { "dest": "serviceworker", "site": "same-origin", "user": "", "mode": "same-origin" }; - const response = await fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) + let expected = { "site": "same-origin", "user": "", "mode": "same-origin" }; + const response = await fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key); const text = await response.text(); assert_header_equals(text, expected, tag); }
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html index 9014415..0408c442 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html
@@ -28,7 +28,7 @@ function test_same_origin(){ promise_test(t => { return new Promise((resolve, reject) => { - let expected = {"dest":"sharedworker", "site":"same-origin", "user":"", "mode": "same-origin"}; + let expected = {"site":"same-origin", "user":"", "mode": "same-origin"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text())
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html index 1f875e8c..08ac184 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html
@@ -17,7 +17,7 @@ e.rel = "stylesheet"; e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"style", "site":"same-origin", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-origin", "user":"", "mode": "no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -37,7 +37,7 @@ e.rel = "stylesheet"; e.href = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"style", "site":"same-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-site", "user":"", "mode": "no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -57,7 +57,7 @@ e.rel = "stylesheet"; e.href = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.onload = e => { - let expected = {"dest":"style", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected)) @@ -78,7 +78,7 @@ e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; e.crossOrigin = "anonymous"; e.onload = e => { - let expected = {"dest":"style", "site":"same-origin", "user":"", "mode": "cors"}; + let expected = {"site":"same-origin", "user":"", "mode": "cors"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html index 63d7637..11e45e2 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html
@@ -34,7 +34,6 @@ el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; el.onload = t.step_func(_ => { expected = { - "dest": "track", "site": "same-origin", "user": "", "mode": "cors" // Because the `video` element has `crossorigin` @@ -57,7 +56,6 @@ el.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; el.onload = t.step_func(_ => { expected = { - "dest": "track", "site": "same-site", "user": "", "mode": "cors" // Because the `video` element has `crossorigin` @@ -82,7 +80,6 @@ el.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; el.onload = t.step_func(_ => { expected = { - "dest": "track", "site": "cross-site", "user": "", "mode": "cors" // Because the `video` element has `crossorigin` @@ -110,7 +107,6 @@ el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key; el.onload = t.step_func(_ => { expected = { - "dest":"track", "site":"same-origin", "user":"", "mode": "same-origin"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html index f1a0ad1..f7069e72 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html
@@ -9,7 +9,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "cross-site", "user": "", "mode": "cors", @@ -22,7 +21,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "cross-site", "user": "", "mode": "cors", @@ -35,7 +33,6 @@ .then(r => r.json()) .then(j => { assert_header_equals(j, { - "dest": "empty", "site": "cross-site", "user": "", "mode": "cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html index c93ecab3..8917c53a 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html
@@ -56,7 +56,6 @@ } create_test("https://{{host}}:{{ports[https][0]}}", { - "dest": "empty", "site": "same-origin", "user": "", "mode": "no-cors"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html index 79f1eec8..29c325f 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html
@@ -15,7 +15,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "same-origin", "user": "", "mode": "navigate", @@ -32,7 +31,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "same-site", "user": "", "mode": "navigate", @@ -49,7 +47,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "cross-site", "user": "", "mode": "navigate", @@ -68,7 +65,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "same-origin", "user": "", "mode": "navigate", @@ -92,7 +88,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "same-site", "user": "", "mode": "navigate", @@ -116,7 +111,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "cross-site", "user": "", "mode": "navigate", @@ -141,7 +135,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "same-origin", "user": "?1", "mode": "navigate", @@ -163,7 +156,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "same-site", "user": "?1", "mode": "navigate", @@ -185,7 +177,6 @@ return; assert_header_equals(e.data, { - "dest": "document", "site": "cross-site", "user": "?1", "mode": "navigate",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html index df1abc4b..d2162d5 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html
@@ -13,7 +13,7 @@ let key = "worker-same-origin" + nonce; let w = new Worker("/fetch/metadata/resources/record-header.py?file=" + key); w.onmessage = e => { - let expected = {"dest":"worker", "site":"same-origin", "user":"", "mode": "same-origin"}; + let expected = {"site":"same-origin", "user":"", "mode": "same-origin"}; fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key) .then(response => response.text()) .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html index 6e4f186d..5fc647b 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html
@@ -14,21 +14,21 @@ return; promise_test(t => { - let expected = {"dest":"xslt", "site":"same-origin", "user":"", "mode": "same-origin"}; + let expected = {"site":"same-origin", "user":"", "mode": "same-origin"}; return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=xslt-same-origin" + nonce) .then(response => response.text()) .then(text => assert_header_equals(text, expected)); }, "Same-Origin xslt"); promise_test(t => { - let expected = {"dest":"xslt", "site":"same-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"same-site", "user":"", "mode": "no-cors"}; return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=xslt-same-site" + nonce) .then(response => response.text()) .then(text => assert_header_equals(text, expected)); }, "Same-site xslt"); promise_test(t => { - let expected = {"dest":"xslt", "site":"cross-site", "user":"", "mode": "no-cors"}; + let expected = {"site":"cross-site", "user":"", "mode": "no-cors"}; return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=xslt-cross-site" + nonce) .then(response => response.text()) .then(text => assert_header_equals(text, expected));
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt new file mode 100644 index 0000000..7aceba49 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt
@@ -0,0 +1,94 @@ +This is a testharness.js-based test. +Found 90 tests; 42 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Basic sanity-checking (cross-origin) +PASS Basic sanity-checking (same-origin + document.domain) +PASS Basic sanity-checking (cross-site) +FAIL Only whitelisted properties are accessible cross-origin (cross-origin) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL Only whitelisted properties are accessible cross-origin (same-origin + document.domain) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL Only whitelisted properties are accessible cross-origin (cross-site) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL Only whitelisted properties are usable as cross-origin this objects (cross-origin) promise_test: Unhandled rejection with value: object "SecurityError: Failed to execute 'replace' on 'Location': The current window does not have permission to navigate the target frame to 'javascript:undefined'." +FAIL Only whitelisted properties are usable as cross-origin this objects (same-origin + document.domain) promise_test: Unhandled rejection with value: object "SecurityError: Failed to execute 'replace' on 'Location': The current window does not have permission to navigate the target frame to 'javascript:undefined'." +FAIL Only whitelisted properties are usable as cross-origin this objects (cross-site) promise_test: Unhandled rejection with value: object "SecurityError: Failed to execute 'replace' on 'Location': The current window does not have permission to navigate the target frame to 'javascript:undefined'." +PASS [[GetPrototypeOf]] should return null (cross-origin) +PASS [[GetPrototypeOf]] should return null (same-origin + document.domain) +PASS [[GetPrototypeOf]] should return null (cross-site) +FAIL [[SetPrototypeOf]] should return false (cross-origin) assert_throws: proto setter |call| on cross-origin Window function "function() { protoSetter.call(win, new Object()); }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError") +FAIL [[SetPrototypeOf]] should return false (same-origin + document.domain) assert_throws: proto setter |call| on cross-origin Window function "function() { protoSetter.call(win, new Object()); }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError") +FAIL [[SetPrototypeOf]] should return false (cross-site) assert_throws: proto setter |call| on cross-origin Window function "function() { protoSetter.call(win, new Object()); }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError") +PASS [[IsExtensible]] should return true for cross-origin objects (cross-origin) +PASS [[IsExtensible]] should return true for cross-origin objects (same-origin + document.domain) +PASS [[IsExtensible]] should return true for cross-origin objects (cross-site) +FAIL [[PreventExtensions]] should throw for cross-origin objects (cross-origin) assert_throws: preventExtensions on cross-origin Window should throw function "function() { Object.preventExtensions(win) }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError") +FAIL [[PreventExtensions]] should throw for cross-origin objects (same-origin + document.domain) assert_throws: preventExtensions on cross-origin Window should throw function "function() { Object.preventExtensions(win) }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError") +FAIL [[PreventExtensions]] should throw for cross-origin objects (cross-site) assert_throws: preventExtensions on cross-origin Window should throw function "function() { Object.preventExtensions(win) }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError") +FAIL [[GetOwnProperty]] - Properties on cross-origin objects should be reported |own| (cross-origin) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL [[GetOwnProperty]] - Properties on cross-origin objects should be reported |own| (same-origin + document.domain) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL [[GetOwnProperty]] - Properties on cross-origin objects should be reported |own| (cross-site) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL [[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly (cross-origin) assert_equals: property descriptor for 0 should be enumerable expected true but got false +FAIL [[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly (same-origin + document.domain) assert_equals: property descriptor for 0 should be enumerable expected true but got false +FAIL [[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly (cross-site) assert_equals: property descriptor for 0 should be enumerable expected true but got false +PASS [[GetOwnProperty]] - Subframe named 'then' should shadow the default 'then' value (cross-origin) +PASS [[GetOwnProperty]] - Subframe named 'then' should shadow the default 'then' value (same-origin + document.domain) +PASS [[GetOwnProperty]] - Subframe named 'then' should shadow the default 'then' value (cross-site) +PASS [[GetOwnProperty]] - Subframes should be visible cross-origin only if their names don't match the names of cross-origin-exposed IDL properties (cross-origin) +PASS [[GetOwnProperty]] - Subframes should be visible cross-origin only if their names don't match the names of cross-origin-exposed IDL properties (same-origin + document.domain) +PASS [[GetOwnProperty]] - Subframes should be visible cross-origin only if their names don't match the names of cross-origin-exposed IDL properties (cross-site) +PASS [[GetOwnProperty]] - Should be able to get a property descriptor for an indexed property only if it corresponds to a child window. (cross-origin) +PASS [[GetOwnProperty]] - Should be able to get a property descriptor for an indexed property only if it corresponds to a child window. (same-origin + document.domain) +PASS [[GetOwnProperty]] - Should be able to get a property descriptor for an indexed property only if it corresponds to a child window. (cross-site) +PASS [[Delete]] Should throw on cross-origin objects (cross-origin) +PASS [[Delete]] Should throw on cross-origin objects (same-origin + document.domain) +PASS [[Delete]] Should throw on cross-origin objects (cross-site) +PASS [[DefineOwnProperty]] Should throw for cross-origin objects (cross-origin) +PASS [[DefineOwnProperty]] Should throw for cross-origin objects (same-origin + document.domain) +PASS [[DefineOwnProperty]] Should throw for cross-origin objects (cross-site) +FAIL Can only enumerate safelisted enumerable properties (cross-origin) assert_equals: Enumerate all enumerable safelisted cross-origin Window properties expected 2 but got 0 +FAIL Can only enumerate safelisted enumerable properties (same-origin + document.domain) assert_equals: Enumerate all enumerable safelisted cross-origin Window properties expected 2 but got 0 +FAIL Can only enumerate safelisted enumerable properties (cross-site) assert_equals: Enumerate all enumerable safelisted cross-origin Window properties expected 2 but got 0 +FAIL [[OwnPropertyKeys]] should return all properties from cross-origin objects (cross-origin) assert_array_equals: Object.getOwnPropertyNames() gives the right answer for cross-origin Window lengths differ, expected 16 got 13 +FAIL [[OwnPropertyKeys]] should return all properties from cross-origin objects (same-origin + document.domain) assert_array_equals: Object.getOwnPropertyNames() gives the right answer for cross-origin Window lengths differ, expected 16 got 13 +FAIL [[OwnPropertyKeys]] should return all properties from cross-origin objects (cross-site) assert_array_equals: Object.getOwnPropertyNames() gives the right answer for cross-origin Window lengths differ, expected 16 got 13 +FAIL [[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects (cross-origin) assert_array_equals: Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window lengths differ, expected 3 got 0 +FAIL [[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects (same-origin + document.domain) assert_array_equals: Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window lengths differ, expected 3 got 0 +FAIL [[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects (cross-site) assert_array_equals: Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window lengths differ, expected 3 got 0 +FAIL [[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices (cross-origin) assert_equals: 'then' property should be added to the end of the string list if not there expected "then" but got "close" +FAIL [[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices (same-origin + document.domain) assert_equals: 'then' property should be added to the end of the string list if not there expected "then" but got "close" +FAIL [[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices (cross-site) assert_equals: 'then' property should be added to the end of the string list if not there expected "then" but got "close" +FAIL [[OwnPropertyKeys]] should not reorder where 'then' appears if it's a named subframe, nor add another copy of 'then' (cross-origin) assert_equals: expected "then" but got "postMessage" +FAIL [[OwnPropertyKeys]] should not reorder where 'then' appears if it's a named subframe, nor add another copy of 'then' (same-origin + document.domain) assert_equals: expected "then" but got "postMessage" +FAIL [[OwnPropertyKeys]] should not reorder where 'then' appears if it's a named subframe, nor add another copy of 'then' (cross-site) assert_equals: expected "then" but got "postMessage" +PASS A and B jointly observe the same identity for cross-origin Window and Location (cross-origin) +PASS A and B jointly observe the same identity for cross-origin Window and Location (same-origin + document.domain) +PASS A and B jointly observe the same identity for cross-origin Window and Location (cross-site) +PASS Cross-origin functions get local Function.prototype (cross-origin) +PASS Cross-origin functions get local Function.prototype (same-origin + document.domain) +PASS Cross-origin functions get local Function.prototype (cross-site) +FAIL Cross-origin Window accessors get local Function.prototype (cross-origin) Cannot read property 'name' of undefined +FAIL Cross-origin Window accessors get local Function.prototype (same-origin + document.domain) Cannot read property 'name' of undefined +FAIL Cross-origin Window accessors get local Function.prototype (cross-site) Cannot read property 'name' of undefined +FAIL Same-origin observers get different functions for cross-origin objects (cross-origin) assert_not_equals: cross-origin Window functions get their own object got disallowed value function "function () { [native code] }" +FAIL Same-origin observers get different functions for cross-origin objects (same-origin + document.domain) assert_not_equals: cross-origin Window functions get their own object got disallowed value function "function () { [native code] }" +FAIL Same-origin observers get different functions for cross-origin objects (cross-site) assert_not_equals: cross-origin Window functions get their own object got disallowed value function "function () { [native code] }" +FAIL Same-origin observers get different accessors for cross-origin Window (cross-origin) assert_not_equals: different Window accessors per-incumbent script settings object got disallowed value undefined +FAIL Same-origin observers get different accessors for cross-origin Window (same-origin + document.domain) assert_not_equals: different Window accessors per-incumbent script settings object got disallowed value undefined +FAIL Same-origin observers get different accessors for cross-origin Window (cross-site) assert_not_equals: different Window accessors per-incumbent script settings object got disallowed value undefined +FAIL Same-origin observers get different accessors for cross-origin Location (cross-origin) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL Same-origin observers get different accessors for cross-origin Location (same-origin + document.domain) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL Same-origin observers get different accessors for cross-origin Location (cross-site) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame. +FAIL {}.toString.call() does the right thing on cross-origin objects (cross-origin) assert_equals: expected "[object Object]" but got "[object Location]" +FAIL {}.toString.call() does the right thing on cross-origin objects (same-origin + document.domain) assert_equals: expected "[object Object]" but got "[object Location]" +FAIL {}.toString.call() does the right thing on cross-origin objects (cross-site) assert_equals: expected "[object Object]" but got "[object Location]" +PASS Resolving a promise with a cross-origin window without a 'then' subframe should work (cross-origin) +PASS Resolving a promise with a cross-origin window without a 'then' subframe should work (same-origin + document.domain) +PASS Resolving a promise with a cross-origin window without a 'then' subframe should work (cross-site) +PASS Resolving a promise with a cross-origin window with a 'then' subframe should work (cross-origin) +PASS Resolving a promise with a cross-origin window with a 'then' subframe should work (same-origin + document.domain) +PASS Resolving a promise with a cross-origin window with a 'then' subframe should work (cross-site) +PASS Resolving a promise with a cross-origin location should work (cross-origin) +PASS Resolving a promise with a cross-origin location should work (same-origin + document.domain) +PASS Resolving a promise with a cross-origin location should work (cross-site) +PASS LenientThis behavior (cross-origin) +PASS LenientThis behavior (same-origin + document.domain) +PASS LenientThis behavior (cross-site) +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js index add04fa5..ee790bb6 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js
@@ -14,7 +14,7 @@ if (messageEvent.data.type === 'Attach') { messageEvent.data.interfaces.forEach(interfaceName => { let interfaceInterceptor = - new MojoInterfaceInterceptor(interfaceName); + new MojoInterfaceInterceptor(interfaceName, "context", true); interfaceInterceptor.oninterfacerequest = e => messageChannel.port1.postMessage({ type: interfaceName,
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js index 8bccfd1f..83b881f 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js
@@ -476,7 +476,7 @@ internal.webUsbService = new FakeWebUsbService(); internal.webUsbServiceInterceptor = - new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name); + new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name, "context", true); internal.webUsbServiceInterceptor.oninterfacerequest = e => internal.webUsbService.addBinding(e.handle); internal.webUsbServiceInterceptor.start();
diff --git a/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py b/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py index fe69b8f..c57b997 100755 --- a/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py +++ b/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py
@@ -2,13 +2,18 @@ import time -# The amount of buffering a WebSocket connection has is not standardised, but -# it's reasonable to expect that it will not be as large as 8MB. -MESSAGE_SIZE = 8 * 1024 * 1024 +# The amount of internal buffering a WebSocket connection has is not +# standardised, and varies depending upon the OS. Setting this number too small +# will result in false negatives, as the entire message gets buffered. Setting +# this number too large will result in false positives, when it takes more than +# 2 seconds to transmit the message anyway. This number was arrived at by +# trial-and-error. +MESSAGE_SIZE = 16 * 1024 * 1024 def web_socket_do_extra_handshake(request): - # Turn off permessage-deflate, otherwise it shrinks our 8MB buffer to 8KB. + # Turn off permessage-deflate, otherwise it shrinks our big message to a + # tiny message. request.ws_extension_processors = []
diff --git a/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js b/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js index 11f4bd9..b4b0909 100644 --- a/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js +++ b/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js
@@ -3,11 +3,14 @@ // META: global=window,worker // META: timeout=long -// This test works by using a server WebSocket handler which sends an 8MB +// Allow for this much timer jitter. +const JITTER_ALLOWANCE_MS = 200; + +// This test works by using a server WebSocket handler which sends a large // message, and then sends a second message with the time it measured the first // message taking. On the browser side, we wait 2 seconds before reading from // the socket. This should ensure it takes at least 2 seconds to finish sending -// the 8MB message. +// the large message. promise_test(async t => { const wss = new WebSocketStream(`${BASEURL}/send-backpressure`); const { readable } = await wss.connection; @@ -16,7 +19,7 @@ // Create backpressure for 2 seconds. await new Promise(resolve => t.step_timeout(resolve, 2000)); - // Skip the 8MB message. + // Skip the large message. await reader.read(); // Read the time it took. @@ -24,6 +27,6 @@ // A browser can pass this test simply by being slow. This may be a source of // flakiness for browsers that do not implement backpressure properly. - assert_greater_than_equal(Number(value), 2, + assert_greater_than_equal(Number(value), 2 - JITTER_ALLOWANCE_MS / 1000, 'data send should have taken at least 2 seconds'); }, 'backpressure should be applied to received messages');
diff --git a/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js b/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js index f504588..de4ca72 100644 --- a/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js +++ b/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js
@@ -139,14 +139,14 @@ promise_test(t => { const kScriptURL = 'resources/syntax-error-worklet-script.js'; - return promise_rejects(t, new DOMException('', 'AbortError'), + return promise_rejects(t, new DOMException('', 'SyntaxError'), worklet.addModule(kScriptURL)); }, 'Importing a script that has a syntax error should reject the given ' + 'promise.'); promise_test(t => { const kScriptURL = 'resources/import-syntax-error-worklet-script.js'; - return promise_rejects(t, new DOMException('', 'AbortError'), + return promise_rejects(t, new DOMException('', 'SyntaxError'), worklet.addModule(kScriptURL)); }, 'Importing a nested script that has a syntax error should reject the ' + 'given promise.'); @@ -155,7 +155,7 @@ const kBlob = new Blob(["import 'invalid-specifier.js';"], {type: 'text/javascript'}); const kBlobURL = URL.createObjectURL(kBlob); - return promise_rejects(t, new DOMException('', 'AbortError'), + return promise_rejects(t, new DOMException('', 'TypeError'), worklet.addModule(kBlobURL)); }, 'Importing a script that imports an invalid identifier should reject ' + 'the given promise.');
diff --git a/third_party/blink/web_tests/http/tests/workers/resources/worker-static-import-nonexistent-script.js b/third_party/blink/web_tests/http/tests/workers/resources/worker-static-import-nonexistent-script.js new file mode 100644 index 0000000..9b61b18 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/workers/resources/worker-static-import-nonexistent-script.js
@@ -0,0 +1 @@ +import './nonexistent-script.js';
diff --git a/third_party/blink/web_tests/http/tests/workers/worker-termination-on-script-fetch-failure.html b/third_party/blink/web_tests/http/tests/workers/worker-termination-on-script-fetch-failure.html new file mode 100644 index 0000000..76c2942 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/workers/worker-termination-on-script-fetch-failure.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Test worker termination on script fetch failure</title> +<body></body> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +// This test should not be upstreamed to WPT because of using Internals API. + +function run_test(worker_url, worker_options, fetch_type) { + promise_test(async t => { + assert_equals(window.internals.workerThreadCount, 0); + const worker = new Worker(worker_url, worker_options); + + // A failure of worker script fetch should be reported to the onerror + // handler. + await new Promise(resolve => worker.onerror = resolve); + + // Also, it should terminate the worker thread. + await new Promise(resolve => { + const timer = setInterval(() => { + if (window.internals.workerThreadCount === 0) { + clearInterval(timer); + resolve(); + } + }, 10); + }); + }, `A failure on ${fetch_type} fetch should terminate the worker`); +} + +// Loading non-existent top-level classic worker script should terminate the +// worker. +run_test('resources/non-existent-script.js', + { type: 'classic' }, + 'top-level classic worker script'); + +// Loading non-existent top-level module worker script should terminate the +// worker. +run_test('resources/non-existent-script.js', + { type: 'module' }, + 'top-level module worker script'); + +// Static import to non-existent module worker script should terminate the +// worker. +run_test('resources/worker-static-import-nonexistent-script.js', + { type: 'module' }, + 'static import'); + +</script>
diff --git a/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async-expected.txt b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async-expected.txt new file mode 100644 index 0000000..7f2b42c --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async-expected.txt
@@ -0,0 +1,3 @@ +Tests that DOMSnapshot.captureSnapshot records origin url of dom nodes generated by script. +DIV: http://a.test/script.js +
diff --git a/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async.js b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async.js new file mode 100644 index 0000000..eeab78e5 --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async.js
@@ -0,0 +1,28 @@ +(async function(testRunner) { + var {page, session, dp} = await testRunner.startBlank('Tests that DOMSnapshot.captureSnapshot records origin url of dom nodes generated by script.'); + await dp.DOMSnapshot.enable(); + await dp.Runtime.enable(); + const res = await dp.Runtime.setAsyncCallStackDepth({maxDepth: 10}); + + await session.evaluateAsync(` + setTimeout("document.body.appendChild(document.createElement('div'))", 0); + new Promise(fulfill => setTimeout(fulfill), 0); + \n//# sourceURL=http://a.test/script.js`); + + const {result} = await dp.DOMSnapshot.captureSnapshot({'computedStyles': []}); + function lookupRareString(table, index) { + const entryIndex = table.index.indexOf(index); + return entryIndex >= 0 ? result.strings[table.value[entryIndex]] : ""; + } + const nodes = result.documents[0].nodes; + let nodeIndex = 0; + for (const nameIndex of nodes.nodeName) { + const name = result.strings[nameIndex]; + if (name === 'DIV') { + const originURL = lookupRareString(nodes.originURL, nodeIndex); + testRunner.log(`${name}: ${originURL}`); + } + ++nodeIndex; + } + testRunner.completeTest(); +}) \ No newline at end of file
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 82456601..e4b8540 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index e47b35f..de6ea589 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index dd97c182..2a9071c7 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index f9d3d5c..75ab4a72 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 38f17e7..a467e8a 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index d6c463d4d..fa776ba 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 38f17e7..a467e8a 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index d6c463d4d..fa776ba 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 5f4ce38e..db833b07 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index 7f57a9e..5e8fe0d 100644 --- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 5f4ce38e..db833b07 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index 7f57a9e..5e8fe0d 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 35adb291..85305ca 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index 7be2227..bd985e94 100644 --- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png index 75f079c..04b89bd 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png index 06c2b8e0..7ca4360 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png +++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs b/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs index bb3fe73..7c65f33 100644 --- a/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs +++ b/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs
@@ -20,7 +20,8 @@ export function testFullScroll500px(target) { helpers.appendDivs(target, MORE_THAN_SCREENFUL, '10px'); - helpers.nextFrame(() => { + // Scroller needs some time to settle. + helpers.inNFrames(10, () => { window.scrollBy(0, 500); // eslint-disable-line no-magic-numbers helpers.stopWaiting(); });
diff --git a/tools/ipc_fuzzer/message_tools/message_list.cc b/tools/ipc_fuzzer/message_tools/message_list.cc index f94bd9bc..81d43bba 100644 --- a/tools/ipc_fuzzer/message_tools/message_list.cc +++ b/tools/ipc_fuzzer/message_tools/message_list.cc
@@ -49,14 +49,9 @@ exemptions.push_back(TestMsgStart); exemptions.push_back(BlinkTestMsgStart); exemptions.push_back(WebTestMsgStart); - exemptions.push_back(CastCryptoMsgStart); // Reserved for chromecast. - exemptions.push_back(CastChannelMsgStart); // Reserved for chromecast. - exemptions.push_back(CastMediaMsgStart); // Reserved for chromecast. exemptions.push_back(IPCTestMsgStart); exemptions.push_back(WorkerMsgStart); // Now only used by tests. - exemptions.push_back(ResourceMsgStart); // Cleanup underway. exemptions.push_back(ChromeUtilityPrintingMsgStart); // BUILDFLAGS, sigh. - exemptions.push_back(WebRtcLoggingMsgStart); #if !BUILDFLAG(ENABLE_NACL) exemptions.push_back(NaClMsgStart); @@ -64,11 +59,9 @@ #if !defined(OS_ANDROID) - exemptions.push_back(MediaPlayerMsgStart); exemptions.push_back(EncryptedMediaMsgStart); exemptions.push_back(GinJavaBridgeMsgStart); exemptions.push_back(AndroidWebViewMsgStart); - exemptions.push_back(SyncCompositorMsgStart); exemptions.push_back(ExtensionWorkerMsgStart); exemptions.push_back(SurfaceViewManagerMsgStart); #endif // !defined(OS_ANDROID)
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 5775554..4ab8cc8 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -14240,6 +14240,59 @@ <description>Recorded when a persistent notification gets shown.</description> </action> +<action name="Notifications.Quiet.AnimatedIconClicked"> + <owner>andypaicu@chromium.org</owner> + <owner>engedy@chromium.org</owner> + <owner>hkamila@chromium.org</owner> + <description> + Logs when the user clicks on the notification permission request animated + icon on the omnibox, that upon being clicked, opens the permission request + bubble . + </description> +</action> + +<action name="Notifications.Quiet.ManageClicked"> + <owner>andypaicu@chromium.org</owner> + <owner>engedy@chromium.org</owner> + <owner>hkamila@chromium.org</owner> + <description> + Logs when the user clicks "Manage", which is a button, that upon + being clicked, navigates the user to the notifications category settings + page. + </description> +</action> + +<action name="Notifications.Quiet.PermissionRequestShown"> + <owner>andypaicu@chromium.org</owner> + <owner>engedy@chromium.org</owner> + <owner>hkamila@chromium.org</owner> + <description> + The notification permission request was shown quietly as an icon in the + omnibox. + </description> +</action> + +<action name="Notifications.Quiet.ShowForSiteClicked"> + <owner>andypaicu@chromium.org</owner> + <owner>engedy@chromium.org</owner> + <owner>hkamila@chromium.org</owner> + <description> + Logs when the user clicks "Show for site", which is a button, that + upon being clicked, allows the site to send notifications. + </description> +</action> + +<action name="Notifications.Quiet.StaticIconClicked"> + <owner>andypaicu@chromium.org</owner> + <owner>engedy@chromium.org</owner> + <owner>hkamila@chromium.org</owner> + <description> + Logs when the user clicks on the notification permission request static icon + on the omnibox, that upon being clicked, opens the permission request bubble + . + </description> +</action> + <action name="Notifications.ShowMessageCenter"> <owner>dewittj@chromium.org</owner> <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index c9d36c98..9ae22a84 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -4691,6 +4691,13 @@ <int value="5" label="Overlay Insecure Non-player-element Fullscreen"/> </enum> +<enum name="BackForwardCacheDisabledForRenderFrameHostReason"> + <int value="-1449100855" label="safe_browsing::ThreatDetails"/> + <int value="-1314032804" label="MediaSessionImpl::OnServiceCreated"/> + <int value="-866479064" label="content::protocol::SecurityHandler"/> + <int value="671363579" label="banners::AppBannerManager"/> +</enum> + <enum name="BackForwardCacheHistoryNavigationOutcome"> <int value="0" label="Restored"/> <int value="1" label="Not cached"/> @@ -45752,6 +45759,9 @@ The model for the optimization target was evaluated and the page load was predicted to match the optimization target. </int> + <int value="3" label="Model for target not available on client"> + The model for the optimization target not available on the client. + </int> </enum> <enum name="OptimizationGuideOptimizationTypeDecision">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index d7dd034..0db195e 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -13084,6 +13084,28 @@ </summary> </histogram> +<histogram + name="BackForwardCache.HistoryNavigationOutcome.DisabledForRenderFrameHostReason" + enum="BackForwardCacheDisabledForRenderFrameHostReason" + expires_after="2020-10-01"> + <owner>bfcache-dev@chromium.org</owner> + <owner>carlscab@chromium.org</owner> + <owner>hajimehoshi@chromium.org</owner> + <summary> + For history navigations, records the reasons passed to + BackForwardCache::DisableForRenderFrameHost calls. These reasons are + specified as strings, so this histograms contains their hashes computed as + base::HashMetricName. + + The metric is recorded when a history navigation commits and emits a sample + for each reason. Compare this with + BackForwardCache.HistoryNavigationOutcome, which contains the total number + of navigations which where not cached + + Recording starts as of M79. + </summary> +</histogram> + <histogram base="true" name="BackgroundFetch.EventDispatchFailure.Dispatch" enum="ServiceWorkerStatusCode"> <!-- Name completed by histogram_suffixes name="BackgroundFetchEvents" --> @@ -45091,7 +45113,7 @@ </histogram> <histogram name="Extensions.MimeHandlerViewEvents" enum="MimeHandlerViewEvents" - expires_after="M79"> + expires_after="M81"> <owner>ekaramad@chromium.org</owner> <owner>wjmaclean@chromium.org</owner> <summary> @@ -78010,7 +78032,7 @@ </histogram> <histogram name="Net.KeepaliveStatisticsRecorder.PeakInflightRequests2" - units="requests" expires_after="M77"> + units="requests" expires_after="2020-06-30"> <owner>yhirano@chromium.org</owner> <summary> The peak number of concurrent outstanding requests with keepalive specified. @@ -78022,7 +78044,7 @@ <histogram name="Net.KeepaliveStatisticsRecorder.PeakInflightRequestsPerProcess" - units="requests" expires_after="M78"> + units="requests" expires_after="2020-06-30"> <owner>yhirano@chromium.org</owner> <summary> The peak number of concurrent outstanding requests with keepalive specified @@ -78032,7 +78054,7 @@ <histogram name="Net.KeepaliveStatisticsRecorder.PeakInflightRequestsPerProcess2" - units="requests" expires_after="M78"> + units="requests" expires_after="2020-06-30"> <owner>yhirano@chromium.org</owner> <summary> The peak number of concurrent outstanding requests with keepalive specified @@ -95470,6 +95492,17 @@ </histogram> <histogram + name="OptimizationGuide.PredictionManager.HasHostModelFeaturesForHost" + enum="Boolean" expires_after="M85"> + <owner>mcrouse@chromium.org</owner> + <owner>sophiechang@chromium.org</owner> + <summary> + Whether the PredictionManager had HostModelFeatures for the host of the + navigation. Recorded when ShouldTargetNavigation is called. + </summary> +</histogram> + +<histogram name="OptimizationGuide.PredictionModelFetcher.GetModelsRequest.HostCount" units="total host count" expires_after="M85"> <owner>mcrouse@chromium.org</owner> @@ -119546,7 +119579,7 @@ </histogram> <histogram name="ResourceReporter.BrowserProcess.MemoryUsage" - enum="ResourceReporterMemoryUsage" expires_after="M79"> + enum="ResourceReporterMemoryUsage" expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> The system memory usage range reported for the browser process when the @@ -119568,7 +119601,7 @@ </histogram> <histogram name="ResourceReporter.GpuProcess.MemoryUsage" - enum="ResourceReporterMemoryUsage" expires_after="M79"> + enum="ResourceReporterMemoryUsage" expires_after="M85"> <owner>afakhry@chromium.org</owner> <summary> The system's RAM memory usage range reported for the GPU process when the @@ -152339,6 +152372,20 @@ </summary> </histogram> +<histogram name="V8.CollectSourcePositions" units="microseconds" + expires_after="M85"> + <owner>delphick@chromium.org</owner> + <summary> + Time spent collecting source positions to generate stack traces. + + Warning: This metric may include reports from clients with low-resolution + clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports + will cause this metric to have an abnormal distribution. When considering + revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the + solution. + </summary> +</histogram> + <histogram name="V8.Compile" units="ms" expires_after="2015-01-27"> <obsolete> This histogram has been replaced by V8.CompileMicroSeconds. @@ -164083,6 +164130,7 @@ </histogram_suffixes> <histogram_suffixes name="ArcThrottleObservers" separator="."> + <suffix name="ArcAppLaunchRequested" label="ARC++ app launch in progress."/> <suffix name="ArcIsBooting" label="ARC++ is booting or restarting."/> <suffix name="ArcWindowIsActiveWindow" label="An ARC++ window is active."/> <affected-histogram name="Arc.CpuRestrictionDisabled"/> @@ -169496,7 +169544,11 @@ label="Database for storing budget information for origins."/> <suffix name="CachedImageFetcherDatabase" label="Database for CachedImageFetcher metadata."/> - <suffix name="DomDistillerStore" label="Databases for DomDistillerStore"/> + <suffix name="DomDistillerStore" label="Databases for DomDistillerStore"> + <obsolete> + Deprecated since 2019-10. + </obsolete> + </suffix> <suffix name="DownloadDB" label="Databases for in-progress download."/> <suffix name="FeatureEngagementTrackerAvailabilityStore" label="Database for FeatureEngagementTracker feature availability."/>
diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc index 4d04060..40c6bc90 100644 --- a/ui/aura/window_tree_host_platform.cc +++ b/ui/aura/window_tree_host_platform.cc
@@ -24,6 +24,7 @@ #include "ui/events/keyboard_hook.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/keycodes/dom/dom_keyboard_layout_map.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_init_properties.h" #if defined(USE_OZONE) @@ -85,7 +86,7 @@ } void WindowTreeHostPlatform::SetPlatformWindow( - std::unique_ptr<ui::PlatformWindow> window) { + std::unique_ptr<ui::PlatformWindowBase> window) { platform_window_ = std::move(window); }
diff --git a/ui/aura/window_tree_host_platform.h b/ui/aura/window_tree_host_platform.h index a2af44f..2fc6d49 100644 --- a/ui/aura/window_tree_host_platform.h +++ b/ui/aura/window_tree_host_platform.h
@@ -14,11 +14,11 @@ #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/gfx/native_widget_types.h" -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_delegate.h" namespace ui { enum class DomCode; +class PlatformWindowBase; class KeyboardHook; struct PlatformWindowInitProperties; } // namespace ui @@ -62,9 +62,9 @@ // installs it at as the PlatformWindow for this WindowTreeHostPlatform. void CreateAndSetPlatformWindow(ui::PlatformWindowInitProperties properties); - void SetPlatformWindow(std::unique_ptr<ui::PlatformWindow> window); - ui::PlatformWindow* platform_window() { return platform_window_.get(); } - const ui::PlatformWindow* platform_window() const { + void SetPlatformWindow(std::unique_ptr<ui::PlatformWindowBase> window); + ui::PlatformWindowBase* platform_window() { return platform_window_.get(); } + const ui::PlatformWindowBase* platform_window() const { return platform_window_.get(); } @@ -93,7 +93,7 @@ private: gfx::AcceleratedWidget widget_; - std::unique_ptr<ui::PlatformWindow> platform_window_; + std::unique_ptr<ui::PlatformWindowBase> platform_window_; gfx::NativeCursor current_cursor_; gfx::Rect bounds_in_pixels_;
diff --git a/ui/aura/window_tree_host_platform_unittest.cc b/ui/aura/window_tree_host_platform_unittest.cc index eda14e2..677e569 100644 --- a/ui/aura/window_tree_host_platform_unittest.cc +++ b/ui/aura/window_tree_host_platform_unittest.cc
@@ -22,7 +22,7 @@ CreateCompositor(); } - ui::PlatformWindow* platform_window() { + ui::PlatformWindowBase* platform_window() { return WindowTreeHostPlatform::platform_window(); } @@ -37,7 +37,7 @@ class TestWindowTreeHostObserver : public aura::WindowTreeHostObserver { public: TestWindowTreeHostObserver(WindowTreeHostPlatform* host, - ui::PlatformWindow* platform_window) + ui::PlatformWindowBase* platform_window) : host_(host), platform_window_(platform_window) { host_->AddObserver(this); } @@ -70,7 +70,7 @@ private: WindowTreeHostPlatform* host_; - ui::PlatformWindow* platform_window_; + ui::PlatformWindowBase* platform_window_; bool should_change_bounds_in_on_resized_ = true; int on_host_will_process_bounds_change_count_ = 0; int on_host_did_process_bounds_change_count_ = 0;
diff --git a/ui/compositor/test/test_compositor_host_ozone.cc b/ui/compositor/test/test_compositor_host_ozone.cc index 7dbbe5c..66f8b74 100644 --- a/ui/compositor/test/test_compositor_host_ozone.cc +++ b/ui/compositor/test/test_compositor_host_ozone.cc
@@ -18,7 +18,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/native_widget_types.h" #include "ui/ozone/public/ozone_platform.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/platform_window_init_properties.h" @@ -72,7 +72,7 @@ gfx::Rect bounds_; ui::Compositor compositor_; - std::unique_ptr<PlatformWindow> window_; + std::unique_ptr<PlatformWindowBase> window_; StubPlatformWindowDelegate window_delegate_; viz::ParentLocalSurfaceIdAllocator allocator_;
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js index d57f0c38..5e7619c 100644 --- a/ui/file_manager/file_manager/common/js/util.js +++ b/ui/file_manager/file_manager/common/js/util.js
@@ -219,9 +219,10 @@ * number separators. * * @param {number} bytes The number of bytes. + * @param {number=} addedPrecision The number of precision digits to add. * @return {string} Localized string. */ -util.bytesToString = bytes => { +util.bytesToString = (bytes, addedPrecision = 0) => { // Translation identifiers for size units. const UNITS = [ 'SIZE_BYTES', @@ -242,12 +243,18 @@ Math.pow(2, 50), ]; + // Rounding with precision. + const round = (value, decimals) => { + const scale = Math.pow(10, decimals); + return Math.round(value * scale) / scale; + }; + const str = (n, u) => { return strf(u, n.toLocaleString()); }; const fmt = (s, u) => { - const rounded = Math.round(bytes / s * 10) / 10; + const rounded = round(bytes / s, 1 + addedPrecision); return str(rounded, u); }; @@ -256,9 +263,11 @@ return str(bytes, UNITS[0]); } - // Up to 1MB is displayed as rounded up number of KBs. + // Up to 1MB is displayed as rounded up number of KBs, or with the desired + // number of precision digits. if (bytes < STEPS[2]) { - const rounded = Math.ceil(bytes / STEPS[1]); + const rounded = addedPrecision ? round(bytes / STEPS[1], addedPrecision) : + Math.ceil(bytes / STEPS[1]); return str(rounded, UNITS[1]); }
diff --git a/ui/file_manager/file_manager/common/js/util_unittest.js b/ui/file_manager/file_manager/common/js/util_unittest.js index 565c7a8f..48418da6 100644 --- a/ui/file_manager/file_manager/common/js/util_unittest.js +++ b/ui/file_manager/file_manager/common/js/util_unittest.js
@@ -193,7 +193,7 @@ } /** - * Tests the formatting of util.bytesToString + * Tests the formatting of util.bytesToString. */ function testBytesToString() { const KB = 2 ** 10; @@ -208,7 +208,7 @@ assertEquals(util.bytesToString(KB - 1), '1,023 bytes'); assertEquals(util.bytesToString(KB), '1 KB'); - // Up to 1MB is displayed as a number of KBs. + // Up to 1MB is displayed as a number of KBs with no precision digit. assertEquals(util.bytesToString(2 * KB), '2 KB'); assertEquals(util.bytesToString(2 * KB + 1), '3 KB'); assertEquals(util.bytesToString(MB - KB), '1,023 KB'); @@ -216,7 +216,7 @@ assertEquals(util.bytesToString(MB - 1), '1,024 KB'); assertEquals(util.bytesToString(MB), '1 MB'); - // Up to 1GB is displayed as a number of MBs. + // Up to 1GB is displayed as a number of MBs with <= 1 precision digit. assertEquals(util.bytesToString(2.55 * MB - 1), '2.5 MB'); assertEquals(util.bytesToString(2.55 * MB), '2.6 MB'); assertEquals(util.bytesToString(GB - 0.05 * MB - 1), '1,023.9 MB'); @@ -224,7 +224,7 @@ assertEquals(util.bytesToString(GB - 1), '1,024 MB'); assertEquals(util.bytesToString(GB), '1 GB'); - // Up to 1TB is displayed as a number of GBs. + // Up to 1TB is displayed as a number of GBs with <= 1 precision digit. assertEquals(util.bytesToString(2.55 * GB - 1), '2.5 GB'); assertEquals(util.bytesToString(2.55 * GB), '2.6 GB'); assertEquals(util.bytesToString(TB - 0.05 * GB - 1), '1,023.9 GB'); @@ -232,11 +232,84 @@ assertEquals(util.bytesToString(TB - 1), '1,024 GB'); assertEquals(util.bytesToString(TB), '1 TB'); - // Up to 1PB is displayed as a number of GBs. + // Up to 1PB is displayed as a number of TBs with <= 1 precision digit. assertEquals(util.bytesToString(2.55 * TB - 1), '2.5 TB'); assertEquals(util.bytesToString(2.55 * TB), '2.6 TB'); assertEquals(util.bytesToString(PB - 0.05 * TB - 1), '1,023.9 TB'); assertEquals(util.bytesToString(PB - 0.05 * TB), '1,024 TB'); assertEquals(util.bytesToString(PB - 1), '1,024 TB'); assertEquals(util.bytesToString(PB), '1 PB'); + + // Above 1PB is displayed as a number of PBs with <= 1 precision digit. + assertEquals(util.bytesToString(2.55 * PB - 1), '2.5 PB'); + assertEquals(util.bytesToString(2.55 * PB), '2.6 PB'); +} + +/** + * Tests the formatting of util.bytesToString with added precision digits. + * + * Useful information regarding the below assertions: + * 647 bytes = 0.6318359375 KB. + * bytesToString() internally uses Number.toLocaleString() which outputs at most + * 3 precision digits in en-US. + */ +function testBytesToStringWithAddedPrecision() { + const KB = 2 ** 10; + const MB = 2 ** 20; + const GB = 2 ** 30; + const TB = 2 ** 40; + const PB = 2 ** 50; + + // Up to 1KB formatting unchanged. + assertEquals(util.bytesToString(0, 1), '0 bytes'); + assertEquals(util.bytesToString(10, 2), '10 bytes'); + assertEquals(util.bytesToString(KB - 1, 3), '1,023 bytes'); + + // Exact values, no trailing 0s regardless of precision. + assertEquals(util.bytesToString(2 * KB, 1), '2 KB'); + assertEquals(util.bytesToString(2 * MB, 2), '2 MB'); + assertEquals(util.bytesToString(2 * GB, 3), '2 GB'); + assertEquals(util.bytesToString(2 * TB, 4), '2 TB'); + assertEquals(util.bytesToString(2 * PB, 5), '2 PB'); + + // up to MB, initially no precision digits. + assertEquals(util.bytesToString(2 * KB + 647), '3 KB'); + assertEquals(util.bytesToString(2 * KB + 647, 0), '3 KB'); + assertEquals(util.bytesToString(2 * KB + 647, 1), '2.6 KB'); + assertEquals(util.bytesToString(2 * KB + 647, 2), '2.63 KB'); + assertEquals(util.bytesToString(2 * KB + 647, 3), '2.632 KB'); + assertEquals(util.bytesToString(2 * KB + 647, 4), '2.632 KB'); + assertEquals(util.bytesToString(200 * KB + 647, 1), '200.6 KB'); + + // From 1MB, up to 1 precision digit + added precision. + assertEquals(util.bytesToString(2 * MB + 647 * KB), '2.6 MB'); + assertEquals(util.bytesToString(2 * MB + 647 * KB, 0), '2.6 MB'); + assertEquals(util.bytesToString(2 * MB + 647 * KB, 1), '2.63 MB'); + assertEquals(util.bytesToString(2 * MB + 647 * KB, 2), '2.632 MB'); + assertEquals(util.bytesToString(2 * MB + 647 * KB, 3), '2.632 MB'); + assertEquals(util.bytesToString(200 * MB + 647 * KB, 1), '200.63 MB'); + + // Up to 1TB. + assertEquals(util.bytesToString(2 * GB + 647 * MB), '2.6 GB'); + assertEquals(util.bytesToString(2 * GB + 647 * MB, 0), '2.6 GB'); + assertEquals(util.bytesToString(2 * GB + 647 * MB, 1), '2.63 GB'); + assertEquals(util.bytesToString(2 * GB + 647 * MB, 2), '2.632 GB'); + assertEquals(util.bytesToString(2 * GB + 647 * MB, 3), '2.632 GB'); + assertEquals(util.bytesToString(200 * GB + 647 * MB, 1), '200.63 GB'); + + // Up to 1PB. + assertEquals(util.bytesToString(2 * TB + 647 * GB), '2.6 TB'); + assertEquals(util.bytesToString(2 * TB + 647 * GB, 0), '2.6 TB'); + assertEquals(util.bytesToString(2 * TB + 647 * GB, 1), '2.63 TB'); + assertEquals(util.bytesToString(2 * TB + 647 * GB, 2), '2.632 TB'); + assertEquals(util.bytesToString(2 * TB + 647 * GB, 3), '2.632 TB'); + assertEquals(util.bytesToString(200 * TB + 647 * GB, 1), '200.63 TB'); + + // Above 1PB. + assertEquals(util.bytesToString(2 * PB + 647 * TB), '2.6 PB'); + assertEquals(util.bytesToString(2 * PB + 647 * TB, 0), '2.6 PB'); + assertEquals(util.bytesToString(2 * PB + 647 * TB, 1), '2.63 PB'); + assertEquals(util.bytesToString(2 * PB + 647 * TB, 2), '2.632 PB'); + assertEquals(util.bytesToString(2 * PB + 647 * TB, 3), '2.632 PB'); + assertEquals(util.bytesToString(200 * PB + 647 * TB, 1), '200.63 PB'); }
diff --git a/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js b/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js index 66ea97a..ad8b2d3 100644 --- a/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js +++ b/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js
@@ -141,7 +141,7 @@ this.setDirectorySize_(directory, isSameEntry); } else if (item.size) { this.metadataBox_.size = - this.fileMetadataFormatter_.formatSize(item.size, item.hosted); + this.fileMetadataFormatter_.formatSize(item.size, item.hosted, true); this.metadataBox_.metadataRendered('size'); } @@ -274,7 +274,7 @@ } this.metadataBox_.size = - this.fileMetadataFormatter_.formatSize(size, true); + this.fileMetadataFormatter_.formatSize(size, true, true); this.metadataBox_.isSizeLoading = false; this.metadataBox_.metadataRendered('size'); });
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js index 3483b7b..db726b2 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js +++ b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js
@@ -73,9 +73,11 @@ * Generates a formatted filesize text. * @param {number=} size * @param {boolean=} hosted + * @param {boolean=} addPrecision addPrecision used to optionally add more + * precision digits to the formatted filesize text. * @return {string} A string that represents a file size. */ - formatSize(size, hosted) { + formatSize(size, hosted, addPrecision = false) { if (size === null || size === undefined) { return '...'; } else if (size === -1) { @@ -83,7 +85,7 @@ } else if (size === 0 && hosted) { return '--'; } else { - return util.bytesToString(size); + return util.bytesToString(size, addPrecision ? 1 : 0); } } }
diff --git a/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc b/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc index 60f9a57..f7cb245 100644 --- a/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc +++ b/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc
@@ -5,7 +5,8 @@ #include <utility> #include "base/test/task_environment.h" -#include "mojo/public/cpp/bindings/binding_set.h" +#include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/mojom/geometry_traits_test_service.mojom.h" #include "ui/gfx/geometry/point.h" @@ -21,9 +22,9 @@ GeometryStructTraitsTest() {} protected: - mojom::GeometryTraitsTestServicePtr GetTraitsTestProxy() { - mojom::GeometryTraitsTestServicePtr proxy; - traits_test_bindings_.AddBinding(this, mojo::MakeRequest(&proxy)); + mojo::Remote<mojom::GeometryTraitsTestService> GetTraitsTestProxy() { + mojo::Remote<mojom::GeometryTraitsTestService> proxy; + traits_test_receivers_.Add(this, proxy.BindNewPipeAndPassReceiver()); return proxy; } @@ -85,7 +86,7 @@ } base::test::TaskEnvironment task_environment_; - mojo::BindingSet<GeometryTraitsTestService> traits_test_bindings_; + mojo::ReceiverSet<GeometryTraitsTestService> traits_test_receivers_; DISALLOW_COPY_AND_ASSIGN(GeometryStructTraitsTest); }; @@ -96,7 +97,7 @@ const int32_t x = 1234; const int32_t y = -5678; gfx::Point input(x, y); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Point output; proxy->EchoPoint(input, &output); EXPECT_EQ(x, output.x()); @@ -107,7 +108,7 @@ const float x = 1234.5f; const float y = 6789.6f; gfx::PointF input(x, y); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::PointF output; proxy->EchoPointF(input, &output); EXPECT_EQ(x, output.x()); @@ -119,7 +120,7 @@ const float y = 6789.6f; const float z = 5432.1f; gfx::Point3F input(x, y, z); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Point3F output; proxy->EchoPoint3F(input, &output); EXPECT_EQ(x, output.x()); @@ -131,7 +132,7 @@ const int32_t width = 1234; const int32_t height = 5678; gfx::Size input(width, height); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Size output; proxy->EchoSize(input, &output); EXPECT_EQ(width, output.width()); @@ -142,7 +143,7 @@ const float width = 1234.5f; const float height = 6789.6f; gfx::SizeF input(width, height); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::SizeF output; proxy->EchoSizeF(input, &output); EXPECT_EQ(width, output.width()); @@ -155,7 +156,7 @@ const int32_t width = 4321; const int32_t height = 8765; gfx::Rect input(x, y, width, height); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Rect output; proxy->EchoRect(input, &output); EXPECT_EQ(x, output.x()); @@ -170,7 +171,7 @@ const float width = 4321.3f; const float height = 8765.4f; gfx::RectF input(x, y, width, height); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::RectF output; proxy->EchoRectF(input, &output); EXPECT_EQ(x, output.x()); @@ -185,7 +186,7 @@ const int32_t bottom = 4321; const int32_t right = 8765; gfx::Insets input(top, left, bottom, right); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Insets output; proxy->EchoInsets(input, &output); EXPECT_EQ(top, output.top()); @@ -200,7 +201,7 @@ const float bottom = 4321.3f; const float right = 8765.4f; gfx::InsetsF input(top, left, bottom, right); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::InsetsF output; proxy->EchoInsetsF(input, &output); EXPECT_EQ(top, output.top()); @@ -213,7 +214,7 @@ const int32_t x = 1234; const int32_t y = -5678; gfx::Vector2d input(x, y); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Vector2d output; proxy->EchoVector2d(input, &output); EXPECT_EQ(x, output.x()); @@ -224,7 +225,7 @@ const float x = 1234.5f; const float y = 6789.6f; gfx::Vector2dF input(x, y); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Vector2dF output; proxy->EchoVector2dF(input, &output); EXPECT_EQ(x, output.x()); @@ -236,7 +237,7 @@ const float y = 6789.6f; const float z = 5432.1f; gfx::Vector3dF input(x, y, z); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Vector3dF output; proxy->EchoVector3dF(input, &output); EXPECT_EQ(x, output.x()); @@ -250,7 +251,7 @@ const double z = 31415.9; const double w = 27182.8; gfx::Quaternion input(x, y, z, w); - mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy(); + mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy(); gfx::Quaternion output; proxy->EchoQuaternion(input, &output); EXPECT_EQ(x, output.x());
diff --git a/ui/gl/direct_composition_surface_win_unittest.cc b/ui/gl/direct_composition_surface_win_unittest.cc index 36f10c9..873cabd 100644 --- a/ui/gl/direct_composition_surface_win_unittest.cc +++ b/ui/gl/direct_composition_surface_win_unittest.cc
@@ -589,7 +589,7 @@ protected: void SetUp() override { - static_cast<ui::PlatformWindow*>(&window_)->Show(); + static_cast<ui::PlatformWindowBase*>(&window_)->Show(); DirectCompositionSurfaceTest::SetUp(); }
diff --git a/ui/ozone/common/linux/drm_util_linux.cc b/ui/ozone/common/linux/drm_util_linux.cc index c85f0dc..7cb7b4e 100644 --- a/ui/ozone/common/linux/drm_util_linux.cc +++ b/ui/ozone/common/linux/drm_util_linux.cc
@@ -98,7 +98,6 @@ case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_RGB565: - case DRM_FORMAT_UYVY: case DRM_FORMAT_NV12: case DRM_FORMAT_YVU420: case DRM_FORMAT_P010:
diff --git a/ui/ozone/demo/demo_window.cc b/ui/ozone/demo/demo_window.cc index caf78c25..f85f908 100644 --- a/ui/ozone/demo/demo_window.cc +++ b/ui/ozone/demo/demo_window.cc
@@ -13,7 +13,7 @@ #include "ui/ozone/demo/renderer_factory.h" #include "ui/ozone/demo/window_manager.h" #include "ui/ozone/public/ozone_platform.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_init_properties.h" #if defined(OS_FUCHSIA)
diff --git a/ui/ozone/demo/demo_window.h b/ui/ozone/demo/demo_window.h index e0e7871..e502ff26 100644 --- a/ui/ozone/demo/demo_window.h +++ b/ui/ozone/demo/demo_window.h
@@ -10,7 +10,7 @@ #include "base/memory/weak_ptr.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" namespace ui { @@ -58,7 +58,7 @@ std::unique_ptr<Renderer> renderer_; // Window-related state. - std::unique_ptr<PlatformWindow> platform_window_; + std::unique_ptr<PlatformWindowBase> platform_window_; gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget; base::WeakPtrFactory<DemoWindow> weak_ptr_factory_{this};
diff --git a/ui/ozone/platform/cast/ozone_platform_cast.cc b/ui/ozone/platform/cast/ozone_platform_cast.cc index 8bf10ff..c8212e81 100644 --- a/ui/ozone/platform/cast/ozone_platform_cast.cc +++ b/ui/ozone/platform/cast/ozone_platform_cast.cc
@@ -93,7 +93,7 @@ std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override { return event_factory_ozone_->CreateSystemInputInjector(); } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { return std::make_unique<PlatformWindowCast>(delegate, properties.bounds);
diff --git a/ui/ozone/platform/drm/host/drm_window_host.h b/ui/ozone/platform/drm/host/drm_window_host.h index c86f0d6..bda6a97 100644 --- a/ui/ozone/platform/drm/host/drm_window_host.h +++ b/ui/ozone/platform/drm/host/drm_window_host.h
@@ -15,7 +15,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/native_widget_types.h" #include "ui/ozone/platform/drm/host/gpu_thread_observer.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" namespace ui { @@ -37,7 +37,7 @@ // State propagation needs to happen before the state change is acknowledged to // |delegate_| as |delegate_| is responsible for initializing the surface // associated with the window (the surface is created on the GPU process). -class DrmWindowHost : public PlatformWindow, +class DrmWindowHost : public PlatformWindowBase, public PlatformEventDispatcher, public GpuThreadObserver { public:
diff --git a/ui/ozone/platform/drm/ozone_platform_gbm.cc b/ui/ozone/platform/drm/ozone_platform_gbm.cc index 2e9bc19..aa9c7e4 100644 --- a/ui/ozone/platform/drm/ozone_platform_gbm.cc +++ b/ui/ozone/platform/drm/ozone_platform_gbm.cc
@@ -140,7 +140,7 @@ drm_thread_started_ = true; } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { GpuThreadAdapter* adapter = gpu_platform_support_host_.get();
diff --git a/ui/ozone/platform/headless/ozone_platform_headless.cc b/ui/ozone/platform/headless/ozone_platform_headless.cc index 85bfcb43..2cff46c6 100644 --- a/ui/ozone/platform/headless/ozone_platform_headless.cc +++ b/ui/ozone/platform/headless/ozone_platform_headless.cc
@@ -75,7 +75,7 @@ std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override { return nullptr; // no input injection support. } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { return std::make_unique<HeadlessWindow>(delegate, window_manager_.get(),
diff --git a/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/ui/ozone/platform/scenic/ozone_platform_scenic.cc index d47b7887..6240b25 100644 --- a/ui/ozone/platform/scenic/ozone_platform_scenic.cc +++ b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -90,7 +90,7 @@ return nullptr; } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { if (!properties.view_token.value) {
diff --git a/ui/ozone/platform/scenic/scenic_window.h b/ui/ozone/platform/scenic/scenic_window.h index 5207777..ee8b1ac5 100644 --- a/ui/ozone/platform/scenic/scenic_window.h +++ b/ui/ozone/platform/scenic/scenic_window.h
@@ -21,7 +21,7 @@ #include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size_f.h" #include "ui/gfx/native_widget_types.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" namespace ui { @@ -29,7 +29,7 @@ class ScenicWindowManager; class COMPONENT_EXPORT(OZONE) ScenicWindow - : public PlatformWindow, + : public PlatformWindowBase, public InputEventDispatcherDelegate { public: // Both |window_manager| and |delegate| must outlive the ScenicWindow.
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc index b14fca58..8bc4711 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
@@ -515,7 +515,8 @@ void WaylandBufferManagerHost::OnWindowRemoved(WaylandWindow* window) { DCHECK(window); - DCHECK(surfaces_.erase(window->GetWidget())); + auto ret = surfaces_.erase(window->GetWidget()); + DCHECK(ret); } void WaylandBufferManagerHost::SetTerminateGpuCallback(
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 903476d..ba1be4c 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -17,11 +17,11 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/native_widget_types.h" #include "ui/ozone/platform/wayland/common/wayland_object.h" -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/platform_window_handler/wm_drag_handler.h" #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h" #include "ui/platform_window/platform_window_init_properties.h" +#include "ui/platform_window/platform_window_linux.h" namespace gfx { class PointF; @@ -39,7 +39,7 @@ class XDGShellObjectFactory; } // namespace -class WaylandWindow : public PlatformWindow, +class WaylandWindow : public PlatformWindowLinux, public PlatformEventDispatcher, public WmMoveResizeHandler, public WmDragHandler {
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc index 0906ee2..5aa6327 100644 --- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc +++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -103,7 +103,7 @@ return nullptr; } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { auto window = std::make_unique<WaylandWindow>(delegate, connection_.get());
diff --git a/ui/ozone/platform/windows/ozone_platform_windows.cc b/ui/ozone/platform/windows/ozone_platform_windows.cc index 702dcb9..912645f6 100644 --- a/ui/ozone/platform/windows/ozone_platform_windows.cc +++ b/ui/ozone/platform/windows/ozone_platform_windows.cc
@@ -67,7 +67,7 @@ std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override { return nullptr; // no input injection support. } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { return std::make_unique<WindowsWindow>(delegate, properties.bounds);
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc index 109583a..f99f0ee 100644 --- a/ui/ozone/platform/x11/ozone_platform_x11.cc +++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -24,7 +24,7 @@ #include "ui/ozone/public/input_controller.h" #include "ui/ozone/public/ozone_platform.h" #include "ui/ozone/public/system_input_injector.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_init_properties.h" #if defined(OS_CHROMEOS) @@ -79,7 +79,7 @@ return gpu_platform_support_host_.get(); } - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) override { std::unique_ptr<X11WindowOzone> window =
diff --git a/ui/ozone/platform/x11/x11_window_ozone_unittest.cc b/ui/ozone/platform/x11/x11_window_ozone_unittest.cc index 71e05ec..119e6a8 100644 --- a/ui/ozone/platform/x11/x11_window_ozone_unittest.cc +++ b/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
@@ -100,7 +100,7 @@ } protected: - std::unique_ptr<PlatformWindow> CreatePlatformWindow( + std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( MockPlatformWindowDelegate* delegate, const gfx::Rect& bounds, gfx::AcceleratedWidget* widget) {
diff --git a/ui/ozone/public/ozone_platform.h b/ui/ozone/public/ozone_platform.h index 7085e04..d57e8287 100644 --- a/ui/ozone/public/ozone_platform.h +++ b/ui/ozone/public/ozone_platform.h
@@ -14,7 +14,7 @@ #include "base/message_loop/message_pump_type.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "ui/gfx/buffer_types.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" namespace display { @@ -156,7 +156,7 @@ virtual IPC::MessageFilter* GetGpuMessageFilter(); virtual ui::GpuPlatformSupportHost* GetGpuPlatformSupportHost() = 0; virtual std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() = 0; - virtual std::unique_ptr<PlatformWindow> CreatePlatformWindow( + virtual std::unique_ptr<PlatformWindowBase> CreatePlatformWindow( PlatformWindowDelegate* delegate, PlatformWindowInitProperties properties) = 0; virtual std::unique_ptr<display::NativeDisplayDelegate>
diff --git a/ui/platform_window/BUILD.gn b/ui/platform_window/BUILD.gn index d826a8a..1aea55a 100644 --- a/ui/platform_window/BUILD.gn +++ b/ui/platform_window/BUILD.gn
@@ -6,7 +6,6 @@ source_set("platform_window") { sources = [ - "platform_window.h", "platform_window_base.cc", "platform_window_base.h", "platform_window_delegate.h", @@ -44,6 +43,10 @@ "platform_window_linux.h", ] } + + if (is_win) { + sources += [ "platform_window_win.h" ] + } } group("platform_impls") {
diff --git a/ui/platform_window/platform_window.h b/ui/platform_window/platform_window.h deleted file mode 100644 index aa0b4df..0000000 --- a/ui/platform_window/platform_window.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2019 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_PLATFORM_WINDOW_PLATFORM_WINDOW_H_ -#define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_H_ - -#include "build/build_config.h" - -// By default, PlatformWindowBase is used. However, different platforms -// should specify what window they would like to use if needed. -#if defined(OS_LINUX) -#include "ui/platform_window/platform_window_linux.h" -#else -#include "ui/platform_window/platform_window_base.h" -#endif - -namespace ui { - -#if defined(OS_LINUX) -using PlatformWindow = PlatformWindowLinux; -#else -using PlatformWindow = PlatformWindowBase; -#endif - -} // namespace ui - -#endif // UI_PLATFORM_WINDOW_PLATFORM_WINDOW_H_
diff --git a/ui/platform_window/platform_window_handler/DEPS b/ui/platform_window/platform_window_handler/DEPS index 381a2e478..d55936f36 100644 --- a/ui/platform_window/platform_window_handler/DEPS +++ b/ui/platform_window/platform_window_handler/DEPS
@@ -1,4 +1,4 @@ include_rules = [ "+ui/base/class_property.h", - "+ui/platform_window/platform_window.h", + "+ui/platform_window/platform_window_base.h", ]
diff --git a/ui/platform_window/platform_window_handler/wm_drag_handler.cc b/ui/platform_window/platform_window_handler/wm_drag_handler.cc index f559d42..27e05a5 100644 --- a/ui/platform_window/platform_window_handler/wm_drag_handler.cc +++ b/ui/platform_window/platform_window_handler/wm_drag_handler.cc
@@ -5,7 +5,7 @@ #include "ui/platform_window/platform_window_handler/wm_drag_handler.h" #include "ui/base/class_property.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" DEFINE_UI_CLASS_PROPERTY_TYPE(ui::WmDragHandler*) @@ -13,12 +13,12 @@ DEFINE_UI_CLASS_PROPERTY_KEY(WmDragHandler*, kWmDragHandlerKey, nullptr) -void SetWmDragHandler(PlatformWindow* platform_window, +void SetWmDragHandler(PlatformWindowBase* platform_window, WmDragHandler* drag_handler) { platform_window->SetProperty(kWmDragHandlerKey, drag_handler); } -WmDragHandler* GetWmDragHandler(const PlatformWindow& platform_window) { +WmDragHandler* GetWmDragHandler(const PlatformWindowBase& platform_window) { return platform_window.GetProperty(kWmDragHandlerKey); }
diff --git a/ui/platform_window/platform_window_handler/wm_drag_handler.h b/ui/platform_window/platform_window_handler/wm_drag_handler.h index 2789c3e..87604ca4 100644 --- a/ui/platform_window/platform_window_handler/wm_drag_handler.h +++ b/ui/platform_window/platform_window_handler/wm_drag_handler.h
@@ -7,10 +7,10 @@ #include "base/bind.h" #include "ui/gfx/native_widget_types.h" -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_handler/wm_platform_export.h" namespace ui { +class PlatformWindowBase; class OSExchangeData; class WM_PLATFORM_EXPORT WmDragHandler { @@ -29,10 +29,10 @@ virtual ~WmDragHandler() {} }; -WM_PLATFORM_EXPORT void SetWmDragHandler(PlatformWindow* platform_window, +WM_PLATFORM_EXPORT void SetWmDragHandler(PlatformWindowBase* platform_window, WmDragHandler* drag_handler); WM_PLATFORM_EXPORT WmDragHandler* GetWmDragHandler( - const PlatformWindow& platform_window); + const PlatformWindowBase& platform_window); } // namespace ui
diff --git a/ui/platform_window/platform_window_handler/wm_drop_handler.cc b/ui/platform_window/platform_window_handler/wm_drop_handler.cc index 64ff6bd..11f23479 100644 --- a/ui/platform_window/platform_window_handler/wm_drop_handler.cc +++ b/ui/platform_window/platform_window_handler/wm_drop_handler.cc
@@ -5,7 +5,7 @@ #include "ui/platform_window/platform_window_handler/wm_drop_handler.h" #include "ui/base/class_property.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" DEFINE_UI_CLASS_PROPERTY_TYPE(ui::WmDropHandler*) @@ -13,12 +13,12 @@ DEFINE_UI_CLASS_PROPERTY_KEY(WmDropHandler*, kWmDropHandlerKey, nullptr) -void SetWmDropHandler(PlatformWindow* platform_window, +void SetWmDropHandler(PlatformWindowBase* platform_window, WmDropHandler* drop_handler) { platform_window->SetProperty(kWmDropHandlerKey, drop_handler); } -WmDropHandler* GetWmDropHandler(const PlatformWindow& platform_window) { +WmDropHandler* GetWmDropHandler(const PlatformWindowBase& platform_window) { return platform_window.GetProperty(kWmDropHandlerKey); }
diff --git a/ui/platform_window/platform_window_handler/wm_drop_handler.h b/ui/platform_window/platform_window_handler/wm_drop_handler.h index fc7a81f..e4844c0 100644 --- a/ui/platform_window/platform_window_handler/wm_drop_handler.h +++ b/ui/platform_window/platform_window_handler/wm_drop_handler.h
@@ -8,7 +8,6 @@ #include <memory> #include "ui/gfx/native_widget_types.h" -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_handler/wm_platform_export.h" namespace gfx { @@ -16,6 +15,7 @@ } namespace ui { +class PlatformWindowBase; class OSExchangeData; class WM_PLATFORM_EXPORT WmDropHandler { @@ -45,10 +45,10 @@ virtual ~WmDropHandler() {} }; -WM_PLATFORM_EXPORT void SetWmDropHandler(PlatformWindow* platform_window, +WM_PLATFORM_EXPORT void SetWmDropHandler(PlatformWindowBase* platform_window, WmDropHandler* drop_handler); WM_PLATFORM_EXPORT WmDropHandler* GetWmDropHandler( - const PlatformWindow& platform_window); + const PlatformWindowBase& platform_window); } // namespace ui
diff --git a/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc b/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc index a79ad70a..d9303cc 100644 --- a/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc +++ b/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc
@@ -5,7 +5,7 @@ #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h" #include "ui/base/class_property.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" DEFINE_UI_CLASS_PROPERTY_TYPE(WmMoveResizeHandler*) @@ -15,13 +15,13 @@ kWmMoveResizeHandlerKey, nullptr) -void SetWmMoveResizeHandler(PlatformWindow* platform_window, +void SetWmMoveResizeHandler(PlatformWindowBase* platform_window, WmMoveResizeHandler* move_resize_handler) { platform_window->SetProperty(kWmMoveResizeHandlerKey, move_resize_handler); } WmMoveResizeHandler* GetWmMoveResizeHandler( - const PlatformWindow& platform_window) { + const PlatformWindowBase& platform_window) { return platform_window.GetProperty(kWmMoveResizeHandlerKey); }
diff --git a/ui/platform_window/platform_window_handler/wm_move_resize_handler.h b/ui/platform_window/platform_window_handler/wm_move_resize_handler.h index 3da718c..57e5a622 100644 --- a/ui/platform_window/platform_window_handler/wm_move_resize_handler.h +++ b/ui/platform_window/platform_window_handler/wm_move_resize_handler.h
@@ -5,7 +5,6 @@ #ifndef UI_PLATFORM_WINDOW_PLATFORM_WINDOW_HANDLER_WM_MOVE_RESIZE_HANDLER_H_ #define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_HANDLER_WM_MOVE_RESIZE_HANDLER_H_ -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_handler/wm_platform_export.h" namespace gfx { @@ -14,6 +13,8 @@ namespace ui { +class PlatformWindowBase; + class WmMoveResizeHandler { public: // A system window manager starts interactive drag or resize of a window based @@ -52,10 +53,10 @@ }; WM_PLATFORM_EXPORT void SetWmMoveResizeHandler( - PlatformWindow* platform_window, + PlatformWindowBase* platform_window, WmMoveResizeHandler* move_resize_handler); WM_PLATFORM_EXPORT WmMoveResizeHandler* GetWmMoveResizeHandler( - const PlatformWindow& platform_window); + const PlatformWindowBase& platform_window); } // namespace ui
diff --git a/ui/platform_window/platform_window_win.h b/ui/platform_window/platform_window_win.h new file mode 100644 index 0000000..a3802d6 --- /dev/null +++ b/ui/platform_window/platform_window_win.h
@@ -0,0 +1,25 @@ +// Copyright 2019 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_PLATFORM_WINDOW_PLATFORM_WINDOW_WIN_H_ +#define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_WIN_H_ + +#include "ui/platform_window/platform_window_base.h" + +namespace ui { + +// Windows extensions to the PlatformWindowBase. +class PlatformWindowWin : public PlatformWindowBase { + public: + PlatformWindowWin() = default; + ~PlatformWindowWin() override = default; + + // Enables or disables platform provided animations of the PlatformWindow. + // If |enabled| is set to false, animations must be disabled. + virtual void SetVisibilityChangedAnimationsEnabled(bool enabled) = 0; +}; + +} // namespace ui + +#endif // UI_PLATFORM_WINDOW_PLATFORM_WINDOW_WIN_H_
diff --git a/ui/platform_window/stub/stub_window.h b/ui/platform_window/stub/stub_window.h index 13f92ee..3752dc7 100644 --- a/ui/platform_window/stub/stub_window.h +++ b/ui/platform_window/stub/stub_window.h
@@ -8,7 +8,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "ui/gfx/geometry/rect.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/stub/stub_window_export.h" @@ -16,7 +16,7 @@ // StubWindow is useful for tests, as well as implementations that only care // about bounds. -class STUB_WINDOW_EXPORT StubWindow : public PlatformWindow { +class STUB_WINDOW_EXPORT StubWindow : public PlatformWindowBase { public: explicit StubWindow(PlatformWindowDelegate* delegate, bool use_default_accelerated_widget = true,
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc index 0cca7be..3b4ef347 100644 --- a/ui/platform_window/win/win_window.cc +++ b/ui/platform_window/win/win_window.cc
@@ -191,6 +191,10 @@ NOTIMPLEMENTED_LOG_ONCE(); } +void WinWindow::SetVisibilityChangedAnimationsEnabled(bool enabled) { + NOTIMPLEMENTED_LOG_ONCE(); +} + bool WinWindow::IsFullscreen() const { return GetPlatformWindowState() == PlatformWindowState::kFullScreen; }
diff --git a/ui/platform_window/win/win_window.h b/ui/platform_window/win/win_window.h index c2c04d8..992be002 100644 --- a/ui/platform_window/win/win_window.h +++ b/ui/platform_window/win/win_window.h
@@ -9,15 +9,15 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "ui/gfx/win/window_impl.h" -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_delegate.h" +#include "ui/platform_window/platform_window_win.h" #include "ui/platform_window/win/win_window_export.h" #include <windows.h> namespace ui { -class WIN_WINDOW_EXPORT WinWindow : public PlatformWindow, +class WIN_WINDOW_EXPORT WinWindow : public PlatformWindowWin, public gfx::WindowImpl { public: WinWindow(PlatformWindowDelegate* delegate, const gfx::Rect& bounds); @@ -58,6 +58,7 @@ void StackAbove(gfx::AcceleratedWidget widget) override; void StackAtTop() override; void FlashFrame(bool flash_frame) override; + void SetVisibilityChangedAnimationsEnabled(bool enabled) override; bool IsFullscreen() const;
diff --git a/ui/platform_window/x11/x11_window.h b/ui/platform_window/x11/x11_window.h index b25ae7e..d5e5cfe 100644 --- a/ui/platform_window/x11/x11_window.h +++ b/ui/platform_window/x11/x11_window.h
@@ -8,9 +8,9 @@ #include "base/macros.h" #include "ui/base/x/x11_window.h" #include "ui/events/platform/platform_event_dispatcher.h" -#include "ui/platform_window/platform_window.h" #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h" #include "ui/platform_window/platform_window_init_properties.h" +#include "ui/platform_window/platform_window_linux.h" #include "ui/platform_window/x11/x11_window_export.h" namespace ui { @@ -35,7 +35,7 @@ }; // PlatformWindow implementation for X11. PlatformEvents are XEvents. -class X11_WINDOW_EXPORT X11Window : public PlatformWindow, +class X11_WINDOW_EXPORT X11Window : public PlatformWindowLinux, public WmMoveResizeHandler, public XWindow, public PlatformEventDispatcher {
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index 5df7333..1ade466 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -1231,6 +1231,7 @@ if (use_ozone) { sources += [ "widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc" ] + deps += [ "//ui/platform_window" ] } } }
diff --git a/ui/views/controls/button/button.cc b/ui/views/controls/button/button.cc index 28283fe7..eac3f34 100644 --- a/ui/views/controls/button/button.cc +++ b/ui/views/controls/button/button.cc
@@ -280,8 +280,8 @@ return PlatformStyle::kKeyClickActionOnSpace; if (event.key_code() == ui::VKEY_RETURN && PlatformStyle::kReturnClicksFocusedControl) - return CLICK_ON_KEY_PRESS; - return CLICK_NONE; + return KeyClickAction::kOnKeyPress; + return KeyClickAction::kNone; } void Button::SetButtonController( @@ -370,7 +370,7 @@ // If this button is focused and the user presses space or enter, don't let // that be treated as an accelerator if there is a key click action // corresponding to it. - return GetKeyClickActionForEvent(event) != KeyClickAction::CLICK_NONE; + return GetKeyClickActionForEvent(event) != KeyClickAction::kNone; } base::string16 Button::GetTooltipText(const gfx::Point& p) const {
diff --git a/ui/views/controls/button/button.h b/ui/views/controls/button/button.h index 0ee5ac9..7d5f4c29 100644 --- a/ui/views/controls/button/button.h +++ b/ui/views/controls/button/button.h
@@ -62,10 +62,10 @@ // An enum describing the events on which a button should be clicked for a // given key event. - enum KeyClickAction { - CLICK_ON_KEY_PRESS, - CLICK_ON_KEY_RELEASE, - CLICK_NONE, + enum class KeyClickAction { + kOnKeyPress, + kOnKeyRelease, + kNone, }; // TODO(cyan): Consider having Button implement ButtonControllerDelegate.
diff --git a/ui/views/controls/button/button_controller.cc b/ui/views/controls/button/button_controller.cc index 4fd8b56..328e7a2c 100644 --- a/ui/views/controls/button/button_controller.cc +++ b/ui/views/controls/button/button_controller.cc
@@ -80,7 +80,7 @@ return false; switch (button_->GetKeyClickActionForEvent(event)) { - case Button::KeyClickAction::CLICK_ON_KEY_RELEASE: + case Button::KeyClickAction::kOnKeyRelease: button_->SetState(Button::STATE_PRESSED); if (button_controller_delegate_->GetInkDrop()->GetTargetInkDropState() != InkDropState::ACTION_PENDING) { @@ -88,11 +88,11 @@ nullptr /* event */); } return true; - case Button::KeyClickAction::CLICK_ON_KEY_PRESS: + case Button::KeyClickAction::kOnKeyPress: button_->SetState(Button::STATE_NORMAL); button_controller_delegate_->NotifyClick(event); return true; - case Button::KeyClickAction::CLICK_NONE: + case Button::KeyClickAction::kNone: return false; } @@ -103,7 +103,7 @@ bool ButtonController::OnKeyReleased(const ui::KeyEvent& event) { const bool click_button = button_->state() == Button::STATE_PRESSED && button_->GetKeyClickActionForEvent(event) == - Button::KeyClickAction::CLICK_ON_KEY_RELEASE; + Button::KeyClickAction::kOnKeyRelease; if (!click_button) return false;
diff --git a/ui/views/controls/button/button_unittest.cc b/ui/views/controls/button/button_unittest.cc index a3f38c2..fa0a6fde 100644 --- a/ui/views/controls/button/button_unittest.cc +++ b/ui/views/controls/button/button_unittest.cc
@@ -72,7 +72,7 @@ ~TestButton() override = default; KeyClickAction GetKeyClickActionForEvent(const ui::KeyEvent& event) override { - if (custom_key_click_action_ == KeyClickAction::CLICK_NONE) + if (custom_key_click_action_ == KeyClickAction::kNone) return Button::GetKeyClickActionForEvent(event); return custom_key_click_action_; } @@ -117,7 +117,7 @@ int ink_drop_layer_add_count_ = 0; int ink_drop_layer_remove_count_ = 0; - KeyClickAction custom_key_click_action_ = KeyClickAction::CLICK_NONE; + KeyClickAction custom_key_click_action_ = KeyClickAction::kNone; DISALLOW_COPY_AND_ASSIGN(TestButton); }; @@ -831,9 +831,8 @@ button()->RequestFocus(); EXPECT_TRUE(button()->HasFocus()); - // Set the button to handle any key pressed event as |CLICK_ON_KEY_PRESS|. - button()->set_custom_key_click_action( - Button::KeyClickAction::CLICK_ON_KEY_PRESS); + // Set the button to handle any key pressed event as kOnKeyPress. + button()->set_custom_key_click_action(Button::KeyClickAction::kOnKeyPress); ui::KeyEvent control_press(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::EF_NONE); EXPECT_TRUE(button()->OnKeyPressed(control_press));
diff --git a/ui/views/controls/webview/web_dialog_view.cc b/ui/views/controls/webview/web_dialog_view.cc index 2952e8d..2e2baf0 100644 --- a/ui/views/controls/webview/web_dialog_view.cc +++ b/ui/views/controls/webview/web_dialog_view.cc
@@ -391,22 +391,15 @@ *proceed_to_fire_unload = proceed; } -bool WebDialogView::ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, +bool WebDialogView::IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) { + const GURL& target_url) { if (delegate_) - return delegate_->HandleShouldCreateWebContents(); - return true; + return delegate_->HandleShouldOverrideWebContentsCreation(); + return false; } ////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/views/controls/webview/web_dialog_view.h b/ui/views/controls/webview/web_dialog_view.h index 7e6755c7..8c7f6521 100644 --- a/ui/views/controls/webview/web_dialog_view.h +++ b/ui/views/controls/webview/web_dialog_view.h
@@ -145,19 +145,12 @@ void BeforeUnloadFired(content::WebContents* tab, bool proceed, bool* proceed_to_fire_unload) override; - bool ShouldCreateWebContents( - content::WebContents* web_contents, - content::RenderFrameHost* opener, + bool IsWebContentsCreationOverridden( content::SiteInstance* source_site_instance, - int32_t route_id, - int32_t main_frame_route_id, - int32_t main_frame_widget_route_id, content::mojom::WindowContainerType window_container_type, const GURL& opener_url, const std::string& frame_name, - const GURL& target_url, - const std::string& partition_id, - content::SessionStorageNamespace* session_storage_namespace) override; + const GURL& target_url) override; private: FRIEND_TEST_ALL_PREFIXES(WebDialogBrowserTest, WebContentRendered);
diff --git a/ui/views/style/platform_style.cc b/ui/views/style/platform_style.cc index 0b118993..ec2a05cf 100644 --- a/ui/views/style/platform_style.cc +++ b/ui/views/style/platform_style.cc
@@ -42,7 +42,7 @@ const bool PlatformStyle::kSelectWordOnRightClick = false; const bool PlatformStyle::kSelectAllOnRightClickWhenUnfocused = false; const Button::KeyClickAction PlatformStyle::kKeyClickActionOnSpace = - Button::CLICK_ON_KEY_RELEASE; + Button::KeyClickAction::kOnKeyRelease; const bool PlatformStyle::kReturnClicksFocusedControl = true; const bool PlatformStyle::kTableViewSupportsKeyboardNavigationByCell = true; const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = false;
diff --git a/ui/views/style/platform_style_mac.mm b/ui/views/style/platform_style_mac.mm index c5685d18..739f8e6f 100644 --- a/ui/views/style/platform_style_mac.mm +++ b/ui/views/style/platform_style_mac.mm
@@ -46,7 +46,7 @@ const bool PlatformStyle::kInactiveWidgetControlsAppearDisabled = true; const Button::KeyClickAction PlatformStyle::kKeyClickActionOnSpace = - Button::CLICK_ON_KEY_PRESS; + Button::KeyClickAction::kOnKeyPress; // On Mac, the Return key is used to perform the default action even when a // control is focused.
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc index 5a1220ae..fdea67f 100644 --- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
@@ -13,6 +13,7 @@ #include "ui/aura/window.h" #include "ui/aura/window_tree_host.h" #include "ui/base/dragdrop/os_exchange_data.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_handler/wm_drag_handler.h" #include "ui/platform_window/platform_window_handler/wm_drop_handler.h" #include "ui/views/test/views_test_base.h" @@ -24,7 +25,8 @@ namespace views { namespace { -class FakePlatformWindow : public ui::PlatformWindow, public ui::WmDragHandler { +class FakePlatformWindow : public ui::PlatformWindowBase, + public ui::WmDragHandler { public: FakePlatformWindow() { SetWmDragHandler(this, this); } ~FakePlatformWindow() override = default;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc index aec51d54..e892b00 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -11,6 +11,7 @@ #include "ui/events/event.h" #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h" #include "ui/platform_window/platform_window_init_properties.h" +#include "ui/platform_window/platform_window_linux.h" #include "ui/views/linux_ui/linux_ui.h" #include "ui/views/views_delegate.h" #include "ui/views/widget/desktop_aura/window_event_filter_linux.h" @@ -69,7 +70,7 @@ void DesktopWindowTreeHostLinux::Init(const Widget::InitParams& params) { DesktopWindowTreeHostPlatform::Init(params); - if (platform_window()->IsSyncExtensionAvailable()) { + if (GetPlatformWindowLinux()->IsSyncExtensionAvailable()) { compositor_observer_ = std::make_unique<SwapWithNewSizeObserverHelper>( compositor(), base::BindRepeating( @@ -85,17 +86,17 @@ } std::string DesktopWindowTreeHostLinux::GetWorkspace() const { - base::Optional<int> workspace = platform_window()->GetWorkspace(); + base::Optional<int> workspace = GetPlatformWindowLinux()->GetWorkspace(); return workspace ? base::NumberToString(workspace.value()) : std::string(); } void DesktopWindowTreeHostLinux::SetVisibleOnAllWorkspaces( bool always_visible) { - platform_window()->SetVisibleOnAllWorkspaces(always_visible); + GetPlatformWindowLinux()->SetVisibleOnAllWorkspaces(always_visible); } bool DesktopWindowTreeHostLinux::IsVisibleOnAllWorkspaces() const { - return platform_window()->IsVisibleOnAllWorkspaces(); + return GetPlatformWindowLinux()->IsVisibleOnAllWorkspaces(); } void DesktopWindowTreeHostLinux::OnDisplayMetricsChanged( @@ -220,13 +221,13 @@ void DesktopWindowTreeHostLinux::OnCompleteSwapWithNewSize( const gfx::Size& size) { - platform_window()->OnCompleteSwapAfterResize(); + GetPlatformWindowLinux()->OnCompleteSwapAfterResize(); } void DesktopWindowTreeHostLinux::CreateNonClientEventFilter() { DCHECK(!non_client_window_event_filter_); non_client_window_event_filter_ = std::make_unique<WindowEventFilterLinux>( - this, GetWmMoveResizeHandler(*platform_window())); + this, GetWmMoveResizeHandler(*GetPlatformWindowLinux())); } void DesktopWindowTreeHostLinux::DestroyNonClientEventFilter() { @@ -248,6 +249,15 @@ } } +const ui::PlatformWindowLinux* +DesktopWindowTreeHostLinux::GetPlatformWindowLinux() const { + return static_cast<const ui::PlatformWindowLinux*>(platform_window()); +} + +ui::PlatformWindowLinux* DesktopWindowTreeHostLinux::GetPlatformWindowLinux() { + return static_cast<ui::PlatformWindowLinux*>(platform_window()); +} + // As DWTHX11 subclasses DWTHPlatform through DWTHLinux now (during transition // period. see https://crbug.com/990756), we need to guard this factory method. // TODO(msisov): remove this guard once DWTHX11 is finally merged into
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h index e86535a..534faf4 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -11,6 +11,10 @@ class SkPath; +namespace ui { +class PlatformWindowLinux; +} // namespace ui + namespace views { class WindowEventFilterLinux; @@ -62,6 +66,9 @@ void OnWorkspaceChanged() override; void GetWindowMask(const gfx::Size& size, SkPath* window_mask) override; + const ui::PlatformWindowLinux* GetPlatformWindowLinux() const; + ui::PlatformWindowLinux* GetPlatformWindowLinux(); + // A handler for events intended for non client area. // A posthandler for events intended for non client area. Handles events if no // other consumer handled them.
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc index ad80e3d..ae0e0f2 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
@@ -7,7 +7,7 @@ #include "ui/aura/client/aura_constants.h" #include "ui/aura/window_tree_host_platform.h" #include "ui/base/hit_test.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h" #include "ui/views/test/views_interactive_ui_test_base.h" #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" @@ -41,7 +41,7 @@ class FakeWmMoveResizeHandler : public ui::WmMoveResizeHandler { public: using SetBoundsCallback = base::RepeatingCallback<void(gfx::Rect)>; - explicit FakeWmMoveResizeHandler(ui::PlatformWindow* window) + explicit FakeWmMoveResizeHandler(ui::PlatformWindowBase* window) : platform_window_(window), hittest_(-1) {} ~FakeWmMoveResizeHandler() override = default; @@ -66,7 +66,7 @@ } private: - ui::PlatformWindow* platform_window_; + ui::PlatformWindowBase* platform_window_; gfx::Rect bounds_; int hittest_ = -1;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc index bd59f48..e697cf0 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -15,7 +15,7 @@ #include "ui/display/display.h" #include "ui/display/screen.h" #include "ui/gfx/geometry/dip_util.h" -#include "ui/platform_window/platform_window.h" +#include "ui/platform_window/platform_window_base.h" #include "ui/platform_window/platform_window_init_properties.h" #include "ui/views/corewm/tooltip_aura.h" #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h" @@ -502,8 +502,9 @@ void DesktopWindowTreeHostPlatform::SetVisibilityChangedAnimationsEnabled( bool value) { - // TODO: needs PlatformWindow support. - NOTIMPLEMENTED_LOG_ONCE(); +#if defined(OS_WIN) + platform_window()->SetVisibilityChangedAnimationsEnabled(value); +#endif } NonClientFrameView* DesktopWindowTreeHostPlatform::CreateNonClientFrameView() {
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc index b5041a5..1860bd6 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/win/win_util.h" +#include "base/win/windows_version.h" #include "third_party/skia/include/core/SkPath.h" #include "third_party/skia/include/core/SkRegion.h" #include "ui/aura/client/aura_constants.h" @@ -166,7 +167,10 @@ void DesktopWindowTreeHostWin::OnWidgetInitDone() {} std::unique_ptr<corewm::Tooltip> DesktopWindowTreeHostWin::CreateTooltip() { - if (base::FeatureList::IsEnabled(features::kEnableAuraTooltipsOnWindows)) + bool force_legacy_tooltips = + (base::win::GetVersion() < base::win::Version::WIN8); + if (base::FeatureList::IsEnabled(features::kEnableAuraTooltipsOnWindows) && + !force_legacy_tooltips) return std::make_unique<corewm::TooltipAura>(); DCHECK(!tooltip_);
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc index ea06b2a..8bcf317 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -249,11 +249,6 @@ x11_window_move_client_->EndMoveLoop(); } -void DesktopWindowTreeHostX11::SetVisibilityChangedAnimationsEnabled( - bool value) { - // Much like the previous NativeWidgetGtk, we don't have anything to do here. -} - void DesktopWindowTreeHostX11::SetOpacity(float opacity) { GetXWindow()->SetOpacity(opacity); }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h index 80ae10e71..e8b15e42 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
@@ -97,7 +97,6 @@ Widget::MoveLoopSource source, Widget::MoveLoopEscapeBehavior escape_behavior) override; void EndMoveLoop() override; - void SetVisibilityChangedAnimationsEnabled(bool value) override; void SetOpacity(float opacity) override; void SetAspectRatio(const gfx::SizeF& aspect_ratio) override; void SetWindowIcons(const gfx::ImageSkia& window_icon,
diff --git a/ui/web_dialogs/web_dialog_delegate.cc b/ui/web_dialogs/web_dialog_delegate.cc index 60add58..0d0e20d60 100644 --- a/ui/web_dialogs/web_dialog_delegate.cc +++ b/ui/web_dialogs/web_dialog_delegate.cc
@@ -54,8 +54,8 @@ return false; } -bool WebDialogDelegate::HandleShouldCreateWebContents() { - return true; +bool WebDialogDelegate::HandleShouldOverrideWebContentsCreation() { + return false; } std::vector<Accelerator> WebDialogDelegate::GetAccelerators() {
diff --git a/ui/web_dialogs/web_dialog_delegate.h b/ui/web_dialogs/web_dialog_delegate.h index 7e2587e..ba3e5d5 100644 --- a/ui/web_dialogs/web_dialog_delegate.h +++ b/ui/web_dialogs/web_dialog_delegate.h
@@ -142,8 +142,8 @@ content::WebContents** out_new_contents); // A callback to control whether a WebContents will be created. Returns - // false to disallow the creation. Return true to use the default handler. - virtual bool HandleShouldCreateWebContents(); + // true to disallow the creation. Return false to use the default handler. + virtual bool HandleShouldOverrideWebContentsCreation(); // Stores the dialog bounds. virtual void StoreDialogSize(const gfx::Size& dialog_size) {}